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
12struct 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 */
22struct 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 */
40typedef 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 */
54int 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 */
65void 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 */
79int 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 */
99struct ipu_image_convert_ctx *
100ipu_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 */
119void 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 */
139int 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 */
150void 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 */
172struct ipu_image_convert_run *
173ipu_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 */
193int 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

source code of linux/include/video/imx-ipu-image-convert.h