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