mirror of https://github.com/xqemu/xqemu.git
spapr: Generate FDT fragment for LMBs at configure connector time
Signed-off-by: Greg Kurz <groug@kaod.org> Message-Id: <155059666331.1466090.6766540766297333313.stgit@bahia.lab.toulouse-stg.fr.ibm.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
d9c95c71ac
commit
62d38c9bd3
|
@ -3333,14 +3333,26 @@ static void spapr_nmi(NMIState *n, int cpu_index, Error **errp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int spapr_lmb_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr,
|
||||||
|
void *fdt, int *fdt_start_offset, Error **errp)
|
||||||
|
{
|
||||||
|
uint64_t addr;
|
||||||
|
uint32_t node;
|
||||||
|
|
||||||
|
addr = spapr_drc_index(drc) * SPAPR_MEMORY_BLOCK_SIZE;
|
||||||
|
node = object_property_get_uint(OBJECT(drc->dev), PC_DIMM_NODE_PROP,
|
||||||
|
&error_abort);
|
||||||
|
*fdt_start_offset = spapr_populate_memory_node(fdt, node, addr,
|
||||||
|
SPAPR_MEMORY_BLOCK_SIZE);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void spapr_add_lmbs(DeviceState *dev, uint64_t addr_start, uint64_t size,
|
static void spapr_add_lmbs(DeviceState *dev, uint64_t addr_start, uint64_t size,
|
||||||
uint32_t node, bool dedicated_hp_event_source,
|
bool dedicated_hp_event_source, Error **errp)
|
||||||
Error **errp)
|
|
||||||
{
|
{
|
||||||
sPAPRDRConnector *drc;
|
sPAPRDRConnector *drc;
|
||||||
uint32_t nr_lmbs = size/SPAPR_MEMORY_BLOCK_SIZE;
|
uint32_t nr_lmbs = size/SPAPR_MEMORY_BLOCK_SIZE;
|
||||||
int i, fdt_offset, fdt_size;
|
int i;
|
||||||
void *fdt;
|
|
||||||
uint64_t addr = addr_start;
|
uint64_t addr = addr_start;
|
||||||
bool hotplugged = spapr_drc_hotplugged(dev);
|
bool hotplugged = spapr_drc_hotplugged(dev);
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
|
@ -3350,11 +3362,7 @@ static void spapr_add_lmbs(DeviceState *dev, uint64_t addr_start, uint64_t size,
|
||||||
addr / SPAPR_MEMORY_BLOCK_SIZE);
|
addr / SPAPR_MEMORY_BLOCK_SIZE);
|
||||||
g_assert(drc);
|
g_assert(drc);
|
||||||
|
|
||||||
fdt = create_device_tree(&fdt_size);
|
spapr_drc_attach(drc, dev, NULL, 0, &local_err);
|
||||||
fdt_offset = spapr_populate_memory_node(fdt, node, addr,
|
|
||||||
SPAPR_MEMORY_BLOCK_SIZE);
|
|
||||||
|
|
||||||
spapr_drc_attach(drc, dev, fdt, fdt_offset, &local_err);
|
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
while (addr > addr_start) {
|
while (addr > addr_start) {
|
||||||
addr -= SPAPR_MEMORY_BLOCK_SIZE;
|
addr -= SPAPR_MEMORY_BLOCK_SIZE;
|
||||||
|
@ -3362,7 +3370,6 @@ static void spapr_add_lmbs(DeviceState *dev, uint64_t addr_start, uint64_t size,
|
||||||
addr / SPAPR_MEMORY_BLOCK_SIZE);
|
addr / SPAPR_MEMORY_BLOCK_SIZE);
|
||||||
spapr_drc_detach(drc);
|
spapr_drc_detach(drc);
|
||||||
}
|
}
|
||||||
g_free(fdt);
|
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -3395,7 +3402,6 @@ static void spapr_memory_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||||
sPAPRMachineState *ms = SPAPR_MACHINE(hotplug_dev);
|
sPAPRMachineState *ms = SPAPR_MACHINE(hotplug_dev);
|
||||||
PCDIMMDevice *dimm = PC_DIMM(dev);
|
PCDIMMDevice *dimm = PC_DIMM(dev);
|
||||||
uint64_t size, addr;
|
uint64_t size, addr;
|
||||||
uint32_t node;
|
|
||||||
|
|
||||||
size = memory_device_get_region_size(MEMORY_DEVICE(dev), &error_abort);
|
size = memory_device_get_region_size(MEMORY_DEVICE(dev), &error_abort);
|
||||||
|
|
||||||
|
@ -3410,10 +3416,7 @@ static void spapr_memory_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||||
goto out_unplug;
|
goto out_unplug;
|
||||||
}
|
}
|
||||||
|
|
||||||
node = object_property_get_uint(OBJECT(dev), PC_DIMM_NODE_PROP,
|
spapr_add_lmbs(dev, addr, size, spapr_ovec_test(ms->ov5_cas, OV5_HP_EVT),
|
||||||
&error_abort);
|
|
||||||
spapr_add_lmbs(dev, addr, size, node,
|
|
||||||
spapr_ovec_test(ms->ov5_cas, OV5_HP_EVT),
|
|
||||||
&local_err);
|
&local_err);
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
goto out_unplug;
|
goto out_unplug;
|
||||||
|
|
|
@ -700,6 +700,7 @@ static void spapr_drc_lmb_class_init(ObjectClass *k, void *data)
|
||||||
drck->typename = "MEM";
|
drck->typename = "MEM";
|
||||||
drck->drc_name_prefix = "LMB ";
|
drck->drc_name_prefix = "LMB ";
|
||||||
drck->release = spapr_lmb_release;
|
drck->release = spapr_lmb_release;
|
||||||
|
drck->dt_populate = spapr_lmb_dt_populate;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const TypeInfo spapr_dr_connector_info = {
|
static const TypeInfo spapr_dr_connector_info = {
|
||||||
|
|
|
@ -764,9 +764,11 @@ void spapr_reallocate_hpt(sPAPRMachineState *spapr, int shift,
|
||||||
void spapr_clear_pending_events(sPAPRMachineState *spapr);
|
void spapr_clear_pending_events(sPAPRMachineState *spapr);
|
||||||
int spapr_max_server_number(sPAPRMachineState *spapr);
|
int spapr_max_server_number(sPAPRMachineState *spapr);
|
||||||
|
|
||||||
/* CPU and LMB DRC release callbacks. */
|
/* DRC callbacks. */
|
||||||
void spapr_core_release(DeviceState *dev);
|
void spapr_core_release(DeviceState *dev);
|
||||||
void spapr_lmb_release(DeviceState *dev);
|
void spapr_lmb_release(DeviceState *dev);
|
||||||
|
int spapr_lmb_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr,
|
||||||
|
void *fdt, int *fdt_start_offset, Error **errp);
|
||||||
|
|
||||||
void spapr_rtc_read(sPAPRRTCState *rtc, struct tm *tm, uint32_t *ns);
|
void spapr_rtc_read(sPAPRRTCState *rtc, struct tm *tm, uint32_t *ns);
|
||||||
int spapr_rtc_import_offset(sPAPRRTCState *rtc, int64_t legacy_offset);
|
int spapr_rtc_import_offset(sPAPRRTCState *rtc, int64_t legacy_offset);
|
||||||
|
|
Loading…
Reference in New Issue