ppx/xics: introduce a parent_reset in ICSStateClass
Just like for the realize handlers, this makes possible to move the common ICSState code of the reset handlers in the ics-base class. 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
							
								
									815049a01b
								
							
						
					
					
						commit
						eeefd43b3c
					
				@ -537,23 +537,16 @@ static void ics_simple_eoi(ICSState *ics, uint32_t nr)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void ics_simple_reset(void *dev)
 | 
					static void ics_simple_reset(DeviceState *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ICSState *ics = ICS_SIMPLE(dev);
 | 
					    ICSStateClass *icsc = ICS_BASE_GET_CLASS(dev);
 | 
				
			||||||
    int i;
 | 
					 | 
				
			||||||
    uint8_t flags[ics->nr_irqs];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = 0; i < ics->nr_irqs; i++) {
 | 
					    icsc->parent_reset(dev);
 | 
				
			||||||
        flags[i] = ics->irqs[i].flags;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    memset(ics->irqs, 0, sizeof(ICSIRQState) * ics->nr_irqs);
 | 
					static void ics_simple_reset_handler(void *dev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    for (i = 0; i < ics->nr_irqs; i++) {
 | 
					    ics_simple_reset(dev);
 | 
				
			||||||
        ics->irqs[i].priority = 0xff;
 | 
					 | 
				
			||||||
        ics->irqs[i].saved_priority = 0xff;
 | 
					 | 
				
			||||||
        ics->irqs[i].flags = flags[i];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int ics_simple_dispatch_pre_save(void *opaque)
 | 
					static int ics_simple_dispatch_pre_save(void *opaque)
 | 
				
			||||||
@ -625,7 +618,7 @@ static void ics_simple_realize(DeviceState *dev, Error **errp)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    ics->qirqs = qemu_allocate_irqs(ics_simple_set_irq, ics, ics->nr_irqs);
 | 
					    ics->qirqs = qemu_allocate_irqs(ics_simple_set_irq, ics, ics->nr_irqs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qemu_register_reset(ics_simple_reset, ics);
 | 
					    qemu_register_reset(ics_simple_reset_handler, ics);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void ics_simple_class_init(ObjectClass *klass, void *data)
 | 
					static void ics_simple_class_init(ObjectClass *klass, void *data)
 | 
				
			||||||
@ -635,6 +628,8 @@ static void ics_simple_class_init(ObjectClass *klass, void *data)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    device_class_set_parent_realize(dc, ics_simple_realize,
 | 
					    device_class_set_parent_realize(dc, ics_simple_realize,
 | 
				
			||||||
                                    &isc->parent_realize);
 | 
					                                    &isc->parent_realize);
 | 
				
			||||||
 | 
					    device_class_set_parent_reset(dc, ics_simple_reset,
 | 
				
			||||||
 | 
					                                  &isc->parent_reset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dc->vmsd = &vmstate_ics_simple;
 | 
					    dc->vmsd = &vmstate_ics_simple;
 | 
				
			||||||
    isc->reject = ics_simple_reject;
 | 
					    isc->reject = ics_simple_reject;
 | 
				
			||||||
@ -650,6 +645,25 @@ static const TypeInfo ics_simple_info = {
 | 
				
			|||||||
    .class_size = sizeof(ICSStateClass),
 | 
					    .class_size = sizeof(ICSStateClass),
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void ics_base_reset(DeviceState *dev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ICSState *ics = ICS_BASE(dev);
 | 
				
			||||||
 | 
					    int i;
 | 
				
			||||||
 | 
					    uint8_t flags[ics->nr_irqs];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (i = 0; i < ics->nr_irqs; i++) {
 | 
				
			||||||
 | 
					        flags[i] = ics->irqs[i].flags;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memset(ics->irqs, 0, sizeof(ICSIRQState) * ics->nr_irqs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (i = 0; i < ics->nr_irqs; i++) {
 | 
				
			||||||
 | 
					        ics->irqs[i].priority = 0xff;
 | 
				
			||||||
 | 
					        ics->irqs[i].saved_priority = 0xff;
 | 
				
			||||||
 | 
					        ics->irqs[i].flags = flags[i];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void ics_base_realize(DeviceState *dev, Error **errp)
 | 
					static void ics_base_realize(DeviceState *dev, Error **errp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ICSState *ics = ICS_BASE(dev);
 | 
					    ICSState *ics = ICS_BASE(dev);
 | 
				
			||||||
@ -689,6 +703,7 @@ static void ics_base_class_init(ObjectClass *klass, void *data)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    dc->realize = ics_base_realize;
 | 
					    dc->realize = ics_base_realize;
 | 
				
			||||||
    dc->props = ics_base_properties;
 | 
					    dc->props = ics_base_properties;
 | 
				
			||||||
 | 
					    dc->reset = ics_base_reset;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const TypeInfo ics_base_info = {
 | 
					static const TypeInfo ics_base_info = {
 | 
				
			||||||
 | 
				
			|||||||
@ -324,25 +324,18 @@ static void ics_kvm_set_irq(void *opaque, int srcno, int val)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void ics_kvm_reset(void *dev)
 | 
					static void ics_kvm_reset(DeviceState *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ICSState *ics = ICS_SIMPLE(dev);
 | 
					    ICSStateClass *icsc = ICS_BASE_GET_CLASS(dev);
 | 
				
			||||||
    int i;
 | 
					 | 
				
			||||||
    uint8_t flags[ics->nr_irqs];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = 0; i < ics->nr_irqs; i++) {
 | 
					    icsc->parent_reset(dev);
 | 
				
			||||||
        flags[i] = ics->irqs[i].flags;
 | 
					
 | 
				
			||||||
 | 
					    ics_set_kvm_state(ICS_KVM(dev), 1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    memset(ics->irqs, 0, sizeof(ICSIRQState) * ics->nr_irqs);
 | 
					static void ics_kvm_reset_handler(void *dev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    for (i = 0; i < ics->nr_irqs; i++) {
 | 
					    ics_kvm_reset(dev);
 | 
				
			||||||
        ics->irqs[i].priority = 0xff;
 | 
					 | 
				
			||||||
        ics->irqs[i].saved_priority = 0xff;
 | 
					 | 
				
			||||||
        ics->irqs[i].flags = flags[i];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ics_set_kvm_state(ics, 1);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void ics_kvm_realize(DeviceState *dev, Error **errp)
 | 
					static void ics_kvm_realize(DeviceState *dev, Error **errp)
 | 
				
			||||||
@ -358,7 +351,7 @@ static void ics_kvm_realize(DeviceState *dev, Error **errp)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    ics->qirqs = qemu_allocate_irqs(ics_kvm_set_irq, ics, ics->nr_irqs);
 | 
					    ics->qirqs = qemu_allocate_irqs(ics_kvm_set_irq, ics, ics->nr_irqs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qemu_register_reset(ics_kvm_reset, ics);
 | 
					    qemu_register_reset(ics_kvm_reset_handler, ics);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void ics_kvm_class_init(ObjectClass *klass, void *data)
 | 
					static void ics_kvm_class_init(ObjectClass *klass, void *data)
 | 
				
			||||||
@ -371,6 +364,7 @@ static void ics_kvm_class_init(ObjectClass *klass, void *data)
 | 
				
			|||||||
     * directly from ics-base and not from ics-simple anymore.
 | 
					     * directly from ics-base and not from ics-simple anymore.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    dc->realize = ics_kvm_realize;
 | 
					    dc->realize = ics_kvm_realize;
 | 
				
			||||||
 | 
					    dc->reset = ics_kvm_reset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    icsc->pre_save = ics_get_kvm_state;
 | 
					    icsc->pre_save = ics_get_kvm_state;
 | 
				
			||||||
    icsc->post_load = ics_set_kvm_state;
 | 
					    icsc->post_load = ics_set_kvm_state;
 | 
				
			||||||
 | 
				
			|||||||
@ -116,6 +116,7 @@ struct ICSStateClass {
 | 
				
			|||||||
    DeviceClass parent_class;
 | 
					    DeviceClass parent_class;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DeviceRealize parent_realize;
 | 
					    DeviceRealize parent_realize;
 | 
				
			||||||
 | 
					    DeviceReset parent_reset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void (*pre_save)(ICSState *s);
 | 
					    void (*pre_save)(ICSState *s);
 | 
				
			||||||
    int (*post_load)(ICSState *s, int version_id);
 | 
					    int (*post_load)(ICSState *s, int version_id);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user