Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/pm: Get xgmi link status for XGMI_v_6_4_0

Get XGMI_v_6_4_0 link status and populate it to metrics v1_7 for
SMU_v_13_0_6

v2: Get link status register value for each soc from separate
function (Lijo)

Signed-off-by: Asad Kamal <asad.kamal@amd.com>
Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
Reviewed-by: Yang Wang <kevinyang.wang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Asad Kamal and committed by
Alex Deucher
466a59ab e2259b5a

+46 -1
+41
drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
··· 40 40 #define smnPCS_GOPX1_PCS_ERROR_STATUS 0x12200210 41 41 #define smnPCS_GOPX1_PCS_ERROR_NONCORRECTABLE_MASK 0x12200218 42 42 43 + #define XGMI_STATE_DISABLE 0xD1 44 + #define XGMI_STATE_LS0 0x81 45 + #define XGMI_LINK_ACTIVE 1 46 + #define XGMI_LINK_INACTIVE 0 47 + 43 48 static DEFINE_MUTEX(xgmi_mutex); 44 49 45 50 #define AMDGPU_MAX_XGMI_DEVICE_PER_HIVE 4 ··· 293 288 {"XGMI3X16 PCS RxCMDPktErr", 294 289 SOC15_REG_FIELD(PCS_XGMI3X16_PCS_ERROR_STATUS, RxCMDPktErr)}, 295 290 }; 291 + 292 + static u32 xgmi_v6_4_get_link_status(struct amdgpu_device *adev, int global_link_num) 293 + { 294 + const u32 smnpcs_xgmi3x16_pcs_state_hist1 = 0x11a00070; 295 + const int xgmi_inst = 2; 296 + u32 link_inst; 297 + u64 addr; 298 + 299 + link_inst = global_link_num % xgmi_inst; 300 + 301 + addr = (smnpcs_xgmi3x16_pcs_state_hist1 | (link_inst << 20)) + 302 + adev->asic_funcs->encode_ext_smn_addressing(global_link_num / xgmi_inst); 303 + 304 + return RREG32_PCIE_EXT(addr); 305 + } 306 + 307 + int amdgpu_get_xgmi_link_status(struct amdgpu_device *adev, int global_link_num) 308 + { 309 + u32 xgmi_state_reg_val; 310 + 311 + switch (amdgpu_ip_version(adev, XGMI_HWIP, 0)) { 312 + case IP_VERSION(6, 4, 0): 313 + xgmi_state_reg_val = xgmi_v6_4_get_link_status(adev, global_link_num); 314 + break; 315 + default: 316 + return -EOPNOTSUPP; 317 + } 318 + 319 + if ((xgmi_state_reg_val & 0xFF) == XGMI_STATE_DISABLE) 320 + return -ENOLINK; 321 + 322 + if ((xgmi_state_reg_val & 0xFF) == XGMI_STATE_LS0) 323 + return XGMI_LINK_ACTIVE; 324 + 325 + return XGMI_LINK_INACTIVE; 326 + } 296 327 297 328 /** 298 329 * DOC: AMDGPU XGMI Support
+2
drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.h
··· 84 84 int amdgpu_xgmi_request_nps_change(struct amdgpu_device *adev, 85 85 struct amdgpu_hive_info *hive, 86 86 int req_nps_mode); 87 + int amdgpu_get_xgmi_link_status(struct amdgpu_device *adev, 88 + int global_link_num); 87 89 88 90 #endif
+3 -1
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
··· 96 96 #define PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE_MASK 0xE0 97 97 #define PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT 0x5 98 98 #define LINK_SPEED_MAX 4 99 - 100 99 #define SMU_13_0_6_DSCLK_THRESHOLD 140 101 100 102 101 #define MCA_BANK_IPID(_ip, _hwid, _type) \ ··· 2447 2448 SMUQ10_ROUND(GET_METRIC_FIELD(XgmiReadDataSizeAcc, flag)[i]); 2448 2449 gpu_metrics->xgmi_write_data_acc[i] = 2449 2450 SMUQ10_ROUND(GET_METRIC_FIELD(XgmiWriteDataSizeAcc, flag)[i]); 2451 + ret = amdgpu_get_xgmi_link_status(adev, i); 2452 + if (ret >= 0) 2453 + gpu_metrics->xgmi_link_status[i] = ret; 2450 2454 } 2451 2455 2452 2456 gpu_metrics->num_partition = adev->xcp_mgr->num_xcps;