mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 16:23:55 -06:00
dma: eliminate DMAContext
The DMAContext is a simple pointer to an AddressSpace that is now always already available. Make everyone hold the address space directly, and clean up the DMA API to use the AddressSpace directly. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
96478592a9
commit
df32fd1c9f
23 changed files with 117 additions and 148 deletions
|
@ -63,7 +63,7 @@ static int usb_ehci_pci_initfn(PCIDevice *dev)
|
|||
s->caps[0x09] = 0x68; /* EECP */
|
||||
|
||||
s->irq = dev->irq[3];
|
||||
s->dma = pci_dma_context(dev);
|
||||
s->as = pci_get_address_space(dev);
|
||||
|
||||
s->capsbase = 0x00;
|
||||
s->opregbase = 0x20;
|
||||
|
@ -86,7 +86,7 @@ static void usb_ehci_pci_write_config(PCIDevice *dev, uint32_t addr,
|
|||
return;
|
||||
}
|
||||
busmaster = pci_get_word(dev->config + PCI_COMMAND) & PCI_COMMAND_MASTER;
|
||||
i->ehci.dma = busmaster ? pci_dma_context(dev) : NULL;
|
||||
i->ehci.as = busmaster ? pci_get_address_space(dev) : &address_space_memory;
|
||||
}
|
||||
|
||||
static Property ehci_pci_properties[] = {
|
||||
|
|
|
@ -40,7 +40,7 @@ static int usb_ehci_sysbus_initfn(SysBusDevice *dev)
|
|||
|
||||
s->capsbase = sec->capsbase;
|
||||
s->opregbase = sec->opregbase;
|
||||
s->dma = &dma_context_memory;
|
||||
s->as = &address_space_memory;
|
||||
|
||||
usb_ehci_initfn(s, DEVICE(dev));
|
||||
sysbus_init_irq(dev, &s->irq);
|
||||
|
|
|
@ -446,7 +446,7 @@ static inline int get_dwords(EHCIState *ehci, uint32_t addr,
|
|||
{
|
||||
int i;
|
||||
|
||||
if (!ehci->dma) {
|
||||
if (!ehci->as) {
|
||||
ehci_raise_irq(ehci, USBSTS_HSE);
|
||||
ehci->usbcmd &= ~USBCMD_RUNSTOP;
|
||||
trace_usb_ehci_dma_error();
|
||||
|
@ -454,7 +454,7 @@ static inline int get_dwords(EHCIState *ehci, uint32_t addr,
|
|||
}
|
||||
|
||||
for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
|
||||
dma_memory_read(ehci->dma, addr, buf, sizeof(*buf));
|
||||
dma_memory_read(ehci->as, addr, buf, sizeof(*buf));
|
||||
*buf = le32_to_cpu(*buf);
|
||||
}
|
||||
|
||||
|
@ -467,7 +467,7 @@ static inline int put_dwords(EHCIState *ehci, uint32_t addr,
|
|||
{
|
||||
int i;
|
||||
|
||||
if (!ehci->dma) {
|
||||
if (!ehci->as) {
|
||||
ehci_raise_irq(ehci, USBSTS_HSE);
|
||||
ehci->usbcmd &= ~USBCMD_RUNSTOP;
|
||||
trace_usb_ehci_dma_error();
|
||||
|
@ -476,7 +476,7 @@ static inline int put_dwords(EHCIState *ehci, uint32_t addr,
|
|||
|
||||
for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
|
||||
uint32_t tmp = cpu_to_le32(*buf);
|
||||
dma_memory_write(ehci->dma, addr, &tmp, sizeof(tmp));
|
||||
dma_memory_write(ehci->as, addr, &tmp, sizeof(tmp));
|
||||
}
|
||||
|
||||
return num;
|
||||
|
@ -1245,7 +1245,7 @@ static int ehci_init_transfer(EHCIPacket *p)
|
|||
cpage = get_field(p->qtd.token, QTD_TOKEN_CPAGE);
|
||||
bytes = get_field(p->qtd.token, QTD_TOKEN_TBYTES);
|
||||
offset = p->qtd.bufptr[0] & ~QTD_BUFPTR_MASK;
|
||||
qemu_sglist_init(&p->sgl, 5, p->queue->ehci->dma);
|
||||
qemu_sglist_init(&p->sgl, 5, p->queue->ehci->as);
|
||||
|
||||
while (bytes > 0) {
|
||||
if (cpage > 4) {
|
||||
|
@ -1484,7 +1484,7 @@ static int ehci_process_itd(EHCIState *ehci,
|
|||
return -1;
|
||||
}
|
||||
|
||||
qemu_sglist_init(&ehci->isgl, 2, ehci->dma);
|
||||
qemu_sglist_init(&ehci->isgl, 2, ehci->as);
|
||||
if (off + len > 4096) {
|
||||
/* transfer crosses page border */
|
||||
uint32_t len2 = off + len - 4096;
|
||||
|
|
|
@ -261,7 +261,7 @@ struct EHCIState {
|
|||
USBBus bus;
|
||||
qemu_irq irq;
|
||||
MemoryRegion mem;
|
||||
DMAContext *dma;
|
||||
AddressSpace *as;
|
||||
MemoryRegion mem_caps;
|
||||
MemoryRegion mem_opreg;
|
||||
MemoryRegion mem_ports;
|
||||
|
|
|
@ -62,7 +62,7 @@ typedef struct {
|
|||
USBBus bus;
|
||||
qemu_irq irq;
|
||||
MemoryRegion mem;
|
||||
DMAContext *dma;
|
||||
AddressSpace *as;
|
||||
int num_ports;
|
||||
const char *name;
|
||||
|
||||
|
@ -508,7 +508,7 @@ static inline int get_dwords(OHCIState *ohci,
|
|||
addr += ohci->localmem_base;
|
||||
|
||||
for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
|
||||
dma_memory_read(ohci->dma, addr, buf, sizeof(*buf));
|
||||
dma_memory_read(ohci->as, addr, buf, sizeof(*buf));
|
||||
*buf = le32_to_cpu(*buf);
|
||||
}
|
||||
|
||||
|
@ -525,7 +525,7 @@ static inline int put_dwords(OHCIState *ohci,
|
|||
|
||||
for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
|
||||
uint32_t tmp = cpu_to_le32(*buf);
|
||||
dma_memory_write(ohci->dma, addr, &tmp, sizeof(tmp));
|
||||
dma_memory_write(ohci->as, addr, &tmp, sizeof(tmp));
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
@ -540,7 +540,7 @@ static inline int get_words(OHCIState *ohci,
|
|||
addr += ohci->localmem_base;
|
||||
|
||||
for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
|
||||
dma_memory_read(ohci->dma, addr, buf, sizeof(*buf));
|
||||
dma_memory_read(ohci->as, addr, buf, sizeof(*buf));
|
||||
*buf = le16_to_cpu(*buf);
|
||||
}
|
||||
|
||||
|
@ -557,7 +557,7 @@ static inline int put_words(OHCIState *ohci,
|
|||
|
||||
for (i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
|
||||
uint16_t tmp = cpu_to_le16(*buf);
|
||||
dma_memory_write(ohci->dma, addr, &tmp, sizeof(tmp));
|
||||
dma_memory_write(ohci->as, addr, &tmp, sizeof(tmp));
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
@ -585,7 +585,7 @@ static inline int ohci_read_iso_td(OHCIState *ohci,
|
|||
static inline int ohci_read_hcca(OHCIState *ohci,
|
||||
dma_addr_t addr, struct ohci_hcca *hcca)
|
||||
{
|
||||
dma_memory_read(ohci->dma, addr + ohci->localmem_base, hcca, sizeof(*hcca));
|
||||
dma_memory_read(ohci->as, addr + ohci->localmem_base, hcca, sizeof(*hcca));
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -617,7 +617,7 @@ static inline int ohci_put_iso_td(OHCIState *ohci,
|
|||
static inline int ohci_put_hcca(OHCIState *ohci,
|
||||
dma_addr_t addr, struct ohci_hcca *hcca)
|
||||
{
|
||||
dma_memory_write(ohci->dma,
|
||||
dma_memory_write(ohci->as,
|
||||
addr + ohci->localmem_base + HCCA_WRITEBACK_OFFSET,
|
||||
(char *)hcca + HCCA_WRITEBACK_OFFSET,
|
||||
HCCA_WRITEBACK_SIZE);
|
||||
|
@ -634,12 +634,12 @@ static void ohci_copy_td(OHCIState *ohci, struct ohci_td *td,
|
|||
n = 0x1000 - (ptr & 0xfff);
|
||||
if (n > len)
|
||||
n = len;
|
||||
dma_memory_rw(ohci->dma, ptr + ohci->localmem_base, buf, n, dir);
|
||||
dma_memory_rw(ohci->as, ptr + ohci->localmem_base, buf, n, dir);
|
||||
if (n == len)
|
||||
return;
|
||||
ptr = td->be & ~0xfffu;
|
||||
buf += n;
|
||||
dma_memory_rw(ohci->dma, ptr + ohci->localmem_base, buf, len - n, dir);
|
||||
dma_memory_rw(ohci->as, ptr + ohci->localmem_base, buf, len - n, dir);
|
||||
}
|
||||
|
||||
/* Read/Write the contents of an ISO TD from/to main memory. */
|
||||
|
@ -653,12 +653,12 @@ static void ohci_copy_iso_td(OHCIState *ohci,
|
|||
n = 0x1000 - (ptr & 0xfff);
|
||||
if (n > len)
|
||||
n = len;
|
||||
dma_memory_rw(ohci->dma, ptr + ohci->localmem_base, buf, n, dir);
|
||||
dma_memory_rw(ohci->as, ptr + ohci->localmem_base, buf, n, dir);
|
||||
if (n == len)
|
||||
return;
|
||||
ptr = end_addr & ~0xfffu;
|
||||
buf += n;
|
||||
dma_memory_rw(ohci->dma, ptr + ohci->localmem_base, buf, len - n, dir);
|
||||
dma_memory_rw(ohci->as, ptr + ohci->localmem_base, buf, len - n, dir);
|
||||
}
|
||||
|
||||
static void ohci_process_lists(OHCIState *ohci, int completion);
|
||||
|
@ -1788,11 +1788,11 @@ static USBBusOps ohci_bus_ops = {
|
|||
static int usb_ohci_init(OHCIState *ohci, DeviceState *dev,
|
||||
int num_ports, dma_addr_t localmem_base,
|
||||
char *masterbus, uint32_t firstport,
|
||||
DMAContext *dma)
|
||||
AddressSpace *as)
|
||||
{
|
||||
int i;
|
||||
|
||||
ohci->dma = dma;
|
||||
ohci->as = as;
|
||||
|
||||
if (usb_frame_time == 0) {
|
||||
#ifdef OHCI_TIME_WARP
|
||||
|
@ -1859,7 +1859,7 @@ static int usb_ohci_initfn_pci(struct PCIDevice *dev)
|
|||
|
||||
if (usb_ohci_init(&ohci->state, &dev->qdev, ohci->num_ports, 0,
|
||||
ohci->masterbus, ohci->firstport,
|
||||
pci_dma_context(dev)) != 0) {
|
||||
pci_get_address_space(dev)) != 0) {
|
||||
return -1;
|
||||
}
|
||||
ohci->state.irq = ohci->pci_dev.irq[0];
|
||||
|
@ -1882,7 +1882,7 @@ static int ohci_init_pxa(SysBusDevice *dev)
|
|||
|
||||
/* Cannot fail as we pass NULL for masterbus */
|
||||
usb_ohci_init(&s->ohci, &dev->qdev, s->num_ports, s->dma_offset, NULL, 0,
|
||||
&dma_context_memory);
|
||||
&address_space_memory);
|
||||
sysbus_init_irq(dev, &s->ohci.irq);
|
||||
sysbus_init_mmio(dev, &s->ohci.mem);
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ int usb_packet_map(USBPacket *p, QEMUSGList *sgl)
|
|||
|
||||
while (len) {
|
||||
dma_addr_t xlen = len;
|
||||
mem = dma_memory_map(sgl->dma, base, &xlen, dir);
|
||||
mem = dma_memory_map(sgl->as, base, &xlen, dir);
|
||||
if (!mem) {
|
||||
goto err;
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ void usb_packet_unmap(USBPacket *p, QEMUSGList *sgl)
|
|||
int i;
|
||||
|
||||
for (i = 0; i < p->iov.niov; i++) {
|
||||
dma_memory_unmap(sgl->dma, p->iov.iov[i].iov_base,
|
||||
dma_memory_unmap(sgl->as, p->iov.iov[i].iov_base,
|
||||
p->iov.iov[i].iov_len, dir,
|
||||
p->iov.iov[i].iov_len);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue