Commit 9243240b authored by Jonathan Kim's avatar Jonathan Kim Committed by Alex Deucher
Browse files

drm/amdkfd: enable single alu ops for gfx12



GFX12 debugging requires setting up precise ALU operation for catching
ALU exceptions.

Signed-off-by: default avatarJonathan Kim <jonathan.kim@amd.com>
Tested-by: default avatarLancelot Six <lancelot.six@amd.com>
Reviewed-by: default avatarEric Huang <jinhuieric.huang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 984b265f
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include "kfd_topology.h"
#include <linux/file.h>
#include <uapi/linux/kfd_ioctl.h>
#include <uapi/linux/kfd_sysfs.h>

#define MAX_WATCH_ADDRESSES	4

@@ -497,14 +498,24 @@ int kfd_dbg_trap_set_flags(struct kfd_process *target, uint32_t *flags)
	int i, r = 0, rewind_count = 0;

	for (i = 0; i < target->n_pdds; i++) {
		if (!kfd_dbg_is_per_vmid_supported(target->pdds[i]->dev) &&
		struct kfd_topology_device *topo_dev =
				kfd_topology_device_by_id(target->pdds[i]->dev->id);
		uint32_t caps = topo_dev->node_props.capability;

		if (!(caps | HSA_CAP_TRAP_DEBUG_PRECISE_MEMORY_OPERATIONS_SUPPORTED) &&
			(*flags & KFD_DBG_TRAP_FLAG_SINGLE_MEM_OP)) {
			*flags = prev_flags;
			return -EACCES;
		}

		if (!(caps | HSA_CAP_TRAP_DEBUG_PRECISE_ALU_OPERATIONS_SUPPORTED) &&
		    (*flags & KFD_DBG_TRAP_FLAG_SINGLE_ALU_OP)) {
			*flags = prev_flags;
			return -EACCES;
		}
	}

	target->dbg_flags = *flags & KFD_DBG_TRAP_FLAG_SINGLE_MEM_OP;
	target->dbg_flags = *flags;
	*flags = prev_flags;
	for (i = 0; i < target->n_pdds; i++) {
		struct kfd_process_device *pdd = target->pdds[i];
+4 −0
Original line number Diff line number Diff line
@@ -1929,6 +1929,10 @@ static void kfd_topology_set_capabilities(struct kfd_topology_device *dev)
		if (KFD_GC_VERSION(dev->gpu) >= IP_VERSION(11, 0, 0))
			dev->node_props.capability |=
				HSA_CAP_TRAP_DEBUG_PRECISE_MEMORY_OPERATIONS_SUPPORTED;

		if (KFD_GC_VERSION(dev->gpu) >= IP_VERSION(12, 0, 0))
			dev->node_props.capability |=
				HSA_CAP_TRAP_DEBUG_PRECISE_ALU_OPERATIONS_SUPPORTED;
	}

	kfd_topology_set_dbg_firmware_support(dev);
+1 −0
Original line number Diff line number Diff line
@@ -854,6 +854,7 @@ enum kfd_dbg_trap_address_watch_mode {
/* Additional wave settings */
enum kfd_dbg_trap_flags {
	KFD_DBG_TRAP_FLAG_SINGLE_MEM_OP = 1,
	KFD_DBG_TRAP_FLAG_SINGLE_ALU_OP = 2,
};

/* Trap exceptions */
+10 −9
Original line number Diff line number Diff line
@@ -59,7 +59,8 @@
#define HSA_CAP_SVMAPI_SUPPORTED				0x08000000
#define HSA_CAP_FLAGS_COHERENTHOSTACCESS			0x10000000
#define HSA_CAP_TRAP_DEBUG_FIRMWARE_SUPPORTED			0x20000000
#define HSA_CAP_RESERVED			0xe00f8000
#define HSA_CAP_TRAP_DEBUG_PRECISE_ALU_OPERATIONS_SUPPORTED	0x40000000
#define HSA_CAP_RESERVED					0x800f8000

/* debug_prop bits in node properties */
#define HSA_DBG_WATCH_ADDR_MASK_LO_BIT_MASK     0x0000000f