Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  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. /*
  24.  * This file defines the private interface between the
  25.  * AMD kernel graphics drivers and the AMD KFD.
  26.  */
  27.  
  28. #ifndef KGD_KFD_INTERFACE_H_INCLUDED
  29. #define KGD_KFD_INTERFACE_H_INCLUDED
  30.  
  31. #include <linux/types.h>
  32.  
  33. struct pci_dev;
  34.  
  35. #define KFD_INTERFACE_VERSION 1
  36.  
  37. struct kfd_dev;
  38. struct kgd_dev;
  39.  
  40. struct kgd_mem;
  41.  
  42. enum kgd_memory_pool {
  43.         KGD_POOL_SYSTEM_CACHEABLE = 1,
  44.         KGD_POOL_SYSTEM_WRITECOMBINE = 2,
  45.         KGD_POOL_FRAMEBUFFER = 3,
  46. };
  47.  
  48. enum kgd_engine_type {
  49.         KGD_ENGINE_PFP = 1,
  50.         KGD_ENGINE_ME,
  51.         KGD_ENGINE_CE,
  52.         KGD_ENGINE_MEC1,
  53.         KGD_ENGINE_MEC2,
  54.         KGD_ENGINE_RLC,
  55.         KGD_ENGINE_SDMA1,
  56.         KGD_ENGINE_SDMA2,
  57.         KGD_ENGINE_MAX
  58. };
  59.  
  60. struct kgd2kfd_shared_resources {
  61.         /* Bit n == 1 means VMID n is available for KFD. */
  62.         unsigned int compute_vmid_bitmap;
  63.  
  64.         /* Compute pipes are counted starting from MEC0/pipe0 as 0. */
  65.         unsigned int first_compute_pipe;
  66.  
  67.         /* Number of MEC pipes available for KFD. */
  68.         unsigned int compute_pipe_count;
  69.  
  70.         /* Base address of doorbell aperture. */
  71.         phys_addr_t doorbell_physical_address;
  72.  
  73.         /* Size in bytes of doorbell aperture. */
  74.         size_t doorbell_aperture_size;
  75.  
  76.         /* Number of bytes at start of aperture reserved for KGD. */
  77.         size_t doorbell_start_offset;
  78. };
  79.  
  80. /**
  81.  * struct kfd2kgd_calls
  82.  *
  83.  * @init_gtt_mem_allocation: Allocate a buffer on the gart aperture.
  84.  * The buffer can be used for mqds, hpds, kernel queue, fence and runlists
  85.  *
  86.  * @free_gtt_mem: Frees a buffer that was allocated on the gart aperture
  87.  *
  88.  * @get_vmem_size: Retrieves (physical) size of VRAM
  89.  *
  90.  * @get_gpu_clock_counter: Retrieves GPU clock counter
  91.  *
  92.  * @get_max_engine_clock_in_mhz: Retrieves maximum GPU clock in MHz
  93.  *
  94.  * @program_sh_mem_settings: A function that should initiate the memory
  95.  * properties such as main aperture memory type (cache / non cached) and
  96.  * secondary aperture base address, size and memory type.
  97.  * This function is used only for no cp scheduling mode.
  98.  *
  99.  * @set_pasid_vmid_mapping: Exposes pasid/vmid pair to the H/W for no cp
  100.  * scheduling mode. Only used for no cp scheduling mode.
  101.  *
  102.  * @init_pipeline: Initialized the compute pipelines.
  103.  *
  104.  * @hqd_load: Loads the mqd structure to a H/W hqd slot. used only for no cp
  105.  * sceduling mode.
  106.  *
  107.  * @hqd_sdma_load: Loads the SDMA mqd structure to a H/W SDMA hqd slot.
  108.  * used only for no HWS mode.
  109.  *
  110.  * @hqd_is_occupies: Checks if a hqd slot is occupied.
  111.  *
  112.  * @hqd_destroy: Destructs and preempts the queue assigned to that hqd slot.
  113.  *
  114.  * @hqd_sdma_is_occupied: Checks if an SDMA hqd slot is occupied.
  115.  *
  116.  * @hqd_sdma_destroy: Destructs and preempts the SDMA queue assigned to that
  117.  * SDMA hqd slot.
  118.  *
  119.  * @get_fw_version: Returns FW versions from the header
  120.  *
  121.  * This structure contains function pointers to services that the kgd driver
  122.  * provides to amdkfd driver.
  123.  *
  124.  */
  125. struct kfd2kgd_calls {
  126.         int (*init_gtt_mem_allocation)(struct kgd_dev *kgd, size_t size,
  127.                                         void **mem_obj, uint64_t *gpu_addr,
  128.                                         void **cpu_ptr);
  129.  
  130.         void (*free_gtt_mem)(struct kgd_dev *kgd, void *mem_obj);
  131.  
  132.         uint64_t (*get_vmem_size)(struct kgd_dev *kgd);
  133.         uint64_t (*get_gpu_clock_counter)(struct kgd_dev *kgd);
  134.  
  135.         uint32_t (*get_max_engine_clock_in_mhz)(struct kgd_dev *kgd);
  136.  
  137.         /* Register access functions */
  138.         void (*program_sh_mem_settings)(struct kgd_dev *kgd, uint32_t vmid,
  139.                         uint32_t sh_mem_config, uint32_t sh_mem_ape1_base,
  140.                         uint32_t sh_mem_ape1_limit, uint32_t sh_mem_bases);
  141.  
  142.         int (*set_pasid_vmid_mapping)(struct kgd_dev *kgd, unsigned int pasid,
  143.                                         unsigned int vmid);
  144.  
  145.         int (*init_pipeline)(struct kgd_dev *kgd, uint32_t pipe_id,
  146.                                 uint32_t hpd_size, uint64_t hpd_gpu_addr);
  147.  
  148.         int (*init_interrupts)(struct kgd_dev *kgd, uint32_t pipe_id);
  149.  
  150.         int (*hqd_load)(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,
  151.                         uint32_t queue_id, uint32_t __user *wptr);
  152.  
  153.         int (*hqd_sdma_load)(struct kgd_dev *kgd, void *mqd);
  154.  
  155.         bool (*hqd_is_occupied)(struct kgd_dev *kgd, uint64_t queue_address,
  156.                                 uint32_t pipe_id, uint32_t queue_id);
  157.  
  158.         int (*hqd_destroy)(struct kgd_dev *kgd, uint32_t reset_type,
  159.                                 unsigned int timeout, uint32_t pipe_id,
  160.                                 uint32_t queue_id);
  161.  
  162.         bool (*hqd_sdma_is_occupied)(struct kgd_dev *kgd, void *mqd);
  163.  
  164.         int (*hqd_sdma_destroy)(struct kgd_dev *kgd, void *mqd,
  165.                                 unsigned int timeout);
  166.  
  167.         int (*address_watch_disable)(struct kgd_dev *kgd);
  168.         int (*address_watch_execute)(struct kgd_dev *kgd,
  169.                                         unsigned int watch_point_id,
  170.                                         uint32_t cntl_val,
  171.                                         uint32_t addr_hi,
  172.                                         uint32_t addr_lo);
  173.         int (*wave_control_execute)(struct kgd_dev *kgd,
  174.                                         uint32_t gfx_index_val,
  175.                                         uint32_t sq_cmd);
  176.         uint32_t (*address_watch_get_offset)(struct kgd_dev *kgd,
  177.                                         unsigned int watch_point_id,
  178.                                         unsigned int reg_offset);
  179.         bool (*get_atc_vmid_pasid_mapping_valid)(
  180.                                         struct kgd_dev *kgd,
  181.                                         uint8_t vmid);
  182.         uint16_t (*get_atc_vmid_pasid_mapping_pasid)(
  183.                                         struct kgd_dev *kgd,
  184.                                         uint8_t vmid);
  185.         void (*write_vmid_invalidate_request)(struct kgd_dev *kgd,
  186.                                         uint8_t vmid);
  187.  
  188.         uint16_t (*get_fw_version)(struct kgd_dev *kgd,
  189.                                 enum kgd_engine_type type);
  190. };
  191.  
  192. /**
  193.  * struct kgd2kfd_calls
  194.  *
  195.  * @exit: Notifies amdkfd that kgd module is unloaded
  196.  *
  197.  * @probe: Notifies amdkfd about a probe done on a device in the kgd driver.
  198.  *
  199.  * @device_init: Initialize the newly probed device (if it is a device that
  200.  * amdkfd supports)
  201.  *
  202.  * @device_exit: Notifies amdkfd about a removal of a kgd device
  203.  *
  204.  * @suspend: Notifies amdkfd about a suspend action done to a kgd device
  205.  *
  206.  * @resume: Notifies amdkfd about a resume action done to a kgd device
  207.  *
  208.  * This structure contains function callback pointers so the kgd driver
  209.  * will notify to the amdkfd about certain status changes.
  210.  *
  211.  */
  212. struct kgd2kfd_calls {
  213.         void (*exit)(void);
  214.         struct kfd_dev* (*probe)(struct kgd_dev *kgd, struct pci_dev *pdev,
  215.                 const struct kfd2kgd_calls *f2g);
  216.         bool (*device_init)(struct kfd_dev *kfd,
  217.                         const struct kgd2kfd_shared_resources *gpu_resources);
  218.         void (*device_exit)(struct kfd_dev *kfd);
  219.         void (*interrupt)(struct kfd_dev *kfd, const void *ih_ring_entry);
  220.         void (*suspend)(struct kfd_dev *kfd);
  221.         int (*resume)(struct kfd_dev *kfd);
  222. };
  223.  
  224. bool kgd2kfd_init(unsigned interface_version,
  225.                 const struct kgd2kfd_calls **g2f);
  226.  
  227. #endif  /* KGD_KFD_INTERFACE_H_INCLUDED */
  228.