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

Configure Feed

Select the types of activity you want to include in your feed.

drm/amdgpu: update xgmi info and vram_base_offset on resume

For SRIOV VM env with XGMI enabled systems, XGMI physical node id may
change when hibernate and resume with different VF.

Update XGMI info and vram_base_offset on resume for gfx444 SRIOV env.
Add amdgpu_virt_xgmi_migrate_enabled() as the feature flag.

Signed-off-by: Jiang Liu <gerry@linux.alibaba.com>
Signed-off-by: Samuel Zhang <guoqing.zhang@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Samuel Zhang and committed by
Alex Deucher
855a2a02 78d7032b

+38
+31
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
··· 2773 2773 if (!amdgpu_device_pcie_dynamic_switching_supported(adev)) 2774 2774 adev->pm.pp_feature &= ~PP_PCIE_DPM_MASK; 2775 2775 2776 + adev->virt.is_xgmi_node_migrate_enabled = false; 2777 + if (amdgpu_sriov_vf(adev)) { 2778 + adev->virt.is_xgmi_node_migrate_enabled = 2779 + amdgpu_ip_version((adev), GC_HWIP, 0) == IP_VERSION(9, 4, 4); 2780 + } 2781 + 2776 2782 total = true; 2777 2783 for (i = 0; i < adev->num_ip_blocks; i++) { 2778 2784 ip_block = &adev->ip_blocks[i]; ··· 5104 5098 return 0; 5105 5099 } 5106 5100 5101 + static inline int amdgpu_virt_resume(struct amdgpu_device *adev) 5102 + { 5103 + int r; 5104 + unsigned int prev_physical_node_id = adev->gmc.xgmi.physical_node_id; 5105 + 5106 + r = adev->gfxhub.funcs->get_xgmi_info(adev); 5107 + if (r) 5108 + return r; 5109 + 5110 + dev_info(adev->dev, "xgmi node, old id %d, new id %d\n", 5111 + prev_physical_node_id, adev->gmc.xgmi.physical_node_id); 5112 + 5113 + adev->vm_manager.vram_base_offset = adev->gfxhub.funcs->get_mc_fb_offset(adev); 5114 + adev->vm_manager.vram_base_offset += 5115 + adev->gmc.xgmi.physical_node_id * adev->gmc.xgmi.node_segment_size; 5116 + 5117 + return 0; 5118 + } 5119 + 5107 5120 /** 5108 5121 * amdgpu_device_resume - initiate device resume 5109 5122 * ··· 5142 5117 r = amdgpu_virt_request_full_gpu(adev, true); 5143 5118 if (r) 5144 5119 return r; 5120 + } 5121 + 5122 + if (amdgpu_virt_xgmi_migrate_enabled(adev)) { 5123 + r = amdgpu_virt_resume(adev); 5124 + if (r) 5125 + goto exit; 5145 5126 } 5146 5127 5147 5128 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
+7
drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
··· 301 301 union amd_sriov_ras_caps ras_telemetry_en_caps; 302 302 struct amdgpu_virt_ras ras; 303 303 struct amd_sriov_ras_telemetry_error_count count_cache; 304 + 305 + /* hibernate and resume with different VF feature for xgmi enabled system */ 306 + bool is_xgmi_node_migrate_enabled; 304 307 }; 305 308 306 309 struct amdgpu_video_codec_info; ··· 389 386 ((adev)->virt.gim_feature & AMDGIM_FEATURE_VCN_RB_DECOUPLE) 390 387 #define amdgpu_sriov_is_mes_info_enable(adev) \ 391 388 ((adev)->virt.gim_feature & AMDGIM_FEATURE_MES_INFO_ENABLE) 389 + 390 + #define amdgpu_virt_xgmi_migrate_enabled(adev) \ 391 + ((adev)->virt.is_xgmi_node_migrate_enabled && (adev)->gmc.xgmi.node_segment_size != 0) 392 + 392 393 bool amdgpu_virt_mmio_blocked(struct amdgpu_device *adev); 393 394 void amdgpu_virt_init_setting(struct amdgpu_device *adev); 394 395 int amdgpu_virt_request_full_gpu(struct amdgpu_device *adev, bool init);