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