1*d968e50bSDetlev Casanova /* SPDX-License-Identifier: GPL-2.0 */ 2*d968e50bSDetlev Casanova /* 3*d968e50bSDetlev Casanova * Rockchip Video Decoder driver 4*d968e50bSDetlev Casanova * 5*d968e50bSDetlev Casanova * Copyright (C) 2019 Collabora, Ltd. 6*d968e50bSDetlev Casanova * 7*d968e50bSDetlev Casanova * Based on rkvdec driver by Google LLC. (Tomasz Figa <tfiga@chromium.org>) 8*d968e50bSDetlev Casanova * Based on s5p-mfc driver by Samsung Electronics Co., Ltd. 9*d968e50bSDetlev Casanova * Copyright (C) 2011 Samsung Electronics Co., Ltd. 10*d968e50bSDetlev Casanova */ 11*d968e50bSDetlev Casanova #ifndef RKVDEC_H_ 12*d968e50bSDetlev Casanova #define RKVDEC_H_ 13*d968e50bSDetlev Casanova 14*d968e50bSDetlev Casanova #include <linux/platform_device.h> 15*d968e50bSDetlev Casanova #include <linux/videodev2.h> 16*d968e50bSDetlev Casanova #include <linux/wait.h> 17*d968e50bSDetlev Casanova #include <linux/clk.h> 18*d968e50bSDetlev Casanova 19*d968e50bSDetlev Casanova #include <media/v4l2-ctrls.h> 20*d968e50bSDetlev Casanova #include <media/v4l2-device.h> 21*d968e50bSDetlev Casanova #include <media/v4l2-ioctl.h> 22*d968e50bSDetlev Casanova #include <media/videobuf2-core.h> 23*d968e50bSDetlev Casanova #include <media/videobuf2-dma-contig.h> 24*d968e50bSDetlev Casanova 25*d968e50bSDetlev Casanova struct rkvdec_ctx; 26*d968e50bSDetlev Casanova 27*d968e50bSDetlev Casanova struct rkvdec_ctrl_desc { 28*d968e50bSDetlev Casanova struct v4l2_ctrl_config cfg; 29*d968e50bSDetlev Casanova }; 30*d968e50bSDetlev Casanova 31*d968e50bSDetlev Casanova struct rkvdec_ctrls { 32*d968e50bSDetlev Casanova const struct rkvdec_ctrl_desc *ctrls; 33*d968e50bSDetlev Casanova unsigned int num_ctrls; 34*d968e50bSDetlev Casanova }; 35*d968e50bSDetlev Casanova 36*d968e50bSDetlev Casanova struct rkvdec_run { 37*d968e50bSDetlev Casanova struct { 38*d968e50bSDetlev Casanova struct vb2_v4l2_buffer *src; 39*d968e50bSDetlev Casanova struct vb2_v4l2_buffer *dst; 40*d968e50bSDetlev Casanova } bufs; 41*d968e50bSDetlev Casanova }; 42*d968e50bSDetlev Casanova 43*d968e50bSDetlev Casanova struct rkvdec_vp9_decoded_buffer_info { 44*d968e50bSDetlev Casanova /* Info needed when the decoded frame serves as a reference frame. */ 45*d968e50bSDetlev Casanova unsigned short width; 46*d968e50bSDetlev Casanova unsigned short height; 47*d968e50bSDetlev Casanova unsigned int bit_depth : 4; 48*d968e50bSDetlev Casanova }; 49*d968e50bSDetlev Casanova 50*d968e50bSDetlev Casanova struct rkvdec_decoded_buffer { 51*d968e50bSDetlev Casanova /* Must be the first field in this struct. */ 52*d968e50bSDetlev Casanova struct v4l2_m2m_buffer base; 53*d968e50bSDetlev Casanova 54*d968e50bSDetlev Casanova union { 55*d968e50bSDetlev Casanova struct rkvdec_vp9_decoded_buffer_info vp9; 56*d968e50bSDetlev Casanova }; 57*d968e50bSDetlev Casanova }; 58*d968e50bSDetlev Casanova 59*d968e50bSDetlev Casanova static inline struct rkvdec_decoded_buffer * 60*d968e50bSDetlev Casanova vb2_to_rkvdec_decoded_buf(struct vb2_buffer *buf) 61*d968e50bSDetlev Casanova { 62*d968e50bSDetlev Casanova return container_of(buf, struct rkvdec_decoded_buffer, 63*d968e50bSDetlev Casanova base.vb.vb2_buf); 64*d968e50bSDetlev Casanova } 65*d968e50bSDetlev Casanova 66*d968e50bSDetlev Casanova struct rkvdec_coded_fmt_ops { 67*d968e50bSDetlev Casanova int (*adjust_fmt)(struct rkvdec_ctx *ctx, 68*d968e50bSDetlev Casanova struct v4l2_format *f); 69*d968e50bSDetlev Casanova int (*start)(struct rkvdec_ctx *ctx); 70*d968e50bSDetlev Casanova void (*stop)(struct rkvdec_ctx *ctx); 71*d968e50bSDetlev Casanova int (*run)(struct rkvdec_ctx *ctx); 72*d968e50bSDetlev Casanova void (*done)(struct rkvdec_ctx *ctx, struct vb2_v4l2_buffer *src_buf, 73*d968e50bSDetlev Casanova struct vb2_v4l2_buffer *dst_buf, 74*d968e50bSDetlev Casanova enum vb2_buffer_state result); 75*d968e50bSDetlev Casanova int (*try_ctrl)(struct rkvdec_ctx *ctx, struct v4l2_ctrl *ctrl); 76*d968e50bSDetlev Casanova enum rkvdec_image_fmt (*get_image_fmt)(struct rkvdec_ctx *ctx, 77*d968e50bSDetlev Casanova struct v4l2_ctrl *ctrl); 78*d968e50bSDetlev Casanova }; 79*d968e50bSDetlev Casanova 80*d968e50bSDetlev Casanova enum rkvdec_image_fmt { 81*d968e50bSDetlev Casanova RKVDEC_IMG_FMT_ANY = 0, 82*d968e50bSDetlev Casanova RKVDEC_IMG_FMT_420_8BIT, 83*d968e50bSDetlev Casanova RKVDEC_IMG_FMT_420_10BIT, 84*d968e50bSDetlev Casanova RKVDEC_IMG_FMT_422_8BIT, 85*d968e50bSDetlev Casanova RKVDEC_IMG_FMT_422_10BIT, 86*d968e50bSDetlev Casanova }; 87*d968e50bSDetlev Casanova 88*d968e50bSDetlev Casanova struct rkvdec_decoded_fmt_desc { 89*d968e50bSDetlev Casanova u32 fourcc; 90*d968e50bSDetlev Casanova enum rkvdec_image_fmt image_fmt; 91*d968e50bSDetlev Casanova }; 92*d968e50bSDetlev Casanova 93*d968e50bSDetlev Casanova struct rkvdec_coded_fmt_desc { 94*d968e50bSDetlev Casanova u32 fourcc; 95*d968e50bSDetlev Casanova struct v4l2_frmsize_stepwise frmsize; 96*d968e50bSDetlev Casanova const struct rkvdec_ctrls *ctrls; 97*d968e50bSDetlev Casanova const struct rkvdec_coded_fmt_ops *ops; 98*d968e50bSDetlev Casanova unsigned int num_decoded_fmts; 99*d968e50bSDetlev Casanova const struct rkvdec_decoded_fmt_desc *decoded_fmts; 100*d968e50bSDetlev Casanova u32 subsystem_flags; 101*d968e50bSDetlev Casanova }; 102*d968e50bSDetlev Casanova 103*d968e50bSDetlev Casanova struct rkvdec_dev { 104*d968e50bSDetlev Casanova struct v4l2_device v4l2_dev; 105*d968e50bSDetlev Casanova struct media_device mdev; 106*d968e50bSDetlev Casanova struct video_device vdev; 107*d968e50bSDetlev Casanova struct v4l2_m2m_dev *m2m_dev; 108*d968e50bSDetlev Casanova struct device *dev; 109*d968e50bSDetlev Casanova struct clk_bulk_data *clocks; 110*d968e50bSDetlev Casanova void __iomem *regs; 111*d968e50bSDetlev Casanova struct mutex vdev_lock; /* serializes ioctls */ 112*d968e50bSDetlev Casanova struct delayed_work watchdog_work; 113*d968e50bSDetlev Casanova struct iommu_domain *empty_domain; 114*d968e50bSDetlev Casanova }; 115*d968e50bSDetlev Casanova 116*d968e50bSDetlev Casanova struct rkvdec_ctx { 117*d968e50bSDetlev Casanova struct v4l2_fh fh; 118*d968e50bSDetlev Casanova struct v4l2_format coded_fmt; 119*d968e50bSDetlev Casanova struct v4l2_format decoded_fmt; 120*d968e50bSDetlev Casanova const struct rkvdec_coded_fmt_desc *coded_fmt_desc; 121*d968e50bSDetlev Casanova struct v4l2_ctrl_handler ctrl_hdl; 122*d968e50bSDetlev Casanova struct rkvdec_dev *dev; 123*d968e50bSDetlev Casanova enum rkvdec_image_fmt image_fmt; 124*d968e50bSDetlev Casanova void *priv; 125*d968e50bSDetlev Casanova }; 126*d968e50bSDetlev Casanova 127*d968e50bSDetlev Casanova static inline struct rkvdec_ctx *fh_to_rkvdec_ctx(struct v4l2_fh *fh) 128*d968e50bSDetlev Casanova { 129*d968e50bSDetlev Casanova return container_of(fh, struct rkvdec_ctx, fh); 130*d968e50bSDetlev Casanova } 131*d968e50bSDetlev Casanova 132*d968e50bSDetlev Casanova struct rkvdec_aux_buf { 133*d968e50bSDetlev Casanova void *cpu; 134*d968e50bSDetlev Casanova dma_addr_t dma; 135*d968e50bSDetlev Casanova size_t size; 136*d968e50bSDetlev Casanova }; 137*d968e50bSDetlev Casanova 138*d968e50bSDetlev Casanova void rkvdec_run_preamble(struct rkvdec_ctx *ctx, struct rkvdec_run *run); 139*d968e50bSDetlev Casanova void rkvdec_run_postamble(struct rkvdec_ctx *ctx, struct rkvdec_run *run); 140*d968e50bSDetlev Casanova 141*d968e50bSDetlev Casanova extern const struct rkvdec_coded_fmt_ops rkvdec_h264_fmt_ops; 142*d968e50bSDetlev Casanova extern const struct rkvdec_coded_fmt_ops rkvdec_vp9_fmt_ops; 143*d968e50bSDetlev Casanova 144*d968e50bSDetlev Casanova #endif /* RKVDEC_H_ */ 145