GNU Linux-libre 4.19.264-gnu1
[releases.git] / drivers / media / platform / mtk-vpu / mtk_vpu.h
1 /*
2 * Copyright (c) 2016 MediaTek Inc.
3 * Author: Andrew-CT Chen <andrew-ct.chen@mediatek.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 * GNU General Public License for more details.
13 */
14
15 #ifndef _MTK_VPU_H
16 #define _MTK_VPU_H
17
18 #include <linux/platform_device.h>
19
20 /**
21  * VPU (video processor unit) is a tiny processor controlling video hardware
22  * related to video codec, scaling and color format converting.
23  * VPU interfaces with other blocks by share memory and interrupt.
24  **/
25
26 typedef void (*ipi_handler_t) (void *data,
27                                unsigned int len,
28                                void *priv);
29
30 /**
31  * enum ipi_id - the id of inter-processor interrupt
32  *
33  * @IPI_VPU_INIT:        The interrupt from vpu is to notfiy kernel
34  *                       VPU initialization completed.
35  *                       IPI_VPU_INIT is sent from VPU when firmware is
36  *                       loaded. AP doesn't need to send IPI_VPU_INIT
37  *                       command to VPU.
38  *                       For other IPI below, AP should send the request
39  *                       to VPU to trigger the interrupt.
40  * @IPI_VDEC_H264:       The interrupt from vpu is to notify kernel to
41  *                       handle H264 vidoe decoder job, and vice versa.
42  *                       Decode output format is always MT21 no matter what
43  *                       the input format is.
44  * @IPI_VDEC_VP8:        The interrupt from is to notify kernel to
45  *                       handle VP8 video decoder job, and vice versa.
46  *                       Decode output format is always MT21 no matter what
47  *                       the input format is.
48  * @IPI_VDEC_VP9:        The interrupt from vpu is to notify kernel to
49  *                       handle VP9 video decoder job, and vice versa.
50  *                       Decode output format is always MT21 no matter what
51  *                       the input format is.
52  * @IPI_VENC_H264:       The interrupt from vpu is to notify kernel to
53  *                       handle H264 video encoder job, and vice versa.
54  * @IPI_VENC_VP8:        The interrupt fro vpu is to notify kernel to
55  *                       handle VP8 video encoder job,, and vice versa.
56  * @IPI_MDP:             The interrupt from vpu is to notify kernel to
57  *                       handle MDP (Media Data Path) job, and vice versa.
58  * @IPI_MAX:             The maximum IPI number
59  */
60
61 enum ipi_id {
62         IPI_VPU_INIT = 0,
63         IPI_VDEC_H264,
64         IPI_VDEC_VP8,
65         IPI_VDEC_VP9,
66         IPI_VENC_H264,
67         IPI_VENC_VP8,
68         IPI_MDP,
69         IPI_MAX,
70 };
71
72 /**
73  * enum rst_id - reset id to register reset function for VPU watchdog timeout
74  *
75  * @VPU_RST_ENC: encoder reset id
76  * @VPU_RST_DEC: decoder reset id
77  * @VPU_RST_MDP: MDP (Media Data Path) reset id
78  * @VPU_RST_MAX: maximum reset id
79  */
80 enum rst_id {
81         VPU_RST_ENC,
82         VPU_RST_DEC,
83         VPU_RST_MDP,
84         VPU_RST_MAX,
85 };
86
87 /**
88  * vpu_ipi_register - register an ipi function
89  *
90  * @pdev:       VPU platform device
91  * @id:         IPI ID
92  * @handler:    IPI handler
93  * @name:       IPI name
94  * @priv:       private data for IPI handler
95  *
96  * Register an ipi function to receive ipi interrupt from VPU.
97  *
98  * Return: Return 0 if ipi registers successfully, otherwise it is failed.
99  */
100 int vpu_ipi_register(struct platform_device *pdev, enum ipi_id id,
101                      ipi_handler_t handler, const char *name, void *priv);
102
103 /**
104  * vpu_ipi_send - send data from AP to vpu.
105  *
106  * @pdev:       VPU platform device
107  * @id:         IPI ID
108  * @buf:        the data buffer
109  * @len:        the data buffer length
110  *
111  * This function is thread-safe. When this function returns,
112  * VPU has received the data and starts the processing.
113  * When the processing completes, IPI handler registered
114  * by vpu_ipi_register will be called in interrupt context.
115  *
116  * Return: Return 0 if sending data successfully, otherwise it is failed.
117  **/
118 int vpu_ipi_send(struct platform_device *pdev,
119                  enum ipi_id id, void *buf,
120                  unsigned int len);
121
122 /**
123  * vpu_get_plat_device - get VPU's platform device
124  *
125  * @pdev:       the platform device of the module requesting VPU platform
126  *              device for using VPU API.
127  *
128  * Return: Return NULL if it is failed.
129  * otherwise it is VPU's platform device
130  **/
131 struct platform_device *vpu_get_plat_device(struct platform_device *pdev);
132
133 /**
134  * vpu_wdt_reg_handler - register a VPU watchdog handler
135  *
136  * @pdev:               VPU platform device
137  * @vpu_wdt_reset_func: the callback reset function
138  * @private_data:       the private data for reset function
139  * @rst_id:             reset id
140  *
141  * Register a handler performing own tasks when vpu reset by watchdog
142  *
143  * Return: Return 0 if the handler is added successfully,
144  * otherwise it is failed.
145  *
146  **/
147 int vpu_wdt_reg_handler(struct platform_device *pdev,
148                         void vpu_wdt_reset_func(void *),
149                         void *priv, enum rst_id id);
150
151 /**
152  * vpu_get_vdec_hw_capa - get video decoder hardware capability
153  *
154  * @pdev:       VPU platform device
155  *
156  * Return: video decoder hardware capability
157  **/
158 unsigned int vpu_get_vdec_hw_capa(struct platform_device *pdev);
159
160 /**
161  * vpu_get_venc_hw_capa - get video encoder hardware capability
162  *
163  * @pdev:       VPU platform device
164  *
165  * Return: video encoder hardware capability
166  **/
167 unsigned int vpu_get_venc_hw_capa(struct platform_device *pdev);
168
169 /**
170  * vpu_load_firmware - download VPU firmware and boot it
171  *
172  * @pdev:       VPU platform device
173  *
174  * Return: Return 0 if downloading firmware successfully,
175  * otherwise it is failed
176  **/
177 int vpu_load_firmware(struct platform_device *pdev);
178
179 /**
180  * vpu_mapping_dm_addr - Mapping DTCM/DMEM to kernel virtual address
181  *
182  * @pdev:       VPU platform device
183  * @dmem_addr:  VPU's data memory address
184  *
185  * Mapping the VPU's DTCM (Data Tightly-Coupled Memory) /
186  * DMEM (Data Extended Memory) memory address to
187  * kernel virtual address.
188  *
189  * Return: Return ERR_PTR(-EINVAL) if mapping failed,
190  * otherwise the mapped kernel virtual address
191  **/
192 void *vpu_mapping_dm_addr(struct platform_device *pdev,
193                           u32 dtcm_dmem_addr);
194 #endif /* _MTK_VPU_H */