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