for GFX9.4.2 and above.
-v2: keep APU with GTT allocation
Signed-off-by: James Zhu <James.Zhu@amd.com>
Reviewed-by: Vladimir Indic <vladimir.indic@amd.com>
Reviewed-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
---
drivers/gpu/drm/amd/amdkfd/kfd_process.c | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
index 21a90fc3adff..a69e278f7aee 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
@@ -776,6 +776,12 @@ static int kfd_process_alloc_gpuvm(struct kfd_process_device *pdd,
}
if (kptr) {
+ uint32_t domain;
+
+ if (flags & KFD_IOC_ALLOC_MEM_FLAGS_GTT)
+ domain = AMDGPU_GEM_DOMAIN_GTT;
+ else
+ domain = AMDGPU_GEM_DOMAIN_VRAM;
err = amdgpu_amdkfd_gpuvm_map_bo_to_kernel(
(struct kgd_mem *)*mem, kptr, NULL, domain);
if (err) {
@@ -1489,8 +1495,7 @@ static int kfd_process_device_init_cwsr_dgpu(struct kfd_process_device *pdd)
{
struct kfd_node *dev = pdd->dev;
struct qcm_process_device *qpd = &pdd->qpd;
- uint32_t flags = KFD_IOC_ALLOC_MEM_FLAGS_GTT
- | KFD_IOC_ALLOC_MEM_FLAGS_NO_SUBSTITUTE
+ uint32_t flags = KFD_IOC_ALLOC_MEM_FLAGS_NO_SUBSTITUTE
| KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE;
struct kgd_mem *mem;
void *kaddr;
@@ -1499,7 +1504,13 @@ static int kfd_process_device_init_cwsr_dgpu(struct kfd_process_device *pdd)
if (!dev->kfd->cwsr_enabled || qpd->cwsr_kaddr || !qpd->cwsr_base)
return 0;
- /* cwsr_base is only set for dGPU */
+ if (KFD_GC_VERSION(dev) >= IP_VERSION(9, 4, 2) &&
+ !(dev->adev->flags & AMD_IS_APU))
use !adev->apu_prefer_gtt
+ flags |= KFD_IOC_ALLOC_MEM_FLAGS_VRAM;
+ else
+ flags |= KFD_IOC_ALLOC_MEM_FLAGS_GTT;
+
+ /* Allocate CWSR TBA/TMA buffers */
ret = kfd_process_alloc_gpuvm(pdd, qpd->cwsr_base,
KFD_CWSR_TBA_TMA_SIZE, flags, &mem, &kaddr);
if (ret)