qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

leon3: use qemu_irq framework instead of callback as property

"set_pin_in" property is used to define a callback mechanism where the
device says "call the callback function, passing it an opaque cookie
and a 32-bit value". We already have a generic mechanism for doing
that, which is the qemu_irq. So we should just use that.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: KONRAD Frederic <frederic.konrad@adacore.com>

+14 -35
+4 -31
hw/intc/grlib_irqmp.c
··· 25 25 */ 26 26 27 27 #include "qemu/osdep.h" 28 + #include "hw/irq.h" 28 29 #include "hw/sysbus.h" 29 30 #include "cpu.h" 30 31 ··· 57 58 SysBusDevice parent_obj; 58 59 59 60 MemoryRegion iomem; 60 - 61 - void *set_pil_in; 62 - void *set_pil_in_opaque; 63 61 64 62 IRQMPState *state; 63 + qemu_irq irq; 65 64 } IRQMP; 66 65 67 66 struct IRQMPState { ··· 82 81 uint32_t pend = 0; 83 82 uint32_t level0 = 0; 84 83 uint32_t level1 = 0; 85 - set_pil_in_fn set_pil_in; 86 84 87 85 assert(state != NULL); 88 86 assert(state->parent != NULL); ··· 97 95 trace_grlib_irqmp_check_irqs(state->pending, state->force[0], 98 96 state->mask[0], level1, level0); 99 97 100 - set_pil_in = (set_pil_in_fn)state->parent->set_pil_in; 101 - 102 98 /* Trigger level1 interrupt first and level0 if there is no level1 */ 103 - if (level1 != 0) { 104 - set_pil_in(state->parent->set_pil_in_opaque, level1); 105 - } else { 106 - set_pil_in(state->parent->set_pil_in_opaque, level0); 107 - } 99 + qemu_set_irq(state->parent->irq, level1 ?: level0); 108 100 } 109 101 110 102 static void grlib_irqmp_ack_mask(IRQMPState *state, uint32_t mask) ··· 335 327 IRQMP *irqmp = GRLIB_IRQMP(obj); 336 328 SysBusDevice *dev = SYS_BUS_DEVICE(obj); 337 329 330 + qdev_init_gpio_out_named(DEVICE(obj), &irqmp->irq, "grlib-irq", 1); 338 331 memory_region_init_io(&irqmp->iomem, obj, &grlib_irqmp_ops, irqmp, 339 332 "irqmp", IRQMP_REG_SIZE); 340 333 ··· 343 336 sysbus_init_mmio(dev, &irqmp->iomem); 344 337 } 345 338 346 - static void grlib_irqmp_realize(DeviceState *dev, Error **errp) 347 - { 348 - IRQMP *irqmp = GRLIB_IRQMP(dev); 349 - 350 - /* Check parameters */ 351 - if (irqmp->set_pil_in == NULL) { 352 - error_setg(errp, "set_pil_in cannot be NULL."); 353 - } 354 - } 355 - 356 - static Property grlib_irqmp_properties[] = { 357 - DEFINE_PROP_PTR("set_pil_in", IRQMP, set_pil_in), 358 - DEFINE_PROP_PTR("set_pil_in_opaque", IRQMP, set_pil_in_opaque), 359 - DEFINE_PROP_END_OF_LIST(), 360 - }; 361 - 362 339 static void grlib_irqmp_class_init(ObjectClass *klass, void *data) 363 340 { 364 341 DeviceClass *dc = DEVICE_CLASS(klass); 365 342 366 343 dc->reset = grlib_irqmp_reset; 367 - dc->props = grlib_irqmp_properties; 368 - /* Reason: pointer properties "set_pil_in", "set_pil_in_opaque" */ 369 - dc->user_creatable = false; 370 - dc->realize = grlib_irqmp_realize; 371 344 } 372 345 373 346 static const TypeInfo grlib_irqmp_info = {
+9 -4
hw/sparc/leon3.c
··· 143 143 grlib_irqmp_ack((DeviceState *)irq_manager, intno); 144 144 } 145 145 146 - static void leon3_set_pil_in(void *opaque, uint32_t pil_in) 146 + /* 147 + * This device assumes that the incoming 'level' value on the 148 + * qemu_irq is the interrupt number, not just a simple 0/1 level. 149 + */ 150 + static void leon3_set_pil_in(void *opaque, int n, int level) 147 151 { 148 - CPUSPARCState *env = (CPUSPARCState *)opaque; 152 + CPUSPARCState *env = opaque; 153 + uint32_t pil_in = level; 149 154 CPUState *cs; 150 155 151 156 assert(env != NULL); ··· 225 230 226 231 /* Allocate IRQ manager */ 227 232 dev = qdev_create(NULL, TYPE_GRLIB_IRQMP); 228 - qdev_prop_set_ptr(dev, "set_pil_in", leon3_set_pil_in); 229 - qdev_prop_set_ptr(dev, "set_pil_in_opaque", env); 233 + env->pil_irq = qemu_allocate_irq(leon3_set_pil_in, env, 0); 234 + qdev_connect_gpio_out_named(dev, "grlib-irq", 0, env->pil_irq); 230 235 qdev_init_nofail(dev); 231 236 sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, LEON3_IRQMP_OFFSET); 232 237 env->irq_manager = dev;
+1
target/sparc/cpu.h
··· 541 541 #endif 542 542 sparc_def_t def; 543 543 544 + qemu_irq pil_irq; 544 545 void *irq_manager; 545 546 void (*qemu_irq_ack)(CPUSPARCState *env, void *irq_manager, int intno); 546 547