linux/include/video/imx-ipu-image-convert.h
<<
>>
Prefs
   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