From: Hawking Zhang <[email protected]>

On some hardware configuration, sriov guests
cannot access mm_index and mm_data. Update the
IPD table via memcpy in these cases

Signed-off-by: Hawking Zhang <[email protected]>
Reviewed-by: Likun Gao <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 13 +++++++++----
 drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h      |  4 ++++
 drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h   |  3 ++-
 3 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
index 36dc0add26f32..daa2a27718edb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
@@ -356,10 +356,15 @@ static int amdgpu_discovery_read_binary_from_mem(struct 
amdgpu_device *adev,
        int ret = 0;
 
        if (!is_tmr_in_sysmem) {
-               amdgpu_device_vram_access(adev, adev->discovery.offset,
-                                         (uint32_t *)binary,
-                                         adev->discovery.size, false);
-               adev->discovery.reserve_tmr = true;
+               if (amdgpu_sriov_vf(adev) &&
+                   amdgpu_sriov_xgmi_connected_to_cpu(adev)) {
+                       ret = amdgpu_discovery_read_binary_from_sysmem(adev, 
binary);
+               } else {
+                       amdgpu_device_vram_access(adev, adev->discovery.offset,
+                                                 (uint32_t *)binary,
+                                                 adev->discovery.size, false);
+                       adev->discovery.reserve_tmr = true;
+               }
        } else {
                ret = amdgpu_discovery_read_binary_from_sysmem(adev, binary);
        }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
index 886fbce0bfd1d..9da0c6e9b8695 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
@@ -162,6 +162,7 @@ enum AMDGIM_FEATURE_FLAG {
        AMDGIM_FEATURE_RAS_TELEMETRY = (1 << 10),
        AMDGIM_FEATURE_RAS_CPER = (1 << 11),
        AMDGIM_FEATURE_XGMI_TA_EXT_PEER_LINK = (1 << 12),
+       AMDGIM_FEATURE_XGMI_CONNECTED_TO_CPU = (1 << 13),
 };
 
 enum AMDGIM_REG_ACCESS_FLAG {
@@ -412,6 +413,9 @@ struct amdgpu_video_codec_info;
 #define amdgpu_sriov_xgmi_ta_ext_peer_link_en(adev) \
 ((adev)->virt.gim_feature & AMDGIM_FEATURE_XGMI_TA_EXT_PEER_LINK)
 
+#define amdgpu_sriov_xgmi_connected_to_cpu(adev) \
+((adev)->virt.gim_feature & AMDGIM_FEATURE_XGMI_CONNECTED_TO_CPU)
+
 static inline bool is_virtual_machine(void)
 {
 #if defined(CONFIG_X86)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h 
b/drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h
index a841f342a3ebb..847cfd1fd0046 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h
@@ -161,7 +161,8 @@ union amd_sriov_msg_feature_flags {
                uint32_t ras_telemetry          : 1;
                uint32_t ras_cper               : 1;
                uint32_t xgmi_ta_ext_peer_link  : 1;
-               uint32_t reserved               : 19;
+               uint32_t xgmi_connected_to_cpu  : 1;
+               uint32_t reserved               : 18;
        } flags;
        uint32_t all;
 };
-- 
2.53.0

Reply via email to