@@ -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);
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@gmail.com> --- drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)