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 */
189