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

drm/amdkfd: report xgmi bandwidth between direct peers to the kfd

Report the min/max bandwidth in megabytes to the kfd for direct
xgmi connections only. Indirect peers will report 0 since
indirect route is unknown.

Signed-off-by: Jonathan Kim <jonathan.kim@amd.com>
Reviewed-by: Felix Kuehling <felix.kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Jonathan Kim and committed by
Alex Deucher
3f46c4e9 331e7818

+51
+24
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
··· 553 553 return (uint8_t)ret; 554 554 } 555 555 556 + int amdgpu_amdkfd_get_xgmi_bandwidth_mbytes(struct kgd_dev *dst, struct kgd_dev *src, bool is_min) 557 + { 558 + struct amdgpu_device *adev = (struct amdgpu_device *)dst, *peer_adev; 559 + int num_links; 560 + 561 + if (adev->asic_type != CHIP_ALDEBARAN) 562 + return 0; 563 + 564 + if (src) 565 + peer_adev = (struct amdgpu_device *)src; 566 + 567 + /* num links returns 0 for indirect peers since indirect route is unknown. */ 568 + num_links = is_min ? 1 : amdgpu_xgmi_get_num_links(adev, peer_adev); 569 + if (num_links < 0) { 570 + DRM_ERROR("amdgpu: failed to get xgmi num links between node %d and %d. ret = %d\n", 571 + adev->gmc.xgmi.physical_node_id, 572 + peer_adev->gmc.xgmi.physical_node_id, num_links); 573 + num_links = 0; 574 + } 575 + 576 + /* Aldebaran xGMI DPM is defeatured so assume x16 x 25Gbps for bandwidth. */ 577 + return (num_links * 16 * 25000)/BITS_PER_BYTE; 578 + } 579 + 556 580 uint64_t amdgpu_amdkfd_get_mmio_remap_phys_addr(struct kgd_dev *kgd) 557 581 { 558 582 struct amdgpu_device *adev = (struct amdgpu_device *)kgd;
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
··· 226 226 uint32_t amdgpu_amdkfd_get_asic_rev_id(struct kgd_dev *kgd); 227 227 int amdgpu_amdkfd_get_noretry(struct kgd_dev *kgd); 228 228 uint8_t amdgpu_amdkfd_get_xgmi_hops_count(struct kgd_dev *dst, struct kgd_dev *src); 229 + int amdgpu_amdkfd_get_xgmi_bandwidth_mbytes(struct kgd_dev *dst, struct kgd_dev *src, bool is_min); 229 230 230 231 /* Read user wptr from a specified user address space with page fault 231 232 * disabled. The memory must be pinned and mapped to the hardware when
+12
drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
··· 486 486 return -EINVAL; 487 487 } 488 488 489 + int amdgpu_xgmi_get_num_links(struct amdgpu_device *adev, 490 + struct amdgpu_device *peer_adev) 491 + { 492 + struct psp_xgmi_topology_info *top = &adev->psp.xgmi_context.top_info; 493 + int i; 494 + 495 + for (i = 0 ; i < top->num_nodes; ++i) 496 + if (top->nodes[i].node_id == peer_adev->gmc.xgmi.node_id) 497 + return top->nodes[i].num_links; 498 + return -EINVAL; 499 + } 500 + 489 501 int amdgpu_xgmi_add_device(struct amdgpu_device *adev) 490 502 { 491 503 struct psp_xgmi_topology_info *top_info;
+2
drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.h
··· 59 59 int amdgpu_xgmi_set_pstate(struct amdgpu_device *adev, int pstate); 60 60 int amdgpu_xgmi_get_hops_count(struct amdgpu_device *adev, 61 61 struct amdgpu_device *peer_adev); 62 + int amdgpu_xgmi_get_num_links(struct amdgpu_device *adev, 63 + struct amdgpu_device *peer_adev); 62 64 uint64_t amdgpu_xgmi_get_relative_phy_addr(struct amdgpu_device *adev, 63 65 uint64_t addr); 64 66 static inline bool amdgpu_xgmi_same_hive(struct amdgpu_device *adev,
+12
drivers/gpu/drm/amd/amdkfd/kfd_crat.c
··· 1989 1989 sub_type_hdr->flags |= CRAT_IOLINK_FLAGS_BI_DIRECTIONAL; 1990 1990 sub_type_hdr->io_interface_type = CRAT_IOLINK_TYPE_XGMI; 1991 1991 sub_type_hdr->num_hops_xgmi = 1; 1992 + if (adev->asic_type == CHIP_ALDEBARAN) { 1993 + sub_type_hdr->minimum_bandwidth_mbs = 1994 + amdgpu_amdkfd_get_xgmi_bandwidth_mbytes( 1995 + kdev->kgd, NULL, true); 1996 + sub_type_hdr->maximum_bandwidth_mbs = 1997 + sub_type_hdr->minimum_bandwidth_mbs; 1998 + } 1992 1999 } else { 1993 2000 sub_type_hdr->io_interface_type = CRAT_IOLINK_TYPE_PCIEXPRESS; 1994 2001 } ··· 2040 2033 sub_type_hdr->proximity_domain_to = proximity_domain_to; 2041 2034 sub_type_hdr->num_hops_xgmi = 2042 2035 amdgpu_amdkfd_get_xgmi_hops_count(kdev->kgd, peer_kdev->kgd); 2036 + sub_type_hdr->maximum_bandwidth_mbs = 2037 + amdgpu_amdkfd_get_xgmi_bandwidth_mbytes(kdev->kgd, peer_kdev->kgd, false); 2038 + sub_type_hdr->minimum_bandwidth_mbs = sub_type_hdr->maximum_bandwidth_mbs ? 2039 + amdgpu_amdkfd_get_xgmi_bandwidth_mbytes(kdev->kgd, NULL, true) : 0; 2040 + 2043 2041 return 0; 2044 2042 } 2045 2043