|
80 | 80 | /* possible frequency drift (1Mhz) */ |
81 | 81 | #define EPSILON 1 |
82 | 82 |
|
83 | | -#define smnPCIE_ESM_CTRL 0x193D0 |
| 83 | +#define smnPCIE_ESM_CTRL 0x93D0 |
84 | 84 | #define smnPCIE_LC_LINK_WIDTH_CNTL 0x1a340288 |
85 | 85 | #define PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_RD_MASK 0x00000070L |
86 | 86 | #define PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_RD__SHIFT 0x4 |
87 | 87 | #define MAX_LINK_WIDTH 6 |
88 | 88 |
|
| 89 | +#define smnPCIE_LC_SPEED_CNTL 0x1a340290 |
| 90 | +#define PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE_MASK 0xE0 |
| 91 | +#define PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT 0x5 |
| 92 | +#define LINK_SPEED_MAX 4 |
| 93 | + |
89 | 94 | static const struct cmn2asic_msg_mapping smu_v13_0_6_message_map[SMU_MSG_MAX_COUNT] = { |
90 | 95 | MSG_MAP(TestMessage, PPSMC_MSG_TestMessage, 0), |
91 | 96 | MSG_MAP(GetSmuVersion, PPSMC_MSG_GetSmuVersion, 1), |
@@ -1930,14 +1935,21 @@ smu_v13_0_6_get_current_pcie_link_width_level(struct smu_context *smu) |
1930 | 1935 | static int smu_v13_0_6_get_current_pcie_link_speed(struct smu_context *smu) |
1931 | 1936 | { |
1932 | 1937 | struct amdgpu_device *adev = smu->adev; |
| 1938 | + uint32_t speed_level; |
1933 | 1939 | uint32_t esm_ctrl; |
1934 | 1940 |
|
1935 | 1941 | /* TODO: confirm this on real target */ |
1936 | 1942 | esm_ctrl = RREG32_PCIE(smnPCIE_ESM_CTRL); |
1937 | 1943 | if ((esm_ctrl >> 15) & 0x1FFFF) |
1938 | 1944 | return (((esm_ctrl >> 8) & 0x3F) + 128); |
1939 | 1945 |
|
1940 | | - return smu_v13_0_get_current_pcie_link_speed(smu); |
| 1946 | + speed_level = (RREG32_PCIE(smnPCIE_LC_SPEED_CNTL) & |
| 1947 | + PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE_MASK) |
| 1948 | + >> PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT; |
| 1949 | + if (speed_level > LINK_SPEED_MAX) |
| 1950 | + speed_level = 0; |
| 1951 | + |
| 1952 | + return pcie_gen_to_speed(speed_level + 1); |
1941 | 1953 | } |
1942 | 1954 |
|
1943 | 1955 | static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table) |
|
0 commit comments