aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3144-drm-amdgpu-Default-disable-GDS-for-compute-gfx.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3144-drm-amdgpu-Default-disable-GDS-for-compute-gfx.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3144-drm-amdgpu-Default-disable-GDS-for-compute-gfx.patch219
1 files changed, 219 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3144-drm-amdgpu-Default-disable-GDS-for-compute-gfx.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3144-drm-amdgpu-Default-disable-GDS-for-compute-gfx.patch
new file mode 100644
index 00000000..60233c15
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3144-drm-amdgpu-Default-disable-GDS-for-compute-gfx.patch
@@ -0,0 +1,219 @@
+From 8d4a229f773bc4e574b7877ce26544272db4b0f7 Mon Sep 17 00:00:00 2001
+From: Joseph Greathouse <Joseph.Greathouse@amd.com>
+Date: Fri, 26 Jul 2019 15:52:05 -0500
+Subject: [PATCH 3144/4256] drm/amdgpu: Default disable GDS for compute+gfx
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Units in the GDS block default to allowing all VMIDs access to all
+entries. Disable shader access to the GDS, GWS, and OA blocks from all
+compute and gfx VMIDs by default. For compute, HWS firmware will set
+up the access bits for the appropriate VMID when a compute queue
+requires access to these blocks.
+The driver will handle enabling access on-demand for graphics VMIDs.
+
+Leaving VMID0 with full access because otherwise HWS cannot save or
+restore values during task switch.
+
+v2: Fixed code and comment styling.
+
+Change-Id: I5b8cf2023b79480555dc909019f062c3c7e37241
+Signed-off-by: Joseph Greathouse <Joseph.Greathouse@amd.com>
+Reviewed-by: Christian König <christian.koenig@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c | 25 ++++++++++++++++-------
+ drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | 24 +++++++++++++++-------
+ drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 24 +++++++++++++++-------
+ drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 28 +++++++++++++++++---------
+ 4 files changed, 71 insertions(+), 30 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
+index 23ed5b2dae19..3df1e6212123 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
+@@ -1516,17 +1516,27 @@ static void gfx_v10_0_init_compute_vmid(struct amdgpu_device *adev)
+ }
+ nv_grbm_select(adev, 0, 0, 0, 0);
+ mutex_unlock(&adev->srbm_mutex);
++}
+
+- /* Initialize all compute VMIDs to have no GDS, GWS, or OA
+- acccess. These should be enabled by FW for target VMIDs. */
+- for (i = FIRST_COMPUTE_VMID; i < LAST_COMPUTE_VMID; i++) {
+- WREG32_SOC15_OFFSET(GC, 0, mmGDS_VMID0_BASE, 2 * i, 0);
+- WREG32_SOC15_OFFSET(GC, 0, mmGDS_VMID0_SIZE, 2 * i, 0);
+- WREG32_SOC15_OFFSET(GC, 0, mmGDS_GWS_VMID0, i, 0);
+- WREG32_SOC15_OFFSET(GC, 0, mmGDS_OA_VMID0, i, 0);
++static void gfx_v10_0_init_gds_vmid(struct amdgpu_device *adev)
++{
++ int vmid;
++
++ /*
++ * Initialize all compute and user-gfx VMIDs to have no GDS, GWS, or OA
++ * access. Compute VMIDs should be enabled by FW for target VMIDs,
++ * the driver can enable them for graphics. VMID0 should maintain
++ * access so that HWS firmware can save/restore entries.
++ */
++ for (vmid = 1; vmid < 16; vmid++) {
++ WREG32_SOC15_OFFSET(GC, 0, mmGDS_VMID0_BASE, 2 * vmid, 0);
++ WREG32_SOC15_OFFSET(GC, 0, mmGDS_VMID0_SIZE, 2 * vmid, 0);
++ WREG32_SOC15_OFFSET(GC, 0, mmGDS_GWS_VMID0, vmid, 0);
++ WREG32_SOC15_OFFSET(GC, 0, mmGDS_OA_VMID0, vmid, 0);
+ }
+ }
+
++
+ static void gfx_v10_0_tcp_harvest(struct amdgpu_device *adev)
+ {
+ int i, j, k;
+@@ -1629,6 +1639,7 @@ static void gfx_v10_0_constants_init(struct amdgpu_device *adev)
+ mutex_unlock(&adev->srbm_mutex);
+
+ gfx_v10_0_init_compute_vmid(adev);
++ gfx_v10_0_init_gds_vmid(adev);
+
+ }
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
+index 3f98624772a4..48796b6824cf 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
+@@ -1877,14 +1877,23 @@ static void gfx_v7_0_init_compute_vmid(struct amdgpu_device *adev)
+ }
+ cik_srbm_select(adev, 0, 0, 0, 0);
+ mutex_unlock(&adev->srbm_mutex);
++}
+
+- /* Initialize all compute VMIDs to have no GDS, GWS, or OA
+- acccess. These should be enabled by FW for target VMIDs. */
+- for (i = FIRST_COMPUTE_VMID; i < LAST_COMPUTE_VMID; i++) {
+- WREG32(amdgpu_gds_reg_offset[i].mem_base, 0);
+- WREG32(amdgpu_gds_reg_offset[i].mem_size, 0);
+- WREG32(amdgpu_gds_reg_offset[i].gws, 0);
+- WREG32(amdgpu_gds_reg_offset[i].oa, 0);
++static void gfx_v7_0_init_gds_vmid(struct amdgpu_device *adev)
++{
++ int vmid;
++
++ /*
++ * Initialize all compute and user-gfx VMIDs to have no GDS, GWS, or OA
++ * access. Compute VMIDs should be enabled by FW for target VMIDs,
++ * the driver can enable them for graphics. VMID0 should maintain
++ * access so that HWS firmware can save/restore entries.
++ */
++ for (vmid = 1; vmid < 16; vmid++) {
++ WREG32(amdgpu_gds_reg_offset[vmid].mem_base, 0);
++ WREG32(amdgpu_gds_reg_offset[vmid].mem_size, 0);
++ WREG32(amdgpu_gds_reg_offset[vmid].gws, 0);
++ WREG32(amdgpu_gds_reg_offset[vmid].oa, 0);
+ }
+ }
+
+@@ -1966,6 +1975,7 @@ static void gfx_v7_0_constants_init(struct amdgpu_device *adev)
+ mutex_unlock(&adev->srbm_mutex);
+
+ gfx_v7_0_init_compute_vmid(adev);
++ gfx_v7_0_init_gds_vmid(adev);
+
+ WREG32(mmSX_DEBUG_1, 0x20);
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+index a18d8ab1e4b2..79ccc4bfb676 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+@@ -3702,14 +3702,23 @@ static void gfx_v8_0_init_compute_vmid(struct amdgpu_device *adev)
+ }
+ vi_srbm_select(adev, 0, 0, 0, 0);
+ mutex_unlock(&adev->srbm_mutex);
++}
+
+- /* Initialize all compute VMIDs to have no GDS, GWS, or OA
+- acccess. These should be enabled by FW for target VMIDs. */
+- for (i = FIRST_COMPUTE_VMID; i < LAST_COMPUTE_VMID; i++) {
+- WREG32(amdgpu_gds_reg_offset[i].mem_base, 0);
+- WREG32(amdgpu_gds_reg_offset[i].mem_size, 0);
+- WREG32(amdgpu_gds_reg_offset[i].gws, 0);
+- WREG32(amdgpu_gds_reg_offset[i].oa, 0);
++static void gfx_v8_0_init_gds_vmid(struct amdgpu_device *adev)
++{
++ int vmid;
++
++ /*
++ * Initialize all compute and user-gfx VMIDs to have no GDS, GWS, or OA
++ * access. Compute VMIDs should be enabled by FW for target VMIDs,
++ * the driver can enable them for graphics. VMID0 should maintain
++ * access so that HWS firmware can save/restore entries.
++ */
++ for (vmid = 1; vmid < 16; vmid++) {
++ WREG32(amdgpu_gds_reg_offset[vmid].mem_base, 0);
++ WREG32(amdgpu_gds_reg_offset[vmid].mem_size, 0);
++ WREG32(amdgpu_gds_reg_offset[vmid].gws, 0);
++ WREG32(amdgpu_gds_reg_offset[vmid].oa, 0);
+ }
+ }
+
+@@ -3779,6 +3788,7 @@ static void gfx_v8_0_constants_init(struct amdgpu_device *adev)
+ mutex_unlock(&adev->srbm_mutex);
+
+ gfx_v8_0_init_compute_vmid(adev);
++ gfx_v8_0_init_gds_vmid(adev);
+
+ mutex_lock(&adev->grbm_idx_mutex);
+ /*
+diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
+index 45d5919b0cd5..1b24a338cbdf 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
+@@ -2030,15 +2030,6 @@ static void gfx_v9_0_init_compute_vmid(struct amdgpu_device *adev)
+ }
+ soc15_grbm_select(adev, 0, 0, 0, 0);
+ mutex_unlock(&adev->srbm_mutex);
+-
+- /* Initialize all compute VMIDs to have no GDS, GWS, or OA
+- acccess. These should be enabled by FW for target VMIDs. */
+- for (i = FIRST_COMPUTE_VMID; i < LAST_COMPUTE_VMID; i++) {
+- WREG32_SOC15_OFFSET(GC, 0, mmGDS_VMID0_BASE, 2 * i, 0);
+- WREG32_SOC15_OFFSET(GC, 0, mmGDS_VMID0_SIZE, 2 * i, 0);
+- WREG32_SOC15_OFFSET(GC, 0, mmGDS_GWS_VMID0, i, 0);
+- WREG32_SOC15_OFFSET(GC, 0, mmGDS_OA_VMID0, i, 0);
+- }
+ data = 0;
+ data = REG_SET_FIELD(data, SPI_GDBG_TRAP_CONFIG,
+ VMID_SEL, trap_config_vmid_mask);
+@@ -2047,6 +2038,24 @@ static void gfx_v9_0_init_compute_vmid(struct amdgpu_device *adev)
+ WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_CONFIG), data);
+ }
+
++static void gfx_v9_0_init_gds_vmid(struct amdgpu_device *adev)
++{
++ int vmid;
++
++ /*
++ * Initialize all compute and user-gfx VMIDs to have no GDS, GWS, or OA
++ * access. Compute VMIDs should be enabled by FW for target VMIDs,
++ * the driver can enable them for graphics. VMID0 should maintain
++ * access so that HWS firmware can save/restore entries.
++ */
++ for (vmid = 1; vmid < 16; vmid++) {
++ WREG32_SOC15_OFFSET(GC, 0, mmGDS_VMID0_BASE, 2 * vmid, 0);
++ WREG32_SOC15_OFFSET(GC, 0, mmGDS_VMID0_SIZE, 2 * vmid, 0);
++ WREG32_SOC15_OFFSET(GC, 0, mmGDS_GWS_VMID0, vmid, 0);
++ WREG32_SOC15_OFFSET(GC, 0, mmGDS_OA_VMID0, vmid, 0);
++ }
++}
++
+ static void gfx_v9_0_constants_init(struct amdgpu_device *adev)
+ {
+ u32 tmp;
+@@ -2091,6 +2100,7 @@ static void gfx_v9_0_constants_init(struct amdgpu_device *adev)
+ mutex_unlock(&adev->srbm_mutex);
+
+ gfx_v9_0_init_compute_vmid(adev);
++ gfx_v9_0_init_gds_vmid(adev);
+ }
+
+ static void gfx_v9_0_wait_for_rlc_serdes(struct amdgpu_device *adev)
+--
+2.17.1
+