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