Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdkfd: display debug capabilities

Expose debug capabilities in the KFD topology node's HSA capabilities and
debug properties flags.

Ensure correct capabilities are exposed based on firmware support.

Flag definitions can be referenced in uapi/linux/kfd_sysfs.h.

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>

authored by

Jonathan Kim and committed by
Alex Deucher
d230f1bf 4f98cf2b

+117 -5
+96 -5
drivers/gpu/drm/amd/amdkfd/kfd_topology.c
··· 535 535 dev->gpu->kfd->mec_fw_version); 536 536 sysfs_show_32bit_prop(buffer, offs, "capability", 537 537 dev->node_props.capability); 538 + sysfs_show_64bit_prop(buffer, offs, "debug_prop", 539 + dev->node_props.debug_prop); 538 540 sysfs_show_32bit_prop(buffer, offs, "sdma_fw_version", 539 541 dev->gpu->kfd->sdma_fw_version); 540 542 sysfs_show_64bit_prop(buffer, offs, "unique_id", ··· 1859 1857 return res; 1860 1858 } 1861 1859 1860 + static void kfd_topology_set_dbg_firmware_support(struct kfd_topology_device *dev) 1861 + { 1862 + bool firmware_supported = true; 1863 + 1864 + if (KFD_GC_VERSION(dev->gpu) >= IP_VERSION(11, 0, 0) && 1865 + KFD_GC_VERSION(dev->gpu) < IP_VERSION(12, 0, 0)) { 1866 + firmware_supported = 1867 + (dev->gpu->adev->mes.sched_version & AMDGPU_MES_VERSION_MASK) >= 9; 1868 + goto out; 1869 + } 1870 + 1871 + /* 1872 + * Note: Any unlisted devices here are assumed to support exception handling. 1873 + * Add additional checks here as needed. 1874 + */ 1875 + switch (KFD_GC_VERSION(dev->gpu)) { 1876 + case IP_VERSION(9, 0, 1): 1877 + firmware_supported = dev->gpu->kfd->mec_fw_version >= 459 + 32768; 1878 + break; 1879 + case IP_VERSION(9, 1, 0): 1880 + case IP_VERSION(9, 2, 1): 1881 + case IP_VERSION(9, 2, 2): 1882 + case IP_VERSION(9, 3, 0): 1883 + case IP_VERSION(9, 4, 0): 1884 + firmware_supported = dev->gpu->kfd->mec_fw_version >= 459; 1885 + break; 1886 + case IP_VERSION(9, 4, 1): 1887 + firmware_supported = dev->gpu->kfd->mec_fw_version >= 60; 1888 + break; 1889 + case IP_VERSION(9, 4, 2): 1890 + firmware_supported = dev->gpu->kfd->mec_fw_version >= 51; 1891 + break; 1892 + case IP_VERSION(10, 1, 10): 1893 + case IP_VERSION(10, 1, 2): 1894 + case IP_VERSION(10, 1, 1): 1895 + firmware_supported = dev->gpu->kfd->mec_fw_version >= 144; 1896 + break; 1897 + case IP_VERSION(10, 3, 0): 1898 + case IP_VERSION(10, 3, 2): 1899 + case IP_VERSION(10, 3, 1): 1900 + case IP_VERSION(10, 3, 4): 1901 + case IP_VERSION(10, 3, 5): 1902 + firmware_supported = dev->gpu->kfd->mec_fw_version >= 89; 1903 + break; 1904 + case IP_VERSION(10, 1, 3): 1905 + case IP_VERSION(10, 3, 3): 1906 + firmware_supported = false; 1907 + break; 1908 + default: 1909 + break; 1910 + } 1911 + 1912 + out: 1913 + if (firmware_supported) 1914 + dev->node_props.capability |= HSA_CAP_TRAP_DEBUG_FIRMWARE_SUPPORTED; 1915 + } 1916 + 1917 + static void kfd_topology_set_capabilities(struct kfd_topology_device *dev) 1918 + { 1919 + dev->node_props.capability |= ((HSA_CAP_DOORBELL_TYPE_2_0 << 1920 + HSA_CAP_DOORBELL_TYPE_TOTALBITS_SHIFT) & 1921 + HSA_CAP_DOORBELL_TYPE_TOTALBITS_MASK); 1922 + 1923 + dev->node_props.capability |= HSA_CAP_TRAP_DEBUG_SUPPORT | 1924 + HSA_CAP_TRAP_DEBUG_WAVE_LAUNCH_TRAP_OVERRIDE_SUPPORTED | 1925 + HSA_CAP_TRAP_DEBUG_WAVE_LAUNCH_MODE_SUPPORTED; 1926 + 1927 + if (KFD_GC_VERSION(dev->gpu) < IP_VERSION(10, 0, 0)) { 1928 + dev->node_props.debug_prop |= HSA_DBG_WATCH_ADDR_MASK_LO_BIT_GFX9 | 1929 + HSA_DBG_WATCH_ADDR_MASK_HI_BIT; 1930 + 1931 + if (KFD_GC_VERSION(dev->gpu) < IP_VERSION(9, 4, 2)) 1932 + dev->node_props.debug_prop |= 1933 + HSA_DBG_DISPATCH_INFO_ALWAYS_VALID; 1934 + else 1935 + dev->node_props.capability |= 1936 + HSA_CAP_TRAP_DEBUG_PRECISE_MEMORY_OPERATIONS_SUPPORTED; 1937 + } else { 1938 + dev->node_props.debug_prop |= HSA_DBG_WATCH_ADDR_MASK_LO_BIT_GFX10 | 1939 + HSA_DBG_WATCH_ADDR_MASK_HI_BIT; 1940 + 1941 + if (KFD_GC_VERSION(dev->gpu) < IP_VERSION(11, 0, 0)) 1942 + dev->node_props.debug_prop |= HSA_DBG_DISPATCH_INFO_ALWAYS_VALID; 1943 + else 1944 + dev->node_props.capability |= 1945 + HSA_CAP_TRAP_DEBUG_PRECISE_MEMORY_OPERATIONS_SUPPORTED; 1946 + } 1947 + 1948 + kfd_topology_set_dbg_firmware_support(dev); 1949 + } 1950 + 1862 1951 int kfd_topology_add_device(struct kfd_node *gpu) 1863 1952 { 1864 1953 uint32_t gpu_id; ··· 2060 1967 HSA_CAP_DOORBELL_TYPE_TOTALBITS_MASK); 2061 1968 break; 2062 1969 default: 2063 - if (KFD_GC_VERSION(dev->gpu) >= IP_VERSION(9, 0, 1)) 2064 - dev->node_props.capability |= ((HSA_CAP_DOORBELL_TYPE_2_0 << 2065 - HSA_CAP_DOORBELL_TYPE_TOTALBITS_SHIFT) & 2066 - HSA_CAP_DOORBELL_TYPE_TOTALBITS_MASK); 2067 - else 1970 + if (KFD_GC_VERSION(dev->gpu) < IP_VERSION(9, 0, 1)) 2068 1971 WARN(1, "Unexpected ASIC family %u", 2069 1972 dev->gpu->adev->asic_type); 1973 + else 1974 + kfd_topology_set_capabilities(dev); 2070 1975 } 2071 1976 2072 1977 /*
+6
drivers/gpu/drm/amd/amdkfd/kfd_topology.h
··· 31 31 32 32 #define KFD_TOPOLOGY_PUBLIC_NAME_SIZE 32 33 33 34 + #define HSA_DBG_WATCH_ADDR_MASK_LO_BIT_GFX9 6 35 + #define HSA_DBG_WATCH_ADDR_MASK_LO_BIT_GFX10 7 36 + #define HSA_DBG_WATCH_ADDR_MASK_HI_BIT \ 37 + (29 << HSA_DBG_WATCH_ADDR_MASK_HI_BIT_SHIFT) 38 + 34 39 struct kfd_node_properties { 35 40 uint64_t hive_id; 36 41 uint32_t cpu_cores_count; ··· 47 42 uint32_t cpu_core_id_base; 48 43 uint32_t simd_id_base; 49 44 uint32_t capability; 45 + uint64_t debug_prop; 50 46 uint32_t max_waves_per_simd; 51 47 uint32_t lds_size_in_kb; 52 48 uint32_t gds_size_in_kb;
+15
include/uapi/linux/kfd_sysfs.h
··· 43 43 #define HSA_CAP_DOORBELL_TYPE_2_0 0x2 44 44 #define HSA_CAP_AQL_QUEUE_DOUBLE_MAP 0x00004000 45 45 46 + #define HSA_CAP_TRAP_DEBUG_SUPPORT 0x00008000 47 + #define HSA_CAP_TRAP_DEBUG_WAVE_LAUNCH_TRAP_OVERRIDE_SUPPORTED 0x00010000 48 + #define HSA_CAP_TRAP_DEBUG_WAVE_LAUNCH_MODE_SUPPORTED 0x00020000 49 + #define HSA_CAP_TRAP_DEBUG_PRECISE_MEMORY_OPERATIONS_SUPPORTED 0x00040000 50 + 46 51 /* Old buggy user mode depends on this being 0 */ 47 52 #define HSA_CAP_RESERVED_WAS_SRAM_EDCSUPPORTED 0x00080000 48 53 ··· 58 53 #define HSA_CAP_SRAM_EDCSUPPORTED 0x04000000 59 54 #define HSA_CAP_SVMAPI_SUPPORTED 0x08000000 60 55 #define HSA_CAP_FLAGS_COHERENTHOSTACCESS 0x10000000 56 + #define HSA_CAP_TRAP_DEBUG_FIRMWARE_SUPPORTED 0x20000000 61 57 #define HSA_CAP_RESERVED 0xe00f8000 58 + 59 + /* debug_prop bits in node properties */ 60 + #define HSA_DBG_WATCH_ADDR_MASK_LO_BIT_MASK 0x0000000f 61 + #define HSA_DBG_WATCH_ADDR_MASK_LO_BIT_SHIFT 0 62 + #define HSA_DBG_WATCH_ADDR_MASK_HI_BIT_MASK 0x000003f0 63 + #define HSA_DBG_WATCH_ADDR_MASK_HI_BIT_SHIFT 4 64 + #define HSA_DBG_DISPATCH_INFO_ALWAYS_VALID 0x00000400 65 + #define HSA_DBG_WATCHPOINTS_EXCLUSIVE 0x00000800 66 + #define HSA_DBG_RESERVED 0xfffffffffffff000ull 62 67 63 68 /* Heap types in memory properties */ 64 69 #define HSA_MEM_HEAP_TYPE_SYSTEM 0