Re: [PATCH] drm/amd: Fix logic error in sienna_cichlid_update_pcie_parameters()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Sep 28, 2023 at 6:16 PM Mario Limonciello
<mario.limonciello@xxxxxxx> wrote:
>
> While aligning SMU11 with SMU13 implementation an assumption was made that
> `dpm_context->dpm_tables.pcie_table` was populated in dpm table initialization
> like in SMU13 but it isn't.
>
> So restore some of the original logic and instead just check for
> amdgpu_device_pcie_dynamic_switching_supported() to decide whether to hardcode
> values; erring on the side of performance.
>
> Cc: stable@xxxxxxxxxxxxxxx # 6.1+
> Reported-and-tested-by: Umio Yasuno <coelacanth_dream@xxxxxxxxxxxxxx>
> Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/1447#note_2101382
> Fixes: e701156ccc6c ("drm/amd: Align SMU11 SMU_MSG_OverridePcieParameters implementation with SMU13")
> Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx>

Reviewed-by: Alex Deucher <alexander.deucher@xxxxxxx>

> ---
>  .../amd/pm/swsmu/smu11/sienna_cichlid_ppt.c   | 41 +++++++++++--------
>  1 file changed, 23 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
> index f0800c0c5168..9119b0df2419 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
> +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
> @@ -2081,36 +2081,41 @@ static int sienna_cichlid_display_disable_memory_clock_switch(struct smu_context
>         return ret;
>  }
>
> +#define MAX(a, b)      ((a) > (b) ? (a) : (b))
> +
>  static int sienna_cichlid_update_pcie_parameters(struct smu_context *smu,
>                                          uint32_t pcie_gen_cap,
>                                          uint32_t pcie_width_cap)
>  {
>         struct smu_11_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
>         struct smu_11_0_pcie_table *pcie_table = &dpm_context->dpm_tables.pcie_table;
> -       u32 smu_pcie_arg;
> +       uint8_t *table_member1, *table_member2;
> +       uint32_t min_gen_speed, max_gen_speed;
> +       uint32_t min_lane_width, max_lane_width;
> +       uint32_t smu_pcie_arg;
>         int ret, i;
>
> -       /* PCIE gen speed and lane width override */
> -       if (!amdgpu_device_pcie_dynamic_switching_supported()) {
> -               if (pcie_table->pcie_gen[NUM_LINK_LEVELS - 1] < pcie_gen_cap)
> -                       pcie_gen_cap = pcie_table->pcie_gen[NUM_LINK_LEVELS - 1];
> +       GET_PPTABLE_MEMBER(PcieGenSpeed, &table_member1);
> +       GET_PPTABLE_MEMBER(PcieLaneCount, &table_member2);
>
> -               if (pcie_table->pcie_lane[NUM_LINK_LEVELS - 1] < pcie_width_cap)
> -                       pcie_width_cap = pcie_table->pcie_lane[NUM_LINK_LEVELS - 1];
> +       min_gen_speed = MAX(0, table_member1[0]);
> +       max_gen_speed = MIN(pcie_gen_cap, table_member1[1]);
> +       min_gen_speed = min_gen_speed > max_gen_speed ?
> +                       max_gen_speed : min_gen_speed;
> +       min_lane_width = MAX(1, table_member2[0]);
> +       max_lane_width = MIN(pcie_width_cap, table_member2[1]);
> +       min_lane_width = min_lane_width > max_lane_width ?
> +                        max_lane_width : min_lane_width;
>
> -               /* Force all levels to use the same settings */
> -               for (i = 0; i < NUM_LINK_LEVELS; i++) {
> -                       pcie_table->pcie_gen[i] = pcie_gen_cap;
> -                       pcie_table->pcie_lane[i] = pcie_width_cap;
> -               }
> +       if (!amdgpu_device_pcie_dynamic_switching_supported()) {
> +               pcie_table->pcie_gen[0] = max_gen_speed;
> +               pcie_table->pcie_lane[0] = max_lane_width;
>         } else {
> -               for (i = 0; i < NUM_LINK_LEVELS; i++) {
> -                       if (pcie_table->pcie_gen[i] > pcie_gen_cap)
> -                               pcie_table->pcie_gen[i] = pcie_gen_cap;
> -                       if (pcie_table->pcie_lane[i] > pcie_width_cap)
> -                               pcie_table->pcie_lane[i] = pcie_width_cap;
> -               }
> +               pcie_table->pcie_gen[0] = min_gen_speed;
> +               pcie_table->pcie_lane[0] = min_lane_width;
>         }
> +       pcie_table->pcie_gen[1] = max_gen_speed;
> +       pcie_table->pcie_lane[1] = max_lane_width;
>
>         for (i = 0; i < NUM_LINK_LEVELS; i++) {
>                 smu_pcie_arg = (i << 16 |
> --
> 2.34.1
>




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux