diff options
author | Lucas Stach <l.stach@pengutronix.de> | 2019-10-16 16:10:21 +0200 |
---|---|---|
committer | Lucas Stach <l.stach@pengutronix.de> | 2019-10-29 18:11:50 +0100 |
commit | 18fa692d8020083cd57ce031a4b5a7a4ec8bc50a (patch) | |
tree | e7c33f9da4bcea85a52a8a2dae9880f04f366e3f /drivers/gpu | |
parent | ca8cb69580236f47041dd045c08f82cb7bb50d7c (diff) | |
download | linux-stable-18fa692d8020083cd57ce031a4b5a7a4ec8bc50a.tar.gz linux-stable-18fa692d8020083cd57ce031a4b5a7a4ec8bc50a.tar.bz2 linux-stable-18fa692d8020083cd57ce031a4b5a7a4ec8bc50a.zip |
drm/etnaviv: reinstate MMUv1 command buffer window check
The switch to per-process address spaces erroneously dropped the check
which validated that the command buffer is mapped through the linear
apperture as required by the hardware. This turned a system
misconfiguration with a helpful error message into a very hard to
debug issue. Reinstate the check at the appropriate location.
Fixes: 17e4660ae3d7 (drm/etnaviv: implement per-process address spaces on MMUv2)
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Reviewed-by: Guido Günther <agx@sigxcpu.org>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/etnaviv/etnaviv_mmu.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c index 35ebae6a1be7..3607d348c298 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c @@ -328,12 +328,23 @@ etnaviv_iommu_context_init(struct etnaviv_iommu_global *global, ret = etnaviv_cmdbuf_suballoc_map(suballoc, ctx, &ctx->cmdbuf_mapping, global->memory_base); - if (ret) { - global->ops->free(ctx); - return NULL; + if (ret) + goto out_free; + + if (global->version == ETNAVIV_IOMMU_V1 && + ctx->cmdbuf_mapping.iova > 0x80000000) { + dev_err(global->dev, + "command buffer outside valid memory window\n"); + goto out_unmap; } return ctx; + +out_unmap: + etnaviv_cmdbuf_suballoc_unmap(ctx, &ctx->cmdbuf_mapping); +out_free: + global->ops->free(ctx); + return NULL; } void etnaviv_iommu_restore(struct etnaviv_gpu *gpu, |