mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-21 08:46:49 +07:00
c7bcbfa4f8
Currently the number of GPUs is limited by aperture placement options available on GFX7 and GFX8 hardware. This limitation is not necessary. Scratch and LDS represent per-work-item and per-work-group storage respectively. Different work-items and work-groups use the same virtual address to access their own data. Work running on different GPUs is by definition in different work-groups (different dispatches, in fact). That means the same virtual addresses can be used for these apertures on different GPUs. Add a new AMDKFD_IOC_GET_PROCESS_APERTURES_NEW ioctl that removes the artificial limitation on the number of GPUs that can be supported. The new ioctl allows user mode to query the number of GPUs to allocate enough memory for all GPUs to be reported. This deprecates AMDKFD_IOC_GET_PROCESS_APERTURES. Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com> Acked-by: Christian König <christian.koenig@amd.com> Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
360 lines
10 KiB
C
360 lines
10 KiB
C
/*
|
|
* Copyright 2014 Advanced Micro Devices, Inc.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
* to deal in the Software without restriction, including without limitation
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
* OTHER DEALINGS IN THE SOFTWARE.
|
|
*/
|
|
|
|
#ifndef KFD_IOCTL_H_INCLUDED
|
|
#define KFD_IOCTL_H_INCLUDED
|
|
|
|
#include <drm/drm.h>
|
|
#include <linux/ioctl.h>
|
|
|
|
#define KFD_IOCTL_MAJOR_VERSION 1
|
|
#define KFD_IOCTL_MINOR_VERSION 1
|
|
|
|
struct kfd_ioctl_get_version_args {
|
|
__u32 major_version; /* from KFD */
|
|
__u32 minor_version; /* from KFD */
|
|
};
|
|
|
|
/* For kfd_ioctl_create_queue_args.queue_type. */
|
|
#define KFD_IOC_QUEUE_TYPE_COMPUTE 0
|
|
#define KFD_IOC_QUEUE_TYPE_SDMA 1
|
|
#define KFD_IOC_QUEUE_TYPE_COMPUTE_AQL 2
|
|
|
|
#define KFD_MAX_QUEUE_PERCENTAGE 100
|
|
#define KFD_MAX_QUEUE_PRIORITY 15
|
|
|
|
struct kfd_ioctl_create_queue_args {
|
|
__u64 ring_base_address; /* to KFD */
|
|
__u64 write_pointer_address; /* from KFD */
|
|
__u64 read_pointer_address; /* from KFD */
|
|
__u64 doorbell_offset; /* from KFD */
|
|
|
|
__u32 ring_size; /* to KFD */
|
|
__u32 gpu_id; /* to KFD */
|
|
__u32 queue_type; /* to KFD */
|
|
__u32 queue_percentage; /* to KFD */
|
|
__u32 queue_priority; /* to KFD */
|
|
__u32 queue_id; /* from KFD */
|
|
|
|
__u64 eop_buffer_address; /* to KFD */
|
|
__u64 eop_buffer_size; /* to KFD */
|
|
__u64 ctx_save_restore_address; /* to KFD */
|
|
__u32 ctx_save_restore_size; /* to KFD */
|
|
__u32 ctl_stack_size; /* to KFD */
|
|
};
|
|
|
|
struct kfd_ioctl_destroy_queue_args {
|
|
__u32 queue_id; /* to KFD */
|
|
__u32 pad;
|
|
};
|
|
|
|
struct kfd_ioctl_update_queue_args {
|
|
__u64 ring_base_address; /* to KFD */
|
|
|
|
__u32 queue_id; /* to KFD */
|
|
__u32 ring_size; /* to KFD */
|
|
__u32 queue_percentage; /* to KFD */
|
|
__u32 queue_priority; /* to KFD */
|
|
};
|
|
|
|
/* For kfd_ioctl_set_memory_policy_args.default_policy and alternate_policy */
|
|
#define KFD_IOC_CACHE_POLICY_COHERENT 0
|
|
#define KFD_IOC_CACHE_POLICY_NONCOHERENT 1
|
|
|
|
struct kfd_ioctl_set_memory_policy_args {
|
|
__u64 alternate_aperture_base; /* to KFD */
|
|
__u64 alternate_aperture_size; /* to KFD */
|
|
|
|
__u32 gpu_id; /* to KFD */
|
|
__u32 default_policy; /* to KFD */
|
|
__u32 alternate_policy; /* to KFD */
|
|
__u32 pad;
|
|
};
|
|
|
|
/*
|
|
* All counters are monotonic. They are used for profiling of compute jobs.
|
|
* The profiling is done by userspace.
|
|
*
|
|
* In case of GPU reset, the counter should not be affected.
|
|
*/
|
|
|
|
struct kfd_ioctl_get_clock_counters_args {
|
|
__u64 gpu_clock_counter; /* from KFD */
|
|
__u64 cpu_clock_counter; /* from KFD */
|
|
__u64 system_clock_counter; /* from KFD */
|
|
__u64 system_clock_freq; /* from KFD */
|
|
|
|
__u32 gpu_id; /* to KFD */
|
|
__u32 pad;
|
|
};
|
|
|
|
struct kfd_process_device_apertures {
|
|
__u64 lds_base; /* from KFD */
|
|
__u64 lds_limit; /* from KFD */
|
|
__u64 scratch_base; /* from KFD */
|
|
__u64 scratch_limit; /* from KFD */
|
|
__u64 gpuvm_base; /* from KFD */
|
|
__u64 gpuvm_limit; /* from KFD */
|
|
__u32 gpu_id; /* from KFD */
|
|
__u32 pad;
|
|
};
|
|
|
|
/*
|
|
* AMDKFD_IOC_GET_PROCESS_APERTURES is deprecated. Use
|
|
* AMDKFD_IOC_GET_PROCESS_APERTURES_NEW instead, which supports an
|
|
* unlimited number of GPUs.
|
|
*/
|
|
#define NUM_OF_SUPPORTED_GPUS 7
|
|
struct kfd_ioctl_get_process_apertures_args {
|
|
struct kfd_process_device_apertures
|
|
process_apertures[NUM_OF_SUPPORTED_GPUS];/* from KFD */
|
|
|
|
/* from KFD, should be in the range [1 - NUM_OF_SUPPORTED_GPUS] */
|
|
__u32 num_of_nodes;
|
|
__u32 pad;
|
|
};
|
|
|
|
struct kfd_ioctl_get_process_apertures_new_args {
|
|
/* User allocated. Pointer to struct kfd_process_device_apertures
|
|
* filled in by Kernel
|
|
*/
|
|
__u64 kfd_process_device_apertures_ptr;
|
|
/* to KFD - indicates amount of memory present in
|
|
* kfd_process_device_apertures_ptr
|
|
* from KFD - Number of entries filled by KFD.
|
|
*/
|
|
__u32 num_of_nodes;
|
|
__u32 pad;
|
|
};
|
|
|
|
#define MAX_ALLOWED_NUM_POINTS 100
|
|
#define MAX_ALLOWED_AW_BUFF_SIZE 4096
|
|
#define MAX_ALLOWED_WAC_BUFF_SIZE 128
|
|
|
|
struct kfd_ioctl_dbg_register_args {
|
|
__u32 gpu_id; /* to KFD */
|
|
__u32 pad;
|
|
};
|
|
|
|
struct kfd_ioctl_dbg_unregister_args {
|
|
__u32 gpu_id; /* to KFD */
|
|
__u32 pad;
|
|
};
|
|
|
|
struct kfd_ioctl_dbg_address_watch_args {
|
|
__u64 content_ptr; /* a pointer to the actual content */
|
|
__u32 gpu_id; /* to KFD */
|
|
__u32 buf_size_in_bytes; /*including gpu_id and buf_size */
|
|
};
|
|
|
|
struct kfd_ioctl_dbg_wave_control_args {
|
|
__u64 content_ptr; /* a pointer to the actual content */
|
|
__u32 gpu_id; /* to KFD */
|
|
__u32 buf_size_in_bytes; /*including gpu_id and buf_size */
|
|
};
|
|
|
|
/* Matching HSA_EVENTTYPE */
|
|
#define KFD_IOC_EVENT_SIGNAL 0
|
|
#define KFD_IOC_EVENT_NODECHANGE 1
|
|
#define KFD_IOC_EVENT_DEVICESTATECHANGE 2
|
|
#define KFD_IOC_EVENT_HW_EXCEPTION 3
|
|
#define KFD_IOC_EVENT_SYSTEM_EVENT 4
|
|
#define KFD_IOC_EVENT_DEBUG_EVENT 5
|
|
#define KFD_IOC_EVENT_PROFILE_EVENT 6
|
|
#define KFD_IOC_EVENT_QUEUE_EVENT 7
|
|
#define KFD_IOC_EVENT_MEMORY 8
|
|
|
|
#define KFD_IOC_WAIT_RESULT_COMPLETE 0
|
|
#define KFD_IOC_WAIT_RESULT_TIMEOUT 1
|
|
#define KFD_IOC_WAIT_RESULT_FAIL 2
|
|
|
|
#define KFD_SIGNAL_EVENT_LIMIT 4096
|
|
|
|
struct kfd_ioctl_create_event_args {
|
|
__u64 event_page_offset; /* from KFD */
|
|
__u32 event_trigger_data; /* from KFD - signal events only */
|
|
__u32 event_type; /* to KFD */
|
|
__u32 auto_reset; /* to KFD */
|
|
__u32 node_id; /* to KFD - only valid for certain
|
|
event types */
|
|
__u32 event_id; /* from KFD */
|
|
__u32 event_slot_index; /* from KFD */
|
|
};
|
|
|
|
struct kfd_ioctl_destroy_event_args {
|
|
__u32 event_id; /* to KFD */
|
|
__u32 pad;
|
|
};
|
|
|
|
struct kfd_ioctl_set_event_args {
|
|
__u32 event_id; /* to KFD */
|
|
__u32 pad;
|
|
};
|
|
|
|
struct kfd_ioctl_reset_event_args {
|
|
__u32 event_id; /* to KFD */
|
|
__u32 pad;
|
|
};
|
|
|
|
struct kfd_memory_exception_failure {
|
|
__u32 NotPresent; /* Page not present or supervisor privilege */
|
|
__u32 ReadOnly; /* Write access to a read-only page */
|
|
__u32 NoExecute; /* Execute access to a page marked NX */
|
|
__u32 pad;
|
|
};
|
|
|
|
/* memory exception data*/
|
|
struct kfd_hsa_memory_exception_data {
|
|
struct kfd_memory_exception_failure failure;
|
|
__u64 va;
|
|
__u32 gpu_id;
|
|
__u32 pad;
|
|
};
|
|
|
|
/* Event data*/
|
|
struct kfd_event_data {
|
|
union {
|
|
struct kfd_hsa_memory_exception_data memory_exception_data;
|
|
}; /* From KFD */
|
|
__u64 kfd_event_data_ext; /* pointer to an extension structure
|
|
for future exception types */
|
|
__u32 event_id; /* to KFD */
|
|
__u32 pad;
|
|
};
|
|
|
|
struct kfd_ioctl_wait_events_args {
|
|
__u64 events_ptr; /* pointed to struct
|
|
kfd_event_data array, to KFD */
|
|
__u32 num_events; /* to KFD */
|
|
__u32 wait_for_all; /* to KFD */
|
|
__u32 timeout; /* to KFD */
|
|
__u32 wait_result; /* from KFD */
|
|
};
|
|
|
|
struct kfd_ioctl_set_scratch_backing_va_args {
|
|
__u64 va_addr; /* to KFD */
|
|
__u32 gpu_id; /* to KFD */
|
|
__u32 pad;
|
|
};
|
|
|
|
struct kfd_ioctl_get_tile_config_args {
|
|
/* to KFD: pointer to tile array */
|
|
__u64 tile_config_ptr;
|
|
/* to KFD: pointer to macro tile array */
|
|
__u64 macro_tile_config_ptr;
|
|
/* to KFD: array size allocated by user mode
|
|
* from KFD: array size filled by kernel
|
|
*/
|
|
__u32 num_tile_configs;
|
|
/* to KFD: array size allocated by user mode
|
|
* from KFD: array size filled by kernel
|
|
*/
|
|
__u32 num_macro_tile_configs;
|
|
|
|
__u32 gpu_id; /* to KFD */
|
|
__u32 gb_addr_config; /* from KFD */
|
|
__u32 num_banks; /* from KFD */
|
|
__u32 num_ranks; /* from KFD */
|
|
/* struct size can be extended later if needed
|
|
* without breaking ABI compatibility
|
|
*/
|
|
};
|
|
|
|
struct kfd_ioctl_set_trap_handler_args {
|
|
__u64 tba_addr; /* to KFD */
|
|
__u64 tma_addr; /* to KFD */
|
|
__u32 gpu_id; /* to KFD */
|
|
__u32 pad;
|
|
};
|
|
|
|
#define AMDKFD_IOCTL_BASE 'K'
|
|
#define AMDKFD_IO(nr) _IO(AMDKFD_IOCTL_BASE, nr)
|
|
#define AMDKFD_IOR(nr, type) _IOR(AMDKFD_IOCTL_BASE, nr, type)
|
|
#define AMDKFD_IOW(nr, type) _IOW(AMDKFD_IOCTL_BASE, nr, type)
|
|
#define AMDKFD_IOWR(nr, type) _IOWR(AMDKFD_IOCTL_BASE, nr, type)
|
|
|
|
#define AMDKFD_IOC_GET_VERSION \
|
|
AMDKFD_IOR(0x01, struct kfd_ioctl_get_version_args)
|
|
|
|
#define AMDKFD_IOC_CREATE_QUEUE \
|
|
AMDKFD_IOWR(0x02, struct kfd_ioctl_create_queue_args)
|
|
|
|
#define AMDKFD_IOC_DESTROY_QUEUE \
|
|
AMDKFD_IOWR(0x03, struct kfd_ioctl_destroy_queue_args)
|
|
|
|
#define AMDKFD_IOC_SET_MEMORY_POLICY \
|
|
AMDKFD_IOW(0x04, struct kfd_ioctl_set_memory_policy_args)
|
|
|
|
#define AMDKFD_IOC_GET_CLOCK_COUNTERS \
|
|
AMDKFD_IOWR(0x05, struct kfd_ioctl_get_clock_counters_args)
|
|
|
|
#define AMDKFD_IOC_GET_PROCESS_APERTURES \
|
|
AMDKFD_IOR(0x06, struct kfd_ioctl_get_process_apertures_args)
|
|
|
|
#define AMDKFD_IOC_UPDATE_QUEUE \
|
|
AMDKFD_IOW(0x07, struct kfd_ioctl_update_queue_args)
|
|
|
|
#define AMDKFD_IOC_CREATE_EVENT \
|
|
AMDKFD_IOWR(0x08, struct kfd_ioctl_create_event_args)
|
|
|
|
#define AMDKFD_IOC_DESTROY_EVENT \
|
|
AMDKFD_IOW(0x09, struct kfd_ioctl_destroy_event_args)
|
|
|
|
#define AMDKFD_IOC_SET_EVENT \
|
|
AMDKFD_IOW(0x0A, struct kfd_ioctl_set_event_args)
|
|
|
|
#define AMDKFD_IOC_RESET_EVENT \
|
|
AMDKFD_IOW(0x0B, struct kfd_ioctl_reset_event_args)
|
|
|
|
#define AMDKFD_IOC_WAIT_EVENTS \
|
|
AMDKFD_IOWR(0x0C, struct kfd_ioctl_wait_events_args)
|
|
|
|
#define AMDKFD_IOC_DBG_REGISTER \
|
|
AMDKFD_IOW(0x0D, struct kfd_ioctl_dbg_register_args)
|
|
|
|
#define AMDKFD_IOC_DBG_UNREGISTER \
|
|
AMDKFD_IOW(0x0E, struct kfd_ioctl_dbg_unregister_args)
|
|
|
|
#define AMDKFD_IOC_DBG_ADDRESS_WATCH \
|
|
AMDKFD_IOW(0x0F, struct kfd_ioctl_dbg_address_watch_args)
|
|
|
|
#define AMDKFD_IOC_DBG_WAVE_CONTROL \
|
|
AMDKFD_IOW(0x10, struct kfd_ioctl_dbg_wave_control_args)
|
|
|
|
#define AMDKFD_IOC_SET_SCRATCH_BACKING_VA \
|
|
AMDKFD_IOWR(0x11, struct kfd_ioctl_set_scratch_backing_va_args)
|
|
|
|
#define AMDKFD_IOC_GET_TILE_CONFIG \
|
|
AMDKFD_IOWR(0x12, struct kfd_ioctl_get_tile_config_args)
|
|
|
|
#define AMDKFD_IOC_SET_TRAP_HANDLER \
|
|
AMDKFD_IOW(0x13, struct kfd_ioctl_set_trap_handler_args)
|
|
|
|
#define AMDKFD_IOC_GET_PROCESS_APERTURES_NEW \
|
|
AMDKFD_IOWR(0x14, \
|
|
struct kfd_ioctl_get_process_apertures_new_args)
|
|
|
|
#define AMDKFD_COMMAND_START 0x01
|
|
#define AMDKFD_COMMAND_END 0x15
|
|
|
|
#endif
|