MALI: rockchip: upgrade midgard DDK to r11p0-00rel0
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / arm / midgard / mali_kbase_config.h
1 /*
2  *
3  * (C) COPYRIGHT 2010-2016 ARM Limited. All rights reserved.
4  *
5  * This program is free software and is provided to you under the terms of the
6  * GNU General Public License version 2 as published by the Free Software
7  * Foundation, and any use by you of this program is subject to the terms
8  * of such GNU licence.
9  *
10  * A copy of the licence is included with the program, and can also be obtained
11  * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
12  * Boston, MA  02110-1301, USA.
13  *
14  */
15
16
17
18
19
20 /**
21  * @file mali_kbase_config.h
22  * Configuration API and Attributes for KBase
23  */
24
25 #ifndef _KBASE_CONFIG_H_
26 #define _KBASE_CONFIG_H_
27
28 #include <asm/page.h>
29
30 #include <mali_malisw.h>
31 #include <mali_kbase_backend_config.h>
32
33 /**
34  * @addtogroup base_api
35  * @{
36  */
37
38 /**
39  * @addtogroup base_kbase_api
40  * @{
41  */
42
43 /**
44  * @addtogroup kbase_config Configuration API and Attributes
45  * @{
46  */
47
48 #include <linux/rbtree.h>
49
50 /* Forward declaration of struct kbase_device */
51 struct kbase_device;
52
53 /**
54  * kbase_platform_funcs_conf - Specifies platform init/term function pointers
55  *
56  * Specifies the functions pointers for platform specific initialization and
57  * termination. By default no functions are required. No additional platform
58  * specific control is necessary.
59  */
60 struct kbase_platform_funcs_conf {
61         /**
62          * platform_init_func - platform specific init function pointer
63          * @kbdev - kbase_device pointer
64          *
65          * Returns 0 on success, negative error code otherwise.
66          *
67          * Function pointer for platform specific initialization or NULL if no
68          * initialization function is required. At the point this the GPU is
69          * not active and its power and clocks are in unknown (platform specific
70          * state) as kbase doesn't yet have control of power and clocks.
71          *
72          * The platform specific private pointer kbase_device::platform_context
73          * can be accessed (and possibly initialized) in here.
74          */
75         int (*platform_init_func)(struct kbase_device *kbdev);
76         /**
77          * platform_term_func - platform specific termination function pointer
78          * @kbdev - kbase_device pointer
79          *
80          * Function pointer for platform specific termination or NULL if no
81          * termination function is required. At the point this the GPU will be
82          * idle but still powered and clocked.
83          *
84          * The platform specific private pointer kbase_device::platform_context
85          * can be accessed (and possibly terminated) in here.
86          */
87         void (*platform_term_func)(struct kbase_device *kbdev);
88 };
89
90 /*
91  * @brief Specifies the callbacks for power management
92  *
93  * By default no callbacks will be made and the GPU must not be powered off.
94  */
95 struct kbase_pm_callback_conf {
96         /** Callback for when the GPU is idle and the power to it can be switched off.
97          *
98          * The system integrator can decide whether to either do nothing, just switch off
99          * the clocks to the GPU, or to completely power down the GPU.
100          * The platform specific private pointer kbase_device::platform_context can be accessed and modified in here. It is the
101          * platform \em callbacks responsibility to initialize and terminate this pointer if used (see @ref kbase_platform_funcs_conf).
102          */
103         void (*power_off_callback)(struct kbase_device *kbdev);
104
105         /** Callback for when the GPU is about to become active and power must be supplied.
106          *
107          * This function must not return until the GPU is powered and clocked sufficiently for register access to
108          * succeed.  The return value specifies whether the GPU was powered down since the call to power_off_callback.
109          * If the GPU state has been lost then this function must return 1, otherwise it should return 0.
110          * The platform specific private pointer kbase_device::platform_context can be accessed and modified in here. It is the
111          * platform \em callbacks responsibility to initialize and terminate this pointer if used (see @ref kbase_platform_funcs_conf).
112          *
113          * The return value of the first call to this function is ignored.
114          *
115          * @return 1 if the GPU state may have been lost, 0 otherwise.
116          */
117         int (*power_on_callback)(struct kbase_device *kbdev);
118
119         /** Callback for when the system is requesting a suspend and GPU power
120          * must be switched off.
121          *
122          * Note that if this callback is present, then this may be called
123          * without a preceding call to power_off_callback. Therefore this
124          * callback must be able to take any action that might otherwise happen
125          * in power_off_callback.
126          *
127          * The platform specific private pointer kbase_device::platform_context
128          * can be accessed and modified in here. It is the platform \em
129          * callbacks responsibility to initialize and terminate this pointer if
130          * used (see @ref kbase_platform_funcs_conf).
131          */
132         void (*power_suspend_callback)(struct kbase_device *kbdev);
133
134         /** Callback for when the system is resuming from a suspend and GPU
135          * power must be switched on.
136          *
137          * Note that if this callback is present, then this may be called
138          * without a following call to power_on_callback. Therefore this
139          * callback must be able to take any action that might otherwise happen
140          * in power_on_callback.
141          *
142          * The platform specific private pointer kbase_device::platform_context
143          * can be accessed and modified in here. It is the platform \em
144          * callbacks responsibility to initialize and terminate this pointer if
145          * used (see @ref kbase_platform_funcs_conf).
146          */
147         void (*power_resume_callback)(struct kbase_device *kbdev);
148
149         /** Callback for handling runtime power management initialization.
150          *
151          * The runtime power management callbacks @ref power_runtime_off_callback and @ref power_runtime_on_callback
152          * will become active from calls made to the OS from within this function.
153          * The runtime calls can be triggered by calls from @ref power_off_callback and @ref power_on_callback.
154          * Note: for linux the kernel must have CONFIG_PM_RUNTIME enabled to use this feature.
155          *
156          * @return 0 on success, else int error code.
157          */
158          int (*power_runtime_init_callback)(struct kbase_device *kbdev);
159
160         /** Callback for handling runtime power management termination.
161          *
162          * The runtime power management callbacks @ref power_runtime_off_callback and @ref power_runtime_on_callback
163          * should no longer be called by the OS on completion of this function.
164          * Note: for linux the kernel must have CONFIG_PM_RUNTIME enabled to use this feature.
165          */
166         void (*power_runtime_term_callback)(struct kbase_device *kbdev);
167
168         /** Callback for runtime power-off power management callback
169          *
170          * For linux this callback will be called by the kernel runtime_suspend callback.
171          * Note: for linux the kernel must have CONFIG_PM_RUNTIME enabled to use this feature.
172          *
173          * @return 0 on success, else OS error code.
174          */
175         void (*power_runtime_off_callback)(struct kbase_device *kbdev);
176
177         /** Callback for runtime power-on power management callback
178          *
179          * For linux this callback will be called by the kernel runtime_resume callback.
180          * Note: for linux the kernel must have CONFIG_PM_RUNTIME enabled to use this feature.
181          */
182         int (*power_runtime_on_callback)(struct kbase_device *kbdev);
183
184         /*
185          * Optional callback for checking if GPU can be suspended when idle
186          *
187          * This callback will be called by the runtime power management core
188          * when the reference count goes to 0 to provide notification that the
189          * GPU now seems idle.
190          *
191          * If this callback finds that the GPU can't be powered off, or handles
192          * suspend by powering off directly or queueing up a power off, a
193          * non-zero value must be returned to prevent the runtime PM core from
194          * also triggering a suspend.
195          *
196          * Returning 0 will cause the runtime PM core to conduct a regular
197          * autosuspend.
198          *
199          * This callback is optional and if not provided regular autosuspend
200          * will be triggered.
201          *
202          * Note: The Linux kernel must have CONFIG_PM_RUNTIME enabled to use
203          * this feature.
204          *
205          * Return 0 if GPU can be suspended, positive value if it can not be
206          * suspeneded by runtime PM, else OS error code
207          */
208         int (*power_runtime_idle_callback)(struct kbase_device *kbdev);
209 };
210
211 /**
212  * kbase_cpuprops_get_default_clock_speed - default for CPU_SPEED_FUNC
213  * @clock_speed - see  kbase_cpu_clk_speed_func for details on the parameters
214  *
215  * Returns 0 on success, negative error code otherwise.
216  *
217  * Default implementation of CPU_SPEED_FUNC. This function sets clock_speed
218  * to 100, so will be an underestimate for any real system.
219  */
220 int kbase_cpuprops_get_default_clock_speed(u32 * const clock_speed);
221
222 /**
223  * kbase_cpu_clk_speed_func - Type of the function pointer for CPU_SPEED_FUNC
224  * @param clock_speed - pointer to store the current CPU clock speed in MHz
225  *
226  * Returns 0 on success, otherwise negative error code.
227  *
228  * This is mainly used to implement OpenCL's clGetDeviceInfo().
229  */
230 typedef int (*kbase_cpu_clk_speed_func) (u32 *clock_speed);
231
232 /**
233  * kbase_gpu_clk_speed_func - Type of the function pointer for GPU_SPEED_FUNC
234  * @param clock_speed - pointer to store the current GPU clock speed in MHz
235  *
236  * Returns 0 on success, otherwise negative error code.
237  * When an error is returned the caller assumes maximum GPU speed stored in
238  * gpu_freq_khz_max.
239  *
240  * If the system timer is not available then this function is required
241  * for the OpenCL queue profiling to return correct timing information.
242  *
243  */
244 typedef int (*kbase_gpu_clk_speed_func) (u32 *clock_speed);
245
246 #ifdef CONFIG_OF
247 struct kbase_platform_config {
248 };
249 #else
250
251 /*
252  * @brief Specifies start and end of I/O memory region.
253  */
254 struct kbase_io_memory_region {
255         u64 start;
256         u64 end;
257 };
258
259 /*
260  * @brief Specifies I/O related resources like IRQs and memory region for I/O operations.
261  */
262 struct kbase_io_resources {
263         u32                      job_irq_number;
264         u32                      mmu_irq_number;
265         u32                      gpu_irq_number;
266         struct kbase_io_memory_region io_memory_region;
267 };
268
269 struct kbase_platform_config {
270         const struct kbase_io_resources *io_resources;
271 };
272
273 #endif /* CONFIG_OF */
274
275 /**
276  * @brief Gets the pointer to platform config.
277  *
278  * @return Pointer to the platform config
279  */
280 struct kbase_platform_config *kbase_get_platform_config(void);
281
282 /**
283  * kbasep_platform_device_init: - Platform specific call to initialize hardware
284  * @kbdev: kbase device pointer
285  *
286  * Function calls a platform defined routine if specified in the configuration
287  * attributes.  The routine can initialize any hardware and context state that
288  * is required for the GPU block to function.
289  *
290  * Return: 0 if no errors have been found in the config.
291  *         Negative error code otherwise.
292  */
293 int kbasep_platform_device_init(struct kbase_device *kbdev);
294
295 /**
296  * kbasep_platform_device_term - Platform specific call to terminate hardware
297  * @kbdev: Kbase device pointer
298  *
299  * Function calls a platform defined routine if specified in the configuration
300  * attributes. The routine can destroy any platform specific context state and
301  * shut down any hardware functionality that are outside of the Power Management
302  * callbacks.
303  *
304  */
305 void kbasep_platform_device_term(struct kbase_device *kbdev);
306
307
308 /**
309  * kbase_platform_early_init - Early initialisation of the platform code
310  *
311  * This function will be called when the module is loaded to perform any
312  * early initialisation required by the platform code. Such as reading
313  * platform specific device tree entries for the GPU.
314  *
315  * Return: 0 for success, any other fail causes module initialisation to fail
316  */
317 int kbase_platform_early_init(void);
318
319 #ifndef CONFIG_OF
320 #ifdef CONFIG_MALI_PLATFORM_FAKE
321 /**
322  * kbase_platform_fake_register - Register a platform device for the GPU
323  *
324  * This can be used to register a platform device on systems where device tree
325  * is not enabled and the platform initialisation code in the kernel doesn't
326  * create the GPU device. Where possible device tree should be used instead.
327  *
328  * Return: 0 for success, any other fail causes module initialisation to fail
329  */
330 int kbase_platform_fake_register(void);
331
332 /**
333  * kbase_platform_fake_unregister - Unregister a fake platform device
334  *
335  * Unregister the platform device created with kbase_platform_fake_register()
336  */
337 void kbase_platform_fake_unregister(void);
338 #endif
339 #endif
340
341           /** @} *//* end group kbase_config */
342           /** @} *//* end group base_kbase_api */
343           /** @} *//* end group base_api */
344
345 #endif                          /* _KBASE_CONFIG_H_ */