]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
drm/amdgpu: add support to power up/down UMSCH by SMU
authorLang Yu <Lang.Yu@amd.com>
Fri, 2 Jun 2023 00:39:36 +0000 (08:39 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 13 Oct 2023 15:00:12 +0000 (11:00 -0400)
Power up/down UMSCH by SMU.

Signed-off-by: Lang Yu <Lang.Yu@amd.com>
Acked-by: Leo Liu <leo.liu@amd.com>
Acked-by: Veerabadhran Gopalakrishnan <Veerabadhran.Gopalakrishnan@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h

index df513347cb73191c28509cfe610ba244272a56c9..7c3356d6da5efd00cdf540fb88bd590385a4cd29 100644 (file)
@@ -299,6 +299,29 @@ static int smu_dpm_set_vpe_enable(struct smu_context *smu,
        return ret;
 }
 
+static int smu_dpm_set_umsch_mm_enable(struct smu_context *smu,
+                                  bool enable)
+{
+       struct smu_power_context *smu_power = &smu->smu_power;
+       struct smu_power_gate *power_gate = &smu_power->power_gate;
+       int ret = 0;
+
+       if (!smu->adev->enable_umsch_mm)
+               return 0;
+
+       if (!smu->ppt_funcs->dpm_set_umsch_mm_enable)
+               return 0;
+
+       if (atomic_read(&power_gate->umsch_mm_gated) ^ enable)
+               return 0;
+
+       ret = smu->ppt_funcs->dpm_set_umsch_mm_enable(smu, enable);
+       if (!ret)
+               atomic_set(&power_gate->umsch_mm_gated, !enable);
+
+       return ret;
+}
+
 /**
  * smu_dpm_set_power_gate - power gate/ungate the specific IP block
  *
@@ -1196,6 +1219,7 @@ static int smu_sw_init(void *handle)
        atomic_set(&smu->smu_power.power_gate.vcn_gated, 1);
        atomic_set(&smu->smu_power.power_gate.jpeg_gated, 1);
        atomic_set(&smu->smu_power.power_gate.vpe_gated, 1);
+       atomic_set(&smu->smu_power.power_gate.umsch_mm_gated, 1);
 
        smu->workload_mask = 1 << smu->workload_prority[PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT];
        smu->workload_prority[PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT] = 0;
@@ -1549,6 +1573,7 @@ static int smu_hw_init(void *handle)
                smu_dpm_set_vcn_enable(smu, true);
                smu_dpm_set_jpeg_enable(smu, true);
                smu_dpm_set_vpe_enable(smu, true);
+               smu_dpm_set_umsch_mm_enable(smu, true);
                smu_set_gfx_cgpg(smu, true);
        }
 
@@ -1726,6 +1751,7 @@ static int smu_hw_fini(void *handle)
        smu_dpm_set_vcn_enable(smu, false);
        smu_dpm_set_jpeg_enable(smu, false);
        smu_dpm_set_vpe_enable(smu, false);
+       smu_dpm_set_umsch_mm_enable(smu, false);
 
        adev->vcn.cur_state = AMD_PG_STATE_GATE;
        adev->jpeg.cur_state = AMD_PG_STATE_GATE;
index 190a2ce38ac1df3cdcec07ddabface83179c2aac..1454eed76604ef6948a3f9d3066842f4753f87a6 100644 (file)
@@ -375,6 +375,7 @@ struct smu_power_gate {
        atomic_t vcn_gated;
        atomic_t jpeg_gated;
        atomic_t vpe_gated;
+       atomic_t umsch_mm_gated;
 };
 
 struct smu_power_context {