]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/pm: Use generic pcie dpm table for SMUv14
authorLijo Lazar <lijo.lazar@amd.com>
Tue, 25 Nov 2025 12:33:30 +0000 (18:03 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 8 Dec 2025 19:19:59 +0000 (14:19 -0500)
Use smu_pcie_table for SMUv14 SOCs.

Signed-off-by: Lijo Lazar <lijo.lazar@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/swsmu/inc/smu_v14_0.h
drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c

index 5b6fa8fdce2d43f43d197cd440c3d4fd5e407aca..4ecec85b84048cdce234f75f90a662024a0ded71 100644 (file)
@@ -66,13 +66,6 @@ struct smu_14_0_max_sustainable_clocks {
        uint32_t soc_clock;
 };
 
-struct smu_14_0_pcie_table {
-       uint8_t  pcie_gen[MAX_PCIE_CONF];
-       uint8_t  pcie_lane[MAX_PCIE_CONF];
-       uint16_t clk_freq[MAX_PCIE_CONF];
-       uint32_t num_of_link_levels;
-};
-
 struct smu_14_0_dpm_tables {
        struct smu_dpm_table        soc_table;
        struct smu_dpm_table        gfx_table;
@@ -85,7 +78,7 @@ struct smu_14_0_dpm_tables {
        struct smu_dpm_table        display_table;
        struct smu_dpm_table        phy_table;
        struct smu_dpm_table        fclk_table;
-       struct smu_14_0_pcie_table       pcie_table;
+       struct smu_pcie_table       pcie_table;
 };
 
 struct smu_14_0_dpm_context {
index daa51364cb24ce1ff5925a3924f834e2e5627492..596cdba0a8b464e927fe6bc7a51664c7ae5c7d42 100644 (file)
@@ -1046,7 +1046,7 @@ static int smu_v14_0_2_emit_clk_levels(struct smu_context *smu,
        OverDriveTableExternal_t *od_table =
                (OverDriveTableExternal_t *)smu->smu_table.overdrive_table;
        struct smu_dpm_table *single_dpm_table;
-       struct smu_14_0_pcie_table *pcie_table;
+       struct smu_pcie_table *pcie_table;
        uint32_t gen_speed, lane_width;
        int i, curr_freq, size = *offset, start_offset = *offset;
        int32_t min_value, max_value;
@@ -1150,7 +1150,7 @@ static int smu_v14_0_2_emit_clk_levels(struct smu_context *smu,
                        return ret;
 
                pcie_table = &(dpm_context->dpm_tables.pcie_table);
-               for (i = 0; i < pcie_table->num_of_link_levels; i++)
+               for (i = 0; i < pcie_table->lclk_levels; i++)
                        size += sysfs_emit_at(buf, size, "%d: %s %s %dMhz %s\n", i,
                                        (pcie_table->pcie_gen[i] == 0) ? "2.5GT/s," :
                                        (pcie_table->pcie_gen[i] == 1) ? "5.0GT/s," :
@@ -1164,7 +1164,7 @@ static int smu_v14_0_2_emit_clk_levels(struct smu_context *smu,
                                        (pcie_table->pcie_lane[i] == 5) ? "x12" :
                                        (pcie_table->pcie_lane[i] == 6) ? "x16" :
                                        (pcie_table->pcie_lane[i] == 7) ? "x32" : "",
-                                       pcie_table->clk_freq[i],
+                                       pcie_table->lclk_freq[i],
                                        (gen_speed == DECODE_GEN_SPEED(pcie_table->pcie_gen[i])) &&
                                        (lane_width == DECODE_LANE_WIDTH(pcie_table->pcie_lane[i])) ?
                                        "*" : "");
@@ -1454,9 +1454,9 @@ static int smu_v14_0_2_update_pcie_parameters(struct smu_context *smu,
                                              uint8_t pcie_width_cap)
 {
        struct smu_14_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
-       struct smu_14_0_pcie_table *pcie_table =
+       struct smu_pcie_table *pcie_table =
                                &dpm_context->dpm_tables.pcie_table;
-       int num_of_levels;
+       int lclk_levels;
        uint32_t smu_pcie_arg;
        uint32_t link_level;
        struct smu_table_context *table_context = &smu->smu_table;
@@ -1465,34 +1465,34 @@ static int smu_v14_0_2_update_pcie_parameters(struct smu_context *smu,
        int ret = 0;
        int i;
 
-       pcie_table->num_of_link_levels = 0;
+       pcie_table->lclk_levels = 0;
        for (link_level = 0; link_level < NUM_LINK_LEVELS; link_level++) {
                if (!skutable->PcieGenSpeed[link_level] &&
                    !skutable->PcieLaneCount[link_level] &&
                    !skutable->LclkFreq[link_level])
                        continue;
 
-               pcie_table->pcie_gen[pcie_table->num_of_link_levels] =
+               pcie_table->pcie_gen[pcie_table->lclk_levels] =
                                        skutable->PcieGenSpeed[link_level];
-               pcie_table->pcie_lane[pcie_table->num_of_link_levels] =
+               pcie_table->pcie_lane[pcie_table->lclk_levels] =
                                        skutable->PcieLaneCount[link_level];
-               pcie_table->clk_freq[pcie_table->num_of_link_levels] =
+               pcie_table->lclk_freq[pcie_table->lclk_levels] =
                                        skutable->LclkFreq[link_level];
-               pcie_table->num_of_link_levels++;
+               pcie_table->lclk_levels++;
        }
-       num_of_levels = pcie_table->num_of_link_levels;
-       if (!num_of_levels)
+       lclk_levels = pcie_table->lclk_levels;
+       if (!lclk_levels)
                return 0;
 
        if (!(smu->adev->pm.pp_feature & PP_PCIE_DPM_MASK)) {
-               if (pcie_table->pcie_gen[num_of_levels - 1] < pcie_gen_cap)
-                       pcie_gen_cap = pcie_table->pcie_gen[num_of_levels - 1];
+               if (pcie_table->pcie_gen[lclk_levels - 1] < pcie_gen_cap)
+                       pcie_gen_cap = pcie_table->pcie_gen[lclk_levels - 1];
 
-               if (pcie_table->pcie_lane[num_of_levels - 1] < pcie_width_cap)
-                       pcie_width_cap = pcie_table->pcie_lane[num_of_levels - 1];
+               if (pcie_table->pcie_lane[lclk_levels - 1] < pcie_width_cap)
+                       pcie_width_cap = pcie_table->pcie_lane[lclk_levels - 1];
 
                /* Force all levels to use the same settings */
-               for (i = 0; i < num_of_levels; i++) {
+               for (i = 0; i < lclk_levels; i++) {
                        pcie_table->pcie_gen[i] = pcie_gen_cap;
                        pcie_table->pcie_lane[i] = pcie_width_cap;
                        smu_pcie_arg = i << 16;
@@ -1507,7 +1507,7 @@ static int smu_v14_0_2_update_pcie_parameters(struct smu_context *smu,
                                break;
                }
        } else {
-               for (i = 0; i < num_of_levels; i++) {
+               for (i = 0; i < lclk_levels; i++) {
                        if (pcie_table->pcie_gen[i] > pcie_gen_cap ||
                                pcie_table->pcie_lane[i] > pcie_width_cap) {
                                pcie_table->pcie_gen[i] = pcie_table->pcie_gen[i] > pcie_gen_cap ?