ppc/xics: add a xics_set_nr_servers common routine
xics_spapr and xics_kvm nearly define the same 'set_nr_servers' handler. Only the type of the ICP differs. So let's make a common one to remove some duplicated code. Signed-off-by: Cédric Le Goater <clg@kaod.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
		
							parent
							
								
									14fd8ab267
								
							
						
					
					
						commit
						2bb0d10aeb
					
				@ -183,6 +183,24 @@ static void xics_prop_set_nr_irqs(Object *obj, Visitor *v, const char *name,
 | 
				
			|||||||
    info->set_nr_irqs(xics, value, errp);
 | 
					    info->set_nr_irqs(xics, value, errp);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void xics_set_nr_servers(XICSState *xics, uint32_t nr_servers,
 | 
				
			||||||
 | 
					                         const char *typename, Error **errp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    xics->nr_servers = nr_servers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    xics->ss = g_malloc0(xics->nr_servers * sizeof(ICPState));
 | 
				
			||||||
 | 
					    for (i = 0; i < xics->nr_servers; i++) {
 | 
				
			||||||
 | 
					        char name[32];
 | 
				
			||||||
 | 
					        ICPState *icp = &xics->ss[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        object_initialize(icp, sizeof(*icp), typename);
 | 
				
			||||||
 | 
					        snprintf(name, sizeof(name), "icp[%d]", i);
 | 
				
			||||||
 | 
					        object_property_add_child(OBJECT(xics), name, OBJECT(icp), errp);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void xics_prop_get_nr_servers(Object *obj, Visitor *v,
 | 
					static void xics_prop_get_nr_servers(Object *obj, Visitor *v,
 | 
				
			||||||
                                     const char *name, void *opaque,
 | 
					                                     const char *name, void *opaque,
 | 
				
			||||||
                                     Error **errp)
 | 
					                                     Error **errp)
 | 
				
			||||||
@ -198,7 +216,7 @@ static void xics_prop_set_nr_servers(Object *obj, Visitor *v,
 | 
				
			|||||||
                                     Error **errp)
 | 
					                                     Error **errp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    XICSState *xics = XICS_COMMON(obj);
 | 
					    XICSState *xics = XICS_COMMON(obj);
 | 
				
			||||||
    XICSStateClass *info = XICS_COMMON_GET_CLASS(xics);
 | 
					    XICSStateClass *xsc = XICS_COMMON_GET_CLASS(xics);
 | 
				
			||||||
    Error *error = NULL;
 | 
					    Error *error = NULL;
 | 
				
			||||||
    int64_t value;
 | 
					    int64_t value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -213,8 +231,8 @@ static void xics_prop_set_nr_servers(Object *obj, Visitor *v,
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert(info->set_nr_servers);
 | 
					    assert(xsc->set_nr_servers);
 | 
				
			||||||
    info->set_nr_servers(xics, value, errp);
 | 
					    xsc->set_nr_servers(xics, value, errp);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void xics_common_initfn(Object *obj)
 | 
					static void xics_common_initfn(Object *obj)
 | 
				
			||||||
 | 
				
			|||||||
@ -373,18 +373,7 @@ static void xics_kvm_set_nr_irqs(XICSState *xics, uint32_t nr_irqs,
 | 
				
			|||||||
static void xics_kvm_set_nr_servers(XICSState *xics, uint32_t nr_servers,
 | 
					static void xics_kvm_set_nr_servers(XICSState *xics, uint32_t nr_servers,
 | 
				
			||||||
                                    Error **errp)
 | 
					                                    Error **errp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int i;
 | 
					    xics_set_nr_servers(xics, nr_servers, TYPE_KVM_ICP, errp);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    xics->nr_servers = nr_servers;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    xics->ss = g_malloc0(xics->nr_servers * sizeof(ICPState));
 | 
					 | 
				
			||||||
    for (i = 0; i < xics->nr_servers; i++) {
 | 
					 | 
				
			||||||
        char buffer[32];
 | 
					 | 
				
			||||||
        object_initialize(&xics->ss[i], sizeof(xics->ss[i]), TYPE_KVM_ICP);
 | 
					 | 
				
			||||||
        snprintf(buffer, sizeof(buffer), "icp[%d]", i);
 | 
					 | 
				
			||||||
        object_property_add_child(OBJECT(xics), buffer, OBJECT(&xics->ss[i]),
 | 
					 | 
				
			||||||
                                  errp);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void rtas_dummy(PowerPCCPU *cpu, sPAPRMachineState *spapr,
 | 
					static void rtas_dummy(PowerPCCPU *cpu, sPAPRMachineState *spapr,
 | 
				
			||||||
 | 
				
			|||||||
@ -249,18 +249,7 @@ static void xics_spapr_set_nr_irqs(XICSState *xics, uint32_t nr_irqs,
 | 
				
			|||||||
static void xics_spapr_set_nr_servers(XICSState *xics, uint32_t nr_servers,
 | 
					static void xics_spapr_set_nr_servers(XICSState *xics, uint32_t nr_servers,
 | 
				
			||||||
                                      Error **errp)
 | 
					                                      Error **errp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int i;
 | 
					    xics_set_nr_servers(xics, nr_servers, TYPE_ICP, errp);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    xics->nr_servers = nr_servers;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    xics->ss = g_malloc0(xics->nr_servers * sizeof(ICPState));
 | 
					 | 
				
			||||||
    for (i = 0; i < xics->nr_servers; i++) {
 | 
					 | 
				
			||||||
        char buffer[32];
 | 
					 | 
				
			||||||
        object_initialize(&xics->ss[i], sizeof(xics->ss[i]), TYPE_ICP);
 | 
					 | 
				
			||||||
        snprintf(buffer, sizeof(buffer), "icp[%d]", i);
 | 
					 | 
				
			||||||
        object_property_add_child(OBJECT(xics), buffer, OBJECT(&xics->ss[i]),
 | 
					 | 
				
			||||||
                                  errp);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void xics_spapr_realize(DeviceState *dev, Error **errp)
 | 
					static void xics_spapr_realize(DeviceState *dev, Error **errp)
 | 
				
			||||||
 | 
				
			|||||||
@ -188,6 +188,8 @@ void xics_spapr_free(XICSState *icp, int irq, int num);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void xics_cpu_setup(XICSState *icp, PowerPCCPU *cpu);
 | 
					void xics_cpu_setup(XICSState *icp, PowerPCCPU *cpu);
 | 
				
			||||||
void xics_cpu_destroy(XICSState *icp, PowerPCCPU *cpu);
 | 
					void xics_cpu_destroy(XICSState *icp, PowerPCCPU *cpu);
 | 
				
			||||||
 | 
					void xics_set_nr_servers(XICSState *xics, uint32_t nr_servers,
 | 
				
			||||||
 | 
					                         const char *typename, Error **errp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Internal XICS interfaces */
 | 
					/* Internal XICS interfaces */
 | 
				
			||||||
int xics_get_cpu_index_by_dt_id(int cpu_dt_id);
 | 
					int xics_get_cpu_index_by_dt_id(int cpu_dt_id);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user