Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
6105 | serge | 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 |
||
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 */ |