Exemple #1
0
class CellX(Platform):
    type = 'CellX'
    cxx_header = "dev/cellx/cellx.hh"
    system = Param.System(Parent.any, "system")

    pciconfig = PciConfigAll()

    ich = PARDg5VICH()

    # Ports behind the pci config and data regsiters. These don't do anything,
    # but the linux kernel fiddles with them anway.
    behind_pci = IsaFake(pio_addr=x86IOAddress(0xcf8), pio_size=8)

    def attachIO(self, bus, dma_ports=[]):
        self.ich.attachIO(bus, dma_ports)
        self.behind_pci.pio = bus.master
        self.pciconfig.pio = bus.default
Exemple #2
0
class PARDg5VPlatform(Platform):
    type = 'PARDg5VPlatform'
    cxx_header = "hyper/dev/pardg5v/platform.hh"
    system = Param.System(Parent.any, "system")

    pciconfig = PciConfigAll()

    south_bridge = PARDg5VSouthBridge()

    # "Non-existant" port used for timing purposes by the linux kernel
    i_dont_exist = IsaFake(pio_addr=x86IOAddress(0x80), pio_size=1)

    # Ports behind the pci config and data regsiters. These don't do anything,
    # but the linux kernel fiddles with them anway.
    behind_pci = IsaFake(pio_addr=x86IOAddress(0xcf8), pio_size=8)

    # Serial port and terminal
    com_1 = Uart8250P5V()
    com_1.pio_addr = x86IOAddress(0x3f8)
    com_1.terminal = Terminal()

    # Serial port#2 and terminal
    com_2 = Uart8250P5V()
    com_2.pio_addr = x86IOAddress(0x2f8)
    com_2.terminal = Terminal()

    # Devices to catch access to non-existant serial ports.
    com_3 = Uart8250P5V(pio_addr=x86IOAddress(0x3e8), terminal=Terminal())
    com_4 = Uart8250P5V(pio_addr=x86IOAddress(0x2e8), terminal=Terminal())

    # A device to catch accesses to the non-existant floppy controller.
    fake_floppy = IsaFake(pio_addr=x86IOAddress(0x3f2), pio_size=2)

    def attachIO(self, bus, dma_ports=[]):
        self.south_bridge.attachIO(bus, dma_ports)
        self.i_dont_exist.pio = bus.master
        self.behind_pci.pio = bus.master
        self.com_1.pio = bus.master
        self.com_2.pio = bus.master
        self.com_3.pio = bus.master
        self.com_4.pio = bus.master
        self.fake_floppy.pio = bus.master
        self.pciconfig.pio = bus.default
        bus.use_default_range = True
Exemple #3
0
class Pc(Platform):
    type = 'Pc'
    system = Param.System(Parent.any, "system")

    pciconfig = PciConfigAll()

    south_bridge = SouthBridge()

    # "Non-existant" port used for timing purposes by the linux kernel
    i_dont_exist = IsaFake(pio_addr=x86IOAddress(0x80), pio_size=1)

    # Ports behind the pci config and data regsiters. These don't do anything,
    # but the linux kernel fiddles with them anway.
    behind_pci = IsaFake(pio_addr=x86IOAddress(0xcf8), pio_size=8)

    # Serial port and terminal
    terminal = Terminal()
    com_1 = Uart8250()
    com_1.pio_addr = x86IOAddress(0x3f8)
    com_1.terminal = terminal

    # Devices to catch access to non-existant serial ports.
    fake_com_2 = IsaFake(pio_addr=x86IOAddress(0x2f8), pio_size=8)
    fake_com_3 = IsaFake(pio_addr=x86IOAddress(0x3e8), pio_size=8)
    fake_com_4 = IsaFake(pio_addr=x86IOAddress(0x2e8), pio_size=8)

    # A device to catch accesses to the non-existant floppy controller.
    fake_floppy = IsaFake(pio_addr=x86IOAddress(0x3f2), pio_size=2)

    def attachIO(self, bus):
        self.south_bridge.attachIO(bus)
        self.i_dont_exist.pio = bus.port
        self.behind_pci.pio = bus.port
        self.com_1.pio = bus.port
        self.fake_com_2.pio = bus.port
        self.fake_com_3.pio = bus.port
        self.fake_com_4.pio = bus.port
        self.fake_floppy.pio = bus.port
        self.pciconfig.pio = bus.default
        bus.responder_set = True
        bus.responder = self.pciconfig
Exemple #4
0
class VExpress_EMM(RealView):
    _mem_regions = [(Addr('2GB'), Addr('2GB'))]
    pci_cfg_base = 0x30000000
    uart = Pl011(pio_addr=0x1c090000, int_num=37)
    realview_io = VExpressCoreTileCtrl(
        proc_id0=0x14000000, proc_id1=0x14000000,
        idreg=0x02250000, pio_addr=0x1C010000)
    gic = Pl390(dist_addr=0x2C001000, cpu_addr=0x2C002000)
    local_cpu_timer = CpuLocalTimer(int_num_timer=29, int_num_watchdog=30, pio_addr=0x2C080000)
    generic_timer = GenericTimer(int_phys=29, int_virt=27)
    timer0 = Sp804(int_num0=34, int_num1=34, pio_addr=0x1C110000, clock0='1MHz', clock1='1MHz')
    timer1 = Sp804(int_num0=35, int_num1=35, pio_addr=0x1C120000, clock0='1MHz', clock1='1MHz')
    clcd   = Pl111(pio_addr=0x1c1f0000, int_num=46)
    hdlcd  = HDLcd(pio_addr=0x2b000000, int_num=117)
    kmi0   = Pl050(pio_addr=0x1c060000, int_num=44)
    kmi1   = Pl050(pio_addr=0x1c070000, int_num=45, is_mouse=True)
    vgic   = VGic(vcpu_addr=0x2c006000, hv_addr=0x2c004000, ppint=25)
    cf_ctrl = IdeController(disks=[], pci_func=0, pci_dev=0, pci_bus=2,
                            io_shift = 2, ctrl_offset = 2, Command = 0x1,
                            BAR0 = 0x1C1A0000, BAR0Size = '256B',
                            BAR1 = 0x1C1A0100, BAR1Size = '4096B',
                            BAR0LegacyIO = True, BAR1LegacyIO = True)

    pciconfig = PciConfigAll(size='256MB')
    vram           = SimpleMemory(range = AddrRange(0x18000000, size='32MB'),
                                  conf_table_reported = False)
    rtc            = PL031(pio_addr=0x1C170000, int_num=36)

    l2x0_fake      = IsaFake(pio_addr=0x2C100000, pio_size=0xfff)
    uart1_fake     = AmbaFake(pio_addr=0x1C0A0000)
    uart2_fake     = AmbaFake(pio_addr=0x1C0B0000)
    uart3_fake     = AmbaFake(pio_addr=0x1C0C0000)
    sp810_fake     = AmbaFake(pio_addr=0x1C020000, ignore_access=True)
    watchdog_fake  = AmbaFake(pio_addr=0x1C0F0000)
    aaci_fake      = AmbaFake(pio_addr=0x1C040000)
    lan_fake       = IsaFake(pio_addr=0x1A000000, pio_size=0xffff)
    usb_fake       = IsaFake(pio_addr=0x1B000000, pio_size=0x1ffff)
    mmc_fake       = AmbaFake(pio_addr=0x1c050000)
    energy_ctrl    = EnergyCtrl(pio_addr=0x1c080000)

    # Attach any PCI devices that are supported
    def attachPciDevices(self):
        self.ethernet = IGbE_e1000(pci_bus=0, pci_dev=0, pci_func=0,
                                   InterruptLine=1, InterruptPin=1)
        self.ide = IdeController(disks = [], pci_bus=0, pci_dev=1, pci_func=0,
                                 InterruptLine=2, InterruptPin=2)

    def enableMSIX(self):
        self.gic = Pl390(dist_addr=0x2C001000, cpu_addr=0x2C002000, it_lines=512)
        self.gicv2m = Gicv2m()
        self.gicv2m.frames = [Gicv2mFrame(spi_base=256, spi_len=64, addr=0x2C1C0000)]

    def setupBootLoader(self, mem_bus, cur_sys, loc):
        self.nvmem = SimpleMemory(range = AddrRange('64MB'),
                                  conf_table_reported = False)
        self.nvmem.port = mem_bus.master
        cur_sys.boot_loader = loc('boot_emm.arm')
        cur_sys.atags_addr = 0x8000000
        cur_sys.load_addr_mask = 0xfffffff
        cur_sys.load_offset = 0x80000000

    # Attach I/O devices that are on chip and also set the appropriate
    # ranges for the bridge
    def attachOnChipIO(self, bus, bridge=None):
        self.gic.pio             = bus.master
        self.vgic.pio            = bus.master
        self.local_cpu_timer.pio = bus.master
        if hasattr(self, "gicv2m"):
            self.gicv2m.pio      = bus.master
        self.hdlcd.dma           = bus.slave
        if bridge:
            # Bridge ranges based on excluding what is part of on-chip I/O
            # (gic, a9scu)
            bridge.ranges = [AddrRange(0x2F000000, size='16MB'),
                             AddrRange(0x2B000000, size='4MB'),
                             AddrRange(0x30000000, size='256MB'),
                             AddrRange(0x40000000, size='512MB'),
                             AddrRange(0x18000000, size='64MB'),
                             AddrRange(0x1C000000, size='64MB')]


    # Set the clock domain for IO objects that are considered
    # to be "close" to the cores.
    def onChipIOClkDomain(self, clkdomain):
        self.gic.clk_domain             = clkdomain
        if hasattr(self, "gicv2m"):
            self.gicv2m.clk_domain      = clkdomain
        self.hdlcd.clk_domain           = clkdomain
        self.vgic.clk_domain            = clkdomain

    # Attach I/O devices to specified bus object.  Done here
    # as the specified bus to connect to may not always be fixed.
    def attachIO(self, bus):
       self.uart.pio            = bus.master
       self.realview_io.pio     = bus.master
       self.timer0.pio          = bus.master
       self.timer1.pio          = bus.master
       self.clcd.pio            = bus.master
       self.clcd.dma            = bus.slave
       self.hdlcd.pio           = bus.master
       self.kmi0.pio            = bus.master
       self.kmi1.pio            = bus.master
       self.cf_ctrl.pio         = bus.master
       self.cf_ctrl.dma         = bus.slave
       self.cf_ctrl.config      = bus.master
       self.rtc.pio             = bus.master
       bus.use_default_range    = True
       self.vram.port           = bus.master
       self.pciconfig.pio       = bus.default

       self.l2x0_fake.pio       = bus.master
       self.uart1_fake.pio      = bus.master
       self.uart2_fake.pio      = bus.master
       self.uart3_fake.pio      = bus.master
       self.sp810_fake.pio      = bus.master
       self.watchdog_fake.pio   = bus.master
       self.aaci_fake.pio       = bus.master
       self.lan_fake.pio        = bus.master
       self.usb_fake.pio        = bus.master
       self.mmc_fake.pio        = bus.master
       self.energy_ctrl.pio     = bus.master

       # Try to attach the I/O if it exists
       try:
           self.ide.pio         = bus.master
           self.ide.config      = bus.master
           self.ide.dma         = bus.slave
           self.ethernet.pio    = bus.master
           self.ethernet.config = bus.master
           self.ethernet.dma    = bus.slave
       except:
           pass

    # Set the clock domain for IO objects that are considered
    # to be "far" away from the cores.
    def offChipIOClkDomain(self, clkdomain):
        self.uart.clk_domain          = clkdomain
        self.realview_io.clk_domain   = clkdomain
        self.timer0.clk_domain        = clkdomain
        self.timer1.clk_domain        = clkdomain
        self.clcd.clk_domain          = clkdomain
        self.kmi0.clk_domain          = clkdomain
        self.kmi1.clk_domain          = clkdomain
        self.cf_ctrl.clk_domain       = clkdomain
        self.rtc.clk_domain           = clkdomain
        self.vram.clk_domain          = clkdomain
        self.pciconfig.clk_domain     = clkdomain

        self.l2x0_fake.clk_domain     = clkdomain
        self.uart1_fake.clk_domain    = clkdomain
        self.uart2_fake.clk_domain    = clkdomain
        self.uart3_fake.clk_domain    = clkdomain
        self.sp810_fake.clk_domain    = clkdomain
        self.watchdog_fake.clk_domain = clkdomain
        self.aaci_fake.clk_domain     = clkdomain
        self.lan_fake.clk_domain      = clkdomain
        self.usb_fake.clk_domain      = clkdomain
        self.mmc_fake.clk_domain      = clkdomain
        self.energy_ctrl.clk_domain   = clkdomain
Exemple #5
0
class VExpress_EMM(RealView):
    mem_start_addr = '2GB'
    max_mem_size = '2GB'
    pci_cfg_base = 0x30000000
    uart = Pl011(pio_addr=0x1c090000, int_num=37)
    realview_io = RealViewCtrl(proc_id0=0x14000000,
                               proc_id1=0x14000000,
                               pio_addr=0x1C010000)
    gic = Pl390(dist_addr=0x2C001000, cpu_addr=0x2C002000)
    local_cpu_timer = CpuLocalTimer(int_num_timer=29,
                                    int_num_watchdog=30,
                                    pio_addr=0x2C080000)
    generic_timer = GenericTimer(int_num=29)
    timer0 = Sp804(int_num0=34,
                   int_num1=34,
                   pio_addr=0x1C110000,
                   clock0='1MHz',
                   clock1='1MHz')
    timer1 = Sp804(int_num0=35,
                   int_num1=35,
                   pio_addr=0x1C120000,
                   clock0='1MHz',
                   clock1='1MHz')
    clcd = Pl111(pio_addr=0x1c1f0000, int_num=46)
    hdlcd = HDLcd(pio_addr=0x2b000000, int_num=117)
    kmi0 = Pl050(pio_addr=0x1c060000, int_num=44)
    kmi1 = Pl050(pio_addr=0x1c070000, int_num=45, is_mouse=True)
    vgic = VGic(vcpu_addr=0x2c006000, hv_addr=0x2c004000, ppint=25)
    cf_ctrl = IdeController(disks=[],
                            pci_func=0,
                            pci_dev=0,
                            pci_bus=2,
                            io_shift=2,
                            ctrl_offset=2,
                            Command=0x1,
                            BAR0=0x1C1A0000,
                            BAR0Size='256B',
                            BAR1=0x1C1A0100,
                            BAR1Size='4096B',
                            BAR0LegacyIO=True,
                            BAR1LegacyIO=True)

    pciconfig = PciConfigAll(size='256MB')
    ethernet = IGbE_e1000(pci_bus=0,
                          pci_dev=0,
                          pci_func=0,
                          InterruptLine=1,
                          InterruptPin=1)

    ide = IdeController(disks=[],
                        pci_bus=0,
                        pci_dev=1,
                        pci_func=0,
                        InterruptLine=2,
                        InterruptPin=2)

    vram = SimpleMemory(range=AddrRange(0x18000000, size='32MB'),
                        conf_table_reported=False)
    rtc = PL031(pio_addr=0x1C170000, int_num=36)

    l2x0_fake = IsaFake(pio_addr=0x2C100000, pio_size=0xfff)
    uart1_fake = AmbaFake(pio_addr=0x1C0A0000)
    uart2_fake = AmbaFake(pio_addr=0x1C0B0000)
    uart3_fake = AmbaFake(pio_addr=0x1C0C0000)
    sp810_fake = AmbaFake(pio_addr=0x1C020000, ignore_access=True)
    watchdog_fake = AmbaFake(pio_addr=0x1C0F0000)
    aaci_fake = AmbaFake(pio_addr=0x1C040000)
    lan_fake = IsaFake(pio_addr=0x1A000000, pio_size=0xffff)
    usb_fake = IsaFake(pio_addr=0x1B000000, pio_size=0x1ffff)
    mmc_fake = AmbaFake(pio_addr=0x1c050000)

    def setupBootLoader(self, mem_bus, cur_sys, loc):
        self.nvmem = SimpleMemory(range=AddrRange('64MB'),
                                  conf_table_reported=False)
        self.nvmem.port = mem_bus.master
        cur_sys.boot_loader = loc('boot_emm.arm')
        cur_sys.atags_addr = 0x8000000
        cur_sys.load_addr_mask = 0xfffffff
        cur_sys.load_offset = 0x80000000

    # Attach I/O devices that are on chip and also set the appropriate
    # ranges for the bridge
    def attachOnChipIO(self, bus, bridge):
        self.gic.pio = bus.master
        self.local_cpu_timer.pio = bus.master
        self.hdlcd.dma = bus.slave
        # Bridge ranges based on excluding what is part of on-chip I/O
        # (gic, a9scu)
        bridge.ranges = [
            AddrRange(0x2F000000, size='16MB'),
            AddrRange(0x2B000000, size='4MB'),
            AddrRange(0x30000000, size='256MB'),
            AddrRange(0x40000000, size='512MB'),
            AddrRange(0x18000000, size='64MB'),
            AddrRange(0x1C000000, size='64MB')
        ]
        self.vgic.pio = bus.master

    # Attach I/O devices to specified bus object.  Can't do this
    # earlier, since the bus object itself is typically defined at the
    # System level.
    def attachIO(self, bus):
        self.uart.pio = bus.master
        self.realview_io.pio = bus.master
        self.timer0.pio = bus.master
        self.timer1.pio = bus.master
        self.clcd.pio = bus.master
        self.clcd.dma = bus.slave
        self.hdlcd.pio = bus.master
        self.kmi0.pio = bus.master
        self.kmi1.pio = bus.master
        self.cf_ctrl.pio = bus.master
        self.cf_ctrl.dma = bus.slave
        self.cf_ctrl.config = bus.master
        self.rtc.pio = bus.master
        bus.use_default_range = True
        self.vram.port = bus.master
        self.ide.pio = bus.master
        self.ide.config = bus.master
        self.ide.dma = bus.slave
        self.ethernet.pio = bus.master
        self.ethernet.config = bus.master
        self.ethernet.dma = bus.slave
        self.pciconfig.pio = bus.default

        self.l2x0_fake.pio = bus.master
        self.uart1_fake.pio = bus.master
        self.uart2_fake.pio = bus.master
        self.uart3_fake.pio = bus.master
        self.sp810_fake.pio = bus.master
        self.watchdog_fake.pio = bus.master
        self.aaci_fake.pio = bus.master
        self.lan_fake.pio = bus.master
        self.usb_fake.pio = bus.master
        self.mmc_fake.pio = bus.master
Exemple #6
0
class Tsunami(Platform):
    type = 'Tsunami'
    system = Param.System(Parent.any, "system")

    cchip = TsunamiCChip(pio_addr=0x801a0000000)
    pchip = TsunamiPChip(pio_addr=0x80180000000)
    pciconfig = PciConfigAll()
    fake_sm_chip = IsaFake(pio_addr=0x801fc000370)

    fake_uart1 = IsaFake(pio_addr=0x801fc0002f8)
    fake_uart2 = IsaFake(pio_addr=0x801fc0003e8)
    fake_uart3 = IsaFake(pio_addr=0x801fc0002e8)
    fake_uart4 = IsaFake(pio_addr=0x801fc0003f0)

    fake_ppc = IsaFake(pio_addr=0x801fc0003bb)

    fake_OROM = IsaFake(pio_addr=0x800000a0000, pio_size=0x60000)

    fake_pnp_addr = IsaFake(pio_addr=0x801fc000279)
    fake_pnp_write = IsaFake(pio_addr=0x801fc000a79)
    fake_pnp_read0 = IsaFake(pio_addr=0x801fc000203)
    fake_pnp_read1 = IsaFake(pio_addr=0x801fc000243)
    fake_pnp_read2 = IsaFake(pio_addr=0x801fc000283)
    fake_pnp_read3 = IsaFake(pio_addr=0x801fc0002c3)
    fake_pnp_read4 = IsaFake(pio_addr=0x801fc000303)
    fake_pnp_read5 = IsaFake(pio_addr=0x801fc000343)
    fake_pnp_read6 = IsaFake(pio_addr=0x801fc000383)
    fake_pnp_read7 = IsaFake(pio_addr=0x801fc0003c3)

    fake_ata0 = IsaFake(pio_addr=0x801fc0001f0)
    fake_ata1 = IsaFake(pio_addr=0x801fc000170)

    fb = BadDevice(pio_addr=0x801fc0003d0, devicename='FrameBuffer')
    io = TsunamiIO(pio_addr=0x801fc000000)
    uart = Uart8250(pio_addr=0x801fc0003f8)
    backdoor = AlphaBackdoor(pio_addr=0x80200000000, disk=Parent.simple_disk)

    # Attach I/O devices to specified bus object.  Can't do this
    # earlier, since the bus object itself is typically defined at the
    # System level.
    def attachIO(self, bus):
        self.cchip.pio = bus.master
        self.pchip.pio = bus.master
        self.pciconfig.pio = bus.default
        bus.use_default_range = True
        self.fake_sm_chip.pio = bus.master
        self.fake_uart1.pio = bus.master
        self.fake_uart2.pio = bus.master
        self.fake_uart3.pio = bus.master
        self.fake_uart4.pio = bus.master
        self.fake_ppc.pio = bus.master
        self.fake_OROM.pio = bus.master
        self.fake_pnp_addr.pio = bus.master
        self.fake_pnp_write.pio = bus.master
        self.fake_pnp_read0.pio = bus.master
        self.fake_pnp_read1.pio = bus.master
        self.fake_pnp_read2.pio = bus.master
        self.fake_pnp_read3.pio = bus.master
        self.fake_pnp_read4.pio = bus.master
        self.fake_pnp_read5.pio = bus.master
        self.fake_pnp_read6.pio = bus.master
        self.fake_pnp_read7.pio = bus.master
        self.fake_ata0.pio = bus.master
        self.fake_ata1.pio = bus.master
        self.fb.pio = bus.master
        self.io.pio = bus.master
        self.uart.pio = bus.master
        self.backdoor.pio = bus.master
Exemple #7
0
class VExpress_ELT(RealView):
    max_mem_size = '2GB'
    pci_cfg_base = 0xD0000000
    uart0 = Pl011(pio_addr=0xE0009000, int_num=42)
    uart1 = Pl011(pio_addr=0xE000A000, int_num=43)
    uart = Pl011(pio_addr=0xFF009000, int_num=121)
    realview_io = RealViewCtrl(proc_id0=0x0C000222, pio_addr=0xFF000000)
    gic = Gic(dist_addr=0xE0201000, cpu_addr=0xE0200100)
    local_cpu_timer = CpuLocalTimer(int_num_timer=29, int_num_watchdog=30, pio_addr=0xE0200600)
    v2m_timer0 = Sp804(int_num0=120, int_num1=120, pio_addr=0xFF011000)
    v2m_timer1 = Sp804(int_num0=121, int_num1=121, pio_addr=0xFF012000)
    elba_timer0 = Sp804(int_num0=36, int_num1=36, pio_addr=0xE0011000, clock0='50MHz', clock1='50MHz')
    elba_timer1 = Sp804(int_num0=37, int_num1=37, pio_addr=0xE0012000, clock0='50MHz', clock1='50MHz')
    clcd   = Pl111(pio_addr=0xE0022000, int_num=46)   # CLCD interrupt no. unknown
    kmi0   = Pl050(pio_addr=0xFF006000, int_num=124)
    kmi1   = Pl050(pio_addr=0xFF007000, int_num=125)
    elba_kmi0   = Pl050(pio_addr=0xE0006000, int_num=52)
    elba_kmi1   = Pl050(pio_addr=0xE0007000, int_num=53)
    a9scu  = A9SCU(pio_addr=0xE0200000)
    cf_ctrl = IdeController(disks=[], pci_func=0, pci_dev=0, pci_bus=2,
                            io_shift = 2, ctrl_offset = 2, Command = 0x1,
                            BAR0 = 0xFF01A000, BAR0Size = '256B',
                            BAR1 = 0xFF01A100, BAR1Size = '4096B',
                            BAR0LegacyIO = True, BAR1LegacyIO = True)

    pciconfig = PciConfigAll()
    ethernet = IGbE_e1000(pci_bus=0, pci_dev=0, pci_func=0,
                          InterruptLine=1, InterruptPin=1)

    ide = IdeController(disks = [], pci_bus=0, pci_dev=1, pci_func=0,
                        InterruptLine=2, InterruptPin=2)

    l2x0_fake      = IsaFake(pio_addr=0xE0202000, pio_size=0xfff)
    dmac_fake      = AmbaFake(pio_addr=0xE0020000)
    uart2_fake     = AmbaFake(pio_addr=0xE000B000)
    uart3_fake     = AmbaFake(pio_addr=0xE000C000)
    smc_fake       = AmbaFake(pio_addr=0xEC000000)
    sp810_fake     = AmbaFake(pio_addr=0xFF001000, ignore_access=True)
    watchdog_fake  = AmbaFake(pio_addr=0xE0010000)
    aaci_fake      = AmbaFake(pio_addr=0xFF004000)
    elba_aaci_fake = AmbaFake(pio_addr=0xE0004000)
    mmc_fake       = AmbaFake(pio_addr=0xE0005000) # not sure if we need this
    rtc_fake       = AmbaFake(pio_addr=0xE0017000, amba_id=0x41031)
    spsc_fake      = IsaFake(pio_addr=0xE001B000, pio_size=0x2000)
    lan_fake       = IsaFake(pio_addr=0xFA000000, pio_size=0xffff)
    usb_fake       = IsaFake(pio_addr=0xFB000000, pio_size=0x1ffff)


    # Attach I/O devices that are on chip and also set the appropriate
    # ranges for the bridge
    def attachOnChipIO(self, bus, bridge):
       self.gic.pio = bus.master
       self.a9scu.pio = bus.master
       self.local_cpu_timer.pio = bus.master
       # Bridge ranges based on excluding what is part of on-chip I/O
       # (gic, a9scu)
       bridge.ranges = [AddrRange(self.pci_cfg_base, self.a9scu.pio_addr - 1),
                        AddrRange(self.l2x0_fake.pio_addr, Addr.max)]

    # Attach I/O devices to specified bus object.  Can't do this
    # earlier, since the bus object itself is typically defined at the
    # System level.
    def attachIO(self, bus):
       self.uart0.pio     		= bus.master
       self.uart1.pio     		= bus.master
       self.uart.pio            = bus.master
       self.realview_io.pio     = bus.master
       self.v2m_timer0.pio      = bus.master
       self.v2m_timer1.pio      = bus.master
       self.elba_timer0.pio     = bus.master
       self.elba_timer1.pio     = bus.master
       self.clcd.pio            = bus.master
       self.clcd.dma            = bus.slave
       self.kmi0.pio            = bus.master
       self.kmi1.pio            = bus.master
       self.elba_kmi0.pio       = bus.master
       self.elba_kmi1.pio       = bus.master
       self.cf_ctrl.pio         = bus.master
       self.cf_ctrl.config      = bus.master
       self.cf_ctrl.dma         = bus.slave
       self.ide.pio             = bus.master
       self.ide.config          = bus.master
       self.ide.dma             = bus.slave
       self.ethernet.pio        = bus.master
       self.ethernet.config     = bus.master
       self.ethernet.dma        = bus.slave
       self.pciconfig.pio       = bus.default
       bus.use_default_range    = True

       self.l2x0_fake.pio       = bus.master
       self.dmac_fake.pio       = bus.master
       self.uart2_fake.pio      = bus.master
       self.uart3_fake.pio      = bus.master
       self.smc_fake.pio        = bus.master
       self.sp810_fake.pio      = bus.master
       self.watchdog_fake.pio   = bus.master
       self.aaci_fake.pio       = bus.master
       self.elba_aaci_fake.pio  = bus.master
       self.mmc_fake.pio        = bus.master
       self.rtc_fake.pio        = bus.master
       self.spsc_fake.pio       = bus.master
       self.lan_fake.pio        = bus.master
       self.usb_fake.pio        = bus.master