92 lines
3.1 KiB
Diff
92 lines
3.1 KiB
Diff
From bbc56fdeaa2017d0bbed05e1e832e6d7e4bdd6e0 Mon Sep 17 00:00:00 2001
|
|
From: Steven Barrett <steven@liquorix.net>
|
|
Date: Fri, 15 Mar 2024 12:36:51 -0500
|
|
Subject: ZEN: drm/amdgpu/pm: Allow override of min_power_limit with
|
|
ignore_min_pcap
|
|
|
|
---
|
|
drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 +
|
|
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 10 ++++++++++
|
|
drivers/gpu/drm/amd/pm/amdgpu_pm.c | 3 +++
|
|
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 14 ++++++++++++--
|
|
4 files changed, 26 insertions(+), 2 deletions(-)
|
|
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
|
|
@@ -164,6 +164,7 @@ struct amdgpu_watchdog_timer {
|
|
*/
|
|
extern int amdgpu_modeset;
|
|
extern unsigned int amdgpu_vram_limit;
|
|
+extern int amdgpu_ignore_min_pcap;
|
|
extern int amdgpu_vis_vram_limit;
|
|
extern int amdgpu_gart_size;
|
|
extern int amdgpu_gtt_size;
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
|
|
@@ -136,6 +136,7 @@ enum AMDGPU_DEBUG_MASK {
|
|
};
|
|
|
|
unsigned int amdgpu_vram_limit = UINT_MAX;
|
|
+int amdgpu_ignore_min_pcap = 0; /* do not ignore by default */
|
|
int amdgpu_vis_vram_limit;
|
|
int amdgpu_gart_size = -1; /* auto */
|
|
int amdgpu_gtt_size = -1; /* auto */
|
|
@@ -260,6 +261,15 @@ struct amdgpu_watchdog_timer amdgpu_watc
|
|
};
|
|
|
|
/**
|
|
+ * DOC: ignore_min_pcap (int)
|
|
+ * Ignore the minimum power cap.
|
|
+ * Useful on graphics cards where the minimum power cap is very high.
|
|
+ * The default is 0 (Do not ignore).
|
|
+ */
|
|
+MODULE_PARM_DESC(ignore_min_pcap, "Ignore the minimum power cap");
|
|
+module_param_named(ignore_min_pcap, amdgpu_ignore_min_pcap, int, 0600);
|
|
+
|
|
+/**
|
|
* DOC: vramlimit (int)
|
|
* Restrict the total amount of VRAM in MiB for testing. The default is 0 (Use full VRAM).
|
|
*/
|
|
--- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c
|
|
+++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
|
|
@@ -3272,6 +3272,9 @@ static ssize_t amdgpu_hwmon_show_power_c
|
|
struct device_attribute *attr,
|
|
char *buf)
|
|
{
|
|
+ if (amdgpu_ignore_min_pcap)
|
|
+ return sysfs_emit(buf, "%i\n", 0);
|
|
+
|
|
return amdgpu_hwmon_show_power_cap_generic(dev, attr, buf, PP_PWR_LIMIT_MIN);
|
|
}
|
|
|
|
--- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
|
|
+++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
|
|
@@ -2779,7 +2779,10 @@ int smu_get_power_limit(void *handle,
|
|
*limit = smu->max_power_limit;
|
|
break;
|
|
case SMU_PPT_LIMIT_MIN:
|
|
- *limit = smu->min_power_limit;
|
|
+ if (amdgpu_ignore_min_pcap)
|
|
+ *limit = 0;
|
|
+ else
|
|
+ *limit = smu->min_power_limit;
|
|
break;
|
|
default:
|
|
return -EINVAL;
|
|
@@ -2803,7 +2806,14 @@ static int smu_set_power_limit(void *han
|
|
if (smu->ppt_funcs->set_power_limit)
|
|
return smu->ppt_funcs->set_power_limit(smu, limit_type, limit);
|
|
|
|
- if ((limit > smu->max_power_limit) || (limit < smu->min_power_limit)) {
|
|
+ if (amdgpu_ignore_min_pcap) {
|
|
+ if ((limit > smu->max_power_limit)) {
|
|
+ dev_err(smu->adev->dev,
|
|
+ "New power limit (%d) is over the max allowed %d\n",
|
|
+ limit, smu->max_power_limit);
|
|
+ return -EINVAL;
|
|
+ }
|
|
+ } else if ((limit > smu->max_power_limit) || (limit < smu->min_power_limit)) {
|
|
dev_err(smu->adev->dev,
|
|
"New power limit (%d) is out of range [%d,%d]\n",
|
|
limit, smu->min_power_limit, smu->max_power_limit);
|