Hello Giacomo Travaglini,
I'd like you to do a code review. Please visit
https://gem5-review.googlesource.com/c/public/gem5/+/13597
to review the following change.
Change subject: config: Create ArmRubySystem by refactoring SimpleSystem
......................................................................
config: Create ArmRubySystem by refactoring SimpleSystem
This patch is taking out non-memory related functionalities from
SimpleSystem in configs/arm/devices.py so that it can be inherited
by a new ArmRubySystem class. In this way we can instantiate
ArmSimpleSystem for systems using the legacy memory subsystem
and ArmRubySystem for systems using ruby.
Change-Id: Ida85924052f2de07e7e1a024f32482363f976d1a
Signed-off-by: Giacomo Travaglini <[email protected]>
Signed-off-by: Nikos Nikoleris <[email protected]>
---
M configs/example/arm/devices.py
M configs/example/arm/fs_bigLITTLE.py
M configs/example/arm/starter_fs.py
3 files changed, 71 insertions(+), 38 deletions(-)
diff --git a/configs/example/arm/devices.py b/configs/example/arm/devices.py
index 15492cb..6b98850 100644
--- a/configs/example/arm/devices.py
+++ b/configs/example/arm/devices.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2016-2017 ARM Limited
+# Copyright (c) 2016-2018 ARM Limited
# All rights reserved.
#
# The license below extends only to copyright in the software and shall
@@ -163,6 +163,13 @@
for cpu in self.cpus:
cpu.connectAllPorts(bus)
+ def connectRubySide(self, system):
+ for idx, cpu in enumerate(self.cpus):
+ cpu.icache_port = system.ruby._cpu_ports[idx].slave
+ cpu.dcache_port = system.ruby._cpu_ports[idx].slave
+ cpu.itb.walker.port = system.ruby._cpu_ports[idx].slave
+ cpu.dtb.walker.port = system.ruby._cpu_ports[idx].slave
+
class AtomicCluster(CpuCluster):
def __init__(self, system, num_cpus, cpu_clock, cpu_voltage="1.0V"):
@@ -180,12 +187,11 @@
def addL1(self):
pass
-
-class SimpleSystem(LinuxArmSystem):
+class ArmBaseSystem(LinuxArmSystem):
cache_line_size = 64
- def __init__(self, caches, mem_size, **kwargs):
- super(SimpleSystem, self).__init__(**kwargs)
+ def __init__(self, mem_size, **kwargs):
+ super(ArmBaseSystem, self).__init__(**kwargs)
self.voltage_domain = VoltageDomain(voltage="1.0V")
self.clk_domain = SrcClockDomain(clock="1GHz",
@@ -196,20 +202,41 @@
self.gic_cpu_addr = self.realview.gic.cpu_addr
self.flags_addr = self.realview.realview_io.pio_addr + 0x30
- self.membus = MemBus()
-
self.intrctrl = IntrControl()
self.terminal = Terminal()
self.vncserver = VncServer()
self.iobus = IOXBar()
- # CPUs->PIO
- self.iobridge = Bridge(delay='50ns')
# Device DMA -> MEM
mem_range = self.realview._mem_regions[0]
mem_range_size = long(mem_range[1]) - long(mem_range[0])
assert mem_range_size >= long(Addr(mem_size))
self.mem_ranges = [ AddrRange(start=mem_range[0], size=mem_size) ]
+
+ self._pci_devices = 0
+ self._clusters = []
+ self._num_cpus = 0
+
+ def numCpuClusters(self):
+ return len(self._clusters)
+
+ def addCpuCluster(self, cpu_cluster, num_cpus):
+ assert cpu_cluster not in self._clusters
+ assert num_cpus > 0
+ self._clusters.append(cpu_cluster)
+ self._num_cpus += num_cpus
+
+ def numCpus(self):
+ return self._num_cpus
+
+class ArmSimpleSystem(ArmBaseSystem):
+ def __init__(self, caches, mem_size, **kwargs):
+ super(ArmSimpleSystem, self).__init__(mem_size, **kwargs)
+
+ self.membus = MemBus()
+ # CPUs->PIO
+ self.iobridge = Bridge(delay='50ns')
+
self._caches = caches
if self._caches:
self.iocache = IOCache(addr_ranges=[self.mem_ranges[0]])
@@ -217,15 +244,6 @@
self.dmabridge = Bridge(delay='50ns',
ranges=[self.mem_ranges[0]])
- self._pci_devices = 0
- self._clusters = []
- self._num_cpus = 0
-
- def attach_pci(self, dev):
- dev.pci_bus, dev.pci_dev, dev.pci_func = (0, self._pci_devices +
1, 0)
- self._pci_devices += 1
- self.realview.attachPciDevice(dev, self.iobus)
-
def connect(self):
self.iobridge.master = self.iobus.slave
self.iobridge.slave = self.membus.master
@@ -242,17 +260,10 @@
self.realview.attachIO(self.iobus)
self.system_port = self.membus.slave
- def numCpuClusters(self):
- return len(self._clusters)
-
- def addCpuCluster(self, cpu_cluster, num_cpus):
- assert cpu_cluster not in self._clusters
- assert num_cpus > 0
- self._clusters.append(cpu_cluster)
- self._num_cpus += num_cpus
-
- def numCpus(self):
- return self._num_cpus
+ def attach_pci(self, dev):
+ dev.pci_bus, dev.pci_dev, dev.pci_func = (0, self._pci_devices +
1, 0)
+ self._pci_devices += 1
+ self.realview.attachPciDevice(dev, self.iobus)
def addCaches(self, need_caches, last_cache_level):
if not need_caches:
@@ -280,3 +291,25 @@
# connect each cluster to the memory hierarchy
for cluster in self._clusters:
cluster.connectMemSide(cluster_mem_bus)
+
+class ArmRubySystem(ArmBaseSystem):
+ def __init__(self, mem_size, **kwargs):
+ super(ArmRubySystem, self).__init__(mem_size, **kwargs)
+
+ self._dma_ports = [ ]
+ self.highest_el_is_64 = True
+ self.machine_type = 'DTOnly'
+
+ def connect(self):
+ self.realview.attachOnChipIO(self.iobus, dma_ports=self._dma_ports)
+ self.realview.attachIO(self.iobus, dma_ports=self._dma_ports)
+
+ def attach_pci(self, dev):
+ dev.pci_bus, dev.pci_dev, dev.pci_func = (0, self._pci_devices +
1, 0)
+ self._pci_devices += 1
+ self.realview.attachPciDevice(dev, self.iobus,
+ dma_ports=self._dma_ports)
+
+ def connectRubySide(self):
+ for cluster in self._clusters:
+ cluster.connectRubySide(self)
diff --git a/configs/example/arm/fs_bigLITTLE.py
b/configs/example/arm/fs_bigLITTLE.py
index 7d66c03..6c6de27 100644
--- a/configs/example/arm/fs_bigLITTLE.py
+++ b/configs/example/arm/fs_bigLITTLE.py
@@ -114,9 +114,9 @@
cpu_voltage, *cpu_config)
def createSystem(caches, kernel, bootscript, disks=[]):
- sys = devices.SimpleSystem(caches, default_mem_size,
- kernel=SysPaths.binary(kernel),
- readfile=bootscript)
+ sys = devices.ArmSimpleSystem(caches, default_mem_size,
+ kernel=SysPaths.binary(kernel),
+ readfile=bootscript)
sys.mem_ctrls = [ SimpleMemory(range=r, port=sys.membus.master)
for r in sys.mem_ranges ]
diff --git a/configs/example/arm/starter_fs.py
b/configs/example/arm/starter_fs.py
index a199768..3b1e121 100644
--- a/configs/example/arm/starter_fs.py
+++ b/configs/example/arm/starter_fs.py
@@ -107,12 +107,12 @@
# Only simulate caches when using a timing CPU (e.g., the HPI model)
want_caches = True if mem_mode == "timing" else False
- system = devices.SimpleSystem(want_caches,
- args.mem_size,
- mem_mode=mem_mode,
- dtb_filename=dtb_file,
- kernel=SysPaths.binary(args.kernel),
- readfile=args.script)
+ system = devices.ArmSimpleSystem(want_caches,
+ args.mem_size,
+ mem_mode=mem_mode,
+ dtb_filename=dtb_file,
+ kernel=SysPaths.binary(args.kernel),
+ readfile=args.script)
MemConfig.config_mem(args, system)
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/13597
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: Ida85924052f2de07e7e1a024f32482363f976d1a
Gerrit-Change-Number: 13597
Gerrit-PatchSet: 1
Gerrit-Owner: Nikos Nikoleris <[email protected]>
Gerrit-Reviewer: Giacomo Travaglini <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev