From 2f6336a5eb878b6915459bfd9c752fccd0fe54cc Mon Sep 17 00:00:00 2001 From: Zhang Fuxiang Date: Thu, 7 May 2026 17:13:48 +0800 Subject: [PATCH 1/2] amd-gem: Add VM_ALLOW_ANY_UNCACHED flag to mmap In Phyfusion DirectX 11 API remoting, bad address error occurs in qemu when running some d3d11 demos. The patch fixed this issue. Signed-off-by: Zhang Fuxiang Signed-off-by: Liu Tao Signed-off-by: Wang Yinfeng --- drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index a1b15d0d6c489..8d4c94e893086 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c @@ -43,6 +43,10 @@ #include "amdgpu_hmm.h" #include "amdgpu_xgmi.h" +#ifdef CONFIG_ARCH_PHYTIUM +#include +#endif + static const struct drm_gem_object_funcs amdgpu_gem_object_funcs; static vm_fault_t amdgpu_gem_fault(struct vm_fault *vmf) @@ -258,6 +262,11 @@ static int amdgpu_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_str !(vma->vm_flags & VM_ACCESS_FLAGS)) vm_flags_clear(vma, VM_MAYWRITE); +#ifdef CONFIG_ARCH_PHYTIUM + /*lt: workaround for bad address error with d3d11 api remoting*/ + if (is_phytium_soc()) + vm_flags_set(vma, VM_ALLOW_ANY_UNCACHED); +#endif return drm_gem_ttm_mmap(obj, vma); } From c670e70ffc8b4e20fe5fc3276969c1d0479b5f3c Mon Sep 17 00:00:00 2001 From: Zhang Fuxiang Date: Thu, 7 May 2026 17:15:58 +0800 Subject: [PATCH 2/2] amd-ttm: amd gpu memory visibility for vm guest With phytium virtual gpu acceleration method in qemu windows guest OS, guest OS driver needs to share GPU device memory with host and requires the shared buffer mapping remains valid, but the ttm map implemenataion did not account for this usecase. So we add a ref count for every pages of the shared buffer. Signed-off-by: Zhang Fuxiang Signed-off-by: Liu Tao Signed-off-by: Wang Yinfeng --- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index c56405b490509..d4f5dfb641c72 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -1148,8 +1148,10 @@ static int amdgpu_ttm_tt_populate(struct ttm_device *bdev, if (ret) return ret; - for (i = 0; i < ttm->num_pages; ++i) + for (i = 0; i < ttm->num_pages; ++i) { ttm->pages[i]->mapping = bdev->dev_mapping; + page_ref_inc(ttm->pages[i]); + } return 0; } @@ -1180,8 +1182,10 @@ static void amdgpu_ttm_tt_unpopulate(struct ttm_device *bdev, if (ttm->page_flags & TTM_TT_FLAG_EXTERNAL) return; - for (i = 0; i < ttm->num_pages; ++i) + for (i = 0; i < ttm->num_pages; ++i) { ttm->pages[i]->mapping = NULL; + page_ref_dec(ttm->pages[i]); + } adev = amdgpu_ttm_adev(bdev);