mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
Two fixes for v3d to fix an array indexing on newer V3D revisions.
-----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQRcEzekXsqa64kGDp7j7w1vZxhRxQUCZpoYMQAKCRDj7w1vZxhR xVs2AP0QGVNgOAY3ZVSrtPViz9EFqEwxMipGs7DqQHQUyUKy2gEA5vxb12Yu3Akp HjCO+1D734fKkSti3Asvw04/WgCntwg= =4xEO -----END PGP SIGNATURE----- Merge tag 'drm-misc-next-fixes-2024-07-19' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-next Two fixes for v3d to fix an array indexing on newer V3D revisions. Signed-off-by: Dave Airlie <airlied@redhat.com> From: Maxime Ripard <mripard@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/20240719-emerald-newt-of-skill-89b54a@houat
This commit is contained in:
commit
412dbc662e
@ -265,7 +265,7 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
|
||||
struct v3d_dev *v3d;
|
||||
int ret;
|
||||
u32 mmu_debug;
|
||||
u32 ident1;
|
||||
u32 ident1, ident3;
|
||||
u64 mask;
|
||||
|
||||
v3d = devm_drm_dev_alloc(dev, &v3d_drm_driver, struct v3d_dev, drm);
|
||||
@ -298,6 +298,9 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
|
||||
v3d->cores = V3D_GET_FIELD(ident1, V3D_HUB_IDENT1_NCORES);
|
||||
WARN_ON(v3d->cores > 1); /* multicore not yet implemented */
|
||||
|
||||
ident3 = V3D_READ(V3D_HUB_IDENT3);
|
||||
v3d->rev = V3D_GET_FIELD(ident3, V3D_HUB_IDENT3_IPREV);
|
||||
|
||||
if (v3d->ver >= 71)
|
||||
v3d->max_counters = V3D_V71_NUM_PERFCOUNTERS;
|
||||
else if (v3d->ver >= 42)
|
||||
|
@ -98,10 +98,12 @@ struct v3d_perfmon {
|
||||
struct v3d_dev {
|
||||
struct drm_device drm;
|
||||
|
||||
/* Short representation (e.g. 33, 41) of the V3D tech version
|
||||
* and revision.
|
||||
*/
|
||||
/* Short representation (e.g. 33, 41) of the V3D tech version */
|
||||
int ver;
|
||||
|
||||
/* Short representation (e.g. 5, 6) of the V3D tech revision */
|
||||
int rev;
|
||||
|
||||
bool single_irq_line;
|
||||
|
||||
/* Different revisions of V3D have different total number of performance
|
||||
|
@ -331,7 +331,8 @@ v3d_rewrite_csd_job_wg_counts_from_indirect(struct v3d_cpu_job *job)
|
||||
struct v3d_bo *bo = to_v3d_bo(job->base.bo[0]);
|
||||
struct v3d_bo *indirect = to_v3d_bo(indirect_csd->indirect);
|
||||
struct drm_v3d_submit_csd *args = &indirect_csd->job->args;
|
||||
u32 *wg_counts;
|
||||
struct v3d_dev *v3d = job->base.v3d;
|
||||
u32 num_batches, *wg_counts;
|
||||
|
||||
v3d_get_bo_vaddr(bo);
|
||||
v3d_get_bo_vaddr(indirect);
|
||||
@ -344,8 +345,17 @@ v3d_rewrite_csd_job_wg_counts_from_indirect(struct v3d_cpu_job *job)
|
||||
args->cfg[0] = wg_counts[0] << V3D_CSD_CFG012_WG_COUNT_SHIFT;
|
||||
args->cfg[1] = wg_counts[1] << V3D_CSD_CFG012_WG_COUNT_SHIFT;
|
||||
args->cfg[2] = wg_counts[2] << V3D_CSD_CFG012_WG_COUNT_SHIFT;
|
||||
args->cfg[4] = DIV_ROUND_UP(indirect_csd->wg_size, 16) *
|
||||
(wg_counts[0] * wg_counts[1] * wg_counts[2]) - 1;
|
||||
|
||||
num_batches = DIV_ROUND_UP(indirect_csd->wg_size, 16) *
|
||||
(wg_counts[0] * wg_counts[1] * wg_counts[2]);
|
||||
|
||||
/* V3D 7.1.6 and later don't subtract 1 from the number of batches */
|
||||
if (v3d->ver < 71 || (v3d->ver == 71 && v3d->rev < 6))
|
||||
args->cfg[4] = num_batches - 1;
|
||||
else
|
||||
args->cfg[4] = num_batches;
|
||||
|
||||
WARN_ON(args->cfg[4] == ~0);
|
||||
|
||||
for (int i = 0; i < 3; i++) {
|
||||
/* 0xffffffff indicates that the uniform rewrite is not needed */
|
||||
|
Loading…
Reference in New Issue
Block a user