[PATCH] drm/amd/powerplay: read pcie speed/width info
Quan, Evan
Evan.Quan at amd.com
Tue Nov 12 08:55:56 UTC 2019
> -----Original Message-----
> From: amd-gfx <amd-gfx-bounces at lists.freedesktop.org> On Behalf Of
> Kenneth Feng
> Sent: Tuesday, November 12, 2019 4:40 PM
> To: amd-gfx at lists.freedesktop.org
> Cc: Feng, Kenneth <Kenneth.Feng at amd.com>
> Subject: [PATCH] drm/amd/powerplay: read pcie speed/width info
>
> sysfs interface to read pcie speed&width info on navi1x.
>
> Signed-off-by: Kenneth Feng <kenneth.feng at amd.com>
> ---
> drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | 10 +++---
> drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h | 8 +++++
> drivers/gpu/drm/amd/powerplay/navi10_ppt.c | 50
> ++++++++++++++++++++++++++-
> drivers/gpu/drm/amd/powerplay/navi10_ppt.h | 3 ++
> 4 files changed, 66 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
> b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
> index 57459a6..69243a8 100644
> --- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
> +++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
> @@ -1068,10 +1068,6 @@ static int smu_smc_table_hw_init(struct
> smu_context *smu,
> return ret;
>
> if (adev->asic_type != CHIP_ARCTURUS) {
> - ret = smu_override_pcie_parameters(smu);
> - if (ret)
> - return ret;
> -
> ret = smu_notify_display_change(smu);
> if (ret)
> return ret;
> @@ -1100,6 +1096,12 @@ static int smu_smc_table_hw_init(struct
> smu_context *smu,
> return ret;
> }
>
> + if (adev->asic_type != CHIP_ARCTURUS) {
> + ret = smu_override_pcie_parameters(smu);
> + if (ret)
> + return ret;
> + }
> +
> ret = smu_set_default_od_settings(smu, initialize);
> if (ret)
> return ret;
> diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
> b/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
> index 0ba7a72..6061490 100644
> --- a/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
> +++ b/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
> @@ -48,6 +48,8 @@
>
> #define SMU11_TOOL_SIZE 0x19000
>
> +#define MAX_PCIE_CONF 2
> +
> #define CLK_MAP(clk, index) \
> [SMU_##clk] = {1, (index)}
>
> @@ -88,6 +90,11 @@ struct smu_11_0_dpm_table {
> uint32_t max; /* MHz */
> };
>
> +struct smu_11_0_pcie_table {
> + uint8_t pcie_gen[MAX_PCIE_CONF];
> + uint8_t pcie_lane[MAX_PCIE_CONF];
> +};
> +
> struct smu_11_0_dpm_tables {
> struct smu_11_0_dpm_table soc_table;
> struct smu_11_0_dpm_table gfx_table;
> @@ -100,6 +107,7 @@ struct smu_11_0_dpm_tables {
> struct smu_11_0_dpm_table display_table;
> struct smu_11_0_dpm_table phy_table;
> struct smu_11_0_dpm_table fclk_table;
> + struct smu_11_0_pcie_table pcie_table;
> };
>
> struct smu_11_0_dpm_context {
> diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
> b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
> index 36cf313..8855bcc 100644
> --- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
> +++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
> @@ -36,6 +36,7 @@
> #include "navi10_ppt.h"
> #include "smu_v11_0_pptable.h"
> #include "smu_v11_0_ppsmc.h"
> +#include "nbio/nbio_7_4_sh_mask.h"
>
> #include "asic_reg/mp/mp_11_0_sh_mask.h"
>
> @@ -599,6 +600,7 @@ static int navi10_set_default_dpm_table(struct
> smu_context *smu)
> struct smu_table_context *table_context = &smu->smu_table;
> struct smu_11_0_dpm_context *dpm_context = smu_dpm-
> >dpm_context;
> PPTable_t *driver_ppt = NULL;
> + int i;
>
> driver_ppt = table_context->driver_pptable;
>
> @@ -629,6 +631,11 @@ static int navi10_set_default_dpm_table(struct
> smu_context *smu)
> dpm_context->dpm_tables.phy_table.min = driver_ppt-
> >FreqTablePhyclk[0];
> dpm_context->dpm_tables.phy_table.max = driver_ppt-
> >FreqTablePhyclk[NUM_PHYCLK_DPM_LEVELS - 1];
>
> + for (i = 0; i < MAX_PCIE_CONF; i++) {
> + dpm_context->dpm_tables.pcie_table.pcie_gen[i] = driver_ppt-
> >PcieGenSpeed[i];
> + dpm_context->dpm_tables.pcie_table.pcie_lane[i] =
> driver_ppt->PcieLaneCount[i];
> + }
> +
> return 0;
> }
>
> @@ -710,6 +717,11 @@ static int navi10_print_clk_levels(struct smu_context
> *smu,
> struct smu_table_context *table_context = &smu->smu_table;
> od_table = (OverDriveTable_t *)table_context->overdrive_table;
> od_settings = smu->od_settings;
> + uint32_t gen_speed, lane_width;
> + struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
> + struct smu_11_0_dpm_context *dpm_context = smu_dpm-
> >dpm_context;
> + struct amdgpu_device *adev = smu->adev;
> + PPTable_t *pptable = (PPTable_t *)table_context->driver_pptable;
>
> switch (clk_type) {
> case SMU_GFXCLK:
> @@ -760,6 +772,30 @@ static int navi10_print_clk_levels(struct smu_context
> *smu,
>
> }
> break;
> + case SMU_PCIE:
> + gen_speed = (RREG32_PCIE(smnPCIE_LC_SPEED_CNTL) &
> +
> PSWUSP0_PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE_MASK)
> + >>
> PSWUSP0_PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT;
> + lane_width = (RREG32_PCIE(smnPCIE_LC_LINK_WIDTH_CNTL)
> &
> +
> PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_RD_MASK)
> + >>
> PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_RD__SHIFT;
> + for (i = 0; i < NUM_LINK_LEVELS; i++)
> + size += sprintf(buf + size, "%d: %s %s %dMhz %s\n", i,
> + (dpm_context-
> >dpm_tables.pcie_table.pcie_gen[i] == 0) ? "2.5GT/s," :
> + (dpm_context-
> >dpm_tables.pcie_table.pcie_gen[i] == 1) ? "5.0GT/s," :
> + (dpm_context-
> >dpm_tables.pcie_table.pcie_gen[i] == 2) ? "8.0GT/s," :
> + (dpm_context-
> >dpm_tables.pcie_table.pcie_gen[i] == 3) ? "16.0GT/s," : "",
> + (dpm_context-
> >dpm_tables.pcie_table.pcie_lane[i] == 1) ? "x1" :
> + (dpm_context-
> >dpm_tables.pcie_table.pcie_lane[i] == 2) ? "x2" :
> + (dpm_context-
> >dpm_tables.pcie_table.pcie_lane[i] == 3) ? "x4" :
> + (dpm_context-
> >dpm_tables.pcie_table.pcie_lane[i] == 4) ? "x8" :
> + (dpm_context-
> >dpm_tables.pcie_table.pcie_lane[i] == 5) ? "x12" :
> + (dpm_context-
> >dpm_tables.pcie_table.pcie_lane[i] == 6) ? "x16" : "",
> + pptable->LclkFreq[i],
> + (gen_speed == dpm_context-
> >dpm_tables.pcie_table.pcie_gen[i]) &&
> + (lane_width == dpm_context-
> >dpm_tables.pcie_table.pcie_lane[i]) ?
> + "*" : "");
> + break;
> case SMU_OD_SCLK:
> if (!smu->od_enabled || !od_table || !od_settings)
> break;
> @@ -1690,6 +1726,9 @@ static int navi10_update_pcie_parameters(struct
> smu_context *smu,
> int ret, i;
> uint32_t smu_pcie_arg;
>
> + struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
> + struct smu_11_0_dpm_context *dpm_context = smu_dpm-
> >dpm_context;
> +
> for (i = 0; i < NUM_LINK_LEVELS; i++) {
> smu_pcie_arg = (i << 16) |
> ((pptable->PcieGenSpeed[i] <= pcie_gen_cap) ?
> (pptable->PcieGenSpeed[i] << 8) :
> @@ -1698,8 +1737,17 @@ static int navi10_update_pcie_parameters(struct
> smu_context *smu,
> ret = smu_send_smc_msg_with_param(smu,
> SMU_MSG_OverridePcieParameters,
> smu_pcie_arg);
> + if (!ret) {
> + if (pptable->PcieGenSpeed[i] > pcie_gen_cap)
> + dpm_context-
> >dpm_tables.pcie_table.pcie_gen[i] = pcie_gen_cap;
> + if (pptable->PcieLaneCount[i] > pcie_width_cap)
> + dpm_context-
> >dpm_tables.pcie_table.pcie_lane[i] = pcie_width_cap;
> + } else {
> + return ret;
> + }
[Quan, Evan] Better to update this as below. Anyway, the patch is reviewed-by: Evan Quan <evan.quan at amd.com>
If (ret)
return ret;
if (pptable->PcieGenSpeed[i] > pcie_gen_cap)
dpm_context-dpm_tables.pcie_table.pcie_gen[i] = pcie_gen_cap;
if (pptable->PcieLaneCount[i] > pcie_width_cap)
dpm_context-dpm_tables.pcie_table.pcie_lane[i] = pcie_width_cap;
> }
> - return ret;
> +
> + return 0;
> }
>
> static inline void navi10_dump_od_table(OverDriveTable_t *od_table) {
> diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.h
> b/drivers/gpu/drm/amd/powerplay/navi10_ppt.h
> index fd6dda1..ec03c799 100644
> --- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.h
> +++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.h
> @@ -35,6 +35,9 @@
>
> #define NAVI10_VOLTAGE_SCALE (4)
>
> +#define smnPCIE_LC_SPEED_CNTL 0x11140290
> +#define smnPCIE_LC_LINK_WIDTH_CNTL 0x11140288
> +
> extern void navi10_set_ppt_funcs(struct smu_context *smu);
>
> #endif
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list