/* * ARM PrimeCell PL080/PL081 DMA controller * * Copyright (c) 2006 CodeSourcery. * Copyright (c) 2018 Linaro Limited * Written by Paul Brook, Peter Maydell * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 or * (at your option) any later version. */ /* This is a model of the Arm PrimeCell PL080/PL081 DMA controller: * The PL080 TRM is: * http://infocenter.arm.com/help/topic/com.arm.doc.ddi0196g/DDI0196.pdf * and the PL081 TRM is: * http://infocenter.arm.com/help/topic/com.arm.doc.ddi0218e/DDI0218.pdf * * QEMU interface: * + sysbus IRQ 0: DMACINTR combined interrupt line * + sysbus IRQ 1: DMACINTERR error interrupt request * + sysbus IRQ 2: DMACINTTC count interrupt request * + sysbus MMIO region 0: MemoryRegion for the device's registers * + QOM property "downstream": MemoryRegion defining where DMA * bus master transactions are made */ #ifndef HW_DMA_PL080_H #define HW_DMA_PL080_H #include "hw/sysbus.h" #define PL080_MAX_CHANNELS 8 typedef struct { uint32_t src; uint32_t dest; uint32_t lli; uint32_t ctrl; uint32_t conf; } pl080_channel; #define TYPE_PL080 "pl080" #define TYPE_PL081 "pl081" #define PL080(obj) OBJECT_CHECK(PL080State, (obj), TYPE_PL080) typedef struct PL080State { SysBusDevice parent_obj; MemoryRegion iomem; uint8_t tc_int; uint8_t tc_mask; uint8_t err_int; uint8_t err_mask; uint32_t conf; uint32_t sync; uint32_t req_single; uint32_t req_burst; pl080_channel chan[PL080_MAX_CHANNELS]; int nchannels; /* Flag to avoid recursive DMA invocations. */ int running; qemu_irq irq; qemu_irq interr; qemu_irq inttc; MemoryRegion *downstream; AddressSpace downstream_as; } PL080State; #endif