mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 00:58:05 +02:00
v3dv: ensure at least V3D_CL_MAX_INSTR_SIZE bytes in last CL instruction
The CLE parser in the sim will read this many bytes for each instruction
in a CL, so we should ensure we have at least that many bytes available
in the BO when reading the last instruction, otherwise we can trigger
a GMP violation. It is not clear whether this behavior applies to real
hardware too.
cc: mesa-stable
Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21162>
(cherry picked from commit c2601f0690)
This commit is contained in:
parent
c0b137db13
commit
abd2f1ee44
3 changed files with 14 additions and 8 deletions
|
|
@ -49,7 +49,7 @@
|
|||
"description": "v3dv: ensure at least V3D_CL_MAX_INSTR_SIZE bytes in last CL instruction",
|
||||
"nominated": true,
|
||||
"nomination_type": 0,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"main_sha": null,
|
||||
"because_sha": null
|
||||
},
|
||||
|
|
|
|||
|
|
@ -24,6 +24,8 @@
|
|||
#ifndef V3D_LIMITS_H
|
||||
#define V3D_LIMITS_H
|
||||
|
||||
#define V3D_CL_MAX_INSTR_SIZE 25
|
||||
|
||||
/* Number of channels a QPU thread executes in parallel. Also known as
|
||||
* gl_SubGroupSizeARB.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -114,14 +114,18 @@ v3dv_cl_ensure_space_with_branch(struct v3dv_cl *cl, uint32_t space)
|
|||
* end with a 'return from sub list' command.
|
||||
*/
|
||||
bool needs_return_from_sub_list = false;
|
||||
if (cl->job->type == V3DV_JOB_TYPE_GPU_CL_SECONDARY) {
|
||||
if (cl->size > 0) {
|
||||
if (cl->job->type == V3DV_JOB_TYPE_GPU_CL_SECONDARY && cl->size > 0)
|
||||
needs_return_from_sub_list = true;
|
||||
space += cl_packet_length(RETURN_FROM_SUB_LIST);
|
||||
}
|
||||
} else {
|
||||
space += cl_packet_length(BRANCH);
|
||||
}
|
||||
|
||||
/*
|
||||
* The CLE processor in the simulator tries to read V3D_CL_MAX_INSTR_SIZE
|
||||
* bytes form the CL for each new instruction. If the last instruction in our
|
||||
* CL is smaller than that, and there are not at least V3D_CL_MAX_INSTR_SIZE
|
||||
* bytes until the end of the BO, it will read out of bounds and possibly
|
||||
* cause a GMP violation interrupt to trigger. Ensure we always have at
|
||||
* least that many bytes available to read with the last instruction.
|
||||
*/
|
||||
space += V3D_CL_MAX_INSTR_SIZE;
|
||||
|
||||
if (v3dv_cl_offset(cl) + space <= cl->size)
|
||||
return;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue