]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdkfd: allow debug subscription to lds violations on gfx 1250
authorJonathan Kim <jonathan.kim@amd.com>
Mon, 23 Jun 2025 18:12:58 +0000 (14:12 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 16 Dec 2025 18:23:17 +0000 (13:23 -0500)
GFX 1250 allows the debugger to subcribe to LDS out-of-range read/write
memory violations.
Bump IOCTL minor version and flag KFD capabilities for enablement
hint.

Signed-off-by: Jonathan Kim <jonathan.kim@amd.com>
Reviewed-by: Felix Kuehling <felix.kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_debug.c
drivers/gpu/drm/amd/amdkfd/kfd_topology.c
include/uapi/linux/kfd_ioctl.h
include/uapi/linux/kfd_sysfs.h

index ba9a09b6589a6ac58158fa9af5a947eee547d076..f83e1238c1b3d807e0d6866650d1d6ebd46f4e1d 100644 (file)
@@ -519,6 +519,7 @@ int kfd_dbg_trap_set_flags(struct kfd_process *target, uint32_t *flags)
                struct kfd_topology_device *topo_dev =
                                kfd_topology_device_by_id(target->pdds[i]->dev->id);
                uint32_t caps = topo_dev->node_props.capability;
+               uint32_t caps2 = topo_dev->node_props.capability2;
 
                if (!(caps & HSA_CAP_TRAP_DEBUG_PRECISE_MEMORY_OPERATIONS_SUPPORTED) &&
                        (*flags & KFD_DBG_TRAP_FLAG_SINGLE_MEM_OP)) {
@@ -531,6 +532,12 @@ int kfd_dbg_trap_set_flags(struct kfd_process *target, uint32_t *flags)
                        *flags = prev_flags;
                        return -EACCES;
                }
+
+               if (!(caps2 & HSA_CAP2_TRAP_DEBUG_LDS_OUT_OF_ADDR_RANGE_SUPPORTED) &&
+                   (*flags & KFD_DBG_TRAP_FLAG_LDS_OUT_OF_ADDR_RANGE)) {
+                       *flags = prev_flags;
+                       return -EACCES;
+               }
        }
 
        target->dbg_flags = *flags;
index a0990dd2378c17e6666d5e925be35215a1bf3d7b..7a402c9c1b6e60c5d1c9e37e0289d27628a70f43 100644 (file)
@@ -2028,6 +2028,10 @@ static void kfd_topology_set_capabilities(struct kfd_topology_device *dev)
                if (KFD_GC_VERSION(dev->gpu) >= IP_VERSION(12, 0, 0))
                        dev->node_props.capability |=
                                HSA_CAP_TRAP_DEBUG_PRECISE_ALU_OPERATIONS_SUPPORTED;
+
+               if (KFD_GC_VERSION(dev->gpu) >= IP_VERSION(12, 1, 0))
+                       dev->node_props.capability2 |=
+                               HSA_CAP2_TRAP_DEBUG_LDS_OUT_OF_ADDR_RANGE_SUPPORTED;
        }
 
        kfd_topology_set_dbg_firmware_support(dev);
index 4d0c1a53f9d517f4bb4f199d8919488aad430383..6e91875c10baab65529ba0ca039823f94a6ccc54 100644 (file)
  * - 1.18 - Rename pad in set_memory_policy_args to misc_process_flag
  * - 1.19 - Add a new ioctl to craete secondary kfd processes
  * - 1.20 - Trap handler support for expert scheduling mode available
+ * - 1.21 - Debugger support to subscribe to LDS out-of-address exceptions
  */
 #define KFD_IOCTL_MAJOR_VERSION 1
-#define KFD_IOCTL_MINOR_VERSION 20
+#define KFD_IOCTL_MINOR_VERSION 21
 
 struct kfd_ioctl_get_version_args {
        __u32 major_version;    /* from KFD */
@@ -947,6 +948,7 @@ enum kfd_dbg_trap_address_watch_mode {
 enum kfd_dbg_trap_flags {
        KFD_DBG_TRAP_FLAG_SINGLE_MEM_OP = 1,
        KFD_DBG_TRAP_FLAG_SINGLE_ALU_OP = 2,
+       KFD_DBG_TRAP_FLAG_LDS_OUT_OF_ADDR_RANGE = 4
 };
 
 /* Trap exceptions */
index 1125fe47959fa2b49fa260da173308a684ef5165..0b6ce2f3c887189fc687c99e90dbd1de474f700c 100644 (file)
@@ -64,7 +64,8 @@
 #define HSA_CAP_RESERVED                                       0x000f8000
 
 #define HSA_CAP2_PER_SDMA_QUEUE_RESET_SUPPORTED                        0x00000001
-#define HSA_CAP2_RESERVED                                      0xfffffffe
+#define HSA_CAP2_TRAP_DEBUG_LDS_OUT_OF_ADDR_RANGE_SUPPORTED    0x00000002
+#define HSA_CAP2_RESERVED                                      0xfffffffc
 
 /* debug_prop bits in node properties */
 #define HSA_DBG_WATCH_ADDR_MASK_LO_BIT_MASK     0x0000000f