root/drivers/media/platform/ti-vpe/vpe.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. __find_format
  2. find_format
  3. get_q_data
  4. read_reg
  5. write_reg
  6. get_field
  7. read_field_reg
  8. write_field
  9. write_field_reg
  10. init_adb_hdrs
  11. realloc_mv_buffers
  12. free_mv_buffers
  13. free_vbs
  14. vpe_set_clock_enable
  15. vpe_top_reset
  16. vpe_top_vpdma_reset
  17. set_us_coefficients
  18. set_cfg_modes
  19. set_line_modes
  20. set_src_registers
  21. set_dst_registers
  22. set_dei_regs
  23. set_dei_shadow_registers
  24. config_edi_input_mode
  25. set_srcdst_params
  26. file2ctx
  27. job_ready
  28. job_abort
  29. vpe_dump_regs
  30. add_out_dtd
  31. add_in_dtd
  32. enable_irqs
  33. disable_irqs
  34. device_run
  35. dei_error
  36. ds1_uv_error
  37. vpe_irq
  38. vpe_querycap
  39. __enum_fmt
  40. vpe_enum_fmt
  41. vpe_g_fmt
  42. __vpe_try_fmt
  43. vpe_try_fmt
  44. __vpe_s_fmt
  45. vpe_s_fmt
  46. __vpe_try_selection
  47. vpe_g_selection
  48. vpe_s_selection
  49. vpe_s_ctrl
  50. vpe_queue_setup
  51. vpe_buf_prepare
  52. vpe_buf_queue
  53. check_srcdst_sizes
  54. vpe_return_all_buffers
  55. vpe_start_streaming
  56. vpe_stop_streaming
  57. queue_init
  58. vpe_open
  59. vpe_release
  60. vpe_runtime_get
  61. vpe_runtime_put
  62. vpe_fw_cb
  63. vpe_probe
  64. vpe_remove

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * TI VPE mem2mem driver, based on the virtual v4l2-mem2mem example driver
   4  *
   5  * Copyright (c) 2013 Texas Instruments Inc.
   6  * David Griego, <dagriego@biglakesoftware.com>
   7  * Dale Farnsworth, <dale@farnsworth.org>
   8  * Archit Taneja, <archit@ti.com>
   9  *
  10  * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
  11  * Pawel Osciak, <pawel@osciak.com>
  12  * Marek Szyprowski, <m.szyprowski@samsung.com>
  13  *
  14  * Based on the virtual v4l2-mem2mem example device
  15  */
  16 
  17 #include <linux/delay.h>
  18 #include <linux/dma-mapping.h>
  19 #include <linux/err.h>
  20 #include <linux/fs.h>
  21 #include <linux/interrupt.h>
  22 #include <linux/io.h>
  23 #include <linux/ioctl.h>
  24 #include <linux/module.h>
  25 #include <linux/of.h>
  26 #include <linux/platform_device.h>
  27 #include <linux/pm_runtime.h>
  28 #include <linux/sched.h>
  29 #include <linux/slab.h>
  30 #include <linux/videodev2.h>
  31 #include <linux/log2.h>
  32 #include <linux/sizes.h>
  33 
  34 #include <media/v4l2-common.h>
  35 #include <media/v4l2-ctrls.h>
  36 #include <media/v4l2-device.h>
  37 #include <media/v4l2-event.h>
  38 #include <media/v4l2-ioctl.h>
  39 #include <media/v4l2-mem2mem.h>
  40 #include <media/videobuf2-v4l2.h>
  41 #include <media/videobuf2-dma-contig.h>
  42 
  43 #include "vpdma.h"
  44 #include "vpdma_priv.h"
  45 #include "vpe_regs.h"
  46 #include "sc.h"
  47 #include "csc.h"
  48 
  49 #define VPE_MODULE_NAME "vpe"
  50 
  51 /* minimum and maximum frame sizes */
  52 #define MIN_W           32
  53 #define MIN_H           32
  54 #define MAX_W           2048
  55 #define MAX_H           1184
  56 
  57 /* required alignments */
  58 #define S_ALIGN         0       /* multiple of 1 */
  59 #define H_ALIGN         1       /* multiple of 2 */
  60 
  61 /* flags that indicate a format can be used for capture/output */
  62 #define VPE_FMT_TYPE_CAPTURE    (1 << 0)
  63 #define VPE_FMT_TYPE_OUTPUT     (1 << 1)
  64 
  65 /* used as plane indices */
  66 #define VPE_MAX_PLANES  2
  67 #define VPE_LUMA        0
  68 #define VPE_CHROMA      1
  69 
  70 /* per m2m context info */
  71 #define VPE_MAX_SRC_BUFS        3       /* need 3 src fields to de-interlace */
  72 
  73 #define VPE_DEF_BUFS_PER_JOB    1       /* default one buffer per batch job */
  74 
  75 /*
  76  * each VPE context can need up to 3 config descriptors, 7 input descriptors,
  77  * 3 output descriptors, and 10 control descriptors
  78  */
  79 #define VPE_DESC_LIST_SIZE      (10 * VPDMA_DTD_DESC_SIZE +     \
  80                                         13 * VPDMA_CFD_CTD_DESC_SIZE)
  81 
  82 #define vpe_dbg(vpedev, fmt, arg...)    \
  83                 dev_dbg((vpedev)->v4l2_dev.dev, fmt, ##arg)
  84 #define vpe_err(vpedev, fmt, arg...)    \
  85                 dev_err((vpedev)->v4l2_dev.dev, fmt, ##arg)
  86 
  87 struct vpe_us_coeffs {
  88         unsigned short  anchor_fid0_c0;
  89         unsigned short  anchor_fid0_c1;
  90         unsigned short  anchor_fid0_c2;
  91         unsigned short  anchor_fid0_c3;
  92         unsigned short  interp_fid0_c0;
  93         unsigned short  interp_fid0_c1;
  94         unsigned short  interp_fid0_c2;
  95         unsigned short  interp_fid0_c3;
  96         unsigned short  anchor_fid1_c0;
  97         unsigned short  anchor_fid1_c1;
  98         unsigned short  anchor_fid1_c2;
  99         unsigned short  anchor_fid1_c3;
 100         unsigned short  interp_fid1_c0;
 101         unsigned short  interp_fid1_c1;
 102         unsigned short  interp_fid1_c2;
 103         unsigned short  interp_fid1_c3;
 104 };
 105 
 106 /*
 107  * Default upsampler coefficients
 108  */
 109 static const struct vpe_us_coeffs us_coeffs[] = {
 110         {
 111                 /* Coefficients for progressive input */
 112                 0x00C8, 0x0348, 0x0018, 0x3FD8, 0x3FB8, 0x0378, 0x00E8, 0x3FE8,
 113                 0x00C8, 0x0348, 0x0018, 0x3FD8, 0x3FB8, 0x0378, 0x00E8, 0x3FE8,
 114         },
 115         {
 116                 /* Coefficients for Top Field Interlaced input */
 117                 0x0051, 0x03D5, 0x3FE3, 0x3FF7, 0x3FB5, 0x02E9, 0x018F, 0x3FD3,
 118                 /* Coefficients for Bottom Field Interlaced input */
 119                 0x016B, 0x0247, 0x00B1, 0x3F9D, 0x3FCF, 0x03DB, 0x005D, 0x3FF9,
 120         },
 121 };
 122 
 123 /*
 124  * the following registers are for configuring some of the parameters of the
 125  * motion and edge detection blocks inside DEI, these generally remain the same,
 126  * these could be passed later via userspace if some one needs to tweak these.
 127  */
 128 struct vpe_dei_regs {
 129         unsigned long mdt_spacial_freq_thr_reg;         /* VPE_DEI_REG2 */
 130         unsigned long edi_config_reg;                   /* VPE_DEI_REG3 */
 131         unsigned long edi_lut_reg0;                     /* VPE_DEI_REG4 */
 132         unsigned long edi_lut_reg1;                     /* VPE_DEI_REG5 */
 133         unsigned long edi_lut_reg2;                     /* VPE_DEI_REG6 */
 134         unsigned long edi_lut_reg3;                     /* VPE_DEI_REG7 */
 135 };
 136 
 137 /*
 138  * default expert DEI register values, unlikely to be modified.
 139  */
 140 static const struct vpe_dei_regs dei_regs = {
 141         .mdt_spacial_freq_thr_reg = 0x020C0804u,
 142         .edi_config_reg = 0x0118100Cu,
 143         .edi_lut_reg0 = 0x08040200u,
 144         .edi_lut_reg1 = 0x1010100Cu,
 145         .edi_lut_reg2 = 0x10101010u,
 146         .edi_lut_reg3 = 0x10101010u,
 147 };
 148 
 149 /*
 150  * The port_data structure contains per-port data.
 151  */
 152 struct vpe_port_data {
 153         enum vpdma_channel channel;     /* VPDMA channel */
 154         u8      vb_index;               /* input frame f, f-1, f-2 index */
 155         u8      vb_part;                /* plane index for co-panar formats */
 156 };
 157 
 158 /*
 159  * Define indices into the port_data tables
 160  */
 161 #define VPE_PORT_LUMA1_IN       0
 162 #define VPE_PORT_CHROMA1_IN     1
 163 #define VPE_PORT_LUMA2_IN       2
 164 #define VPE_PORT_CHROMA2_IN     3
 165 #define VPE_PORT_LUMA3_IN       4
 166 #define VPE_PORT_CHROMA3_IN     5
 167 #define VPE_PORT_MV_IN          6
 168 #define VPE_PORT_MV_OUT         7
 169 #define VPE_PORT_LUMA_OUT       8
 170 #define VPE_PORT_CHROMA_OUT     9
 171 #define VPE_PORT_RGB_OUT        10
 172 
 173 static const struct vpe_port_data port_data[11] = {
 174         [VPE_PORT_LUMA1_IN] = {
 175                 .channel        = VPE_CHAN_LUMA1_IN,
 176                 .vb_index       = 0,
 177                 .vb_part        = VPE_LUMA,
 178         },
 179         [VPE_PORT_CHROMA1_IN] = {
 180                 .channel        = VPE_CHAN_CHROMA1_IN,
 181                 .vb_index       = 0,
 182                 .vb_part        = VPE_CHROMA,
 183         },
 184         [VPE_PORT_LUMA2_IN] = {
 185                 .channel        = VPE_CHAN_LUMA2_IN,
 186                 .vb_index       = 1,
 187                 .vb_part        = VPE_LUMA,
 188         },
 189         [VPE_PORT_CHROMA2_IN] = {
 190                 .channel        = VPE_CHAN_CHROMA2_IN,
 191                 .vb_index       = 1,
 192                 .vb_part        = VPE_CHROMA,
 193         },
 194         [VPE_PORT_LUMA3_IN] = {
 195                 .channel        = VPE_CHAN_LUMA3_IN,
 196                 .vb_index       = 2,
 197                 .vb_part        = VPE_LUMA,
 198         },
 199         [VPE_PORT_CHROMA3_IN] = {
 200                 .channel        = VPE_CHAN_CHROMA3_IN,
 201                 .vb_index       = 2,
 202                 .vb_part        = VPE_CHROMA,
 203         },
 204         [VPE_PORT_MV_IN] = {
 205                 .channel        = VPE_CHAN_MV_IN,
 206         },
 207         [VPE_PORT_MV_OUT] = {
 208                 .channel        = VPE_CHAN_MV_OUT,
 209         },
 210         [VPE_PORT_LUMA_OUT] = {
 211                 .channel        = VPE_CHAN_LUMA_OUT,
 212                 .vb_part        = VPE_LUMA,
 213         },
 214         [VPE_PORT_CHROMA_OUT] = {
 215                 .channel        = VPE_CHAN_CHROMA_OUT,
 216                 .vb_part        = VPE_CHROMA,
 217         },
 218         [VPE_PORT_RGB_OUT] = {
 219                 .channel        = VPE_CHAN_RGB_OUT,
 220                 .vb_part        = VPE_LUMA,
 221         },
 222 };
 223 
 224 
 225 /* driver info for each of the supported video formats */
 226 struct vpe_fmt {
 227         u32     fourcc;                 /* standard format identifier */
 228         u8      types;                  /* CAPTURE and/or OUTPUT */
 229         u8      coplanar;               /* set for unpacked Luma and Chroma */
 230         /* vpdma format info for each plane */
 231         struct vpdma_data_format const *vpdma_fmt[VPE_MAX_PLANES];
 232 };
 233 
 234 static struct vpe_fmt vpe_formats[] = {
 235         {
 236                 .fourcc         = V4L2_PIX_FMT_NV16,
 237                 .types          = VPE_FMT_TYPE_CAPTURE | VPE_FMT_TYPE_OUTPUT,
 238                 .coplanar       = 1,
 239                 .vpdma_fmt      = { &vpdma_yuv_fmts[VPDMA_DATA_FMT_Y444],
 240                                     &vpdma_yuv_fmts[VPDMA_DATA_FMT_C444],
 241                                   },
 242         },
 243         {
 244                 .fourcc         = V4L2_PIX_FMT_NV12,
 245                 .types          = VPE_FMT_TYPE_CAPTURE | VPE_FMT_TYPE_OUTPUT,
 246                 .coplanar       = 1,
 247                 .vpdma_fmt      = { &vpdma_yuv_fmts[VPDMA_DATA_FMT_Y420],
 248                                     &vpdma_yuv_fmts[VPDMA_DATA_FMT_C420],
 249                                   },
 250         },
 251         {
 252                 .fourcc         = V4L2_PIX_FMT_YUYV,
 253                 .types          = VPE_FMT_TYPE_CAPTURE | VPE_FMT_TYPE_OUTPUT,
 254                 .coplanar       = 0,
 255                 .vpdma_fmt      = { &vpdma_yuv_fmts[VPDMA_DATA_FMT_YCB422],
 256                                   },
 257         },
 258         {
 259                 .fourcc         = V4L2_PIX_FMT_UYVY,
 260                 .types          = VPE_FMT_TYPE_CAPTURE | VPE_FMT_TYPE_OUTPUT,
 261                 .coplanar       = 0,
 262                 .vpdma_fmt      = { &vpdma_yuv_fmts[VPDMA_DATA_FMT_CBY422],
 263                                   },
 264         },
 265         {
 266                 .fourcc         = V4L2_PIX_FMT_RGB24,
 267                 .types          = VPE_FMT_TYPE_CAPTURE,
 268                 .coplanar       = 0,
 269                 .vpdma_fmt      = { &vpdma_rgb_fmts[VPDMA_DATA_FMT_RGB24],
 270                                   },
 271         },
 272         {
 273                 .fourcc         = V4L2_PIX_FMT_RGB32,
 274                 .types          = VPE_FMT_TYPE_CAPTURE,
 275                 .coplanar       = 0,
 276                 .vpdma_fmt      = { &vpdma_rgb_fmts[VPDMA_DATA_FMT_ARGB32],
 277                                   },
 278         },
 279         {
 280                 .fourcc         = V4L2_PIX_FMT_BGR24,
 281                 .types          = VPE_FMT_TYPE_CAPTURE,
 282                 .coplanar       = 0,
 283                 .vpdma_fmt      = { &vpdma_rgb_fmts[VPDMA_DATA_FMT_BGR24],
 284                                   },
 285         },
 286         {
 287                 .fourcc         = V4L2_PIX_FMT_BGR32,
 288                 .types          = VPE_FMT_TYPE_CAPTURE,
 289                 .coplanar       = 0,
 290                 .vpdma_fmt      = { &vpdma_rgb_fmts[VPDMA_DATA_FMT_ABGR32],
 291                                   },
 292         },
 293         {
 294                 .fourcc         = V4L2_PIX_FMT_RGB565,
 295                 .types          = VPE_FMT_TYPE_CAPTURE,
 296                 .coplanar       = 0,
 297                 .vpdma_fmt      = { &vpdma_rgb_fmts[VPDMA_DATA_FMT_RGB565],
 298                                   },
 299         },
 300         {
 301                 .fourcc         = V4L2_PIX_FMT_RGB555,
 302                 .types          = VPE_FMT_TYPE_CAPTURE,
 303                 .coplanar       = 0,
 304                 .vpdma_fmt      = { &vpdma_rgb_fmts[VPDMA_DATA_FMT_RGBA16_5551],
 305                                   },
 306         },
 307 };
 308 
 309 /*
 310  * per-queue, driver-specific private data.
 311  * there is one source queue and one destination queue for each m2m context.
 312  */
 313 struct vpe_q_data {
 314         unsigned int            width;                          /* frame width */
 315         unsigned int            height;                         /* frame height */
 316         unsigned int            nplanes;                        /* Current number of planes */
 317         unsigned int            bytesperline[VPE_MAX_PLANES];   /* bytes per line in memory */
 318         enum v4l2_colorspace    colorspace;
 319         enum v4l2_field         field;                          /* supported field value */
 320         unsigned int            flags;
 321         unsigned int            sizeimage[VPE_MAX_PLANES];      /* image size in memory */
 322         struct v4l2_rect        c_rect;                         /* crop/compose rectangle */
 323         struct vpe_fmt          *fmt;                           /* format info */
 324 };
 325 
 326 /* vpe_q_data flag bits */
 327 #define Q_DATA_FRAME_1D                 BIT(0)
 328 #define Q_DATA_MODE_TILED               BIT(1)
 329 #define Q_DATA_INTERLACED_ALTERNATE     BIT(2)
 330 #define Q_DATA_INTERLACED_SEQ_TB        BIT(3)
 331 
 332 #define Q_IS_INTERLACED         (Q_DATA_INTERLACED_ALTERNATE | \
 333                                 Q_DATA_INTERLACED_SEQ_TB)
 334 
 335 enum {
 336         Q_DATA_SRC = 0,
 337         Q_DATA_DST = 1,
 338 };
 339 
 340 /* find our format description corresponding to the passed v4l2_format */
 341 static struct vpe_fmt *__find_format(u32 fourcc)
 342 {
 343         struct vpe_fmt *fmt;
 344         unsigned int k;
 345 
 346         for (k = 0; k < ARRAY_SIZE(vpe_formats); k++) {
 347                 fmt = &vpe_formats[k];
 348                 if (fmt->fourcc == fourcc)
 349                         return fmt;
 350         }
 351 
 352         return NULL;
 353 }
 354 
 355 static struct vpe_fmt *find_format(struct v4l2_format *f)
 356 {
 357         return __find_format(f->fmt.pix.pixelformat);
 358 }
 359 
 360 /*
 361  * there is one vpe_dev structure in the driver, it is shared by
 362  * all instances.
 363  */
 364 struct vpe_dev {
 365         struct v4l2_device      v4l2_dev;
 366         struct video_device     vfd;
 367         struct v4l2_m2m_dev     *m2m_dev;
 368 
 369         atomic_t                num_instances;  /* count of driver instances */
 370         dma_addr_t              loaded_mmrs;    /* shadow mmrs in device */
 371         struct mutex            dev_mutex;
 372         spinlock_t              lock;
 373 
 374         int                     irq;
 375         void __iomem            *base;
 376         struct resource         *res;
 377 
 378         struct vpdma_data       vpdma_data;
 379         struct vpdma_data       *vpdma;         /* vpdma data handle */
 380         struct sc_data          *sc;            /* scaler data handle */
 381         struct csc_data         *csc;           /* csc data handle */
 382 };
 383 
 384 /*
 385  * There is one vpe_ctx structure for each m2m context.
 386  */
 387 struct vpe_ctx {
 388         struct v4l2_fh          fh;
 389         struct vpe_dev          *dev;
 390         struct v4l2_ctrl_handler hdl;
 391 
 392         unsigned int            field;                  /* current field */
 393         unsigned int            sequence;               /* current frame/field seq */
 394         unsigned int            aborting;               /* abort after next irq */
 395 
 396         unsigned int            bufs_per_job;           /* input buffers per batch */
 397         unsigned int            bufs_completed;         /* bufs done in this batch */
 398 
 399         struct vpe_q_data       q_data[2];              /* src & dst queue data */
 400         struct vb2_v4l2_buffer  *src_vbs[VPE_MAX_SRC_BUFS];
 401         struct vb2_v4l2_buffer  *dst_vb;
 402 
 403         dma_addr_t              mv_buf_dma[2];          /* dma addrs of motion vector in/out bufs */
 404         void                    *mv_buf[2];             /* virtual addrs of motion vector bufs */
 405         size_t                  mv_buf_size;            /* current motion vector buffer size */
 406         struct vpdma_buf        mmr_adb;                /* shadow reg addr/data block */
 407         struct vpdma_buf        sc_coeff_h;             /* h coeff buffer */
 408         struct vpdma_buf        sc_coeff_v;             /* v coeff buffer */
 409         struct vpdma_desc_list  desc_list;              /* DMA descriptor list */
 410 
 411         bool                    deinterlacing;          /* using de-interlacer */
 412         bool                    load_mmrs;              /* have new shadow reg values */
 413 
 414         unsigned int            src_mv_buf_selector;
 415 };
 416 
 417 
 418 /*
 419  * M2M devices get 2 queues.
 420  * Return the queue given the type.
 421  */
 422 static struct vpe_q_data *get_q_data(struct vpe_ctx *ctx,
 423                                      enum v4l2_buf_type type)
 424 {
 425         switch (type) {
 426         case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
 427         case V4L2_BUF_TYPE_VIDEO_OUTPUT:
 428                 return &ctx->q_data[Q_DATA_SRC];
 429         case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
 430         case V4L2_BUF_TYPE_VIDEO_CAPTURE:
 431                 return &ctx->q_data[Q_DATA_DST];
 432         default:
 433                 return NULL;
 434         }
 435         return NULL;
 436 }
 437 
 438 static u32 read_reg(struct vpe_dev *dev, int offset)
 439 {
 440         return ioread32(dev->base + offset);
 441 }
 442 
 443 static void write_reg(struct vpe_dev *dev, int offset, u32 value)
 444 {
 445         iowrite32(value, dev->base + offset);
 446 }
 447 
 448 /* register field read/write helpers */
 449 static int get_field(u32 value, u32 mask, int shift)
 450 {
 451         return (value & (mask << shift)) >> shift;
 452 }
 453 
 454 static int read_field_reg(struct vpe_dev *dev, int offset, u32 mask, int shift)
 455 {
 456         return get_field(read_reg(dev, offset), mask, shift);
 457 }
 458 
 459 static void write_field(u32 *valp, u32 field, u32 mask, int shift)
 460 {
 461         u32 val = *valp;
 462 
 463         val &= ~(mask << shift);
 464         val |= (field & mask) << shift;
 465         *valp = val;
 466 }
 467 
 468 static void write_field_reg(struct vpe_dev *dev, int offset, u32 field,
 469                 u32 mask, int shift)
 470 {
 471         u32 val = read_reg(dev, offset);
 472 
 473         write_field(&val, field, mask, shift);
 474 
 475         write_reg(dev, offset, val);
 476 }
 477 
 478 /*
 479  * DMA address/data block for the shadow registers
 480  */
 481 struct vpe_mmr_adb {
 482         struct vpdma_adb_hdr    out_fmt_hdr;
 483         u32                     out_fmt_reg[1];
 484         u32                     out_fmt_pad[3];
 485         struct vpdma_adb_hdr    us1_hdr;
 486         u32                     us1_regs[8];
 487         struct vpdma_adb_hdr    us2_hdr;
 488         u32                     us2_regs[8];
 489         struct vpdma_adb_hdr    us3_hdr;
 490         u32                     us3_regs[8];
 491         struct vpdma_adb_hdr    dei_hdr;
 492         u32                     dei_regs[8];
 493         struct vpdma_adb_hdr    sc_hdr0;
 494         u32                     sc_regs0[7];
 495         u32                     sc_pad0[1];
 496         struct vpdma_adb_hdr    sc_hdr8;
 497         u32                     sc_regs8[6];
 498         u32                     sc_pad8[2];
 499         struct vpdma_adb_hdr    sc_hdr17;
 500         u32                     sc_regs17[9];
 501         u32                     sc_pad17[3];
 502         struct vpdma_adb_hdr    csc_hdr;
 503         u32                     csc_regs[6];
 504         u32                     csc_pad[2];
 505 };
 506 
 507 #define GET_OFFSET_TOP(ctx, obj, reg)   \
 508         ((obj)->res->start - ctx->dev->res->start + reg)
 509 
 510 #define VPE_SET_MMR_ADB_HDR(ctx, hdr, regs, offset_a)   \
 511         VPDMA_SET_MMR_ADB_HDR(ctx->mmr_adb, vpe_mmr_adb, hdr, regs, offset_a)
 512 /*
 513  * Set the headers for all of the address/data block structures.
 514  */
 515 static void init_adb_hdrs(struct vpe_ctx *ctx)
 516 {
 517         VPE_SET_MMR_ADB_HDR(ctx, out_fmt_hdr, out_fmt_reg, VPE_CLK_FORMAT_SELECT);
 518         VPE_SET_MMR_ADB_HDR(ctx, us1_hdr, us1_regs, VPE_US1_R0);
 519         VPE_SET_MMR_ADB_HDR(ctx, us2_hdr, us2_regs, VPE_US2_R0);
 520         VPE_SET_MMR_ADB_HDR(ctx, us3_hdr, us3_regs, VPE_US3_R0);
 521         VPE_SET_MMR_ADB_HDR(ctx, dei_hdr, dei_regs, VPE_DEI_FRAME_SIZE);
 522         VPE_SET_MMR_ADB_HDR(ctx, sc_hdr0, sc_regs0,
 523                 GET_OFFSET_TOP(ctx, ctx->dev->sc, CFG_SC0));
 524         VPE_SET_MMR_ADB_HDR(ctx, sc_hdr8, sc_regs8,
 525                 GET_OFFSET_TOP(ctx, ctx->dev->sc, CFG_SC8));
 526         VPE_SET_MMR_ADB_HDR(ctx, sc_hdr17, sc_regs17,
 527                 GET_OFFSET_TOP(ctx, ctx->dev->sc, CFG_SC17));
 528         VPE_SET_MMR_ADB_HDR(ctx, csc_hdr, csc_regs,
 529                 GET_OFFSET_TOP(ctx, ctx->dev->csc, CSC_CSC00));
 530 };
 531 
 532 /*
 533  * Allocate or re-allocate the motion vector DMA buffers
 534  * There are two buffers, one for input and one for output.
 535  * However, the roles are reversed after each field is processed.
 536  * In other words, after each field is processed, the previous
 537  * output (dst) MV buffer becomes the new input (src) MV buffer.
 538  */
 539 static int realloc_mv_buffers(struct vpe_ctx *ctx, size_t size)
 540 {
 541         struct device *dev = ctx->dev->v4l2_dev.dev;
 542 
 543         if (ctx->mv_buf_size == size)
 544                 return 0;
 545 
 546         if (ctx->mv_buf[0])
 547                 dma_free_coherent(dev, ctx->mv_buf_size, ctx->mv_buf[0],
 548                         ctx->mv_buf_dma[0]);
 549 
 550         if (ctx->mv_buf[1])
 551                 dma_free_coherent(dev, ctx->mv_buf_size, ctx->mv_buf[1],
 552                         ctx->mv_buf_dma[1]);
 553 
 554         if (size == 0)
 555                 return 0;
 556 
 557         ctx->mv_buf[0] = dma_alloc_coherent(dev, size, &ctx->mv_buf_dma[0],
 558                                 GFP_KERNEL);
 559         if (!ctx->mv_buf[0]) {
 560                 vpe_err(ctx->dev, "failed to allocate motion vector buffer\n");
 561                 return -ENOMEM;
 562         }
 563 
 564         ctx->mv_buf[1] = dma_alloc_coherent(dev, size, &ctx->mv_buf_dma[1],
 565                                 GFP_KERNEL);
 566         if (!ctx->mv_buf[1]) {
 567                 vpe_err(ctx->dev, "failed to allocate motion vector buffer\n");
 568                 dma_free_coherent(dev, size, ctx->mv_buf[0],
 569                         ctx->mv_buf_dma[0]);
 570 
 571                 return -ENOMEM;
 572         }
 573 
 574         ctx->mv_buf_size = size;
 575         ctx->src_mv_buf_selector = 0;
 576 
 577         return 0;
 578 }
 579 
 580 static void free_mv_buffers(struct vpe_ctx *ctx)
 581 {
 582         realloc_mv_buffers(ctx, 0);
 583 }
 584 
 585 /*
 586  * While de-interlacing, we keep the two most recent input buffers
 587  * around.  This function frees those two buffers when we have
 588  * finished processing the current stream.
 589  */
 590 static void free_vbs(struct vpe_ctx *ctx)
 591 {
 592         struct vpe_dev *dev = ctx->dev;
 593         unsigned long flags;
 594 
 595         if (ctx->src_vbs[2] == NULL)
 596                 return;
 597 
 598         spin_lock_irqsave(&dev->lock, flags);
 599         if (ctx->src_vbs[2]) {
 600                 v4l2_m2m_buf_done(ctx->src_vbs[2], VB2_BUF_STATE_DONE);
 601                 if (ctx->src_vbs[1] && (ctx->src_vbs[1] != ctx->src_vbs[2]))
 602                         v4l2_m2m_buf_done(ctx->src_vbs[1], VB2_BUF_STATE_DONE);
 603                 ctx->src_vbs[2] = NULL;
 604                 ctx->src_vbs[1] = NULL;
 605         }
 606         spin_unlock_irqrestore(&dev->lock, flags);
 607 }
 608 
 609 /*
 610  * Enable or disable the VPE clocks
 611  */
 612 static void vpe_set_clock_enable(struct vpe_dev *dev, bool on)
 613 {
 614         u32 val = 0;
 615 
 616         if (on)
 617                 val = VPE_DATA_PATH_CLK_ENABLE | VPE_VPEDMA_CLK_ENABLE;
 618         write_reg(dev, VPE_CLK_ENABLE, val);
 619 }
 620 
 621 static void vpe_top_reset(struct vpe_dev *dev)
 622 {
 623 
 624         write_field_reg(dev, VPE_CLK_RESET, 1, VPE_DATA_PATH_CLK_RESET_MASK,
 625                 VPE_DATA_PATH_CLK_RESET_SHIFT);
 626 
 627         usleep_range(100, 150);
 628 
 629         write_field_reg(dev, VPE_CLK_RESET, 0, VPE_DATA_PATH_CLK_RESET_MASK,
 630                 VPE_DATA_PATH_CLK_RESET_SHIFT);
 631 }
 632 
 633 static void vpe_top_vpdma_reset(struct vpe_dev *dev)
 634 {
 635         write_field_reg(dev, VPE_CLK_RESET, 1, VPE_VPDMA_CLK_RESET_MASK,
 636                 VPE_VPDMA_CLK_RESET_SHIFT);
 637 
 638         usleep_range(100, 150);
 639 
 640         write_field_reg(dev, VPE_CLK_RESET, 0, VPE_VPDMA_CLK_RESET_MASK,
 641                 VPE_VPDMA_CLK_RESET_SHIFT);
 642 }
 643 
 644 /*
 645  * Load the correct of upsampler coefficients into the shadow MMRs
 646  */
 647 static void set_us_coefficients(struct vpe_ctx *ctx)
 648 {
 649         struct vpe_mmr_adb *mmr_adb = ctx->mmr_adb.addr;
 650         struct vpe_q_data *s_q_data = &ctx->q_data[Q_DATA_SRC];
 651         u32 *us1_reg = &mmr_adb->us1_regs[0];
 652         u32 *us2_reg = &mmr_adb->us2_regs[0];
 653         u32 *us3_reg = &mmr_adb->us3_regs[0];
 654         const unsigned short *cp, *end_cp;
 655 
 656         cp = &us_coeffs[0].anchor_fid0_c0;
 657 
 658         if (s_q_data->flags & Q_IS_INTERLACED)          /* interlaced */
 659                 cp += sizeof(us_coeffs[0]) / sizeof(*cp);
 660 
 661         end_cp = cp + sizeof(us_coeffs[0]) / sizeof(*cp);
 662 
 663         while (cp < end_cp) {
 664                 write_field(us1_reg, *cp++, VPE_US_C0_MASK, VPE_US_C0_SHIFT);
 665                 write_field(us1_reg, *cp++, VPE_US_C1_MASK, VPE_US_C1_SHIFT);
 666                 *us2_reg++ = *us1_reg;
 667                 *us3_reg++ = *us1_reg++;
 668         }
 669         ctx->load_mmrs = true;
 670 }
 671 
 672 /*
 673  * Set the upsampler config mode and the VPDMA line mode in the shadow MMRs.
 674  */
 675 static void set_cfg_modes(struct vpe_ctx *ctx)
 676 {
 677         struct vpe_fmt *fmt = ctx->q_data[Q_DATA_SRC].fmt;
 678         struct vpe_mmr_adb *mmr_adb = ctx->mmr_adb.addr;
 679         u32 *us1_reg0 = &mmr_adb->us1_regs[0];
 680         u32 *us2_reg0 = &mmr_adb->us2_regs[0];
 681         u32 *us3_reg0 = &mmr_adb->us3_regs[0];
 682         int cfg_mode = 1;
 683 
 684         /*
 685          * Cfg Mode 0: YUV420 source, enable upsampler, DEI is de-interlacing.
 686          * Cfg Mode 1: YUV422 source, disable upsampler, DEI is de-interlacing.
 687          */
 688 
 689         if (fmt->fourcc == V4L2_PIX_FMT_NV12)
 690                 cfg_mode = 0;
 691 
 692         write_field(us1_reg0, cfg_mode, VPE_US_MODE_MASK, VPE_US_MODE_SHIFT);
 693         write_field(us2_reg0, cfg_mode, VPE_US_MODE_MASK, VPE_US_MODE_SHIFT);
 694         write_field(us3_reg0, cfg_mode, VPE_US_MODE_MASK, VPE_US_MODE_SHIFT);
 695 
 696         ctx->load_mmrs = true;
 697 }
 698 
 699 static void set_line_modes(struct vpe_ctx *ctx)
 700 {
 701         struct vpe_fmt *fmt = ctx->q_data[Q_DATA_SRC].fmt;
 702         int line_mode = 1;
 703 
 704         if (fmt->fourcc == V4L2_PIX_FMT_NV12)
 705                 line_mode = 0;          /* double lines to line buffer */
 706 
 707         /* regs for now */
 708         vpdma_set_line_mode(ctx->dev->vpdma, line_mode, VPE_CHAN_CHROMA1_IN);
 709         vpdma_set_line_mode(ctx->dev->vpdma, line_mode, VPE_CHAN_CHROMA2_IN);
 710         vpdma_set_line_mode(ctx->dev->vpdma, line_mode, VPE_CHAN_CHROMA3_IN);
 711 
 712         /* frame start for input luma */
 713         vpdma_set_frame_start_event(ctx->dev->vpdma, VPDMA_FSEVENT_CHANNEL_ACTIVE,
 714                 VPE_CHAN_LUMA1_IN);
 715         vpdma_set_frame_start_event(ctx->dev->vpdma, VPDMA_FSEVENT_CHANNEL_ACTIVE,
 716                 VPE_CHAN_LUMA2_IN);
 717         vpdma_set_frame_start_event(ctx->dev->vpdma, VPDMA_FSEVENT_CHANNEL_ACTIVE,
 718                 VPE_CHAN_LUMA3_IN);
 719 
 720         /* frame start for input chroma */
 721         vpdma_set_frame_start_event(ctx->dev->vpdma, VPDMA_FSEVENT_CHANNEL_ACTIVE,
 722                 VPE_CHAN_CHROMA1_IN);
 723         vpdma_set_frame_start_event(ctx->dev->vpdma, VPDMA_FSEVENT_CHANNEL_ACTIVE,
 724                 VPE_CHAN_CHROMA2_IN);
 725         vpdma_set_frame_start_event(ctx->dev->vpdma, VPDMA_FSEVENT_CHANNEL_ACTIVE,
 726                 VPE_CHAN_CHROMA3_IN);
 727 
 728         /* frame start for MV in client */
 729         vpdma_set_frame_start_event(ctx->dev->vpdma, VPDMA_FSEVENT_CHANNEL_ACTIVE,
 730                 VPE_CHAN_MV_IN);
 731 }
 732 
 733 /*
 734  * Set the shadow registers that are modified when the source
 735  * format changes.
 736  */
 737 static void set_src_registers(struct vpe_ctx *ctx)
 738 {
 739         set_us_coefficients(ctx);
 740 }
 741 
 742 /*
 743  * Set the shadow registers that are modified when the destination
 744  * format changes.
 745  */
 746 static void set_dst_registers(struct vpe_ctx *ctx)
 747 {
 748         struct vpe_mmr_adb *mmr_adb = ctx->mmr_adb.addr;
 749         enum v4l2_colorspace clrspc = ctx->q_data[Q_DATA_DST].colorspace;
 750         struct vpe_fmt *fmt = ctx->q_data[Q_DATA_DST].fmt;
 751         u32 val = 0;
 752 
 753         if (clrspc == V4L2_COLORSPACE_SRGB) {
 754                 val |= VPE_RGB_OUT_SELECT;
 755                 vpdma_set_bg_color(ctx->dev->vpdma,
 756                         (struct vpdma_data_format *)fmt->vpdma_fmt[0], 0xff);
 757         } else if (fmt->fourcc == V4L2_PIX_FMT_NV16)
 758                 val |= VPE_COLOR_SEPARATE_422;
 759 
 760         /*
 761          * the source of CHR_DS and CSC is always the scaler, irrespective of
 762          * whether it's used or not
 763          */
 764         val |= VPE_DS_SRC_DEI_SCALER | VPE_CSC_SRC_DEI_SCALER;
 765 
 766         if (fmt->fourcc != V4L2_PIX_FMT_NV12)
 767                 val |= VPE_DS_BYPASS;
 768 
 769         mmr_adb->out_fmt_reg[0] = val;
 770 
 771         ctx->load_mmrs = true;
 772 }
 773 
 774 /*
 775  * Set the de-interlacer shadow register values
 776  */
 777 static void set_dei_regs(struct vpe_ctx *ctx)
 778 {
 779         struct vpe_mmr_adb *mmr_adb = ctx->mmr_adb.addr;
 780         struct vpe_q_data *s_q_data = &ctx->q_data[Q_DATA_SRC];
 781         unsigned int src_h = s_q_data->c_rect.height;
 782         unsigned int src_w = s_q_data->c_rect.width;
 783         u32 *dei_mmr0 = &mmr_adb->dei_regs[0];
 784         bool deinterlace = true;
 785         u32 val = 0;
 786 
 787         /*
 788          * according to TRM, we should set DEI in progressive bypass mode when
 789          * the input content is progressive, however, DEI is bypassed correctly
 790          * for both progressive and interlace content in interlace bypass mode.
 791          * It has been recommended not to use progressive bypass mode.
 792          */
 793         if (!(s_q_data->flags & Q_IS_INTERLACED) || !ctx->deinterlacing) {
 794                 deinterlace = false;
 795                 val = VPE_DEI_INTERLACE_BYPASS;
 796         }
 797 
 798         src_h = deinterlace ? src_h * 2 : src_h;
 799 
 800         val |= (src_h << VPE_DEI_HEIGHT_SHIFT) |
 801                 (src_w << VPE_DEI_WIDTH_SHIFT) |
 802                 VPE_DEI_FIELD_FLUSH;
 803 
 804         *dei_mmr0 = val;
 805 
 806         ctx->load_mmrs = true;
 807 }
 808 
 809 static void set_dei_shadow_registers(struct vpe_ctx *ctx)
 810 {
 811         struct vpe_mmr_adb *mmr_adb = ctx->mmr_adb.addr;
 812         u32 *dei_mmr = &mmr_adb->dei_regs[0];
 813         const struct vpe_dei_regs *cur = &dei_regs;
 814 
 815         dei_mmr[2]  = cur->mdt_spacial_freq_thr_reg;
 816         dei_mmr[3]  = cur->edi_config_reg;
 817         dei_mmr[4]  = cur->edi_lut_reg0;
 818         dei_mmr[5]  = cur->edi_lut_reg1;
 819         dei_mmr[6]  = cur->edi_lut_reg2;
 820         dei_mmr[7]  = cur->edi_lut_reg3;
 821 
 822         ctx->load_mmrs = true;
 823 }
 824 
 825 static void config_edi_input_mode(struct vpe_ctx *ctx, int mode)
 826 {
 827         struct vpe_mmr_adb *mmr_adb = ctx->mmr_adb.addr;
 828         u32 *edi_config_reg = &mmr_adb->dei_regs[3];
 829 
 830         if (mode & 0x2)
 831                 write_field(edi_config_reg, 1, 1, 2);   /* EDI_ENABLE_3D */
 832 
 833         if (mode & 0x3)
 834                 write_field(edi_config_reg, 1, 1, 3);   /* EDI_CHROMA_3D  */
 835 
 836         write_field(edi_config_reg, mode, VPE_EDI_INP_MODE_MASK,
 837                 VPE_EDI_INP_MODE_SHIFT);
 838 
 839         ctx->load_mmrs = true;
 840 }
 841 
 842 /*
 843  * Set the shadow registers whose values are modified when either the
 844  * source or destination format is changed.
 845  */
 846 static int set_srcdst_params(struct vpe_ctx *ctx)
 847 {
 848         struct vpe_q_data *s_q_data =  &ctx->q_data[Q_DATA_SRC];
 849         struct vpe_q_data *d_q_data =  &ctx->q_data[Q_DATA_DST];
 850         struct vpe_mmr_adb *mmr_adb = ctx->mmr_adb.addr;
 851         unsigned int src_w = s_q_data->c_rect.width;
 852         unsigned int src_h = s_q_data->c_rect.height;
 853         unsigned int dst_w = d_q_data->c_rect.width;
 854         unsigned int dst_h = d_q_data->c_rect.height;
 855         size_t mv_buf_size;
 856         int ret;
 857 
 858         ctx->sequence = 0;
 859         ctx->field = V4L2_FIELD_TOP;
 860 
 861         if ((s_q_data->flags & Q_IS_INTERLACED) &&
 862                         !(d_q_data->flags & Q_IS_INTERLACED)) {
 863                 int bytes_per_line;
 864                 const struct vpdma_data_format *mv =
 865                         &vpdma_misc_fmts[VPDMA_DATA_FMT_MV];
 866 
 867                 /*
 868                  * we make sure that the source image has a 16 byte aligned
 869                  * stride, we need to do the same for the motion vector buffer
 870                  * by aligning it's stride to the next 16 byte boundary. this
 871                  * extra space will not be used by the de-interlacer, but will
 872                  * ensure that vpdma operates correctly
 873                  */
 874                 bytes_per_line = ALIGN((s_q_data->width * mv->depth) >> 3,
 875                                         VPDMA_STRIDE_ALIGN);
 876                 mv_buf_size = bytes_per_line * s_q_data->height;
 877 
 878                 ctx->deinterlacing = true;
 879                 src_h <<= 1;
 880         } else {
 881                 ctx->deinterlacing = false;
 882                 mv_buf_size = 0;
 883         }
 884 
 885         free_vbs(ctx);
 886         ctx->src_vbs[2] = ctx->src_vbs[1] = ctx->src_vbs[0] = NULL;
 887 
 888         ret = realloc_mv_buffers(ctx, mv_buf_size);
 889         if (ret)
 890                 return ret;
 891 
 892         set_cfg_modes(ctx);
 893         set_dei_regs(ctx);
 894 
 895         csc_set_coeff(ctx->dev->csc, &mmr_adb->csc_regs[0],
 896                 s_q_data->colorspace, d_q_data->colorspace);
 897 
 898         sc_set_hs_coeffs(ctx->dev->sc, ctx->sc_coeff_h.addr, src_w, dst_w);
 899         sc_set_vs_coeffs(ctx->dev->sc, ctx->sc_coeff_v.addr, src_h, dst_h);
 900 
 901         sc_config_scaler(ctx->dev->sc, &mmr_adb->sc_regs0[0],
 902                 &mmr_adb->sc_regs8[0], &mmr_adb->sc_regs17[0],
 903                 src_w, src_h, dst_w, dst_h);
 904 
 905         return 0;
 906 }
 907 
 908 /*
 909  * Return the vpe_ctx structure for a given struct file
 910  */
 911 static struct vpe_ctx *file2ctx(struct file *file)
 912 {
 913         return container_of(file->private_data, struct vpe_ctx, fh);
 914 }
 915 
 916 /*
 917  * mem2mem callbacks
 918  */
 919 
 920 /*
 921  * job_ready() - check whether an instance is ready to be scheduled to run
 922  */
 923 static int job_ready(void *priv)
 924 {
 925         struct vpe_ctx *ctx = priv;
 926 
 927         /*
 928          * This check is needed as this might be called directly from driver
 929          * When called by m2m framework, this will always satisfy, but when
 930          * called from vpe_irq, this might fail. (src stream with zero buffers)
 931          */
 932         if (v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx) <= 0 ||
 933                 v4l2_m2m_num_dst_bufs_ready(ctx->fh.m2m_ctx) <= 0)
 934                 return 0;
 935 
 936         return 1;
 937 }
 938 
 939 static void job_abort(void *priv)
 940 {
 941         struct vpe_ctx *ctx = priv;
 942 
 943         /* Will cancel the transaction in the next interrupt handler */
 944         ctx->aborting = 1;
 945 }
 946 
 947 static void vpe_dump_regs(struct vpe_dev *dev)
 948 {
 949 #define DUMPREG(r) vpe_dbg(dev, "%-35s %08x\n", #r, read_reg(dev, VPE_##r))
 950 
 951         vpe_dbg(dev, "VPE Registers:\n");
 952 
 953         DUMPREG(PID);
 954         DUMPREG(SYSCONFIG);
 955         DUMPREG(INT0_STATUS0_RAW);
 956         DUMPREG(INT0_STATUS0);
 957         DUMPREG(INT0_ENABLE0);
 958         DUMPREG(INT0_STATUS1_RAW);
 959         DUMPREG(INT0_STATUS1);
 960         DUMPREG(INT0_ENABLE1);
 961         DUMPREG(CLK_ENABLE);
 962         DUMPREG(CLK_RESET);
 963         DUMPREG(CLK_FORMAT_SELECT);
 964         DUMPREG(CLK_RANGE_MAP);
 965         DUMPREG(US1_R0);
 966         DUMPREG(US1_R1);
 967         DUMPREG(US1_R2);
 968         DUMPREG(US1_R3);
 969         DUMPREG(US1_R4);
 970         DUMPREG(US1_R5);
 971         DUMPREG(US1_R6);
 972         DUMPREG(US1_R7);
 973         DUMPREG(US2_R0);
 974         DUMPREG(US2_R1);
 975         DUMPREG(US2_R2);
 976         DUMPREG(US2_R3);
 977         DUMPREG(US2_R4);
 978         DUMPREG(US2_R5);
 979         DUMPREG(US2_R6);
 980         DUMPREG(US2_R7);
 981         DUMPREG(US3_R0);
 982         DUMPREG(US3_R1);
 983         DUMPREG(US3_R2);
 984         DUMPREG(US3_R3);
 985         DUMPREG(US3_R4);
 986         DUMPREG(US3_R5);
 987         DUMPREG(US3_R6);
 988         DUMPREG(US3_R7);
 989         DUMPREG(DEI_FRAME_SIZE);
 990         DUMPREG(MDT_BYPASS);
 991         DUMPREG(MDT_SF_THRESHOLD);
 992         DUMPREG(EDI_CONFIG);
 993         DUMPREG(DEI_EDI_LUT_R0);
 994         DUMPREG(DEI_EDI_LUT_R1);
 995         DUMPREG(DEI_EDI_LUT_R2);
 996         DUMPREG(DEI_EDI_LUT_R3);
 997         DUMPREG(DEI_FMD_WINDOW_R0);
 998         DUMPREG(DEI_FMD_WINDOW_R1);
 999         DUMPREG(DEI_FMD_CONTROL_R0);
1000         DUMPREG(DEI_FMD_CONTROL_R1);
1001         DUMPREG(DEI_FMD_STATUS_R0);
1002         DUMPREG(DEI_FMD_STATUS_R1);
1003         DUMPREG(DEI_FMD_STATUS_R2);
1004 #undef DUMPREG
1005 
1006         sc_dump_regs(dev->sc);
1007         csc_dump_regs(dev->csc);
1008 }
1009 
1010 static void add_out_dtd(struct vpe_ctx *ctx, int port)
1011 {
1012         struct vpe_q_data *q_data = &ctx->q_data[Q_DATA_DST];
1013         const struct vpe_port_data *p_data = &port_data[port];
1014         struct vb2_buffer *vb = &ctx->dst_vb->vb2_buf;
1015         struct vpe_fmt *fmt = q_data->fmt;
1016         const struct vpdma_data_format *vpdma_fmt;
1017         int mv_buf_selector = !ctx->src_mv_buf_selector;
1018         dma_addr_t dma_addr;
1019         u32 flags = 0;
1020         u32 offset = 0;
1021         u32 stride;
1022 
1023         if (port == VPE_PORT_MV_OUT) {
1024                 vpdma_fmt = &vpdma_misc_fmts[VPDMA_DATA_FMT_MV];
1025                 dma_addr = ctx->mv_buf_dma[mv_buf_selector];
1026                 q_data = &ctx->q_data[Q_DATA_SRC];
1027                 stride = ALIGN((q_data->width * vpdma_fmt->depth) >> 3,
1028                                VPDMA_STRIDE_ALIGN);
1029         } else {
1030                 /* to incorporate interleaved formats */
1031                 int plane = fmt->coplanar ? p_data->vb_part : 0;
1032 
1033                 vpdma_fmt = fmt->vpdma_fmt[plane];
1034                 /*
1035                  * If we are using a single plane buffer and
1036                  * we need to set a separate vpdma chroma channel.
1037                  */
1038                 if (q_data->nplanes == 1 && plane) {
1039                         dma_addr = vb2_dma_contig_plane_dma_addr(vb, 0);
1040                         /* Compute required offset */
1041                         offset = q_data->bytesperline[0] * q_data->height;
1042                 } else {
1043                         dma_addr = vb2_dma_contig_plane_dma_addr(vb, plane);
1044                         /* Use address as is, no offset */
1045                         offset = 0;
1046                 }
1047                 if (!dma_addr) {
1048                         vpe_err(ctx->dev,
1049                                 "acquiring output buffer(%d) dma_addr failed\n",
1050                                 port);
1051                         return;
1052                 }
1053                 /* Apply the offset */
1054                 dma_addr += offset;
1055                 stride = q_data->bytesperline[VPE_LUMA];
1056         }
1057 
1058         if (q_data->flags & Q_DATA_FRAME_1D)
1059                 flags |= VPDMA_DATA_FRAME_1D;
1060         if (q_data->flags & Q_DATA_MODE_TILED)
1061                 flags |= VPDMA_DATA_MODE_TILED;
1062 
1063         vpdma_set_max_size(ctx->dev->vpdma, VPDMA_MAX_SIZE1,
1064                            MAX_W, MAX_H);
1065 
1066         vpdma_add_out_dtd(&ctx->desc_list, q_data->width,
1067                           stride, &q_data->c_rect,
1068                           vpdma_fmt, dma_addr, MAX_OUT_WIDTH_REG1,
1069                           MAX_OUT_HEIGHT_REG1, p_data->channel, flags);
1070 }
1071 
1072 static void add_in_dtd(struct vpe_ctx *ctx, int port)
1073 {
1074         struct vpe_q_data *q_data = &ctx->q_data[Q_DATA_SRC];
1075         const struct vpe_port_data *p_data = &port_data[port];
1076         struct vb2_buffer *vb = &ctx->src_vbs[p_data->vb_index]->vb2_buf;
1077         struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1078         struct vpe_fmt *fmt = q_data->fmt;
1079         const struct vpdma_data_format *vpdma_fmt;
1080         int mv_buf_selector = ctx->src_mv_buf_selector;
1081         int field = vbuf->field == V4L2_FIELD_BOTTOM;
1082         int frame_width, frame_height;
1083         dma_addr_t dma_addr;
1084         u32 flags = 0;
1085         u32 offset = 0;
1086         u32 stride;
1087 
1088         if (port == VPE_PORT_MV_IN) {
1089                 vpdma_fmt = &vpdma_misc_fmts[VPDMA_DATA_FMT_MV];
1090                 dma_addr = ctx->mv_buf_dma[mv_buf_selector];
1091                 stride = ALIGN((q_data->width * vpdma_fmt->depth) >> 3,
1092                                VPDMA_STRIDE_ALIGN);
1093         } else {
1094                 /* to incorporate interleaved formats */
1095                 int plane = fmt->coplanar ? p_data->vb_part : 0;
1096 
1097                 vpdma_fmt = fmt->vpdma_fmt[plane];
1098                 /*
1099                  * If we are using a single plane buffer and
1100                  * we need to set a separate vpdma chroma channel.
1101                  */
1102                 if (q_data->nplanes == 1 && plane) {
1103                         dma_addr = vb2_dma_contig_plane_dma_addr(vb, 0);
1104                         /* Compute required offset */
1105                         offset = q_data->bytesperline[0] * q_data->height;
1106                 } else {
1107                         dma_addr = vb2_dma_contig_plane_dma_addr(vb, plane);
1108                         /* Use address as is, no offset */
1109                         offset = 0;
1110                 }
1111                 if (!dma_addr) {
1112                         vpe_err(ctx->dev,
1113                                 "acquiring output buffer(%d) dma_addr failed\n",
1114                                 port);
1115                         return;
1116                 }
1117                 /* Apply the offset */
1118                 dma_addr += offset;
1119                 stride = q_data->bytesperline[VPE_LUMA];
1120 
1121                 if (q_data->flags & Q_DATA_INTERLACED_SEQ_TB) {
1122                         /*
1123                          * Use top or bottom field from same vb alternately
1124                          * f,f-1,f-2 = TBT when seq is even
1125                          * f,f-1,f-2 = BTB when seq is odd
1126                          */
1127                         field = (p_data->vb_index + (ctx->sequence % 2)) % 2;
1128 
1129                         if (field) {
1130                                 /*
1131                                  * bottom field of a SEQ_TB buffer
1132                                  * Skip the top field data by
1133                                  */
1134                                 int height = q_data->height / 2;
1135                                 int bpp = fmt->fourcc == V4L2_PIX_FMT_NV12 ?
1136                                                 1 : (vpdma_fmt->depth >> 3);
1137                                 if (plane)
1138                                         height /= 2;
1139                                 dma_addr += q_data->width * height * bpp;
1140                         }
1141                 }
1142         }
1143 
1144         if (q_data->flags & Q_DATA_FRAME_1D)
1145                 flags |= VPDMA_DATA_FRAME_1D;
1146         if (q_data->flags & Q_DATA_MODE_TILED)
1147                 flags |= VPDMA_DATA_MODE_TILED;
1148 
1149         frame_width = q_data->c_rect.width;
1150         frame_height = q_data->c_rect.height;
1151 
1152         if (p_data->vb_part && fmt->fourcc == V4L2_PIX_FMT_NV12)
1153                 frame_height /= 2;
1154 
1155         vpdma_add_in_dtd(&ctx->desc_list, q_data->width, stride,
1156                          &q_data->c_rect, vpdma_fmt, dma_addr,
1157                          p_data->channel, field, flags, frame_width,
1158                          frame_height, 0, 0);
1159 }
1160 
1161 /*
1162  * Enable the expected IRQ sources
1163  */
1164 static void enable_irqs(struct vpe_ctx *ctx)
1165 {
1166         write_reg(ctx->dev, VPE_INT0_ENABLE0_SET, VPE_INT0_LIST0_COMPLETE);
1167         write_reg(ctx->dev, VPE_INT0_ENABLE1_SET, VPE_DEI_ERROR_INT |
1168                                 VPE_DS1_UV_ERROR_INT);
1169 
1170         vpdma_enable_list_complete_irq(ctx->dev->vpdma, 0, 0, true);
1171 }
1172 
1173 static void disable_irqs(struct vpe_ctx *ctx)
1174 {
1175         write_reg(ctx->dev, VPE_INT0_ENABLE0_CLR, 0xffffffff);
1176         write_reg(ctx->dev, VPE_INT0_ENABLE1_CLR, 0xffffffff);
1177 
1178         vpdma_enable_list_complete_irq(ctx->dev->vpdma, 0, 0, false);
1179 }
1180 
1181 /* device_run() - prepares and starts the device
1182  *
1183  * This function is only called when both the source and destination
1184  * buffers are in place.
1185  */
1186 static void device_run(void *priv)
1187 {
1188         struct vpe_ctx *ctx = priv;
1189         struct sc_data *sc = ctx->dev->sc;
1190         struct vpe_q_data *d_q_data = &ctx->q_data[Q_DATA_DST];
1191         struct vpe_q_data *s_q_data = &ctx->q_data[Q_DATA_SRC];
1192 
1193         if (ctx->deinterlacing && s_q_data->flags & Q_DATA_INTERLACED_SEQ_TB &&
1194                 ctx->sequence % 2 == 0) {
1195                 /* When using SEQ_TB buffers, When using it first time,
1196                  * No need to remove the buffer as the next field is present
1197                  * in the same buffer. (so that job_ready won't fail)
1198                  * It will be removed when using bottom field
1199                  */
1200                 ctx->src_vbs[0] = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
1201                 WARN_ON(ctx->src_vbs[0] == NULL);
1202         } else {
1203                 ctx->src_vbs[0] = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1204                 WARN_ON(ctx->src_vbs[0] == NULL);
1205         }
1206 
1207         ctx->dst_vb = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1208         WARN_ON(ctx->dst_vb == NULL);
1209 
1210         if (ctx->deinterlacing) {
1211 
1212                 if (ctx->src_vbs[2] == NULL) {
1213                         ctx->src_vbs[2] = ctx->src_vbs[0];
1214                         WARN_ON(ctx->src_vbs[2] == NULL);
1215                         ctx->src_vbs[1] = ctx->src_vbs[0];
1216                         WARN_ON(ctx->src_vbs[1] == NULL);
1217                 }
1218 
1219                 /*
1220                  * we have output the first 2 frames through line average, we
1221                  * now switch to EDI de-interlacer
1222                  */
1223                 if (ctx->sequence == 2)
1224                         config_edi_input_mode(ctx, 0x3); /* EDI (Y + UV) */
1225         }
1226 
1227         /* config descriptors */
1228         if (ctx->dev->loaded_mmrs != ctx->mmr_adb.dma_addr || ctx->load_mmrs) {
1229                 vpdma_map_desc_buf(ctx->dev->vpdma, &ctx->mmr_adb);
1230                 vpdma_add_cfd_adb(&ctx->desc_list, CFD_MMR_CLIENT, &ctx->mmr_adb);
1231 
1232                 set_line_modes(ctx);
1233 
1234                 ctx->dev->loaded_mmrs = ctx->mmr_adb.dma_addr;
1235                 ctx->load_mmrs = false;
1236         }
1237 
1238         if (sc->loaded_coeff_h != ctx->sc_coeff_h.dma_addr ||
1239                         sc->load_coeff_h) {
1240                 vpdma_map_desc_buf(ctx->dev->vpdma, &ctx->sc_coeff_h);
1241                 vpdma_add_cfd_block(&ctx->desc_list, CFD_SC_CLIENT,
1242                         &ctx->sc_coeff_h, 0);
1243 
1244                 sc->loaded_coeff_h = ctx->sc_coeff_h.dma_addr;
1245                 sc->load_coeff_h = false;
1246         }
1247 
1248         if (sc->loaded_coeff_v != ctx->sc_coeff_v.dma_addr ||
1249                         sc->load_coeff_v) {
1250                 vpdma_map_desc_buf(ctx->dev->vpdma, &ctx->sc_coeff_v);
1251                 vpdma_add_cfd_block(&ctx->desc_list, CFD_SC_CLIENT,
1252                         &ctx->sc_coeff_v, SC_COEF_SRAM_SIZE >> 4);
1253 
1254                 sc->loaded_coeff_v = ctx->sc_coeff_v.dma_addr;
1255                 sc->load_coeff_v = false;
1256         }
1257 
1258         /* output data descriptors */
1259         if (ctx->deinterlacing)
1260                 add_out_dtd(ctx, VPE_PORT_MV_OUT);
1261 
1262         if (d_q_data->colorspace == V4L2_COLORSPACE_SRGB) {
1263                 add_out_dtd(ctx, VPE_PORT_RGB_OUT);
1264         } else {
1265                 add_out_dtd(ctx, VPE_PORT_LUMA_OUT);
1266                 if (d_q_data->fmt->coplanar)
1267                         add_out_dtd(ctx, VPE_PORT_CHROMA_OUT);
1268         }
1269 
1270         /* input data descriptors */
1271         if (ctx->deinterlacing) {
1272                 add_in_dtd(ctx, VPE_PORT_LUMA3_IN);
1273                 add_in_dtd(ctx, VPE_PORT_CHROMA3_IN);
1274 
1275                 add_in_dtd(ctx, VPE_PORT_LUMA2_IN);
1276                 add_in_dtd(ctx, VPE_PORT_CHROMA2_IN);
1277         }
1278 
1279         add_in_dtd(ctx, VPE_PORT_LUMA1_IN);
1280         add_in_dtd(ctx, VPE_PORT_CHROMA1_IN);
1281 
1282         if (ctx->deinterlacing)
1283                 add_in_dtd(ctx, VPE_PORT_MV_IN);
1284 
1285         /* sync on channel control descriptors for input ports */
1286         vpdma_add_sync_on_channel_ctd(&ctx->desc_list, VPE_CHAN_LUMA1_IN);
1287         vpdma_add_sync_on_channel_ctd(&ctx->desc_list, VPE_CHAN_CHROMA1_IN);
1288 
1289         if (ctx->deinterlacing) {
1290                 vpdma_add_sync_on_channel_ctd(&ctx->desc_list,
1291                         VPE_CHAN_LUMA2_IN);
1292                 vpdma_add_sync_on_channel_ctd(&ctx->desc_list,
1293                         VPE_CHAN_CHROMA2_IN);
1294 
1295                 vpdma_add_sync_on_channel_ctd(&ctx->desc_list,
1296                         VPE_CHAN_LUMA3_IN);
1297                 vpdma_add_sync_on_channel_ctd(&ctx->desc_list,
1298                         VPE_CHAN_CHROMA3_IN);
1299 
1300                 vpdma_add_sync_on_channel_ctd(&ctx->desc_list, VPE_CHAN_MV_IN);
1301         }
1302 
1303         /* sync on channel control descriptors for output ports */
1304         if (d_q_data->colorspace == V4L2_COLORSPACE_SRGB) {
1305                 vpdma_add_sync_on_channel_ctd(&ctx->desc_list,
1306                         VPE_CHAN_RGB_OUT);
1307         } else {
1308                 vpdma_add_sync_on_channel_ctd(&ctx->desc_list,
1309                         VPE_CHAN_LUMA_OUT);
1310                 if (d_q_data->fmt->coplanar)
1311                         vpdma_add_sync_on_channel_ctd(&ctx->desc_list,
1312                                 VPE_CHAN_CHROMA_OUT);
1313         }
1314 
1315         if (ctx->deinterlacing)
1316                 vpdma_add_sync_on_channel_ctd(&ctx->desc_list, VPE_CHAN_MV_OUT);
1317 
1318         enable_irqs(ctx);
1319 
1320         vpdma_map_desc_buf(ctx->dev->vpdma, &ctx->desc_list.buf);
1321         vpdma_submit_descs(ctx->dev->vpdma, &ctx->desc_list, 0);
1322 }
1323 
1324 static void dei_error(struct vpe_ctx *ctx)
1325 {
1326         dev_warn(ctx->dev->v4l2_dev.dev,
1327                 "received DEI error interrupt\n");
1328 }
1329 
1330 static void ds1_uv_error(struct vpe_ctx *ctx)
1331 {
1332         dev_warn(ctx->dev->v4l2_dev.dev,
1333                 "received downsampler error interrupt\n");
1334 }
1335 
1336 static irqreturn_t vpe_irq(int irq_vpe, void *data)
1337 {
1338         struct vpe_dev *dev = (struct vpe_dev *)data;
1339         struct vpe_ctx *ctx;
1340         struct vpe_q_data *d_q_data;
1341         struct vb2_v4l2_buffer *s_vb, *d_vb;
1342         unsigned long flags;
1343         u32 irqst0, irqst1;
1344         bool list_complete = false;
1345 
1346         irqst0 = read_reg(dev, VPE_INT0_STATUS0);
1347         if (irqst0) {
1348                 write_reg(dev, VPE_INT0_STATUS0_CLR, irqst0);
1349                 vpe_dbg(dev, "INT0_STATUS0 = 0x%08x\n", irqst0);
1350         }
1351 
1352         irqst1 = read_reg(dev, VPE_INT0_STATUS1);
1353         if (irqst1) {
1354                 write_reg(dev, VPE_INT0_STATUS1_CLR, irqst1);
1355                 vpe_dbg(dev, "INT0_STATUS1 = 0x%08x\n", irqst1);
1356         }
1357 
1358         ctx = v4l2_m2m_get_curr_priv(dev->m2m_dev);
1359         if (!ctx) {
1360                 vpe_err(dev, "instance released before end of transaction\n");
1361                 goto handled;
1362         }
1363 
1364         if (irqst1) {
1365                 if (irqst1 & VPE_DEI_ERROR_INT) {
1366                         irqst1 &= ~VPE_DEI_ERROR_INT;
1367                         dei_error(ctx);
1368                 }
1369                 if (irqst1 & VPE_DS1_UV_ERROR_INT) {
1370                         irqst1 &= ~VPE_DS1_UV_ERROR_INT;
1371                         ds1_uv_error(ctx);
1372                 }
1373         }
1374 
1375         if (irqst0) {
1376                 if (irqst0 & VPE_INT0_LIST0_COMPLETE)
1377                         vpdma_clear_list_stat(ctx->dev->vpdma, 0, 0);
1378 
1379                 irqst0 &= ~(VPE_INT0_LIST0_COMPLETE);
1380                 list_complete = true;
1381         }
1382 
1383         if (irqst0 | irqst1) {
1384                 dev_warn(dev->v4l2_dev.dev, "Unexpected interrupt: INT0_STATUS0 = 0x%08x, INT0_STATUS1 = 0x%08x\n",
1385                         irqst0, irqst1);
1386         }
1387 
1388         /*
1389          * Setup next operation only when list complete IRQ occurs
1390          * otherwise, skip the following code
1391          */
1392         if (!list_complete)
1393                 goto handled;
1394 
1395         disable_irqs(ctx);
1396 
1397         vpdma_unmap_desc_buf(dev->vpdma, &ctx->desc_list.buf);
1398         vpdma_unmap_desc_buf(dev->vpdma, &ctx->mmr_adb);
1399         vpdma_unmap_desc_buf(dev->vpdma, &ctx->sc_coeff_h);
1400         vpdma_unmap_desc_buf(dev->vpdma, &ctx->sc_coeff_v);
1401 
1402         vpdma_reset_desc_list(&ctx->desc_list);
1403 
1404          /* the previous dst mv buffer becomes the next src mv buffer */
1405         ctx->src_mv_buf_selector = !ctx->src_mv_buf_selector;
1406 
1407         s_vb = ctx->src_vbs[0];
1408         d_vb = ctx->dst_vb;
1409 
1410         d_vb->flags = s_vb->flags;
1411         d_vb->vb2_buf.timestamp = s_vb->vb2_buf.timestamp;
1412 
1413         if (s_vb->flags & V4L2_BUF_FLAG_TIMECODE)
1414                 d_vb->timecode = s_vb->timecode;
1415 
1416         d_vb->sequence = ctx->sequence;
1417         s_vb->sequence = ctx->sequence;
1418 
1419         d_q_data = &ctx->q_data[Q_DATA_DST];
1420         if (d_q_data->flags & Q_IS_INTERLACED) {
1421                 d_vb->field = ctx->field;
1422                 if (ctx->field == V4L2_FIELD_BOTTOM) {
1423                         ctx->sequence++;
1424                         ctx->field = V4L2_FIELD_TOP;
1425                 } else {
1426                         WARN_ON(ctx->field != V4L2_FIELD_TOP);
1427                         ctx->field = V4L2_FIELD_BOTTOM;
1428                 }
1429         } else {
1430                 d_vb->field = V4L2_FIELD_NONE;
1431                 ctx->sequence++;
1432         }
1433 
1434         if (ctx->deinterlacing) {
1435                 /*
1436                  * Allow source buffer to be dequeued only if it won't be used
1437                  * in the next iteration. All vbs are initialized to first
1438                  * buffer and we are shifting buffers every iteration, for the
1439                  * first two iterations, no buffer will be dequeued.
1440                  * This ensures that driver will keep (n-2)th (n-1)th and (n)th
1441                  * field when deinterlacing is enabled
1442                  */
1443                 if (ctx->src_vbs[2] != ctx->src_vbs[1])
1444                         s_vb = ctx->src_vbs[2];
1445                 else
1446                         s_vb = NULL;
1447         }
1448 
1449         spin_lock_irqsave(&dev->lock, flags);
1450 
1451         if (s_vb)
1452                 v4l2_m2m_buf_done(s_vb, VB2_BUF_STATE_DONE);
1453 
1454         v4l2_m2m_buf_done(d_vb, VB2_BUF_STATE_DONE);
1455 
1456         spin_unlock_irqrestore(&dev->lock, flags);
1457 
1458         if (ctx->deinterlacing) {
1459                 ctx->src_vbs[2] = ctx->src_vbs[1];
1460                 ctx->src_vbs[1] = ctx->src_vbs[0];
1461         }
1462 
1463         /*
1464          * Since the vb2_buf_done has already been called fir therse
1465          * buffer we can now NULL them out so that we won't try
1466          * to clean out stray pointer later on.
1467         */
1468         ctx->src_vbs[0] = NULL;
1469         ctx->dst_vb = NULL;
1470 
1471         if (ctx->aborting)
1472                 goto finished;
1473 
1474         ctx->bufs_completed++;
1475         if (ctx->bufs_completed < ctx->bufs_per_job && job_ready(ctx)) {
1476                 device_run(ctx);
1477                 goto handled;
1478         }
1479 
1480 finished:
1481         vpe_dbg(ctx->dev, "finishing transaction\n");
1482         ctx->bufs_completed = 0;
1483         v4l2_m2m_job_finish(dev->m2m_dev, ctx->fh.m2m_ctx);
1484 handled:
1485         return IRQ_HANDLED;
1486 }
1487 
1488 /*
1489  * video ioctls
1490  */
1491 static int vpe_querycap(struct file *file, void *priv,
1492                         struct v4l2_capability *cap)
1493 {
1494         strscpy(cap->driver, VPE_MODULE_NAME, sizeof(cap->driver));
1495         strscpy(cap->card, VPE_MODULE_NAME, sizeof(cap->card));
1496         snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s",
1497                 VPE_MODULE_NAME);
1498         return 0;
1499 }
1500 
1501 static int __enum_fmt(struct v4l2_fmtdesc *f, u32 type)
1502 {
1503         int i, index;
1504         struct vpe_fmt *fmt = NULL;
1505 
1506         index = 0;
1507         for (i = 0; i < ARRAY_SIZE(vpe_formats); ++i) {
1508                 if (vpe_formats[i].types & type) {
1509                         if (index == f->index) {
1510                                 fmt = &vpe_formats[i];
1511                                 break;
1512                         }
1513                         index++;
1514                 }
1515         }
1516 
1517         if (!fmt)
1518                 return -EINVAL;
1519 
1520         f->pixelformat = fmt->fourcc;
1521         return 0;
1522 }
1523 
1524 static int vpe_enum_fmt(struct file *file, void *priv,
1525                                 struct v4l2_fmtdesc *f)
1526 {
1527         if (V4L2_TYPE_IS_OUTPUT(f->type))
1528                 return __enum_fmt(f, VPE_FMT_TYPE_OUTPUT);
1529 
1530         return __enum_fmt(f, VPE_FMT_TYPE_CAPTURE);
1531 }
1532 
1533 static int vpe_g_fmt(struct file *file, void *priv, struct v4l2_format *f)
1534 {
1535         struct v4l2_pix_format_mplane *pix = &f->fmt.pix_mp;
1536         struct vpe_ctx *ctx = file2ctx(file);
1537         struct vb2_queue *vq;
1538         struct vpe_q_data *q_data;
1539         int i;
1540 
1541         vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type);
1542         if (!vq)
1543                 return -EINVAL;
1544 
1545         q_data = get_q_data(ctx, f->type);
1546 
1547         pix->width = q_data->width;
1548         pix->height = q_data->height;
1549         pix->pixelformat = q_data->fmt->fourcc;
1550         pix->field = q_data->field;
1551 
1552         if (V4L2_TYPE_IS_OUTPUT(f->type)) {
1553                 pix->colorspace = q_data->colorspace;
1554         } else {
1555                 struct vpe_q_data *s_q_data;
1556 
1557                 /* get colorspace from the source queue */
1558                 s_q_data = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
1559 
1560                 pix->colorspace = s_q_data->colorspace;
1561         }
1562 
1563         pix->num_planes = q_data->nplanes;
1564 
1565         for (i = 0; i < pix->num_planes; i++) {
1566                 pix->plane_fmt[i].bytesperline = q_data->bytesperline[i];
1567                 pix->plane_fmt[i].sizeimage = q_data->sizeimage[i];
1568         }
1569 
1570         return 0;
1571 }
1572 
1573 static int __vpe_try_fmt(struct vpe_ctx *ctx, struct v4l2_format *f,
1574                        struct vpe_fmt *fmt, int type)
1575 {
1576         struct v4l2_pix_format_mplane *pix = &f->fmt.pix_mp;
1577         struct v4l2_plane_pix_format *plane_fmt;
1578         unsigned int w_align;
1579         int i, depth, depth_bytes, height;
1580         unsigned int stride = 0;
1581 
1582         if (!fmt || !(fmt->types & type)) {
1583                 vpe_dbg(ctx->dev, "Fourcc format (0x%08x) invalid.\n",
1584                         pix->pixelformat);
1585                 fmt = __find_format(V4L2_PIX_FMT_YUYV);
1586         }
1587 
1588         if (pix->field != V4L2_FIELD_NONE && pix->field != V4L2_FIELD_ALTERNATE
1589                         && pix->field != V4L2_FIELD_SEQ_TB)
1590                 pix->field = V4L2_FIELD_NONE;
1591 
1592         depth = fmt->vpdma_fmt[VPE_LUMA]->depth;
1593 
1594         /*
1595          * the line stride should 16 byte aligned for VPDMA to work, based on
1596          * the bytes per pixel, figure out how much the width should be aligned
1597          * to make sure line stride is 16 byte aligned
1598          */
1599         depth_bytes = depth >> 3;
1600 
1601         if (depth_bytes == 3) {
1602                 /*
1603                  * if bpp is 3(as in some RGB formats), the pixel width doesn't
1604                  * really help in ensuring line stride is 16 byte aligned
1605                  */
1606                 w_align = 4;
1607         } else {
1608                 /*
1609                  * for the remainder bpp(4, 2 and 1), the pixel width alignment
1610                  * can ensure a line stride alignment of 16 bytes. For example,
1611                  * if bpp is 2, then the line stride can be 16 byte aligned if
1612                  * the width is 8 byte aligned
1613                  */
1614 
1615                 /*
1616                  * HACK: using order_base_2() here causes lots of asm output
1617                  * errors with smatch, on i386:
1618                  * ./arch/x86/include/asm/bitops.h:457:22:
1619                  *               warning: asm output is not an lvalue
1620                  * Perhaps some gcc optimization is doing the wrong thing
1621                  * there.
1622                  * Let's get rid of them by doing the calculus on two steps
1623                  */
1624                 w_align = roundup_pow_of_two(VPDMA_DESC_ALIGN / depth_bytes);
1625                 w_align = ilog2(w_align);
1626         }
1627 
1628         v4l_bound_align_image(&pix->width, MIN_W, MAX_W, w_align,
1629                               &pix->height, MIN_H, MAX_H, H_ALIGN,
1630                               S_ALIGN);
1631 
1632         if (!pix->num_planes || pix->num_planes > 2)
1633                 pix->num_planes = fmt->coplanar ? 2 : 1;
1634         else if (pix->num_planes > 1 && !fmt->coplanar)
1635                 pix->num_planes = 1;
1636 
1637         pix->pixelformat = fmt->fourcc;
1638 
1639         /*
1640          * For the actual image parameters, we need to consider the field
1641          * height of the image for SEQ_TB buffers.
1642          */
1643         if (pix->field == V4L2_FIELD_SEQ_TB)
1644                 height = pix->height / 2;
1645         else
1646                 height = pix->height;
1647 
1648         if (!pix->colorspace) {
1649                 if (fmt->fourcc == V4L2_PIX_FMT_RGB24 ||
1650                                 fmt->fourcc == V4L2_PIX_FMT_BGR24 ||
1651                                 fmt->fourcc == V4L2_PIX_FMT_RGB32 ||
1652                                 fmt->fourcc == V4L2_PIX_FMT_BGR32) {
1653                         pix->colorspace = V4L2_COLORSPACE_SRGB;
1654                 } else {
1655                         if (height > 1280)      /* HD */
1656                                 pix->colorspace = V4L2_COLORSPACE_REC709;
1657                         else                    /* SD */
1658                                 pix->colorspace = V4L2_COLORSPACE_SMPTE170M;
1659                 }
1660         }
1661 
1662         memset(pix->reserved, 0, sizeof(pix->reserved));
1663         for (i = 0; i < pix->num_planes; i++) {
1664                 plane_fmt = &pix->plane_fmt[i];
1665                 depth = fmt->vpdma_fmt[i]->depth;
1666 
1667                 stride = (pix->width * fmt->vpdma_fmt[VPE_LUMA]->depth) >> 3;
1668                 if (stride > plane_fmt->bytesperline)
1669                         plane_fmt->bytesperline = stride;
1670 
1671                 plane_fmt->bytesperline = clamp_t(u32, plane_fmt->bytesperline,
1672                                                   stride,
1673                                                   VPDMA_MAX_STRIDE);
1674 
1675                 plane_fmt->bytesperline = ALIGN(plane_fmt->bytesperline,
1676                                                 VPDMA_STRIDE_ALIGN);
1677 
1678                 if (i == VPE_LUMA) {
1679                         plane_fmt->sizeimage = pix->height *
1680                                                plane_fmt->bytesperline;
1681 
1682                         if (pix->num_planes == 1 && fmt->coplanar)
1683                                 plane_fmt->sizeimage += pix->height *
1684                                         plane_fmt->bytesperline *
1685                                         fmt->vpdma_fmt[VPE_CHROMA]->depth >> 3;
1686 
1687                 } else { /* i == VIP_CHROMA */
1688                         plane_fmt->sizeimage = (pix->height *
1689                                                plane_fmt->bytesperline *
1690                                                depth) >> 3;
1691                 }
1692                 memset(plane_fmt->reserved, 0, sizeof(plane_fmt->reserved));
1693         }
1694 
1695         return 0;
1696 }
1697 
1698 static int vpe_try_fmt(struct file *file, void *priv, struct v4l2_format *f)
1699 {
1700         struct vpe_ctx *ctx = file2ctx(file);
1701         struct vpe_fmt *fmt = find_format(f);
1702 
1703         if (V4L2_TYPE_IS_OUTPUT(f->type))
1704                 return __vpe_try_fmt(ctx, f, fmt, VPE_FMT_TYPE_OUTPUT);
1705         else
1706                 return __vpe_try_fmt(ctx, f, fmt, VPE_FMT_TYPE_CAPTURE);
1707 }
1708 
1709 static int __vpe_s_fmt(struct vpe_ctx *ctx, struct v4l2_format *f)
1710 {
1711         struct v4l2_pix_format_mplane *pix = &f->fmt.pix_mp;
1712         struct v4l2_plane_pix_format *plane_fmt;
1713         struct vpe_q_data *q_data;
1714         struct vb2_queue *vq;
1715         int i;
1716 
1717         vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type);
1718         if (!vq)
1719                 return -EINVAL;
1720 
1721         if (vb2_is_busy(vq)) {
1722                 vpe_err(ctx->dev, "queue busy\n");
1723                 return -EBUSY;
1724         }
1725 
1726         q_data = get_q_data(ctx, f->type);
1727         if (!q_data)
1728                 return -EINVAL;
1729 
1730         q_data->fmt             = find_format(f);
1731         q_data->width           = pix->width;
1732         q_data->height          = pix->height;
1733         q_data->colorspace      = pix->colorspace;
1734         q_data->field           = pix->field;
1735         q_data->nplanes         = pix->num_planes;
1736 
1737         for (i = 0; i < pix->num_planes; i++) {
1738                 plane_fmt = &pix->plane_fmt[i];
1739 
1740                 q_data->bytesperline[i] = plane_fmt->bytesperline;
1741                 q_data->sizeimage[i]    = plane_fmt->sizeimage;
1742         }
1743 
1744         q_data->c_rect.left     = 0;
1745         q_data->c_rect.top      = 0;
1746         q_data->c_rect.width    = q_data->width;
1747         q_data->c_rect.height   = q_data->height;
1748 
1749         if (q_data->field == V4L2_FIELD_ALTERNATE)
1750                 q_data->flags |= Q_DATA_INTERLACED_ALTERNATE;
1751         else if (q_data->field == V4L2_FIELD_SEQ_TB)
1752                 q_data->flags |= Q_DATA_INTERLACED_SEQ_TB;
1753         else
1754                 q_data->flags &= ~Q_IS_INTERLACED;
1755 
1756         /* the crop height is halved for the case of SEQ_TB buffers */
1757         if (q_data->flags & Q_DATA_INTERLACED_SEQ_TB)
1758                 q_data->c_rect.height /= 2;
1759 
1760         vpe_dbg(ctx->dev, "Setting format for type %d, wxh: %dx%d, fmt: %d bpl_y %d",
1761                 f->type, q_data->width, q_data->height, q_data->fmt->fourcc,
1762                 q_data->bytesperline[VPE_LUMA]);
1763         if (q_data->nplanes == 2)
1764                 vpe_dbg(ctx->dev, " bpl_uv %d\n",
1765                         q_data->bytesperline[VPE_CHROMA]);
1766 
1767         return 0;
1768 }
1769 
1770 static int vpe_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
1771 {
1772         int ret;
1773         struct vpe_ctx *ctx = file2ctx(file);
1774 
1775         ret = vpe_try_fmt(file, priv, f);
1776         if (ret)
1777                 return ret;
1778 
1779         ret = __vpe_s_fmt(ctx, f);
1780         if (ret)
1781                 return ret;
1782 
1783         if (V4L2_TYPE_IS_OUTPUT(f->type))
1784                 set_src_registers(ctx);
1785         else
1786                 set_dst_registers(ctx);
1787 
1788         return set_srcdst_params(ctx);
1789 }
1790 
1791 static int __vpe_try_selection(struct vpe_ctx *ctx, struct v4l2_selection *s)
1792 {
1793         struct vpe_q_data *q_data;
1794         int height;
1795 
1796         if ((s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) &&
1797             (s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT))
1798                 return -EINVAL;
1799 
1800         q_data = get_q_data(ctx, s->type);
1801         if (!q_data)
1802                 return -EINVAL;
1803 
1804         switch (s->target) {
1805         case V4L2_SEL_TGT_COMPOSE:
1806                 /*
1807                  * COMPOSE target is only valid for capture buffer type, return
1808                  * error for output buffer type
1809                  */
1810                 if (s->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
1811                         return -EINVAL;
1812                 break;
1813         case V4L2_SEL_TGT_CROP:
1814                 /*
1815                  * CROP target is only valid for output buffer type, return
1816                  * error for capture buffer type
1817                  */
1818                 if (s->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1819                         return -EINVAL;
1820                 break;
1821         /*
1822          * bound and default crop/compose targets are invalid targets to
1823          * try/set
1824          */
1825         default:
1826                 return -EINVAL;
1827         }
1828 
1829         /*
1830          * For SEQ_TB buffers, crop height should be less than the height of
1831          * the field height, not the buffer height
1832          */
1833         if (q_data->flags & Q_DATA_INTERLACED_SEQ_TB)
1834                 height = q_data->height / 2;
1835         else
1836                 height = q_data->height;
1837 
1838         if (s->r.top < 0 || s->r.left < 0) {
1839                 vpe_err(ctx->dev, "negative values for top and left\n");
1840                 s->r.top = s->r.left = 0;
1841         }
1842 
1843         v4l_bound_align_image(&s->r.width, MIN_W, q_data->width, 1,
1844                 &s->r.height, MIN_H, height, H_ALIGN, S_ALIGN);
1845 
1846         /* adjust left/top if cropping rectangle is out of bounds */
1847         if (s->r.left + s->r.width > q_data->width)
1848                 s->r.left = q_data->width - s->r.width;
1849         if (s->r.top + s->r.height > q_data->height)
1850                 s->r.top = q_data->height - s->r.height;
1851 
1852         return 0;
1853 }
1854 
1855 static int vpe_g_selection(struct file *file, void *fh,
1856                 struct v4l2_selection *s)
1857 {
1858         struct vpe_ctx *ctx = file2ctx(file);
1859         struct vpe_q_data *q_data;
1860         bool use_c_rect = false;
1861 
1862         if ((s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) &&
1863             (s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT))
1864                 return -EINVAL;
1865 
1866         q_data = get_q_data(ctx, s->type);
1867         if (!q_data)
1868                 return -EINVAL;
1869 
1870         switch (s->target) {
1871         case V4L2_SEL_TGT_COMPOSE_DEFAULT:
1872         case V4L2_SEL_TGT_COMPOSE_BOUNDS:
1873                 if (s->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
1874                         return -EINVAL;
1875                 break;
1876         case V4L2_SEL_TGT_CROP_BOUNDS:
1877         case V4L2_SEL_TGT_CROP_DEFAULT:
1878                 if (s->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1879                         return -EINVAL;
1880                 break;
1881         case V4L2_SEL_TGT_COMPOSE:
1882                 if (s->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
1883                         return -EINVAL;
1884                 use_c_rect = true;
1885                 break;
1886         case V4L2_SEL_TGT_CROP:
1887                 if (s->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1888                         return -EINVAL;
1889                 use_c_rect = true;
1890                 break;
1891         default:
1892                 return -EINVAL;
1893         }
1894 
1895         if (use_c_rect) {
1896                 /*
1897                  * for CROP/COMPOSE target type, return c_rect params from the
1898                  * respective buffer type
1899                  */
1900                 s->r = q_data->c_rect;
1901         } else {
1902                 /*
1903                  * for DEFAULT/BOUNDS target type, return width and height from
1904                  * S_FMT of the respective buffer type
1905                  */
1906                 s->r.left = 0;
1907                 s->r.top = 0;
1908                 s->r.width = q_data->width;
1909                 s->r.height = q_data->height;
1910         }
1911 
1912         return 0;
1913 }
1914 
1915 
1916 static int vpe_s_selection(struct file *file, void *fh,
1917                 struct v4l2_selection *s)
1918 {
1919         struct vpe_ctx *ctx = file2ctx(file);
1920         struct vpe_q_data *q_data;
1921         struct v4l2_selection sel = *s;
1922         int ret;
1923 
1924         ret = __vpe_try_selection(ctx, &sel);
1925         if (ret)
1926                 return ret;
1927 
1928         q_data = get_q_data(ctx, sel.type);
1929         if (!q_data)
1930                 return -EINVAL;
1931 
1932         if ((q_data->c_rect.left == sel.r.left) &&
1933                         (q_data->c_rect.top == sel.r.top) &&
1934                         (q_data->c_rect.width == sel.r.width) &&
1935                         (q_data->c_rect.height == sel.r.height)) {
1936                 vpe_dbg(ctx->dev,
1937                         "requested crop/compose values are already set\n");
1938                 return 0;
1939         }
1940 
1941         q_data->c_rect = sel.r;
1942 
1943         return set_srcdst_params(ctx);
1944 }
1945 
1946 /*
1947  * defines number of buffers/frames a context can process with VPE before
1948  * switching to a different context. default value is 1 buffer per context
1949  */
1950 #define V4L2_CID_VPE_BUFS_PER_JOB               (V4L2_CID_USER_TI_VPE_BASE + 0)
1951 
1952 static int vpe_s_ctrl(struct v4l2_ctrl *ctrl)
1953 {
1954         struct vpe_ctx *ctx =
1955                 container_of(ctrl->handler, struct vpe_ctx, hdl);
1956 
1957         switch (ctrl->id) {
1958         case V4L2_CID_VPE_BUFS_PER_JOB:
1959                 ctx->bufs_per_job = ctrl->val;
1960                 break;
1961 
1962         default:
1963                 vpe_err(ctx->dev, "Invalid control\n");
1964                 return -EINVAL;
1965         }
1966 
1967         return 0;
1968 }
1969 
1970 static const struct v4l2_ctrl_ops vpe_ctrl_ops = {
1971         .s_ctrl = vpe_s_ctrl,
1972 };
1973 
1974 static const struct v4l2_ioctl_ops vpe_ioctl_ops = {
1975         .vidioc_querycap                = vpe_querycap,
1976 
1977         .vidioc_enum_fmt_vid_cap        = vpe_enum_fmt,
1978         .vidioc_g_fmt_vid_cap_mplane    = vpe_g_fmt,
1979         .vidioc_try_fmt_vid_cap_mplane  = vpe_try_fmt,
1980         .vidioc_s_fmt_vid_cap_mplane    = vpe_s_fmt,
1981 
1982         .vidioc_enum_fmt_vid_out        = vpe_enum_fmt,
1983         .vidioc_g_fmt_vid_out_mplane    = vpe_g_fmt,
1984         .vidioc_try_fmt_vid_out_mplane  = vpe_try_fmt,
1985         .vidioc_s_fmt_vid_out_mplane    = vpe_s_fmt,
1986 
1987         .vidioc_g_selection             = vpe_g_selection,
1988         .vidioc_s_selection             = vpe_s_selection,
1989 
1990         .vidioc_reqbufs                 = v4l2_m2m_ioctl_reqbufs,
1991         .vidioc_querybuf                = v4l2_m2m_ioctl_querybuf,
1992         .vidioc_qbuf                    = v4l2_m2m_ioctl_qbuf,
1993         .vidioc_dqbuf                   = v4l2_m2m_ioctl_dqbuf,
1994         .vidioc_expbuf                  = v4l2_m2m_ioctl_expbuf,
1995         .vidioc_streamon                = v4l2_m2m_ioctl_streamon,
1996         .vidioc_streamoff               = v4l2_m2m_ioctl_streamoff,
1997 
1998         .vidioc_subscribe_event         = v4l2_ctrl_subscribe_event,
1999         .vidioc_unsubscribe_event       = v4l2_event_unsubscribe,
2000 };
2001 
2002 /*
2003  * Queue operations
2004  */
2005 static int vpe_queue_setup(struct vb2_queue *vq,
2006                            unsigned int *nbuffers, unsigned int *nplanes,
2007                            unsigned int sizes[], struct device *alloc_devs[])
2008 {
2009         int i;
2010         struct vpe_ctx *ctx = vb2_get_drv_priv(vq);
2011         struct vpe_q_data *q_data;
2012 
2013         q_data = get_q_data(ctx, vq->type);
2014 
2015         *nplanes = q_data->nplanes;
2016 
2017         for (i = 0; i < *nplanes; i++)
2018                 sizes[i] = q_data->sizeimage[i];
2019 
2020         vpe_dbg(ctx->dev, "get %d buffer(s) of size %d", *nbuffers,
2021                 sizes[VPE_LUMA]);
2022         if (q_data->nplanes == 2)
2023                 vpe_dbg(ctx->dev, " and %d\n", sizes[VPE_CHROMA]);
2024 
2025         return 0;
2026 }
2027 
2028 static int vpe_buf_prepare(struct vb2_buffer *vb)
2029 {
2030         struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
2031         struct vpe_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
2032         struct vpe_q_data *q_data;
2033         int i, num_planes;
2034 
2035         vpe_dbg(ctx->dev, "type: %d\n", vb->vb2_queue->type);
2036 
2037         q_data = get_q_data(ctx, vb->vb2_queue->type);
2038         num_planes = q_data->nplanes;
2039 
2040         if (vb->vb2_queue->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
2041                 if (!(q_data->flags & Q_IS_INTERLACED)) {
2042                         vbuf->field = V4L2_FIELD_NONE;
2043                 } else {
2044                         if (vbuf->field != V4L2_FIELD_TOP &&
2045                             vbuf->field != V4L2_FIELD_BOTTOM &&
2046                             vbuf->field != V4L2_FIELD_SEQ_TB)
2047                                 return -EINVAL;
2048                 }
2049         }
2050 
2051         for (i = 0; i < num_planes; i++) {
2052                 if (vb2_plane_size(vb, i) < q_data->sizeimage[i]) {
2053                         vpe_err(ctx->dev,
2054                                 "data will not fit into plane (%lu < %lu)\n",
2055                                 vb2_plane_size(vb, i),
2056                                 (long) q_data->sizeimage[i]);
2057                         return -EINVAL;
2058                 }
2059         }
2060 
2061         for (i = 0; i < num_planes; i++)
2062                 vb2_set_plane_payload(vb, i, q_data->sizeimage[i]);
2063 
2064         return 0;
2065 }
2066 
2067 static void vpe_buf_queue(struct vb2_buffer *vb)
2068 {
2069         struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
2070         struct vpe_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
2071 
2072         v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf);
2073 }
2074 
2075 static int check_srcdst_sizes(struct vpe_ctx *ctx)
2076 {
2077         struct vpe_q_data *s_q_data =  &ctx->q_data[Q_DATA_SRC];
2078         struct vpe_q_data *d_q_data =  &ctx->q_data[Q_DATA_DST];
2079         unsigned int src_w = s_q_data->c_rect.width;
2080         unsigned int src_h = s_q_data->c_rect.height;
2081         unsigned int dst_w = d_q_data->c_rect.width;
2082         unsigned int dst_h = d_q_data->c_rect.height;
2083 
2084         if (src_w == dst_w && src_h == dst_h)
2085                 return 0;
2086 
2087         if (src_h <= SC_MAX_PIXEL_HEIGHT &&
2088             src_w <= SC_MAX_PIXEL_WIDTH &&
2089             dst_h <= SC_MAX_PIXEL_HEIGHT &&
2090             dst_w <= SC_MAX_PIXEL_WIDTH)
2091                 return 0;
2092 
2093         return -1;
2094 }
2095 
2096 static void vpe_return_all_buffers(struct vpe_ctx *ctx,  struct vb2_queue *q,
2097                                    enum vb2_buffer_state state)
2098 {
2099         struct vb2_v4l2_buffer *vb;
2100         unsigned long flags;
2101 
2102         for (;;) {
2103                 if (V4L2_TYPE_IS_OUTPUT(q->type))
2104                         vb = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
2105                 else
2106                         vb = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
2107                 if (!vb)
2108                         break;
2109                 spin_lock_irqsave(&ctx->dev->lock, flags);
2110                 v4l2_m2m_buf_done(vb, state);
2111                 spin_unlock_irqrestore(&ctx->dev->lock, flags);
2112         }
2113 
2114         /*
2115          * Cleanup the in-transit vb2 buffers that have been
2116          * removed from their respective queue already but for
2117          * which procecessing has not been completed yet.
2118          */
2119         if (V4L2_TYPE_IS_OUTPUT(q->type)) {
2120                 spin_lock_irqsave(&ctx->dev->lock, flags);
2121 
2122                 if (ctx->src_vbs[2])
2123                         v4l2_m2m_buf_done(ctx->src_vbs[2], state);
2124 
2125                 if (ctx->src_vbs[1] && (ctx->src_vbs[1] != ctx->src_vbs[2]))
2126                         v4l2_m2m_buf_done(ctx->src_vbs[1], state);
2127 
2128                 if (ctx->src_vbs[0] &&
2129                     (ctx->src_vbs[0] != ctx->src_vbs[1]) &&
2130                     (ctx->src_vbs[0] != ctx->src_vbs[2]))
2131                         v4l2_m2m_buf_done(ctx->src_vbs[0], state);
2132 
2133                 ctx->src_vbs[2] = NULL;
2134                 ctx->src_vbs[1] = NULL;
2135                 ctx->src_vbs[0] = NULL;
2136 
2137                 spin_unlock_irqrestore(&ctx->dev->lock, flags);
2138         } else {
2139                 if (ctx->dst_vb) {
2140                         spin_lock_irqsave(&ctx->dev->lock, flags);
2141 
2142                         v4l2_m2m_buf_done(ctx->dst_vb, state);
2143                         ctx->dst_vb = NULL;
2144                         spin_unlock_irqrestore(&ctx->dev->lock, flags);
2145                 }
2146         }
2147 }
2148 
2149 static int vpe_start_streaming(struct vb2_queue *q, unsigned int count)
2150 {
2151         struct vpe_ctx *ctx = vb2_get_drv_priv(q);
2152 
2153         /* Check any of the size exceed maximum scaling sizes */
2154         if (check_srcdst_sizes(ctx)) {
2155                 vpe_err(ctx->dev,
2156                         "Conversion setup failed, check source and destination parameters\n"
2157                         );
2158                 vpe_return_all_buffers(ctx, q, VB2_BUF_STATE_QUEUED);
2159                 return -EINVAL;
2160         }
2161 
2162         if (ctx->deinterlacing)
2163                 config_edi_input_mode(ctx, 0x0);
2164 
2165         if (ctx->sequence != 0)
2166                 set_srcdst_params(ctx);
2167 
2168         return 0;
2169 }
2170 
2171 static void vpe_stop_streaming(struct vb2_queue *q)
2172 {
2173         struct vpe_ctx *ctx = vb2_get_drv_priv(q);
2174 
2175         vpe_dump_regs(ctx->dev);
2176         vpdma_dump_regs(ctx->dev->vpdma);
2177 
2178         vpe_return_all_buffers(ctx, q, VB2_BUF_STATE_ERROR);
2179 }
2180 
2181 static const struct vb2_ops vpe_qops = {
2182         .queue_setup     = vpe_queue_setup,
2183         .buf_prepare     = vpe_buf_prepare,
2184         .buf_queue       = vpe_buf_queue,
2185         .wait_prepare    = vb2_ops_wait_prepare,
2186         .wait_finish     = vb2_ops_wait_finish,
2187         .start_streaming = vpe_start_streaming,
2188         .stop_streaming  = vpe_stop_streaming,
2189 };
2190 
2191 static int queue_init(void *priv, struct vb2_queue *src_vq,
2192                       struct vb2_queue *dst_vq)
2193 {
2194         struct vpe_ctx *ctx = priv;
2195         struct vpe_dev *dev = ctx->dev;
2196         int ret;
2197 
2198         memset(src_vq, 0, sizeof(*src_vq));
2199         src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
2200         src_vq->io_modes = VB2_MMAP | VB2_DMABUF;
2201         src_vq->drv_priv = ctx;
2202         src_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer);
2203         src_vq->ops = &vpe_qops;
2204         src_vq->mem_ops = &vb2_dma_contig_memops;
2205         src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
2206         src_vq->lock = &dev->dev_mutex;
2207         src_vq->dev = dev->v4l2_dev.dev;
2208 
2209         ret = vb2_queue_init(src_vq);
2210         if (ret)
2211                 return ret;
2212 
2213         memset(dst_vq, 0, sizeof(*dst_vq));
2214         dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
2215         dst_vq->io_modes = VB2_MMAP | VB2_DMABUF;
2216         dst_vq->drv_priv = ctx;
2217         dst_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer);
2218         dst_vq->ops = &vpe_qops;
2219         dst_vq->mem_ops = &vb2_dma_contig_memops;
2220         dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
2221         dst_vq->lock = &dev->dev_mutex;
2222         dst_vq->dev = dev->v4l2_dev.dev;
2223 
2224         return vb2_queue_init(dst_vq);
2225 }
2226 
2227 static const struct v4l2_ctrl_config vpe_bufs_per_job = {
2228         .ops = &vpe_ctrl_ops,
2229         .id = V4L2_CID_VPE_BUFS_PER_JOB,
2230         .name = "Buffers Per Transaction",
2231         .type = V4L2_CTRL_TYPE_INTEGER,
2232         .def = VPE_DEF_BUFS_PER_JOB,
2233         .min = 1,
2234         .max = VIDEO_MAX_FRAME,
2235         .step = 1,
2236 };
2237 
2238 /*
2239  * File operations
2240  */
2241 static int vpe_open(struct file *file)
2242 {
2243         struct vpe_dev *dev = video_drvdata(file);
2244         struct vpe_q_data *s_q_data;
2245         struct v4l2_ctrl_handler *hdl;
2246         struct vpe_ctx *ctx;
2247         int ret;
2248 
2249         vpe_dbg(dev, "vpe_open\n");
2250 
2251         ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
2252         if (!ctx)
2253                 return -ENOMEM;
2254 
2255         ctx->dev = dev;
2256 
2257         if (mutex_lock_interruptible(&dev->dev_mutex)) {
2258                 ret = -ERESTARTSYS;
2259                 goto free_ctx;
2260         }
2261 
2262         ret = vpdma_create_desc_list(&ctx->desc_list, VPE_DESC_LIST_SIZE,
2263                         VPDMA_LIST_TYPE_NORMAL);
2264         if (ret != 0)
2265                 goto unlock;
2266 
2267         ret = vpdma_alloc_desc_buf(&ctx->mmr_adb, sizeof(struct vpe_mmr_adb));
2268         if (ret != 0)
2269                 goto free_desc_list;
2270 
2271         ret = vpdma_alloc_desc_buf(&ctx->sc_coeff_h, SC_COEF_SRAM_SIZE);
2272         if (ret != 0)
2273                 goto free_mmr_adb;
2274 
2275         ret = vpdma_alloc_desc_buf(&ctx->sc_coeff_v, SC_COEF_SRAM_SIZE);
2276         if (ret != 0)
2277                 goto free_sc_h;
2278 
2279         init_adb_hdrs(ctx);
2280 
2281         v4l2_fh_init(&ctx->fh, video_devdata(file));
2282         file->private_data = &ctx->fh;
2283 
2284         hdl = &ctx->hdl;
2285         v4l2_ctrl_handler_init(hdl, 1);
2286         v4l2_ctrl_new_custom(hdl, &vpe_bufs_per_job, NULL);
2287         if (hdl->error) {
2288                 ret = hdl->error;
2289                 goto exit_fh;
2290         }
2291         ctx->fh.ctrl_handler = hdl;
2292         v4l2_ctrl_handler_setup(hdl);
2293 
2294         s_q_data = &ctx->q_data[Q_DATA_SRC];
2295         s_q_data->fmt = __find_format(V4L2_PIX_FMT_YUYV);
2296         s_q_data->width = 1920;
2297         s_q_data->height = 1080;
2298         s_q_data->nplanes = 1;
2299         s_q_data->bytesperline[VPE_LUMA] = (s_q_data->width *
2300                         s_q_data->fmt->vpdma_fmt[VPE_LUMA]->depth) >> 3;
2301         s_q_data->sizeimage[VPE_LUMA] = (s_q_data->bytesperline[VPE_LUMA] *
2302                         s_q_data->height);
2303         s_q_data->colorspace = V4L2_COLORSPACE_REC709;
2304         s_q_data->field = V4L2_FIELD_NONE;
2305         s_q_data->c_rect.left = 0;
2306         s_q_data->c_rect.top = 0;
2307         s_q_data->c_rect.width = s_q_data->width;
2308         s_q_data->c_rect.height = s_q_data->height;
2309         s_q_data->flags = 0;
2310 
2311         ctx->q_data[Q_DATA_DST] = *s_q_data;
2312 
2313         set_dei_shadow_registers(ctx);
2314         set_src_registers(ctx);
2315         set_dst_registers(ctx);
2316         ret = set_srcdst_params(ctx);
2317         if (ret)
2318                 goto exit_fh;
2319 
2320         ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(dev->m2m_dev, ctx, &queue_init);
2321 
2322         if (IS_ERR(ctx->fh.m2m_ctx)) {
2323                 ret = PTR_ERR(ctx->fh.m2m_ctx);
2324                 goto exit_fh;
2325         }
2326 
2327         v4l2_fh_add(&ctx->fh);
2328 
2329         /*
2330          * for now, just report the creation of the first instance, we can later
2331          * optimize the driver to enable or disable clocks when the first
2332          * instance is created or the last instance released
2333          */
2334         if (atomic_inc_return(&dev->num_instances) == 1)
2335                 vpe_dbg(dev, "first instance created\n");
2336 
2337         ctx->bufs_per_job = VPE_DEF_BUFS_PER_JOB;
2338 
2339         ctx->load_mmrs = true;
2340 
2341         vpe_dbg(dev, "created instance %p, m2m_ctx: %p\n",
2342                 ctx, ctx->fh.m2m_ctx);
2343 
2344         mutex_unlock(&dev->dev_mutex);
2345 
2346         return 0;
2347 exit_fh:
2348         v4l2_ctrl_handler_free(hdl);
2349         v4l2_fh_exit(&ctx->fh);
2350         vpdma_free_desc_buf(&ctx->sc_coeff_v);
2351 free_sc_h:
2352         vpdma_free_desc_buf(&ctx->sc_coeff_h);
2353 free_mmr_adb:
2354         vpdma_free_desc_buf(&ctx->mmr_adb);
2355 free_desc_list:
2356         vpdma_free_desc_list(&ctx->desc_list);
2357 unlock:
2358         mutex_unlock(&dev->dev_mutex);
2359 free_ctx:
2360         kfree(ctx);
2361         return ret;
2362 }
2363 
2364 static int vpe_release(struct file *file)
2365 {
2366         struct vpe_dev *dev = video_drvdata(file);
2367         struct vpe_ctx *ctx = file2ctx(file);
2368 
2369         vpe_dbg(dev, "releasing instance %p\n", ctx);
2370 
2371         mutex_lock(&dev->dev_mutex);
2372         free_mv_buffers(ctx);
2373 
2374         vpdma_unmap_desc_buf(dev->vpdma, &ctx->desc_list.buf);
2375         vpdma_unmap_desc_buf(dev->vpdma, &ctx->mmr_adb);
2376         vpdma_unmap_desc_buf(dev->vpdma, &ctx->sc_coeff_h);
2377         vpdma_unmap_desc_buf(dev->vpdma, &ctx->sc_coeff_v);
2378 
2379         vpdma_free_desc_list(&ctx->desc_list);
2380         vpdma_free_desc_buf(&ctx->mmr_adb);
2381 
2382         vpdma_free_desc_buf(&ctx->sc_coeff_v);
2383         vpdma_free_desc_buf(&ctx->sc_coeff_h);
2384 
2385         v4l2_fh_del(&ctx->fh);
2386         v4l2_fh_exit(&ctx->fh);
2387         v4l2_ctrl_handler_free(&ctx->hdl);
2388         v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
2389 
2390         kfree(ctx);
2391 
2392         /*
2393          * for now, just report the release of the last instance, we can later
2394          * optimize the driver to enable or disable clocks when the first
2395          * instance is created or the last instance released
2396          */
2397         if (atomic_dec_return(&dev->num_instances) == 0)
2398                 vpe_dbg(dev, "last instance released\n");
2399 
2400         mutex_unlock(&dev->dev_mutex);
2401 
2402         return 0;
2403 }
2404 
2405 static const struct v4l2_file_operations vpe_fops = {
2406         .owner          = THIS_MODULE,
2407         .open           = vpe_open,
2408         .release        = vpe_release,
2409         .poll           = v4l2_m2m_fop_poll,
2410         .unlocked_ioctl = video_ioctl2,
2411         .mmap           = v4l2_m2m_fop_mmap,
2412 };
2413 
2414 static const struct video_device vpe_videodev = {
2415         .name           = VPE_MODULE_NAME,
2416         .fops           = &vpe_fops,
2417         .ioctl_ops      = &vpe_ioctl_ops,
2418         .minor          = -1,
2419         .release        = video_device_release_empty,
2420         .vfl_dir        = VFL_DIR_M2M,
2421         .device_caps    = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_STREAMING,
2422 };
2423 
2424 static const struct v4l2_m2m_ops m2m_ops = {
2425         .device_run     = device_run,
2426         .job_ready      = job_ready,
2427         .job_abort      = job_abort,
2428 };
2429 
2430 static int vpe_runtime_get(struct platform_device *pdev)
2431 {
2432         int r;
2433 
2434         dev_dbg(&pdev->dev, "vpe_runtime_get\n");
2435 
2436         r = pm_runtime_get_sync(&pdev->dev);
2437         WARN_ON(r < 0);
2438         return r < 0 ? r : 0;
2439 }
2440 
2441 static void vpe_runtime_put(struct platform_device *pdev)
2442 {
2443 
2444         int r;
2445 
2446         dev_dbg(&pdev->dev, "vpe_runtime_put\n");
2447 
2448         r = pm_runtime_put_sync(&pdev->dev);
2449         WARN_ON(r < 0 && r != -ENOSYS);
2450 }
2451 
2452 static void vpe_fw_cb(struct platform_device *pdev)
2453 {
2454         struct vpe_dev *dev = platform_get_drvdata(pdev);
2455         struct video_device *vfd;
2456         int ret;
2457 
2458         vfd = &dev->vfd;
2459         *vfd = vpe_videodev;
2460         vfd->lock = &dev->dev_mutex;
2461         vfd->v4l2_dev = &dev->v4l2_dev;
2462 
2463         ret = video_register_device(vfd, VFL_TYPE_GRABBER, 0);
2464         if (ret) {
2465                 vpe_err(dev, "Failed to register video device\n");
2466 
2467                 vpe_set_clock_enable(dev, 0);
2468                 vpe_runtime_put(pdev);
2469                 pm_runtime_disable(&pdev->dev);
2470                 v4l2_m2m_release(dev->m2m_dev);
2471                 v4l2_device_unregister(&dev->v4l2_dev);
2472 
2473                 return;
2474         }
2475 
2476         video_set_drvdata(vfd, dev);
2477         dev_info(dev->v4l2_dev.dev, "Device registered as /dev/video%d\n",
2478                 vfd->num);
2479 }
2480 
2481 static int vpe_probe(struct platform_device *pdev)
2482 {
2483         struct vpe_dev *dev;
2484         int ret, irq, func;
2485 
2486         dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
2487         if (!dev)
2488                 return -ENOMEM;
2489 
2490         spin_lock_init(&dev->lock);
2491 
2492         ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
2493         if (ret)
2494                 return ret;
2495 
2496         atomic_set(&dev->num_instances, 0);
2497         mutex_init(&dev->dev_mutex);
2498 
2499         dev->res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
2500                         "vpe_top");
2501         /*
2502          * HACK: we get resource info from device tree in the form of a list of
2503          * VPE sub blocks, the driver currently uses only the base of vpe_top
2504          * for register access, the driver should be changed later to access
2505          * registers based on the sub block base addresses
2506          */
2507         dev->base = devm_ioremap(&pdev->dev, dev->res->start, SZ_32K);
2508         if (!dev->base) {
2509                 ret = -ENOMEM;
2510                 goto v4l2_dev_unreg;
2511         }
2512 
2513         irq = platform_get_irq(pdev, 0);
2514         ret = devm_request_irq(&pdev->dev, irq, vpe_irq, 0, VPE_MODULE_NAME,
2515                         dev);
2516         if (ret)
2517                 goto v4l2_dev_unreg;
2518 
2519         platform_set_drvdata(pdev, dev);
2520 
2521         dev->m2m_dev = v4l2_m2m_init(&m2m_ops);
2522         if (IS_ERR(dev->m2m_dev)) {
2523                 vpe_err(dev, "Failed to init mem2mem device\n");
2524                 ret = PTR_ERR(dev->m2m_dev);
2525                 goto v4l2_dev_unreg;
2526         }
2527 
2528         pm_runtime_enable(&pdev->dev);
2529 
2530         ret = vpe_runtime_get(pdev);
2531         if (ret)
2532                 goto rel_m2m;
2533 
2534         /* Perform clk enable followed by reset */
2535         vpe_set_clock_enable(dev, 1);
2536 
2537         vpe_top_reset(dev);
2538 
2539         func = read_field_reg(dev, VPE_PID, VPE_PID_FUNC_MASK,
2540                 VPE_PID_FUNC_SHIFT);
2541         vpe_dbg(dev, "VPE PID function %x\n", func);
2542 
2543         vpe_top_vpdma_reset(dev);
2544 
2545         dev->sc = sc_create(pdev, "sc");
2546         if (IS_ERR(dev->sc)) {
2547                 ret = PTR_ERR(dev->sc);
2548                 goto runtime_put;
2549         }
2550 
2551         dev->csc = csc_create(pdev, "csc");
2552         if (IS_ERR(dev->csc)) {
2553                 ret = PTR_ERR(dev->csc);
2554                 goto runtime_put;
2555         }
2556 
2557         dev->vpdma = &dev->vpdma_data;
2558         ret = vpdma_create(pdev, dev->vpdma, vpe_fw_cb);
2559         if (ret)
2560                 goto runtime_put;
2561 
2562         return 0;
2563 
2564 runtime_put:
2565         vpe_runtime_put(pdev);
2566 rel_m2m:
2567         pm_runtime_disable(&pdev->dev);
2568         v4l2_m2m_release(dev->m2m_dev);
2569 v4l2_dev_unreg:
2570         v4l2_device_unregister(&dev->v4l2_dev);
2571 
2572         return ret;
2573 }
2574 
2575 static int vpe_remove(struct platform_device *pdev)
2576 {
2577         struct vpe_dev *dev = platform_get_drvdata(pdev);
2578 
2579         v4l2_info(&dev->v4l2_dev, "Removing " VPE_MODULE_NAME);
2580 
2581         v4l2_m2m_release(dev->m2m_dev);
2582         video_unregister_device(&dev->vfd);
2583         v4l2_device_unregister(&dev->v4l2_dev);
2584 
2585         vpe_set_clock_enable(dev, 0);
2586         vpe_runtime_put(pdev);
2587         pm_runtime_disable(&pdev->dev);
2588 
2589         return 0;
2590 }
2591 
2592 #if defined(CONFIG_OF)
2593 static const struct of_device_id vpe_of_match[] = {
2594         {
2595                 .compatible = "ti,vpe",
2596         },
2597         {},
2598 };
2599 MODULE_DEVICE_TABLE(of, vpe_of_match);
2600 #endif
2601 
2602 static struct platform_driver vpe_pdrv = {
2603         .probe          = vpe_probe,
2604         .remove         = vpe_remove,
2605         .driver         = {
2606                 .name   = VPE_MODULE_NAME,
2607                 .of_match_table = of_match_ptr(vpe_of_match),
2608         },
2609 };
2610 
2611 module_platform_driver(vpe_pdrv);
2612 
2613 MODULE_DESCRIPTION("TI VPE driver");
2614 MODULE_AUTHOR("Dale Farnsworth, <dale@farnsworth.org>");
2615 MODULE_LICENSE("GPL");

/* [<][>][^][v][top][bottom][index][help] */