We can not defere the readback of the registers as the values likely
getting changed by an other command buffer.

Signed-off-by: Christian Gmeiner <christian.gmeiner at gmail.com>
---
 drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c 
b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
index 1fb5e37..2aa1a26 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
@@ -1369,6 +1369,20 @@ int etnaviv_gpu_submit(struct etnaviv_gpu *gpu,
        return ret;
 }

+static void etnaviv_process_readbacks(struct etnaviv_gpu *gpu,
+               struct etnaviv_event *event)
+{
+       unsigned i;
+
+       for (i = 0; i < event->nr_readbacks; i++) {
+               const struct etnaviv_readback *readback = event->readbacks + i;
+               const u32 val = gpu_read(gpu, readback->reg);
+               u32 *bo = readback->bo_vma;
+
+               *(bo + readback->offset) = val;
+       }
+}
+
 /*
  * Init/Cleanup:
  */
@@ -1415,6 +1429,9 @@ static irqreturn_t irq_handler(int irq, void *data)

                        dev_dbg(gpu->dev, "event %u\n", event);

+                       if (gpu->event[event].nr_readbacks)
+                               etnaviv_process_readbacks(gpu, 
&gpu->event[event]);
+
                        fence = gpu->event[event].fence;
                        gpu->event[event].fence = NULL;
                        fence_signal(fence);
-- 
2.9.3

Reply via email to