17dcf36dcSFrançois Tigeot /* 27dcf36dcSFrançois Tigeot * Copyright 2014 Advanced Micro Devices, Inc. 37dcf36dcSFrançois Tigeot * 47dcf36dcSFrançois Tigeot * Permission is hereby granted, free of charge, to any person obtaining a 57dcf36dcSFrançois Tigeot * copy of this software and associated documentation files (the "Software"), 67dcf36dcSFrançois Tigeot * to deal in the Software without restriction, including without limitation 77dcf36dcSFrançois Tigeot * the rights to use, copy, modify, merge, publish, distribute, sublicense, 87dcf36dcSFrançois Tigeot * and/or sell copies of the Software, and to permit persons to whom the 97dcf36dcSFrançois Tigeot * Software is furnished to do so, subject to the following conditions: 107dcf36dcSFrançois Tigeot * 117dcf36dcSFrançois Tigeot * The above copyright notice and this permission notice shall be included in 127dcf36dcSFrançois Tigeot * all copies or substantial portions of the Software. 137dcf36dcSFrançois Tigeot * 147dcf36dcSFrançois Tigeot * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 157dcf36dcSFrançois Tigeot * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 167dcf36dcSFrançois Tigeot * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 177dcf36dcSFrançois Tigeot * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 187dcf36dcSFrançois Tigeot * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 197dcf36dcSFrançois Tigeot * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 207dcf36dcSFrançois Tigeot * OTHER DEALINGS IN THE SOFTWARE. 217dcf36dcSFrançois Tigeot */ 227dcf36dcSFrançois Tigeot 237dcf36dcSFrançois Tigeot /* 247dcf36dcSFrançois Tigeot * This file defines the private interface between the 257dcf36dcSFrançois Tigeot * AMD kernel graphics drivers and the AMD KFD. 267dcf36dcSFrançois Tigeot */ 277dcf36dcSFrançois Tigeot 287dcf36dcSFrançois Tigeot #ifndef KGD_KFD_INTERFACE_H_INCLUDED 297dcf36dcSFrançois Tigeot #define KGD_KFD_INTERFACE_H_INCLUDED 307dcf36dcSFrançois Tigeot 317dcf36dcSFrançois Tigeot #include <linux/types.h> 32*3f2dd94aSFrançois Tigeot #include <linux/bitmap.h> 337dcf36dcSFrançois Tigeot 347dcf36dcSFrançois Tigeot struct pci_dev; 357dcf36dcSFrançois Tigeot 36*3f2dd94aSFrançois Tigeot #define KFD_INTERFACE_VERSION 2 37*3f2dd94aSFrançois Tigeot #define KGD_MAX_QUEUES 128 387dcf36dcSFrançois Tigeot 397dcf36dcSFrançois Tigeot struct kfd_dev; 407dcf36dcSFrançois Tigeot struct kgd_dev; 417dcf36dcSFrançois Tigeot 427dcf36dcSFrançois Tigeot struct kgd_mem; 437dcf36dcSFrançois Tigeot 44*3f2dd94aSFrançois Tigeot enum kfd_preempt_type { 45*3f2dd94aSFrançois Tigeot KFD_PREEMPT_TYPE_WAVEFRONT_DRAIN = 0, 46*3f2dd94aSFrançois Tigeot KFD_PREEMPT_TYPE_WAVEFRONT_RESET, 47*3f2dd94aSFrançois Tigeot }; 48*3f2dd94aSFrançois Tigeot 497dcf36dcSFrançois Tigeot enum kgd_memory_pool { 507dcf36dcSFrançois Tigeot KGD_POOL_SYSTEM_CACHEABLE = 1, 517dcf36dcSFrançois Tigeot KGD_POOL_SYSTEM_WRITECOMBINE = 2, 527dcf36dcSFrançois Tigeot KGD_POOL_FRAMEBUFFER = 3, 537dcf36dcSFrançois Tigeot }; 547dcf36dcSFrançois Tigeot 557dcf36dcSFrançois Tigeot enum kgd_engine_type { 567dcf36dcSFrançois Tigeot KGD_ENGINE_PFP = 1, 577dcf36dcSFrançois Tigeot KGD_ENGINE_ME, 587dcf36dcSFrançois Tigeot KGD_ENGINE_CE, 597dcf36dcSFrançois Tigeot KGD_ENGINE_MEC1, 607dcf36dcSFrançois Tigeot KGD_ENGINE_MEC2, 617dcf36dcSFrançois Tigeot KGD_ENGINE_RLC, 62c59a5c48SFrançois Tigeot KGD_ENGINE_SDMA1, 63c59a5c48SFrançois Tigeot KGD_ENGINE_SDMA2, 647dcf36dcSFrançois Tigeot KGD_ENGINE_MAX 657dcf36dcSFrançois Tigeot }; 667dcf36dcSFrançois Tigeot 677dcf36dcSFrançois Tigeot struct kgd2kfd_shared_resources { 687dcf36dcSFrançois Tigeot /* Bit n == 1 means VMID n is available for KFD. */ 697dcf36dcSFrançois Tigeot unsigned int compute_vmid_bitmap; 707dcf36dcSFrançois Tigeot 71*3f2dd94aSFrançois Tigeot /* number of pipes per mec */ 72*3f2dd94aSFrançois Tigeot uint32_t num_pipe_per_mec; 737dcf36dcSFrançois Tigeot 74*3f2dd94aSFrançois Tigeot /* number of queues per pipe */ 75*3f2dd94aSFrançois Tigeot uint32_t num_queue_per_pipe; 76*3f2dd94aSFrançois Tigeot 77*3f2dd94aSFrançois Tigeot /* Bit n == 1 means Queue n is available for KFD */ 78*3f2dd94aSFrançois Tigeot DECLARE_BITMAP(queue_bitmap, KGD_MAX_QUEUES); 797dcf36dcSFrançois Tigeot 807dcf36dcSFrançois Tigeot /* Base address of doorbell aperture. */ 817dcf36dcSFrançois Tigeot phys_addr_t doorbell_physical_address; 827dcf36dcSFrançois Tigeot 837dcf36dcSFrançois Tigeot /* Size in bytes of doorbell aperture. */ 847dcf36dcSFrançois Tigeot size_t doorbell_aperture_size; 857dcf36dcSFrançois Tigeot 867dcf36dcSFrançois Tigeot /* Number of bytes at start of aperture reserved for KGD. */ 877dcf36dcSFrançois Tigeot size_t doorbell_start_offset; 887dcf36dcSFrançois Tigeot }; 897dcf36dcSFrançois Tigeot 90*3f2dd94aSFrançois Tigeot struct tile_config { 91*3f2dd94aSFrançois Tigeot uint32_t *tile_config_ptr; 92*3f2dd94aSFrançois Tigeot uint32_t *macro_tile_config_ptr; 93*3f2dd94aSFrançois Tigeot uint32_t num_tile_configs; 94*3f2dd94aSFrançois Tigeot uint32_t num_macro_tile_configs; 95*3f2dd94aSFrançois Tigeot 96*3f2dd94aSFrançois Tigeot uint32_t gb_addr_config; 97*3f2dd94aSFrançois Tigeot uint32_t num_banks; 98*3f2dd94aSFrançois Tigeot uint32_t num_ranks; 99*3f2dd94aSFrançois Tigeot }; 100*3f2dd94aSFrançois Tigeot 1017dcf36dcSFrançois Tigeot /** 102c59a5c48SFrançois Tigeot * struct kfd2kgd_calls 103c59a5c48SFrançois Tigeot * 104c59a5c48SFrançois Tigeot * @init_gtt_mem_allocation: Allocate a buffer on the gart aperture. 105c59a5c48SFrançois Tigeot * The buffer can be used for mqds, hpds, kernel queue, fence and runlists 106c59a5c48SFrançois Tigeot * 107c59a5c48SFrançois Tigeot * @free_gtt_mem: Frees a buffer that was allocated on the gart aperture 108c59a5c48SFrançois Tigeot * 109c59a5c48SFrançois Tigeot * @get_vmem_size: Retrieves (physical) size of VRAM 110c59a5c48SFrançois Tigeot * 111c59a5c48SFrançois Tigeot * @get_gpu_clock_counter: Retrieves GPU clock counter 112c59a5c48SFrançois Tigeot * 113c59a5c48SFrançois Tigeot * @get_max_engine_clock_in_mhz: Retrieves maximum GPU clock in MHz 114c59a5c48SFrançois Tigeot * 115*3f2dd94aSFrançois Tigeot * @alloc_pasid: Allocate a PASID 116*3f2dd94aSFrançois Tigeot * @free_pasid: Free a PASID 117*3f2dd94aSFrançois Tigeot * 118c59a5c48SFrançois Tigeot * @program_sh_mem_settings: A function that should initiate the memory 119c59a5c48SFrançois Tigeot * properties such as main aperture memory type (cache / non cached) and 120c59a5c48SFrançois Tigeot * secondary aperture base address, size and memory type. 121c59a5c48SFrançois Tigeot * This function is used only for no cp scheduling mode. 122c59a5c48SFrançois Tigeot * 123c59a5c48SFrançois Tigeot * @set_pasid_vmid_mapping: Exposes pasid/vmid pair to the H/W for no cp 124c59a5c48SFrançois Tigeot * scheduling mode. Only used for no cp scheduling mode. 125c59a5c48SFrançois Tigeot * 126c59a5c48SFrançois Tigeot * @init_pipeline: Initialized the compute pipelines. 127c59a5c48SFrançois Tigeot * 128c59a5c48SFrançois Tigeot * @hqd_load: Loads the mqd structure to a H/W hqd slot. used only for no cp 129c59a5c48SFrançois Tigeot * sceduling mode. 130c59a5c48SFrançois Tigeot * 131c59a5c48SFrançois Tigeot * @hqd_sdma_load: Loads the SDMA mqd structure to a H/W SDMA hqd slot. 132c59a5c48SFrançois Tigeot * used only for no HWS mode. 133c59a5c48SFrançois Tigeot * 134c59a5c48SFrançois Tigeot * @hqd_is_occupies: Checks if a hqd slot is occupied. 135c59a5c48SFrançois Tigeot * 136c59a5c48SFrançois Tigeot * @hqd_destroy: Destructs and preempts the queue assigned to that hqd slot. 137c59a5c48SFrançois Tigeot * 138c59a5c48SFrançois Tigeot * @hqd_sdma_is_occupied: Checks if an SDMA hqd slot is occupied. 139c59a5c48SFrançois Tigeot * 140c59a5c48SFrançois Tigeot * @hqd_sdma_destroy: Destructs and preempts the SDMA queue assigned to that 141c59a5c48SFrançois Tigeot * SDMA hqd slot. 142c59a5c48SFrançois Tigeot * 143c59a5c48SFrançois Tigeot * @get_fw_version: Returns FW versions from the header 144c59a5c48SFrançois Tigeot * 145*3f2dd94aSFrançois Tigeot * @set_scratch_backing_va: Sets VA for scratch backing memory of a VMID. 146*3f2dd94aSFrançois Tigeot * Only used for no cp scheduling mode 147*3f2dd94aSFrançois Tigeot * 148*3f2dd94aSFrançois Tigeot * @get_tile_config: Returns GPU-specific tiling mode information 149*3f2dd94aSFrançois Tigeot * 150c59a5c48SFrançois Tigeot * This structure contains function pointers to services that the kgd driver 151c59a5c48SFrançois Tigeot * provides to amdkfd driver. 152c59a5c48SFrançois Tigeot * 153c59a5c48SFrançois Tigeot */ 154c59a5c48SFrançois Tigeot struct kfd2kgd_calls { 155c59a5c48SFrançois Tigeot int (*init_gtt_mem_allocation)(struct kgd_dev *kgd, size_t size, 156c59a5c48SFrançois Tigeot void **mem_obj, uint64_t *gpu_addr, 157c59a5c48SFrançois Tigeot void **cpu_ptr); 158c59a5c48SFrançois Tigeot 159c59a5c48SFrançois Tigeot void (*free_gtt_mem)(struct kgd_dev *kgd, void *mem_obj); 160c59a5c48SFrançois Tigeot 161c59a5c48SFrançois Tigeot uint64_t (*get_vmem_size)(struct kgd_dev *kgd); 162c59a5c48SFrançois Tigeot uint64_t (*get_gpu_clock_counter)(struct kgd_dev *kgd); 163c59a5c48SFrançois Tigeot 164c59a5c48SFrançois Tigeot uint32_t (*get_max_engine_clock_in_mhz)(struct kgd_dev *kgd); 165c59a5c48SFrançois Tigeot 166*3f2dd94aSFrançois Tigeot int (*alloc_pasid)(unsigned int bits); 167*3f2dd94aSFrançois Tigeot void (*free_pasid)(unsigned int pasid); 168*3f2dd94aSFrançois Tigeot 169c59a5c48SFrançois Tigeot /* Register access functions */ 170c59a5c48SFrançois Tigeot void (*program_sh_mem_settings)(struct kgd_dev *kgd, uint32_t vmid, 171c59a5c48SFrançois Tigeot uint32_t sh_mem_config, uint32_t sh_mem_ape1_base, 172c59a5c48SFrançois Tigeot uint32_t sh_mem_ape1_limit, uint32_t sh_mem_bases); 173c59a5c48SFrançois Tigeot 174c59a5c48SFrançois Tigeot int (*set_pasid_vmid_mapping)(struct kgd_dev *kgd, unsigned int pasid, 175c59a5c48SFrançois Tigeot unsigned int vmid); 176c59a5c48SFrançois Tigeot 177c59a5c48SFrançois Tigeot int (*init_pipeline)(struct kgd_dev *kgd, uint32_t pipe_id, 178c59a5c48SFrançois Tigeot uint32_t hpd_size, uint64_t hpd_gpu_addr); 179c59a5c48SFrançois Tigeot 180c59a5c48SFrançois Tigeot int (*init_interrupts)(struct kgd_dev *kgd, uint32_t pipe_id); 181c59a5c48SFrançois Tigeot 182c59a5c48SFrançois Tigeot int (*hqd_load)(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id, 183*3f2dd94aSFrançois Tigeot uint32_t queue_id, uint32_t __user *wptr, 184*3f2dd94aSFrançois Tigeot uint32_t wptr_shift, uint32_t wptr_mask, 185*3f2dd94aSFrançois Tigeot struct mm_struct *mm); 186c59a5c48SFrançois Tigeot 187c59a5c48SFrançois Tigeot int (*hqd_sdma_load)(struct kgd_dev *kgd, void *mqd); 188c59a5c48SFrançois Tigeot 189c59a5c48SFrançois Tigeot bool (*hqd_is_occupied)(struct kgd_dev *kgd, uint64_t queue_address, 190c59a5c48SFrançois Tigeot uint32_t pipe_id, uint32_t queue_id); 191c59a5c48SFrançois Tigeot 192*3f2dd94aSFrançois Tigeot int (*hqd_destroy)(struct kgd_dev *kgd, void *mqd, uint32_t reset_type, 193c59a5c48SFrançois Tigeot unsigned int timeout, uint32_t pipe_id, 194c59a5c48SFrançois Tigeot uint32_t queue_id); 195c59a5c48SFrançois Tigeot 196c59a5c48SFrançois Tigeot bool (*hqd_sdma_is_occupied)(struct kgd_dev *kgd, void *mqd); 197c59a5c48SFrançois Tigeot 198c59a5c48SFrançois Tigeot int (*hqd_sdma_destroy)(struct kgd_dev *kgd, void *mqd, 199c59a5c48SFrançois Tigeot unsigned int timeout); 200c59a5c48SFrançois Tigeot 201c59a5c48SFrançois Tigeot int (*address_watch_disable)(struct kgd_dev *kgd); 202c59a5c48SFrançois Tigeot int (*address_watch_execute)(struct kgd_dev *kgd, 203c59a5c48SFrançois Tigeot unsigned int watch_point_id, 204c59a5c48SFrançois Tigeot uint32_t cntl_val, 205c59a5c48SFrançois Tigeot uint32_t addr_hi, 206c59a5c48SFrançois Tigeot uint32_t addr_lo); 207c59a5c48SFrançois Tigeot int (*wave_control_execute)(struct kgd_dev *kgd, 208c59a5c48SFrançois Tigeot uint32_t gfx_index_val, 209c59a5c48SFrançois Tigeot uint32_t sq_cmd); 210c59a5c48SFrançois Tigeot uint32_t (*address_watch_get_offset)(struct kgd_dev *kgd, 211c59a5c48SFrançois Tigeot unsigned int watch_point_id, 212c59a5c48SFrançois Tigeot unsigned int reg_offset); 213c59a5c48SFrançois Tigeot bool (*get_atc_vmid_pasid_mapping_valid)( 214c59a5c48SFrançois Tigeot struct kgd_dev *kgd, 215c59a5c48SFrançois Tigeot uint8_t vmid); 216c59a5c48SFrançois Tigeot uint16_t (*get_atc_vmid_pasid_mapping_pasid)( 217c59a5c48SFrançois Tigeot struct kgd_dev *kgd, 218c59a5c48SFrançois Tigeot uint8_t vmid); 219c59a5c48SFrançois Tigeot void (*write_vmid_invalidate_request)(struct kgd_dev *kgd, 220c59a5c48SFrançois Tigeot uint8_t vmid); 221c59a5c48SFrançois Tigeot 222c59a5c48SFrançois Tigeot uint16_t (*get_fw_version)(struct kgd_dev *kgd, 223c59a5c48SFrançois Tigeot enum kgd_engine_type type); 224*3f2dd94aSFrançois Tigeot void (*set_scratch_backing_va)(struct kgd_dev *kgd, 225*3f2dd94aSFrançois Tigeot uint64_t va, uint32_t vmid); 226*3f2dd94aSFrançois Tigeot int (*get_tile_config)(struct kgd_dev *kgd, struct tile_config *config); 227c59a5c48SFrançois Tigeot }; 228c59a5c48SFrançois Tigeot 229c59a5c48SFrançois Tigeot /** 2307dcf36dcSFrançois Tigeot * struct kgd2kfd_calls 2317dcf36dcSFrançois Tigeot * 2327dcf36dcSFrançois Tigeot * @exit: Notifies amdkfd that kgd module is unloaded 2337dcf36dcSFrançois Tigeot * 2347dcf36dcSFrançois Tigeot * @probe: Notifies amdkfd about a probe done on a device in the kgd driver. 2357dcf36dcSFrançois Tigeot * 2367dcf36dcSFrançois Tigeot * @device_init: Initialize the newly probed device (if it is a device that 2377dcf36dcSFrançois Tigeot * amdkfd supports) 2387dcf36dcSFrançois Tigeot * 2397dcf36dcSFrançois Tigeot * @device_exit: Notifies amdkfd about a removal of a kgd device 2407dcf36dcSFrançois Tigeot * 2417dcf36dcSFrançois Tigeot * @suspend: Notifies amdkfd about a suspend action done to a kgd device 2427dcf36dcSFrançois Tigeot * 2437dcf36dcSFrançois Tigeot * @resume: Notifies amdkfd about a resume action done to a kgd device 2447dcf36dcSFrançois Tigeot * 2457dcf36dcSFrançois Tigeot * This structure contains function callback pointers so the kgd driver 2467dcf36dcSFrançois Tigeot * will notify to the amdkfd about certain status changes. 2477dcf36dcSFrançois Tigeot * 2487dcf36dcSFrançois Tigeot */ 2497dcf36dcSFrançois Tigeot struct kgd2kfd_calls { 2507dcf36dcSFrançois Tigeot void (*exit)(void); 251c59a5c48SFrançois Tigeot struct kfd_dev* (*probe)(struct kgd_dev *kgd, struct pci_dev *pdev, 252c59a5c48SFrançois Tigeot const struct kfd2kgd_calls *f2g); 2537dcf36dcSFrançois Tigeot bool (*device_init)(struct kfd_dev *kfd, 2547dcf36dcSFrançois Tigeot const struct kgd2kfd_shared_resources *gpu_resources); 2557dcf36dcSFrançois Tigeot void (*device_exit)(struct kfd_dev *kfd); 2567dcf36dcSFrançois Tigeot void (*interrupt)(struct kfd_dev *kfd, const void *ih_ring_entry); 2577dcf36dcSFrançois Tigeot void (*suspend)(struct kfd_dev *kfd); 2587dcf36dcSFrançois Tigeot int (*resume)(struct kfd_dev *kfd); 2597dcf36dcSFrançois Tigeot }; 2607dcf36dcSFrançois Tigeot 261d78d3a22SFrançois Tigeot int kgd2kfd_init(unsigned interface_version, 2627dcf36dcSFrançois Tigeot const struct kgd2kfd_calls **g2f); 2637dcf36dcSFrançois Tigeot 2647dcf36dcSFrançois Tigeot #endif /* KGD_KFD_INTERFACE_H_INCLUDED */ 265