AQE (Applicaton Qrisc Engine) is a dedicated core inside CP which aides
in Raytracing related workloads. Add support for loading the AQE firmware
and initialize the necessary registers.

Since AQE engine has dependency on preemption context records, expose
Raytracing support to userspace only when preemption is enabled.

Signed-off-by: Akhil P Oommen <[email protected]>
---
 drivers/gpu/drm/msm/adreno/a6xx_gpu.c   | 26 ++++++++++++++++++++++++--
 drivers/gpu/drm/msm/adreno/a6xx_gpu.h   |  2 ++
 drivers/gpu/drm/msm/adreno/a8xx_gpu.c   |  3 +++
 drivers/gpu/drm/msm/adreno/adreno_gpu.h |  1 +
 4 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c 
b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
index 836100047be3..029f7bd25baf 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
@@ -1104,6 +1104,23 @@ static int a6xx_ucode_load(struct msm_gpu *gpu)
                }
        }
 
+       if (!a6xx_gpu->aqe_bo && adreno_gpu->fw[ADRENO_FW_AQE]) {
+               a6xx_gpu->aqe_bo = adreno_fw_create_bo(gpu,
+                       adreno_gpu->fw[ADRENO_FW_AQE], &a6xx_gpu->aqe_iova);
+
+               if (IS_ERR(a6xx_gpu->aqe_bo)) {
+                       int ret = PTR_ERR(a6xx_gpu->aqe_bo);
+
+                       a6xx_gpu->aqe_bo = NULL;
+                       DRM_DEV_ERROR(&gpu->pdev->dev,
+                               "Could not allocate AQE ucode: %d\n", ret);
+
+                       return ret;
+               }
+
+               msm_gem_object_set_name(a6xx_gpu->aqe_bo, "aqefw");
+       }
+
        /*
         * Expanded APRIV and targets that support WHERE_AM_I both need a
         * privileged buffer to store the RPTR shadow
@@ -2132,8 +2149,13 @@ static int a7xx_cx_mem_init(struct a6xx_gpu *a6xx_gpu)
                 */
                fuse_val = a6xx_llc_read(a6xx_gpu,
                                         REG_A7XX_CX_MISC_SW_FUSE_VALUE);
-               adreno_gpu->has_ray_tracing =
-                       !!(fuse_val & A7XX_CX_MISC_SW_FUSE_VALUE_RAYTRACING);
+               /*
+                * AQE requires preemption records, so disable raytracing
+                * if preemption is not supported
+                */
+               if (gpu->nr_rings == 1)
+                       adreno_gpu->has_ray_tracing =
+                               !!(fuse_val & 
A7XX_CX_MISC_SW_FUSE_VALUE_RAYTRACING);
        } else if (adreno_is_a740(adreno_gpu)) {
                /* Raytracing is always enabled on a740 */
                adreno_gpu->has_ray_tracing = true;
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.h 
b/drivers/gpu/drm/msm/adreno/a6xx_gpu.h
index b507ff4e1756..7921b4a68937 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.h
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.h
@@ -58,6 +58,8 @@ struct a6xx_gpu {
 
        struct drm_gem_object *sqe_bo;
        uint64_t sqe_iova;
+       struct drm_gem_object *aqe_bo;
+       uint64_t aqe_iova;
 
        struct msm_ringbuffer *cur_ring;
        struct msm_ringbuffer *next_ring;
diff --git a/drivers/gpu/drm/msm/adreno/a8xx_gpu.c 
b/drivers/gpu/drm/msm/adreno/a8xx_gpu.c
index 78dcb9bc3377..2ef69161f1d0 100644
--- a/drivers/gpu/drm/msm/adreno/a8xx_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/a8xx_gpu.c
@@ -616,6 +616,9 @@ static int hw_init(struct msm_gpu *gpu)
                goto out;
 
        gpu_write64(gpu, REG_A8XX_CP_SQE_INSTR_BASE, a6xx_gpu->sqe_iova);
+       if (a6xx_gpu->aqe_iova)
+               gpu_write64(gpu, REG_A8XX_CP_AQE_INSTR_BASE_0, 
a6xx_gpu->aqe_iova);
+
        /* Set the ringbuffer address */
        gpu_write64(gpu, REG_A6XX_CP_RB_BASE, gpu->rb[0]->iova);
        gpu_write(gpu, REG_A6XX_CP_RB_CNTL, MSM_GPU_RB_CNTL_DEFAULT);
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.h 
b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
index 17863c3287f5..4c0d9024d497 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.h
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
@@ -27,6 +27,7 @@ enum {
        ADRENO_FW_PFP = 1,
        ADRENO_FW_GMU = 1, /* a6xx */
        ADRENO_FW_GPMU = 2,
+       ADRENO_FW_AQE = 3,
        ADRENO_FW_MAX,
 };
 

-- 
2.51.0

Reply via email to