Add HFI support for the GMU THINMEM_CFG feature and provide the configuration value used by the Adreno 850 GPU in the catalog.
Signed-off-by: Akhil P Oommen <[email protected]> --- drivers/gpu/drm/msm/adreno/a6xx_catalog.c | 1 + drivers/gpu/drm/msm/adreno/a6xx_gpu.h | 2 ++ drivers/gpu/drm/msm/adreno/a6xx_hfi.c | 25 +++++++++++++++++++++++++ drivers/gpu/drm/msm/adreno/a6xx_hfi.h | 1 + 4 files changed, 29 insertions(+) diff --git a/drivers/gpu/drm/msm/adreno/a6xx_catalog.c b/drivers/gpu/drm/msm/adreno/a6xx_catalog.c index de576816ec7c..83c6f257f478 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_catalog.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_catalog.c @@ -2849,6 +2849,7 @@ static const struct adreno_info a8xx_gpus[] = { .gbif_cx = a850_gbif, .max_slices = 3, .gmu_chipid = 0x80b0100, + .thinmem_config = 14, .bcms = (const struct a6xx_bcm[]) { { .name = "SH0", .buswidth = 32 }, { .name = "MC0", .buswidth = 4 }, diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.h b/drivers/gpu/drm/msm/adreno/a6xx_gpu.h index b50c57f427b4..43273e5f8b5b 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.h +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.h @@ -42,6 +42,7 @@ struct cpu_gpu_lock { * @hwcg: hw clock gating register sequence * @protect: CP_PROTECT settings * @pwrup_reglist pwrup reglist for preemption + * @thinmem_config: GMU thinmem configuration */ struct a6xx_info { const struct adreno_reglist *hwcg; @@ -56,6 +57,7 @@ struct a6xx_info { u32 gmu_cgc_mode; u32 prim_fifo_threshold; const struct a6xx_bcm *bcms; + u32 thinmem_config; }; struct a6xx_gpu { diff --git a/drivers/gpu/drm/msm/adreno/a6xx_hfi.c b/drivers/gpu/drm/msm/adreno/a6xx_hfi.c index 186a73c0b99c..e33a2258e0f9 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_hfi.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_hfi.c @@ -888,6 +888,27 @@ static int a6xx_hfi_enable_acd(struct a6xx_gmu *gmu) return 0; } +static int a6xx_hfi_send_thinmem_config(struct a6xx_gmu *gmu) +{ + struct a6xx_gpu *a6xx_gpu = container_of(gmu, struct a6xx_gpu, gmu); + struct adreno_gpu *adreno_gpu = &a6xx_gpu->base; + const struct a6xx_info *info = adreno_gpu->info->a6xx; + u32 data; + int ret; + + if (!info->thinmem_config) + return 0; + + /* Bits [7:4] contain the thinmem_cfg data. */ + data = FIELD_PREP(GENMASK(7, 4), info->thinmem_config); + + ret = a6xx_hfi_feature_ctrl_msg(gmu, HFI_FEATURE_THINMEM_CFG, 1, data); + if (ret) + DRM_DEV_ERROR(gmu->dev, "Unable to send THINMEM_CFG (%d)\n", ret); + + return ret; +} + static int a6xx_hfi_send_test(struct a6xx_gmu *gmu) { struct a6xx_hfi_msg_test msg = { 0 }; @@ -993,6 +1014,10 @@ int a6xx_hfi_start(struct a6xx_gmu *gmu, int boot_state) if (ret) return ret; + ret = a6xx_hfi_send_thinmem_config(gmu); + if (ret) + return ret; + ret = a6xx_hfi_send_core_fw_start(gmu); if (ret) return ret; diff --git a/drivers/gpu/drm/msm/adreno/a6xx_hfi.h b/drivers/gpu/drm/msm/adreno/a6xx_hfi.h index e10d32ce93e0..5123349a3de6 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_hfi.h +++ b/drivers/gpu/drm/msm/adreno/a6xx_hfi.h @@ -244,6 +244,7 @@ struct a6xx_hfi_msg_feature_ctrl { #define HFI_FEATURE_TDCVS 30 #define HFI_FEATURE_DCE 31 #define HFI_FEATURE_IFF_PCLX 32 +#define HFI_FEATURE_THINMEM_CFG 38 #define HFI_FEATURE_SOFT_RESET 0x10000001 #define HFI_FEATURE_DCVS_PROFILE 0x10000002 #define HFI_FEATURE_FAST_CTX_DESTROY 0x10000003 -- 2.55.0
