diff options
author | Hervé Poussineau <hpoussin@reactos.org> | 2014-03-17 23:00:23 +0100 |
---|---|---|
committer | Andreas Färber <andreas.faerber@web.de> | 2014-03-20 00:33:17 +0100 |
commit | d16644ec4ce1da5db24dd0a1618d814feaaf8ccb (patch) | |
tree | d9cd08d7b8ff21ae87c32c26180ab0d562522988 /hw/pci-host/prep.c | |
parent | 1fe9e2626f00b237a7e79d3eba4891da1bff6671 (diff) |
raven: Add PCI bus mastering address space
This has been tested on Linux 2.4/PPC with the lsi53c895a SCSI adapter.
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
Signed-off-by: Andreas Färber <andreas.faerber@web.de>
Diffstat (limited to 'hw/pci-host/prep.c')
-rw-r--r-- | hw/pci-host/prep.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/hw/pci-host/prep.c b/hw/pci-host/prep.c index 7f23a11881..8109625324 100644 --- a/hw/pci-host/prep.c +++ b/hw/pci-host/prep.c @@ -59,6 +59,10 @@ typedef struct PRePPCIState { MemoryRegion pci_io_non_contiguous; MemoryRegion pci_memory; MemoryRegion pci_intack; + MemoryRegion bm; + MemoryRegion bm_ram_alias; + MemoryRegion bm_pci_memory_alias; + AddressSpace bm_as; RavenPCIState pci_dev; int contiguous_map; @@ -190,6 +194,14 @@ static void prep_set_irq(void *opaque, int irq_num, int level) qemu_set_irq(pic[irq_num] , level); } +static AddressSpace *raven_pcihost_set_iommu(PCIBus *bus, void *opaque, + int devfn) +{ + PREPPCIState *s = opaque; + + return &s->bm_as; +} + static void raven_change_gpio(void *opaque, int n, int level) { PREPPCIState *s = opaque; @@ -255,6 +267,18 @@ static void raven_pcihost_initfn(Object *obj) pci_bus_new_inplace(&s->pci_bus, sizeof(s->pci_bus), DEVICE(obj), NULL, &s->pci_memory, &s->pci_io, 0, TYPE_PCI_BUS); + /* Bus master address space */ + memory_region_init(&s->bm, obj, "bm-raven", UINT32_MAX); + memory_region_init_alias(&s->bm_pci_memory_alias, obj, "bm-pci-memory", + &s->pci_memory, 0, + memory_region_size(&s->pci_memory)); + memory_region_init_alias(&s->bm_ram_alias, obj, "bm-system", + get_system_memory(), 0, 0x80000000); + memory_region_add_subregion(&s->bm, 0 , &s->bm_pci_memory_alias); + memory_region_add_subregion(&s->bm, 0x80000000, &s->bm_ram_alias); + address_space_init(&s->bm_as, &s->bm, "raven-bm"); + pci_setup_iommu(&s->pci_bus, raven_pcihost_set_iommu, s); + h->bus = &s->pci_bus; object_initialize(&s->pci_dev, sizeof(s->pci_dev), TYPE_RAVEN_PCI_DEVICE); |