Wire up the set_npm_limit callback from pp_funcs through
smu/dpm to the PPT layer.

Signed-off-by: Asad Kamal <[email protected]>
Reviewed-by: Lijo Lazar <[email protected]>
---
 drivers/gpu/drm/amd/include/kgd_pp_interface.h |  1 +
 drivers/gpu/drm/amd/pm/amdgpu_dpm.c            | 18 ++++++++++++++++++
 drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h        |  1 +
 drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c      | 14 ++++++++++++++
 drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h  |  6 ++++++
 drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h   |  3 ++-
 6 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/include/kgd_pp_interface.h 
b/drivers/gpu/drm/amd/include/kgd_pp_interface.h
index 4b863a2e38f1..ca818965afe1 100644
--- a/drivers/gpu/drm/amd/include/kgd_pp_interface.h
+++ b/drivers/gpu/drm/amd/include/kgd_pp_interface.h
@@ -530,6 +530,7 @@ struct amd_pm_funcs {
        ssize_t (*get_temp_metrics)(void *handle, enum smu_temp_metric_type 
type, void *table);
        bool (*temp_metrics_is_supported)(void *handle, enum 
smu_temp_metric_type type);
        u64 (*get_npm_cap)(void *handle);
+       int (*set_npm_limit)(void *handle, uint32_t limit);
        ssize_t (*get_xcp_metrics)(void *handle, int xcp_id, void *table);
        ssize_t (*get_pm_metrics)(void *handle, void *pmmetrics, size_t size);
        int (*set_watermarks_for_clock_ranges)(void *handle,
diff --git a/drivers/gpu/drm/amd/pm/amdgpu_dpm.c 
b/drivers/gpu/drm/amd/pm/amdgpu_dpm.c
index df5bbdab1ea3..0394085a0328 100644
--- a/drivers/gpu/drm/amd/pm/amdgpu_dpm.c
+++ b/drivers/gpu/drm/amd/pm/amdgpu_dpm.c
@@ -2124,6 +2124,24 @@ u64 amdgpu_dpm_get_npm_cap(struct amdgpu_device *adev)
        return cap;
 }
 
+int amdgpu_dpm_set_npm_limit(struct amdgpu_device *adev, uint32_t limit)
+{
+       const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
+       int ret;
+
+       if (!pp_funcs || !pp_funcs->set_npm_limit)
+               return -EOPNOTSUPP;
+
+       if (amdgpu_sriov_vf(adev))
+               return -EPERM;
+
+       mutex_lock(&adev->pm.mutex);
+       ret = pp_funcs->set_npm_limit(adev->powerplay.pp_handle, limit);
+       mutex_unlock(&adev->pm.mutex);
+
+       return ret;
+}
+
 /**
  * amdgpu_dpm_get_xcp_metrics - Retrieve metrics for a specific compute
  * partition
diff --git a/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h 
b/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
index 64d68a905f86..72b13ece22ef 100644
--- a/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
+++ b/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
@@ -617,5 +617,6 @@ bool amdgpu_dpm_reset_vcn_is_supported(struct amdgpu_device 
*adev);
 bool amdgpu_dpm_is_temp_metrics_supported(struct amdgpu_device *adev,
                                          enum smu_temp_metric_type type);
 u64 amdgpu_dpm_get_npm_cap(struct amdgpu_device *adev);
+int amdgpu_dpm_set_npm_limit(struct amdgpu_device *adev, uint32_t limit);
 
 #endif
diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c 
b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
index a65aa2129845..3bb36668eb39 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
@@ -3995,6 +3995,19 @@ static u64 smu_get_npm_cap(void *handle)
        return smu->ppt_funcs->get_npm_cap(smu);
 }
 
+static int smu_set_npm_limit(void *handle, uint32_t limit)
+{
+       struct smu_context *smu = handle;
+
+       if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled)
+               return -EOPNOTSUPP;
+
+       if (!smu->ppt_funcs || !smu->ppt_funcs->set_npm_limit)
+               return -EOPNOTSUPP;
+
+       return smu->ppt_funcs->set_npm_limit(smu, limit);
+}
+
 static ssize_t smu_sys_get_xcp_metrics(void *handle, int xcp_id, void *table)
 {
        struct smu_context *smu = handle;
@@ -4069,6 +4082,7 @@ static const struct amd_pm_funcs swsmu_pm_funcs = {
        .get_xcp_metrics                  = smu_sys_get_xcp_metrics,
        .get_temp_metrics             = smu_sys_get_temp_metrics,
        .temp_metrics_is_supported      = smu_temp_metrics_is_supported,
+       .set_npm_limit                = smu_set_npm_limit,
        .get_npm_cap                  = smu_get_npm_cap,
 };
 
diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h 
b/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
index 1e5fc6ff76c8..f516d0d3bb92 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
+++ b/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
@@ -1626,6 +1626,12 @@ struct pptable_funcs {
         * unsupported.
         */
        u64 (*get_npm_cap)(struct smu_context *smu);
+
+       /**
+        * @set_npm_limit: Set node power limit in watts.
+        */
+       int (*set_npm_limit)(struct smu_context *smu, uint32_t limit);
+
        /**
         * @ras_send_msg: Send a message with a parameter from Ras
         * &msg: Type of message.
diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h 
b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h
index 2631e12b5e59..f86201764814 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h
+++ b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h
@@ -305,7 +305,8 @@
        __SMU_DUMMY_MAP(SetSoftMaxFclk), \
        __SMU_DUMMY_MAP(SetSoftMaxGl2clk), \
        __SMU_DUMMY_MAP(SetSoftMinGl2clk), \
-       __SMU_DUMMY_MAP(GetSystemMetricsVersion),
+       __SMU_DUMMY_MAP(GetSystemMetricsVersion), \
+       __SMU_DUMMY_MAP(SetNpmLimit),
 
 #undef __SMU_DUMMY_MAP
 #define __SMU_DUMMY_MAP(type)  SMU_MSG_##type
-- 
2.46.0

Reply via email to