• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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) (const 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 */
187