1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Copyright (C) 2012-2016 Mentor Graphics Inc.
4  *
5  * i.MX Queued image conversion support, with tiling and rotation.
6  */
7 #ifndef __IMX_IPU_IMAGE_CONVERT_H__
8 #define __IMX_IPU_IMAGE_CONVERT_H__
9 
10 #include <video/imx-ipu-v3.h>
11 
12 struct ipu_image_convert_ctx;
13 
14 /**
15  * struct ipu_image_convert_run - image conversion run request struct
16  *
17  * @ctx:	the conversion context
18  * @in_phys:	dma addr of input image buffer for this run
19  * @out_phys:	dma addr of output image buffer for this run
20  * @status:	completion status of this run
21  */
22 struct ipu_image_convert_run {
23 	struct ipu_image_convert_ctx *ctx;
24 
25 	dma_addr_t in_phys;
26 	dma_addr_t out_phys;
27 
28 	int status;
29 
30 	/* internal to image converter, callers don't touch */
31 	struct list_head list;
32 };
33 
34 /**
35  * ipu_image_convert_cb_t - conversion callback function prototype
36  *
37  * @run:	the completed conversion run pointer
38  * @ctx:	a private context pointer for the callback
39  */
40 typedef void (*ipu_image_convert_cb_t)(struct ipu_image_convert_run *run,
41 				       void *ctx);
42 
43 /**
44  * ipu_image_convert_enum_format() - enumerate the image converter's
45  *	supported input and output pixel formats.
46  *
47  * @index:	pixel format index
48  * @fourcc:	v4l2 fourcc for this index
49  *
50  * Returns 0 with a valid index and fills in v4l2 fourcc, -EINVAL otherwise.
51  *
52  * In V4L2, drivers can call ipu_image_enum_format() in .enum_fmt.
53  */
54 int ipu_image_convert_enum_format(int index, u32 *fourcc);
55 
56 /**
57  * ipu_image_convert_adjust() - adjust input/output images to IPU restrictions.
58  *
59  * @in:		input image format, adjusted on return
60  * @out:	output image format, adjusted on return
61  * @rot_mode:	rotation mode
62  *
63  * In V4L2, drivers can call ipu_image_convert_adjust() in .try_fmt.
64  */
65 void ipu_image_convert_adjust(struct ipu_image *in, struct ipu_image *out,
66 			      enum ipu_rotate_mode rot_mode);
67 
68 /**
69  * ipu_image_convert_verify() - verify that input/output image formats
70  *         and rotation mode meet IPU restrictions.
71  *
72  * @in:		input image format
73  * @out:	output image format
74  * @rot_mode:	rotation mode
75  *
76  * Returns 0 if the formats and rotation mode meet IPU restrictions,
77  * -EINVAL otherwise.
78  */
79 int ipu_image_convert_verify(struct ipu_image *in, struct ipu_image *out,
80 			     enum ipu_rotate_mode rot_mode);
81 
82 /**
83  * ipu_image_convert_prepare() - prepare a conversion context.
84  *
85  * @ipu:	the IPU handle to use for the conversions
86  * @ic_task:	the IC task to use for the conversions
87  * @in:		input image format
88  * @out:	output image format
89  * @rot_mode:	rotation mode
90  * @complete:	run completion callback
91  * @complete_context:	a context pointer for the completion callback
92  *
93  * Returns an opaque conversion context pointer on success, error pointer
94  * on failure. The input/output formats and rotation mode must already meet
95  * IPU retrictions.
96  *
97  * In V4L2, drivers should call ipu_image_convert_prepare() at streamon.
98  */
99 struct ipu_image_convert_ctx *
100 ipu_image_convert_prepare(struct ipu_soc *ipu, enum ipu_ic_task ic_task,
101 			  struct ipu_image *in, struct ipu_image *out,
102 			  enum ipu_rotate_mode rot_mode,
103 			  ipu_image_convert_cb_t complete,
104 			  void *complete_context);
105 
106 /**
107  * ipu_image_convert_unprepare() - unprepare a conversion context.
108  *
109  * @ctx: the conversion context pointer to unprepare
110  *
111  * Aborts any active or pending conversions for this context and
112  * frees the context. Any currently active or pending runs belonging
113  * to this context are returned via the completion callback with an
114  * error run status.
115  *
116  * In V4L2, drivers should call ipu_image_convert_unprepare() at
117  * streamoff.
118  */
119 void ipu_image_convert_unprepare(struct ipu_image_convert_ctx *ctx);
120 
121 /**
122  * ipu_image_convert_queue() - queue a conversion run
123  *
124  * @run: the run request pointer
125  *
126  * ipu_image_convert_run must be dynamically allocated (_not_ as a local
127  * var) by callers and filled in with a previously prepared conversion
128  * context handle and the dma addr's of the input and output image buffers
129  * for this conversion run.
130  *
131  * When this conversion completes, the run pointer is returned via the
132  * completion callback. The caller is responsible for freeing the run
133  * object after it completes.
134  *
135  * In V4L2, drivers should call ipu_image_convert_queue() while
136  * streaming to queue the conversion of a received input buffer.
137  * For example mem2mem devices this would be called in .device_run.
138  */
139 int ipu_image_convert_queue(struct ipu_image_convert_run *run);
140 
141 /**
142  * ipu_image_convert_abort() - abort conversions
143  *
144  * @ctx: the conversion context pointer
145  *
146  * This will abort any active or pending conversions for this context.
147  * Any currently active or pending runs belonging to this context are
148  * returned via the completion callback with an error run status.
149  */
150 void ipu_image_convert_abort(struct ipu_image_convert_ctx *ctx);
151 
152 /**
153  * ipu_image_convert() - asynchronous image conversion request
154  *
155  * @ipu:	the IPU handle to use for the conversion
156  * @ic_task:	the IC task to use for the conversion
157  * @in:		input image format
158  * @out:	output image format
159  * @rot_mode:	rotation mode
160  * @complete:	run completion callback
161  * @complete_context:	a context pointer for the completion callback
162  *
163  * Request a single image conversion. Returns the run that has been queued.
164  * A conversion context is automatically created and is available in run->ctx.
165  * As with ipu_image_convert_prepare(), the input/output formats and rotation
166  * mode must already meet IPU retrictions.
167  *
168  * On successful return the caller can queue more run requests if needed, using
169  * the prepared context in run->ctx. The caller is responsible for unpreparing
170  * the context when no more conversion requests are needed.
171  */
172 struct ipu_image_convert_run *
173 ipu_image_convert(struct ipu_soc *ipu, enum ipu_ic_task ic_task,
174 		  struct ipu_image *in, struct ipu_image *out,
175 		  enum ipu_rotate_mode rot_mode,
176 		  ipu_image_convert_cb_t complete,
177 		  void *complete_context);
178 
179 /**
180  * ipu_image_convert_sync() - synchronous single image conversion request
181  *
182  * @ipu:	the IPU handle to use for the conversion
183  * @ic_task:	the IC task to use for the conversion
184  * @in:		input image format
185  * @out:	output image format
186  * @rot_mode:	rotation mode
187  *
188  * Carry out a single image conversion. Returns when the conversion
189  * completes. The input/output formats and rotation mode must already
190  * meet IPU retrictions. The created context is automatically unprepared
191  * and the run freed on return.
192  */
193 int ipu_image_convert_sync(struct ipu_soc *ipu, enum ipu_ic_task ic_task,
194 			   struct ipu_image *in, struct ipu_image *out,
195 			   enum ipu_rotate_mode rot_mode);
196 
197 
198 #endif /* __IMX_IPU_IMAGE_CONVERT_H__ */
199