aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Kim <jonathan.kim@amd.com>2021-01-27 15:24:59 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2021-05-11 14:47:25 +0200
commit7b3eb98a3ef464d7da7dd471c63514acf4ee225d (patch)
tree9c3156d354623b47a482c9958bde2a50120ef42d
parent61c1ddd29f87f83a1b010f4dc3ba506946977123 (diff)
downloadkernel_replicant_linux-7b3eb98a3ef464d7da7dd471c63514acf4ee225d.tar.gz
kernel_replicant_linux-7b3eb98a3ef464d7da7dd471c63514acf4ee225d.tar.bz2
kernel_replicant_linux-7b3eb98a3ef464d7da7dd471c63514acf4ee225d.zip
drm/amdgpu: mask the xgmi number of hops reported from psp to kfd
[ Upstream commit 4ac5617c4b7d0f0a8f879997f8ceaa14636d7554 ] The psp supplies the link type in the upper 2 bits of the psp xgmi node information num_hops field. With a new link type, Aldebaran has these bits set to a non-zero value (1 = xGMI3) so the KFD topology will report the incorrect IO link weights without proper masking. The actual number of hops is located in the 3 least significant bits of this field so mask if off accordingly before passing it to the KFD. Signed-off-by: Jonathan Kim <jonathan.kim@amd.com> Reviewed-by: Amber Lin <amber.lin@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
index 1162913c8bf4..0526dec1d736 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
@@ -465,15 +465,22 @@ int amdgpu_xgmi_update_topology(struct amdgpu_hive_info *hive, struct amdgpu_dev
}
+/*
+ * NOTE psp_xgmi_node_info.num_hops layout is as follows:
+ * num_hops[7:6] = link type (0 = xGMI2, 1 = xGMI3, 2/3 = reserved)
+ * num_hops[5:3] = reserved
+ * num_hops[2:0] = number of hops
+ */
int amdgpu_xgmi_get_hops_count(struct amdgpu_device *adev,
struct amdgpu_device *peer_adev)
{
struct psp_xgmi_topology_info *top = &adev->psp.xgmi_context.top_info;
+ uint8_t num_hops_mask = 0x7;
int i;
for (i = 0 ; i < top->num_nodes; ++i)
if (top->nodes[i].node_id == peer_adev->gmc.xgmi.node_id)
- return top->nodes[i].num_hops;
+ return top->nodes[i].num_hops & num_hops_mask;
return -EINVAL;
}