dev-arm: Add a VExpress_GEM5_V2 platform with GICv3 support

Change-Id: I6fd14138d94654e8e60cde08239ea9a50fc19eb7
Reviewed-on: https://gem5-review.googlesource.com/c/14255
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
This commit is contained in:
Jairo Balart
2018-11-13 10:58:31 +01:00
committed by Giacomo Travaglini
parent 93c7fa5731
commit 815dc6590f
2 changed files with 41 additions and 12 deletions

View File

@@ -330,7 +330,10 @@ def makeArmSystem(mem_mode, machine_type, num_cpus=1, mdesc=None,
self.realview.setupBootLoader(None, self, binary)
else:
self.realview.setupBootLoader(self.membus, self, binary)
self.gic_cpu_addr = self.realview.gic.cpu_addr
if hasattr(self.realview.gic, 'cpu_addr'):
self.gic_cpu_addr = self.realview.gic.cpu_addr
self.flags_addr = self.realview.realview_io.pio_addr + 0x30
# This check is for users who have previously put 'android' in

View File

@@ -853,7 +853,7 @@ class VExpress_EMM64(VExpress_EMM):
cur_sys.atags_addr = 0x8000000
cur_sys.load_offset = 0x80000000
class VExpress_GEM5_V1_Base(RealView):
class VExpress_GEM5_Base(RealView):
"""
The VExpress gem5 memory map is loosely based on a modified
Versatile Express RS1 memory map.
@@ -967,14 +967,6 @@ Interrupts:
dcc = CoreTile2A15DCC()
### On-chip devices ###
gic = kvm_gicv2_class(dist_addr=0x2c001000, cpu_addr=0x2c002000,
it_lines=512)
vgic = VGic(vcpu_addr=0x2c006000, hv_addr=0x2c004000, ppint=25)
gicv2m = Gicv2m()
gicv2m.frames = [
Gicv2mFrame(spi_base=256, spi_len=64, addr=0x2c1c0000),
]
generic_timer = GenericTimer(int_phys_s=ArmPPI(num=29),
int_phys_ns=ArmPPI(num=30),
int_virt=ArmPPI(num=27),
@@ -982,7 +974,6 @@ Interrupts:
def _on_chip_devices(self):
return [
self.gic, self.vgic, self.gicv2m,
self.generic_timer,
]
@@ -1049,7 +1040,7 @@ Interrupts:
def generateDeviceTree(self, state):
# Generate using standard RealView function
dt = list(super(VExpress_GEM5_V1_Base, self).generateDeviceTree(state))
dt = list(super(VExpress_GEM5_Base, self).generateDeviceTree(state))
if len(dt) > 1:
raise Exception("System returned too many DT nodes")
node = dt[0]
@@ -1061,6 +1052,19 @@ Interrupts:
yield node
class VExpress_GEM5_V1_Base(VExpress_GEM5_Base):
gic = kvm_gicv2_class(dist_addr=0x2c001000, cpu_addr=0x2c002000,
it_lines=512)
vgic = VGic(vcpu_addr=0x2c006000, hv_addr=0x2c004000, ppint=25)
gicv2m = Gicv2m()
gicv2m.frames = [
Gicv2mFrame(spi_base=256, spi_len=64, addr=0x2c1c0000),
]
def _on_chip_devices(self):
return super(VExpress_GEM5_V1_Base,self)._on_chip_devices() + [
self.gic, self.vgic, self.gicv2m,
]
class VExpress_GEM5_V1(VExpress_GEM5_V1_Base):
hdlcd = HDLcd(pxl_clk=VExpress_GEM5_V1_Base.dcc.osc_pxl,
@@ -1070,3 +1074,25 @@ class VExpress_GEM5_V1(VExpress_GEM5_V1_Base):
return super(VExpress_GEM5_V1,self)._on_chip_devices() + [
self.hdlcd,
]
class VExpress_GEM5_V2_Base(VExpress_GEM5_Base):
gic = Gicv3()
def _on_chip_devices(self):
return super(VExpress_GEM5_V2_Base,self)._on_chip_devices() + [
self.gic,
]
def setupBootLoader(self, mem_bus, cur_sys, loc):
cur_sys.boot_loader = [ loc('boot_emm_v2.arm64') ]
super(VExpress_GEM5_V2_Base,self).setupBootLoader(mem_bus,
cur_sys, loc)
class VExpress_GEM5_V2(VExpress_GEM5_V2_Base):
hdlcd = HDLcd(pxl_clk=VExpress_GEM5_V2_Base.dcc.osc_pxl,
pio_addr=0x2b000000, int_num=95)
def _on_chip_devices(self):
return super(VExpress_GEM5_V2,self)._on_chip_devices() + [
self.hdlcd,
]