exporting patch: # HG changeset patch # User Jiuyue Ma # Date 1405566012 -28800 # Node ID 012ebfae960eab90a60f76d6aecc218d67cc79b3 # Parent c625a3c51bac050879457e666dd83299a36d761b config, x86: swap bus_id of ISA/PCI in X86 IntelMPTable This patch assign bus_id=0 to PCI bus and bus_id=1 to ISA bus for X86 platform. Because PCI device get config space address using Pc::calcPciConfigAddr() which requires "assert(bus==0)". This fixes PCI interrupt routing and discovery on Linux. diff -r c625a3c51bac -r 012ebfae960e configs/common/FSConfig.py --- a/configs/common/FSConfig.py Wed Jul 09 09:28:15 2014 -0400 +++ b/configs/common/FSConfig.py Thu Jul 17 11:00:12 2014 +0800 @@ -444,18 +444,21 @@ address = 0xfec00000) self.pc.south_bridge.io_apic.apic_id = io_apic.id base_entries.append(io_apic) - isa_bus = X86IntelMPBus(bus_id = 0, bus_type='ISA') + # In gem5 Pc::calcPciConfigAddr(), it required "assert(bus==0)", + # but linux kernel cannot config PCI device if it was not connected to PCI bus, + # so we fix PCI bus id to 0, and ISA bus id to 1. + pci_bus = X86IntelMPBus(bus_id = 0, bus_type='PCI') + base_entries.append(pci_bus) + isa_bus = X86IntelMPBus(bus_id = 1, bus_type='ISA') base_entries.append(isa_bus) - pci_bus = X86IntelMPBus(bus_id = 1, bus_type='PCI') - base_entries.append(pci_bus) - connect_busses = X86IntelMPBusHierarchy(bus_id=0, - subtractive_decode=True, parent_bus=1) + connect_busses = X86IntelMPBusHierarchy(bus_id=1, + subtractive_decode=True, parent_bus=0) ext_entries.append(connect_busses) pci_dev4_inta = X86IntelMPIOIntAssignment( interrupt_type = 'INT', polarity = 'ConformPolarity', trigger = 'ConformTrigger', - source_bus_id = 1, + source_bus_id = 0, source_bus_irq = 0 + (4 << 2), dest_io_apic_id = io_apic.id, dest_io_apic_intin = 16) @@ -465,7 +468,7 @@ interrupt_type = 'ExtInt', polarity = 'ConformPolarity', trigger = 'ConformTrigger', - source_bus_id = 0, + source_bus_id = 1, source_bus_irq = irq, dest_io_apic_id = io_apic.id, dest_io_apic_intin = 0) @@ -474,7 +477,7 @@ interrupt_type = 'INT', polarity = 'ConformPolarity', trigger = 'ConformTrigger', - source_bus_id = 0, + source_bus_id = 1, source_bus_irq = irq, dest_io_apic_id = io_apic.id, dest_io_apic_intin = apicPin)