aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/1626-drm-amdkfd-Add-Vega10-addr-watch-wave-control.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/1626-drm-amdkfd-Add-Vega10-addr-watch-wave-control.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/1626-drm-amdkfd-Add-Vega10-addr-watch-wave-control.patch162
1 files changed, 162 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/1626-drm-amdkfd-Add-Vega10-addr-watch-wave-control.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/1626-drm-amdkfd-Add-Vega10-addr-watch-wave-control.patch
new file mode 100644
index 00000000..391e53be
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/1626-drm-amdkfd-Add-Vega10-addr-watch-wave-control.patch
@@ -0,0 +1,162 @@
+From 6890856a711c8633630e0e75cd91399e77823abe Mon Sep 17 00:00:00 2001
+From: Philip Cox <Philip.Cox@amd.com>
+Date: Tue, 14 Mar 2017 14:00:23 -0400
+Subject: [PATCH 1626/4131] drm/amdkfd: Add Vega10 addr watch & wave control
+
+Enable HSA debugger support for address watch and wave control for Vega10.
+This is to add support for the HSA debugger on Vega10.
+
+Change-Id: I4a7866e1eee33bed30218a7ebd7b9dfc69c061f1
+Signed-off-by: Philip Cox <Philip.Cox@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c | 56 ++++++++++++++---------
+ 1 file changed, 35 insertions(+), 21 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
+index e9b2db9..7fa36f77 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
+@@ -141,6 +141,7 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd,
+ static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
+ unsigned int utimeout);
+ static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid);
++static uint32_t get_watch_base_addr(void);
+ static int kgd_address_watch_disable(struct kgd_dev *kgd);
+ static int kgd_address_watch_execute(struct kgd_dev *kgd,
+ unsigned int watch_point_id,
+@@ -451,6 +452,16 @@ static uint32_t get_sdma_base_addr(unsigned int engine_id,
+ return retval;
+ }
+
++static uint32_t get_watch_base_addr(void)
++{
++ uint32_t retval = SOC15_REG_OFFSET(GC, 0, mmTCP_WATCH0_ADDR_H) -
++ mmTCP_WATCH0_ADDR_H;
++
++ pr_debug("kfd: reg watch base address: 0x%x\n", retval);
++
++ return retval;
++}
++
+ static inline struct v9_mqd *get_mqd(void *mqd)
+ {
+ return (struct v9_mqd *)mqd;
+@@ -909,12 +920,10 @@ static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid)
+
+ static int kgd_address_watch_disable(struct kgd_dev *kgd)
+ {
+- WARN_ONCE(1, "Not implemented");
+-
+-#if 0 /* TODO: Update to SOC15 register */
+ struct amdgpu_device *adev = get_amdgpu_device(kgd);
+ union TCP_WATCH_CNTL_BITS cntl;
+ unsigned int i;
++ uint32_t watch_base_addr;
+
+ cntl.u32All = 0;
+
+@@ -922,11 +931,13 @@ static int kgd_address_watch_disable(struct kgd_dev *kgd)
+ cntl.bitfields.mask = ADDRESS_WATCH_REG_CNTL_DEFAULT_MASK;
+ cntl.bitfields.atc = 1;
+
++ watch_base_addr = get_watch_base_addr();
+ /* Turning off this address until we set all the registers */
+ for (i = 0; i < MAX_WATCH_ADDRESSES; i++)
+- WREG32(watchRegs[i * ADDRESS_WATCH_REG_MAX + ADDRESS_WATCH_REG_CNTL],
++ WREG32(watch_base_addr +
++ watchRegs[i * ADDRESS_WATCH_REG_MAX +
++ ADDRESS_WATCH_REG_CNTL],
+ cntl.u32All);
+-#endif
+
+ return 0;
+ }
+@@ -937,31 +948,37 @@ static int kgd_address_watch_execute(struct kgd_dev *kgd,
+ uint32_t addr_hi,
+ uint32_t addr_lo)
+ {
+- WARN_ONCE(1, "Not implemented");
+-
+-#if 0 /* TODO: Update to SOC15 register */
+ struct amdgpu_device *adev = get_amdgpu_device(kgd);
+ union TCP_WATCH_CNTL_BITS cntl;
++ uint32_t watch_base_addr;
+
++ watch_base_addr = get_watch_base_addr();
+ cntl.u32All = cntl_val;
+
+ /* Turning off this watch point until we set all the registers */
+ cntl.bitfields.valid = 0;
+- WREG32(watchRegs[watch_point_id * ADDRESS_WATCH_REG_MAX + ADDRESS_WATCH_REG_CNTL],
++ WREG32(watch_base_addr +
++ watchRegs[watch_point_id * ADDRESS_WATCH_REG_MAX +
++ ADDRESS_WATCH_REG_CNTL],
+ cntl.u32All);
+
+- WREG32(watchRegs[watch_point_id * ADDRESS_WATCH_REG_MAX + ADDRESS_WATCH_REG_ADDR_HI],
++ WREG32(watch_base_addr +
++ watchRegs[watch_point_id * ADDRESS_WATCH_REG_MAX +
++ ADDRESS_WATCH_REG_ADDR_HI],
+ addr_hi);
+
+- WREG32(watchRegs[watch_point_id * ADDRESS_WATCH_REG_MAX + ADDRESS_WATCH_REG_ADDR_LO],
++ WREG32(watch_base_addr +
++ watchRegs[watch_point_id * ADDRESS_WATCH_REG_MAX +
++ ADDRESS_WATCH_REG_ADDR_LO],
+ addr_lo);
+
+ /* Enable the watch point */
+ cntl.bitfields.valid = 1;
+
+- WREG32(watchRegs[watch_point_id * ADDRESS_WATCH_REG_MAX + ADDRESS_WATCH_REG_CNTL],
++ WREG32(watch_base_addr +
++ watchRegs[watch_point_id * ADDRESS_WATCH_REG_MAX +
++ ADDRESS_WATCH_REG_CNTL],
+ cntl.u32All);
+-#endif
+
+ return 0;
+ }
+@@ -970,16 +987,13 @@ static int kgd_wave_control_execute(struct kgd_dev *kgd,
+ uint32_t gfx_index_val,
+ uint32_t sq_cmd)
+ {
+- WARN_ONCE(1, "Not implemented");
+-
+-#if 0 /* TODO: Update to SOC15 register */
+ struct amdgpu_device *adev = get_amdgpu_device(kgd);
+ uint32_t data = 0;
+
+ mutex_lock(&adev->grbm_idx_mutex);
+
+- WREG32(mmGRBM_GFX_INDEX, gfx_index_val);
+- WREG32(mmSQ_CMD, sq_cmd);
++ WREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_GFX_INDEX), gfx_index_val);
++ WREG32(SOC15_REG_OFFSET(GC, 0, mmSQ_CMD), sq_cmd);
+
+ data = REG_SET_FIELD(data, GRBM_GFX_INDEX,
+ INSTANCE_BROADCAST_WRITES, 1);
+@@ -988,9 +1002,8 @@ static int kgd_wave_control_execute(struct kgd_dev *kgd,
+ data = REG_SET_FIELD(data, GRBM_GFX_INDEX,
+ SE_BROADCAST_WRITES, 1);
+
+- WREG32(mmGRBM_GFX_INDEX, data);
++ WREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_GFX_INDEX), data);
+ mutex_unlock(&adev->grbm_idx_mutex);
+-#endif
+
+ return 0;
+ }
+@@ -999,7 +1012,8 @@ static uint32_t kgd_address_watch_get_offset(struct kgd_dev *kgd,
+ unsigned int watch_point_id,
+ unsigned int reg_offset)
+ {
+- return watchRegs[watch_point_id * ADDRESS_WATCH_REG_MAX + reg_offset];
++ return get_watch_base_addr() +
++ watchRegs[watch_point_id * ADDRESS_WATCH_REG_MAX + reg_offset];
+ }
+
+ static int write_config_static_mem(struct kgd_dev *kgd, bool swizzle_enable,
+--
+2.7.4
+