• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2015-2016 MediaTek Inc.
3  * Author: Houlong Wei <houlong.wei@mediatek.com>
4  *         Ming Hsiu Tsai <minghsiu.tsai@mediatek.com>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  */
15 
16 #ifndef __MTK_MDP_CORE_H__
17 #define __MTK_MDP_CORE_H__
18 
19 #include <linux/videodev2.h>
20 #include <media/v4l2-ctrls.h>
21 #include <media/v4l2-device.h>
22 #include <media/v4l2-mem2mem.h>
23 #include <media/videobuf2-core.h>
24 #include <media/videobuf2-dma-contig.h>
25 
26 #include "mtk_mdp_vpu.h"
27 #include "mtk_mdp_comp.h"
28 
29 
30 #define MTK_MDP_MODULE_NAME		"mtk-mdp"
31 
32 #define MTK_MDP_SHUTDOWN_TIMEOUT	((100*HZ)/1000) /* 100ms */
33 #define MTK_MDP_MAX_CTRL_NUM		10
34 
35 #define MTK_MDP_FMT_FLAG_OUTPUT		BIT(0)
36 #define MTK_MDP_FMT_FLAG_CAPTURE	BIT(1)
37 
38 #define MTK_MDP_VPU_INIT		BIT(0)
39 #define MTK_MDP_SRC_FMT			BIT(1)
40 #define MTK_MDP_DST_FMT			BIT(2)
41 #define MTK_MDP_CTX_ERROR		BIT(5)
42 
43 /**
44  *  struct mtk_mdp_pix_align - alignement of image
45  *  @org_w: source alignment of width
46  *  @org_h: source alignment of height
47  *  @target_w: dst alignment of width
48  *  @target_h: dst alignment of height
49  */
50 struct mtk_mdp_pix_align {
51 	u16 org_w;
52 	u16 org_h;
53 	u16 target_w;
54 	u16 target_h;
55 };
56 
57 /**
58  * struct mtk_mdp_fmt - the driver's internal color format data
59  * @pixelformat: the fourcc code for this format, 0 if not applicable
60  * @num_planes: number of physically non-contiguous data planes
61  * @num_comp: number of logical data planes
62  * @depth: per plane driver's private 'number of bits per pixel'
63  * @row_depth: per plane driver's private 'number of bits per pixel per row'
64  * @flags: flags indicating which operation mode format applies to
65 	   MTK_MDP_FMT_FLAG_OUTPUT is used in OUTPUT stream
66 	   MTK_MDP_FMT_FLAG_CAPTURE is used in CAPTURE stream
67  * @align: pointer to a pixel alignment struct, NULL if using default value
68  */
69 struct mtk_mdp_fmt {
70 	u32	pixelformat;
71 	u16	num_planes;
72 	u16	num_comp;
73 	u8	depth[VIDEO_MAX_PLANES];
74 	u8	row_depth[VIDEO_MAX_PLANES];
75 	u32	flags;
76 	struct mtk_mdp_pix_align *align;
77 };
78 
79 /**
80  * struct mtk_mdp_addr - the image processor physical address set
81  * @addr:	address of planes
82  */
83 struct mtk_mdp_addr {
84 	dma_addr_t addr[MTK_MDP_MAX_NUM_PLANE];
85 };
86 
87 /* struct mtk_mdp_ctrls - the image processor control set
88  * @rotate: rotation degree
89  * @hflip: horizontal flip
90  * @vflip: vertical flip
91  * @global_alpha: the alpha value of current frame
92  */
93 struct mtk_mdp_ctrls {
94 	struct v4l2_ctrl *rotate;
95 	struct v4l2_ctrl *hflip;
96 	struct v4l2_ctrl *vflip;
97 	struct v4l2_ctrl *global_alpha;
98 };
99 
100 /**
101  * struct mtk_mdp_frame - source/target frame properties
102  * @width:	SRC : SRCIMG_WIDTH, DST : OUTPUTDMA_WHOLE_IMG_WIDTH
103  * @height:	SRC : SRCIMG_HEIGHT, DST : OUTPUTDMA_WHOLE_IMG_HEIGHT
104  * @crop:	cropped(source)/scaled(destination) size
105  * @payload:	image size in bytes (w x h x bpp)
106  * @pitch:	bytes per line of image in memory
107  * @addr:	image frame buffer physical addresses
108  * @fmt:	color format pointer
109  * @alpha:	frame's alpha value
110  */
111 struct mtk_mdp_frame {
112 	u32				width;
113 	u32				height;
114 	struct v4l2_rect		crop;
115 	unsigned long			payload[VIDEO_MAX_PLANES];
116 	unsigned int			pitch[VIDEO_MAX_PLANES];
117 	struct mtk_mdp_addr		addr;
118 	const struct mtk_mdp_fmt	*fmt;
119 	u8				alpha;
120 };
121 
122 /**
123  * struct mtk_mdp_variant - image processor variant information
124  * @pix_max:		maximum limit of image size
125  * @pix_min:		minimun limit of image size
126  * @pix_align:		alignement of image
127  * @h_scale_up_max:	maximum scale-up in horizontal
128  * @v_scale_up_max:	maximum scale-up in vertical
129  * @h_scale_down_max:	maximum scale-down in horizontal
130  * @v_scale_down_max:	maximum scale-down in vertical
131  */
132 struct mtk_mdp_variant {
133 	struct mtk_mdp_pix_limit	*pix_max;
134 	struct mtk_mdp_pix_limit	*pix_min;
135 	struct mtk_mdp_pix_align	*pix_align;
136 	u16				h_scale_up_max;
137 	u16				v_scale_up_max;
138 	u16				h_scale_down_max;
139 	u16				v_scale_down_max;
140 };
141 
142 /**
143  * struct mtk_mdp_dev - abstraction for image processor entity
144  * @lock:	the mutex protecting this data structure
145  * @vpulock:	the mutex protecting the communication with VPU
146  * @pdev:	pointer to the image processor platform device
147  * @variant:	the IP variant information
148  * @id:		image processor device index (0..MTK_MDP_MAX_DEVS)
149  * @comp:	MDP function components
150  * @m2m_dev:	v4l2 memory-to-memory device data
151  * @ctx_list:	list of struct mtk_mdp_ctx
152  * @vdev:	video device for image processor driver
153  * @v4l2_dev:	V4L2 device to register video devices for.
154  * @job_wq:	processor work queue
155  * @vpu_dev:	VPU platform device
156  * @ctx_num:	counter of active MTK MDP context
157  * @id_counter:	An integer id given to the next opened context
158  * @wdt_wq:	work queue for VPU watchdog
159  * @wdt_work:	worker for VPU watchdog
160  */
161 struct mtk_mdp_dev {
162 	struct mutex			lock;
163 	struct mutex			vpulock;
164 	struct platform_device		*pdev;
165 	struct mtk_mdp_variant		*variant;
166 	u16				id;
167 	struct mtk_mdp_comp		*comp[MTK_MDP_COMP_ID_MAX];
168 	struct v4l2_m2m_dev		*m2m_dev;
169 	struct list_head		ctx_list;
170 	struct video_device		*vdev;
171 	struct v4l2_device		v4l2_dev;
172 	struct workqueue_struct		*job_wq;
173 	struct platform_device		*vpu_dev;
174 	int				ctx_num;
175 	unsigned long			id_counter;
176 	struct workqueue_struct		*wdt_wq;
177 	struct work_struct		wdt_work;
178 };
179 
180 /**
181  * mtk_mdp_ctx - the device context data
182  * @list:		link to ctx_list of mtk_mdp_dev
183  * @s_frame:		source frame properties
184  * @d_frame:		destination frame properties
185  * @id:			index of the context that this structure describes
186  * @flags:		additional flags for image conversion
187  * @state:		flags to keep track of user configuration
188 			Protected by slock
189  * @rotation:		rotates the image by specified angle
190  * @hflip:		mirror the picture horizontally
191  * @vflip:		mirror the picture vertically
192  * @mdp_dev:		the image processor device this context applies to
193  * @m2m_ctx:		memory-to-memory device context
194  * @fh:			v4l2 file handle
195  * @ctrl_handler:	v4l2 controls handler
196  * @ctrls		image processor control set
197  * @ctrls_rdy:		true if the control handler is initialized
198  * @colorspace:		enum v4l2_colorspace; supplemental to pixelformat
199  * @ycbcr_enc:		enum v4l2_ycbcr_encoding, Y'CbCr encoding
200  * @xfer_func:		enum v4l2_xfer_func, colorspace transfer function
201  * @quant:		enum v4l2_quantization, colorspace quantization
202  * @vpu:		VPU instance
203  * @slock:		the mutex protecting mtp_mdp_ctx.state
204  * @work:		worker for image processing
205  */
206 struct mtk_mdp_ctx {
207 	struct list_head		list;
208 	struct mtk_mdp_frame		s_frame;
209 	struct mtk_mdp_frame		d_frame;
210 	u32				flags;
211 	u32				state;
212 	int				id;
213 	int				rotation;
214 	u32				hflip:1;
215 	u32				vflip:1;
216 	struct mtk_mdp_dev		*mdp_dev;
217 	struct v4l2_m2m_ctx		*m2m_ctx;
218 	struct v4l2_fh			fh;
219 	struct v4l2_ctrl_handler	ctrl_handler;
220 	struct mtk_mdp_ctrls		ctrls;
221 	bool				ctrls_rdy;
222 	enum v4l2_colorspace		colorspace;
223 	enum v4l2_ycbcr_encoding	ycbcr_enc;
224 	enum v4l2_xfer_func		xfer_func;
225 	enum v4l2_quantization		quant;
226 
227 	struct mtk_mdp_vpu		vpu;
228 	struct mutex			slock;
229 	struct work_struct		work;
230 };
231 
232 extern int mtk_mdp_dbg_level;
233 
234 #if defined(DEBUG)
235 
236 #define mtk_mdp_dbg(level, fmt, args...)				 \
237 	do {								 \
238 		if (mtk_mdp_dbg_level >= level)				 \
239 			pr_info("[MTK_MDP] level=%d %s(),%d: " fmt "\n", \
240 				level, __func__, __LINE__, ##args);	 \
241 	} while (0)
242 
243 #define mtk_mdp_err(fmt, args...)					\
244 	pr_err("[MTK_MDP][ERROR] %s:%d: " fmt "\n", __func__, __LINE__, \
245 	       ##args)
246 
247 
248 #define mtk_mdp_dbg_enter()  mtk_mdp_dbg(3, "+")
249 #define mtk_mdp_dbg_leave()  mtk_mdp_dbg(3, "-")
250 
251 #else
252 
253 #define mtk_mdp_dbg(level, fmt, args...) {}
254 #define mtk_mdp_err(fmt, args...)
255 #define mtk_mdp_dbg_enter()
256 #define mtk_mdp_dbg_leave()
257 
258 #endif
259 
260 #endif /* __MTK_MDP_CORE_H__ */
261