aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/0830-drm-amdgpu-enable-paging-queue-based-on-FW-version-v.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/0830-drm-amdgpu-enable-paging-queue-based-on-FW-version-v.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/0830-drm-amdgpu-enable-paging-queue-based-on-FW-version-v.patch107
1 files changed, 107 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/0830-drm-amdgpu-enable-paging-queue-based-on-FW-version-v.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/0830-drm-amdgpu-enable-paging-queue-based-on-FW-version-v.patch
new file mode 100644
index 00000000..a559cdf5
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/0830-drm-amdgpu-enable-paging-queue-based-on-FW-version-v.patch
@@ -0,0 +1,107 @@
+From 77e163147ecb8e6b7290cac6d409d547cb9626be Mon Sep 17 00:00:00 2001
+From: Philip Yang <Philip.Yang@amd.com>
+Date: Mon, 19 Nov 2018 09:53:43 -0500
+Subject: [PATCH 0830/2940] drm/amdgpu: enable paging queue based on FW version
+ (v2)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Based SDMA fw version to enable has_page_queue support. Have to move
+sdma_v4_0_init_microcode from sw_init to early_init, to load firmware
+and init fw_version before set_ring/buffer/vm_pte_funcs use it.
+
+v2: don't enable on vega12, 20 until confirmed
+
+Signed-off-by: Philip Yang <Philip.Yang@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@amd.com>
+Acked-by: Christian König <christian.koenig@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 48 +++++++++++++++++---------
+ 1 file changed, 32 insertions(+), 16 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+index e9ece3d19110..59e454768ebe 100644
+--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+@@ -1449,23 +1449,46 @@ static void sdma_v4_0_ring_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg,
+ sdma_v4_0_wait_reg_mem(ring, 0, 0, reg, 0, val, mask, 10);
+ }
+
++static bool sdma_v4_0_fw_support_paging_queue(struct amdgpu_device *adev)
++{
++ uint fw_version = adev->sdma.instance[0].fw_version;
++
++ switch (adev->asic_type) {
++ case CHIP_VEGA10:
++ return fw_version >= 430;
++ case CHIP_VEGA12:
++ /*return fw_version >= 31;*/
++ return false;
++ case CHIP_VEGA20:
++ /*return fw_version >= 115;*/
++ return false;
++ default:
++ return false;
++ }
++}
++
+ static int sdma_v4_0_early_init(void *handle)
+ {
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
++ int r;
+
+- if (adev->asic_type == CHIP_RAVEN) {
++ if (adev->asic_type == CHIP_RAVEN)
+ adev->sdma.num_instances = 1;
+- adev->sdma.has_page_queue = false;
+- } else {
++ else
+ adev->sdma.num_instances = 2;
+- /* TODO: Page queue breaks driver reload under SRIOV */
+- if ((adev->asic_type == CHIP_VEGA10) && amdgpu_sriov_vf((adev)))
+- adev->sdma.has_page_queue = false;
+- else if (adev->asic_type != CHIP_VEGA20 &&
+- adev->asic_type != CHIP_VEGA12)
+- adev->sdma.has_page_queue = true;
++
++ r = sdma_v4_0_init_microcode(adev);
++ if (r) {
++ DRM_ERROR("Failed to load sdma firmware!\n");
++ return r;
+ }
+
++ /* TODO: Page queue breaks driver reload under SRIOV */
++ if ((adev->asic_type == CHIP_VEGA10) && amdgpu_sriov_vf((adev)))
++ adev->sdma.has_page_queue = false;
++ else if (sdma_v4_0_fw_support_paging_queue(adev))
++ adev->sdma.has_page_queue = true;
++
+ sdma_v4_0_set_ring_funcs(adev);
+ sdma_v4_0_set_buffer_funcs(adev);
+ sdma_v4_0_set_vm_pte_funcs(adev);
+@@ -1474,7 +1497,6 @@ static int sdma_v4_0_early_init(void *handle)
+ return 0;
+ }
+
+-
+ static int sdma_v4_0_sw_init(void *handle)
+ {
+ struct amdgpu_ring *ring;
+@@ -1493,12 +1515,6 @@ static int sdma_v4_0_sw_init(void *handle)
+ if (r)
+ return r;
+
+- r = sdma_v4_0_init_microcode(adev);
+- if (r) {
+- DRM_ERROR("Failed to load sdma firmware!\n");
+- return r;
+- }
+-
+ for (i = 0; i < adev->sdma.num_instances; i++) {
+ ring = &adev->sdma.instance[i].ring;
+ ring->ring_obj = NULL;
+--
+2.17.1
+