History

drm/msm/adreno: Expose a PARAM to check AQE support

AQE (Applicaton Qrisc Engine) is required to support VK ray-pipeline. Two conditions should be met to use this HW: 1. AQE firmware should be loaded and programmed 2. Preemption support Expose a new MSM_PARAM to allow userspace to query its support.

Akhil P Oommen committed 7 months ago

Commit 64ac64b1 parent 7fad3304 files · +19 −0Browse files

Unified · Split

4 files
  1. drivers/gpu/drm/msm/adreno/a6xx_gpu.c +13 −0
  2. drivers/gpu/drm/msm/adreno/adreno_gpu.c +4 −0
  3. drivers/gpu/drm/msm/adreno/adreno_gpu.h +1 −0
  4. include/uapi/drm/msm_drm.h +1 −0
drivers/gpu/drm/msm/adreno/a6xx_gpu.c+13−0
@@ -2604,6 +2604,17 @@ static int a6xx_set_supported_hw(struct device *dev, struct a6xx_gpu *a6xx_gpu, · 2603 unmodified lines
26042604 return 0;
26052605 }
26062606
2607+static bool a6xx_aqe_is_enabled(struct adreno_gpu *adreno_gpu)
2608+{
2609+ struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu);
2610+
2611+ /*
2612+ * AQE uses preemption context record as scratch pad, so check if
2613+ * preemption is enabled
2614+ */
2615+ return (adreno_gpu->base.nr_rings > 1) && !!a6xx_gpu->aqe_bo;
2616+}
2617+
26072618 static struct msm_gpu *a6xx_gpu_init(struct drm_device *dev)
26082619 {
26092620 struct msm_drm_private *priv = dev->dev_private;
@@ -2803,6 +2814,7 @@ const struct adreno_gpu_funcs a7xx_gpu_funcs = { · 193 unmodified lines
28032814 .bus_halt = a6xx_bus_clear_pending_transactions,
28042815 .mmu_fault_handler = a6xx_fault_handler,
28052816 .gx_is_on = a7xx_gmu_gx_is_on,
2817+ .aqe_is_enabled = a6xx_aqe_is_enabled,
28062818 };
28072819
28082820 const struct adreno_gpu_funcs a8xx_gpu_funcs = {
@@ -2831,4 +2843,5 @@ const struct adreno_gpu_funcs a8xx_gpu_funcs = { · 22 unmodified lines
28312843 .bus_halt = a8xx_bus_clear_pending_transactions,
28322844 .mmu_fault_handler = a8xx_fault_handler,
28332845 .gx_is_on = a8xx_gmu_gx_is_on,
2846+ .aqe_is_enabled = a6xx_aqe_is_enabled,
28342847 };
drivers/gpu/drm/msm/adreno/adreno_gpu.c+4−0
@@ -441,6 +441,10 @@ int adreno_get_param(struct msm_gpu *gpu, struct msm_context *ctx, · 440 unmodified lines
441441 case MSM_PARAM_HAS_PRR:
442442 *value = adreno_smmu_has_prr(gpu);
443443 return 0;
444+ case MSM_PARAM_AQE:
445+ *value = !!(adreno_gpu->funcs->aqe_is_enabled &&
446+ adreno_gpu->funcs->aqe_is_enabled(adreno_gpu));
447+ return 0;
444448 default:
445449 return UERR(EINVAL, drm, "%s: invalid param: %u", gpu->name, param);
446450 }
drivers/gpu/drm/msm/adreno/adreno_gpu.h+1−0
@@ -80,6 +80,7 @@ struct adreno_gpu_funcs { · 79 unmodified lines
8080 void (*bus_halt)(struct adreno_gpu *adreno_gpu, bool gx_off);
8181 int (*mmu_fault_handler)(void *arg, unsigned long iova, int flags, void *data);
8282 bool (*gx_is_on)(struct adreno_gpu *adreno_gpu);
83+ bool (*aqe_is_enabled)(struct adreno_gpu *adreno_gpu);
8384 };
8485
8586 struct adreno_reglist {
include/uapi/drm/msm_drm.h+1−0
@@ -117,6 +117,7 @@ struct drm_msm_timespec { · 116 unmodified lines
117117 * ioctl will throw -EPIPE.
118118 */
119119 #define MSM_PARAM_EN_VM_BIND 0x16 /* WO, once */
120+#define MSM_PARAM_AQE 0x17 /* RO */
120121
121122 /* For backwards compat. The original support for preemption was based on
122123 * a single ring per priority level so # of priority levels equals the #