drm/msm/a6xx+: Don't let IB_SIZE overflow
[ Upstream commit 9d78f02503227d3554d26cf8ca73276105c98f3e ]
IB_SIZE is only b0..b19. Starting with a6xx gen3, additional fields
were added above the IB_SIZE. Accidentially setting them can cause
badness. Fix this by properly defining the CP_INDIRECT_BUFFER packet
and using the generated builder macro to ensure unintended bits are not
set.
v2: add missing type attribute for IB_BASE
v3: fix offset attribute in xml
Reported-by: Connor Abbott <cwabbott0@gmail.com>
Fixes: a83366ef19 ("drm/msm/a6xx: add A640/A650 to gpulist")
Signed-off-by: Rob Clark <robdclark@chromium.org>
Patchwork: https://patchwork.freedesktop.org/patch/643396/
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
26d5e2377f
commit
bde7abe8cf
@@ -233,10 +233,10 @@ static void a6xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)
|
|||||||
break;
|
break;
|
||||||
fallthrough;
|
fallthrough;
|
||||||
case MSM_SUBMIT_CMD_BUF:
|
case MSM_SUBMIT_CMD_BUF:
|
||||||
OUT_PKT7(ring, CP_INDIRECT_BUFFER_PFE, 3);
|
OUT_PKT7(ring, CP_INDIRECT_BUFFER, 3);
|
||||||
OUT_RING(ring, lower_32_bits(submit->cmd[i].iova));
|
OUT_RING(ring, lower_32_bits(submit->cmd[i].iova));
|
||||||
OUT_RING(ring, upper_32_bits(submit->cmd[i].iova));
|
OUT_RING(ring, upper_32_bits(submit->cmd[i].iova));
|
||||||
OUT_RING(ring, submit->cmd[i].size);
|
OUT_RING(ring, A5XX_CP_INDIRECT_BUFFER_2_IB_SIZE(submit->cmd[i].size));
|
||||||
ibs++;
|
ibs++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -319,10 +319,10 @@ static void a7xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)
|
|||||||
break;
|
break;
|
||||||
fallthrough;
|
fallthrough;
|
||||||
case MSM_SUBMIT_CMD_BUF:
|
case MSM_SUBMIT_CMD_BUF:
|
||||||
OUT_PKT7(ring, CP_INDIRECT_BUFFER_PFE, 3);
|
OUT_PKT7(ring, CP_INDIRECT_BUFFER, 3);
|
||||||
OUT_RING(ring, lower_32_bits(submit->cmd[i].iova));
|
OUT_RING(ring, lower_32_bits(submit->cmd[i].iova));
|
||||||
OUT_RING(ring, upper_32_bits(submit->cmd[i].iova));
|
OUT_RING(ring, upper_32_bits(submit->cmd[i].iova));
|
||||||
OUT_RING(ring, submit->cmd[i].size);
|
OUT_RING(ring, A5XX_CP_INDIRECT_BUFFER_2_IB_SIZE(submit->cmd[i].size));
|
||||||
ibs++;
|
ibs++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2264,5 +2264,12 @@ opcode: CP_LOAD_STATE4 (30) (4 dwords)
|
|||||||
</reg32>
|
</reg32>
|
||||||
</domain>
|
</domain>
|
||||||
|
|
||||||
|
<domain name="CP_INDIRECT_BUFFER" width="32" varset="chip" prefix="chip" variants="A5XX-">
|
||||||
|
<reg64 offset="0" name="IB_BASE" type="address"/>
|
||||||
|
<reg32 offset="2" name="2">
|
||||||
|
<bitfield name="IB_SIZE" low="0" high="19"/>
|
||||||
|
</reg32>
|
||||||
|
</domain>
|
||||||
|
|
||||||
</database>
|
</database>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user