| 1 | //===--- amdgpu/dynamic_hsa/hsa_ext_amd.h ------------------------- C++ -*-===// |
| 2 | // |
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | // |
| 9 | // The parts of the hsa api that are presently in use by the amdgpu plugin |
| 10 | // |
| 11 | //===----------------------------------------------------------------------===// |
| 12 | #ifndef HSA_RUNTIME_EXT_AMD_H_ |
| 13 | #define HSA_RUNTIME_EXT_AMD_H_ |
| 14 | |
| 15 | #include "hsa.h" |
| 16 | |
| 17 | /* Using this header means we do not know what version library will be linked. |
| 18 | Until such point as a CMake level override is requested, default to the |
| 19 | minimum. */ |
| 20 | /* |
| 21 | * - 1.0 - initial version |
| 22 | */ |
| 23 | #define HSA_AMD_INTERFACE_VERSION_MAJOR 1 |
| 24 | #define HSA_AMD_INTERFACE_VERSION_MINOR 0 |
| 25 | |
| 26 | #ifdef __cplusplus |
| 27 | extern "C" { |
| 28 | #endif |
| 29 | |
| 30 | typedef struct hsa_amd_memory_pool_s { |
| 31 | uint64_t handle; |
| 32 | } hsa_amd_memory_pool_t; |
| 33 | |
| 34 | typedef enum hsa_amd_memory_pool_global_flag_s { |
| 35 | HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_KERNARG_INIT = 1, |
| 36 | HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_FINE_GRAINED = 2, |
| 37 | HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_COARSE_GRAINED = 4 |
| 38 | } hsa_amd_memory_pool_global_flag_t; |
| 39 | |
| 40 | typedef enum { |
| 41 | HSA_AMD_SEGMENT_GLOBAL = 0, |
| 42 | HSA_AMD_SEGMENT_READONLY = 1, |
| 43 | HSA_AMD_SEGMENT_PRIVATE = 2, |
| 44 | HSA_AMD_SEGMENT_GROUP = 3, |
| 45 | } hsa_amd_segment_t; |
| 46 | |
| 47 | typedef enum { |
| 48 | HSA_AMD_MEMORY_POOL_INFO_SEGMENT = 0, |
| 49 | HSA_AMD_MEMORY_POOL_INFO_GLOBAL_FLAGS = 1, |
| 50 | HSA_AMD_MEMORY_POOL_INFO_SIZE = 2, |
| 51 | HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_ALLOWED = 5, |
| 52 | HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_GRANULE = 6, |
| 53 | HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_ALIGNMENT = 7, |
| 54 | HSA_AMD_MEMORY_POOL_INFO_ACCESSIBLE_BY_ALL = 15, |
| 55 | } hsa_amd_memory_pool_info_t; |
| 56 | |
| 57 | typedef enum { |
| 58 | HSA_AMD_AGENT_MEMORY_POOL_INFO_ACCESS = 0, |
| 59 | } hsa_amd_agent_memory_pool_info_t; |
| 60 | |
| 61 | typedef enum { |
| 62 | HSA_AMD_MEMORY_POOL_ACCESS_NEVER_ALLOWED = 0, |
| 63 | } hsa_amd_memory_pool_access_t; |
| 64 | |
| 65 | typedef enum hsa_amd_agent_info_s { |
| 66 | HSA_AMD_AGENT_INFO_CHIP_ID = 0xA000, |
| 67 | HSA_AMD_AGENT_INFO_CACHELINE_SIZE = 0xA001, |
| 68 | HSA_AMD_AGENT_INFO_COMPUTE_UNIT_COUNT = 0xA002, |
| 69 | HSA_AMD_AGENT_INFO_MAX_CLOCK_FREQUENCY = 0xA003, |
| 70 | HSA_AMD_AGENT_INFO_PRODUCT_NAME = 0xA009, |
| 71 | HSA_AMD_AGENT_INFO_MAX_WAVES_PER_CU = 0xA00A, |
| 72 | HSA_AMD_AGENT_INFO_NUM_SIMDS_PER_CU = 0xA00B, |
| 73 | HSA_AMD_AGENT_INFO_COOPERATIVE_QUEUES = 0xA010, |
| 74 | HSA_AMD_AGENT_INFO_TIMESTAMP_FREQUENCY = 0xA016, |
| 75 | } hsa_amd_agent_info_t; |
| 76 | |
| 77 | hsa_status_t hsa_amd_memory_pool_get_info(hsa_amd_memory_pool_t memory_pool, |
| 78 | hsa_amd_memory_pool_info_t attribute, |
| 79 | void *value); |
| 80 | |
| 81 | hsa_status_t hsa_amd_agent_iterate_memory_pools( |
| 82 | hsa_agent_t agent, |
| 83 | hsa_status_t (*callback)(hsa_amd_memory_pool_t memory_pool, void *data), |
| 84 | void *data); |
| 85 | |
| 86 | hsa_status_t hsa_amd_memory_pool_allocate(hsa_amd_memory_pool_t memory_pool, |
| 87 | size_t size, uint32_t flags, |
| 88 | void **ptr); |
| 89 | |
| 90 | hsa_status_t hsa_amd_memory_pool_free(void *ptr); |
| 91 | |
| 92 | hsa_status_t hsa_amd_memory_async_copy(void *dst, hsa_agent_t dst_agent, |
| 93 | const void *src, hsa_agent_t src_agent, |
| 94 | size_t size, uint32_t num_dep_signals, |
| 95 | const hsa_signal_t *dep_signals, |
| 96 | hsa_signal_t completion_signal); |
| 97 | |
| 98 | hsa_status_t hsa_amd_agent_memory_pool_get_info( |
| 99 | hsa_agent_t agent, hsa_amd_memory_pool_t memory_pool, |
| 100 | hsa_amd_agent_memory_pool_info_t attribute, void *value); |
| 101 | |
| 102 | hsa_status_t hsa_amd_agents_allow_access(uint32_t num_agents, |
| 103 | const hsa_agent_t *agents, |
| 104 | const uint32_t *flags, |
| 105 | const void *ptr); |
| 106 | |
| 107 | hsa_status_t hsa_amd_memory_lock(void* host_ptr, size_t size, |
| 108 | hsa_agent_t* agents, int num_agent, |
| 109 | void** agent_ptr); |
| 110 | |
| 111 | hsa_status_t hsa_amd_memory_unlock(void* host_ptr); |
| 112 | |
| 113 | hsa_status_t hsa_amd_memory_fill(void *ptr, uint32_t value, size_t count); |
| 114 | |
| 115 | typedef enum hsa_amd_event_type_s { |
| 116 | HSA_AMD_GPU_MEMORY_FAULT_EVENT = 0, |
| 117 | } hsa_amd_event_type_t; |
| 118 | |
| 119 | typedef struct hsa_amd_gpu_memory_fault_info_s { |
| 120 | hsa_agent_t agent; |
| 121 | uint64_t virtual_address; |
| 122 | uint32_t fault_reason_mask; |
| 123 | } hsa_amd_gpu_memory_fault_info_t; |
| 124 | |
| 125 | typedef struct hsa_amd_event_s { |
| 126 | hsa_amd_event_type_t event_type; |
| 127 | union { |
| 128 | hsa_amd_gpu_memory_fault_info_t memory_fault; |
| 129 | }; |
| 130 | } hsa_amd_event_t; |
| 131 | |
| 132 | typedef hsa_status_t (*hsa_amd_system_event_callback_t)( |
| 133 | const hsa_amd_event_t *event, void *data); |
| 134 | |
| 135 | hsa_status_t |
| 136 | hsa_amd_register_system_event_handler(hsa_amd_system_event_callback_t callback, |
| 137 | void *data); |
| 138 | |
| 139 | typedef enum { |
| 140 | HSA_AMD_MEMORY_FAULT_PAGE_NOT_PRESENT = 1 << 0, |
| 141 | HSA_AMD_MEMORY_FAULT_READ_ONLY = 1 << 1, |
| 142 | HSA_AMD_MEMORY_FAULT_NX = 1 << 2, |
| 143 | HSA_AMD_MEMORY_FAULT_HOST_ONLY = 1 << 3, |
| 144 | HSA_AMD_MEMORY_FAULT_DRAMECC = 1 << 4, |
| 145 | HSA_AMD_MEMORY_FAULT_IMPRECISE = 1 << 5, |
| 146 | HSA_AMD_MEMORY_FAULT_SRAMECC = 1 << 6, |
| 147 | HSA_AMD_MEMORY_FAULT_HANG = 1 << 31 |
| 148 | } hsa_amd_memory_fault_reason_t; |
| 149 | |
| 150 | typedef enum { |
| 151 | HSA_EXT_POINTER_TYPE_UNKNOWN = 0, |
| 152 | HSA_EXT_POINTER_TYPE_HSA = 1, |
| 153 | HSA_EXT_POINTER_TYPE_LOCKED = 2 |
| 154 | } hsa_amd_pointer_type_t; |
| 155 | |
| 156 | typedef struct hsa_amd_pointer_info_s { |
| 157 | uint32_t size; |
| 158 | hsa_amd_pointer_type_t type; |
| 159 | void* agentBaseAddress; |
| 160 | void* hostBaseAddress; |
| 161 | size_t sizeInBytes; |
| 162 | } hsa_amd_pointer_info_t; |
| 163 | |
| 164 | hsa_status_t hsa_amd_pointer_info(const void* ptr, |
| 165 | hsa_amd_pointer_info_t* info, |
| 166 | void* (*alloc)(size_t), |
| 167 | uint32_t* num_agents_accessible, |
| 168 | hsa_agent_t** accessible); |
| 169 | |
| 170 | #ifdef __cplusplus |
| 171 | } |
| 172 | #endif |
| 173 | |
| 174 | #endif |
| 175 | |