dev, arm: Implement the NoMali reset callback
authorAndreas Sandberg <andreas.sandberg@arm.com>
Tue, 23 Feb 2016 11:49:35 +0000 (11:49 +0000)
committerAndreas Sandberg <andreas.sandberg@arm.com>
Tue, 23 Feb 2016 11:49:35 +0000 (11:49 +0000)
Add a callback handler for the NoMali reset callback. This callback is
called whenever the GPU is reset using the register interface or the
NoMali API. The callback can be used to override ID registers using
the raw register API.

src/dev/arm/gpu_nomali.cc
src/dev/arm/gpu_nomali.hh

index 3f074b5954713a2f5e4038614b11a69f73b8034b..da0f43ef9649727ddbba21b82c3aaba819d6e571 100644 (file)
@@ -92,6 +92,13 @@ NoMaliGpu::NoMaliGpu(const NoMaliGpuParams *p)
     cbk_int.func.interrupt = NoMaliGpu::_interrupt;
     setCallback(cbk_int);
 
+    /* Setup a reset callback */
+    nomali_callback_t cbk_rst;
+    cbk_rst.type = NOMALI_CALLBACK_RESET;
+    cbk_rst.usr = (void *)this;
+    cbk_rst.func.reset = NoMaliGpu::_reset;
+    setCallback(cbk_rst);
+
     panicOnErr(
         nomali_get_info(nomali, &nomaliInfo),
         "Failed to get NoMali information struct");
@@ -102,6 +109,18 @@ NoMaliGpu::~NoMaliGpu()
     nomali_destroy(nomali);
 }
 
+
+void
+NoMaliGpu::init()
+{
+    PioDevice::init();
+
+    /* Reset the GPU here since the reset callback won't have been
+     * installed when the GPU was reset at instantiation time.
+     */
+    reset();
+}
+
 void
 NoMaliGpu::serialize(CheckpointOut &cp) const
 {
@@ -267,6 +286,12 @@ NoMaliGpu::onInterrupt(nomali_int_t intno, bool set)
         platform->gic->clearInt(it_int->second);
 }
 
+void
+NoMaliGpu::onReset()
+{
+    DPRINTF(NoMali, "Reset\n");
+}
+
 void
 NoMaliGpu::setCallback(const nomali_callback_t &callback)
 {
@@ -287,6 +312,14 @@ NoMaliGpu::_interrupt(nomali_handle_t h, void *usr,
     _this->onInterrupt(intno, !!set);
 }
 
+void
+NoMaliGpu::_reset(nomali_handle_t h, void *usr)
+{
+    NoMaliGpu *_this(static_cast<NoMaliGpu *>(usr));
+
+    _this->onReset();
+}
+
 NoMaliGpu *
 NoMaliGpuParams::create()
 {
index eaf7f37cb12ea9d2c98937258f33aa4040b1db7d..06e0826c4b008c8adb64169a46234e8bb3af1c13 100644 (file)
@@ -54,6 +54,8 @@ class NoMaliGpu : public PioDevice
     NoMaliGpu(const NoMaliGpuParams *p);
     virtual ~NoMaliGpu();
 
+    void init() override;
+
   public: /* Checkpointing */
     void serialize(CheckpointOut &cp) const override;
     void unserialize(CheckpointIn &cp) override;
@@ -126,6 +128,14 @@ class NoMaliGpu : public PioDevice
      */
     virtual void onInterrupt(nomali_int_t intno, bool set);
 
+    /**
+     * Reset callback from the NoMali library
+     *
+     * This method is called whenever the GPU is reset through the
+     * register interface or the API (reset() or nomali_reset()).
+     */
+    virtual void onReset();
+
     /** @} */
 
   private: /* Callback helpers */
@@ -145,6 +155,18 @@ class NoMaliGpu : public PioDevice
      */
     static void _interrupt(nomali_handle_t h, void *usr,
                            nomali_int_t intno, int set);
+
+    /**
+     * Reset callback from the NoMali library.
+     *
+     * This method calls onReset() on the NoMaliGpu owning this
+     * device.
+     *
+     * @param h NoMali library handle.
+     * @param usr Pointer to an instance of the NoMaliGpu
+     */
+    static void _reset(nomali_handle_t h, void *usr);
+
   protected:
     /** Device base address */
     const Addr pioAddr;