Signed-off-by: chong li <[email protected]>
Co-authored-by: Cursor <[email protected]>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 32 +++++++++++++++++++---
drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c | 4 +--
2 files changed, 30 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 610d82b79de3..ec353f4dd0d2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -38,6 +38,10 @@
#include <linux/apple-gmux.h>
#include <linux/nospec.h>
+#ifdef CONFIG_X86
+#include <asm/hypervisor.h>
+#endif
+
#include <drm/drm_atomic_helper.h>
#include <drm/drm_client_event.h>
#include <drm/drm_crtc_helper.h>
@@ -1973,6 +1977,17 @@ static struct pci_dev *amdgpu_device_find_parent(struct
amdgpu_device *adev)
return parent;
}
+static bool amdgpu_device_delay_full_gpu_access(struct amdgpu_device *adev)
+{
+#ifdef CONFIG_X86
+ return adev->virt.req_init_data_ver > 0 &&
+ (hypervisor_is_type(X86_HYPER_VMWARE) ||
+ hypervisor_is_type(X86_HYPER_MS_HYPERV));
+#else
+ return false;
+#endif
+}
+
/**
* amdgpu_device_ip_early_init - run early init for hardware IPs
*
@@ -1987,16 +2002,19 @@ static int amdgpu_device_ip_early_init(struct
amdgpu_device *adev)
{
struct amdgpu_ip_block *ip_block;
struct pci_dev *parent;
- bool total, skip_bios;
+ bool total, skip_bios, delay_full_gpu_access = false;
uint32_t bios_flags;
int i, r;
amdgpu_device_enable_virtual_display(adev);
if (amdgpu_sriov_vf(adev)) {
- r = amdgpu_virt_request_full_gpu(adev, true);
- if (r)
- return r;
+ delay_full_gpu_access =
amdgpu_device_delay_full_gpu_access(adev);
+ if (!delay_full_gpu_access) {
+ r = amdgpu_virt_request_full_gpu(adev, true);
+ if (r)
+ return r;
+ }
r = amdgpu_virt_init_critical_region(adev);
if (r)
@@ -2159,6 +2177,12 @@ static int amdgpu_device_ip_early_init(struct
amdgpu_device *adev)
if (!total)
return -ENODEV;
+ if (amdgpu_sriov_vf(adev) && delay_full_gpu_access) {
+ r = amdgpu_virt_request_full_gpu(adev, true);
+ if (r)
+ return r;
+ }
+
if (adev->gmc.xgmi.supported)
amdgpu_xgmi_early_init(adev);
diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c
index 9a40107a0869..340703d89d6b 100644
--- a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c
+++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c
@@ -185,8 +185,8 @@ static int xgpu_ai_send_access_requests(struct
amdgpu_device *adev,
} else if (req == IDH_REQ_GPU_INIT_DATA){
/* Dummy REQ_GPU_INIT_DATA handling */
r = xgpu_ai_poll_msg(adev, IDH_REQ_GPU_INIT_DATA_READY);
- /* version set to 0 since dummy */
- adev->virt.req_init_data_ver = 0;
+ /* Version is set to 1 since GPU_CRIT_REGION_V1 */
+ adev->virt.req_init_data_ver = GPU_CRIT_REGION_V1;
}
return 0;