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