summaryrefslogtreecommitdiff
path: root/src/dev/arm
diff options
context:
space:
mode:
authorGiacomo Travaglini <giacomo.travaglini@arm.com>2019-08-12 15:07:15 +0100
committerGiacomo Travaglini <giacomo.travaglini@arm.com>2019-11-01 09:41:29 +0000
commit092ab7f5ca37f0dbaa73446ac0a0db394ae83acc (patch)
treed786f3592943cb3310eebb62539ffd28f0271352 /src/dev/arm
parent0464696e29c1f8fc726a5aeb7522859a1f6b1379 (diff)
downloadgem5-092ab7f5ca37f0dbaa73446ac0a0db394ae83acc.tar.xz
dev-arm: Add SMMUv3 to VExpress_GEM5_V*
The VExpress_GEM5_V* Platforms will now optionally make use of the SMMUv3. In order to attach a devices to it, a user must simply use the attachSmmu method, making sure the device it is not part of the _on_chip_devices(). Change-Id: Ib819eb50d43dba1f5e5d1a1f7159ac4fbaccff6e Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com> Reviewed-by: Ciro Santilli <ciro.santilli@arm.com> Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/21559 Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Maintainer: Andreas Sandberg <andreas.sandberg@arm.com> Tested-by: kokoro <noreply+kokoro@google.com>
Diffstat (limited to 'src/dev/arm')
-rw-r--r--src/dev/arm/RealView.py28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/dev/arm/RealView.py b/src/dev/arm/RealView.py
index 6a45d3499..440720642 100644
--- a/src/dev/arm/RealView.py
+++ b/src/dev/arm/RealView.py
@@ -66,6 +66,7 @@ from m5.objects.ClockedObject import ClockedObject
from m5.objects.PS2 import *
from m5.objects.VirtIOMMIO import MmioVirtIO
from m5.objects.Display import Display, Display1080p
+from m5.objects.SMMUv3 import SMMUv3
# Platforms with KVM support should generally use in-kernel GIC
# emulation. Use a GIC model that automatically switches between
@@ -820,6 +821,8 @@ Memory map:
0x20000000-0x3fffffff: On-chip peripherals:
0x2b000000-0x2b00ffff: HDLCD
+ 0x2b400000-0x2b41ffff: SMMUv3
+
0x2c001000-0x2c001fff: GIC (distributor)
0x2c002000-0x2c003fff: GIC (CPU interface)
0x2c004000-0x2c005fff: vGIC (HV)
@@ -951,6 +954,31 @@ Interrupts:
device.host = self.pci_host
self._attach_device(device, *args, **kwargs)
+ def attachSmmu(self, devices, bus):
+ """
+ Instantiate a single SMMU and attach a group of client devices to it.
+ The devices' dma port is wired to the SMMU and the SMMU's dma port
+ (master) is attached to the bus. In order to make it work, the list
+ of clients shouldn't contain any device part of the _off_chip_devices
+ or _on_chip_devices.
+ This method should be called only once.
+
+ Parameters:
+ devices (list): List of devices which will be using the SMMU
+ bus (Bus): The bus downstream of the SMMU. Its slave port will
+ receive memory requests from the SMMU, and its master
+ port will forward accesses to the memory mapped devices
+ """
+ if hasattr(self, 'smmu'):
+ m5.fatal("A SMMU has already been instantiated\n")
+
+ self.smmu = SMMUv3(reg_map=AddrRange(0x2b400000, size=0x00020000))
+
+ dma_ports = []
+ for dev in devices:
+ self._attach_device(dev, bus, dma_ports)
+ self.smmu.connect(dev, bus)
+
def setupBootLoader(self, cur_sys, loc):
if not cur_sys.boot_loader:
cur_sys.boot_loader = [ loc('boot_emm.arm64'), loc('boot_emm.arm') ]