aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0942-drm-amdgpu-update-the-vm-invalidation-engine-layout-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0942-drm-amdgpu-update-the-vm-invalidation-engine-layout-.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0942-drm-amdgpu-update-the-vm-invalidation-engine-layout-.patch121
1 files changed, 121 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0942-drm-amdgpu-update-the-vm-invalidation-engine-layout-.patch b/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0942-drm-amdgpu-update-the-vm-invalidation-engine-layout-.patch
new file mode 100644
index 00000000..d542c366
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0942-drm-amdgpu-update-the-vm-invalidation-engine-layout-.patch
@@ -0,0 +1,121 @@
+From 1fc44a277e9730d05eece6a4003474b96d746e4a Mon Sep 17 00:00:00 2001
+From: Evan Quan <evan.quan@amd.com>
+Date: Wed, 21 Nov 2018 13:04:48 +0800
+Subject: [PATCH 0942/2940] drm/amdgpu: update the vm invalidation engine
+ layout V2
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+We need new invalidation engine layout due to new SDMA page
+queues added.
+
+V2: fix coding style and add correct return value
+
+Signed-off-by: Evan Quan <evan.quan@amd.com>
+Reviewed-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Oak Zeng <Oak.Zeng@amd.com>
+Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 53 ++++++++++++++++-----------
+ drivers/gpu/drm/amd/amdgpu/gmc_v9_0.h | 10 +++++
+ 2 files changed, 41 insertions(+), 22 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+index 286e2cdc7de7..3cd89ba5899a 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+@@ -774,37 +774,46 @@ static bool gmc_v9_0_keep_stolen_memory(struct amdgpu_device *adev)
+ }
+ }
+
+-static int gmc_v9_0_late_init(void *handle)
++static int gmc_v9_0_allocate_vm_inv_eng(struct amdgpu_device *adev)
+ {
+- struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+- /*
+- * The latest engine allocation on gfx9 is:
+- * Engine 0, 1: idle
+- * Engine 2, 3: firmware
+- * Engine 4~13: amdgpu ring, subject to change when ring number changes
+- * Engine 14~15: idle
+- * Engine 16: kfd tlb invalidation
+- * Engine 17: Gart flushes
+- */
+- unsigned vm_inv_eng[AMDGPU_MAX_VMHUBS] = { 4, 4 };
++ struct amdgpu_ring *ring;
++ unsigned vm_inv_engs[AMDGPU_MAX_VMHUBS] =
++ {GFXHUB_FREE_VM_INV_ENGS_BITMAP, MMHUB_FREE_VM_INV_ENGS_BITMAP};
+ unsigned i;
+- int r;
++ unsigned vmhub, inv_eng;
+
+- if (!gmc_v9_0_keep_stolen_memory(adev))
+- amdgpu_bo_late_init(adev);
++ for (i = 0; i < adev->num_rings; ++i) {
++ ring = adev->rings[i];
++ vmhub = ring->funcs->vmhub;
++
++ inv_eng = ffs(vm_inv_engs[vmhub]);
++ if (!inv_eng) {
++ dev_err(adev->dev, "no VM inv eng for ring %s\n",
++ ring->name);
++ return -EINVAL;
++ }
+
+- for(i = 0; i < adev->num_rings; ++i) {
+- struct amdgpu_ring *ring = adev->rings[i];
+- unsigned vmhub = ring->funcs->vmhub;
++ ring->vm_inv_eng = inv_eng - 1;
++ change_bit(inv_eng - 1, (unsigned long *)(&vm_inv_engs[vmhub]));
+
+- ring->vm_inv_eng = vm_inv_eng[vmhub]++;
+ dev_info(adev->dev, "ring %s uses VM inv eng %u on hub %u\n",
+ ring->name, ring->vm_inv_eng, ring->funcs->vmhub);
+ }
+
+- /* Engine 16 is used for KFD and 17 for GART flushes */
+- for(i = 0; i < AMDGPU_MAX_VMHUBS; ++i)
+- BUG_ON(vm_inv_eng[i] > 16);
++ return 0;
++}
++
++static int gmc_v9_0_late_init(void *handle)
++{
++ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
++ int r;
++
++ if (!gmc_v9_0_keep_stolen_memory(adev))
++ amdgpu_bo_late_init(adev);
++
++ r = gmc_v9_0_allocate_vm_inv_eng(adev);
++ if (r)
++ return r;
+
+ if (adev->asic_type == CHIP_VEGA10 && !amdgpu_sriov_vf(adev)) {
+ r = gmc_v9_0_ecc_available(adev);
+diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.h b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.h
+index b030ca5ea107..5c8deac65580 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.h
++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.h
+@@ -24,6 +24,16 @@
+ #ifndef __GMC_V9_0_H__
+ #define __GMC_V9_0_H__
+
++ /*
++ * The latest engine allocation on gfx9 is:
++ * Engine 2, 3: firmware
++ * Engine 0, 1, 4~16: amdgpu ring,
++ * subject to change when ring number changes
++ * Engine 17: Gart flushes
++ */
++#define GFXHUB_FREE_VM_INV_ENGS_BITMAP 0x1FFF3
++#define MMHUB_FREE_VM_INV_ENGS_BITMAP 0x1FFF3
++
+ extern const struct amd_ip_funcs gmc_v9_0_ip_funcs;
+ extern const struct amdgpu_ip_block_version gmc_v9_0_ip_block;
+
+--
+2.17.1
+