prep: improve Raven PCI host emulation
v4 cover prep: improve Raven PCI host emulation
This patchset improves Raven PCI host emulation, found in some PPC platforms, like the QEMU 'prep' one, and for example the IBM RS/6000 40p.
Some features added to raven emulation were already present in prep board (non contiguous I/O, firmware loading), while some other are new (PCI bus mastering memory region).
This patchset has been tested against Linux 2.4 PPC and IBM RS/6000 40p firmware.
Notable achievements are PCI bus mastering (tested with lsi53c895a SCSI adapter), lots of cleanup and emulation correctness, and also documentation of current hacks required by Open Hack'Ware.
This gives us a good base to replace OpenHack'Ware by a possible upcoming OpenBIOS release.
Changes since v3:
- rebased and removed patches already applied
- moved non contiguous I/O patch sooner, to not break bisectability
Changes since v2:
- rebased and fixed conflicts in patches 5 and 6
Changes since v1:
- reworked a dubious memcpy to make it work on big endian hosts
- split onto multiple patches
Hervé Poussineau (7):
raven: rename intack region to pci_intack
raven: implement non-contiguous I/O region
raven: set a correct PCI I/O memory region
raven: set a correct PCI memory region
raven: add PCI bus mastering address space
raven: fix PCI bus accesses with size > 1
raven: use raven_ for all function prefixes
hw/pci-host/prep.c | 180 ++++++++++++++++++++++++++++++++++++++++++---------- hw/ppc/prep.c | 103 ++++-------------------------- 2 files changed, 159 insertions(+), 124 deletions(-)
Signature · 1 line
1.7.10.4
PATCH v4 1/7 raven: rename intack region to pci_intack
Regions added in next patches will also have the pci_ prefix.
--- hw/pci-host/prep.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
hw/pci-host/prep.c +4 -3
@@ -52,9 +52,9 @@ typedef struct RavenPCIState {typedef struct PRePPCIState {PCIHostState parent_obj; -MemoryRegion intack;qemu_irq irq[PCI_NUM_PINS ];PCIBus pci_bus; +MemoryRegion pci_intack;RavenPCIState pci_dev; }PREPPCIState ;
@@ -148,8 +148,9 @@ static void raven_pcihost_realizefn(DeviceState *d, Error **errp)memory_region_init_io (&h->mmcfg,OBJECT (s), &PPC_PCIIO_ops, s,"pciio" ,0x00400000 );memory_region_add_subregion (address_space_mem,0x80800000 , &h->mmcfg); -memory_region_init_io (&s->intack,OBJECT (s), &PPC_intack_ops, s,"pci-intack" ,1 ); -memory_region_add_subregion (address_space_mem,0xbffffff0 , &s->intack); +memory_region_init_io (&s->pci_intack,OBJECT (s), &PPC_intack_ops, s, +"pci-intack" ,1 ); +memory_region_add_subregion (address_space_mem,0xbffffff0 , &s->pci_intack);/* TODO Remove once realize propagates to child devices. */ object_property_set_bool (OBJECT (&s->pci_dev), true,"realized" , errp);
Signature · 1 line
1.7.10.4
PATCH v4 2/7 raven: implement non-contiguous I/O region
In reply to Hervé PoussineauRemove now duplicated code from prep board.
--- hw/pci-host/prep.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++ hw/ppc/prep.c | 94 ++-------------------------------------------------- 2 files changed, 87 insertions(+), 91 deletions(-)
hw/pci-host/prep.c +84 -0
@@ -54,8 +54,12 @@ typedef struct PRePPCIState {qemu_irq irq[PCI_NUM_PINS ];PCIBus pci_bus; +AddressSpace pci_io_as; +MemoryRegion pci_io_non_contiguous;MemoryRegion pci_intack;RavenPCIState pci_dev; + +int contiguous_map; } PREPPCIState;#define BIOS_SIZE (1024 * 1024)
@@ -107,6 +111,71 @@ static const MemoryRegionOps PPC_intack_ops = { }, }; +static inline hwaddr raven_io_address (PREPPCIState *s, +hwaddr addr) +{ +if (s->contiguous_map ==0 ) { +/* 64 KB contiguous space for IOs */ + addr &=0xFFFF ; + }else { +/* 8 MB non-contiguous space for IOs */ + addr = (addr &0x1F ) | ((addr &0x007FFF000 ) >>7 ); + } + +/* FIXME: handle endianness switch */ + +return addr; +} + +static uint64_t raven_io_read (void *opaque,hwaddr addr, +unsigned int size) +{ +PREPPCIState *s = opaque; +uint8_t buf[4 ]; + + addr =raven_io_address (s, addr); +address_space_read (&s->pci_io_as, addr, buf, size); + +if (size ==1 ) { +return buf[0 ]; + }else if (size ==2 ) { +return lduw_p (buf); + }else if (size ==4 ) { +return ldl_p (buf); + }else { +assert (false); + } +} + +static void raven_io_write (void *opaque,hwaddr addr, +uint64_t val,unsigned int size) +{ +PREPPCIState *s = opaque; +uint8_t buf[4 ]; + + addr =raven_io_address (s, addr); + +if (size ==1 ) { + buf[0 ] = val; + }else if (size ==2 ) { +stw_p (buf, val); + }else if (size ==4 ) { +stl_p (buf, val); + }else { +assert (false); + } + +address_space_write (&s->pci_io_as, addr, buf, size); +} + +static const MemoryRegionOps raven_io_ops = { + .read = raven_io_read, + .write = raven_io_write, + .endianness =DEVICE_LITTLE_ENDIAN , + .impl.max_access_size =4 , + .valid.unaligned = true, +}; +static int prep_map_irq (PCIDevice *pci_dev,int irq_num) {return (irq_num + (pci_dev->devfn >>3 )) &1 ;
@@ -119,6 +188,12 @@ static void prep_set_irq(void *opaque, int irq_num, int level)qemu_set_irq (pic[irq_num] , level); } +static void raven_change_gpio (void *opaque,int n,int level) +{ +PREPPCIState *s = opaque; + s->contiguous_map = level; +} +static void raven_pcihost_realizefn (DeviceState *d,Error **errp) {SysBusDevice *dev =SYS_BUS_DEVICE (d);
@@ -133,6 +208,8 @@ static void raven_pcihost_realizefn(DeviceState *d, Error **errp)sysbus_init_irq (dev, &s->irq[i]); } +qdev_init_gpio_in (d, raven_change_gpio,1 ); +pci_bus_irqs (&s->pci_bus, prep_set_irq, prep_map_irq, s->irq,PCI_NUM_PINS ); memory_region_init_io(&h->conf_mem, OBJECT(h), &pci_host_conf_be_ops, s,
@@ -164,6 +241,13 @@ static void raven_pcihost_initfn(Object *obj)MemoryRegion *address_space_io =get_system_io ();DeviceState *pci_dev; +memory_region_init_io (&s->pci_io_non_contiguous, obj, &raven_io_ops, s, +"pci-io-non-contiguous" ,0x00800000 ); +address_space_init (&s->pci_io_as,get_system_io (),"raven-io" ); + +/* CPU address space */ +memory_region_add_subregion_overlap (address_space_mem,0x80000000 , + &s->pci_io_non_contiguous,1 );pci_bus_new_inplace (&s->pci_bus,sizeof (s->pci_bus),DEVICE (obj),NULL , address_space_mem, address_space_io,0 ,TYPE_PCI_BUS ); h->bus = &s->pci_bus;
hw/ppc/prep.c +3 -91
130 lines not on this page · raw message
Signature · 1 line
1.7.10.4
Re: [Qemu-devel] [PATCH v4 2/7] raven: implement non-contiguous I/O region
Am 17.03.2014 23:00, schrieb Hervé Poussineau:
Quoted 26 lines
hw/pci-host/prep.c +26
-0+static uint64_t raven_io_read (void *opaque,hwaddr addr, +unsigned int size) +{ +PREPPCIState *s = opaque; +uint8_t buf[4 ]; + + addr =raven_io_address (s, addr); +address_space_read (&s->pci_io_as, addr, buf, size); + +if (size ==1 ) { +return buf[0 ]; + }else if (size ==2 ) { +return lduw_p (buf); + }else if (size ==4 ) { +return ldl_p (buf); + }else { +assert (false); + } +} + +static void raven_io_write (void *opaque,hwaddr addr, +uint64_t val,unsigned int size) +{ +PREPPCIState *s = opaque; +uint8_t buf[4 ]; +
hw/pci-host/prep.c static const MemoryRegionOps PPC_intack_ops = { · line 165
Quoted 10 lines
hw/pci-host/prep.c +10
-0+ addr =raven_io_address (s, addr); + +if (size ==1 ) { + buf[0 ] = val; + }else if (size ==2 ) { +stw_p (buf, val); + }else if (size ==4 ) { +stl_p (buf, val); + }else { +assert (false);
Replacing these two with g_assert_not_reached().
Regards,
Andreas
PATCH v4 3/7 raven: set a correct PCI I/O memory region
In reply to Hervé PoussineauPCI I/O region is 0x3f800000 bytes starting at 0x80000000. Do not use global QEMU I/O region, which is only 64KB.
--- hw/pci-host/prep.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)
hw/pci-host/prep.c +10 -9
@@ -55,6 +55,7 @@ typedef struct PRePPCIState {qemu_irq irq[PCI_NUM_PINS ];PCIBus pci_bus;AddressSpace pci_io_as; +MemoryRegion pci_io;MemoryRegion pci_io_non_contiguous;MemoryRegion pci_intack;RavenPCIState pci_dev;
@@ -134,7 +135,7 @@ static uint64_t raven_io_read(void *opaque, hwaddr addr,uint8_t buf[4 ]; addr =raven_io_address (s, addr); -address_space_read (&s->pci_io_as, addr, buf, size); +address_space_read (&s->pci_io_as, addr +0x80000000 , buf, size);if (size ==1 ) {return buf[0 ];
@@ -165,7 +166,7 @@ static void raven_io_write(void *opaque, hwaddr addr,assert (false); } -address_space_write (&s->pci_io_as, addr, buf, size); +address_space_write (&s->pci_io_as, addr +0x80000000 , buf, size); }static const MemoryRegionOps raven_io_ops = {
@@ -214,13 +215,11 @@ static void raven_pcihost_realizefn(DeviceState *d, Error **errp)memory_region_init_io (&h->conf_mem,OBJECT (h), &pci_host_conf_be_ops, s,"pci-conf-idx" ,1 ); -sysbus_add_io (dev,0xcf8 , &h->conf_mem); -sysbus_init_ioports (&h->busdev,0xcf8 ,1 ); +memory_region_add_subregion (&s->pci_io,0xcf8 , &h->conf_mem);memory_region_init_io (&h->data_mem,OBJECT (h), &pci_host_data_be_ops, s,"pci-conf-data" ,1 ); -sysbus_add_io (dev,0xcfc , &h->data_mem); -sysbus_init_ioports (&h->busdev,0xcfc ,1 ); +memory_region_add_subregion (&s->pci_io,0xcfc , &h->data_mem);memory_region_init_io (&h->mmcfg,OBJECT (s), &PPC_PCIIO_ops, s,"pciio" ,0x00400000 );memory_region_add_subregion (address_space_mem,0x80800000 , &h->mmcfg);
@@ -238,18 +237,20 @@ static void raven_pcihost_initfn(Object *obj)PCIHostState *h =PCI_HOST_BRIDGE (obj);PREPPCIState *s =RAVEN_PCI_HOST_BRIDGE (obj);MemoryRegion *address_space_mem =get_system_memory (); -MemoryRegion *address_space_io =get_system_io ();DeviceState *pci_dev; +memory_region_init (&s->pci_io, obj,"pci-io" ,0x3f800000 );memory_region_init_io (&s->pci_io_non_contiguous, obj, &raven_io_ops, s,"pci-io-non-contiguous" ,0x00800000 ); -address_space_init (&s->pci_io_as,get_system_io (),"raven-io" ); +address_space_init (&s->pci_io_as, &s->pci_io,"raven-io" );/* CPU address space */ +memory_region_add_subregion (address_space_mem,0x80000000 , &s->pci_io);memory_region_add_subregion_overlap (address_space_mem,0x80000000 , &s->pci_io_non_contiguous,1 );pci_bus_new_inplace (&s->pci_bus,sizeof (s->pci_bus),DEVICE (obj),NULL , - address_space_mem, address_space_io,0 ,TYPE_PCI_BUS ); + address_space_mem, &s->pci_io,0 ,TYPE_PCI_BUS ); + h->bus = &s->pci_bus;object_initialize (&s->pci_dev,sizeof (s->pci_dev),TYPE_RAVEN_PCI_DEVICE );
Signature · 1 line
1.7.10.4
PATCH v4 4/7 raven: set a correct PCI memory region
In reply to Hervé PoussineauPCI memory region is 0x3f000000 bytes starting at 0xc0000000.
However, keep compatibility with Open Hack'Ware expectations by adding a hack for Open Hack'Ware display.
--- hw/pci-host/prep.c | 9 ++++++--- hw/ppc/prep.c | 9 +++++++++ 2 files changed, 15 insertions(+), 3 deletions(-)
hw/pci-host/prep.c +6 -3
@@ -57,6 +57,7 @@ typedef struct PRePPCIState {AddressSpace pci_io_as;MemoryRegion pci_io;MemoryRegion pci_io_non_contiguous; +MemoryRegion pci_memory;MemoryRegion pci_intack;RavenPCIState pci_dev;
@@ -203,8 +204,6 @@ static void raven_pcihost_realizefn(DeviceState *d, Error **errp)MemoryRegion *address_space_mem =get_system_memory ();int i; - isa_mem_base =0xc0000000 ; -for (i =0 ; i <PCI_NUM_PINS ; i++) {sysbus_init_irq (dev, &s->irq[i]); }
@@ -242,14 +241,18 @@ static void raven_pcihost_initfn(Object *obj)memory_region_init (&s->pci_io, obj,"pci-io" ,0x3f800000 );memory_region_init_io (&s->pci_io_non_contiguous, obj, &raven_io_ops, s,"pci-io-non-contiguous" ,0x00800000 ); +/* Open Hack'Ware hack: real size should be only 0x3f000000 bytes */ +memory_region_init (&s->pci_memory, obj,"pci-memory" , +0x3f000000 +0xc0000000ULL );address_space_init (&s->pci_io_as, &s->pci_io,"raven-io" );/* CPU address space */ memory_region_add_subregion (address_space_mem,0x80000000 , &s->pci_io);memory_region_add_subregion_overlap (address_space_mem,0x80000000 , &s->pci_io_non_contiguous,1 ); +memory_region_add_subregion (address_space_mem,0xc0000000 , &s->pci_memory);pci_bus_new_inplace (&s->pci_bus,sizeof (s->pci_bus),DEVICE (obj),NULL , - address_space_mem, &s->pci_io,0 ,TYPE_PCI_BUS ); + &s->pci_memory, &s->pci_io,0 ,TYPE_PCI_BUS ); h->bus = &s->pci_bus;
hw/ppc/prep.c +9 -0
@@ -381,6 +381,7 @@ static void ppc_prep_init(QEMUMachineInitArgs *args)#endif int linux_boot, i, nb_nics1;MemoryRegion *ram =g_new (MemoryRegion,1 ); +MemoryRegion *vga =g_new (MemoryRegion,1 );uint32_t kernel_base, initrd_base;long kernel_size, initrd_size;DeviceState *dev;
@@ -506,6 +507,14 @@ static void ppc_prep_init(QEMUMachineInitArgs *args)/* init basic PC hardware */ pci_vga_init (pci_bus); +/* Open Hack'Ware hack: PCI BAR#0 is programmed to 0xf0000000. +* While bios will access framebuffer at 0xf0000000, real physical +* address is 0xf0000000 + 0xc0000000 (PCI memory base). +* Alias the wrong memory accesses to the right place. +*/ +memory_region_init_alias (vga,NULL ,"vga-alias" ,pci_address_space (pci), +0xf0000000 ,0x1000000 ); +memory_region_add_subregion_overlap (sysmem,0xf0000000 , vga,10 ); nb_nics1 = nb_nics;if (nb_nics1 >NE2000_NB_MAX )
Signature · 1 line
1.7.10.4
Re: [Qemu-devel] [PATCH v4 4/7] raven: set a correct PCI memory region
Am 17.03.2014 23:00, schrieb Hervé Poussineau:
Quoted 4 lines
PCI memory region is
0x3f000000bytes starting at0xc0000000.However, keep compatibility with Open Hack'Ware expectations by adding a hack for Open Hack'Ware display.
Have you taken a look whether we can fix this on the OHW side? I don't feel we need to be compatible with arbitrary OHW versions, so getting the two hacks out would be nice as follow-up.
Regards,
Andreas
PATCH v4 5/7 raven: add PCI bus mastering address space
In reply to Hervé PoussineauThis has been tested on Linux 2.4/PPC with the lsi53c895a SCSI adapter.
--- hw/pci-host/prep.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
hw/pci-host/prep.c +23 -0
@@ -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,13 @@ 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;
@@ -254,6 +265,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 );
Signature · 1 line
1.7.10.4
PATCH v4 6/7 raven: fix PCI bus accesses with size > 1
In reply to Hervé Poussineau--- hw/pci-host/prep.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
hw/pci-host/prep.c +4 -4
@@ -223,12 +223,12 @@ static void raven_pcihost_realizefn(DeviceState *d, Error **errp)pci_bus_irqs (&s->pci_bus, prep_set_irq, prep_map_irq, s->irq,PCI_NUM_PINS ); -memory_region_init_io (&h->conf_mem,OBJECT (h), &pci_host_conf_be_ops, s, -"pci-conf-idx" ,1 ); +memory_region_init_io (&h->conf_mem,OBJECT (h), &pci_host_conf_le_ops, s, +"pci-conf-idx" ,4 );memory_region_add_subregion (&s->pci_io,0xcf8 , &h->conf_mem); -memory_region_init_io (&h->data_mem,OBJECT (h), &pci_host_data_be_ops, s, -"pci-conf-data" ,1 ); +memory_region_init_io (&h->data_mem,OBJECT (h), &pci_host_data_le_ops, s, +"pci-conf-data" ,4 );memory_region_add_subregion (&s->pci_io,0xcfc , &h->data_mem);memory_region_init_io (&h->mmcfg,OBJECT (s), &PPC_PCIIO_ops, s,"pciio" ,0x00400000 );
Signature · 1 line
1.7.10.4
Re: [Qemu-devel] [PATCH v4 6/7] raven: fix PCI bus accesses with size > 1
Quoted 1 line · Hervé Poussineau
Signed-off-by Hervé Poussineau <[email protected]>
Quoted 29 lines
--- hw/pci-host/prep.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)hw/pci-host/prep.c +4
-5@@ -223,12 +223,12 @@ static void raven_pcihost_realizefn(DeviceState *d, Error **errp)pci_bus_irqs (&s->pci_bus, prep_set_irq, prep_map_irq, s->irq,PCI_NUM_PINS ); -memory_region_init_io (&h->conf_mem,OBJECT (h), &pci_host_conf_be_ops, s, -"pci-conf-idx" ,1 ); +memory_region_init_io (&h->conf_mem,OBJECT (h), &pci_host_conf_le_ops, s, +"pci-conf-idx" ,4 );memory_region_add_subregion (&s->pci_io,0xcf8 , &h->conf_mem); -memory_region_init_io (&h->data_mem,OBJECT (h), &pci_host_data_be_ops, s, -"pci-conf-data" ,1 ); +memory_region_init_io (&h->data_mem,OBJECT (h), &pci_host_data_le_ops, s, +"pci-conf-data" ,4 );memory_region_add_subregion (&s->pci_io,0xcfc , &h->data_mem);memory_region_init_io (&h->mmcfg,OBJECT (s), &PPC_PCIIO_ops, s,"pciio" ,0x00400000 ); --1.7.10.4
Signature · 5 lines
Regards, Artyom Tarasenko linux/sparc and solaris/sparc under qemu blog: http://tyom.blogspot.com/search/label/qemu
PATCH v4 7/7 raven: use raven_ for all function prefixes
In reply to Hervé Poussineau--- hw/pci-host/prep.c | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-)
hw/pci-host/prep.c +21 -19
@@ -70,7 +70,7 @@ typedef struct PRePPCIState {#define BIOS_SIZE (1024 * 1024) -static inline uint32_t PPC_PCIIO_config (hwaddr addr) +static inline uint32_t raven_pci_io_config (hwaddr addr) {int i;
@@ -82,36 +82,36 @@ static inline uint32_t PPC_PCIIO_config(hwaddr addr)return (addr &0x7ff ) | (i <<11 ); } -static void ppc_pci_io_write (void *opaque,hwaddr addr, -uint64_t val,unsigned int size) +static void raven_pci_io_write (void *opaque,hwaddr addr, +uint64_t val,unsigned int size) {PREPPCIState *s = opaque;PCIHostState *phb =PCI_HOST_BRIDGE (s); -pci_data_write (phb->bus,PPC_PCIIO_config (addr), val, size); +pci_data_write (phb->bus,raven_pci_io_config (addr), val, size); } -static uint64_t ppc_pci_io_read (void *opaque,hwaddr addr, -unsigned int size) +static uint64_t raven_pci_io_read (void *opaque,hwaddr addr, +unsigned int size) {PREPPCIState *s = opaque;PCIHostState *phb =PCI_HOST_BRIDGE (s); -return pci_data_read (phb->bus,PPC_PCIIO_config (addr), size); +return pci_data_read (phb->bus,raven_pci_io_config (addr), size); } -static const MemoryRegionOps PPC_PCIIO_ops = { - .read = ppc_pci_io_read, - .write = ppc_pci_io_write, +static const MemoryRegionOps raven_pci_io_ops = { + .read = raven_pci_io_read, + .write = raven_pci_io_write, .endianness =DEVICE_LITTLE_ENDIAN , }; -static uint64_t ppc_intack_read (void *opaque,hwaddr addr, -unsigned int size) +static uint64_t raven_intack_read (void *opaque,hwaddr addr, +unsigned int size) {return pic_read_irq (isa_pic); } -static const MemoryRegionOps PPC_intack_ops = { - .read = ppc_intack_read, +static const MemoryRegionOps raven_intack_ops = { + .read = raven_intack_read, .valid = { .max_access_size =1 , },
@@ -182,12 +182,12 @@ static const MemoryRegionOps raven_io_ops = { .valid.unaligned = true, }; -static int prep_map_irq (PCIDevice *pci_dev,int irq_num) +static int raven_map_irq (PCIDevice *pci_dev,int irq_num) {return (irq_num + (pci_dev->devfn >>3 )) &1 ; } -static void prep_set_irq (void *opaque,int irq_num,int level) +static void raven_set_irq (void *opaque,int irq_num,int level) {qemu_irq *pic = opaque;
@@ -221,7 +221,8 @@ static void raven_pcihost_realizefn(DeviceState *d, Error **errp)qdev_init_gpio_in (d, raven_change_gpio,1 ); -pci_bus_irqs (&s->pci_bus, prep_set_irq, prep_map_irq, s->irq,PCI_NUM_PINS ); +pci_bus_irqs (&s->pci_bus, raven_set_irq, raven_map_irq, s->irq, +PCI_NUM_PINS );memory_region_init_io (&h->conf_mem,OBJECT (h), &pci_host_conf_le_ops, s,"pci-conf-idx" ,4 );
@@ -231,10 +232,11 @@ static void raven_pcihost_realizefn(DeviceState *d, Error **errp) "pci-conf-data", 4);memory_region_add_subregion (&s->pci_io,0xcfc , &h->data_mem); -memory_region_init_io (&h->mmcfg,OBJECT (s), &PPC_PCIIO_ops, s,"pciio" ,0x00400000 ); +memory_region_init_io (&h->mmcfg,OBJECT (s), &raven_pci_io_ops, s, +"pciio" ,0x00400000 );memory_region_add_subregion (address_space_mem,0x80800000 , &h->mmcfg); -memory_region_init_io (&s->pci_intack,OBJECT (s), &PPC_intack_ops, s, +memory_region_init_io (&s->pci_intack,OBJECT (s), &raven_intack_ops, s,"pci-intack" ,1 );memory_region_add_subregion (address_space_mem,0xbffffff0 , &s->pci_intack);
Signature · 1 line
1.7.10.4