RealView.py revision 13805
113481Sgiacomo.travaglini@arm.com# Copyright (c) 2009-2018 ARM Limited 213481Sgiacomo.travaglini@arm.com# All rights reserved. 313481Sgiacomo.travaglini@arm.com# 413481Sgiacomo.travaglini@arm.com# The license below extends only to copyright in the software and shall 513481Sgiacomo.travaglini@arm.com# not be construed as granting a license to any other intellectual 613481Sgiacomo.travaglini@arm.com# property including but not limited to intellectual property relating 713481Sgiacomo.travaglini@arm.com# to a hardware implementation of the functionality of the software 813481Sgiacomo.travaglini@arm.com# licensed hereunder. You may use the software subject to the license 913481Sgiacomo.travaglini@arm.com# terms below provided that you ensure that this notice is replicated 1013481Sgiacomo.travaglini@arm.com# unmodified and in its entirety in all distributions of the software, 1113481Sgiacomo.travaglini@arm.com# modified or unmodified, in source code or in binary form. 1213481Sgiacomo.travaglini@arm.com# 1313481Sgiacomo.travaglini@arm.com# Copyright (c) 2006-2007 The Regents of The University of Michigan 1413481Sgiacomo.travaglini@arm.com# All rights reserved. 1513481Sgiacomo.travaglini@arm.com# 1613481Sgiacomo.travaglini@arm.com# Redistribution and use in source and binary forms, with or without 1713481Sgiacomo.travaglini@arm.com# modification, are permitted provided that the following conditions are 1813481Sgiacomo.travaglini@arm.com# met: redistributions of source code must retain the above copyright 1913481Sgiacomo.travaglini@arm.com# notice, this list of conditions and the following disclaimer; 2013481Sgiacomo.travaglini@arm.com# redistributions in binary form must reproduce the above copyright 2113481Sgiacomo.travaglini@arm.com# notice, this list of conditions and the following disclaimer in the 2213481Sgiacomo.travaglini@arm.com# documentation and/or other materials provided with the distribution; 2313481Sgiacomo.travaglini@arm.com# neither the name of the copyright holders nor the names of its 2413481Sgiacomo.travaglini@arm.com# contributors may be used to endorse or promote products derived from 2513481Sgiacomo.travaglini@arm.com# this software without specific prior written permission. 2613481Sgiacomo.travaglini@arm.com# 2713481Sgiacomo.travaglini@arm.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2813481Sgiacomo.travaglini@arm.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2913481Sgiacomo.travaglini@arm.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 3013481Sgiacomo.travaglini@arm.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3113481Sgiacomo.travaglini@arm.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3213481Sgiacomo.travaglini@arm.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3313481Sgiacomo.travaglini@arm.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3413481Sgiacomo.travaglini@arm.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3513481Sgiacomo.travaglini@arm.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3613481Sgiacomo.travaglini@arm.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3713481Sgiacomo.travaglini@arm.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3813481Sgiacomo.travaglini@arm.com# 3913481Sgiacomo.travaglini@arm.com# Authors: Ali Saidi 4013481Sgiacomo.travaglini@arm.com# Gabe Black 4113481Sgiacomo.travaglini@arm.com# William Wang 4213481Sgiacomo.travaglini@arm.com# Glenn Bergmans 4313481Sgiacomo.travaglini@arm.com 4413481Sgiacomo.travaglini@arm.comfrom m5.defines import buildEnv 4513481Sgiacomo.travaglini@arm.comfrom m5.params import * 4613481Sgiacomo.travaglini@arm.comfrom m5.proxy import * 4713481Sgiacomo.travaglini@arm.comfrom m5.util.fdthelper import * 4813481Sgiacomo.travaglini@arm.comfrom m5.objects.ClockDomain import ClockDomain 4913481Sgiacomo.travaglini@arm.comfrom m5.objects.VoltageDomain import VoltageDomain 5013481Sgiacomo.travaglini@arm.comfrom m5.objects.Device import \ 5113481Sgiacomo.travaglini@arm.com BasicPioDevice, PioDevice, IsaFake, BadAddr, DmaDevice 5213481Sgiacomo.travaglini@arm.comfrom m5.objects.PciHost import * 5313481Sgiacomo.travaglini@arm.comfrom m5.objects.Ethernet import NSGigE, IGbE_igb, IGbE_e1000 5413481Sgiacomo.travaglini@arm.comfrom m5.objects.Ide import * 5513481Sgiacomo.travaglini@arm.comfrom m5.objects.Platform import Platform 5613481Sgiacomo.travaglini@arm.comfrom m5.objects.Terminal import Terminal 5713481Sgiacomo.travaglini@arm.comfrom m5.objects.Uart import Uart 5813481Sgiacomo.travaglini@arm.comfrom m5.objects.SimpleMemory import SimpleMemory 5913481Sgiacomo.travaglini@arm.comfrom m5.objects.Gic import * 6013481Sgiacomo.travaglini@arm.comfrom m5.objects.EnergyCtrl import EnergyCtrl 6113481Sgiacomo.travaglini@arm.comfrom m5.objects.ClockedObject import ClockedObject 6213481Sgiacomo.travaglini@arm.comfrom m5.objects.ClockDomain import SrcClockDomain 6313481Sgiacomo.travaglini@arm.comfrom m5.objects.SubSystem import SubSystem 6413481Sgiacomo.travaglini@arm.comfrom m5.objects.Graphics import ImageFormat 6513481Sgiacomo.travaglini@arm.comfrom m5.objects.ClockedObject import ClockedObject 6613481Sgiacomo.travaglini@arm.comfrom m5.objects.PS2 import * 6713481Sgiacomo.travaglini@arm.comfrom m5.objects.VirtIOMMIO import MmioVirtIO 6813481Sgiacomo.travaglini@arm.com 6913481Sgiacomo.travaglini@arm.com# Platforms with KVM support should generally use in-kernel GIC 7013481Sgiacomo.travaglini@arm.com# emulation. Use a GIC model that automatically switches between 7113481Sgiacomo.travaglini@arm.com# gem5's GIC model and KVM's GIC model if KVM is available. 7213481Sgiacomo.travaglini@arm.comtry: 7313481Sgiacomo.travaglini@arm.com from m5.objects.KvmGic import MuxingKvmGic 7413481Sgiacomo.travaglini@arm.com kvm_gicv2_class = MuxingKvmGic 7513481Sgiacomo.travaglini@arm.comexcept ImportError: 7613481Sgiacomo.travaglini@arm.com # KVM support wasn't compiled into gem5. Fallback to a 7713481Sgiacomo.travaglini@arm.com # software-only GIC. 7813481Sgiacomo.travaglini@arm.com kvm_gicv2_class = Gic400 7913481Sgiacomo.travaglini@arm.com pass 8013481Sgiacomo.travaglini@arm.com 8113481Sgiacomo.travaglini@arm.comclass AmbaPioDevice(BasicPioDevice): 8213481Sgiacomo.travaglini@arm.com type = 'AmbaPioDevice' 8313481Sgiacomo.travaglini@arm.com abstract = True 8413481Sgiacomo.travaglini@arm.com cxx_header = "dev/arm/amba_device.hh" 8513481Sgiacomo.travaglini@arm.com amba_id = Param.UInt32("ID of AMBA device for kernel detection") 8613481Sgiacomo.travaglini@arm.com 8713481Sgiacomo.travaglini@arm.comclass AmbaIntDevice(AmbaPioDevice): 8813481Sgiacomo.travaglini@arm.com type = 'AmbaIntDevice' 8913481Sgiacomo.travaglini@arm.com abstract = True 9013481Sgiacomo.travaglini@arm.com cxx_header = "dev/arm/amba_device.hh" 9113481Sgiacomo.travaglini@arm.com gic = Param.BaseGic(Parent.any, "Gic to use for interrupting") 9213481Sgiacomo.travaglini@arm.com int_num = Param.UInt32("Interrupt number that connects to GIC") 9313481Sgiacomo.travaglini@arm.com int_delay = Param.Latency("100ns", 9413481Sgiacomo.travaglini@arm.com "Time between action and interrupt generation by device") 9513481Sgiacomo.travaglini@arm.com 9613481Sgiacomo.travaglini@arm.comclass AmbaDmaDevice(DmaDevice): 9713481Sgiacomo.travaglini@arm.com type = 'AmbaDmaDevice' 9813481Sgiacomo.travaglini@arm.com abstract = True 9913481Sgiacomo.travaglini@arm.com cxx_header = "dev/arm/amba_device.hh" 10013481Sgiacomo.travaglini@arm.com pio_addr = Param.Addr("Address for AMBA slave interface") 10113481Sgiacomo.travaglini@arm.com pio_latency = Param.Latency("10ns", "Time between action and write/read result by AMBA DMA Device") 10213481Sgiacomo.travaglini@arm.com gic = Param.BaseGic(Parent.any, "Gic to use for interrupting") 10313481Sgiacomo.travaglini@arm.com int_num = Param.UInt32("Interrupt number that connects to GIC") 10413481Sgiacomo.travaglini@arm.com amba_id = Param.UInt32("ID of AMBA device for kernel detection") 10513481Sgiacomo.travaglini@arm.com 10613481Sgiacomo.travaglini@arm.comclass A9SCU(BasicPioDevice): 10713481Sgiacomo.travaglini@arm.com type = 'A9SCU' 10813481Sgiacomo.travaglini@arm.com cxx_header = "dev/arm/a9scu.hh" 10913481Sgiacomo.travaglini@arm.com 11013481Sgiacomo.travaglini@arm.comclass ArmPciIntRouting(Enum): vals = [ 11113481Sgiacomo.travaglini@arm.com 'ARM_PCI_INT_STATIC', 11213481Sgiacomo.travaglini@arm.com 'ARM_PCI_INT_DEV', 11313481Sgiacomo.travaglini@arm.com 'ARM_PCI_INT_PIN', 11413481Sgiacomo.travaglini@arm.com ] 11513481Sgiacomo.travaglini@arm.com 11613481Sgiacomo.travaglini@arm.comclass GenericArmPciHost(GenericPciHost): 11713481Sgiacomo.travaglini@arm.com type = 'GenericArmPciHost' 11813481Sgiacomo.travaglini@arm.com cxx_header = "dev/arm/pci_host.hh" 11913481Sgiacomo.travaglini@arm.com 12013481Sgiacomo.travaglini@arm.com int_policy = Param.ArmPciIntRouting("PCI interrupt routing policy") 12113481Sgiacomo.travaglini@arm.com int_base = Param.Unsigned("PCI interrupt base") 12213481Sgiacomo.travaglini@arm.com int_count = Param.Unsigned("Maximum number of interrupts used by this host") 12313481Sgiacomo.travaglini@arm.com 12413481Sgiacomo.travaglini@arm.com # This python parameter can be used in configuration scripts to turn 12513481Sgiacomo.travaglini@arm.com # on/off the fdt dma-coherent flag when doing dtb autogeneration 12613481Sgiacomo.travaglini@arm.com _dma_coherent = True 12713481Sgiacomo.travaglini@arm.com 12813481Sgiacomo.travaglini@arm.com def generateDeviceTree(self, state): 12913481Sgiacomo.travaglini@arm.com local_state = FdtState(addr_cells=3, size_cells=2, cpu_cells=1) 13013481Sgiacomo.travaglini@arm.com intterrupt_cells = 1 13113481Sgiacomo.travaglini@arm.com 13213481Sgiacomo.travaglini@arm.com node = FdtNode("pci") 13313481Sgiacomo.travaglini@arm.com 13413481Sgiacomo.travaglini@arm.com if int(self.conf_device_bits) == 8: 13513481Sgiacomo.travaglini@arm.com node.appendCompatible("pci-host-cam-generic") 13613481Sgiacomo.travaglini@arm.com elif int(self.conf_device_bits) == 12: 13713481Sgiacomo.travaglini@arm.com node.appendCompatible("pci-host-ecam-generic") 13813481Sgiacomo.travaglini@arm.com else: 13913481Sgiacomo.travaglini@arm.com m5.fatal("No compatibility string for the set conf_device_width") 14013481Sgiacomo.travaglini@arm.com 14113481Sgiacomo.travaglini@arm.com node.append(FdtPropertyStrings("device_type", ["pci"])) 14213481Sgiacomo.travaglini@arm.com 14313481Sgiacomo.travaglini@arm.com # Cell sizes of child nodes/peripherals 14413481Sgiacomo.travaglini@arm.com node.append(local_state.addrCellsProperty()) 14513481Sgiacomo.travaglini@arm.com node.append(local_state.sizeCellsProperty()) 14613481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("#interrupt-cells", intterrupt_cells)) 14713481Sgiacomo.travaglini@arm.com # PCI address for CPU 14813481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("reg", 14913481Sgiacomo.travaglini@arm.com state.addrCells(self.conf_base) + 15013481Sgiacomo.travaglini@arm.com state.sizeCells(self.conf_size) )) 15113481Sgiacomo.travaglini@arm.com 15213481Sgiacomo.travaglini@arm.com # Ranges mapping 15313481Sgiacomo.travaglini@arm.com # For now some of this is hard coded, because the PCI module does not 15413481Sgiacomo.travaglini@arm.com # have a proper full understanding of the memory map, but adapting the 15513481Sgiacomo.travaglini@arm.com # PCI module is beyond the scope of what I'm trying to do here. 15613481Sgiacomo.travaglini@arm.com # Values are taken from the VExpress_GEM5_V1 platform. 15713481Sgiacomo.travaglini@arm.com ranges = [] 15813481Sgiacomo.travaglini@arm.com # Pio address range 15913481Sgiacomo.travaglini@arm.com ranges += self.pciFdtAddr(space=1, addr=0) 16013481Sgiacomo.travaglini@arm.com ranges += state.addrCells(self.pci_pio_base) 16113481Sgiacomo.travaglini@arm.com ranges += local_state.sizeCells(0x10000) # Fixed size 16213481Sgiacomo.travaglini@arm.com 16313481Sgiacomo.travaglini@arm.com # AXI memory address range 16413481Sgiacomo.travaglini@arm.com ranges += self.pciFdtAddr(space=2, addr=0) 16513481Sgiacomo.travaglini@arm.com ranges += state.addrCells(0x40000000) # Fixed offset 16613481Sgiacomo.travaglini@arm.com ranges += local_state.sizeCells(0x40000000) # Fixed size 16713481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("ranges", ranges)) 16813481Sgiacomo.travaglini@arm.com 16913481Sgiacomo.travaglini@arm.com if str(self.int_policy) == 'ARM_PCI_INT_DEV': 17013481Sgiacomo.travaglini@arm.com int_phandle = state.phandle(self._parent.unproxy(self).gic) 17113481Sgiacomo.travaglini@arm.com # Interrupt mapping 17213481Sgiacomo.travaglini@arm.com interrupts = [] 17313481Sgiacomo.travaglini@arm.com for i in range(int(self.int_count)): 17413481Sgiacomo.travaglini@arm.com interrupts += self.pciFdtAddr(device=i, addr=0) + \ 17513481Sgiacomo.travaglini@arm.com [0x0, int_phandle, 0, int(self.int_base) - 32 + i, 1] 17613481Sgiacomo.travaglini@arm.com 17713481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("interrupt-map", interrupts)) 17813481Sgiacomo.travaglini@arm.com 17913481Sgiacomo.travaglini@arm.com int_count = int(self.int_count) 18013481Sgiacomo.travaglini@arm.com if int_count & (int_count - 1): 18113481Sgiacomo.travaglini@arm.com fatal("PCI interrupt count should be power of 2") 18213481Sgiacomo.travaglini@arm.com 18313481Sgiacomo.travaglini@arm.com intmask = self.pciFdtAddr(device=int_count - 1, addr=0) + [0x0] 18413481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("interrupt-map-mask", intmask)) 18513481Sgiacomo.travaglini@arm.com else: 18613481Sgiacomo.travaglini@arm.com m5.fatal("Unsupported PCI interrupt policy " + 18713481Sgiacomo.travaglini@arm.com "for Device Tree generation") 18813481Sgiacomo.travaglini@arm.com 18913481Sgiacomo.travaglini@arm.com if self._dma_coherent: 19013481Sgiacomo.travaglini@arm.com node.append(FdtProperty("dma-coherent")) 19113481Sgiacomo.travaglini@arm.com 19213481Sgiacomo.travaglini@arm.com yield node 19313481Sgiacomo.travaglini@arm.com 19413481Sgiacomo.travaglini@arm.comclass RealViewCtrl(BasicPioDevice): 19513481Sgiacomo.travaglini@arm.com type = 'RealViewCtrl' 19613481Sgiacomo.travaglini@arm.com cxx_header = "dev/arm/rv_ctrl.hh" 19713481Sgiacomo.travaglini@arm.com proc_id0 = Param.UInt32(0x0C000000, "Processor ID, SYS_PROCID") 19813481Sgiacomo.travaglini@arm.com proc_id1 = Param.UInt32(0x0C000222, "Processor ID, SYS_PROCID1") 19913481Sgiacomo.travaglini@arm.com idreg = Param.UInt32(0x00000000, "ID Register, SYS_ID") 20013481Sgiacomo.travaglini@arm.com 20113481Sgiacomo.travaglini@arm.com def generateDeviceTree(self, state): 20213481Sgiacomo.travaglini@arm.com node = FdtNode("sysreg@%x" % long(self.pio_addr)) 20313481Sgiacomo.travaglini@arm.com node.appendCompatible("arm,vexpress-sysreg") 20413481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("reg", 20513481Sgiacomo.travaglini@arm.com state.addrCells(self.pio_addr) + 20613481Sgiacomo.travaglini@arm.com state.sizeCells(0x1000) )) 20713481Sgiacomo.travaglini@arm.com node.append(FdtProperty("gpio-controller")) 20813481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("#gpio-cells", [2])) 20913481Sgiacomo.travaglini@arm.com node.appendPhandle(self) 21013481Sgiacomo.travaglini@arm.com 21113481Sgiacomo.travaglini@arm.com yield node 21213481Sgiacomo.travaglini@arm.com 21313481Sgiacomo.travaglini@arm.comclass RealViewOsc(ClockDomain): 21413481Sgiacomo.travaglini@arm.com type = 'RealViewOsc' 21513481Sgiacomo.travaglini@arm.com cxx_header = "dev/arm/rv_ctrl.hh" 21613481Sgiacomo.travaglini@arm.com 21713481Sgiacomo.travaglini@arm.com parent = Param.RealViewCtrl(Parent.any, "RealView controller") 21813481Sgiacomo.travaglini@arm.com 21913481Sgiacomo.travaglini@arm.com # TODO: We currently don't have the notion of a clock source, 22013481Sgiacomo.travaglini@arm.com # which means we have to associate oscillators with a voltage 22113481Sgiacomo.travaglini@arm.com # source. 22213481Sgiacomo.travaglini@arm.com voltage_domain = Param.VoltageDomain(Parent.voltage_domain, 22313481Sgiacomo.travaglini@arm.com "Voltage domain") 22413481Sgiacomo.travaglini@arm.com 22513481Sgiacomo.travaglini@arm.com # See ARM DUI 0447J (ARM Motherboard Express uATX -- V2M-P1) and 22613481Sgiacomo.travaglini@arm.com # the individual core/logic tile reference manuals for details 22713481Sgiacomo.travaglini@arm.com # about the site/position/dcc/device allocation. 22813481Sgiacomo.travaglini@arm.com site = Param.UInt8("Board Site") 22913481Sgiacomo.travaglini@arm.com position = Param.UInt8("Position in device stack") 23013481Sgiacomo.travaglini@arm.com dcc = Param.UInt8("Daughterboard Configuration Controller") 23113481Sgiacomo.travaglini@arm.com device = Param.UInt8("Device ID") 23213481Sgiacomo.travaglini@arm.com 23313481Sgiacomo.travaglini@arm.com freq = Param.Clock("Default frequency") 23413481Sgiacomo.travaglini@arm.com 23513481Sgiacomo.travaglini@arm.com def generateDeviceTree(self, state): 23613481Sgiacomo.travaglini@arm.com phandle = state.phandle(self) 23713481Sgiacomo.travaglini@arm.com node = FdtNode("osc@" + format(long(phandle), 'x')) 23813481Sgiacomo.travaglini@arm.com node.appendCompatible("arm,vexpress-osc") 23913481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("arm,vexpress-sysreg,func", 24013481Sgiacomo.travaglini@arm.com [0x1, int(self.device)])) 24113481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("#clock-cells", [0])) 24213481Sgiacomo.travaglini@arm.com freq = int(1.0/self.freq.value) # Values are stored as a clock period 24313481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("freq-range", [freq, freq])) 24413481Sgiacomo.travaglini@arm.com node.append(FdtPropertyStrings("clock-output-names", 24513481Sgiacomo.travaglini@arm.com ["oscclk" + str(phandle)])) 24613481Sgiacomo.travaglini@arm.com node.appendPhandle(self) 24713481Sgiacomo.travaglini@arm.com yield node 24813481Sgiacomo.travaglini@arm.com 24913481Sgiacomo.travaglini@arm.comclass RealViewTemperatureSensor(SimObject): 25013481Sgiacomo.travaglini@arm.com type = 'RealViewTemperatureSensor' 25113481Sgiacomo.travaglini@arm.com cxx_header = "dev/arm/rv_ctrl.hh" 25213481Sgiacomo.travaglini@arm.com 25313481Sgiacomo.travaglini@arm.com parent = Param.RealViewCtrl(Parent.any, "RealView controller") 25413481Sgiacomo.travaglini@arm.com 25513481Sgiacomo.travaglini@arm.com system = Param.System(Parent.any, "system") 25613481Sgiacomo.travaglini@arm.com 25713481Sgiacomo.travaglini@arm.com # See ARM DUI 0447J (ARM Motherboard Express uATX -- V2M-P1) and 25813481Sgiacomo.travaglini@arm.com # the individual core/logic tile reference manuals for details 25913481Sgiacomo.travaglini@arm.com # about the site/position/dcc/device allocation. 26013481Sgiacomo.travaglini@arm.com site = Param.UInt8("Board Site") 26113481Sgiacomo.travaglini@arm.com position = Param.UInt8("Position in device stack") 26213481Sgiacomo.travaglini@arm.com dcc = Param.UInt8("Daughterboard Configuration Controller") 26313481Sgiacomo.travaglini@arm.com device = Param.UInt8("Device ID") 26413481Sgiacomo.travaglini@arm.com 26513481Sgiacomo.travaglini@arm.comclass VExpressMCC(SubSystem): 26613481Sgiacomo.travaglini@arm.com """ARM V2M-P1 Motherboard Configuration Controller 26713481Sgiacomo.travaglini@arm.com 26813481Sgiacomo.travaglini@arm.comThis subsystem describes a subset of the devices that sit behind the 26913481Sgiacomo.travaglini@arm.commotherboard configuration controller on the the ARM Motherboard 27013481Sgiacomo.travaglini@arm.comExpress (V2M-P1) motherboard. See ARM DUI 0447J for details. 27113481Sgiacomo.travaglini@arm.com """ 27213481Sgiacomo.travaglini@arm.com 27313481Sgiacomo.travaglini@arm.com class Osc(RealViewOsc): 27413481Sgiacomo.travaglini@arm.com site, position, dcc = (0, 0, 0) 27513481Sgiacomo.travaglini@arm.com 27613481Sgiacomo.travaglini@arm.com class Temperature(RealViewTemperatureSensor): 27713481Sgiacomo.travaglini@arm.com site, position, dcc = (0, 0, 0) 27813481Sgiacomo.travaglini@arm.com 27913481Sgiacomo.travaglini@arm.com osc_mcc = Osc(device=0, freq="50MHz") 28013481Sgiacomo.travaglini@arm.com osc_clcd = Osc(device=1, freq="23.75MHz") 28113481Sgiacomo.travaglini@arm.com osc_peripheral = Osc(device=2, freq="24MHz") 28213481Sgiacomo.travaglini@arm.com osc_system_bus = Osc(device=4, freq="24MHz") 28313481Sgiacomo.travaglini@arm.com 28413481Sgiacomo.travaglini@arm.com # See Table 4.19 in ARM DUI 0447J (Motherboard Express uATX TRM). 28513481Sgiacomo.travaglini@arm.com temp_crtl = Temperature(device=0) 28613481Sgiacomo.travaglini@arm.com 28713481Sgiacomo.travaglini@arm.com def generateDeviceTree(self, state): 28813481Sgiacomo.travaglini@arm.com node = FdtNode("mcc") 28913481Sgiacomo.travaglini@arm.com node.appendCompatible("arm,vexpress,config-bus") 29013481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("arm,vexpress,site", [0])) 29113481Sgiacomo.travaglini@arm.com 29213481Sgiacomo.travaglini@arm.com for obj in self._children.values(): 29313481Sgiacomo.travaglini@arm.com if issubclass(type(obj), SimObject): 29413481Sgiacomo.travaglini@arm.com node.append(obj.generateDeviceTree(state)) 29513481Sgiacomo.travaglini@arm.com 29613481Sgiacomo.travaglini@arm.com io_phandle = state.phandle(self.osc_mcc.parent.unproxy(self)) 29713481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("arm,vexpress,config-bridge", io_phandle)) 29813481Sgiacomo.travaglini@arm.com 29913481Sgiacomo.travaglini@arm.com yield node 30013481Sgiacomo.travaglini@arm.com 30113481Sgiacomo.travaglini@arm.comclass CoreTile2A15DCC(SubSystem): 30213481Sgiacomo.travaglini@arm.com """ARM CoreTile Express A15x2 Daughterboard Configuration Controller 30313481Sgiacomo.travaglini@arm.com 30413481Sgiacomo.travaglini@arm.comThis subsystem describes a subset of the devices that sit behind the 30513481Sgiacomo.travaglini@arm.comdaughterboard configuration controller on a CoreTile Express A15x2. See 30613481Sgiacomo.travaglini@arm.comARM DUI 0604E for details. 30713481Sgiacomo.travaglini@arm.com """ 30813481Sgiacomo.travaglini@arm.com 30913481Sgiacomo.travaglini@arm.com class Osc(RealViewOsc): 31013481Sgiacomo.travaglini@arm.com site, position, dcc = (1, 0, 0) 31113481Sgiacomo.travaglini@arm.com 31213481Sgiacomo.travaglini@arm.com # See Table 2.8 in ARM DUI 0604E (CoreTile Express A15x2 TRM) 31313481Sgiacomo.travaglini@arm.com osc_cpu = Osc(device=0, freq="60MHz") 31413481Sgiacomo.travaglini@arm.com osc_hsbm = Osc(device=4, freq="40MHz") 31513481Sgiacomo.travaglini@arm.com osc_pxl = Osc(device=5, freq="23.75MHz") 31613481Sgiacomo.travaglini@arm.com osc_smb = Osc(device=6, freq="50MHz") 31713481Sgiacomo.travaglini@arm.com osc_sys = Osc(device=7, freq="60MHz") 31813481Sgiacomo.travaglini@arm.com osc_ddr = Osc(device=8, freq="40MHz") 31913481Sgiacomo.travaglini@arm.com 32013481Sgiacomo.travaglini@arm.com def generateDeviceTree(self, state): 32113481Sgiacomo.travaglini@arm.com node = FdtNode("dcc") 32213481Sgiacomo.travaglini@arm.com node.appendCompatible("arm,vexpress,config-bus") 32313481Sgiacomo.travaglini@arm.com 32413481Sgiacomo.travaglini@arm.com for obj in self._children.values(): 32513481Sgiacomo.travaglini@arm.com if isinstance(obj, SimObject): 32613481Sgiacomo.travaglini@arm.com node.append(obj.generateDeviceTree(state)) 32713481Sgiacomo.travaglini@arm.com 32813481Sgiacomo.travaglini@arm.com io_phandle = state.phandle(self.osc_cpu.parent.unproxy(self)) 32913481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("arm,vexpress,config-bridge", io_phandle)) 33013481Sgiacomo.travaglini@arm.com 33113481Sgiacomo.travaglini@arm.com yield node 33213481Sgiacomo.travaglini@arm.com 33313481Sgiacomo.travaglini@arm.comclass AmbaFake(AmbaPioDevice): 33413481Sgiacomo.travaglini@arm.com type = 'AmbaFake' 33513481Sgiacomo.travaglini@arm.com cxx_header = "dev/arm/amba_fake.hh" 33613481Sgiacomo.travaglini@arm.com ignore_access = Param.Bool(False, "Ignore reads/writes to this device, (e.g. IsaFake + AMBA)") 33713481Sgiacomo.travaglini@arm.com amba_id = 0; 33813481Sgiacomo.travaglini@arm.com 33913481Sgiacomo.travaglini@arm.comclass Pl011(Uart): 34013481Sgiacomo.travaglini@arm.com type = 'Pl011' 34113481Sgiacomo.travaglini@arm.com cxx_header = "dev/arm/pl011.hh" 34213481Sgiacomo.travaglini@arm.com gic = Param.BaseGic(Parent.any, "Gic to use for interrupting") 34313481Sgiacomo.travaglini@arm.com int_num = Param.UInt32("Interrupt number that connects to GIC") 34413481Sgiacomo.travaglini@arm.com end_on_eot = Param.Bool(False, "End the simulation when a EOT is received on the UART") 34513481Sgiacomo.travaglini@arm.com int_delay = Param.Latency("100ns", "Time between action and interrupt generation by UART") 34613481Sgiacomo.travaglini@arm.com 34713481Sgiacomo.travaglini@arm.com def generateDeviceTree(self, state): 34813481Sgiacomo.travaglini@arm.com node = self.generateBasicPioDeviceNode(state, 'uart', self.pio_addr, 34913481Sgiacomo.travaglini@arm.com 0x1000, [int(self.int_num)]) 35013481Sgiacomo.travaglini@arm.com node.appendCompatible(["arm,pl011", "arm,primecell"]) 35113481Sgiacomo.travaglini@arm.com 35213481Sgiacomo.travaglini@arm.com # Hardcoded reference to the realview platform clocks, because the 35313481Sgiacomo.travaglini@arm.com # clk_domain can only store one clock (i.e. it is not a VectorParam) 35413481Sgiacomo.travaglini@arm.com realview = self._parent.unproxy(self) 35513481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("clocks", 35613481Sgiacomo.travaglini@arm.com [state.phandle(realview.mcc.osc_peripheral), 35713481Sgiacomo.travaglini@arm.com state.phandle(realview.dcc.osc_smb)])) 35813481Sgiacomo.travaglini@arm.com node.append(FdtPropertyStrings("clock-names", ["uartclk", "apb_pclk"])) 35913481Sgiacomo.travaglini@arm.com yield node 36013481Sgiacomo.travaglini@arm.com 36113481Sgiacomo.travaglini@arm.comclass Sp804(AmbaPioDevice): 36213481Sgiacomo.travaglini@arm.com type = 'Sp804' 36313481Sgiacomo.travaglini@arm.com cxx_header = "dev/arm/timer_sp804.hh" 36413481Sgiacomo.travaglini@arm.com gic = Param.BaseGic(Parent.any, "Gic to use for interrupting") 36513481Sgiacomo.travaglini@arm.com int_num0 = Param.UInt32("Interrupt number that connects to GIC") 36613481Sgiacomo.travaglini@arm.com clock0 = Param.Clock('1MHz', "Clock speed of the input") 36713481Sgiacomo.travaglini@arm.com int_num1 = Param.UInt32("Interrupt number that connects to GIC") 36813481Sgiacomo.travaglini@arm.com clock1 = Param.Clock('1MHz', "Clock speed of the input") 36913481Sgiacomo.travaglini@arm.com amba_id = 0x00141804 37013481Sgiacomo.travaglini@arm.com 37113481Sgiacomo.travaglini@arm.comclass A9GlobalTimer(BasicPioDevice): 37213481Sgiacomo.travaglini@arm.com type = 'A9GlobalTimer' 37313481Sgiacomo.travaglini@arm.com cxx_header = "dev/arm/timer_a9global.hh" 37413481Sgiacomo.travaglini@arm.com gic = Param.BaseGic(Parent.any, "Gic to use for interrupting") 37513481Sgiacomo.travaglini@arm.com int_num = Param.UInt32("Interrrupt number that connects to GIC") 37613481Sgiacomo.travaglini@arm.com 37713481Sgiacomo.travaglini@arm.comclass CpuLocalTimer(BasicPioDevice): 37813481Sgiacomo.travaglini@arm.com type = 'CpuLocalTimer' 37913481Sgiacomo.travaglini@arm.com cxx_header = "dev/arm/timer_cpulocal.hh" 38013481Sgiacomo.travaglini@arm.com int_timer = Param.ArmPPI("Interrrupt used per-cpu to GIC") 38113481Sgiacomo.travaglini@arm.com int_watchdog = Param.ArmPPI("Interrupt for per-cpu watchdog to GIC") 38213481Sgiacomo.travaglini@arm.com 38313481Sgiacomo.travaglini@arm.comclass GenericTimer(ClockedObject): 38413481Sgiacomo.travaglini@arm.com type = 'GenericTimer' 38513481Sgiacomo.travaglini@arm.com cxx_header = "dev/arm/generic_timer.hh" 38613481Sgiacomo.travaglini@arm.com system = Param.ArmSystem(Parent.any, "system") 38713481Sgiacomo.travaglini@arm.com int_phys_s = Param.ArmPPI("Physical (S) timer interrupt") 38813481Sgiacomo.travaglini@arm.com int_phys_ns = Param.ArmPPI("Physical (NS) timer interrupt") 38913481Sgiacomo.travaglini@arm.com int_virt = Param.ArmPPI("Virtual timer interrupt") 39013481Sgiacomo.travaglini@arm.com int_hyp = Param.ArmPPI("Hypervisor timer interrupt") 39113481Sgiacomo.travaglini@arm.com 39213481Sgiacomo.travaglini@arm.com def generateDeviceTree(self, state): 39313481Sgiacomo.travaglini@arm.com node = FdtNode("timer") 39413481Sgiacomo.travaglini@arm.com 39513481Sgiacomo.travaglini@arm.com node.appendCompatible(["arm,cortex-a15-timer", 39613481Sgiacomo.travaglini@arm.com "arm,armv7-timer", 39713481Sgiacomo.travaglini@arm.com "arm,armv8-timer"]) 39813481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("interrupts", [ 39913481Sgiacomo.travaglini@arm.com 1, int(self.int_phys_s.num) - 16, 0xf08, 40013481Sgiacomo.travaglini@arm.com 1, int(self.int_phys_ns.num) - 16, 0xf08, 40113481Sgiacomo.travaglini@arm.com 1, int(self.int_virt.num) - 16, 0xf08, 40213481Sgiacomo.travaglini@arm.com 1, int(self.int_hyp.num) - 16, 0xf08, 40313481Sgiacomo.travaglini@arm.com ])) 40413481Sgiacomo.travaglini@arm.com clock = state.phandle(self.clk_domain.unproxy(self)) 40513481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("clocks", clock)) 40613481Sgiacomo.travaglini@arm.com 40713481Sgiacomo.travaglini@arm.com yield node 40813481Sgiacomo.travaglini@arm.com 40913481Sgiacomo.travaglini@arm.comclass GenericTimerMem(PioDevice): 41013481Sgiacomo.travaglini@arm.com type = 'GenericTimerMem' 41113481Sgiacomo.travaglini@arm.com cxx_header = "dev/arm/generic_timer.hh" 41213481Sgiacomo.travaglini@arm.com 41313481Sgiacomo.travaglini@arm.com base = Param.Addr(0, "Base address") 41413481Sgiacomo.travaglini@arm.com 41513481Sgiacomo.travaglini@arm.com int_phys = Param.ArmSPI("Physical Interrupt") 41613481Sgiacomo.travaglini@arm.com int_virt = Param.ArmSPI("Virtual Interrupt") 41713481Sgiacomo.travaglini@arm.com 41813481Sgiacomo.travaglini@arm.comclass PL031(AmbaIntDevice): 41913481Sgiacomo.travaglini@arm.com type = 'PL031' 42013481Sgiacomo.travaglini@arm.com cxx_header = "dev/arm/rtc_pl031.hh" 42113481Sgiacomo.travaglini@arm.com time = Param.Time('01/01/2009', "System time to use ('Now' for actual time)") 42213481Sgiacomo.travaglini@arm.com amba_id = 0x00341031 42313481Sgiacomo.travaglini@arm.com 42413481Sgiacomo.travaglini@arm.com def generateDeviceTree(self, state): 42513481Sgiacomo.travaglini@arm.com node = self.generateBasicPioDeviceNode(state, 'rtc', self.pio_addr, 42613481Sgiacomo.travaglini@arm.com 0x1000, [int(self.int_num)]) 42713481Sgiacomo.travaglini@arm.com 42813481Sgiacomo.travaglini@arm.com node.appendCompatible(["arm,pl031", "arm,primecell"]) 42913481Sgiacomo.travaglini@arm.com clock = state.phandle(self.clk_domain.unproxy(self)) 43013481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("clocks", clock)) 43113481Sgiacomo.travaglini@arm.com 43213481Sgiacomo.travaglini@arm.com yield node 43313481Sgiacomo.travaglini@arm.com 43413481Sgiacomo.travaglini@arm.comclass Pl050(AmbaIntDevice): 43513481Sgiacomo.travaglini@arm.com type = 'Pl050' 43613481Sgiacomo.travaglini@arm.com cxx_header = "dev/arm/kmi.hh" 43713481Sgiacomo.travaglini@arm.com amba_id = 0x00141050 43813481Sgiacomo.travaglini@arm.com 43913481Sgiacomo.travaglini@arm.com ps2 = Param.PS2Device("PS/2 device") 44013481Sgiacomo.travaglini@arm.com 44113481Sgiacomo.travaglini@arm.com def generateDeviceTree(self, state): 44213481Sgiacomo.travaglini@arm.com node = self.generateBasicPioDeviceNode(state, 'kmi', self.pio_addr, 44313481Sgiacomo.travaglini@arm.com 0x1000, [int(self.int_num)]) 44413481Sgiacomo.travaglini@arm.com 44513481Sgiacomo.travaglini@arm.com node.appendCompatible(["arm,pl050", "arm,primecell"]) 44613481Sgiacomo.travaglini@arm.com clock = state.phandle(self.clk_domain.unproxy(self)) 44713481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("clocks", clock)) 44813481Sgiacomo.travaglini@arm.com 44913481Sgiacomo.travaglini@arm.com yield node 45013481Sgiacomo.travaglini@arm.com 45113481Sgiacomo.travaglini@arm.comclass Pl111(AmbaDmaDevice): 45213481Sgiacomo.travaglini@arm.com type = 'Pl111' 45313481Sgiacomo.travaglini@arm.com cxx_header = "dev/arm/pl111.hh" 45413481Sgiacomo.travaglini@arm.com pixel_clock = Param.Clock('24MHz', "Pixel clock") 45513481Sgiacomo.travaglini@arm.com vnc = Param.VncInput(Parent.any, "Vnc server for remote frame buffer display") 45613481Sgiacomo.travaglini@arm.com amba_id = 0x00141111 45713481Sgiacomo.travaglini@arm.com enable_capture = Param.Bool(True, "capture frame to system.framebuffer.bmp") 45813481Sgiacomo.travaglini@arm.com 45913481Sgiacomo.travaglini@arm.comclass HDLcd(AmbaDmaDevice): 46013481Sgiacomo.travaglini@arm.com type = 'HDLcd' 46113481Sgiacomo.travaglini@arm.com cxx_header = "dev/arm/hdlcd.hh" 46213481Sgiacomo.travaglini@arm.com vnc = Param.VncInput(Parent.any, "Vnc server for remote frame buffer " 46313481Sgiacomo.travaglini@arm.com "display") 46413481Sgiacomo.travaglini@arm.com amba_id = 0x00141000 46513481Sgiacomo.travaglini@arm.com workaround_swap_rb = Param.Bool(False, "Workaround incorrect color " 46613481Sgiacomo.travaglini@arm.com "selector order in some kernels") 46713481Sgiacomo.travaglini@arm.com workaround_dma_line_count = Param.Bool(True, "Workaround incorrect " 46813481Sgiacomo.travaglini@arm.com "DMA line count (off by 1)") 46913481Sgiacomo.travaglini@arm.com enable_capture = Param.Bool(True, "capture frame to " 47013481Sgiacomo.travaglini@arm.com "system.framebuffer.{extension}") 47113481Sgiacomo.travaglini@arm.com frame_format = Param.ImageFormat("Auto", 47213481Sgiacomo.travaglini@arm.com "image format of the captured frame") 47313481Sgiacomo.travaglini@arm.com 47413481Sgiacomo.travaglini@arm.com pixel_buffer_size = Param.MemorySize32("2kB", "Size of address range") 47513481Sgiacomo.travaglini@arm.com 47613481Sgiacomo.travaglini@arm.com pxl_clk = Param.ClockDomain("Pixel clock source") 47713481Sgiacomo.travaglini@arm.com pixel_chunk = Param.Unsigned(32, "Number of pixels to handle in one batch") 47813481Sgiacomo.travaglini@arm.com virt_refresh_rate = Param.Frequency("20Hz", "Frame refresh rate " 47913481Sgiacomo.travaglini@arm.com "in KVM mode") 48013481Sgiacomo.travaglini@arm.com 48113481Sgiacomo.travaglini@arm.com def generateDeviceTree(self, state): 48213481Sgiacomo.travaglini@arm.com # Interrupt number is hardcoded; it is not a property of this class 48313481Sgiacomo.travaglini@arm.com node = self.generateBasicPioDeviceNode(state, 'hdlcd', 48413481Sgiacomo.travaglini@arm.com self.pio_addr, 0x1000, [63]) 48513481Sgiacomo.travaglini@arm.com 48613481Sgiacomo.travaglini@arm.com node.appendCompatible(["arm,hdlcd"]) 48713481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("clocks", state.phandle(self.pxl_clk))) 48813481Sgiacomo.travaglini@arm.com node.append(FdtPropertyStrings("clock-names", ["pxlclk"])) 48913481Sgiacomo.travaglini@arm.com 49013481Sgiacomo.travaglini@arm.com # This driver is disabled by default since the required DT nodes 49113481Sgiacomo.travaglini@arm.com # haven't been standardized yet. To use it, override this status to 49213481Sgiacomo.travaglini@arm.com # "ok" and add the display configuration nodes required by the driver. 49313481Sgiacomo.travaglini@arm.com # See the driver for more information. 49413481Sgiacomo.travaglini@arm.com node.append(FdtPropertyStrings("status", ["disabled"])) 49513481Sgiacomo.travaglini@arm.com 49613481Sgiacomo.travaglini@arm.com yield node 49713481Sgiacomo.travaglini@arm.com 49813481Sgiacomo.travaglini@arm.comclass RealView(Platform): 49913481Sgiacomo.travaglini@arm.com type = 'RealView' 50013481Sgiacomo.travaglini@arm.com cxx_header = "dev/arm/realview.hh" 50113481Sgiacomo.travaglini@arm.com system = Param.System(Parent.any, "system") 50213481Sgiacomo.travaglini@arm.com _mem_regions = [ AddrRange(0, size='256MB') ] 50313481Sgiacomo.travaglini@arm.com 50413481Sgiacomo.travaglini@arm.com def _on_chip_devices(self): 50513481Sgiacomo.travaglini@arm.com return [] 50613481Sgiacomo.travaglini@arm.com 50713481Sgiacomo.travaglini@arm.com def _off_chip_devices(self): 50813481Sgiacomo.travaglini@arm.com return [] 50913481Sgiacomo.travaglini@arm.com 51013481Sgiacomo.travaglini@arm.com _off_chip_ranges = [] 51113481Sgiacomo.travaglini@arm.com 51213481Sgiacomo.travaglini@arm.com def _attach_device(self, device, bus, dma_ports=None): 51313481Sgiacomo.travaglini@arm.com if hasattr(device, "pio"): 51413481Sgiacomo.travaglini@arm.com device.pio = bus.master 51513481Sgiacomo.travaglini@arm.com if hasattr(device, "dma"): 51613481Sgiacomo.travaglini@arm.com if dma_ports is None: 51713481Sgiacomo.travaglini@arm.com device.dma = bus.slave 51813481Sgiacomo.travaglini@arm.com else: 51913481Sgiacomo.travaglini@arm.com dma_ports.append(device.dma) 52013481Sgiacomo.travaglini@arm.com 52113481Sgiacomo.travaglini@arm.com def _attach_io(self, devices, *args, **kwargs): 52213481Sgiacomo.travaglini@arm.com for d in devices: 52313481Sgiacomo.travaglini@arm.com self._attach_device(d, *args, **kwargs) 52413481Sgiacomo.travaglini@arm.com 52513481Sgiacomo.travaglini@arm.com def _attach_clk(self, devices, clkdomain): 52613481Sgiacomo.travaglini@arm.com for d in devices: 52713481Sgiacomo.travaglini@arm.com if hasattr(d, "clk_domain"): 52813481Sgiacomo.travaglini@arm.com d.clk_domain = clkdomain 52913481Sgiacomo.travaglini@arm.com 53013481Sgiacomo.travaglini@arm.com def attachPciDevices(self): 53113481Sgiacomo.travaglini@arm.com pass 53213481Sgiacomo.travaglini@arm.com 53313481Sgiacomo.travaglini@arm.com def enableMSIX(self): 53413481Sgiacomo.travaglini@arm.com pass 53513481Sgiacomo.travaglini@arm.com 53613481Sgiacomo.travaglini@arm.com def onChipIOClkDomain(self, clkdomain): 53713481Sgiacomo.travaglini@arm.com self._attach_clk(self._on_chip_devices(), clkdomain) 53813481Sgiacomo.travaglini@arm.com 53913481Sgiacomo.travaglini@arm.com def offChipIOClkDomain(self, clkdomain): 54013481Sgiacomo.travaglini@arm.com self._attach_clk(self._off_chip_devices(), clkdomain) 54113481Sgiacomo.travaglini@arm.com 54213481Sgiacomo.travaglini@arm.com def attachOnChipIO(self, bus, bridge=None, *args, **kwargs): 54313481Sgiacomo.travaglini@arm.com self._attach_io(self._on_chip_devices(), bus, *args, **kwargs) 54413481Sgiacomo.travaglini@arm.com if bridge: 54513481Sgiacomo.travaglini@arm.com bridge.ranges = self._off_chip_ranges 54613481Sgiacomo.travaglini@arm.com 54713481Sgiacomo.travaglini@arm.com def attachIO(self, *args, **kwargs): 54813481Sgiacomo.travaglini@arm.com self._attach_io(self._off_chip_devices(), *args, **kwargs) 54913481Sgiacomo.travaglini@arm.com 55013481Sgiacomo.travaglini@arm.com def setupBootLoader(self, mem_bus, cur_sys, loc): 55113481Sgiacomo.travaglini@arm.com cur_sys.bootmem = SimpleMemory( 55213481Sgiacomo.travaglini@arm.com range = AddrRange('2GB', size = '64MB'), 55313481Sgiacomo.travaglini@arm.com conf_table_reported = False) 55413481Sgiacomo.travaglini@arm.com if mem_bus is not None: 55513481Sgiacomo.travaglini@arm.com cur_sys.bootmem.port = mem_bus.master 55613481Sgiacomo.travaglini@arm.com cur_sys.boot_loader = loc('boot.arm') 55713481Sgiacomo.travaglini@arm.com cur_sys.atags_addr = 0x100 55813481Sgiacomo.travaglini@arm.com cur_sys.load_offset = 0 55913481Sgiacomo.travaglini@arm.com 56013481Sgiacomo.travaglini@arm.com def generateDeviceTree(self, state): 56113481Sgiacomo.travaglini@arm.com node = FdtNode("/") # Things in this module need to end up in the root 56213481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("interrupt-parent", 56313481Sgiacomo.travaglini@arm.com state.phandle(self.gic))) 56413481Sgiacomo.travaglini@arm.com 56513481Sgiacomo.travaglini@arm.com for subnode in self.recurseDeviceTree(state): 56613481Sgiacomo.travaglini@arm.com node.append(subnode) 56713481Sgiacomo.travaglini@arm.com 56813481Sgiacomo.travaglini@arm.com yield node 56913481Sgiacomo.travaglini@arm.com 57013481Sgiacomo.travaglini@arm.com def annotateCpuDeviceNode(self, cpu, state): 57113481Sgiacomo.travaglini@arm.com cpu.append(FdtPropertyStrings("enable-method", "spin-table")) 57213481Sgiacomo.travaglini@arm.com cpu.append(FdtPropertyWords("cpu-release-addr", \ 57313481Sgiacomo.travaglini@arm.com state.addrCells(0x8000fff8))) 57413481Sgiacomo.travaglini@arm.com 57513481Sgiacomo.travaglini@arm.com# Reference for memory map and interrupt number 57613481Sgiacomo.travaglini@arm.com# RealView Platform Baseboard Explore for Cortex-A9 User Guide(ARM DUI 0440A) 57713481Sgiacomo.travaglini@arm.com# Chapter 4: Programmer's Reference 57813481Sgiacomo.travaglini@arm.comclass RealViewPBX(RealView): 57913481Sgiacomo.travaglini@arm.com uart = Pl011(pio_addr=0x10009000, int_num=44) 58013481Sgiacomo.travaglini@arm.com realview_io = RealViewCtrl(pio_addr=0x10000000) 58113481Sgiacomo.travaglini@arm.com mcc = VExpressMCC() 58213481Sgiacomo.travaglini@arm.com dcc = CoreTile2A15DCC() 58313481Sgiacomo.travaglini@arm.com gic = Gic400(cpu_addr=0x1f000100, dist_addr=0x1f001000, cpu_size=0x100) 58413481Sgiacomo.travaglini@arm.com pci_host = GenericPciHost( 58513481Sgiacomo.travaglini@arm.com conf_base=0x30000000, conf_size='256MB', conf_device_bits=16, 58613481Sgiacomo.travaglini@arm.com pci_pio_base=0) 58713481Sgiacomo.travaglini@arm.com timer0 = Sp804(int_num0=36, int_num1=36, pio_addr=0x10011000) 58813481Sgiacomo.travaglini@arm.com timer1 = Sp804(int_num0=37, int_num1=37, pio_addr=0x10012000) 58913481Sgiacomo.travaglini@arm.com global_timer = A9GlobalTimer(int_num=27, pio_addr=0x1f000200) 59013481Sgiacomo.travaglini@arm.com local_cpu_timer = CpuLocalTimer(int_timer=ArmPPI(num=29), 59113481Sgiacomo.travaglini@arm.com int_watchdog=ArmPPI(num=30), 59213481Sgiacomo.travaglini@arm.com pio_addr=0x1f000600) 59313481Sgiacomo.travaglini@arm.com clcd = Pl111(pio_addr=0x10020000, int_num=55) 59413481Sgiacomo.travaglini@arm.com kmi0 = Pl050(pio_addr=0x10006000, int_num=52, ps2=PS2Keyboard()) 59513481Sgiacomo.travaglini@arm.com kmi1 = Pl050(pio_addr=0x10007000, int_num=53, ps2=PS2TouchKit()) 59613481Sgiacomo.travaglini@arm.com a9scu = A9SCU(pio_addr=0x1f000000) 59713481Sgiacomo.travaglini@arm.com cf_ctrl = IdeController(disks=[], pci_func=0, pci_dev=7, pci_bus=2, 59813481Sgiacomo.travaglini@arm.com io_shift = 1, ctrl_offset = 2, Command = 0x1, 59913481Sgiacomo.travaglini@arm.com BAR0 = 0x18000000, BAR0Size = '16B', 60013481Sgiacomo.travaglini@arm.com BAR1 = 0x18000100, BAR1Size = '1B', 60113481Sgiacomo.travaglini@arm.com BAR0LegacyIO = True, BAR1LegacyIO = True) 60213481Sgiacomo.travaglini@arm.com 60313481Sgiacomo.travaglini@arm.com 60413481Sgiacomo.travaglini@arm.com l2x0_fake = IsaFake(pio_addr=0x1f002000, pio_size=0xfff) 60513481Sgiacomo.travaglini@arm.com flash_fake = IsaFake(pio_addr=0x40000000, pio_size=0x20000000, 60613481Sgiacomo.travaglini@arm.com fake_mem=True) 60713481Sgiacomo.travaglini@arm.com dmac_fake = AmbaFake(pio_addr=0x10030000) 60813481Sgiacomo.travaglini@arm.com uart1_fake = AmbaFake(pio_addr=0x1000a000) 60913481Sgiacomo.travaglini@arm.com uart2_fake = AmbaFake(pio_addr=0x1000b000) 61013481Sgiacomo.travaglini@arm.com uart3_fake = AmbaFake(pio_addr=0x1000c000) 61113481Sgiacomo.travaglini@arm.com smc_fake = AmbaFake(pio_addr=0x100e1000) 61213481Sgiacomo.travaglini@arm.com sp810_fake = AmbaFake(pio_addr=0x10001000, ignore_access=True) 61313481Sgiacomo.travaglini@arm.com watchdog_fake = AmbaFake(pio_addr=0x10010000) 61413481Sgiacomo.travaglini@arm.com gpio0_fake = AmbaFake(pio_addr=0x10013000) 61513481Sgiacomo.travaglini@arm.com gpio1_fake = AmbaFake(pio_addr=0x10014000) 61613481Sgiacomo.travaglini@arm.com gpio2_fake = AmbaFake(pio_addr=0x10015000) 61713481Sgiacomo.travaglini@arm.com ssp_fake = AmbaFake(pio_addr=0x1000d000) 61813481Sgiacomo.travaglini@arm.com sci_fake = AmbaFake(pio_addr=0x1000e000) 61913481Sgiacomo.travaglini@arm.com aaci_fake = AmbaFake(pio_addr=0x10004000) 62013481Sgiacomo.travaglini@arm.com mmc_fake = AmbaFake(pio_addr=0x10005000) 62113481Sgiacomo.travaglini@arm.com rtc = PL031(pio_addr=0x10017000, int_num=42) 62213481Sgiacomo.travaglini@arm.com energy_ctrl = EnergyCtrl(pio_addr=0x1000f000) 62313481Sgiacomo.travaglini@arm.com 62413481Sgiacomo.travaglini@arm.com 62513481Sgiacomo.travaglini@arm.com # Attach I/O devices that are on chip and also set the appropriate 62613481Sgiacomo.travaglini@arm.com # ranges for the bridge 62713481Sgiacomo.travaglini@arm.com def attachOnChipIO(self, bus, bridge): 62813481Sgiacomo.travaglini@arm.com self.gic.pio = bus.master 62913481Sgiacomo.travaglini@arm.com self.l2x0_fake.pio = bus.master 63013481Sgiacomo.travaglini@arm.com self.a9scu.pio = bus.master 63113481Sgiacomo.travaglini@arm.com self.global_timer.pio = bus.master 63213481Sgiacomo.travaglini@arm.com self.local_cpu_timer.pio = bus.master 63313481Sgiacomo.travaglini@arm.com # Bridge ranges based on excluding what is part of on-chip I/O 63413481Sgiacomo.travaglini@arm.com # (gic, l2x0, a9scu, local_cpu_timer) 63513481Sgiacomo.travaglini@arm.com bridge.ranges = [AddrRange(self.realview_io.pio_addr, 63613481Sgiacomo.travaglini@arm.com self.a9scu.pio_addr - 1), 63713481Sgiacomo.travaglini@arm.com AddrRange(self.flash_fake.pio_addr, 63813481Sgiacomo.travaglini@arm.com self.flash_fake.pio_addr + \ 63913481Sgiacomo.travaglini@arm.com self.flash_fake.pio_size - 1)] 64013481Sgiacomo.travaglini@arm.com 64113481Sgiacomo.travaglini@arm.com # Set the clock domain for IO objects that are considered 64213481Sgiacomo.travaglini@arm.com # to be "close" to the cores. 64313481Sgiacomo.travaglini@arm.com def onChipIOClkDomain(self, clkdomain): 64413481Sgiacomo.travaglini@arm.com self.gic.clk_domain = clkdomain 64513481Sgiacomo.travaglini@arm.com self.l2x0_fake.clk_domain = clkdomain 64613481Sgiacomo.travaglini@arm.com self.a9scu.clkdomain = clkdomain 64713481Sgiacomo.travaglini@arm.com self.local_cpu_timer.clk_domain = clkdomain 64813481Sgiacomo.travaglini@arm.com 64913481Sgiacomo.travaglini@arm.com # Attach I/O devices to specified bus object. Can't do this 65013481Sgiacomo.travaglini@arm.com # earlier, since the bus object itself is typically defined at the 65113481Sgiacomo.travaglini@arm.com # System level. 65213481Sgiacomo.travaglini@arm.com def attachIO(self, bus): 65313481Sgiacomo.travaglini@arm.com self.uart.pio = bus.master 65413481Sgiacomo.travaglini@arm.com self.realview_io.pio = bus.master 65513481Sgiacomo.travaglini@arm.com self.pci_host.pio = bus.master 65613481Sgiacomo.travaglini@arm.com self.timer0.pio = bus.master 65713481Sgiacomo.travaglini@arm.com self.timer1.pio = bus.master 65813481Sgiacomo.travaglini@arm.com self.clcd.pio = bus.master 65913481Sgiacomo.travaglini@arm.com self.clcd.dma = bus.slave 66013481Sgiacomo.travaglini@arm.com self.kmi0.pio = bus.master 66113481Sgiacomo.travaglini@arm.com self.kmi1.pio = bus.master 66213481Sgiacomo.travaglini@arm.com self.cf_ctrl.pio = bus.master 66313481Sgiacomo.travaglini@arm.com self.cf_ctrl.dma = bus.slave 66413481Sgiacomo.travaglini@arm.com self.dmac_fake.pio = bus.master 66513481Sgiacomo.travaglini@arm.com self.uart1_fake.pio = bus.master 66613481Sgiacomo.travaglini@arm.com self.uart2_fake.pio = bus.master 66713481Sgiacomo.travaglini@arm.com self.uart3_fake.pio = bus.master 66813481Sgiacomo.travaglini@arm.com self.smc_fake.pio = bus.master 66913481Sgiacomo.travaglini@arm.com self.sp810_fake.pio = bus.master 67013481Sgiacomo.travaglini@arm.com self.watchdog_fake.pio = bus.master 67113481Sgiacomo.travaglini@arm.com self.gpio0_fake.pio = bus.master 67213481Sgiacomo.travaglini@arm.com self.gpio1_fake.pio = bus.master 67313481Sgiacomo.travaglini@arm.com self.gpio2_fake.pio = bus.master 67413481Sgiacomo.travaglini@arm.com self.ssp_fake.pio = bus.master 67513481Sgiacomo.travaglini@arm.com self.sci_fake.pio = bus.master 67613481Sgiacomo.travaglini@arm.com self.aaci_fake.pio = bus.master 67713481Sgiacomo.travaglini@arm.com self.mmc_fake.pio = bus.master 67813481Sgiacomo.travaglini@arm.com self.rtc.pio = bus.master 67913481Sgiacomo.travaglini@arm.com self.flash_fake.pio = bus.master 68013481Sgiacomo.travaglini@arm.com self.energy_ctrl.pio = bus.master 68113481Sgiacomo.travaglini@arm.com 68213481Sgiacomo.travaglini@arm.com # Set the clock domain for IO objects that are considered 68313481Sgiacomo.travaglini@arm.com # to be "far" away from the cores. 68413481Sgiacomo.travaglini@arm.com def offChipIOClkDomain(self, clkdomain): 68513481Sgiacomo.travaglini@arm.com self.uart.clk_domain = clkdomain 68613481Sgiacomo.travaglini@arm.com self.realview_io.clk_domain = clkdomain 68713481Sgiacomo.travaglini@arm.com self.timer0.clk_domain = clkdomain 68813481Sgiacomo.travaglini@arm.com self.timer1.clk_domain = clkdomain 68913481Sgiacomo.travaglini@arm.com self.clcd.clk_domain = clkdomain 69013481Sgiacomo.travaglini@arm.com self.kmi0.clk_domain = clkdomain 69113481Sgiacomo.travaglini@arm.com self.kmi1.clk_domain = clkdomain 69213481Sgiacomo.travaglini@arm.com self.cf_ctrl.clk_domain = clkdomain 69313481Sgiacomo.travaglini@arm.com self.dmac_fake.clk_domain = clkdomain 69413481Sgiacomo.travaglini@arm.com self.uart1_fake.clk_domain = clkdomain 69513481Sgiacomo.travaglini@arm.com self.uart2_fake.clk_domain = clkdomain 69613481Sgiacomo.travaglini@arm.com self.uart3_fake.clk_domain = clkdomain 69713481Sgiacomo.travaglini@arm.com self.smc_fake.clk_domain = clkdomain 69813481Sgiacomo.travaglini@arm.com self.sp810_fake.clk_domain = clkdomain 69913481Sgiacomo.travaglini@arm.com self.watchdog_fake.clk_domain = clkdomain 70013481Sgiacomo.travaglini@arm.com self.gpio0_fake.clk_domain = clkdomain 70113481Sgiacomo.travaglini@arm.com self.gpio1_fake.clk_domain = clkdomain 70213481Sgiacomo.travaglini@arm.com self.gpio2_fake.clk_domain = clkdomain 70313481Sgiacomo.travaglini@arm.com self.ssp_fake.clk_domain = clkdomain 70413481Sgiacomo.travaglini@arm.com self.sci_fake.clk_domain = clkdomain 70513481Sgiacomo.travaglini@arm.com self.aaci_fake.clk_domain = clkdomain 70613481Sgiacomo.travaglini@arm.com self.mmc_fake.clk_domain = clkdomain 70713481Sgiacomo.travaglini@arm.com self.rtc.clk_domain = clkdomain 70813481Sgiacomo.travaglini@arm.com self.flash_fake.clk_domain = clkdomain 70913481Sgiacomo.travaglini@arm.com self.energy_ctrl.clk_domain = clkdomain 71013481Sgiacomo.travaglini@arm.com 71113481Sgiacomo.travaglini@arm.comclass VExpress_EMM(RealView): 71213481Sgiacomo.travaglini@arm.com _mem_regions = [ AddrRange('2GB', size='2GB') ] 71313481Sgiacomo.travaglini@arm.com 71413481Sgiacomo.travaglini@arm.com # Ranges based on excluding what is part of on-chip I/O (gic, 71513481Sgiacomo.travaglini@arm.com # a9scu) 71613481Sgiacomo.travaglini@arm.com _off_chip_ranges = [AddrRange(0x2F000000, size='16MB'), 71713481Sgiacomo.travaglini@arm.com AddrRange(0x30000000, size='256MB'), 71813481Sgiacomo.travaglini@arm.com AddrRange(0x40000000, size='512MB'), 71913481Sgiacomo.travaglini@arm.com AddrRange(0x18000000, size='64MB'), 72013481Sgiacomo.travaglini@arm.com AddrRange(0x1C000000, size='64MB')] 72113481Sgiacomo.travaglini@arm.com 72213481Sgiacomo.travaglini@arm.com # Platform control device (off-chip) 72313481Sgiacomo.travaglini@arm.com realview_io = RealViewCtrl(proc_id0=0x14000000, proc_id1=0x14000000, 72413481Sgiacomo.travaglini@arm.com idreg=0x02250000, pio_addr=0x1C010000) 72513481Sgiacomo.travaglini@arm.com 72613481Sgiacomo.travaglini@arm.com mcc = VExpressMCC() 72713481Sgiacomo.travaglini@arm.com dcc = CoreTile2A15DCC() 72813481Sgiacomo.travaglini@arm.com 72913481Sgiacomo.travaglini@arm.com ### On-chip devices ### 73013481Sgiacomo.travaglini@arm.com gic = Gic400(dist_addr=0x2C001000, cpu_addr=0x2C002000) 73113481Sgiacomo.travaglini@arm.com vgic = VGic(vcpu_addr=0x2c006000, hv_addr=0x2c004000, ppint=25) 73213481Sgiacomo.travaglini@arm.com 73313481Sgiacomo.travaglini@arm.com local_cpu_timer = CpuLocalTimer(int_timer=ArmPPI(num=29), 73413481Sgiacomo.travaglini@arm.com int_watchdog=ArmPPI(num=30), 73513481Sgiacomo.travaglini@arm.com pio_addr=0x2C080000) 73613481Sgiacomo.travaglini@arm.com 73713481Sgiacomo.travaglini@arm.com hdlcd = HDLcd(pxl_clk=dcc.osc_pxl, 73813481Sgiacomo.travaglini@arm.com pio_addr=0x2b000000, int_num=117, 73913481Sgiacomo.travaglini@arm.com workaround_swap_rb=True) 74013481Sgiacomo.travaglini@arm.com 74113481Sgiacomo.travaglini@arm.com def _on_chip_devices(self): 74213481Sgiacomo.travaglini@arm.com devices = [ 74313481Sgiacomo.travaglini@arm.com self.gic, self.vgic, 74413481Sgiacomo.travaglini@arm.com self.local_cpu_timer 74513481Sgiacomo.travaglini@arm.com ] 74613481Sgiacomo.travaglini@arm.com if hasattr(self, "gicv2m"): 74713481Sgiacomo.travaglini@arm.com devices.append(self.gicv2m) 74813481Sgiacomo.travaglini@arm.com devices.append(self.hdlcd) 74913481Sgiacomo.travaglini@arm.com return devices 75013481Sgiacomo.travaglini@arm.com 75113481Sgiacomo.travaglini@arm.com ### Off-chip devices ### 75213481Sgiacomo.travaglini@arm.com uart = Pl011(pio_addr=0x1c090000, int_num=37) 75313481Sgiacomo.travaglini@arm.com pci_host = GenericPciHost( 75413481Sgiacomo.travaglini@arm.com conf_base=0x30000000, conf_size='256MB', conf_device_bits=16, 75513481Sgiacomo.travaglini@arm.com pci_pio_base=0) 75613481Sgiacomo.travaglini@arm.com 75713481Sgiacomo.travaglini@arm.com generic_timer = GenericTimer(int_phys_s=ArmPPI(num=29), 75813481Sgiacomo.travaglini@arm.com int_phys_ns=ArmPPI(num=30), 75913481Sgiacomo.travaglini@arm.com int_virt=ArmPPI(num=27), 76013481Sgiacomo.travaglini@arm.com int_hyp=ArmPPI(num=26)) 76113481Sgiacomo.travaglini@arm.com 76213481Sgiacomo.travaglini@arm.com timer0 = Sp804(int_num0=34, int_num1=34, pio_addr=0x1C110000, clock0='1MHz', clock1='1MHz') 76313481Sgiacomo.travaglini@arm.com timer1 = Sp804(int_num0=35, int_num1=35, pio_addr=0x1C120000, clock0='1MHz', clock1='1MHz') 76413481Sgiacomo.travaglini@arm.com clcd = Pl111(pio_addr=0x1c1f0000, int_num=46) 76513481Sgiacomo.travaglini@arm.com kmi0 = Pl050(pio_addr=0x1c060000, int_num=44, ps2=PS2Keyboard()) 76613481Sgiacomo.travaglini@arm.com kmi1 = Pl050(pio_addr=0x1c070000, int_num=45, ps2=PS2TouchKit()) 76713481Sgiacomo.travaglini@arm.com cf_ctrl = IdeController(disks=[], pci_func=0, pci_dev=0, pci_bus=2, 76813481Sgiacomo.travaglini@arm.com io_shift = 2, ctrl_offset = 2, Command = 0x1, 76913481Sgiacomo.travaglini@arm.com BAR0 = 0x1C1A0000, BAR0Size = '256B', 77013481Sgiacomo.travaglini@arm.com BAR1 = 0x1C1A0100, BAR1Size = '4096B', 77113481Sgiacomo.travaglini@arm.com BAR0LegacyIO = True, BAR1LegacyIO = True) 77213481Sgiacomo.travaglini@arm.com 77313481Sgiacomo.travaglini@arm.com vram = SimpleMemory(range = AddrRange(0x18000000, size='32MB'), 77413481Sgiacomo.travaglini@arm.com conf_table_reported = False) 77513481Sgiacomo.travaglini@arm.com rtc = PL031(pio_addr=0x1C170000, int_num=36) 77613481Sgiacomo.travaglini@arm.com 77713481Sgiacomo.travaglini@arm.com l2x0_fake = IsaFake(pio_addr=0x2C100000, pio_size=0xfff) 77813481Sgiacomo.travaglini@arm.com uart1_fake = AmbaFake(pio_addr=0x1C0A0000) 77913481Sgiacomo.travaglini@arm.com uart2_fake = AmbaFake(pio_addr=0x1C0B0000) 78013481Sgiacomo.travaglini@arm.com uart3_fake = AmbaFake(pio_addr=0x1C0C0000) 78113481Sgiacomo.travaglini@arm.com sp810_fake = AmbaFake(pio_addr=0x1C020000, ignore_access=True) 78213481Sgiacomo.travaglini@arm.com watchdog_fake = AmbaFake(pio_addr=0x1C0F0000) 78313481Sgiacomo.travaglini@arm.com aaci_fake = AmbaFake(pio_addr=0x1C040000) 78413481Sgiacomo.travaglini@arm.com lan_fake = IsaFake(pio_addr=0x1A000000, pio_size=0xffff) 78513481Sgiacomo.travaglini@arm.com usb_fake = IsaFake(pio_addr=0x1B000000, pio_size=0x1ffff) 78613481Sgiacomo.travaglini@arm.com mmc_fake = AmbaFake(pio_addr=0x1c050000) 78713481Sgiacomo.travaglini@arm.com energy_ctrl = EnergyCtrl(pio_addr=0x1c080000) 78813481Sgiacomo.travaglini@arm.com 78913481Sgiacomo.travaglini@arm.com def _off_chip_devices(self): 79013481Sgiacomo.travaglini@arm.com devices = [ 79113481Sgiacomo.travaglini@arm.com self.uart, 79213481Sgiacomo.travaglini@arm.com self.realview_io, 79313481Sgiacomo.travaglini@arm.com self.pci_host, 79413481Sgiacomo.travaglini@arm.com self.timer0, 79513481Sgiacomo.travaglini@arm.com self.timer1, 79613481Sgiacomo.travaglini@arm.com self.clcd, 79713481Sgiacomo.travaglini@arm.com self.kmi0, 79813481Sgiacomo.travaglini@arm.com self.kmi1, 79913481Sgiacomo.travaglini@arm.com self.cf_ctrl, 80013481Sgiacomo.travaglini@arm.com self.rtc, 80113481Sgiacomo.travaglini@arm.com self.vram, 80213481Sgiacomo.travaglini@arm.com self.l2x0_fake, 80313481Sgiacomo.travaglini@arm.com self.uart1_fake, 80413481Sgiacomo.travaglini@arm.com self.uart2_fake, 80513481Sgiacomo.travaglini@arm.com self.uart3_fake, 80613481Sgiacomo.travaglini@arm.com self.sp810_fake, 80713481Sgiacomo.travaglini@arm.com self.watchdog_fake, 80813481Sgiacomo.travaglini@arm.com self.aaci_fake, 80913481Sgiacomo.travaglini@arm.com self.lan_fake, 81013481Sgiacomo.travaglini@arm.com self.usb_fake, 81113481Sgiacomo.travaglini@arm.com self.mmc_fake, 81213481Sgiacomo.travaglini@arm.com self.energy_ctrl, 81313481Sgiacomo.travaglini@arm.com ] 81413481Sgiacomo.travaglini@arm.com # Try to attach the I/O if it exists 81513481Sgiacomo.travaglini@arm.com if hasattr(self, "ide"): 81613481Sgiacomo.travaglini@arm.com devices.append(self.ide) 81713481Sgiacomo.travaglini@arm.com if hasattr(self, "ethernet"): 81813481Sgiacomo.travaglini@arm.com devices.append(self.ethernet) 81913481Sgiacomo.travaglini@arm.com return devices 82013481Sgiacomo.travaglini@arm.com 82113481Sgiacomo.travaglini@arm.com # Attach any PCI devices that are supported 82213481Sgiacomo.travaglini@arm.com def attachPciDevices(self): 82313481Sgiacomo.travaglini@arm.com self.ethernet = IGbE_e1000(pci_bus=0, pci_dev=0, pci_func=0, 82413481Sgiacomo.travaglini@arm.com InterruptLine=1, InterruptPin=1) 82513481Sgiacomo.travaglini@arm.com self.ide = IdeController(disks = [], pci_bus=0, pci_dev=1, pci_func=0, 82613481Sgiacomo.travaglini@arm.com InterruptLine=2, InterruptPin=2) 82713481Sgiacomo.travaglini@arm.com 82813481Sgiacomo.travaglini@arm.com def enableMSIX(self): 82913481Sgiacomo.travaglini@arm.com self.gic = Gic400(dist_addr=0x2C001000, cpu_addr=0x2C002000, 83013481Sgiacomo.travaglini@arm.com it_lines=512) 83113481Sgiacomo.travaglini@arm.com self.gicv2m = Gicv2m() 83213481Sgiacomo.travaglini@arm.com self.gicv2m.frames = [Gicv2mFrame(spi_base=256, spi_len=64, addr=0x2C1C0000)] 83313481Sgiacomo.travaglini@arm.com 83413481Sgiacomo.travaglini@arm.com def setupBootLoader(self, mem_bus, cur_sys, loc): 83513481Sgiacomo.travaglini@arm.com cur_sys.bootmem = SimpleMemory(range = AddrRange('64MB'), 83613481Sgiacomo.travaglini@arm.com conf_table_reported = False) 83713481Sgiacomo.travaglini@arm.com if mem_bus is not None: 83813481Sgiacomo.travaglini@arm.com cur_sys.bootmem.port = mem_bus.master 83913481Sgiacomo.travaglini@arm.com if not cur_sys.boot_loader: 84013481Sgiacomo.travaglini@arm.com cur_sys.boot_loader = loc('boot_emm.arm') 84113481Sgiacomo.travaglini@arm.com cur_sys.atags_addr = 0x8000000 84213481Sgiacomo.travaglini@arm.com cur_sys.load_offset = 0x80000000 84313481Sgiacomo.travaglini@arm.com 84413481Sgiacomo.travaglini@arm.comclass VExpress_EMM64(VExpress_EMM): 84513481Sgiacomo.travaglini@arm.com # Three memory regions are specified totalling 512GB 84613481Sgiacomo.travaglini@arm.com _mem_regions = [ AddrRange('2GB', size='2GB'), 84713481Sgiacomo.travaglini@arm.com AddrRange('34GB', size='30GB'), 84813481Sgiacomo.travaglini@arm.com AddrRange('512GB', size='480GB') ] 84913481Sgiacomo.travaglini@arm.com pci_host = GenericPciHost( 85013481Sgiacomo.travaglini@arm.com conf_base=0x30000000, conf_size='256MB', conf_device_bits=12, 85113481Sgiacomo.travaglini@arm.com pci_pio_base=0x2f000000) 85213481Sgiacomo.travaglini@arm.com 85313481Sgiacomo.travaglini@arm.com def setupBootLoader(self, mem_bus, cur_sys, loc): 85413481Sgiacomo.travaglini@arm.com cur_sys.bootmem = SimpleMemory(range=AddrRange(0, size='64MB'), 85513481Sgiacomo.travaglini@arm.com conf_table_reported=False) 85613481Sgiacomo.travaglini@arm.com if mem_bus is not None: 85713481Sgiacomo.travaglini@arm.com cur_sys.bootmem.port = mem_bus.master 85813481Sgiacomo.travaglini@arm.com if not cur_sys.boot_loader: 85913481Sgiacomo.travaglini@arm.com cur_sys.boot_loader = loc('boot_emm.arm64') 86013481Sgiacomo.travaglini@arm.com cur_sys.atags_addr = 0x8000000 86113481Sgiacomo.travaglini@arm.com cur_sys.load_offset = 0x80000000 86213481Sgiacomo.travaglini@arm.com 86313481Sgiacomo.travaglini@arm.comclass VExpress_GEM5_Base(RealView): 86413481Sgiacomo.travaglini@arm.com """ 86513481Sgiacomo.travaglini@arm.comThe VExpress gem5 memory map is loosely based on a modified 86613481Sgiacomo.travaglini@arm.comVersatile Express RS1 memory map. 86713481Sgiacomo.travaglini@arm.com 86813481Sgiacomo.travaglini@arm.comThe gem5 platform has been designed to implement a subset of the 86913481Sgiacomo.travaglini@arm.comoriginal Versatile Express RS1 memory map. Off-chip peripherals should, 87013481Sgiacomo.travaglini@arm.comwhen possible, adhere to the Versatile Express memory map. Non-PCI 87113481Sgiacomo.travaglini@arm.comoff-chip devices that are gem5-specific should live in the CS5 memory 87213481Sgiacomo.travaglini@arm.comspace to avoid conflicts with existing devices that we might want to 87313481Sgiacomo.travaglini@arm.commodel in the future. Such devices should normally have interrupts in 87413481Sgiacomo.travaglini@arm.comthe gem5-specific SPI range. 87513481Sgiacomo.travaglini@arm.com 87613481Sgiacomo.travaglini@arm.comOn-chip peripherals are loosely modeled after the ARM CoreTile Express 87713481Sgiacomo.travaglini@arm.comA15x2 A7x3 memory and interrupt map. In particular, the GIC and 87813481Sgiacomo.travaglini@arm.comGeneric Timer have the same interrupt lines and base addresses. Other 87913481Sgiacomo.travaglini@arm.comon-chip devices are gem5 specific. 88013481Sgiacomo.travaglini@arm.com 88113481Sgiacomo.travaglini@arm.comUnlike the original Versatile Express RS2 extended platform, gem5 implements a 88213481Sgiacomo.travaglini@arm.comlarge contigious DRAM space, without aliases or holes, starting at the 88313481Sgiacomo.travaglini@arm.com2GiB boundary. This means that PCI memory is limited to 1GiB. 88413481Sgiacomo.travaglini@arm.com 88513481Sgiacomo.travaglini@arm.comMemory map: 88613481Sgiacomo.travaglini@arm.com 0x00000000-0x03ffffff: Boot memory (CS0) 88713481Sgiacomo.travaglini@arm.com 0x04000000-0x07ffffff: Reserved 88813481Sgiacomo.travaglini@arm.com 0x08000000-0x0bffffff: Reserved (CS0 alias) 88913481Sgiacomo.travaglini@arm.com 0x0c000000-0x0fffffff: Reserved (Off-chip, CS4) 89013481Sgiacomo.travaglini@arm.com 0x10000000-0x13ffffff: gem5-specific peripherals (Off-chip, CS5) 89113481Sgiacomo.travaglini@arm.com 0x10000000-0x1000ffff: gem5 energy controller 89213481Sgiacomo.travaglini@arm.com 0x10010000-0x1001ffff: gem5 pseudo-ops 89313481Sgiacomo.travaglini@arm.com 89413481Sgiacomo.travaglini@arm.com 0x14000000-0x17ffffff: Reserved (Off-chip, PSRAM, CS1) 89513481Sgiacomo.travaglini@arm.com 0x18000000-0x1bffffff: Reserved (Off-chip, Peripherals, CS2) 89613481Sgiacomo.travaglini@arm.com 0x1c000000-0x1fffffff: Peripheral block 1 (Off-chip, CS3): 89713481Sgiacomo.travaglini@arm.com 0x1c010000-0x1c01ffff: realview_io (VE system control regs.) 89813481Sgiacomo.travaglini@arm.com 0x1c060000-0x1c06ffff: KMI0 (keyboard) 89913481Sgiacomo.travaglini@arm.com 0x1c070000-0x1c07ffff: KMI1 (mouse) 90013481Sgiacomo.travaglini@arm.com 0x1c090000-0x1c09ffff: UART0 90113481Sgiacomo.travaglini@arm.com 0x1c0a0000-0x1c0affff: UART1 (reserved) 90213481Sgiacomo.travaglini@arm.com 0x1c0b0000-0x1c0bffff: UART2 (reserved) 90313481Sgiacomo.travaglini@arm.com 0x1c0c0000-0x1c0cffff: UART3 (reserved) 90413481Sgiacomo.travaglini@arm.com 0x1c130000-0x1c13ffff: VirtIO (gem5/FM extension) 90513481Sgiacomo.travaglini@arm.com 0x1c140000-0x1c14ffff: VirtIO (gem5/FM extension) 90613481Sgiacomo.travaglini@arm.com 0x1c170000-0x1c17ffff: RTC 90713481Sgiacomo.travaglini@arm.com 90813481Sgiacomo.travaglini@arm.com 0x20000000-0x3fffffff: On-chip peripherals: 90913481Sgiacomo.travaglini@arm.com 0x2b000000-0x2b00ffff: HDLCD 91013481Sgiacomo.travaglini@arm.com 91113481Sgiacomo.travaglini@arm.com 0x2c001000-0x2c001fff: GIC (distributor) 91213481Sgiacomo.travaglini@arm.com 0x2c002000-0x2c003fff: GIC (CPU interface) 91313481Sgiacomo.travaglini@arm.com 0x2c004000-0x2c005fff: vGIC (HV) 91413481Sgiacomo.travaglini@arm.com 0x2c006000-0x2c007fff: vGIC (VCPU) 91513481Sgiacomo.travaglini@arm.com 0x2c1c0000-0x2c1cffff: GICv2m MSI frame 0 91613481Sgiacomo.travaglini@arm.com 91713481Sgiacomo.travaglini@arm.com 0x2d000000-0x2d00ffff: GPU (reserved) 91813481Sgiacomo.travaglini@arm.com 91913481Sgiacomo.travaglini@arm.com 0x2f000000-0x2fffffff: PCI IO space 92013481Sgiacomo.travaglini@arm.com 0x30000000-0x3fffffff: PCI config space 92113481Sgiacomo.travaglini@arm.com 92213481Sgiacomo.travaglini@arm.com 0x40000000-0x7fffffff: Ext. AXI: Used as PCI memory 92313481Sgiacomo.travaglini@arm.com 92413481Sgiacomo.travaglini@arm.com 0x80000000-X: DRAM 92513481Sgiacomo.travaglini@arm.com 92613481Sgiacomo.travaglini@arm.comInterrupts: 92713481Sgiacomo.travaglini@arm.com 0- 15: Software generated interrupts (SGIs) 92813481Sgiacomo.travaglini@arm.com 16- 31: On-chip private peripherals (PPIs) 92913481Sgiacomo.travaglini@arm.com 25 : vgic 93013481Sgiacomo.travaglini@arm.com 26 : generic_timer (hyp) 93113481Sgiacomo.travaglini@arm.com 27 : generic_timer (virt) 93213481Sgiacomo.travaglini@arm.com 28 : Reserved (Legacy FIQ) 93313481Sgiacomo.travaglini@arm.com 29 : generic_timer (phys, sec) 93413481Sgiacomo.travaglini@arm.com 30 : generic_timer (phys, non-sec) 93513481Sgiacomo.travaglini@arm.com 31 : Reserved (Legacy IRQ) 93613481Sgiacomo.travaglini@arm.com 32- 95: Mother board peripherals (SPIs) 93713481Sgiacomo.travaglini@arm.com 32 : Reserved (SP805) 93813481Sgiacomo.travaglini@arm.com 33 : Reserved (IOFPGA SW int) 93913481Sgiacomo.travaglini@arm.com 34-35: Reserved (SP804) 94013481Sgiacomo.travaglini@arm.com 36 : RTC 94113481Sgiacomo.travaglini@arm.com 37-40: uart0-uart3 94213481Sgiacomo.travaglini@arm.com 41-42: Reserved (PL180) 94313481Sgiacomo.travaglini@arm.com 43 : Reserved (AACI) 94413481Sgiacomo.travaglini@arm.com 44-45: kmi0-kmi1 94513481Sgiacomo.travaglini@arm.com 46 : Reserved (CLCD) 94613481Sgiacomo.travaglini@arm.com 47 : Reserved (Ethernet) 94713481Sgiacomo.travaglini@arm.com 48 : Reserved (USB) 94813481Sgiacomo.travaglini@arm.com 95-255: On-chip interrupt sources (we use these for 94913481Sgiacomo.travaglini@arm.com gem5-specific devices, SPIs) 95013481Sgiacomo.travaglini@arm.com 74 : VirtIO (gem5/FM extension) 95113481Sgiacomo.travaglini@arm.com 75 : VirtIO (gem5/FM extension) 95213481Sgiacomo.travaglini@arm.com 95 : HDLCD 95313481Sgiacomo.travaglini@arm.com 96- 98: GPU (reserved) 95413481Sgiacomo.travaglini@arm.com 100-103: PCI 95513481Sgiacomo.travaglini@arm.com 256-319: MSI frame 0 (gem5-specific, SPIs) 95613481Sgiacomo.travaglini@arm.com 320-511: Unused 95713481Sgiacomo.travaglini@arm.com 95813481Sgiacomo.travaglini@arm.com """ 95913481Sgiacomo.travaglini@arm.com 96013481Sgiacomo.travaglini@arm.com # Everything above 2GiB is memory 96113481Sgiacomo.travaglini@arm.com _mem_regions = [ AddrRange('2GB', size='510GB') ] 96213481Sgiacomo.travaglini@arm.com 96313481Sgiacomo.travaglini@arm.com _off_chip_ranges = [ 96413481Sgiacomo.travaglini@arm.com # CS1-CS5 96513481Sgiacomo.travaglini@arm.com AddrRange(0x0c000000, 0x1fffffff), 96613481Sgiacomo.travaglini@arm.com # External AXI interface (PCI) 96713481Sgiacomo.travaglini@arm.com AddrRange(0x2f000000, 0x7fffffff), 96813481Sgiacomo.travaglini@arm.com ] 96913481Sgiacomo.travaglini@arm.com 97013481Sgiacomo.travaglini@arm.com # Platform control device (off-chip) 97113481Sgiacomo.travaglini@arm.com realview_io = RealViewCtrl(proc_id0=0x14000000, proc_id1=0x14000000, 97213481Sgiacomo.travaglini@arm.com idreg=0x02250000, pio_addr=0x1c010000) 97313481Sgiacomo.travaglini@arm.com mcc = VExpressMCC() 97413481Sgiacomo.travaglini@arm.com dcc = CoreTile2A15DCC() 97513481Sgiacomo.travaglini@arm.com 97613481Sgiacomo.travaglini@arm.com ### On-chip devices ### 97713481Sgiacomo.travaglini@arm.com generic_timer = GenericTimer(int_phys_s=ArmPPI(num=29), 97813481Sgiacomo.travaglini@arm.com int_phys_ns=ArmPPI(num=30), 97913481Sgiacomo.travaglini@arm.com int_virt=ArmPPI(num=27), 98013481Sgiacomo.travaglini@arm.com int_hyp=ArmPPI(num=26)) 98113481Sgiacomo.travaglini@arm.com 98213481Sgiacomo.travaglini@arm.com def _on_chip_devices(self): 98313481Sgiacomo.travaglini@arm.com return [ 98413481Sgiacomo.travaglini@arm.com self.generic_timer, 98513481Sgiacomo.travaglini@arm.com ] 98613481Sgiacomo.travaglini@arm.com 98713481Sgiacomo.travaglini@arm.com ### Off-chip devices ### 98813481Sgiacomo.travaglini@arm.com clock24MHz = SrcClockDomain(clock="24MHz", 98913481Sgiacomo.travaglini@arm.com voltage_domain=VoltageDomain(voltage="3.3V")) 99013481Sgiacomo.travaglini@arm.com 99113481Sgiacomo.travaglini@arm.com uart = [ 99213481Sgiacomo.travaglini@arm.com Pl011(pio_addr=0x1c090000, int_num=37), 99313481Sgiacomo.travaglini@arm.com ] 99413481Sgiacomo.travaglini@arm.com 99513481Sgiacomo.travaglini@arm.com kmi0 = Pl050(pio_addr=0x1c060000, int_num=44, ps2=PS2Keyboard()) 99613481Sgiacomo.travaglini@arm.com kmi1 = Pl050(pio_addr=0x1c070000, int_num=45, ps2=PS2TouchKit()) 99713481Sgiacomo.travaglini@arm.com 99813481Sgiacomo.travaglini@arm.com rtc = PL031(pio_addr=0x1c170000, int_num=36) 99913481Sgiacomo.travaglini@arm.com 100013481Sgiacomo.travaglini@arm.com ### gem5-specific off-chip devices ### 100113481Sgiacomo.travaglini@arm.com pci_host = GenericArmPciHost( 100213481Sgiacomo.travaglini@arm.com conf_base=0x30000000, conf_size='256MB', conf_device_bits=12, 100313481Sgiacomo.travaglini@arm.com pci_pio_base=0x2f000000, 100413481Sgiacomo.travaglini@arm.com int_policy="ARM_PCI_INT_DEV", int_base=100, int_count=4) 100513481Sgiacomo.travaglini@arm.com 100613481Sgiacomo.travaglini@arm.com energy_ctrl = EnergyCtrl(pio_addr=0x10000000) 100713481Sgiacomo.travaglini@arm.com 100813481Sgiacomo.travaglini@arm.com vio = [ 100913481Sgiacomo.travaglini@arm.com MmioVirtIO(pio_addr=0x1c130000, pio_size=0x1000, 101013481Sgiacomo.travaglini@arm.com interrupt=ArmSPI(num=74)), 101113481Sgiacomo.travaglini@arm.com MmioVirtIO(pio_addr=0x1c140000, pio_size=0x1000, 101213481Sgiacomo.travaglini@arm.com interrupt=ArmSPI(num=75)), 101313481Sgiacomo.travaglini@arm.com ] 101413481Sgiacomo.travaglini@arm.com 101513481Sgiacomo.travaglini@arm.com def _off_chip_devices(self): 101613481Sgiacomo.travaglini@arm.com return [ 101713481Sgiacomo.travaglini@arm.com self.realview_io, 101813481Sgiacomo.travaglini@arm.com self.uart[0], 101913481Sgiacomo.travaglini@arm.com self.kmi0, 102013481Sgiacomo.travaglini@arm.com self.kmi1, 102113481Sgiacomo.travaglini@arm.com self.rtc, 102213481Sgiacomo.travaglini@arm.com self.pci_host, 102313481Sgiacomo.travaglini@arm.com self.energy_ctrl, 102413481Sgiacomo.travaglini@arm.com self.clock24MHz, 102513481Sgiacomo.travaglini@arm.com self.vio[0], 102613481Sgiacomo.travaglini@arm.com self.vio[1], 102713481Sgiacomo.travaglini@arm.com ] 102813481Sgiacomo.travaglini@arm.com 102913481Sgiacomo.travaglini@arm.com def attachPciDevice(self, device, *args, **kwargs): 103013481Sgiacomo.travaglini@arm.com device.host = self.pci_host 103113481Sgiacomo.travaglini@arm.com self._attach_device(device, *args, **kwargs) 103213481Sgiacomo.travaglini@arm.com 103313481Sgiacomo.travaglini@arm.com def setupBootLoader(self, mem_bus, cur_sys, loc): 103413481Sgiacomo.travaglini@arm.com cur_sys.bootmem = SimpleMemory(range=AddrRange(0, size='64MB'), 103513481Sgiacomo.travaglini@arm.com conf_table_reported=False) 103613481Sgiacomo.travaglini@arm.com if mem_bus is not None: 103713481Sgiacomo.travaglini@arm.com cur_sys.bootmem.port = mem_bus.master 103813481Sgiacomo.travaglini@arm.com if not cur_sys.boot_loader: 103913481Sgiacomo.travaglini@arm.com cur_sys.boot_loader = [ loc('boot_emm.arm64'), loc('boot_emm.arm') ] 104013481Sgiacomo.travaglini@arm.com cur_sys.atags_addr = 0x8000000 104113481Sgiacomo.travaglini@arm.com cur_sys.load_offset = 0x80000000 104213481Sgiacomo.travaglini@arm.com 104313481Sgiacomo.travaglini@arm.com # Setup m5ops. It's technically not a part of the boot 104413481Sgiacomo.travaglini@arm.com # loader, but this is the only place we can configure the 104513481Sgiacomo.travaglini@arm.com # system. 104613481Sgiacomo.travaglini@arm.com cur_sys.m5ops_base = 0x10010000 104713481Sgiacomo.travaglini@arm.com 104813481Sgiacomo.travaglini@arm.com def generateDeviceTree(self, state): 104913481Sgiacomo.travaglini@arm.com # Generate using standard RealView function 105013481Sgiacomo.travaglini@arm.com dt = list(super(VExpress_GEM5_Base, self).generateDeviceTree(state)) 105113481Sgiacomo.travaglini@arm.com if len(dt) > 1: 105213481Sgiacomo.travaglini@arm.com raise Exception("System returned too many DT nodes") 105313481Sgiacomo.travaglini@arm.com node = dt[0] 105413481Sgiacomo.travaglini@arm.com 105513481Sgiacomo.travaglini@arm.com node.appendCompatible(["arm,vexpress"]) 105613481Sgiacomo.travaglini@arm.com node.append(FdtPropertyStrings("model", ["V2P-CA15"])) 105713481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("arm,hbi", [0x0])) 105813481Sgiacomo.travaglini@arm.com node.append(FdtPropertyWords("arm,vexpress,site", [0xf])) 105913481Sgiacomo.travaglini@arm.com 106013481Sgiacomo.travaglini@arm.com yield node 106113481Sgiacomo.travaglini@arm.com 106213481Sgiacomo.travaglini@arm.comclass VExpress_GEM5_V1_Base(VExpress_GEM5_Base): 106313481Sgiacomo.travaglini@arm.com gic = kvm_gicv2_class(dist_addr=0x2c001000, cpu_addr=0x2c002000, 106413481Sgiacomo.travaglini@arm.com it_lines=512) 106513481Sgiacomo.travaglini@arm.com vgic = VGic(vcpu_addr=0x2c006000, hv_addr=0x2c004000, ppint=25) 106613481Sgiacomo.travaglini@arm.com gicv2m = Gicv2m() 106713481Sgiacomo.travaglini@arm.com gicv2m.frames = [ 106813481Sgiacomo.travaglini@arm.com Gicv2mFrame(spi_base=256, spi_len=64, addr=0x2c1c0000), 106913481Sgiacomo.travaglini@arm.com ] 107013481Sgiacomo.travaglini@arm.com 107113481Sgiacomo.travaglini@arm.com def _on_chip_devices(self): 107213481Sgiacomo.travaglini@arm.com return super(VExpress_GEM5_V1_Base,self)._on_chip_devices() + [ 107313481Sgiacomo.travaglini@arm.com self.gic, self.vgic, self.gicv2m, 107413481Sgiacomo.travaglini@arm.com ] 107513481Sgiacomo.travaglini@arm.com 107613481Sgiacomo.travaglini@arm.comclass VExpress_GEM5_V1(VExpress_GEM5_V1_Base): 107713481Sgiacomo.travaglini@arm.com hdlcd = HDLcd(pxl_clk=VExpress_GEM5_V1_Base.dcc.osc_pxl, 107813481Sgiacomo.travaglini@arm.com pio_addr=0x2b000000, int_num=95) 107913481Sgiacomo.travaglini@arm.com 108013481Sgiacomo.travaglini@arm.com def _on_chip_devices(self): 108113481Sgiacomo.travaglini@arm.com return super(VExpress_GEM5_V1,self)._on_chip_devices() + [ 108213481Sgiacomo.travaglini@arm.com self.hdlcd, 108313481Sgiacomo.travaglini@arm.com ] 108413481Sgiacomo.travaglini@arm.com 108513481Sgiacomo.travaglini@arm.comclass VExpress_GEM5_V2_Base(VExpress_GEM5_Base): 108613481Sgiacomo.travaglini@arm.com gic = Gicv3() 108713481Sgiacomo.travaglini@arm.com 108813481Sgiacomo.travaglini@arm.com def _on_chip_devices(self): 108913481Sgiacomo.travaglini@arm.com return super(VExpress_GEM5_V2_Base,self)._on_chip_devices() + [ 109013481Sgiacomo.travaglini@arm.com self.gic, 109113481Sgiacomo.travaglini@arm.com ] 109213481Sgiacomo.travaglini@arm.com 109313481Sgiacomo.travaglini@arm.com def setupBootLoader(self, mem_bus, cur_sys, loc): 109413481Sgiacomo.travaglini@arm.com cur_sys.boot_loader = [ loc('boot_emm_v2.arm64') ] 109513481Sgiacomo.travaglini@arm.com super(VExpress_GEM5_V2_Base,self).setupBootLoader(mem_bus, 109613481Sgiacomo.travaglini@arm.com cur_sys, loc) 109713481Sgiacomo.travaglini@arm.com 109813481Sgiacomo.travaglini@arm.comclass VExpress_GEM5_V2(VExpress_GEM5_V2_Base): 109913481Sgiacomo.travaglini@arm.com hdlcd = HDLcd(pxl_clk=VExpress_GEM5_V2_Base.dcc.osc_pxl, 110013481Sgiacomo.travaglini@arm.com pio_addr=0x2b000000, int_num=95) 110113481Sgiacomo.travaglini@arm.com 110213481Sgiacomo.travaglini@arm.com def _on_chip_devices(self): 110313481Sgiacomo.travaglini@arm.com return super(VExpress_GEM5_V2,self)._on_chip_devices() + [ 110413481Sgiacomo.travaglini@arm.com self.hdlcd, 110513481Sgiacomo.travaglini@arm.com ] 110613481Sgiacomo.travaglini@arm.com