aboutsummaryrefslogtreecommitdiff
path: root/SOURCES/tkg-misc-additions.patch
diff options
context:
space:
mode:
Diffstat (limited to 'SOURCES/tkg-misc-additions.patch')
-rw-r--r--SOURCES/tkg-misc-additions.patch823
1 files changed, 823 insertions, 0 deletions
diff --git a/SOURCES/tkg-misc-additions.patch b/SOURCES/tkg-misc-additions.patch
new file mode 100644
index 0000000..4969dc3
--- /dev/null
+++ b/SOURCES/tkg-misc-additions.patch
@@ -0,0 +1,823 @@
+From e5e77ad2223f662e1615266d8ef39a8db7e65a70 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Felix=20H=C3=A4dicke?= <felixhaedicke@web.de>
+Date: Thu, 19 Nov 2020 09:22:32 +0100
+Subject: HID: quirks: Add Apple Magic Trackpad 2 to hid_have_special_driver
+ list
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+The Apple Magic Trackpad 2 is handled by the magicmouse driver. And
+there were severe stability issues when both drivers (hid-generic and
+hid-magicmouse) were loaded for this device.
+
+Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=210241
+
+Signed-off-by: Felix Hädicke <felixhaedicke@web.de>
+---
+ drivers/hid/hid-quirks.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
+index bf7ecab5d9e5..142e9dae2837 100644
+--- a/drivers/hid/hid-quirks.c
++++ b/drivers/hid/hid-quirks.c
+@@ -478,6 +478,8 @@ static const struct hid_device_id hid_have_special_driver[] = {
+ #if IS_ENABLED(CONFIG_HID_MAGICMOUSE)
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICMOUSE) },
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICTRACKPAD) },
++ { HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICTRACKPAD2) },
++ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICTRACKPAD2) },
+ #endif
+ #if IS_ENABLED(CONFIG_HID_MAYFLASH)
+ { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_PS3) },
+--
+cgit v1.2.3-1-gf6bb5
+
+From f7f49141a5dbe9c99d78196b58c44307fb2e6be3 Mon Sep 17 00:00:00 2001
+From: Tk-Glitch <ti3nou@gmail.com>
+Date: Wed, 3 Feb 2021 11:20:12 +0200
+Subject: Revert "cpufreq: Avoid configuring old governors as default with intel_pstate"
+
+This is an undesirable behavior for us since our aggressive ondemand performs
+better than schedutil for gaming when using intel_pstate in passive mode.
+Also it interferes with the option to select the desired default governor we have.
+
+diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
+index 2c7171e0b0010..85de313ddec29 100644
+--- a/drivers/cpufreq/Kconfig
++++ b/drivers/cpufreq/Kconfig
+@@ -71,7 +71,6 @@ config CPU_FREQ_DEFAULT_GOV_USERSPACE
+
+ config CPU_FREQ_DEFAULT_GOV_ONDEMAND
+ bool "ondemand"
+- depends on !(X86_INTEL_PSTATE && SMP)
+ select CPU_FREQ_GOV_ONDEMAND
+ select CPU_FREQ_GOV_PERFORMANCE
+ help
+@@ -83,7 +84,6 @@ config CPU_FREQ_DEFAULT_GOV_ONDEMAND
+
+ config CPU_FREQ_DEFAULT_GOV_CONSERVATIVE
+ bool "conservative"
+- depends on !(X86_INTEL_PSTATE && SMP)
+ select CPU_FREQ_GOV_CONSERVATIVE
+ select CPU_FREQ_GOV_PERFORMANCE
+ help
+
+From 7695eb71d0872ed9633daf0ca779da3344b87dec Mon Sep 17 00:00:00 2001
+From: Evan Quan <evan.quan@amd.com>
+Date: Mon, 21 Aug 2023 14:15:13 +0800
+Subject: [PATCH] drm/amd/pm: correct SMU13 gfx voltage related OD settings
+
+The voltage offset setting will be applied to the whole v/f curve line
+instead of per anchor point base.
+
+Signed-off-by: Evan Quan <evan.quan@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/pm/amdgpu_pm.c | 45 +++++++------------
+ .../drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c | 31 ++++++-------
+ .../drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c | 31 ++++++-------
+ 3 files changed, 43 insertions(+), 64 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
+index 1da7ece4c627..06aa5c18b40f 100644
+--- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c
++++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
+@@ -643,18 +643,14 @@ static ssize_t amdgpu_set_pp_table(struct device *dev,
+ * They can be used to calibrate the sclk voltage curve. This is
+ * available for Vega20 and NV1X.
+ *
+- * - voltage offset for the six anchor points of the v/f curve labeled
+- * OD_VDDC_CURVE. They can be used to calibrate the v/f curve. This
+- * is only availabe for some SMU13 ASICs.
+- *
+ * - voltage offset(in mV) applied on target voltage calculation.
+- * This is available for Sienna Cichlid, Navy Flounder and Dimgrey
+- * Cavefish. For these ASICs, the target voltage calculation can be
+- * illustrated by "voltage = voltage calculated from v/f curve +
+- * overdrive vddgfx offset"
++ * This is available for Sienna Cichlid, Navy Flounder, Dimgrey
++ * Cavefish and some later SMU13 ASICs. For these ASICs, the target
++ * voltage calculation can be illustrated by "voltage = voltage
++ * calculated from v/f curve + overdrive vddgfx offset"
+ *
+- * - a list of valid ranges for sclk, mclk, and voltage curve points
+- * labeled OD_RANGE
++ * - a list of valid ranges for sclk, mclk, voltage curve points
++ * or voltage offset labeled OD_RANGE
+ *
+ * < For APUs >
+ *
+@@ -686,24 +682,17 @@ static ssize_t amdgpu_set_pp_table(struct device *dev,
+ * E.g., "p 2 0 800" would set the minimum core clock on core
+ * 2 to 800Mhz.
+ *
+- * For sclk voltage curve,
+- * - For NV1X, enter the new values by writing a string that
+- * contains "vc point clock voltage" to the file. The points
+- * are indexed by 0, 1 and 2. E.g., "vc 0 300 600" will update
+- * point1 with clock set as 300Mhz and voltage as 600mV. "vc 2
+- * 1000 1000" will update point3 with clock set as 1000Mhz and
+- * voltage 1000mV.
+- * - For SMU13 ASICs, enter the new values by writing a string that
+- * contains "vc anchor_point_index voltage_offset" to the file.
+- * There are total six anchor points defined on the v/f curve with
+- * index as 0 - 5.
+- * - "vc 0 10" will update the voltage offset for point1 as 10mv.
+- * - "vc 5 -10" will update the voltage offset for point6 as -10mv.
+- *
+- * To update the voltage offset applied for gfxclk/voltage calculation,
+- * enter the new value by writing a string that contains "vo offset".
+- * This is supported by Sienna Cichlid, Navy Flounder and Dimgrey Cavefish.
+- * And the offset can be a positive or negative value.
++ * For sclk voltage curve supported by Vega20 and NV1X, enter the new
++ * values by writing a string that contains "vc point clock voltage"
++ * to the file. The points are indexed by 0, 1 and 2. E.g., "vc 0 300
++ * 600" will update point1 with clock set as 300Mhz and voltage as 600mV.
++ * "vc 2 1000 1000" will update point3 with clock set as 1000Mhz and
++ * voltage 1000mV.
++ *
++ * For voltage offset supported by Sienna Cichlid, Navy Flounder, Dimgrey
++ * Cavefish and some later SMU13 ASICs, enter the new value by writing a
++ * string that contains "vo offset". E.g., "vo -10" will update the extra
++ * voltage offset applied to the whole v/f curve line as -10mv.
+ *
+ * - When you have edited all of the states as needed, write "c" (commit)
+ * to the file to commit your changes
+diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
+index 3903a47669e4..bd0d5f027cac 100644
+--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
++++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
+@@ -1304,16 +1304,14 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu,
+ od_table->OverDriveTable.UclkFmax);
+ break;
+
+- case SMU_OD_VDDC_CURVE:
++ case SMU_OD_VDDGFX_OFFSET:
+ if (!smu_v13_0_0_is_od_feature_supported(smu,
+ PP_OD_FEATURE_GFX_VF_CURVE_BIT))
+ break;
+
+- size += sysfs_emit_at(buf, size, "OD_VDDC_CURVE:\n");
+- for (i = 0; i < PP_NUM_OD_VF_CURVE_POINTS; i++)
+- size += sysfs_emit_at(buf, size, "%d: %dmv\n",
+- i,
+- od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[i]);
++ size += sysfs_emit_at(buf, size, "OD_VDDGFX_OFFSET:\n");
++ size += sysfs_emit_at(buf, size, "%dmV\n",
++ od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[0]);
+ break;
+
+ case SMU_OD_RANGE:
+@@ -1355,7 +1353,7 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu,
+ PP_OD_FEATURE_GFX_VF_CURVE,
+ &min_value,
+ &max_value);
+- size += sysfs_emit_at(buf, size, "VDDC_CURVE: %7dmv %10dmv\n",
++ size += sysfs_emit_at(buf, size, "VDDGFX_OFFSET: %7dmv %10dmv\n",
+ min_value, max_value);
+ }
+ break;
+@@ -1504,29 +1502,26 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu,
+ }
+ break;
+
+- case PP_OD_EDIT_VDDC_CURVE:
++ case PP_OD_EDIT_VDDGFX_OFFSET:
+ if (!smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_GFX_VF_CURVE_BIT)) {
+- dev_warn(adev->dev, "VF curve setting not supported!\n");
++ dev_warn(adev->dev, "Gfx offset setting not supported!\n");
+ return -ENOTSUPP;
+ }
+
+- if (input[0] >= PP_NUM_OD_VF_CURVE_POINTS ||
+- input[0] < 0)
+- return -EINVAL;
+-
+ smu_v13_0_0_get_od_setting_limits(smu,
+ PP_OD_FEATURE_GFX_VF_CURVE,
+ &minimum,
+ &maximum);
+- if (input[1] < minimum ||
+- input[1] > maximum) {
++ if (input[0] < minimum ||
++ input[0] > maximum) {
+ dev_info(adev->dev, "Voltage offset (%ld) must be within [%d, %d]!\n",
+- input[1], minimum, maximum);
++ input[0], minimum, maximum);
+ return -EINVAL;
+ }
+
+- od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[input[0]] = input[1];
+- od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_GFX_VF_CURVE_BIT;
++ for (i = 0; i < PP_NUM_OD_VF_CURVE_POINTS; i++)
++ od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[i] = input[0];
++ od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_GFX_VF_CURVE_BIT);
+ break;
+
+ case PP_OD_RESTORE_DEFAULT_TABLE:
+diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
+index 94ef5b4d116d..b9b3bf41eed3 100644
+--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
++++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
+@@ -1284,16 +1284,14 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu,
+ od_table->OverDriveTable.UclkFmax);
+ break;
+
+- case SMU_OD_VDDC_CURVE:
++ case SMU_OD_VDDGFX_OFFSET:
+ if (!smu_v13_0_7_is_od_feature_supported(smu,
+ PP_OD_FEATURE_GFX_VF_CURVE_BIT))
+ break;
+
+- size += sysfs_emit_at(buf, size, "OD_VDDC_CURVE:\n");
+- for (i = 0; i < PP_NUM_OD_VF_CURVE_POINTS; i++)
+- size += sysfs_emit_at(buf, size, "%d: %dmv\n",
+- i,
+- od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[i]);
++ size += sysfs_emit_at(buf, size, "OD_VDDGFX_OFFSET:\n");
++ size += sysfs_emit_at(buf, size, "%dmV\n",
++ od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[0]);
+ break;
+
+ case SMU_OD_RANGE:
+@@ -1335,7 +1333,7 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu,
+ PP_OD_FEATURE_GFX_VF_CURVE,
+ &min_value,
+ &max_value);
+- size += sysfs_emit_at(buf, size, "VDDC_CURVE: %7dmv %10dmv\n",
++ size += sysfs_emit_at(buf, size, "VDDGFX_OFFSET: %7dmv %10dmv\n",
+ min_value, max_value);
+ }
+ break;
+@@ -1484,29 +1482,26 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu,
+ }
+ break;
+
+- case PP_OD_EDIT_VDDC_CURVE:
++ case PP_OD_EDIT_VDDGFX_OFFSET:
+ if (!smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_GFX_VF_CURVE_BIT)) {
+- dev_warn(adev->dev, "VF curve setting not supported!\n");
++ dev_warn(adev->dev, "Gfx offset setting not supported!\n");
+ return -ENOTSUPP;
+ }
+
+- if (input[0] >= PP_NUM_OD_VF_CURVE_POINTS ||
+- input[0] < 0)
+- return -EINVAL;
+-
+ smu_v13_0_7_get_od_setting_limits(smu,
+ PP_OD_FEATURE_GFX_VF_CURVE,
+ &minimum,
+ &maximum);
+- if (input[1] < minimum ||
+- input[1] > maximum) {
++ if (input[0] < minimum ||
++ input[0] > maximum) {
+ dev_info(adev->dev, "Voltage offset (%ld) must be within [%d, %d]!\n",
+- input[1], minimum, maximum);
++ input[0], minimum, maximum);
+ return -EINVAL;
+ }
+
+- od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[input[0]] = input[1];
+- od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_GFX_VF_CURVE_BIT;
++ for (i = 0; i < PP_NUM_OD_VF_CURVE_POINTS; i++)
++ od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[i] = input[0];
++ od_table->OverDriveTable.FeatureCtrlMask |= BIT(PP_OD_FEATURE_GFX_VF_CURVE_BIT);
+ break;
+
+ case PP_OD_RESTORE_DEFAULT_TABLE:
+--
+GitLab
+
+
+From 8bad128720ebc69e37f1c66767fb276088ef4fa7 Mon Sep 17 00:00:00 2001
+From: Evan Quan <evan.quan@amd.com>
+Date: Wed, 16 Aug 2023 14:51:19 +0800
+Subject: [PATCH] drm/amd/pm: fulfill the support for SMU13 `pp_dpm_dcefclk`
+ interface
+
+Fulfill the incomplete SMU13 `pp_dpm_dcefclk` implementation.
+
+Reported-by: Guan Yu <guan.yu@amd.com>
+Signed-off-by: Evan Quan <evan.quan@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ .../drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c | 27 +++++++++++++++++++
+ .../drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c | 27 +++++++++++++++++++
+ 2 files changed, 54 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
+index bd0d5f027cac..5fdb2b3c042a 100644
+--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
++++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
+@@ -176,6 +176,7 @@ static struct cmn2asic_mapping smu_v13_0_0_clk_map[SMU_CLK_COUNT] = {
+ CLK_MAP(VCLK1, PPCLK_VCLK_1),
+ CLK_MAP(DCLK, PPCLK_DCLK_0),
+ CLK_MAP(DCLK1, PPCLK_DCLK_1),
++ CLK_MAP(DCEFCLK, PPCLK_DCFCLK),
+ };
+
+ static struct cmn2asic_mapping smu_v13_0_0_feature_mask_map[SMU_FEATURE_COUNT] = {
+@@ -707,6 +708,22 @@ static int smu_v13_0_0_set_default_dpm_table(struct smu_context *smu)
+ pcie_table->num_of_link_levels++;
+ }
+
++ /* dcefclk dpm table setup */
++ dpm_table = &dpm_context->dpm_tables.dcef_table;
++ if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_DPM_DCN_BIT)) {
++ ret = smu_v13_0_set_single_dpm_table(smu,
++ SMU_DCEFCLK,
++ dpm_table);
++ if (ret)
++ return ret;
++ } else {
++ dpm_table->count = 1;
++ dpm_table->dpm_levels[0].value = smu->smu_table.boot_values.dcefclk / 100;
++ dpm_table->dpm_levels[0].enabled = true;
++ dpm_table->min = dpm_table->dpm_levels[0].value;
++ dpm_table->max = dpm_table->dpm_levels[0].value;
++ }
++
+ return 0;
+ }
+
+@@ -794,6 +811,9 @@ static int smu_v13_0_0_get_smu_metrics_data(struct smu_context *smu,
+ case METRICS_CURR_FCLK:
+ *value = metrics->CurrClock[PPCLK_FCLK];
+ break;
++ case METRICS_CURR_DCEFCLK:
++ *value = metrics->CurrClock[PPCLK_DCFCLK];
++ break;
+ case METRICS_AVERAGE_GFXCLK:
+ if (metrics->AverageGfxActivity <= SMU_13_0_0_BUSY_THRESHOLD)
+ *value = metrics->AverageGfxclkFrequencyPostDs;
+@@ -1047,6 +1067,9 @@ static int smu_v13_0_0_get_current_clk_freq_by_table(struct smu_context *smu,
+ case PPCLK_DCLK_1:
+ member_type = METRICS_AVERAGE_DCLK1;
+ break;
++ case PPCLK_DCFCLK:
++ member_type = METRICS_CURR_DCEFCLK;
++ break;
+ default:
+ return -EINVAL;
+ }
+@@ -1196,6 +1219,9 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu,
+ case SMU_DCLK1:
+ single_dpm_table = &(dpm_context->dpm_tables.dclk_table);
+ break;
++ case SMU_DCEFCLK:
++ single_dpm_table = &(dpm_context->dpm_tables.dcef_table);
++ break;
+ default:
+ break;
+ }
+@@ -1209,6 +1235,7 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu,
+ case SMU_VCLK1:
+ case SMU_DCLK:
+ case SMU_DCLK1:
++ case SMU_DCEFCLK:
+ ret = smu_v13_0_0_get_current_clk_freq_by_table(smu, clk_type, &curr_freq);
+ if (ret) {
+ dev_err(smu->adev->dev, "Failed to get current clock freq!");
+diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
+index b9b3bf41eed3..12949928e285 100644
+--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
++++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
+@@ -147,6 +147,7 @@ static struct cmn2asic_mapping smu_v13_0_7_clk_map[SMU_CLK_COUNT] = {
+ CLK_MAP(VCLK1, PPCLK_VCLK_1),
+ CLK_MAP(DCLK, PPCLK_DCLK_0),
+ CLK_MAP(DCLK1, PPCLK_DCLK_1),
++ CLK_MAP(DCEFCLK, PPCLK_DCFCLK),
+ };
+
+ static struct cmn2asic_mapping smu_v13_0_7_feature_mask_map[SMU_FEATURE_COUNT] = {
+@@ -696,6 +697,22 @@ static int smu_v13_0_7_set_default_dpm_table(struct smu_context *smu)
+ pcie_table->num_of_link_levels++;
+ }
+
++ /* dcefclk dpm table setup */
++ dpm_table = &dpm_context->dpm_tables.dcef_table;
++ if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_DPM_DCN_BIT)) {
++ ret = smu_v13_0_set_single_dpm_table(smu,
++ SMU_DCEFCLK,
++ dpm_table);
++ if (ret)
++ return ret;
++ } else {
++ dpm_table->count = 1;
++ dpm_table->dpm_levels[0].value = smu->smu_table.boot_values.dcefclk / 100;
++ dpm_table->dpm_levels[0].enabled = true;
++ dpm_table->min = dpm_table->dpm_levels[0].value;
++ dpm_table->max = dpm_table->dpm_levels[0].value;
++ }
++
+ return 0;
+ }
+
+@@ -777,6 +794,9 @@ static int smu_v13_0_7_get_smu_metrics_data(struct smu_context *smu,
+ case METRICS_CURR_FCLK:
+ *value = metrics->CurrClock[PPCLK_FCLK];
+ break;
++ case METRICS_CURR_DCEFCLK:
++ *value = metrics->CurrClock[PPCLK_DCFCLK];
++ break;
+ case METRICS_AVERAGE_GFXCLK:
+ *value = metrics->AverageGfxclkFrequencyPreDs;
+ break;
+@@ -1027,6 +1047,9 @@ static int smu_v13_0_7_get_current_clk_freq_by_table(struct smu_context *smu,
+ case PPCLK_DCLK_1:
+ member_type = METRICS_CURR_DCLK1;
+ break;
++ case PPCLK_DCFCLK:
++ member_type = METRICS_CURR_DCEFCLK;
++ break;
+ default:
+ return -EINVAL;
+ }
+@@ -1176,6 +1199,9 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu,
+ case SMU_DCLK1:
+ single_dpm_table = &(dpm_context->dpm_tables.dclk_table);
+ break;
++ case SMU_DCEFCLK:
++ single_dpm_table = &(dpm_context->dpm_tables.dcef_table);
++ break;
+ default:
+ break;
+ }
+@@ -1189,6 +1215,7 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu,
+ case SMU_VCLK1:
+ case SMU_DCLK:
+ case SMU_DCLK1:
++ case SMU_DCEFCLK:
+ ret = smu_v13_0_7_get_current_clk_freq_by_table(smu, clk_type, &curr_freq);
+ if (ret) {
+ dev_err(smu->adev->dev, "Failed to get current clock freq!");
+--
+GitLab
+
+From 3a2fb905145e76e4bbb32e90e0c6cd532dafb1b0 Mon Sep 17 00:00:00 2001
+From: Evan Quan <evan.quan@amd.com>
+Date: Mon, 14 Aug 2023 10:16:27 +0800
+Subject: [PATCH] Revert "drm/amd/pm: disable the SMU13 OD feature support
+ temporarily"
+
+This reverts commit 3592cc20beeece83db4c50a0f400e2dd15139de9.
+
+The enablement for the new OD mechanism completed. Also, the support for
+fan control related OD feature has been added via this new mechanism.
+Thus, it is time to bring back the SMU13 OD support.
+
+Signed-off-by: Evan Quan <evan.quan@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ .../drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c | 18 +++---------------
+ .../drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c | 12 +++---------
+ 2 files changed, 6 insertions(+), 24 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
+index c48f81450d24..093962a37688 100644
+--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
++++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
+@@ -348,13 +348,10 @@ static int smu_v13_0_0_check_powerplay_table(struct smu_context *smu)
+ table_context->power_play_table;
+ struct smu_baco_context *smu_baco = &smu->smu_baco;
+ PPTable_t *pptable = smu->smu_table.driver_pptable;
+-#if 0
+- PPTable_t *pptable = smu->smu_table.driver_pptable;
+ const OverDriveLimits_t * const overdrive_upperlimits =
+ &pptable->SkuTable.OverDriveLimitsBasicMax;
+ const OverDriveLimits_t * const overdrive_lowerlimits =
+ &pptable->SkuTable.OverDriveLimitsMin;
+-#endif
+
+ if (powerplay_table->platform_caps & SMU_13_0_0_PP_PLATFORM_CAP_HARDWAREDC)
+ smu->dc_controlled_by_gpio = true;
+@@ -357,27 +357,18 @@
+ smu_baco->maco_support = true;
+ }
+
+- /*
+- * We are in the transition to a new OD mechanism.
+- * Disable the OD feature support for SMU13 temporarily.
+- * TODO: get this reverted when new OD mechanism online
+- */
+-#if 0
+ if (!overdrive_lowerlimits->FeatureCtrlMask ||
+ !overdrive_upperlimits->FeatureCtrlMask)
+ smu->od_enabled = false;
+
++ table_context->thermal_controller_type =
++ powerplay_table->thermal_controller_type;
++
+ /*
+ * Instead of having its own buffer space and get overdrive_table copied,
+ * smu->od_settings just points to the actual overdrive_table
+ */
+ smu->od_settings = &powerplay_table->overdrive_table;
+-#else
+- smu->od_enabled = false;
+-#endif
+-
+- table_context->thermal_controller_type =
+- powerplay_table->thermal_controller_type;
+
+ smu->adev->pm.no_fan =
+ !(pptable->SkuTable.FeaturesToRun[0] & (1 << FEATURE_FAN_CONTROL_BIT));
+diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
+index 99bc449799a6..430ad1b05ba3 100644
+--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
++++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
+@@ -338,12 +338,10 @@ static int smu_v13_0_7_check_powerplay_table(struct smu_context *smu)
+ struct smu_baco_context *smu_baco = &smu->smu_baco;
+ PPTable_t *smc_pptable = table_context->driver_pptable;
+ BoardTable_t *BoardTable = &smc_pptable->BoardTable;
+-#if 0
+ const OverDriveLimits_t * const overdrive_upperlimits =
+ &smc_pptable->SkuTable.OverDriveLimitsBasicMax;
+ const OverDriveLimits_t * const overdrive_lowerlimits =
+ &smc_pptable->SkuTable.OverDriveLimitsMin;
+-#endif
+
+ if (powerplay_table->platform_caps & SMU_13_0_7_PP_PLATFORM_CAP_HARDWAREDC)
+ smu->dc_controlled_by_gpio = true;
+@@ -348,22 +348,18 @@
+ smu_baco->maco_support = true;
+ }
+
+-#if 0
+ if (!overdrive_lowerlimits->FeatureCtrlMask ||
+ !overdrive_upperlimits->FeatureCtrlMask)
+ smu->od_enabled = false;
+
++ table_context->thermal_controller_type =
++ powerplay_table->thermal_controller_type;
++
+ /*
+ * Instead of having its own buffer space and get overdrive_table copied,
+ * smu->od_settings just points to the actual overdrive_table
+ */
+ smu->od_settings = &powerplay_table->overdrive_table;
+-#else
+- smu->od_enabled = false;
+-#endif
+-
+- table_context->thermal_controller_type =
+- powerplay_table->thermal_controller_type;
+
+ return 0;
+ }
+--
+GitLab
+
+From 072a8dc3b5260ba08ba2e66036c2c63abd77df52 Mon Sep 17 00:00:00 2001
+From: Lijo Lazar <lijo.lazar@amd.com>
+Date: Thu, 24 Aug 2023 17:25:51 +0530
+Subject: [PATCH] drm/amd/pm: Fix clock reporting for SMUv13.0.6
+
+On SMU v13.0.6, effective clocks are reported by FW which won't exactly
+match with DPM level. Report the current clock based on the values
+matching closest to the effective clock. Also, when deep sleep is
+applied to a clock, report it with a special level "S:" as in sample
+clock levels below
+
+S: 19Mhz *
+0: 615Mhz
+1: 800Mhz
+2: 888Mhz
+3: 1000Mhz
+
+Signed-off-by: Lijo Lazar <lijo.lazar@amd.com>
+Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
+Reviewed-by: Evan Quan <evan.quan@amd.com>
+---
+ .../drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c | 159 +++++++-----------
+ 1 file changed, 62 insertions(+), 97 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
+index c2308783053c..29e1cada7667 100644
+--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
++++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
+@@ -91,6 +91,8 @@
+ #define PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT 0x5
+ #define LINK_SPEED_MAX 4
+
++#define SMU_13_0_6_DSCLK_THRESHOLD 100
++
+ static const struct cmn2asic_msg_mapping smu_v13_0_6_message_map[SMU_MSG_MAX_COUNT] = {
+ MSG_MAP(TestMessage, PPSMC_MSG_TestMessage, 0),
+ MSG_MAP(GetSmuVersion, PPSMC_MSG_GetSmuVersion, 1),
+@@ -783,13 +785,61 @@ static int smu_v13_0_6_get_current_clk_freq_by_table(struct smu_context *smu,
+ return smu_v13_0_6_get_smu_metrics_data(smu, member_type, value);
+ }
+
++static int smu_v13_0_6_print_clks(struct smu_context *smu, char *buf,
++ struct smu_13_0_dpm_table *single_dpm_table,
++ uint32_t curr_clk, const char *clk_name)
++{
++ struct pp_clock_levels_with_latency clocks;
++ int i, ret, size = 0, level = -1;
++ uint32_t clk1, clk2;
++
++ ret = smu_v13_0_6_get_clk_table(smu, &clocks, single_dpm_table);
++ if (ret) {
++ dev_err(smu->adev->dev, "Attempt to get %s clk levels failed!",
++ clk_name);
++ return ret;
++ }
++
++ if (!clocks.num_levels)
++ return -EINVAL;
++
++ if (curr_clk < SMU_13_0_6_DSCLK_THRESHOLD) {
++ size = sysfs_emit_at(buf, size, "S: %uMhz *\n", curr_clk);
++ for (i = 0; i < clocks.num_levels; i++)
++ size += sysfs_emit_at(buf, size, "%d: %uMhz\n", i,
++ clocks.data[i].clocks_in_khz /
++ 1000);
++
++ } else {
++ if ((clocks.num_levels == 1) ||
++ (curr_clk < (clocks.data[0].clocks_in_khz / 1000)))
++ level = 0;
++ for (i = 0; i < clocks.num_levels; i++) {
++ clk1 = clocks.data[i].clocks_in_khz / 1000;
++
++ if (i < (clocks.num_levels - 1))
++ clk2 = clocks.data[i + 1].clocks_in_khz / 1000;
++
++ if (curr_clk >= clk1 && curr_clk < clk2) {
++ level = (curr_clk - clk1) <= (clk2 - curr_clk) ?
++ i :
++ i + 1;
++ }
++
++ size += sysfs_emit_at(buf, size, "%d: %uMhz %s\n", i,
++ clk1, (level == i) ? "*" : "");
++ }
++ }
++
++ return size;
++}
++
+ static int smu_v13_0_6_print_clk_levels(struct smu_context *smu,
+ enum smu_clk_type type, char *buf)
+ {
+- int i, now, size = 0;
++ int now, size = 0;
+ int ret = 0;
+ struct smu_umd_pstate_table *pstate_table = &smu->pstate_table;
+- struct pp_clock_levels_with_latency clocks;
+ struct smu_13_0_dpm_table *single_dpm_table;
+ struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
+ struct smu_13_0_dpm_context *dpm_context = NULL;
+@@ -852,26 +902,9 @@ static int smu_v13_0_6_print_clk_levels(struct smu_context *smu,
+ }
+
+ single_dpm_table = &(dpm_context->dpm_tables.uclk_table);
+- ret = smu_v13_0_6_get_clk_table(smu, &clocks, single_dpm_table);
+- if (ret) {
+- dev_err(smu->adev->dev,
+- "Attempt to get memory clk levels Failed!");
+- return ret;
+- }
+
+- for (i = 0; i < clocks.num_levels; i++)
+- size += sysfs_emit_at(
+- buf, size, "%d: %uMhz %s\n", i,
+- clocks.data[i].clocks_in_khz / 1000,
+- (clocks.num_levels == 1) ?
+- "*" :
+- (smu_v13_0_6_freqs_in_same_level(
+- clocks.data[i].clocks_in_khz /
+- 1000,
+- now) ?
+- "*" :
+- ""));
+- break;
++ return smu_v13_0_6_print_clks(smu, buf, single_dpm_table, now,
++ "mclk");
+
+ case SMU_SOCCLK:
+ ret = smu_v13_0_6_get_current_clk_freq_by_table(smu, SMU_SOCCLK,
+@@ -883,26 +916,9 @@ static int smu_v13_0_6_print_clk_levels(struct smu_context *smu,
+ }
+
+ single_dpm_table = &(dpm_context->dpm_tables.soc_table);
+- ret = smu_v13_0_6_get_clk_table(smu, &clocks, single_dpm_table);
+- if (ret) {
+- dev_err(smu->adev->dev,
+- "Attempt to get socclk levels Failed!");
+- return ret;
+- }
+
+- for (i = 0; i < clocks.num_levels; i++)
+- size += sysfs_emit_at(
+- buf, size, "%d: %uMhz %s\n", i,
+- clocks.data[i].clocks_in_khz / 1000,
+- (clocks.num_levels == 1) ?
+- "*" :
+- (smu_v13_0_6_freqs_in_same_level(
+- clocks.data[i].clocks_in_khz /
+- 1000,
+- now) ?
+- "*" :
+- ""));
+- break;
++ return smu_v13_0_6_print_clks(smu, buf, single_dpm_table, now,
++ "socclk");
+
+ case SMU_FCLK:
+ ret = smu_v13_0_6_get_current_clk_freq_by_table(smu, SMU_FCLK,
+@@ -914,26 +930,9 @@ static int smu_v13_0_6_print_clk_levels(struct smu_context *smu,
+ }
+
+ single_dpm_table = &(dpm_context->dpm_tables.fclk_table);
+- ret = smu_v13_0_6_get_clk_table(smu, &clocks, single_dpm_table);
+- if (ret) {
+- dev_err(smu->adev->dev,
+- "Attempt to get fclk levels Failed!");
+- return ret;
+- }
+
+- for (i = 0; i < single_dpm_table->count; i++)
+- size += sysfs_emit_at(
+- buf, size, "%d: %uMhz %s\n", i,
+- single_dpm_table->dpm_levels[i].value,
+- (clocks.num_levels == 1) ?
+- "*" :
+- (smu_v13_0_6_freqs_in_same_level(
+- clocks.data[i].clocks_in_khz /
+- 1000,
+- now) ?
+- "*" :
+- ""));
+- break;
++ return smu_v13_0_6_print_clks(smu, buf, single_dpm_table, now,
++ "fclk");
+
+ case SMU_VCLK:
+ ret = smu_v13_0_6_get_current_clk_freq_by_table(smu, SMU_VCLK,
+@@ -945,26 +944,9 @@ static int smu_v13_0_6_print_clk_levels(struct smu_context *smu,
+ }
+
+ single_dpm_table = &(dpm_context->dpm_tables.vclk_table);
+- ret = smu_v13_0_6_get_clk_table(smu, &clocks, single_dpm_table);
+- if (ret) {
+- dev_err(smu->adev->dev,
+- "Attempt to get vclk levels Failed!");
+- return ret;
+- }
+
+- for (i = 0; i < single_dpm_table->count; i++)
+- size += sysfs_emit_at(
+- buf, size, "%d: %uMhz %s\n", i,
+- single_dpm_table->dpm_levels[i].value,
+- (clocks.num_levels == 1) ?
+- "*" :
+- (smu_v13_0_6_freqs_in_same_level(
+- clocks.data[i].clocks_in_khz /
+- 1000,
+- now) ?
+- "*" :
+- ""));
+- break;
++ return smu_v13_0_6_print_clks(smu, buf, single_dpm_table, now,
++ "vclk");
+
+ case SMU_DCLK:
+ ret = smu_v13_0_6_get_current_clk_freq_by_table(smu, SMU_DCLK,
+@@ -976,26 +958,9 @@ static int smu_v13_0_6_print_clk_levels(struct smu_context *smu,
+ }
+
+ single_dpm_table = &(dpm_context->dpm_tables.dclk_table);
+- ret = smu_v13_0_6_get_clk_table(smu, &clocks, single_dpm_table);
+- if (ret) {
+- dev_err(smu->adev->dev,
+- "Attempt to get dclk levels Failed!");
+- return ret;
+- }
+
+- for (i = 0; i < single_dpm_table->count; i++)
+- size += sysfs_emit_at(
+- buf, size, "%d: %uMhz %s\n", i,
+- single_dpm_table->dpm_levels[i].value,
+- (clocks.num_levels == 1) ?
+- "*" :
+- (smu_v13_0_6_freqs_in_same_level(
+- clocks.data[i].clocks_in_khz /
+- 1000,
+- now) ?
+- "*" :
+- ""));
+- break;
++ return smu_v13_0_6_print_clks(smu, buf, single_dpm_table, now,
++ "dclk");
+
+ default:
+ break;
+--
+GitLab
+