changeset 8bc53d5565ba in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=8bc53d5565ba
description:
        dev, arm: Add a customizable NoMali GPU model

        Add a customizable NoMali GPU model and an example Mali T760
        configuration. Unlike the normal NoMali model (NoMaliGpu), the
        NoMaliCustopmGpu model exposes all the important GPU ID registers to
        Python. This makes it possible to implement custom GPU configurations
        by without changing the underlying NoMali library.

        Change-Id: I4fdba05844c3589893aa1a4c11dc376ec33d4e9e
        Signed-off-by: Andreas Sandberg <andreas.sandb...@arm.com>
        Reviewed-by: Andreas Hansson <andreas.hans...@arm.com>

diffstat:

 src/dev/arm/NoMali.py     |  66 ++++++++++++++++++++++++++++++++++++++++++++++-
 src/dev/arm/gpu_nomali.cc |  65 ++++++++++++++++++++++++++++++++++++++++++++++
 src/dev/arm/gpu_nomali.hh |  15 ++++++++++
 3 files changed, 145 insertions(+), 1 deletions(-)

diffs (191 lines):

diff -r 37b0af2c7ba8 -r 8bc53d5565ba src/dev/arm/NoMali.py
--- a/src/dev/arm/NoMali.py     Fri Sep 02 14:58:15 2016 +0100
+++ b/src/dev/arm/NoMali.py     Tue Sep 06 10:22:38 2016 +0100
@@ -1,4 +1,4 @@
-# Copyright (c) 2014-2015 ARM Limited
+# Copyright (c) 2014-2016 ARM Limited
 # All rights reserved.
 #
 # The license below extends only to copyright in the software and shall
@@ -61,3 +61,67 @@
     int_gpu = Param.UInt32("Interrupt number for GPU interrupts")
     int_job = Param.UInt32("Interrupt number for JOB interrupts")
     int_mmu = Param.UInt32("Interrupt number for MMU interrupts")
+
+class CustomNoMaliGpu(NoMaliGpu):
+    """Base class for custom NoMali implementation that need to override
+    configuration registers. See CustomNoMaliT760 for a usage example.
+
+    """
+
+    type = 'CustomNoMaliGpu'
+    cxx_header = "dev/arm/gpu_nomali.hh"
+
+    gpu_id = Param.UInt32("")
+    l2_features = Param.UInt32("")
+    tiler_features = Param.UInt32("")
+    mem_features = Param.UInt32("")
+    mmu_features = Param.UInt32("")
+    as_present = Param.UInt32("")
+    js_present = Param.UInt32("")
+
+    thread_max_threads = Param.UInt32("")
+    thread_max_workgroup_size = Param.UInt32("")
+    thread_max_barrier_size = Param.UInt32("")
+    thread_features = Param.UInt32("")
+
+    texture_features = VectorParam.UInt32("")
+    js_features = VectorParam.UInt32("")
+
+    shader_present = Param.UInt64("")
+    tiler_present = Param.UInt64("")
+    l2_present = Param.UInt64("")
+
+class CustomNoMaliT760(CustomNoMaliGpu):
+    """Example NoMali T760 r0p0-0 configuration using the defaults from
+    the NoMali library.
+
+    """
+
+    gpu_id = 0x07500000
+
+    l2_features = 0x07130206
+    tiler_features = 0x00000809
+    mem_features = 0x00000001
+    mmu_features = 0x00002830
+    as_present = 0x000000ff
+    js_present = 0x00000007
+
+    thread_max_threads = 0x00000100
+    thread_max_workgroup_size = 0x00000100
+    thread_max_barrier_size = 0x00000100
+    thread_features = 0x0a040400
+
+    texture_features = [
+        0x00fe001e,
+        0x0000ffff,
+        0x9f81ffff,
+    ]
+    js_features = [
+        0x0000020e,
+        0x000001fe,
+        0x0000007e,
+    ]
+
+    shader_present = 0x0000000f
+    tiler_present = 0x00000001
+    l2_present = 0x00000001
diff -r 37b0af2c7ba8 -r 8bc53d5565ba src/dev/arm/gpu_nomali.cc
--- a/src/dev/arm/gpu_nomali.cc Fri Sep 02 14:58:15 2016 +0100
+++ b/src/dev/arm/gpu_nomali.cc Tue Sep 06 10:22:38 2016 +0100
@@ -44,6 +44,8 @@
 #include "dev/arm/realview.hh"
 #include "enums/MemoryMode.hh"
 #include "mem/packet_access.hh"
+#include "nomali/lib/mali_midg_regmap.h"
+#include "params/CustomNoMaliGpu.hh"
 #include "params/NoMaliGpu.hh"
 
 static const std::map<Enums::NoMaliGpuType, nomali_gpu_type_t> gpuTypeMap{
@@ -320,8 +322,71 @@
     _this->onReset();
 }
 
+
+CustomNoMaliGpu::CustomNoMaliGpu(const CustomNoMaliGpuParams *p)
+    : NoMaliGpu(p),
+      idRegs{
+        { GPU_CONTROL_REG(GPU_ID), p->gpu_id },
+        { GPU_CONTROL_REG(L2_FEATURES), p->l2_features },
+        { GPU_CONTROL_REG(TILER_FEATURES), p->tiler_features },
+        { GPU_CONTROL_REG(MEM_FEATURES), p->mem_features },
+        { GPU_CONTROL_REG(MMU_FEATURES), p->mmu_features },
+        { GPU_CONTROL_REG(AS_PRESENT), p->as_present },
+        { GPU_CONTROL_REG(JS_PRESENT), p->js_present },
+
+        { GPU_CONTROL_REG(THREAD_MAX_THREADS), p->thread_max_threads },
+        { GPU_CONTROL_REG(THREAD_MAX_WORKGROUP_SIZE),
+          p->thread_max_workgroup_size },
+        { GPU_CONTROL_REG(THREAD_MAX_BARRIER_SIZE),
+          p->thread_max_barrier_size },
+        { GPU_CONTROL_REG(THREAD_FEATURES), p->thread_features },
+
+        { GPU_CONTROL_REG(SHADER_PRESENT_LO), bits(p->shader_present, 31, 0) },
+        { GPU_CONTROL_REG(SHADER_PRESENT_HI), bits(p->shader_present, 63, 32) 
},
+        { GPU_CONTROL_REG(TILER_PRESENT_LO), bits(p->tiler_present, 31, 0) },
+        { GPU_CONTROL_REG(TILER_PRESENT_HI), bits(p->tiler_present, 63, 32) },
+        { GPU_CONTROL_REG(L2_PRESENT_LO), bits(p->l2_present, 31, 0) },
+        { GPU_CONTROL_REG(L2_PRESENT_HI), bits(p->l2_present, 63, 32) },
+      }
+{
+    fatal_if(p->texture_features.size() > 3,
+             "Too many texture feature registers specified (%i)\n",
+             p->texture_features.size());
+
+    fatal_if(p->js_features.size() > 16,
+             "Too many job slot feature registers specified (%i)\n",
+             p->js_features.size());
+
+    for (int i = 0; i < p->texture_features.size(); i++)
+        idRegs[TEXTURE_FEATURES_REG(i)] = p->texture_features[i];
+
+    for (int i = 0; i < p->js_features.size(); i++)
+        idRegs[JS_FEATURES_REG(i)] = p->js_features[i];
+}
+
+CustomNoMaliGpu::~CustomNoMaliGpu()
+{
+}
+
+void
+CustomNoMaliGpu::onReset()
+{
+    NoMaliGpu::onReset();
+
+    for (const auto &reg : idRegs)
+        writeRegRaw(reg.first, reg.second);
+}
+
+
+
 NoMaliGpu *
 NoMaliGpuParams::create()
 {
     return new NoMaliGpu(this);
 }
+
+CustomNoMaliGpu *
+CustomNoMaliGpuParams::create()
+{
+    return new CustomNoMaliGpu(this);
+}
diff -r 37b0af2c7ba8 -r 8bc53d5565ba src/dev/arm/gpu_nomali.hh
--- a/src/dev/arm/gpu_nomali.hh Fri Sep 02 14:58:15 2016 +0100
+++ b/src/dev/arm/gpu_nomali.hh Tue Sep 06 10:22:38 2016 +0100
@@ -46,6 +46,7 @@
 #include "libnomali/nomali.h"
 
 class NoMaliGpuParams;
+class CustomNoMaliGpuParams;
 class RealView;
 
 class NoMaliGpu : public PioDevice
@@ -186,4 +187,18 @@
 };
 
 
+class CustomNoMaliGpu : public NoMaliGpu
+{
+  public:
+    CustomNoMaliGpu(const CustomNoMaliGpuParams *p);
+    virtual ~CustomNoMaliGpu();
+
+  protected:
+    void onReset() override;
+
+  private:
+    /** Map between GPU registers and their custom reset values */
+    std::map<nomali_addr_t, uint32_t> idRegs;
+};
+
 #endif // __DEV_ARM_NOMALI_GPU_HH__
_______________________________________________
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to