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

drm/amdkfd: add events IOCTL set definitions

- AMDKFD_IOC_CREATE_EVENT:
Creates a new event of a specified type

- AMDKFD_IOC_DESTROY_EVENT:
Destroys an existing event

- AMDKFD_IOC_SET_EVENT:
Signal an existing event

- AMDKFD_IOC_RESET_EVENT:
Reset an existing event

- AMDKFD_IOC_WAIT_EVENTS:
Wait on event(s) until they are signaled

v2:

- Move the limit of the signal events to kfd_ioctl.h so it
can be used by userspace

v3:
- Change all bool fields in struct kfd_memory_exception_failure
to uint32_t

Signed-off-by: Andrew Lewycky <Andrew.Lewycky@amd.com>
Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>

authored by

Andrew Lewycky and committed by
Oded Gabbay
29a5d3eb 2249d558

+139 -2
+45
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
··· 514 514 return 0; 515 515 } 516 516 517 + static int kfd_ioctl_create_event(struct file *filp, struct kfd_process *p, 518 + void *data) 519 + { 520 + return -ENODEV; 521 + } 522 + 523 + static int kfd_ioctl_destroy_event(struct file *filp, struct kfd_process *p, 524 + void *data) 525 + { 526 + return -ENODEV; 527 + } 528 + 529 + static int kfd_ioctl_set_event(struct file *filp, struct kfd_process *p, 530 + void *data) 531 + { 532 + return -ENODEV; 533 + } 534 + 535 + static int kfd_ioctl_reset_event(struct file *filp, struct kfd_process *p, 536 + void *data) 537 + { 538 + return -ENODEV; 539 + } 540 + 541 + static int kfd_ioctl_wait_events(struct file *filp, struct kfd_process *p, 542 + void *data) 543 + { 544 + return -ENODEV; 545 + } 546 + 517 547 #define AMDKFD_IOCTL_DEF(ioctl, _func, _flags) \ 518 548 [_IOC_NR(ioctl)] = {.cmd = ioctl, .func = _func, .flags = _flags, .cmd_drv = 0, .name = #ioctl} 519 549 ··· 569 539 570 540 AMDKFD_IOCTL_DEF(AMDKFD_IOC_UPDATE_QUEUE, 571 541 kfd_ioctl_update_queue, 0), 542 + 543 + AMDKFD_IOCTL_DEF(AMDKFD_IOC_CREATE_EVENT, 544 + kfd_ioctl_create_event, 0), 545 + 546 + AMDKFD_IOCTL_DEF(AMDKFD_IOC_DESTROY_EVENT, 547 + kfd_ioctl_destroy_event, 0), 548 + 549 + AMDKFD_IOCTL_DEF(AMDKFD_IOC_SET_EVENT, 550 + kfd_ioctl_set_event, 0), 551 + 552 + AMDKFD_IOCTL_DEF(AMDKFD_IOC_RESET_EVENT, 553 + kfd_ioctl_reset_event, 0), 554 + 555 + AMDKFD_IOCTL_DEF(AMDKFD_IOC_WAIT_EVENTS, 556 + kfd_ioctl_wait_events, 0), 572 557 }; 573 558 574 559 #define AMDKFD_CORE_IOCTL_COUNT ARRAY_SIZE(amdkfd_ioctls)
+94 -2
include/uapi/linux/kfd_ioctl.h
··· 27 27 #include <linux/ioctl.h> 28 28 29 29 #define KFD_IOCTL_MAJOR_VERSION 1 30 - #define KFD_IOCTL_MINOR_VERSION 0 30 + #define KFD_IOCTL_MINOR_VERSION 1 31 31 32 32 struct kfd_ioctl_get_version_args { 33 33 uint32_t major_version; /* from KFD */ ··· 128 128 uint32_t pad; 129 129 }; 130 130 131 + /* Matching HSA_EVENTTYPE */ 132 + #define KFD_IOC_EVENT_SIGNAL 0 133 + #define KFD_IOC_EVENT_NODECHANGE 1 134 + #define KFD_IOC_EVENT_DEVICESTATECHANGE 2 135 + #define KFD_IOC_EVENT_HW_EXCEPTION 3 136 + #define KFD_IOC_EVENT_SYSTEM_EVENT 4 137 + #define KFD_IOC_EVENT_DEBUG_EVENT 5 138 + #define KFD_IOC_EVENT_PROFILE_EVENT 6 139 + #define KFD_IOC_EVENT_QUEUE_EVENT 7 140 + #define KFD_IOC_EVENT_MEMORY 8 141 + 142 + #define KFD_IOC_WAIT_RESULT_COMPLETE 0 143 + #define KFD_IOC_WAIT_RESULT_TIMEOUT 1 144 + #define KFD_IOC_WAIT_RESULT_FAIL 2 145 + 146 + #define KFD_SIGNAL_EVENT_LIMIT 256 147 + 148 + struct kfd_ioctl_create_event_args { 149 + uint64_t event_page_offset; /* from KFD */ 150 + uint32_t event_trigger_data; /* from KFD - signal events only */ 151 + uint32_t event_type; /* to KFD */ 152 + uint32_t auto_reset; /* to KFD */ 153 + uint32_t node_id; /* to KFD - only valid for certain 154 + event types */ 155 + uint32_t event_id; /* from KFD */ 156 + uint32_t event_slot_index; /* from KFD */ 157 + }; 158 + 159 + struct kfd_ioctl_destroy_event_args { 160 + uint32_t event_id; /* to KFD */ 161 + uint32_t pad; 162 + }; 163 + 164 + struct kfd_ioctl_set_event_args { 165 + uint32_t event_id; /* to KFD */ 166 + uint32_t pad; 167 + }; 168 + 169 + struct kfd_ioctl_reset_event_args { 170 + uint32_t event_id; /* to KFD */ 171 + uint32_t pad; 172 + }; 173 + 174 + struct kfd_memory_exception_failure { 175 + uint32_t NotPresent; /* Page not present or supervisor privilege */ 176 + uint32_t ReadOnly; /* Write access to a read-only page */ 177 + uint32_t NoExecute; /* Execute access to a page marked NX */ 178 + uint32_t pad; 179 + }; 180 + 181 + /* memory exception data*/ 182 + struct kfd_hsa_memory_exception_data { 183 + struct kfd_memory_exception_failure failure; 184 + uint64_t va; 185 + uint32_t gpu_id; 186 + uint32_t pad; 187 + }; 188 + 189 + /* Event data*/ 190 + struct kfd_event_data { 191 + union { 192 + struct kfd_hsa_memory_exception_data memory_exception_data; 193 + }; /* From KFD */ 194 + uint64_t kfd_event_data_ext; /* pointer to an extension structure 195 + for future exception types */ 196 + uint32_t event_id; /* to KFD */ 197 + uint32_t pad; 198 + }; 199 + 200 + struct kfd_ioctl_wait_events_args { 201 + uint64_t events_ptr; /* to KFD */ 202 + uint32_t num_events; /* to KFD */ 203 + uint32_t wait_for_all; /* to KFD */ 204 + uint32_t timeout; /* to KFD */ 205 + uint32_t wait_result; /* from KFD */ 206 + }; 207 + 131 208 #define AMDKFD_IOCTL_BASE 'K' 132 209 #define AMDKFD_IO(nr) _IO(AMDKFD_IOCTL_BASE, nr) 133 210 #define AMDKFD_IOR(nr, type) _IOR(AMDKFD_IOCTL_BASE, nr, type) ··· 232 155 #define AMDKFD_IOC_UPDATE_QUEUE \ 233 156 AMDKFD_IOW(0x07, struct kfd_ioctl_update_queue_args) 234 157 158 + #define AMDKFD_IOC_CREATE_EVENT \ 159 + AMDKFD_IOWR(0x08, struct kfd_ioctl_create_event_args) 160 + 161 + #define AMDKFD_IOC_DESTROY_EVENT \ 162 + AMDKFD_IOW(0x09, struct kfd_ioctl_destroy_event_args) 163 + 164 + #define AMDKFD_IOC_SET_EVENT \ 165 + AMDKFD_IOW(0x0A, struct kfd_ioctl_set_event_args) 166 + 167 + #define AMDKFD_IOC_RESET_EVENT \ 168 + AMDKFD_IOW(0x0B, struct kfd_ioctl_reset_event_args) 169 + 170 + #define AMDKFD_IOC_WAIT_EVENTS \ 171 + AMDKFD_IOWR(0x0C, struct kfd_ioctl_wait_events_args) 172 + 235 173 #define AMDKFD_COMMAND_START 0x01 236 - #define AMDKFD_COMMAND_END 0x08 174 + #define AMDKFD_COMMAND_END 0x0D 237 175 238 176 #endif