static int pseries_update_drconf_memory(struct of_prop_reconfig *pr) { struct of_drconf_cell *new_drmem, *old_drmem; unsigned long memblock_size; u32 entries; u32 *p; int i, rc = -EINVAL; memblock_size = get_memblock_size(); if (!memblock_size) return -EINVAL; p = (u32 *)of_get_property(pr->dn, "ibm,dynamic-memory", NULL); if (!p) return -EINVAL; /* The first int of the property is the number of lmb's described * by the property. This is followed by an array of of_drconf_cell * entries. Get the niumber of entries and skip to the array of * of_drconf_cell's. */ entries = *p++; old_drmem = (struct of_drconf_cell *)p; p = (u32 *)pr->prop->value; p++; new_drmem = (struct of_drconf_cell *)p; for (i = 0; i < entries; i++) { if ((old_drmem[i].flags & DRCONF_MEM_ASSIGNED) && (!(new_drmem[i].flags & DRCONF_MEM_ASSIGNED))) { rc = pseries_remove_memblock(old_drmem[i].base_addr, memblock_size); break; } else if ((!(old_drmem[i].flags & DRCONF_MEM_ASSIGNED)) && (new_drmem[i].flags & DRCONF_MEM_ASSIGNED)) { rc = memblock_add(old_drmem[i].base_addr, memblock_size); rc = (rc < 0) ? -EINVAL : 0; break; } } return rc; }
static int pseries_drconf_memory(unsigned long *base, unsigned int action) { unsigned long memblock_size; int rc; memblock_size = get_memblock_size(); if (!memblock_size) return -EINVAL; if (action == PSERIES_DRCONF_MEM_ADD) { rc = memblock_add(*base, memblock_size); rc = (rc < 0) ? -EINVAL : 0; } else if (action == PSERIES_DRCONF_MEM_REMOVE) { rc = pseries_remove_memblock(*base, memblock_size); } else { rc = -EINVAL; } return rc; }
unsigned long memory_block_size_bytes(void) { return get_memblock_size(); }