ppc/pnv: turn 'phb' into a pointer in struct PnvPhb4PecStack
At this moment, stack->phb is the plain PnvPHB4 device itself instead of a pointer to the device. This will present a problem when adding user creatable devices because we can't deal with this struct and the realize() callback from the user creatable device. We can't get rid of this attribute, similar to what we did when enabling pnv-phb3 user creatable devices, because pnv_phb4_update_regions() needs to access stack->phb to do its job. This function is called twice in pnv_pec_stk_update_map(), which is one of the nested xscom write callbacks (via pnv_pec_stk_nest_xscom_write()). In fact, pnv_pec_stk_update_map() code comment is explicit about how the order of the unmap/map operations relates with the PHB subregions. All of this indicates that this code is tied together in a way that we either go on a crusade, featuring lots of refactories and redesign and considerable pain, to decouple stack and phb mapping, or we allow stack update_map operations to access the associated PHB as it is today even after introducing pnv-phb4 user devices. This patch chooses the latter. Instead of getting rid of stack->phb, turn it into a PHB pointer. This will allow us to assign an user created PHB to an existing stack later. In this process, pnv_pec_stk_instance_init() is removed because stack->phb is being initialized in stk_realize() instead. Reviewed-by: Cédric Le Goater <clg@kaod.org> Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com> Message-Id: <20220111131027.599784-4-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
3d2adf1713
commit
dc8e2914ab
@ -1728,7 +1728,7 @@ type_init(pnv_phb4_register_types);
|
|||||||
|
|
||||||
void pnv_phb4_update_regions(PnvPhb4PecStack *stack)
|
void pnv_phb4_update_regions(PnvPhb4PecStack *stack)
|
||||||
{
|
{
|
||||||
PnvPHB4 *phb = &stack->phb;
|
PnvPHB4 *phb = stack->phb;
|
||||||
|
|
||||||
/* Unmap first always */
|
/* Unmap first always */
|
||||||
if (memory_region_is_mapped(&phb->mr_regs)) {
|
if (memory_region_is_mapped(&phb->mr_regs)) {
|
||||||
|
@ -275,13 +275,6 @@ static const TypeInfo pnv_pec_type_info = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static void pnv_pec_stk_instance_init(Object *obj)
|
|
||||||
{
|
|
||||||
PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(obj);
|
|
||||||
|
|
||||||
object_initialize_child(obj, "phb", &stack->phb, TYPE_PNV_PHB4);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pnv_pec_stk_realize(DeviceState *dev, Error **errp)
|
static void pnv_pec_stk_realize(DeviceState *dev, Error **errp)
|
||||||
{
|
{
|
||||||
PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(dev);
|
PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(dev);
|
||||||
@ -289,15 +282,17 @@ static void pnv_pec_stk_realize(DeviceState *dev, Error **errp)
|
|||||||
PnvPhb4PecClass *pecc = PNV_PHB4_PEC_GET_CLASS(pec);
|
PnvPhb4PecClass *pecc = PNV_PHB4_PEC_GET_CLASS(pec);
|
||||||
int phb_id = pnv_phb4_pec_get_phb_id(pec, stack->stack_no);
|
int phb_id = pnv_phb4_pec_get_phb_id(pec, stack->stack_no);
|
||||||
|
|
||||||
object_property_set_int(OBJECT(&stack->phb), "chip-id", pec->chip_id,
|
stack->phb = PNV_PHB4(qdev_new(TYPE_PNV_PHB4));
|
||||||
|
|
||||||
|
object_property_set_int(OBJECT(stack->phb), "chip-id", pec->chip_id,
|
||||||
&error_fatal);
|
&error_fatal);
|
||||||
object_property_set_int(OBJECT(&stack->phb), "index", phb_id,
|
object_property_set_int(OBJECT(stack->phb), "index", phb_id,
|
||||||
&error_fatal);
|
&error_fatal);
|
||||||
object_property_set_int(OBJECT(&stack->phb), "version", pecc->version,
|
object_property_set_int(OBJECT(stack->phb), "version", pecc->version,
|
||||||
&error_fatal);
|
&error_fatal);
|
||||||
object_property_set_link(OBJECT(&stack->phb), "stack", OBJECT(stack),
|
object_property_set_link(OBJECT(stack->phb), "stack", OBJECT(stack),
|
||||||
&error_abort);
|
&error_abort);
|
||||||
if (!sysbus_realize(SYS_BUS_DEVICE(&stack->phb), errp)) {
|
if (!sysbus_realize(SYS_BUS_DEVICE(stack->phb), errp)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -324,7 +319,6 @@ static const TypeInfo pnv_pec_stk_type_info = {
|
|||||||
.name = TYPE_PNV_PHB4_PEC_STACK,
|
.name = TYPE_PNV_PHB4_PEC_STACK,
|
||||||
.parent = TYPE_DEVICE,
|
.parent = TYPE_DEVICE,
|
||||||
.instance_size = sizeof(PnvPhb4PecStack),
|
.instance_size = sizeof(PnvPhb4PecStack),
|
||||||
.instance_init = pnv_pec_stk_instance_init,
|
|
||||||
.class_init = pnv_pec_stk_class_init,
|
.class_init = pnv_pec_stk_class_init,
|
||||||
.interfaces = (InterfaceInfo[]) {
|
.interfaces = (InterfaceInfo[]) {
|
||||||
{ TYPE_PNV_XSCOM_INTERFACE },
|
{ TYPE_PNV_XSCOM_INTERFACE },
|
||||||
|
@ -177,8 +177,11 @@ struct PnvPhb4PecStack {
|
|||||||
/* The owner PEC */
|
/* The owner PEC */
|
||||||
PnvPhb4PecState *pec;
|
PnvPhb4PecState *pec;
|
||||||
|
|
||||||
/* The actual PHB */
|
/*
|
||||||
PnvPHB4 phb;
|
* PHB4 pointer. pnv_phb4_update_regions() needs to access
|
||||||
|
* the PHB4 via a PnvPhb4PecStack pointer.
|
||||||
|
*/
|
||||||
|
PnvPHB4 *phb;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PnvPhb4PecState {
|
struct PnvPhb4PecState {
|
||||||
|
Loading…
Reference in New Issue
Block a user