summaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/gsp_display_engine.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/kernel/gsp_display_engine.c b/kernel/gsp_display_engine.c
index ca470f2..73f40c6 100644
--- a/kernel/gsp_display_engine.c
+++ b/kernel/gsp_display_engine.c
@@ -710,8 +710,14 @@ static void gsp_disp_run(struct nv_vgpu_device *vgpu, struct gsp_disp_chan *ch,
hdr = *(u32 *)(disp.pbuf + off);
op = hdr >> 29;
count = (hdr >> 18) & 0x3ff;
- /* NV_UDISP_DMA_METHOD_OFFSET is 15:2 (14 bits). */
- addr = (hdr >> 2) & 0x3fff;
+ /*
+ * NV_UDISP_DMA_METHOD_OFFSET is 15:2 and is a DWORD index;
+ * gsp_disp_method() works in BYTE method addresses (0x200
+ * UPDATE, 0x208/0x20c notifier), so shift back to bytes.
+ * Before this fix the executor compared 0x82 against 0x200
+ * and the FINISHED write could never match (r1624/r1625).
+ */
+ addr = ((hdr >> 2) & 0x3fff) << 2;
switch (op) {
case 0: /* METHOD (incrementing) */