blob: f4cab5b3ba9aaf3c78c7004665363aef89aa8d3b [file] [log] [blame]
Oded Gabbayb7facba2014-07-16 15:55:29 +03001/*
2 * Copyright 2014 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22
23#ifndef KFD_IOCTL_H_INCLUDED
24#define KFD_IOCTL_H_INCLUDED
25
Mikko Rapeli472b46c2017-08-06 18:44:27 +020026#include <drm/drm.h>
Oded Gabbayb7facba2014-07-16 15:55:29 +030027#include <linux/ioctl.h>
28
29#define KFD_IOCTL_MAJOR_VERSION 1
Andrew Lewycky29a5d3e2014-12-07 17:05:11 +020030#define KFD_IOCTL_MINOR_VERSION 1
Oded Gabbayb7facba2014-07-16 15:55:29 +030031
32struct kfd_ioctl_get_version_args {
Mikko Rapeli472b46c2017-08-06 18:44:27 +020033 __u32 major_version; /* from KFD */
34 __u32 minor_version; /* from KFD */
Oded Gabbayb7facba2014-07-16 15:55:29 +030035};
36
37/* For kfd_ioctl_create_queue_args.queue_type. */
38#define KFD_IOC_QUEUE_TYPE_COMPUTE 0
39#define KFD_IOC_QUEUE_TYPE_SDMA 1
40#define KFD_IOC_QUEUE_TYPE_COMPUTE_AQL 2
41
42#define KFD_MAX_QUEUE_PERCENTAGE 100
43#define KFD_MAX_QUEUE_PRIORITY 15
44
45struct kfd_ioctl_create_queue_args {
Mikko Rapeli472b46c2017-08-06 18:44:27 +020046 __u64 ring_base_address; /* to KFD */
47 __u64 write_pointer_address; /* from KFD */
48 __u64 read_pointer_address; /* from KFD */
49 __u64 doorbell_offset; /* from KFD */
Oded Gabbayb7facba2014-07-16 15:55:29 +030050
Mikko Rapeli472b46c2017-08-06 18:44:27 +020051 __u32 ring_size; /* to KFD */
52 __u32 gpu_id; /* to KFD */
53 __u32 queue_type; /* to KFD */
54 __u32 queue_percentage; /* to KFD */
55 __u32 queue_priority; /* to KFD */
56 __u32 queue_id; /* from KFD */
Oded Gabbayb7facba2014-07-16 15:55:29 +030057
Mikko Rapeli472b46c2017-08-06 18:44:27 +020058 __u64 eop_buffer_address; /* to KFD */
59 __u64 eop_buffer_size; /* to KFD */
60 __u64 ctx_save_restore_address; /* to KFD */
Felix Kuehling373d7082017-11-14 16:41:19 -050061 __u32 ctx_save_restore_size; /* to KFD */
62 __u32 ctl_stack_size; /* to KFD */
Oded Gabbayb7facba2014-07-16 15:55:29 +030063};
64
65struct kfd_ioctl_destroy_queue_args {
Mikko Rapeli472b46c2017-08-06 18:44:27 +020066 __u32 queue_id; /* to KFD */
67 __u32 pad;
Oded Gabbayb7facba2014-07-16 15:55:29 +030068};
69
70struct kfd_ioctl_update_queue_args {
Mikko Rapeli472b46c2017-08-06 18:44:27 +020071 __u64 ring_base_address; /* to KFD */
Oded Gabbayb7facba2014-07-16 15:55:29 +030072
Mikko Rapeli472b46c2017-08-06 18:44:27 +020073 __u32 queue_id; /* to KFD */
74 __u32 ring_size; /* to KFD */
75 __u32 queue_percentage; /* to KFD */
76 __u32 queue_priority; /* to KFD */
Oded Gabbayb7facba2014-07-16 15:55:29 +030077};
78
79/* For kfd_ioctl_set_memory_policy_args.default_policy and alternate_policy */
80#define KFD_IOC_CACHE_POLICY_COHERENT 0
81#define KFD_IOC_CACHE_POLICY_NONCOHERENT 1
82
83struct kfd_ioctl_set_memory_policy_args {
Mikko Rapeli472b46c2017-08-06 18:44:27 +020084 __u64 alternate_aperture_base; /* to KFD */
85 __u64 alternate_aperture_size; /* to KFD */
Oded Gabbayb7facba2014-07-16 15:55:29 +030086
Mikko Rapeli472b46c2017-08-06 18:44:27 +020087 __u32 gpu_id; /* to KFD */
88 __u32 default_policy; /* to KFD */
89 __u32 alternate_policy; /* to KFD */
90 __u32 pad;
Oded Gabbayb7facba2014-07-16 15:55:29 +030091};
92
93/*
94 * All counters are monotonic. They are used for profiling of compute jobs.
95 * The profiling is done by userspace.
96 *
97 * In case of GPU reset, the counter should not be affected.
98 */
99
100struct kfd_ioctl_get_clock_counters_args {
Mikko Rapeli472b46c2017-08-06 18:44:27 +0200101 __u64 gpu_clock_counter; /* from KFD */
102 __u64 cpu_clock_counter; /* from KFD */
103 __u64 system_clock_counter; /* from KFD */
104 __u64 system_clock_freq; /* from KFD */
Oded Gabbayb7facba2014-07-16 15:55:29 +0300105
Mikko Rapeli472b46c2017-08-06 18:44:27 +0200106 __u32 gpu_id; /* to KFD */
107 __u32 pad;
Oded Gabbayb7facba2014-07-16 15:55:29 +0300108};
109
110#define NUM_OF_SUPPORTED_GPUS 7
111
112struct kfd_process_device_apertures {
Mikko Rapeli472b46c2017-08-06 18:44:27 +0200113 __u64 lds_base; /* from KFD */
114 __u64 lds_limit; /* from KFD */
115 __u64 scratch_base; /* from KFD */
116 __u64 scratch_limit; /* from KFD */
117 __u64 gpuvm_base; /* from KFD */
118 __u64 gpuvm_limit; /* from KFD */
119 __u32 gpu_id; /* from KFD */
120 __u32 pad;
Oded Gabbayb7facba2014-07-16 15:55:29 +0300121};
122
123struct kfd_ioctl_get_process_apertures_args {
124 struct kfd_process_device_apertures
125 process_apertures[NUM_OF_SUPPORTED_GPUS];/* from KFD */
126
127 /* from KFD, should be in the range [1 - NUM_OF_SUPPORTED_GPUS] */
Mikko Rapeli472b46c2017-08-06 18:44:27 +0200128 __u32 num_of_nodes;
129 __u32 pad;
Oded Gabbayb7facba2014-07-16 15:55:29 +0300130};
131
Yair Shacharaef11002014-12-07 17:05:22 +0200132#define MAX_ALLOWED_NUM_POINTS 100
133#define MAX_ALLOWED_AW_BUFF_SIZE 4096
134#define MAX_ALLOWED_WAC_BUFF_SIZE 128
135
136struct kfd_ioctl_dbg_register_args {
Mikko Rapeli472b46c2017-08-06 18:44:27 +0200137 __u32 gpu_id; /* to KFD */
138 __u32 pad;
Yair Shacharaef11002014-12-07 17:05:22 +0200139};
140
141struct kfd_ioctl_dbg_unregister_args {
Mikko Rapeli472b46c2017-08-06 18:44:27 +0200142 __u32 gpu_id; /* to KFD */
143 __u32 pad;
Yair Shacharaef11002014-12-07 17:05:22 +0200144};
145
146struct kfd_ioctl_dbg_address_watch_args {
Mikko Rapeli472b46c2017-08-06 18:44:27 +0200147 __u64 content_ptr; /* a pointer to the actual content */
148 __u32 gpu_id; /* to KFD */
149 __u32 buf_size_in_bytes; /*including gpu_id and buf_size */
Yair Shacharaef11002014-12-07 17:05:22 +0200150};
151
152struct kfd_ioctl_dbg_wave_control_args {
Mikko Rapeli472b46c2017-08-06 18:44:27 +0200153 __u64 content_ptr; /* a pointer to the actual content */
154 __u32 gpu_id; /* to KFD */
155 __u32 buf_size_in_bytes; /*including gpu_id and buf_size */
Yair Shacharaef11002014-12-07 17:05:22 +0200156};
157
Andrew Lewycky29a5d3e2014-12-07 17:05:11 +0200158/* Matching HSA_EVENTTYPE */
159#define KFD_IOC_EVENT_SIGNAL 0
160#define KFD_IOC_EVENT_NODECHANGE 1
161#define KFD_IOC_EVENT_DEVICESTATECHANGE 2
162#define KFD_IOC_EVENT_HW_EXCEPTION 3
163#define KFD_IOC_EVENT_SYSTEM_EVENT 4
164#define KFD_IOC_EVENT_DEBUG_EVENT 5
165#define KFD_IOC_EVENT_PROFILE_EVENT 6
166#define KFD_IOC_EVENT_QUEUE_EVENT 7
167#define KFD_IOC_EVENT_MEMORY 8
168
169#define KFD_IOC_WAIT_RESULT_COMPLETE 0
170#define KFD_IOC_WAIT_RESULT_TIMEOUT 1
171#define KFD_IOC_WAIT_RESULT_FAIL 2
172
Oded Gabbay7e86a3652017-10-27 19:35:30 -0400173#define KFD_SIGNAL_EVENT_LIMIT 4096
Andrew Lewycky29a5d3e2014-12-07 17:05:11 +0200174
175struct kfd_ioctl_create_event_args {
Mikko Rapeli472b46c2017-08-06 18:44:27 +0200176 __u64 event_page_offset; /* from KFD */
177 __u32 event_trigger_data; /* from KFD - signal events only */
178 __u32 event_type; /* to KFD */
179 __u32 auto_reset; /* to KFD */
180 __u32 node_id; /* to KFD - only valid for certain
Andrew Lewycky29a5d3e2014-12-07 17:05:11 +0200181 event types */
Mikko Rapeli472b46c2017-08-06 18:44:27 +0200182 __u32 event_id; /* from KFD */
183 __u32 event_slot_index; /* from KFD */
Andrew Lewycky29a5d3e2014-12-07 17:05:11 +0200184};
185
186struct kfd_ioctl_destroy_event_args {
Mikko Rapeli472b46c2017-08-06 18:44:27 +0200187 __u32 event_id; /* to KFD */
188 __u32 pad;
Andrew Lewycky29a5d3e2014-12-07 17:05:11 +0200189};
190
191struct kfd_ioctl_set_event_args {
Mikko Rapeli472b46c2017-08-06 18:44:27 +0200192 __u32 event_id; /* to KFD */
193 __u32 pad;
Andrew Lewycky29a5d3e2014-12-07 17:05:11 +0200194};
195
196struct kfd_ioctl_reset_event_args {
Mikko Rapeli472b46c2017-08-06 18:44:27 +0200197 __u32 event_id; /* to KFD */
198 __u32 pad;
Andrew Lewycky29a5d3e2014-12-07 17:05:11 +0200199};
200
201struct kfd_memory_exception_failure {
Mikko Rapeli472b46c2017-08-06 18:44:27 +0200202 __u32 NotPresent; /* Page not present or supervisor privilege */
203 __u32 ReadOnly; /* Write access to a read-only page */
204 __u32 NoExecute; /* Execute access to a page marked NX */
205 __u32 pad;
Andrew Lewycky29a5d3e2014-12-07 17:05:11 +0200206};
207
208/* memory exception data*/
209struct kfd_hsa_memory_exception_data {
210 struct kfd_memory_exception_failure failure;
Mikko Rapeli472b46c2017-08-06 18:44:27 +0200211 __u64 va;
212 __u32 gpu_id;
213 __u32 pad;
Andrew Lewycky29a5d3e2014-12-07 17:05:11 +0200214};
215
216/* Event data*/
217struct kfd_event_data {
218 union {
219 struct kfd_hsa_memory_exception_data memory_exception_data;
220 }; /* From KFD */
Mikko Rapeli472b46c2017-08-06 18:44:27 +0200221 __u64 kfd_event_data_ext; /* pointer to an extension structure
Andrew Lewycky29a5d3e2014-12-07 17:05:11 +0200222 for future exception types */
Mikko Rapeli472b46c2017-08-06 18:44:27 +0200223 __u32 event_id; /* to KFD */
224 __u32 pad;
Andrew Lewycky29a5d3e2014-12-07 17:05:11 +0200225};
226
227struct kfd_ioctl_wait_events_args {
Mikko Rapeli472b46c2017-08-06 18:44:27 +0200228 __u64 events_ptr; /* pointed to struct
Yair Shacharaef11002014-12-07 17:05:22 +0200229 kfd_event_data array, to KFD */
Mikko Rapeli472b46c2017-08-06 18:44:27 +0200230 __u32 num_events; /* to KFD */
231 __u32 wait_for_all; /* to KFD */
232 __u32 timeout; /* to KFD */
233 __u32 wait_result; /* from KFD */
Andrew Lewycky29a5d3e2014-12-07 17:05:11 +0200234};
235
Moses Reuben6a1c9512017-08-15 23:00:20 -0400236struct kfd_ioctl_set_scratch_backing_va_args {
Dmitry V. Levinb4d08522017-11-13 03:35:27 +0300237 __u64 va_addr; /* to KFD */
238 __u32 gpu_id; /* to KFD */
239 __u32 pad;
Moses Reuben6a1c9512017-08-15 23:00:20 -0400240};
241
Yong Zhao5d71dbc2017-08-15 23:00:22 -0400242struct kfd_ioctl_get_tile_config_args {
243 /* to KFD: pointer to tile array */
Dmitry V. Levinb4d08522017-11-13 03:35:27 +0300244 __u64 tile_config_ptr;
Yong Zhao5d71dbc2017-08-15 23:00:22 -0400245 /* to KFD: pointer to macro tile array */
Dmitry V. Levinb4d08522017-11-13 03:35:27 +0300246 __u64 macro_tile_config_ptr;
Yong Zhao5d71dbc2017-08-15 23:00:22 -0400247 /* to KFD: array size allocated by user mode
248 * from KFD: array size filled by kernel
249 */
Dmitry V. Levinb4d08522017-11-13 03:35:27 +0300250 __u32 num_tile_configs;
Yong Zhao5d71dbc2017-08-15 23:00:22 -0400251 /* to KFD: array size allocated by user mode
252 * from KFD: array size filled by kernel
253 */
Dmitry V. Levinb4d08522017-11-13 03:35:27 +0300254 __u32 num_macro_tile_configs;
Yong Zhao5d71dbc2017-08-15 23:00:22 -0400255
Dmitry V. Levinb4d08522017-11-13 03:35:27 +0300256 __u32 gpu_id; /* to KFD */
257 __u32 gb_addr_config; /* from KFD */
258 __u32 num_banks; /* from KFD */
259 __u32 num_ranks; /* from KFD */
Yong Zhao5d71dbc2017-08-15 23:00:22 -0400260 /* struct size can be extended later if needed
261 * without breaking ABI compatibility
262 */
263};
264
Felix Kuehlingd7b9bd22017-11-14 16:41:20 -0500265struct kfd_ioctl_set_trap_handler_args {
266 uint64_t tba_addr; /* to KFD */
267 uint64_t tma_addr; /* to KFD */
268 uint32_t gpu_id; /* to KFD */
269 uint32_t pad;
270};
271
Oded Gabbayb81c55d2014-12-29 15:24:25 +0200272#define AMDKFD_IOCTL_BASE 'K'
273#define AMDKFD_IO(nr) _IO(AMDKFD_IOCTL_BASE, nr)
274#define AMDKFD_IOR(nr, type) _IOR(AMDKFD_IOCTL_BASE, nr, type)
275#define AMDKFD_IOW(nr, type) _IOW(AMDKFD_IOCTL_BASE, nr, type)
276#define AMDKFD_IOWR(nr, type) _IOWR(AMDKFD_IOCTL_BASE, nr, type)
Oded Gabbayb7facba2014-07-16 15:55:29 +0300277
Oded Gabbayb81c55d2014-12-29 15:24:25 +0200278#define AMDKFD_IOC_GET_VERSION \
279 AMDKFD_IOR(0x01, struct kfd_ioctl_get_version_args)
Oded Gabbayb7facba2014-07-16 15:55:29 +0300280
Oded Gabbayb81c55d2014-12-29 15:24:25 +0200281#define AMDKFD_IOC_CREATE_QUEUE \
282 AMDKFD_IOWR(0x02, struct kfd_ioctl_create_queue_args)
Oded Gabbayb7facba2014-07-16 15:55:29 +0300283
Oded Gabbayb81c55d2014-12-29 15:24:25 +0200284#define AMDKFD_IOC_DESTROY_QUEUE \
285 AMDKFD_IOWR(0x03, struct kfd_ioctl_destroy_queue_args)
Oded Gabbayb7facba2014-07-16 15:55:29 +0300286
Oded Gabbayb81c55d2014-12-29 15:24:25 +0200287#define AMDKFD_IOC_SET_MEMORY_POLICY \
288 AMDKFD_IOW(0x04, struct kfd_ioctl_set_memory_policy_args)
Oded Gabbayb7facba2014-07-16 15:55:29 +0300289
Oded Gabbayb81c55d2014-12-29 15:24:25 +0200290#define AMDKFD_IOC_GET_CLOCK_COUNTERS \
291 AMDKFD_IOWR(0x05, struct kfd_ioctl_get_clock_counters_args)
Oded Gabbayb7facba2014-07-16 15:55:29 +0300292
Oded Gabbayb81c55d2014-12-29 15:24:25 +0200293#define AMDKFD_IOC_GET_PROCESS_APERTURES \
294 AMDKFD_IOR(0x06, struct kfd_ioctl_get_process_apertures_args)
Oded Gabbayb7facba2014-07-16 15:55:29 +0300295
Oded Gabbayb81c55d2014-12-29 15:24:25 +0200296#define AMDKFD_IOC_UPDATE_QUEUE \
297 AMDKFD_IOW(0x07, struct kfd_ioctl_update_queue_args)
298
Andrew Lewycky29a5d3e2014-12-07 17:05:11 +0200299#define AMDKFD_IOC_CREATE_EVENT \
300 AMDKFD_IOWR(0x08, struct kfd_ioctl_create_event_args)
301
302#define AMDKFD_IOC_DESTROY_EVENT \
303 AMDKFD_IOW(0x09, struct kfd_ioctl_destroy_event_args)
304
305#define AMDKFD_IOC_SET_EVENT \
306 AMDKFD_IOW(0x0A, struct kfd_ioctl_set_event_args)
307
308#define AMDKFD_IOC_RESET_EVENT \
309 AMDKFD_IOW(0x0B, struct kfd_ioctl_reset_event_args)
310
311#define AMDKFD_IOC_WAIT_EVENTS \
312 AMDKFD_IOWR(0x0C, struct kfd_ioctl_wait_events_args)
313
Yair Shacharaef11002014-12-07 17:05:22 +0200314#define AMDKFD_IOC_DBG_REGISTER \
315 AMDKFD_IOW(0x0D, struct kfd_ioctl_dbg_register_args)
316
317#define AMDKFD_IOC_DBG_UNREGISTER \
318 AMDKFD_IOW(0x0E, struct kfd_ioctl_dbg_unregister_args)
319
320#define AMDKFD_IOC_DBG_ADDRESS_WATCH \
321 AMDKFD_IOW(0x0F, struct kfd_ioctl_dbg_address_watch_args)
322
323#define AMDKFD_IOC_DBG_WAVE_CONTROL \
324 AMDKFD_IOW(0x10, struct kfd_ioctl_dbg_wave_control_args)
325
Moses Reuben6a1c9512017-08-15 23:00:20 -0400326#define AMDKFD_IOC_SET_SCRATCH_BACKING_VA \
327 AMDKFD_IOWR(0x11, struct kfd_ioctl_set_scratch_backing_va_args)
328
Yong Zhao5d71dbc2017-08-15 23:00:22 -0400329#define AMDKFD_IOC_GET_TILE_CONFIG \
330 AMDKFD_IOWR(0x12, struct kfd_ioctl_get_tile_config_args)
331
Felix Kuehlingd7b9bd22017-11-14 16:41:20 -0500332#define AMDKFD_IOC_SET_TRAP_HANDLER \
333 AMDKFD_IOW(0x13, struct kfd_ioctl_set_trap_handler_args)
334
Oded Gabbayb81c55d2014-12-29 15:24:25 +0200335#define AMDKFD_COMMAND_START 0x01
Felix Kuehlingd7b9bd22017-11-14 16:41:20 -0500336#define AMDKFD_COMMAND_END 0x14
Oded Gabbayb7facba2014-07-16 15:55:29 +0300337
338#endif