]> www.infradead.org Git - users/willy/xarray.git/commitdiff
drm/amdkfd: expose host gpu link via sysfs (v2)
authorRajneesh Bhardwaj <rajneesh.bhardwaj@amd.com>
Tue, 21 Apr 2020 22:00:07 +0000 (18:00 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 24 Mar 2021 02:52:59 +0000 (22:52 -0400)
Currently host-gpu io link is always reported as PCIe however, on some
A+A systems, there could be one xgmi link available. This change exposes
xgmi link via sysfs when it is present.

v2: fix includes (Alex)

Reviewed-by: Oak Zeng <oak.zeng@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Rajneesh Bhardwaj <rajneesh.bhardwaj@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_crat.c

index 533df07964ecb61a88aaa97c762ed06314b44be8..c60e82697385d3d65870b67720fe7139510b919b 100644 (file)
@@ -26,6 +26,7 @@
 #include "kfd_priv.h"
 #include "kfd_topology.h"
 #include "kfd_iommu.h"
+#include "amdgpu.h"
 #include "amdgpu_amdkfd.h"
 
 /* GPU Processor ID base for dGPUs for which VCRAT needs to be created.
@@ -1113,6 +1114,8 @@ static int kfd_fill_gpu_direct_io_link_to_cpu(int *avail_size,
                        struct crat_subtype_iolink *sub_type_hdr,
                        uint32_t proximity_domain)
 {
+       struct amdgpu_device *adev = (struct amdgpu_device *)kdev->kgd;
+
        *avail_size -= sizeof(struct crat_subtype_iolink);
        if (*avail_size < 0)
                return -ENOMEM;
@@ -1129,7 +1132,18 @@ static int kfd_fill_gpu_direct_io_link_to_cpu(int *avail_size,
        /* Fill in IOLINK subtype.
         * TODO: Fill-in other fields of iolink subtype
         */
-       sub_type_hdr->io_interface_type = CRAT_IOLINK_TYPE_PCIEXPRESS;
+       if (adev->gmc.xgmi.connected_to_cpu) {
+               /*
+                * with host gpu xgmi link, host can access gpu memory whether
+                * or not pcie bar type is large, so always create bidirectional
+                * io link.
+                */
+               sub_type_hdr->flags |= CRAT_IOLINK_FLAGS_BI_DIRECTIONAL;
+               sub_type_hdr->io_interface_type = CRAT_IOLINK_TYPE_XGMI;
+       } else {
+               sub_type_hdr->io_interface_type = CRAT_IOLINK_TYPE_PCIEXPRESS;
+       }
+
        sub_type_hdr->proximity_domain_from = proximity_domain;
 #ifdef CONFIG_NUMA
        if (kdev->pdev->dev.numa_node == NUMA_NO_NODE)