hw/alpha: Set minimum PCI device ID to 1 to match Clipper IRQ mappings

Since we are emulating a Clipper device topology, we need to set the
minimum PCI device ID to 1, as there is no IRQ mapping for a device
at ID 0 (see sys_dp264.c:clipper_map_irq()).

- Add a 'devfn_min' argument to typhoon_init().  Pass that argument
  along to pci_register_root_bus().
- In clipper_init(), pass PCI_DEVFN(1, 0) as the minimum PCI device
  ID/function.

Signed-off-by: Jason Thorpe <thorpej@me.com>
Message-Id: <20210613211549.18094-3-thorpej@me.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Jason Thorpe 2021-06-13 14:15:47 -07:00 committed by Richard Henderson
parent 687f9f7834
commit 3a8233dc1f
3 changed files with 9 additions and 5 deletions

View File

@ -11,7 +11,7 @@
PCIBus *typhoon_init(MemoryRegion *, ISABus **, qemu_irq *, AlphaCPU *[4], PCIBus *typhoon_init(MemoryRegion *, ISABus **, qemu_irq *, AlphaCPU *[4],
pci_map_irq_fn); pci_map_irq_fn, uint8_t devfn_min);
/* alpha_pci.c. */ /* alpha_pci.c. */
extern const MemoryRegionOps alpha_pci_ignore_ops; extern const MemoryRegionOps alpha_pci_ignore_ops;

View File

@ -76,9 +76,12 @@ static void clipper_init(MachineState *machine)
cpus[0]->env.trap_arg1 = 0; cpus[0]->env.trap_arg1 = 0;
cpus[0]->env.trap_arg2 = smp_cpus; cpus[0]->env.trap_arg2 = smp_cpus;
/* Init the chipset. */ /*
* Init the chipset. Because we're using CLIPPER IRQ mappings,
* the minimum PCI device IdSel is 1.
*/
pci_bus = typhoon_init(machine->ram, &isa_bus, &rtc_irq, cpus, pci_bus = typhoon_init(machine->ram, &isa_bus, &rtc_irq, cpus,
clipper_pci_map_irq); clipper_pci_map_irq, PCI_DEVFN(1, 0));
/* Since we have an SRM-compatible PALcode, use the SRM epoch. */ /* Since we have an SRM-compatible PALcode, use the SRM epoch. */
mc146818_rtc_init(isa_bus, 1900, rtc_irq); mc146818_rtc_init(isa_bus, 1900, rtc_irq);

View File

@ -815,7 +815,8 @@ static void typhoon_alarm_timer(void *opaque)
} }
PCIBus *typhoon_init(MemoryRegion *ram, ISABus **isa_bus, qemu_irq *p_rtc_irq, PCIBus *typhoon_init(MemoryRegion *ram, ISABus **isa_bus, qemu_irq *p_rtc_irq,
AlphaCPU *cpus[4], pci_map_irq_fn sys_map_irq) AlphaCPU *cpus[4], pci_map_irq_fn sys_map_irq,
uint8_t devfn_min)
{ {
MemoryRegion *addr_space = get_system_memory(); MemoryRegion *addr_space = get_system_memory();
DeviceState *dev; DeviceState *dev;
@ -885,7 +886,7 @@ PCIBus *typhoon_init(MemoryRegion *ram, ISABus **isa_bus, qemu_irq *p_rtc_irq,
b = pci_register_root_bus(dev, "pci", b = pci_register_root_bus(dev, "pci",
typhoon_set_irq, sys_map_irq, s, typhoon_set_irq, sys_map_irq, s,
&s->pchip.reg_mem, &s->pchip.reg_io, &s->pchip.reg_mem, &s->pchip.reg_io,
0, 64, TYPE_PCI_BUS); devfn_min, 64, TYPE_PCI_BUS);
phb->bus = b; phb->bus = b;
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);