FILE
cedrus.h
File preview with syntax highlighting.
linux-6.19.14/drivers/staging/media/sunxi/cedrus/cedrus.h
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * Cedrus VPU driver 4 * 5 * Copyright (C) 2016 Florent Revest <florent.revest@free-electrons.com> 6 * Copyright (C) 2018 Paul Kocialkowski <paul.kocialkowski@bootlin.com> 7 * Copyright (C) 2018 Bootlin 8 * 9 * Based on the vim2m driver, that is: 10 * 11 * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd. 12 * Pawel Osciak, <pawel@osciak.com> 13 * Marek Szyprowski, <m.szyprowski@samsung.com> 14 */ 15 16#ifndef _CEDRUS_H_ 17#define _CEDRUS_H_ 18 19#include <media/v4l2-ctrls.h> 20#include <media/v4l2-device.h> 21#include <media/v4l2-mem2mem.h> 22#include <media/videobuf2-v4l2.h> 23#include <media/videobuf2-dma-contig.h> 24 25#include <linux/iopoll.h> 26#include <linux/platform_device.h> 27#include <linux/workqueue.h> 28 29#define CEDRUS_NAME "cedrus" 30 31#define CEDRUS_CAPABILITY_UNTILED BIT(0) 32#define CEDRUS_CAPABILITY_H265_DEC BIT(1) 33#define CEDRUS_CAPABILITY_H264_DEC BIT(2) 34#define CEDRUS_CAPABILITY_MPEG2_DEC BIT(3) 35#define CEDRUS_CAPABILITY_VP8_DEC BIT(4) 36#define CEDRUS_CAPABILITY_H265_10_DEC BIT(5) 37 38enum cedrus_irq_status { 39 CEDRUS_IRQ_NONE, 40 CEDRUS_IRQ_ERROR, 41 CEDRUS_IRQ_OK, 42}; 43 44enum cedrus_h264_pic_type { 45 CEDRUS_H264_PIC_TYPE_FRAME = 0, 46 CEDRUS_H264_PIC_TYPE_FIELD, 47 CEDRUS_H264_PIC_TYPE_MBAFF, 48}; 49 50struct cedrus_control { 51 struct v4l2_ctrl_config cfg; 52 unsigned int capabilities; 53}; 54 55struct cedrus_h264_run { 56 const struct v4l2_ctrl_h264_decode_params *decode_params; 57 const struct v4l2_ctrl_h264_pps *pps; 58 const struct v4l2_ctrl_h264_scaling_matrix *scaling_matrix; 59 const struct v4l2_ctrl_h264_slice_params *slice_params; 60 const struct v4l2_ctrl_h264_sps *sps; 61 const struct v4l2_ctrl_h264_pred_weights *pred_weights; 62}; 63 64struct cedrus_mpeg2_run { 65 const struct v4l2_ctrl_mpeg2_sequence *sequence; 66 const struct v4l2_ctrl_mpeg2_picture *picture; 67 const struct v4l2_ctrl_mpeg2_quantisation *quantisation; 68}; 69 70struct cedrus_h265_run { 71 const struct v4l2_ctrl_hevc_sps *sps; 72 const struct v4l2_ctrl_hevc_pps *pps; 73 const struct v4l2_ctrl_hevc_slice_params *slice_params; 74 const struct v4l2_ctrl_hevc_decode_params *decode_params; 75 const struct v4l2_ctrl_hevc_scaling_matrix *scaling_matrix; 76 const u32 *entry_points; 77 u32 entry_points_count; 78}; 79 80struct cedrus_vp8_run { 81 const struct v4l2_ctrl_vp8_frame *frame_params; 82}; 83 84struct cedrus_run { 85 struct vb2_v4l2_buffer *src; 86 struct vb2_v4l2_buffer *dst; 87 88 union { 89 struct cedrus_h264_run h264; 90 struct cedrus_mpeg2_run mpeg2; 91 struct cedrus_h265_run h265; 92 struct cedrus_vp8_run vp8; 93 }; 94}; 95 96struct cedrus_buffer { 97 struct v4l2_m2m_buffer m2m_buf; 98 99 union { 100 struct { 101 unsigned int position; 102 enum cedrus_h264_pic_type pic_type; 103 void *mv_col_buf; 104 dma_addr_t mv_col_buf_dma; 105 ssize_t mv_col_buf_size; 106 } h264; 107 struct { 108 void *mv_col_buf; 109 dma_addr_t mv_col_buf_dma; 110 ssize_t mv_col_buf_size; 111 } h265; 112 } codec; 113}; 114 115struct cedrus_ctx { 116 struct v4l2_fh fh; 117 struct cedrus_dev *dev; 118 119 struct v4l2_pix_format src_fmt; 120 struct v4l2_pix_format dst_fmt; 121 struct cedrus_dec_ops *current_codec; 122 unsigned int bit_depth; 123 124 struct v4l2_ctrl_handler hdl; 125 struct v4l2_ctrl **ctrls; 126 127 union { 128 struct { 129 void *pic_info_buf; 130 dma_addr_t pic_info_buf_dma; 131 ssize_t pic_info_buf_size; 132 void *neighbor_info_buf; 133 dma_addr_t neighbor_info_buf_dma; 134 void *deblk_buf; 135 dma_addr_t deblk_buf_dma; 136 ssize_t deblk_buf_size; 137 void *intra_pred_buf; 138 dma_addr_t intra_pred_buf_dma; 139 ssize_t intra_pred_buf_size; 140 } h264; 141 struct { 142 void *neighbor_info_buf; 143 dma_addr_t neighbor_info_buf_addr; 144 void *entry_points_buf; 145 dma_addr_t entry_points_buf_addr; 146 } h265; 147 struct { 148 unsigned int last_frame_p_type; 149 unsigned int last_filter_type; 150 unsigned int last_sharpness_level; 151 152 u8 *entropy_probs_buf; 153 dma_addr_t entropy_probs_buf_dma; 154 } vp8; 155 } codec; 156}; 157 158static inline struct cedrus_ctx *cedrus_file2ctx(struct file *file) 159{ 160 return container_of(file_to_v4l2_fh(file), struct cedrus_ctx, fh); 161} 162 163struct cedrus_dec_ops { 164 void (*irq_clear)(struct cedrus_ctx *ctx); 165 void (*irq_disable)(struct cedrus_ctx *ctx); 166 enum cedrus_irq_status (*irq_status)(struct cedrus_ctx *ctx); 167 int (*setup)(struct cedrus_ctx *ctx, struct cedrus_run *run); 168 int (*start)(struct cedrus_ctx *ctx); 169 void (*stop)(struct cedrus_ctx *ctx); 170 void (*trigger)(struct cedrus_ctx *ctx); 171 unsigned int (*extra_cap_size)(struct cedrus_ctx *ctx, 172 struct v4l2_pix_format *pix_fmt); 173}; 174 175struct cedrus_variant { 176 unsigned int capabilities; 177 unsigned int mod_rate; 178}; 179 180struct cedrus_dev { 181 struct v4l2_device v4l2_dev; 182 struct video_device vfd; 183 struct media_device mdev; 184 struct media_pad pad[2]; 185 struct platform_device *pdev; 186 struct device *dev; 187 struct v4l2_m2m_dev *m2m_dev; 188 189 /* Device file mutex */ 190 struct mutex dev_mutex; 191 192 void __iomem *base; 193 194 struct clk *mod_clk; 195 struct clk *ahb_clk; 196 struct clk *ram_clk; 197 198 struct reset_control *rstc; 199 200 unsigned int capabilities; 201 202 struct delayed_work watchdog_work; 203}; 204 205extern struct cedrus_dec_ops cedrus_dec_ops_mpeg2; 206extern struct cedrus_dec_ops cedrus_dec_ops_h264; 207extern struct cedrus_dec_ops cedrus_dec_ops_h265; 208extern struct cedrus_dec_ops cedrus_dec_ops_vp8; 209 210static inline void cedrus_write(struct cedrus_dev *dev, u32 reg, u32 val) 211{ 212 writel(val, dev->base + reg); 213} 214 215static inline u32 cedrus_read(struct cedrus_dev *dev, u32 reg) 216{ 217 return readl(dev->base + reg); 218} 219 220static inline u32 cedrus_wait_for(struct cedrus_dev *dev, u32 reg, u32 flag) 221{ 222 u32 value; 223 224 return readl_poll_timeout_atomic(dev->base + reg, value, 225 (value & flag) == 0, 10, 1000); 226} 227 228static inline dma_addr_t cedrus_buf_addr(struct vb2_buffer *buf, 229 struct v4l2_pix_format *pix_fmt, 230 unsigned int plane) 231{ 232 dma_addr_t addr = vb2_dma_contig_plane_dma_addr(buf, 0); 233 234 return addr + (pix_fmt ? (dma_addr_t)pix_fmt->bytesperline * 235 pix_fmt->height * plane : 0); 236} 237 238static inline dma_addr_t cedrus_dst_buf_addr(struct cedrus_ctx *ctx, 239 struct vb2_buffer *buf, 240 unsigned int plane) 241{ 242 return buf ? cedrus_buf_addr(buf, &ctx->dst_fmt, plane) : 0; 243} 244 245static inline void cedrus_write_ref_buf_addr(struct cedrus_ctx *ctx, 246 struct vb2_queue *q, 247 u64 timestamp, 248 u32 luma_reg, 249 u32 chroma_reg) 250{ 251 struct cedrus_dev *dev = ctx->dev; 252 struct vb2_buffer *buf = vb2_find_buffer(q, timestamp); 253 254 cedrus_write(dev, luma_reg, cedrus_dst_buf_addr(ctx, buf, 0)); 255 cedrus_write(dev, chroma_reg, cedrus_dst_buf_addr(ctx, buf, 1)); 256} 257 258static inline struct cedrus_buffer * 259vb2_v4l2_to_cedrus_buffer(const struct vb2_v4l2_buffer *p) 260{ 261 return container_of(p, struct cedrus_buffer, m2m_buf.vb); 262} 263 264static inline struct cedrus_buffer * 265vb2_to_cedrus_buffer(const struct vb2_buffer *p) 266{ 267 return vb2_v4l2_to_cedrus_buffer(to_vb2_v4l2_buffer(p)); 268} 269 270static inline bool 271cedrus_is_capable(struct cedrus_ctx *ctx, unsigned int capabilities) 272{ 273 return (ctx->dev->capabilities & capabilities) == capabilities; 274} 275 276void *cedrus_find_control_data(struct cedrus_ctx *ctx, u32 id); 277u32 cedrus_get_num_of_controls(struct cedrus_ctx *ctx, u32 id); 278 279#endif
~/
Read-only file preview.