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

sparc32_dma: make esp device child of espdma device

This makes it possible to reference the esp device from the espdma device as
required, and by wiring up the device ourselves in sun4m.c we can drop use
of the esp_init() function.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Artyom Tarasenko <atar4qemu@gmail.com>
Acked-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

+37 -11
+26
hw/dma/sparc32_dma.c
··· 298 298 s->is_ledma = 0; 299 299 } 300 300 301 + static void sparc32_espdma_device_realize(DeviceState *dev, Error **errp) 302 + { 303 + DeviceState *d; 304 + SysBusESPState *sysbus; 305 + ESPState *esp; 306 + 307 + d = qdev_create(NULL, TYPE_ESP); 308 + object_property_add_child(OBJECT(dev), "esp", OBJECT(d), errp); 309 + sysbus = ESP_STATE(d); 310 + esp = &sysbus->esp; 311 + esp->dma_memory_read = espdma_memory_read; 312 + esp->dma_memory_write = espdma_memory_write; 313 + esp->dma_opaque = SPARC32_DMA_DEVICE(dev); 314 + sysbus->it_shift = 2; 315 + esp->dma_enabled = 1; 316 + qdev_init_nofail(d); 317 + } 318 + 319 + static void sparc32_espdma_device_class_init(ObjectClass *klass, void *data) 320 + { 321 + DeviceClass *dc = DEVICE_CLASS(klass); 322 + 323 + dc->realize = sparc32_espdma_device_realize; 324 + } 325 + 301 326 static const TypeInfo sparc32_espdma_device_info = { 302 327 .name = TYPE_SPARC32_ESPDMA_DEVICE, 303 328 .parent = TYPE_SPARC32_DMA_DEVICE, 304 329 .instance_size = sizeof(ESPDMADeviceState), 305 330 .instance_init = sparc32_espdma_device_init, 331 + .class_init = sparc32_espdma_device_class_init, 306 332 }; 307 333 308 334 static void sparc32_ledma_device_init(Object *obj)
+8 -11
hw/sparc/sun4m.c
··· 817 817 DeviceState *slavio_intctl; 818 818 unsigned int i; 819 819 void *iommu, *nvram; 820 - DeviceState *espdma, *ledma; 820 + DeviceState *espdma, *esp, *ledma; 821 821 SysBusDevice *sbd; 822 822 qemu_irq *cpu_irqs[MAX_CPUS], slavio_irq[32], slavio_cpu_irq[MAX_CPUS]; 823 - qemu_irq esp_reset, dma_enable; 824 823 qemu_irq fdc_tc; 825 824 unsigned long kernel_size; 826 825 DriveInfo *fd[MAX_FD]; ··· 878 877 espdma = sparc32_dma_init(hwdef->dma_base, iommu, 0); 879 878 sbd = SYS_BUS_DEVICE(espdma); 880 879 sysbus_connect_irq(sbd, 0, slavio_irq[18]); 880 + 881 + esp = DEVICE(object_resolve_path_component(OBJECT(espdma), "esp")); 882 + sbd = SYS_BUS_DEVICE(esp); 883 + sysbus_mmio_map(sbd, 0, hwdef->esp_base); 884 + sysbus_connect_irq(sbd, 0, qdev_get_gpio_in(espdma, 0)); 885 + qdev_connect_gpio_out(espdma, 0, qdev_get_gpio_in(esp, 0)); 886 + qdev_connect_gpio_out(espdma, 1, qdev_get_gpio_in(esp, 1)); 881 887 882 888 ledma = sparc32_dma_init(hwdef->dma_base + 16ULL, iommu, 1); 883 889 sbd = SYS_BUS_DEVICE(ledma); ··· 964 970 965 971 slavio_misc_init(hwdef->slavio_base, hwdef->aux1_base, hwdef->aux2_base, 966 972 slavio_irq[30], fdc_tc); 967 - 968 - esp_init(hwdef->esp_base, 2, 969 - espdma_memory_read, espdma_memory_write, 970 - espdma, 971 - qdev_get_gpio_in(espdma, 0), 972 - &esp_reset, &dma_enable); 973 - 974 - qdev_connect_gpio_out(espdma, 0, esp_reset); 975 - qdev_connect_gpio_out(espdma, 1, dma_enable); 976 973 977 974 if (hwdef->cs_base) { 978 975 sysbus_create_simple("SUNW,CS4231", hwdef->cs_base,
+3
include/hw/sparc/sparc32_dma.h
··· 2 2 #define SPARC32_DMA_H 3 3 4 4 #include "hw/sysbus.h" 5 + #include "hw/scsi/esp.h" 5 6 6 7 #define DMA_REGS 4 7 8 ··· 28 29 29 30 typedef struct ESPDMADeviceState { 30 31 DMADeviceState parent_obj; 32 + 33 + SysBusESPState *esp; 31 34 } ESPDMADeviceState; 32 35 33 36 #define TYPE_SPARC32_LEDMA_DEVICE "sparc32-ledma"