Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/msm: Enable expanded apriv support for a650

a650 supports expanded apriv support that allows us to map critical buffers
(ringbuffer and memstore) as as privileged to protect them from corruption.

Cc: stable@vger.kernel.org
Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
Signed-off-by: Rob Clark <robdclark@chromium.org>

authored by

Jordan Crouse and committed by
Rob Clark
604234f3 34221545

+19 -4
+5 -1
drivers/gpu/drm/msm/adreno/a6xx_gpu.c
··· 678 678 A6XX_PROTECT_RDONLY(0x980, 0x4)); 679 679 gpu_write(gpu, REG_A6XX_CP_PROTECT(25), A6XX_PROTECT_RW(0xa630, 0x0)); 680 680 681 - if (adreno_is_a650(adreno_gpu)) { 681 + /* Enable expanded apriv for targets that support it */ 682 + if (gpu->hw_apriv) { 682 683 gpu_write(gpu, REG_A6XX_CP_APRIV_CNTL, 683 684 (1 << 6) | (1 << 5) | (1 << 3) | (1 << 2) | (1 << 1)); 684 685 } ··· 1056 1055 1057 1056 adreno_gpu->registers = NULL; 1058 1057 adreno_gpu->reg_offsets = a6xx_register_offsets; 1058 + 1059 + if (adreno_is_a650(adreno_gpu)) 1060 + adreno_gpu->base.hw_apriv = true; 1059 1061 1060 1062 ret = adreno_gpu_init(dev, pdev, adreno_gpu, &funcs, 1); 1061 1063 if (ret) {
+1 -1
drivers/gpu/drm/msm/msm_gpu.c
··· 908 908 909 909 memptrs = msm_gem_kernel_new(drm, 910 910 sizeof(struct msm_rbmemptrs) * nr_rings, 911 - MSM_BO_UNCACHED, gpu->aspace, &gpu->memptrs_bo, 911 + check_apriv(gpu, MSM_BO_UNCACHED), gpu->aspace, &gpu->memptrs_bo, 912 912 &memptrs_iova); 913 913 914 914 if (IS_ERR(memptrs)) {
+11
drivers/gpu/drm/msm/msm_gpu.h
··· 15 15 #include "msm_drv.h" 16 16 #include "msm_fence.h" 17 17 #include "msm_ringbuffer.h" 18 + #include "msm_gem.h" 18 19 19 20 struct msm_gem_submit; 20 21 struct msm_gpu_perfcntr; ··· 140 139 } devfreq; 141 140 142 141 struct msm_gpu_state *crashstate; 142 + /* True if the hardware supports expanded apriv (a650 and newer) */ 143 + bool hw_apriv; 143 144 }; 144 145 145 146 /* It turns out that all targets use the same ringbuffer size */ ··· 329 326 330 327 mutex_unlock(&gpu->dev->struct_mutex); 331 328 } 329 + 330 + /* 331 + * Simple macro to semi-cleanly add the MAP_PRIV flag for targets that can 332 + * support expanded privileges 333 + */ 334 + #define check_apriv(gpu, flags) \ 335 + (((gpu)->hw_apriv ? MSM_BO_MAP_PRIV : 0) | (flags)) 336 + 332 337 333 338 #endif /* __MSM_GPU_H__ */
+2 -2
drivers/gpu/drm/msm/msm_ringbuffer.c
··· 27 27 ring->id = id; 28 28 29 29 ring->start = msm_gem_kernel_new(gpu->dev, MSM_GPU_RINGBUFFER_SZ, 30 - MSM_BO_WC | MSM_BO_GPU_READONLY, gpu->aspace, &ring->bo, 31 - &ring->iova); 30 + check_apriv(gpu, MSM_BO_WC | MSM_BO_GPU_READONLY), 31 + gpu->aspace, &ring->bo, &ring->iova); 32 32 33 33 if (IS_ERR(ring->start)) { 34 34 ret = PTR_ERR(ring->start);