summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dev/arm/gpu_nomali.cc33
-rw-r--r--src/dev/arm/gpu_nomali.hh22
2 files changed, 55 insertions, 0 deletions
diff --git a/src/dev/arm/gpu_nomali.cc b/src/dev/arm/gpu_nomali.cc
index 3f074b595..da0f43ef9 100644
--- a/src/dev/arm/gpu_nomali.cc
+++ b/src/dev/arm/gpu_nomali.cc
@@ -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
{
@@ -268,6 +287,12 @@ NoMaliGpu::onInterrupt(nomali_int_t intno, bool set)
}
void
+NoMaliGpu::onReset()
+{
+ DPRINTF(NoMali, "Reset\n");
+}
+
+void
NoMaliGpu::setCallback(const nomali_callback_t &callback)
{
DPRINTF(NoMali, "Registering callback %i\n",
@@ -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()
{
diff --git a/src/dev/arm/gpu_nomali.hh b/src/dev/arm/gpu_nomali.hh
index eaf7f37cb..06e0826c4 100644
--- a/src/dev/arm/gpu_nomali.hh
+++ b/src/dev/arm/gpu_nomali.hh
@@ -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;