Thanks,
Chong.
-----Original Message-----
From: Koenig, Christian <[email protected]>
Sent: Wednesday, July 8, 2026 5:05 PM
To: Li, Chong(Alan) <[email protected]>; [email protected]
Cc: Deng, Emily <[email protected]>; Chang, HaiJun <[email protected]>; Skvortsov, Victor
<[email protected]>; Lazar, Lijo <[email protected]>; Cursor
<[email protected]>
Subject: Re: [PATCH] drm/amdgpu: improve the amdgpu device init progress in
sriov mode
On 7/8/26 10:25, chong li wrote:
v2:
Some legacy ASICs do not send amdgpu_virt_request_init_data().
Only keep the full GPU access request early when request_init_data is not sent.
v1:
Move the initialization of non-GPU resources out of the full GPU
access region during AMDGPU device initialization.
Background:
In SR-IOV, the guest sends GPU_INIT_DATA, then the host enables
VF_FB_EN and places early initialization data, such as IP discovery,
VBIOS, and PF-VF exchange data, in the VF FB. The guest should then be
able to read this data before requesting full GPU access.
Before this patch, the VF still requested full GPU access in
amdgpu_device_ip_early_init(). At that point TTM is not initialized
yet, so the normal VRAM aperture mapping is unavailable and the guest
falls back to MM_INDEX/MM_DATA register access. That register path
requires full GPU access.
Use the BAR0 framebuffer read path, amdgpu_device_read_fb_via_bar0(),
for the early init-data copy instead of MM_INDEX/MM_DATA. This lets
the driver delay the full GPU access request until after the early
init data has been copied.
That looks like it goes into the right direction, but as far as I can see it is
still an ESXi specific change.
So once more: We can't adjust the driver to the hypervisor!
Either this works on all hypervisors or I have to reject the change.
Regards,
Christian.
Signed-off-by: chong li <[email protected]>
Co-authored-by: Cursor <[email protected]>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 21 +++++++++++++++++----
drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c | 4 ++--
2 files changed, 19 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..ac66796e8634 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>
@@ -1987,16 +1991,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, early_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;
+ early_full_gpu_access = (adev->virt.req_init_data_ver == 0);
+ if (early_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 +2166,12 @@ static int amdgpu_device_ip_early_init(struct
amdgpu_device *adev)
if (!total)
return -ENODEV;
+ if (amdgpu_sriov_vf(adev) && !early_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;