14a488a7aSOded Gabbay /* 24a488a7aSOded Gabbay * Copyright 2014 Advanced Micro Devices, Inc. 34a488a7aSOded Gabbay * 44a488a7aSOded Gabbay * Permission is hereby granted, free of charge, to any person obtaining a 54a488a7aSOded Gabbay * copy of this software and associated documentation files (the "Software"), 64a488a7aSOded Gabbay * to deal in the Software without restriction, including without limitation 74a488a7aSOded Gabbay * the rights to use, copy, modify, merge, publish, distribute, sublicense, 84a488a7aSOded Gabbay * and/or sell copies of the Software, and to permit persons to whom the 94a488a7aSOded Gabbay * Software is furnished to do so, subject to the following conditions: 104a488a7aSOded Gabbay * 114a488a7aSOded Gabbay * The above copyright notice and this permission notice shall be included in 124a488a7aSOded Gabbay * all copies or substantial portions of the Software. 134a488a7aSOded Gabbay * 144a488a7aSOded Gabbay * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 154a488a7aSOded Gabbay * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 164a488a7aSOded Gabbay * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 174a488a7aSOded Gabbay * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 184a488a7aSOded Gabbay * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 194a488a7aSOded Gabbay * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 204a488a7aSOded Gabbay * OTHER DEALINGS IN THE SOFTWARE. 214a488a7aSOded Gabbay */ 224a488a7aSOded Gabbay 234a488a7aSOded Gabbay #ifndef KFD_PRIV_H_INCLUDED 244a488a7aSOded Gabbay #define KFD_PRIV_H_INCLUDED 254a488a7aSOded Gabbay 264a488a7aSOded Gabbay #include <linux/hashtable.h> 274a488a7aSOded Gabbay #include <linux/mmu_notifier.h> 284a488a7aSOded Gabbay #include <linux/mutex.h> 294a488a7aSOded Gabbay #include <linux/types.h> 304a488a7aSOded Gabbay #include <linux/atomic.h> 314a488a7aSOded Gabbay #include <linux/workqueue.h> 324a488a7aSOded Gabbay #include <linux/spinlock.h> 3319f6d2a6SOded Gabbay #include <linux/kfd_ioctl.h> 344a488a7aSOded Gabbay #include <kgd_kfd_interface.h> 354a488a7aSOded Gabbay 365b5c4e40SEvgeny Pinchuk #define KFD_SYSFS_FILE_MODE 0444 375b5c4e40SEvgeny Pinchuk 385b5c4e40SEvgeny Pinchuk /* GPU ID hash width in bits */ 395b5c4e40SEvgeny Pinchuk #define KFD_GPU_ID_HASH_WIDTH 16 405b5c4e40SEvgeny Pinchuk 415b5c4e40SEvgeny Pinchuk /* Macro for allocating structures */ 425b5c4e40SEvgeny Pinchuk #define kfd_alloc_struct(ptr_to_struct) \ 435b5c4e40SEvgeny Pinchuk ((typeof(ptr_to_struct)) kzalloc(sizeof(*ptr_to_struct), GFP_KERNEL)) 445b5c4e40SEvgeny Pinchuk 4519f6d2a6SOded Gabbay /* Kernel module parameter to specify maximum number of supported processes */ 4619f6d2a6SOded Gabbay extern int max_num_of_processes; 4719f6d2a6SOded Gabbay 4819f6d2a6SOded Gabbay #define KFD_MAX_NUM_OF_PROCESSES_DEFAULT 32 4919f6d2a6SOded Gabbay #define KFD_MAX_NUM_OF_PROCESSES 512 5019f6d2a6SOded Gabbay 5119f6d2a6SOded Gabbay /* 5219f6d2a6SOded Gabbay * Kernel module parameter to specify maximum number of supported queues 5319f6d2a6SOded Gabbay * per process 5419f6d2a6SOded Gabbay */ 5519f6d2a6SOded Gabbay extern int max_num_of_queues_per_process; 5619f6d2a6SOded Gabbay 5719f6d2a6SOded Gabbay #define KFD_MAX_NUM_OF_QUEUES_PER_PROCESS_DEFAULT 128 5819f6d2a6SOded Gabbay #define KFD_MAX_NUM_OF_QUEUES_PER_PROCESS 1024 5919f6d2a6SOded Gabbay 604a488a7aSOded Gabbay struct kfd_device_info { 614a488a7aSOded Gabbay unsigned int max_pasid_bits; 624a488a7aSOded Gabbay size_t ih_ring_entry_size; 6319f6d2a6SOded Gabbay uint16_t mqd_size_aligned; 644a488a7aSOded Gabbay }; 654a488a7aSOded Gabbay 664a488a7aSOded Gabbay struct kfd_dev { 674a488a7aSOded Gabbay struct kgd_dev *kgd; 684a488a7aSOded Gabbay 694a488a7aSOded Gabbay const struct kfd_device_info *device_info; 704a488a7aSOded Gabbay struct pci_dev *pdev; 714a488a7aSOded Gabbay 724a488a7aSOded Gabbay unsigned int id; /* topology stub index */ 734a488a7aSOded Gabbay 7419f6d2a6SOded Gabbay phys_addr_t doorbell_base; /* Start of actual doorbells used by 7519f6d2a6SOded Gabbay * KFD. It is aligned for mapping 7619f6d2a6SOded Gabbay * into user mode 7719f6d2a6SOded Gabbay */ 7819f6d2a6SOded Gabbay size_t doorbell_id_offset; /* Doorbell offset (from KFD doorbell 7919f6d2a6SOded Gabbay * to HW doorbell, GFX reserved some 8019f6d2a6SOded Gabbay * at the start) 8119f6d2a6SOded Gabbay */ 8219f6d2a6SOded Gabbay size_t doorbell_process_limit; /* Number of processes we have doorbell 8319f6d2a6SOded Gabbay * space for. 8419f6d2a6SOded Gabbay */ 8519f6d2a6SOded Gabbay u32 __iomem *doorbell_kernel_ptr; /* This is a pointer for a doorbells 8619f6d2a6SOded Gabbay * page used by kernel queue 8719f6d2a6SOded Gabbay */ 8819f6d2a6SOded Gabbay 894a488a7aSOded Gabbay struct kgd2kfd_shared_resources shared_resources; 904a488a7aSOded Gabbay 914a488a7aSOded Gabbay bool init_complete; 924a488a7aSOded Gabbay 934a488a7aSOded Gabbay }; 944a488a7aSOded Gabbay 954a488a7aSOded Gabbay /* KGD2KFD callbacks */ 964a488a7aSOded Gabbay void kgd2kfd_exit(void); 974a488a7aSOded Gabbay struct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd, struct pci_dev *pdev); 984a488a7aSOded Gabbay bool kgd2kfd_device_init(struct kfd_dev *kfd, 994a488a7aSOded Gabbay const struct kgd2kfd_shared_resources *gpu_resources); 1004a488a7aSOded Gabbay void kgd2kfd_device_exit(struct kfd_dev *kfd); 1014a488a7aSOded Gabbay 1024a488a7aSOded Gabbay extern const struct kfd2kgd_calls *kfd2kgd; 1034a488a7aSOded Gabbay 10419f6d2a6SOded Gabbay struct kfd_mem_obj { 10519f6d2a6SOded Gabbay void *bo; 10619f6d2a6SOded Gabbay uint64_t gpu_addr; 10719f6d2a6SOded Gabbay uint32_t *cpu_ptr; 10819f6d2a6SOded Gabbay }; 10919f6d2a6SOded Gabbay 11019f6d2a6SOded Gabbay enum kfd_mempool { 11119f6d2a6SOded Gabbay KFD_MEMPOOL_SYSTEM_CACHEABLE = 1, 11219f6d2a6SOded Gabbay KFD_MEMPOOL_SYSTEM_WRITECOMBINE = 2, 11319f6d2a6SOded Gabbay KFD_MEMPOOL_FRAMEBUFFER = 3, 11419f6d2a6SOded Gabbay }; 11519f6d2a6SOded Gabbay 1164a488a7aSOded Gabbay /* Character device interface */ 1174a488a7aSOded Gabbay int kfd_chardev_init(void); 1184a488a7aSOded Gabbay void kfd_chardev_exit(void); 1194a488a7aSOded Gabbay struct device *kfd_chardev(void); 1204a488a7aSOded Gabbay 12119f6d2a6SOded Gabbay 1226e99df57SBen Goz enum kfd_preempt_type { 1236e99df57SBen Goz KFD_PREEMPT_TYPE_WAVEFRONT, 1246e99df57SBen Goz KFD_PREEMPT_TYPE_WAVEFRONT_RESET 1256e99df57SBen Goz }; 1266e99df57SBen Goz 127ed8aab45SBen Goz /** 128ed8aab45SBen Goz * enum kfd_queue_type 129ed8aab45SBen Goz * 130ed8aab45SBen Goz * @KFD_QUEUE_TYPE_COMPUTE: Regular user mode queue type. 131ed8aab45SBen Goz * 132ed8aab45SBen Goz * @KFD_QUEUE_TYPE_SDMA: Sdma user mode queue type. 133ed8aab45SBen Goz * 134ed8aab45SBen Goz * @KFD_QUEUE_TYPE_HIQ: HIQ queue type. 135ed8aab45SBen Goz * 136ed8aab45SBen Goz * @KFD_QUEUE_TYPE_DIQ: DIQ queue type. 137ed8aab45SBen Goz */ 138ed8aab45SBen Goz enum kfd_queue_type { 139ed8aab45SBen Goz KFD_QUEUE_TYPE_COMPUTE, 140ed8aab45SBen Goz KFD_QUEUE_TYPE_SDMA, 141ed8aab45SBen Goz KFD_QUEUE_TYPE_HIQ, 142ed8aab45SBen Goz KFD_QUEUE_TYPE_DIQ 143ed8aab45SBen Goz }; 144ed8aab45SBen Goz 1456e99df57SBen Goz enum kfd_queue_format { 1466e99df57SBen Goz KFD_QUEUE_FORMAT_PM4, 1476e99df57SBen Goz KFD_QUEUE_FORMAT_AQL 1486e99df57SBen Goz }; 1496e99df57SBen Goz 150ed8aab45SBen Goz /** 151ed8aab45SBen Goz * struct queue_properties 152ed8aab45SBen Goz * 153ed8aab45SBen Goz * @type: The queue type. 154ed8aab45SBen Goz * 155ed8aab45SBen Goz * @queue_id: Queue identifier. 156ed8aab45SBen Goz * 157ed8aab45SBen Goz * @queue_address: Queue ring buffer address. 158ed8aab45SBen Goz * 159ed8aab45SBen Goz * @queue_size: Queue ring buffer size. 160ed8aab45SBen Goz * 161ed8aab45SBen Goz * @priority: Defines the queue priority relative to other queues in the 162ed8aab45SBen Goz * process. 163ed8aab45SBen Goz * This is just an indication and HW scheduling may override the priority as 164ed8aab45SBen Goz * necessary while keeping the relative prioritization. 165ed8aab45SBen Goz * the priority granularity is from 0 to f which f is the highest priority. 166ed8aab45SBen Goz * currently all queues are initialized with the highest priority. 167ed8aab45SBen Goz * 168ed8aab45SBen Goz * @queue_percent: This field is partially implemented and currently a zero in 169ed8aab45SBen Goz * this field defines that the queue is non active. 170ed8aab45SBen Goz * 171ed8aab45SBen Goz * @read_ptr: User space address which points to the number of dwords the 172ed8aab45SBen Goz * cp read from the ring buffer. This field updates automatically by the H/W. 173ed8aab45SBen Goz * 174ed8aab45SBen Goz * @write_ptr: Defines the number of dwords written to the ring buffer. 175ed8aab45SBen Goz * 176ed8aab45SBen Goz * @doorbell_ptr: This field aim is to notify the H/W of new packet written to 177ed8aab45SBen Goz * the queue ring buffer. This field should be similar to write_ptr and the user 178ed8aab45SBen Goz * should update this field after he updated the write_ptr. 179ed8aab45SBen Goz * 180ed8aab45SBen Goz * @doorbell_off: The doorbell offset in the doorbell pci-bar. 181ed8aab45SBen Goz * 182ed8aab45SBen Goz * @is_interop: Defines if this is a interop queue. Interop queue means that the 183ed8aab45SBen Goz * queue can access both graphics and compute resources. 184ed8aab45SBen Goz * 185ed8aab45SBen Goz * @is_active: Defines if the queue is active or not. 186ed8aab45SBen Goz * 187ed8aab45SBen Goz * @vmid: If the scheduling mode is no cp scheduling the field defines the vmid 188ed8aab45SBen Goz * of the queue. 189ed8aab45SBen Goz * 190ed8aab45SBen Goz * This structure represents the queue properties for each queue no matter if 191ed8aab45SBen Goz * it's user mode or kernel mode queue. 192ed8aab45SBen Goz * 193ed8aab45SBen Goz */ 194ed8aab45SBen Goz struct queue_properties { 195ed8aab45SBen Goz enum kfd_queue_type type; 1966e99df57SBen Goz enum kfd_queue_format format; 197ed8aab45SBen Goz unsigned int queue_id; 198ed8aab45SBen Goz uint64_t queue_address; 199ed8aab45SBen Goz uint64_t queue_size; 200ed8aab45SBen Goz uint32_t priority; 201ed8aab45SBen Goz uint32_t queue_percent; 202ed8aab45SBen Goz uint32_t *read_ptr; 203ed8aab45SBen Goz uint32_t *write_ptr; 204ed8aab45SBen Goz uint32_t *doorbell_ptr; 205ed8aab45SBen Goz uint32_t doorbell_off; 206ed8aab45SBen Goz bool is_interop; 207ed8aab45SBen Goz bool is_active; 208ed8aab45SBen Goz /* Not relevant for user mode queues in cp scheduling */ 209ed8aab45SBen Goz unsigned int vmid; 210ed8aab45SBen Goz }; 211ed8aab45SBen Goz 212ed8aab45SBen Goz /** 213ed8aab45SBen Goz * struct queue 214ed8aab45SBen Goz * 215ed8aab45SBen Goz * @list: Queue linked list. 216ed8aab45SBen Goz * 217ed8aab45SBen Goz * @mqd: The queue MQD. 218ed8aab45SBen Goz * 219ed8aab45SBen Goz * @mqd_mem_obj: The MQD local gpu memory object. 220ed8aab45SBen Goz * 221ed8aab45SBen Goz * @gart_mqd_addr: The MQD gart mc address. 222ed8aab45SBen Goz * 223ed8aab45SBen Goz * @properties: The queue properties. 224ed8aab45SBen Goz * 225ed8aab45SBen Goz * @mec: Used only in no cp scheduling mode and identifies to micro engine id 226ed8aab45SBen Goz * that the queue should be execute on. 227ed8aab45SBen Goz * 228ed8aab45SBen Goz * @pipe: Used only in no cp scheduling mode and identifies the queue's pipe id. 229ed8aab45SBen Goz * 230ed8aab45SBen Goz * @queue: Used only in no cp scheduliong mode and identifies the queue's slot. 231ed8aab45SBen Goz * 232ed8aab45SBen Goz * @process: The kfd process that created this queue. 233ed8aab45SBen Goz * 234ed8aab45SBen Goz * @device: The kfd device that created this queue. 235ed8aab45SBen Goz * 236ed8aab45SBen Goz * This structure represents user mode compute queues. 237ed8aab45SBen Goz * It contains all the necessary data to handle such queues. 238ed8aab45SBen Goz * 239ed8aab45SBen Goz */ 240ed8aab45SBen Goz 241ed8aab45SBen Goz struct queue { 242ed8aab45SBen Goz struct list_head list; 243ed8aab45SBen Goz void *mqd; 244ed8aab45SBen Goz struct kfd_mem_obj *mqd_mem_obj; 245ed8aab45SBen Goz uint64_t gart_mqd_addr; 246ed8aab45SBen Goz struct queue_properties properties; 247ed8aab45SBen Goz 248ed8aab45SBen Goz uint32_t mec; 249ed8aab45SBen Goz uint32_t pipe; 250ed8aab45SBen Goz uint32_t queue; 251ed8aab45SBen Goz 252ed8aab45SBen Goz struct kfd_process *process; 253ed8aab45SBen Goz struct kfd_dev *device; 254ed8aab45SBen Goz }; 255ed8aab45SBen Goz 2566e99df57SBen Goz /* 2576e99df57SBen Goz * Please read the kfd_mqd_manager.h description. 2586e99df57SBen Goz */ 2596e99df57SBen Goz enum KFD_MQD_TYPE { 2606e99df57SBen Goz KFD_MQD_TYPE_CIK_COMPUTE = 0, /* for no cp scheduling */ 2616e99df57SBen Goz KFD_MQD_TYPE_CIK_HIQ, /* for hiq */ 2626e99df57SBen Goz KFD_MQD_TYPE_CIK_CP, /* for cp queues and diq */ 2636e99df57SBen Goz KFD_MQD_TYPE_CIK_SDMA, /* for sdma queues */ 2646e99df57SBen Goz KFD_MQD_TYPE_MAX 2656e99df57SBen Goz }; 2666e99df57SBen Goz 26719f6d2a6SOded Gabbay /* Data that is per-process-per device. */ 26819f6d2a6SOded Gabbay struct kfd_process_device { 26919f6d2a6SOded Gabbay /* 27019f6d2a6SOded Gabbay * List of all per-device data for a process. 27119f6d2a6SOded Gabbay * Starts from kfd_process.per_device_data. 27219f6d2a6SOded Gabbay */ 27319f6d2a6SOded Gabbay struct list_head per_device_list; 27419f6d2a6SOded Gabbay 27519f6d2a6SOded Gabbay /* The device that owns this data. */ 27619f6d2a6SOded Gabbay struct kfd_dev *dev; 27719f6d2a6SOded Gabbay 27819f6d2a6SOded Gabbay 27919f6d2a6SOded Gabbay /*Apertures*/ 28019f6d2a6SOded Gabbay uint64_t lds_base; 28119f6d2a6SOded Gabbay uint64_t lds_limit; 28219f6d2a6SOded Gabbay uint64_t gpuvm_base; 28319f6d2a6SOded Gabbay uint64_t gpuvm_limit; 28419f6d2a6SOded Gabbay uint64_t scratch_base; 28519f6d2a6SOded Gabbay uint64_t scratch_limit; 28619f6d2a6SOded Gabbay 28719f6d2a6SOded Gabbay /* Is this process/pasid bound to this device? (amd_iommu_bind_pasid) */ 28819f6d2a6SOded Gabbay bool bound; 28919f6d2a6SOded Gabbay }; 29019f6d2a6SOded Gabbay 2914a488a7aSOded Gabbay /* Process data */ 2924a488a7aSOded Gabbay struct kfd_process { 29319f6d2a6SOded Gabbay /* 29419f6d2a6SOded Gabbay * kfd_process are stored in an mm_struct*->kfd_process* 29519f6d2a6SOded Gabbay * hash table (kfd_processes in kfd_process.c) 29619f6d2a6SOded Gabbay */ 29719f6d2a6SOded Gabbay struct hlist_node kfd_processes; 29819f6d2a6SOded Gabbay 29919f6d2a6SOded Gabbay struct mm_struct *mm; 30019f6d2a6SOded Gabbay 30119f6d2a6SOded Gabbay struct mutex mutex; 30219f6d2a6SOded Gabbay 30319f6d2a6SOded Gabbay /* 30419f6d2a6SOded Gabbay * In any process, the thread that started main() is the lead 30519f6d2a6SOded Gabbay * thread and outlives the rest. 30619f6d2a6SOded Gabbay * It is here because amd_iommu_bind_pasid wants a task_struct. 30719f6d2a6SOded Gabbay */ 30819f6d2a6SOded Gabbay struct task_struct *lead_thread; 30919f6d2a6SOded Gabbay 31019f6d2a6SOded Gabbay /* We want to receive a notification when the mm_struct is destroyed */ 31119f6d2a6SOded Gabbay struct mmu_notifier mmu_notifier; 31219f6d2a6SOded Gabbay 31319f6d2a6SOded Gabbay /* Use for delayed freeing of kfd_process structure */ 31419f6d2a6SOded Gabbay struct rcu_head rcu; 31519f6d2a6SOded Gabbay 31619f6d2a6SOded Gabbay unsigned int pasid; 31719f6d2a6SOded Gabbay 31819f6d2a6SOded Gabbay /* 31919f6d2a6SOded Gabbay * List of kfd_process_device structures, 32019f6d2a6SOded Gabbay * one for each device the process is using. 32119f6d2a6SOded Gabbay */ 32219f6d2a6SOded Gabbay struct list_head per_device_data; 32319f6d2a6SOded Gabbay 32419f6d2a6SOded Gabbay /* The process's queues. */ 32519f6d2a6SOded Gabbay size_t queue_array_size; 32619f6d2a6SOded Gabbay 32719f6d2a6SOded Gabbay /* Size is queue_array_size, up to MAX_PROCESS_QUEUES. */ 32819f6d2a6SOded Gabbay struct kfd_queue **queues; 32919f6d2a6SOded Gabbay 33019f6d2a6SOded Gabbay unsigned long allocated_queue_bitmap[DIV_ROUND_UP(KFD_MAX_NUM_OF_QUEUES_PER_PROCESS, BITS_PER_LONG)]; 33119f6d2a6SOded Gabbay 33219f6d2a6SOded Gabbay /*Is the user space process 32 bit?*/ 33319f6d2a6SOded Gabbay bool is_32bit_user_mode; 3344a488a7aSOded Gabbay }; 3354a488a7aSOded Gabbay 33619f6d2a6SOded Gabbay void kfd_process_create_wq(void); 33719f6d2a6SOded Gabbay void kfd_process_destroy_wq(void); 33819f6d2a6SOded Gabbay struct kfd_process *kfd_create_process(const struct task_struct *); 33919f6d2a6SOded Gabbay struct kfd_process *kfd_get_process(const struct task_struct *); 34019f6d2a6SOded Gabbay 341b17f068aSOded Gabbay void kfd_unbind_process_from_device(struct kfd_dev *dev, unsigned int pasid); 34219f6d2a6SOded Gabbay struct kfd_process_device *kfd_get_process_device_data(struct kfd_dev *dev, 34319f6d2a6SOded Gabbay struct kfd_process *p, 34419f6d2a6SOded Gabbay int create_pdd); 34519f6d2a6SOded Gabbay 34619f6d2a6SOded Gabbay /* PASIDs */ 34719f6d2a6SOded Gabbay int kfd_pasid_init(void); 34819f6d2a6SOded Gabbay void kfd_pasid_exit(void); 34919f6d2a6SOded Gabbay bool kfd_set_pasid_limit(unsigned int new_limit); 35019f6d2a6SOded Gabbay unsigned int kfd_get_pasid_limit(void); 35119f6d2a6SOded Gabbay unsigned int kfd_pasid_alloc(void); 35219f6d2a6SOded Gabbay void kfd_pasid_free(unsigned int pasid); 35319f6d2a6SOded Gabbay 35419f6d2a6SOded Gabbay /* Doorbells */ 35519f6d2a6SOded Gabbay void kfd_doorbell_init(struct kfd_dev *kfd); 35619f6d2a6SOded Gabbay int kfd_doorbell_mmap(struct kfd_process *process, struct vm_area_struct *vma); 35719f6d2a6SOded Gabbay u32 __iomem *kfd_get_kernel_doorbell(struct kfd_dev *kfd, 35819f6d2a6SOded Gabbay unsigned int *doorbell_off); 35919f6d2a6SOded Gabbay void kfd_release_kernel_doorbell(struct kfd_dev *kfd, u32 __iomem *db_addr); 36019f6d2a6SOded Gabbay u32 read_kernel_doorbell(u32 __iomem *db); 36119f6d2a6SOded Gabbay void write_kernel_doorbell(u32 __iomem *db, u32 value); 36219f6d2a6SOded Gabbay unsigned int kfd_queue_id_to_doorbell(struct kfd_dev *kfd, 36319f6d2a6SOded Gabbay struct kfd_process *process, 36419f6d2a6SOded Gabbay unsigned int queue_id); 36519f6d2a6SOded Gabbay 3664a488a7aSOded Gabbay extern struct device *kfd_device; 3674a488a7aSOded Gabbay 3685b5c4e40SEvgeny Pinchuk /* Topology */ 3695b5c4e40SEvgeny Pinchuk int kfd_topology_init(void); 3705b5c4e40SEvgeny Pinchuk void kfd_topology_shutdown(void); 3715b5c4e40SEvgeny Pinchuk int kfd_topology_add_device(struct kfd_dev *gpu); 3725b5c4e40SEvgeny Pinchuk int kfd_topology_remove_device(struct kfd_dev *gpu); 3735b5c4e40SEvgeny Pinchuk struct kfd_dev *kfd_device_by_id(uint32_t gpu_id); 3745b5c4e40SEvgeny Pinchuk struct kfd_dev *kfd_device_by_pci_dev(const struct pci_dev *pdev); 3755b5c4e40SEvgeny Pinchuk struct kfd_dev *kfd_topology_enum_kfd_devices(uint8_t idx); 3765b5c4e40SEvgeny Pinchuk 3774a488a7aSOded Gabbay /* Interrupts */ 3784a488a7aSOded Gabbay void kgd2kfd_interrupt(struct kfd_dev *dev, const void *ih_ring_entry); 3794a488a7aSOded Gabbay 3804a488a7aSOded Gabbay /* Power Management */ 3814a488a7aSOded Gabbay void kgd2kfd_suspend(struct kfd_dev *dev); 3824a488a7aSOded Gabbay int kgd2kfd_resume(struct kfd_dev *dev); 3834a488a7aSOded Gabbay 38419f6d2a6SOded Gabbay /* amdkfd Apertures */ 38519f6d2a6SOded Gabbay int kfd_init_apertures(struct kfd_process *process); 38619f6d2a6SOded Gabbay 38719f6d2a6SOded Gabbay uint64_t kfd_get_number_elems(struct kfd_dev *kfd); 38819f6d2a6SOded Gabbay phys_addr_t kfd_get_process_doorbells(struct kfd_dev *dev, 38919f6d2a6SOded Gabbay struct kfd_process *process); 39019f6d2a6SOded Gabbay 3914a488a7aSOded Gabbay #endif 392