Giacomo Travaglini has submitted this change and it was merged. ( https://gem5-review.googlesource.com/c/public/gem5/+/18391 )

Change subject: dev-arm: Add GICv4 extension switch in GICv3
......................................................................

dev-arm: Add GICv4 extension switch in GICv3

This is currently used only for determining which is the correct
size of redistributors in memory (256KB in GICv4 and 128KB in GICv3)

Change-Id: I2c07005e97167fde03548313c9927176788f31dd
Signed-off-by: Giacomo Travaglini <[email protected]>
Reviewed-by: Andreas Sandberg <[email protected]>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/18391
Maintainer: Andreas Sandberg <[email protected]>
Tested-by: kokoro <[email protected]>
---
M src/dev/arm/Gic.py
M src/dev/arm/gic_v3.cc
M src/dev/arm/gic_v3.hh
M src/dev/arm/gic_v3_redistributor.cc
M src/dev/arm/gic_v3_redistributor.hh
5 files changed, 22 insertions(+), 12 deletions(-)

Approvals:
  Andreas Sandberg: Looks good to me, approved; Looks good to me, approved
  kokoro: Regressions pass



diff --git a/src/dev/arm/Gic.py b/src/dev/arm/Gic.py
index 8bc155f..63ecc92 100644
--- a/src/dev/arm/Gic.py
+++ b/src/dev/arm/Gic.py
@@ -182,3 +182,5 @@
     cpu_max = Param.Unsigned(256,
         "Maximum number of PE. This is affecting the maximum number of "
         "redistributors")
+
+    gicv4 = Param.Bool(True, "GICv4 extension available")
diff --git a/src/dev/arm/gic_v3.cc b/src/dev/arm/gic_v3.cc
index cfc7df5..2832d33 100644
--- a/src/dev/arm/gic_v3.cc
+++ b/src/dev/arm/gic_v3.cc
@@ -48,12 +48,6 @@
 void
 Gicv3::init()
 {
-    distRange = RangeSize(params()->dist_addr,
-                          Gicv3Distributor::ADDR_RANGE_SIZE - 1);
-    redistRange = RangeSize(params()->redist_addr,
-        Gicv3Redistributor::ADDR_RANGE_SIZE * sys->numContexts() - 1);
-    addrRanges = {distRange, redistRange};
-    BaseGic::init();
     distributor = new Gicv3Distributor(this, params()->it_lines);
     redistributors.resize(sys->numContexts(), nullptr);
     cpuInterfaces.resize(sys->numContexts(), nullptr);
@@ -68,12 +62,23 @@
         cpuInterfaces[i] = new Gicv3CPUInterface(this, i);
     }

+    distRange = RangeSize(params()->dist_addr,
+        Gicv3Distributor::ADDR_RANGE_SIZE - 1);
+
+    redistSize = redistributors[0]->addrRangeSize;
+    redistRange = RangeSize(params()->redist_addr,
+         redistSize * sys->numContexts() - 1);
+
+    addrRanges = {distRange, redistRange};
+
     distributor->init();

     for (int i = 0; i < sys->numContexts(); i++) {
         redistributors[i]->init();
         cpuInterfaces[i]->init();
     }
+
+    BaseGic::init();
 }

 void
@@ -107,8 +112,8 @@
     } else if (redistRange.contains(addr)) {
         Addr daddr = addr - redistRange.start();
         uint32_t redistributor_id =
-            daddr / Gicv3Redistributor::ADDR_RANGE_SIZE;
-        daddr = daddr % Gicv3Redistributor::ADDR_RANGE_SIZE;
+            daddr / redistSize;
+        daddr = daddr % redistSize;
         panic_if(redistributor_id >= redistributors.size(),
                  "Invalid redistributor_id!");
panic_if(!redistributors[redistributor_id], "Redistributor is null!");
@@ -148,8 +153,8 @@
     } else if (redistRange.contains(addr)) {
         Addr daddr = addr - redistRange.start();
         uint32_t redistributor_id =
-            daddr / Gicv3Redistributor::ADDR_RANGE_SIZE;
-        daddr = daddr % Gicv3Redistributor::ADDR_RANGE_SIZE;
+            daddr / redistSize;
+        daddr = daddr % redistSize;
         panic_if(redistributor_id >= redistributors.size(),
                  "Invalid redistributor_id!");
panic_if(!redistributors[redistributor_id], "Redistributor is null!");
diff --git a/src/dev/arm/gic_v3.hh b/src/dev/arm/gic_v3.hh
index 3a1a876..48cc520 100644
--- a/src/dev/arm/gic_v3.hh
+++ b/src/dev/arm/gic_v3.hh
@@ -42,6 +42,7 @@
 {
   protected:
     friend class Gicv3CPUInterface;
+    friend class Gicv3Redistributor;

     typedef Gicv3Params Params;
     Gicv3Distributor * distributor;
@@ -50,6 +51,7 @@
     AddrRange distRange;
     AddrRange redistRange;
     AddrRangeList addrRanges;
+    uint64_t redistSize;

   public:

diff --git a/src/dev/arm/gic_v3_redistributor.cc b/src/dev/arm/gic_v3_redistributor.cc
index 01ec9c5..eb5767a 100644
--- a/src/dev/arm/gic_v3_redistributor.cc
+++ b/src/dev/arm/gic_v3_redistributor.cc
@@ -51,7 +51,8 @@
       irqPriority(Gicv3::SGI_MAX + Gicv3::PPI_MAX),
       irqConfig(Gicv3::SGI_MAX + Gicv3::PPI_MAX),
       irqGrpmod(Gicv3::SGI_MAX + Gicv3::PPI_MAX),
-      irqNsacr(Gicv3::SGI_MAX + Gicv3::PPI_MAX)
+      irqNsacr(Gicv3::SGI_MAX + Gicv3::PPI_MAX),
+      addrRangeSize(gic->params()->gicv4 ? 0x40000 : 0x20000)
 {
 }

diff --git a/src/dev/arm/gic_v3_redistributor.hh b/src/dev/arm/gic_v3_redistributor.hh
index 578cba1..36504be 100644
--- a/src/dev/arm/gic_v3_redistributor.hh
+++ b/src/dev/arm/gic_v3_redistributor.hh
@@ -177,7 +177,7 @@
      * Note this must match with DTB/DTS GIC node definition and boot
      * loader code.
      */
-    static const uint32_t ADDR_RANGE_SIZE = 0x40000;
+    const uint32_t addrRangeSize;

     static const uint32_t SMALLEST_LPI_ID = 8192;


--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/18391
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: I2c07005e97167fde03548313c9927176788f31dd
Gerrit-Change-Number: 18391
Gerrit-PatchSet: 2
Gerrit-Owner: Giacomo Travaglini <[email protected]>
Gerrit-Reviewer: Andreas Sandberg <[email protected]>
Gerrit-Reviewer: Giacomo Travaglini <[email protected]>
Gerrit-Reviewer: kokoro <[email protected]>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to