+ int vmid;
+
+ if (!amdgpu_trap_is_enabled(adev) ||
+ !adev->gfx.funcs || !adev->gfx.funcs->select_me_pipe_q)
+ return;
+
+ WARN_ON(!IS_ALIGNED(tba_addr, 256));
+ WARN_ON(!IS_ALIGNED(tma_addr, 256));
+
+ mutex_lock(&adev->srbm_mutex);
+ for (vmid = 1; vmid < adev->vm_manager.first_kfd_vmid; vmid++) {
+ amdgpu_gfx_select_me_pipe_q(adev, 0, 0, 0, vmid, 0);
+ WREG32_SOC15(GC, 0, regSQ_SHADER_TBA_LO,
+ lower_32_bits(tba_addr >> 8));
+ WREG32_SOC15(GC, 0, regSQ_SHADER_TBA_HI,
+ upper_32_bits(tba_addr >> 8) |
+ (1 << SQ_SHADER_TBA_HI__TRAP_EN__SHIFT));
+ WREG32_SOC15(GC, 0, regSQ_SHADER_TMA_LO,
+ lower_32_bits(tma_addr >> 8));
+ WREG32_SOC15(GC, 0, regSQ_SHADER_TMA_HI,
+ upper_32_bits(tma_addr >> 8));
+ }
+ amdgpu_gfx_select_me_pipe_q(adev, 0, 0, 0, 0, 0);
+ mutex_unlock(&adev->srbm_mutex);
+}
+
static void gfxhub_v11_5_0_setup_vmid_config(struct amdgpu_device
*adev)
{
struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];
@@ -337,6 +369,9 @@ static void
gfxhub_v11_5_0_setup_vmid_config(struct amdgpu_device *adev)
}
hub->vm_cntx_cntl = tmp;
+
+ if (amdgpu_trap_is_enabled(adev))
+ gfxhub_v11_5_0_program_kernel_trap_tba_tma(adev);
}
static void gfxhub_v11_5_0_program_invalidation(struct
amdgpu_device *adev)
diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v12_0.c b/drivers/gpu/
drm/amd/amdgpu/gfxhub_v12_0.c
index 6cbf837d50dd..b521a6c6eaf6 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v12_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v12_0.c
@@ -22,6 +22,7 @@
*/
#include "amdgpu.h"
+#include "amdgpu_trap.h"
#include "gfxhub_v12_0.h"
#include "gc/gc_12_0_0_offset.h"
@@ -295,6 +296,37 @@ static void
gfxhub_v12_0_disable_identity_aperture(struct amdgpu_device *adev)
}
+static void
+gfxhub_v12_0_program_kernel_trap_tba_tma(struct amdgpu_device *adev)
+{
+ u64 tba_addr = AMDGPU_VA_RESERVED_TRAP_START(adev);
+ u64 tma_addr = tba_addr + AMDGPU_TRAP_TMA_OFFSET; /* tba_addr +
0x1800 */
+ int vmid;
+
+ if (!amdgpu_trap_is_enabled(adev) ||
+ !adev->gfx.funcs || !adev->gfx.funcs->select_me_pipe_q)
+ return;
+
+ WARN_ON(!IS_ALIGNED(tba_addr, 256));
+ WARN_ON(!IS_ALIGNED(tma_addr, 256));
+
+ mutex_lock(&adev->srbm_mutex);
+ for (vmid = 1; vmid < adev->vm_manager.first_kfd_vmid; vmid++) {
+ amdgpu_gfx_select_me_pipe_q(adev, 0, 0, 0, vmid, 0);
+ WREG32_SOC15(GC, 0, regSQ_SHADER_TBA_LO,
+ lower_32_bits(tba_addr >> 8));
+ WREG32_SOC15(GC, 0, regSQ_SHADER_TBA_HI,
+ upper_32_bits(tba_addr >> 8) |
+ (1 << SQ_SHADER_TBA_HI__TRAP_EN__SHIFT));
+ WREG32_SOC15(GC, 0, regSQ_SHADER_TMA_LO,
+ lower_32_bits(tma_addr >> 8));
+ WREG32_SOC15(GC, 0, regSQ_SHADER_TMA_HI,
+ upper_32_bits(tma_addr >> 8));
+ }
+ amdgpu_gfx_select_me_pipe_q(adev, 0, 0, 0, 0, 0);
+ mutex_unlock(&adev->srbm_mutex);
+}
+
static void gfxhub_v12_0_setup_vmid_config(struct amdgpu_device *adev)
{
struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];
@@ -342,6 +374,9 @@ static void gfxhub_v12_0_setup_vmid_config(struct
amdgpu_device *adev)
}
hub->vm_cntx_cntl = tmp;
+
+ if (amdgpu_trap_is_enabled(adev))
+ gfxhub_v12_0_program_kernel_trap_tba_tma(adev);
}
static void gfxhub_v12_0_program_invalidation(struct
amdgpu_device *adev)
diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v12_1.c b/drivers/gpu/
drm/amd/amdgpu/gfxhub_v12_1.c
index 4c2fd1e6616e..ac52ccda713d 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v12_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v12_1.c
@@ -21,6 +21,7 @@
*
*/
#include "amdgpu.h"
+#include "amdgpu_trap.h"
#include "amdgpu_xcp.h"
#include "gfxhub_v12_1.h"
@@ -406,6 +407,41 @@ static void
gfxhub_v12_1_xcc_disable_identity_aperture(struct amdgpu_device *ade
}
}
+static void
+gfxhub_v12_1_program_kernel_trap_tba_tma(struct amdgpu_device *adev)
+{
+ u64 tba_addr = AMDGPU_VA_RESERVED_TRAP_START(adev);
+ u64 tma_addr = tba_addr + AMDGPU_TRAP_TMA_OFFSET; /* tba_addr +
0x1800 */
+ int xcc, vmid;
+
+ if (!amdgpu_trap_is_enabled(adev) ||
+ !adev->gfx.funcs || !adev->gfx.funcs->select_me_pipe_q)
+ return;
+
+ WARN_ON(!IS_ALIGNED(tba_addr, 256));
+ WARN_ON(!IS_ALIGNED(tma_addr, 256));
+
+ mutex_lock(&adev->srbm_mutex);
+ for_each_inst(xcc, adev->gfx.xcc_mask) {
+ for (vmid = 1; vmid < adev->vm_manager.first_kfd_vmid; vmid+
+) {
+ amdgpu_gfx_select_me_pipe_q(adev, 0, 0, 0, vmid, xcc);
+ WREG32_SOC15(GC, GET_INST(GC, xcc), regSQ_SHADER_TBA_LO,
+ lower_32_bits(tba_addr >> 8));
+ WREG32_SOC15(GC, GET_INST(GC, xcc), regSQ_SHADER_TBA_HI,
+ upper_32_bits(tba_addr >> 8) |
+ (1 << SQ_SHADER_TBA_HI__TRAP_EN__SHIFT));
+ WREG32_SOC15(GC, GET_INST(GC, xcc), regSQ_SHADER_TMA_LO,
+ lower_32_bits(tma_addr >> 8));
+ WREG32_SOC15(GC, GET_INST(GC, xcc), regSQ_SHADER_TMA_HI,
+ upper_32_bits(tma_addr >> 8));
+ }
+ }
+ /* Reset the VMID selector on every XCC instance. */
+ for_each_inst(xcc, adev->gfx.xcc_mask)
+ amdgpu_gfx_select_me_pipe_q(adev, 0, 0, 0, 0, xcc);
+ mutex_unlock(&adev->srbm_mutex);
+}
+
static void gfxhub_v12_1_xcc_setup_vmid_config(struct amdgpu_device
*adev,
uint32_t xcc_mask)
{
@@ -468,6 +504,9 @@ static void
gfxhub_v12_1_xcc_setup_vmid_config(struct amdgpu_device *adev,
hub->vm_cntx_cntl = tmp;
}
+
+ if (amdgpu_trap_is_enabled(adev))
+ gfxhub_v12_1_program_kernel_trap_tba_tma(adev);
}
static void gfxhub_v12_1_xcc_program_invalidation(struct
amdgpu_device *adev,
diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v2_0.c b/drivers/gpu/
drm/amd/amdgpu/gfxhub_v2_0.c
index 9ea593e2c719..ba2d5d719474 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v2_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v2_0.c
@@ -22,6 +22,7 @@
*/
#include "amdgpu.h"
+#include "amdgpu_trap.h"
#include "gfxhub_v2_0.h"
#include "gc/gc_10_1_0_offset.h"
@@ -280,6 +281,37 @@ static void
gfxhub_v2_0_disable_identity_aperture(struct amdgpu_device *adev)
}
+static void
+gfxhub_v2_0_program_kernel_trap_tba_tma(struct amdgpu_device *adev)
+{
+ u64 tba_addr = AMDGPU_VA_RESERVED_TRAP_START(adev);
+ u64 tma_addr = tba_addr + AMDGPU_TRAP_TMA_OFFSET; /* tba_addr +
0x1800 */
+ int vmid;
+
+ if (!amdgpu_trap_is_enabled(adev) ||
+ !adev->gfx.funcs || !adev->gfx.funcs->select_me_pipe_q)
+ return;
+
+ WARN_ON(!IS_ALIGNED(tba_addr, 256));
+ WARN_ON(!IS_ALIGNED(tma_addr, 256));
+
+ mutex_lock(&adev->srbm_mutex);
+ for (vmid = 1; vmid < adev->vm_manager.first_kfd_vmid; vmid++) {
+ amdgpu_gfx_select_me_pipe_q(adev, 0, 0, 0, vmid, 0);
+ WREG32_SOC15(GC, 0, mmSQ_SHADER_TBA_LO,
+ lower_32_bits(tba_addr >> 8));
+ WREG32_SOC15(GC, 0, mmSQ_SHADER_TBA_HI,
+ upper_32_bits(tba_addr >> 8) |
+ (1 << SQ_SHADER_TBA_HI__TRAP_EN__SHIFT));
+ WREG32_SOC15(GC, 0, mmSQ_SHADER_TMA_LO,
+ lower_32_bits(tma_addr >> 8));
+ WREG32_SOC15(GC, 0, mmSQ_SHADER_TMA_HI,
+ upper_32_bits(tma_addr >> 8));
+ }
+ amdgpu_gfx_select_me_pipe_q(adev, 0, 0, 0, 0, 0);
+ mutex_unlock(&adev->srbm_mutex);
+}
+
static void gfxhub_v2_0_setup_vmid_config(struct amdgpu_device *adev)
{
struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];
@@ -327,6 +359,9 @@ static void gfxhub_v2_0_setup_vmid_config(struct
amdgpu_device *adev)
}
hub->vm_cntx_cntl = tmp;
+
+ if (amdgpu_trap_is_enabled(adev))
+ gfxhub_v2_0_program_kernel_trap_tba_tma(adev);
}
static void gfxhub_v2_0_program_invalidation(struct amdgpu_device
*adev)
diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v3_0.c b/drivers/gpu/
drm/amd/amdgpu/gfxhub_v3_0.c
index 9e6a6e13dec0..204a8817df30 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v3_0.c
@@ -22,6 +22,7 @@
*/
#include "amdgpu.h"
+#include "amdgpu_trap.h"
#include "gfxhub_v3_0.h"
#include "gc/gc_11_0_0_offset.h"
@@ -287,6 +288,37 @@ static void
gfxhub_v3_0_disable_identity_aperture(struct amdgpu_device *adev)
}
+static void
+gfxhub_v3_0_program_kernel_trap_tba_tma(struct amdgpu_device *adev)
+{
+ u64 tba_addr = AMDGPU_VA_RESERVED_TRAP_START(adev);
+ u64 tma_addr = tba_addr + AMDGPU_TRAP_TMA_OFFSET; /* tba_addr +
0x1800 */
+ int vmid;
+
+ if (!amdgpu_trap_is_enabled(adev) ||
+ !adev->gfx.funcs || !adev->gfx.funcs->select_me_pipe_q)
+ return;
+
+ WARN_ON(!IS_ALIGNED(tba_addr, 256));
+ WARN_ON(!IS_ALIGNED(tma_addr, 256));
+
+ mutex_lock(&adev->srbm_mutex);
+ for (vmid = 1; vmid < adev->vm_manager.first_kfd_vmid; vmid++) {
+ amdgpu_gfx_select_me_pipe_q(adev, 0, 0, 0, vmid, 0);
+ WREG32_SOC15(GC, 0, regSQ_SHADER_TBA_LO,
+ lower_32_bits(tba_addr >> 8));
+ WREG32_SOC15(GC, 0, regSQ_SHADER_TBA_HI,
+ upper_32_bits(tba_addr >> 8) |
+ (1 << SQ_SHADER_TBA_HI__TRAP_EN__SHIFT));
+ WREG32_SOC15(GC, 0, regSQ_SHADER_TMA_LO,
+ lower_32_bits(tma_addr >> 8));
+ WREG32_SOC15(GC, 0, regSQ_SHADER_TMA_HI,
+ upper_32_bits(tma_addr >> 8));
+ }
+ amdgpu_gfx_select_me_pipe_q(adev, 0, 0, 0, 0, 0);
+ mutex_unlock(&adev->srbm_mutex);
+}
+
static void gfxhub_v3_0_setup_vmid_config(struct amdgpu_device *adev)
{
struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];
@@ -334,6 +366,9 @@ static void gfxhub_v3_0_setup_vmid_config(struct
amdgpu_device *adev)
}
hub->vm_cntx_cntl = tmp;
+
+ if (amdgpu_trap_is_enabled(adev))
+ gfxhub_v3_0_program_kernel_trap_tba_tma(adev);
}
static void gfxhub_v3_0_program_invalidation(struct amdgpu_device
*adev)