diff options
author | Ezequiel Garcia <ezequiel@vanguardiasur.com.ar> | 2022-07-18 23:41:21 +0200 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@kernel.org> | 2022-08-31 10:23:50 +0200 |
commit | fbb6c848dd89786fe24856ee6b5e773910ded29c (patch) | |
tree | a14c9f2ed78271386c32a8e086ddf3079b3769c4 /drivers/staging | |
parent | 61890ccaefaff89f5babd2c8412fd222c3f5fe38 (diff) |
media: destage Hantro VPU driver
The Hantro mainline driver has been used in production
since several years and was only kept as a staging driver
due the stateless CODEC controls.
Now that all the stateless CODEC controls have been moved
out of staging, graduate the driver as well.
Signed-off-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
Diffstat (limited to 'drivers/staging')
39 files changed, 0 insertions, 12443 deletions
diff --git a/drivers/staging/media/Kconfig b/drivers/staging/media/Kconfig index 56eeecb03b31..d4f03b203ae5 100644 --- a/drivers/staging/media/Kconfig +++ b/drivers/staging/media/Kconfig @@ -22,8 +22,6 @@ if STAGING_MEDIA && MEDIA_SUPPORT # Please keep them in alphabetic order source "drivers/staging/media/atomisp/Kconfig" -source "drivers/staging/media/hantro/Kconfig" - source "drivers/staging/media/imx/Kconfig" source "drivers/staging/media/ipu3/Kconfig" diff --git a/drivers/staging/media/Makefile b/drivers/staging/media/Makefile index 874df4953729..a387692b84f2 100644 --- a/drivers/staging/media/Makefile +++ b/drivers/staging/media/Makefile @@ -10,7 +10,6 @@ obj-$(CONFIG_VIDEO_ROCKCHIP_VDEC) += rkvdec/ obj-$(CONFIG_VIDEO_STKWEBCAM) += deprecated/stkwebcam/ obj-$(CONFIG_VIDEO_SUNXI) += sunxi/ obj-$(CONFIG_VIDEO_TEGRA) += tegra-video/ -obj-$(CONFIG_VIDEO_HANTRO) += hantro/ obj-$(CONFIG_VIDEO_IPU3_IMGU) += ipu3/ obj-$(CONFIG_VIDEO_TM6000) += deprecated/tm6000/ obj-$(CONFIG_VIDEO_VIU) += deprecated/fsl-viu/ diff --git a/drivers/staging/media/hantro/Kconfig b/drivers/staging/media/hantro/Kconfig deleted file mode 100644 index 0172a6822ec2..000000000000 --- a/drivers/staging/media/hantro/Kconfig +++ /dev/null @@ -1,50 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -config VIDEO_HANTRO - tristate "Hantro VPU driver" - depends on ARCH_MXC || ARCH_ROCKCHIP || ARCH_AT91 || ARCH_SUNXI || COMPILE_TEST - depends on VIDEO_DEV - select MEDIA_CONTROLLER - select MEDIA_CONTROLLER_REQUEST_API - select VIDEOBUF2_DMA_CONTIG - select VIDEOBUF2_VMALLOC - select V4L2_MEM2MEM_DEV - select V4L2_H264 - select V4L2_VP9 - help - Support for the Hantro IP based Video Processing Units present on - Rockchip and NXP i.MX8M SoCs, which accelerate video and image - encoding and decoding. - To compile this driver as a module, choose M here: the module - will be called hantro-vpu. - -config VIDEO_HANTRO_IMX8M - bool "Hantro VPU i.MX8M support" - depends on VIDEO_HANTRO - depends on ARCH_MXC || COMPILE_TEST - default y - help - Enable support for i.MX8M SoCs. - -config VIDEO_HANTRO_SAMA5D4 - bool "Hantro VDEC SAMA5D4 support" - depends on VIDEO_HANTRO - depends on ARCH_AT91 || COMPILE_TEST - default y - help - Enable support for Microchip SAMA5D4 SoCs. - -config VIDEO_HANTRO_ROCKCHIP - bool "Hantro VPU Rockchip support" - depends on VIDEO_HANTRO - depends on ARCH_ROCKCHIP || COMPILE_TEST - default y - help - Enable support for RK3288, RK3328, and RK3399 SoCs. - -config VIDEO_HANTRO_SUNXI - bool "Hantro VPU Allwinner support" - depends on VIDEO_HANTRO - depends on ARCH_SUNXI || COMPILE_TEST - default y - help - Enable support for H6 SoC. diff --git a/drivers/staging/media/hantro/Makefile b/drivers/staging/media/hantro/Makefile deleted file mode 100644 index ebd5ede7bef7..000000000000 --- a/drivers/staging/media/hantro/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 - -obj-$(CONFIG_VIDEO_HANTRO) += hantro-vpu.o - -hantro-vpu-y += \ - hantro_drv.o \ - hantro_v4l2.o \ - hantro_postproc.o \ - hantro_h1_jpeg_enc.o \ - hantro_g1.o \ - hantro_g1_h264_dec.o \ - hantro_g1_mpeg2_dec.o \ - hantro_g1_vp8_dec.o \ - hantro_g2.o \ - hantro_g2_hevc_dec.o \ - hantro_g2_vp9_dec.o \ - rockchip_vpu2_hw_jpeg_enc.o \ - rockchip_vpu2_hw_h264_dec.o \ - rockchip_vpu2_hw_mpeg2_dec.o \ - rockchip_vpu2_hw_vp8_dec.o \ - hantro_jpeg.o \ - hantro_h264.o \ - hantro_hevc.o \ - hantro_mpeg2.o \ - hantro_vp8.o \ - hantro_vp9.o - -hantro-vpu-$(CONFIG_VIDEO_HANTRO_IMX8M) += \ - imx8m_vpu_hw.o - -hantro-vpu-$(CONFIG_VIDEO_HANTRO_SAMA5D4) += \ - sama5d4_vdec_hw.o - -hantro-vpu-$(CONFIG_VIDEO_HANTRO_ROCKCHIP) += \ - rockchip_vpu_hw.o - -hantro-vpu-$(CONFIG_VIDEO_HANTRO_SUNXI) += \ - sunxi_vpu_hw.o diff --git a/drivers/staging/media/hantro/TODO b/drivers/staging/media/hantro/TODO deleted file mode 100644 index 8483ff482146..000000000000 --- a/drivers/staging/media/hantro/TODO +++ /dev/null @@ -1,2 +0,0 @@ -The V4L controls for the HEVC CODEC are not yet part of the stable uABI, -we are keeping this driver in staging until the HEVC uABI has been merged. diff --git a/drivers/staging/media/hantro/hantro.h b/drivers/staging/media/hantro/hantro.h deleted file mode 100644 index 2989ebc631cc..000000000000 --- a/drivers/staging/media/hantro/hantro.h +++ /dev/null @@ -1,485 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Hantro VPU codec driver - * - * Copyright 2018 Google LLC. - * Tomasz Figa <tfiga@chromium.org> - * - * Based on s5p-mfc driver by Samsung Electronics Co., Ltd. - * Copyright (C) 2011 Samsung Electronics Co., Ltd. - */ - -#ifndef HANTRO_H_ -#define HANTRO_H_ - -#include <linux/platform_device.h> -#include <linux/videodev2.h> -#include <linux/wait.h> -#include <linux/clk.h> -#include <linux/reset.h> - -#include <media/v4l2-ctrls.h> -#include <media/v4l2-device.h> -#include <media/v4l2-ioctl.h> -#include <media/v4l2-mem2mem.h> -#include <media/videobuf2-core.h> -#include <media/videobuf2-dma-contig.h> - -#include "hantro_hw.h" - -struct hantro_ctx; -struct hantro_codec_ops; -struct hantro_postproc_ops; - -#define HANTRO_JPEG_ENCODER BIT(0) -#define HANTRO_ENCODERS 0x0000ffff -#define HANTRO_MPEG2_DECODER BIT(16) -#define HANTRO_VP8_DECODER BIT(17) -#define HANTRO_H264_DECODER BIT(18) -#define HANTRO_HEVC_DECODER BIT(19) -#define HANTRO_VP9_DECODER BIT(20) -#define HANTRO_DECODERS 0xffff0000 - -/** - * struct hantro_irq - irq handler and name - * - * @name: irq name for device tree lookup - * @handler: interrupt handler - */ -struct hantro_irq { - const char *name; - irqreturn_t (*handler)(int irq, void *priv); -}; - -/** - * struct hantro_variant - information about VPU hardware variant - * - * @enc_offset: Offset from VPU base to encoder registers. - * @dec_offset: Offset from VPU base to decoder registers. - * @enc_fmts: Encoder formats. - * @num_enc_fmts: Number of encoder formats. - * @dec_fmts: Decoder formats. - * @num_dec_fmts: Number of decoder formats. - * @postproc_fmts: Post-processor formats. - * @num_postproc_fmts: Number of post-processor formats. - * @postproc_ops: Post-processor ops. - * @codec: Supported codecs - * @codec_ops: Codec ops. - * @init: Initialize hardware, optional. - * @runtime_resume: reenable hardware after power gating, optional. - * @irqs: array of irq names and interrupt handlers - * @num_irqs: number of irqs in the array - * @clk_names: array of clock names - * @num_clocks: number of clocks in the array - * @reg_names: array of register range names - * @num_regs: number of register range names in the array - * @double_buffer: core needs double buffering - * @legacy_regs: core uses legacy register set - * @late_postproc: postproc must be set up at the end of the job - */ -struct hantro_variant { - unsigned int enc_offset; - unsigned int dec_offset; - const struct hantro_fmt *enc_fmts; - unsigned int num_enc_fmts; - const struct hantro_fmt *dec_fmts; - unsigned int num_dec_fmts; - const struct hantro_fmt *postproc_fmts; - unsigned int num_postproc_fmts; - const struct hantro_postproc_ops *postproc_ops; - unsigned int codec; - const struct hantro_codec_ops *codec_ops; - int (*init)(struct hantro_dev *vpu); - int (*runtime_resume)(struct hantro_dev *vpu); - const struct hantro_irq *irqs; - int num_irqs; - const char * const *clk_names; - int num_clocks; - const char * const *reg_names; - int num_regs; - unsigned int double_buffer : 1; - unsigned int legacy_regs : 1; - unsigned int late_postproc : 1; -}; - -/** - * enum hantro_codec_mode - codec operating mode. - * @HANTRO_MODE_NONE: No operating mode. Used for RAW video formats. - * @HANTRO_MODE_JPEG_ENC: JPEG encoder. - * @HANTRO_MODE_H264_DEC: H264 decoder. - * @HANTRO_MODE_MPEG2_DEC: MPEG-2 decoder. - * @HANTRO_MODE_VP8_DEC: VP8 decoder. - * @HANTRO_MODE_HEVC_DEC: HEVC decoder. - * @HANTRO_MODE_VP9_DEC: VP9 decoder. - */ -enum hantro_codec_mode { - HANTRO_MODE_NONE = -1, - HANTRO_MODE_JPEG_ENC, - HANTRO_MODE_H264_DEC, - HANTRO_MODE_MPEG2_DEC, - HANTRO_MODE_VP8_DEC, - HANTRO_MODE_HEVC_DEC, - HANTRO_MODE_VP9_DEC, -}; - -/* - * struct hantro_ctrl - helper type to declare supported controls - * @codec: codec id this control belong to (HANTRO_JPEG_ENCODER, etc.) - * @cfg: control configuration - */ -struct hantro_ctrl { - unsigned int codec; - struct v4l2_ctrl_config cfg; -}; - -/* - * struct hantro_func - Hantro VPU functionality - * - * @id: processing functionality ID (can be - * %MEDIA_ENT_F_PROC_VIDEO_ENCODER or - * %MEDIA_ENT_F_PROC_VIDEO_DECODER) - * @vdev: &struct video_device that exposes the encoder or - * decoder functionality - * @source_pad: &struct media_pad with the source pad. - * @sink: &struct media_entity pointer with the sink entity - * @sink_pad: &struct media_pad with the sink pad. - * @proc: &struct media_entity pointer with the M2M device itself. - * @proc_pads: &struct media_pad with the @proc pads. - * @intf_devnode: &struct media_intf devnode pointer with the interface - * with controls the M2M device. - * - * Contains everything needed to attach the video device to the media device. - */ -struct hantro_func { - unsigned int id; - struct video_device vdev; - struct media_pad source_pad; - struct media_entity sink; - struct media_pad sink_pad; - struct media_entity proc; - struct media_pad proc_pads[2]; - struct media_intf_devnode *intf_devnode; -}; - -static inline struct hantro_func * -hantro_vdev_to_func(struct video_device *vdev) -{ - return container_of(vdev, struct hantro_func, vdev); -} - -/** - * struct hantro_dev - driver data - * @v4l2_dev: V4L2 device to register video devices for. - * @m2m_dev: mem2mem device associated to this device. - * @mdev: media device associated to this device. - * @encoder: encoder functionality. - * @decoder: decoder functionality. - * @pdev: Pointer to VPU platform device. - * @dev: Pointer to device for convenient logging using - * dev_ macros. - * @clocks: Array of clock handles. - * @resets: Array of reset handles. - * @reg_bases: Mapped addresses of VPU registers. - * @enc_base: Mapped address of VPU encoder register for convenience. - * @dec_base: Mapped address of VPU decoder register for convenience. - * @ctrl_base: Mapped address of VPU control block. - * @vpu_mutex: Mutex to synchronize V4L2 calls. - * @irqlock: Spinlock to synchronize access to data structures - * shared with interrupt handlers. - * @variant: Hardware variant-specific parameters. - * @watchdog_work: Delayed work for hardware timeout handling. - */ -struct hantro_dev { - struct v4l2_device v4l2_dev; - struct v4l2_m2m_dev *m2m_dev; - struct media_device mdev; - struct hantro_func *encoder; - struct hantro_func *decoder; - struct platform_device *pdev; - struct device *dev; - struct clk_bulk_data *clocks; - struct reset_control *resets; - void __iomem **reg_bases; - void __iomem *enc_base; - void __iomem *dec_base; - void __iomem *ctrl_base; - - struct mutex vpu_mutex; /* video_device lock */ - spinlock_t irqlock; - const struct hantro_variant *variant; - struct delayed_work watchdog_work; -}; - -/** - * struct hantro_ctx - Context (instance) private data. - * - * @dev: VPU driver data to which the context belongs. - * @fh: V4L2 file handler. - * @is_encoder: Decoder or encoder context? - * - * @sequence_cap: Sequence counter for capture queue - * @sequence_out: Sequence counter for output queue - * - * @vpu_src_fmt: Descriptor of active source format. - * @src_fmt: V4L2 pixel format of active source format. - * @vpu_dst_fmt: Descriptor of active destination format. - * @dst_fmt: V4L2 pixel format of active destination format. - * - * @ctrl_handler: Control handler used to register controls. - * @jpeg_quality: User-specified JPEG compression quality. - * @bit_depth: Bit depth of current frame - * - * @codec_ops: Set of operations related to codec mode. - * @postproc: Post-processing context. - * @h264_dec: H.264-decoding context. - * @jpeg_enc: JPEG-encoding context. - * @mpeg2_dec: MPEG-2-decoding context. - * @vp8_dec: VP8-decoding context. - * @hevc_dec: HEVC-decoding context. - * @vp9_dec: VP9-decoding context. - */ -struct hantro_ctx { - struct hantro_dev *dev; - struct v4l2_fh fh; - bool is_encoder; - - u32 sequence_cap; - u32 sequence_out; - - const struct hantro_fmt *vpu_src_fmt; - struct v4l2_pix_format_mplane src_fmt; - const struct hantro_fmt *vpu_dst_fmt; - struct v4l2_pix_format_mplane dst_fmt; - - struct v4l2_ctrl_handler ctrl_handler; - int jpeg_quality; - int bit_depth; - - const struct hantro_codec_ops *codec_ops; - struct hantro_postproc_ctx postproc; - - /* Specific for particular codec modes. */ - union { - struct hantro_h264_dec_hw_ctx h264_dec; - struct hantro_mpeg2_dec_hw_ctx mpeg2_dec; - struct hantro_vp8_dec_hw_ctx vp8_dec; - struct hantro_hevc_dec_hw_ctx hevc_dec; - struct hantro_vp9_dec_hw_ctx vp9_dec; - }; -}; - -/** - * struct hantro_fmt - information about supported video formats. - * @name: Human readable name of the format. - * @fourcc: FourCC code of the format. See V4L2_PIX_FMT_*. - * @codec_mode: Codec mode related to this format. See - * enum hantro_codec_mode. - * @header_size: Optional header size. Currently used by JPEG encoder. - * @max_depth: Maximum depth, for bitstream formats - * @enc_fmt: Format identifier for encoder registers. - * @frmsize: Supported range of frame sizes (only for bitstream formats). - * @postprocessed: Indicates if this format needs the post-processor. - * @match_depth: Indicates if format bit depth must match video bit depth - */ -struct hantro_fmt { - char *name; - u32 fourcc; - enum hantro_codec_mode codec_mode; - int header_size; - int max_depth; - enum hantro_enc_fmt enc_fmt; - struct v4l2_frmsize_stepwise frmsize; - bool postprocessed; - bool match_depth; -}; - -struct hantro_reg { - u32 base; - u32 shift; - u32 mask; -}; - -struct hantro_postproc_regs { - struct hantro_reg pipeline_en; - struct hantro_reg max_burst; - struct hantro_reg clk_gate; - struct hantro_reg out_swap32; - struct hantro_reg out_endian; - struct hantro_reg out_luma_base; - struct hantro_reg input_width; - struct hantro_reg input_height; - struct hantro_reg output_width; - struct hantro_reg output_height; - struct hantro_reg input_fmt; - struct hantro_reg output_fmt; - struct hantro_reg orig_width; - struct hantro_reg display_width; -}; - -struct hantro_vp9_decoded_buffer_info { - /* Info needed when the decoded frame serves as a reference frame. */ - unsigned short width; - unsigned short height; - u32 bit_depth : 4; -}; - -struct hantro_decoded_buffer { - /* Must be the first field in this struct. */ - struct v4l2_m2m_buffer base; - - union { - struct hantro_vp9_decoded_buffer_info vp9; - }; -}; - -/* Logging helpers */ - -/** - * DOC: hantro_debug: Module parameter to control level of debugging messages. - * - * Level of debugging messages can be controlled by bits of - * module parameter called "debug". Meaning of particular - * bits is as follows: - * - * bit 0 - global information: mode, size, init, release - * bit 1 - each run start/result information - * bit 2 - contents of small controls from userspace - * bit 3 - contents of big controls from userspace - * bit 4 - detail fmt, ctrl, buffer q/dq information - * bit 5 - detail function enter/leave trace information - * bit 6 - register write/read information - */ -extern int hantro_debug; - -#define vpu_debug(level, fmt, args...) \ - do { \ - if (hantro_debug & BIT(level)) \ - pr_info("%s:%d: " fmt, \ - __func__, __LINE__, ##args); \ - } while (0) - -#define vpu_err(fmt, args...) \ - pr_err("%s:%d: " fmt, __func__, __LINE__, ##args) - -/* Structure access helpers. */ -static inline struct hantro_ctx *fh_to_ctx(struct v4l2_fh *fh) -{ - return container_of(fh, struct hantro_ctx, fh); -} - -/* Register accessors. */ -static inline void vepu_write_relaxed(struct hantro_dev *vpu, - u32 val, u32 reg) -{ - vpu_debug(6, "0x%04x = 0x%08x\n", reg / 4, val); - writel_relaxed(val, vpu->enc_base + reg); -} - -static inline void vepu_write(struct hantro_dev *vpu, u32 val, u32 reg) -{ - vpu_debug(6, "0x%04x = 0x%08x\n", reg / 4, val); - writel(val, vpu->enc_base + reg); -} - -static inline u32 vepu_read(struct hantro_dev *vpu, u32 reg) -{ - u32 val = readl(vpu->enc_base + reg); - - vpu_debug(6, "0x%04x = 0x%08x\n", reg / 4, val); - return val; -} - -static inline void vdpu_write_relaxed(struct hantro_dev *vpu, - u32 val, u32 reg) -{ - vpu_debug(6, "0x%04x = 0x%08x\n", reg / 4, val); - writel_relaxed(val, vpu->dec_base + reg); -} - -static inline void vdpu_write(struct hantro_dev *vpu, u32 val, u32 reg) -{ - vpu_debug(6, "0x%04x = 0x%08x\n", reg / 4, val); - writel(val, vpu->dec_base + reg); -} - -static inline void hantro_write_addr(struct hantro_dev *vpu, - unsigned long offset, - dma_addr_t addr) -{ - vdpu_write(vpu, addr & 0xffffffff, offset); -} - -static inline u32 vdpu_read(struct hantro_dev *vpu, u32 reg) -{ - u32 val = readl(vpu->dec_base + reg); - - vpu_debug(6, "0x%04x = 0x%08x\n", reg / 4, val); - return val; -} - -static inline u32 vdpu_read_mask(struct hantro_dev *vpu, - const struct hantro_reg *reg, - u32 val) -{ - u32 v; - - v = vdpu_read(vpu, reg->base); - v &= ~(reg->mask << reg->shift); - v |= ((val & reg->mask) << reg->shift); - return v; -} - -static inline void hantro_reg_write(struct hantro_dev *vpu, - const struct hantro_reg *reg, - u32 val) -{ - vdpu_write_relaxed(vpu, vdpu_read_mask(vpu, reg, val), reg->base); -} - -static inline void hantro_reg_write_s(struct hantro_dev *vpu, - const struct hantro_reg *reg, - u32 val) -{ - vdpu_write(vpu, vdpu_read_mask(vpu, reg, val), reg->base); -} - -void *hantro_get_ctrl(struct hantro_ctx *ctx, u32 id); -dma_addr_t hantro_get_ref(struct hantro_ctx *ctx, u64 ts); - -static inline struct vb2_v4l2_buffer * -hantro_get_src_buf(struct hantro_ctx *ctx) -{ - return v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); -} - -static inline struct vb2_v4l2_buffer * -hantro_get_dst_buf(struct hantro_ctx *ctx) -{ - return v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); -} - -bool hantro_needs_postproc(const struct hantro_ctx *ctx, - const struct hantro_fmt *fmt); - -static inline dma_addr_t -hantro_get_dec_buf_addr(struct hantro_ctx *ctx, struct vb2_buffer *vb) -{ - if (hantro_needs_postproc(ctx, ctx->vpu_dst_fmt)) - return ctx->postproc.dec_q[vb->index].dma; - return vb2_dma_contig_plane_dma_addr(vb, 0); -} - -static inline struct hantro_decoded_buffer * -vb2_to_hantro_decoded_buf(struct vb2_buffer *buf) -{ - return container_of(buf, struct hantro_decoded_buffer, base.vb.vb2_buf); -} - -void hantro_postproc_disable(struct hantro_ctx *ctx); -void hantro_postproc_enable(struct hantro_ctx *ctx); -void hantro_postproc_free(struct hantro_ctx *ctx); -int hantro_postproc_alloc(struct hantro_ctx *ctx); -int hanto_postproc_enum_framesizes(struct hantro_ctx *ctx, - struct v4l2_frmsizeenum *fsize); - -#endif /* HANTRO_H_ */ diff --git a/drivers/staging/media/hantro/hantro_drv.c b/drivers/staging/media/hantro/hantro_drv.c deleted file mode 100644 index 2036f72eeb4a..000000000000 --- a/drivers/staging/media/hantro/hantro_drv.c +++ /dev/null @@ -1,1146 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Hantro VPU codec driver - * - * Copyright (C) 2018 Collabora, Ltd. - * Copyright 2018 Google LLC. - * Tomasz Figa <tfiga@chromium.org> - * - * Based on s5p-mfc driver by Samsung Electronics Co., Ltd. - * Copyright (C) 2011 Samsung Electronics Co., Ltd. - */ - -#include <linux/clk.h> -#include <linux/module.h> -#include <linux/of.h> -#include <linux/platform_device.h> -#include <linux/pm.h> -#include <linux/pm_runtime.h> -#include <linux/slab.h> -#include <linux/videodev2.h> -#include <linux/workqueue.h> -#include <media/v4l2-event.h> -#include <media/v4l2-mem2mem.h> -#include <media/videobuf2-core.h> -#include <media/videobuf2-vmalloc.h> - -#include "hantro_v4l2.h" -#include "hantro.h" -#include "hantro_hw.h" - -#define DRIVER_NAME "hantro-vpu" - -int hantro_debug; -module_param_named(debug, hantro_debug, int, 0644); -MODULE_PARM_DESC(debug, - "Debug level - higher value produces more verbose messages"); - -void *hantro_get_ctrl(struct hantro_ctx *ctx, u32 id) -{ - struct v4l2_ctrl *ctrl; - - ctrl = v4l2_ctrl_find(&ctx->ctrl_handler, id); - return ctrl ? ctrl->p_cur.p : NULL; -} - -dma_addr_t hantro_get_ref(struct hantro_ctx *ctx, u64 ts) -{ - struct vb2_queue *q = v4l2_m2m_get_dst_vq(ctx->fh.m2m_ctx); - struct vb2_buffer *buf; - - buf = vb2_find_buffer(q, ts); - if (!buf) - return 0; - return hantro_get_dec_buf_addr(ctx, buf); -} - -static const struct v4l2_event hantro_eos_event = { - .type = V4L2_EVENT_EOS -}; - -static void hantro_job_finish_no_pm(struct hantro_dev *vpu, - struct hantro_ctx *ctx, - enum vb2_buffer_state result) -{ - struct vb2_v4l2_buffer *src, *dst; - - src = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); - dst = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); - - if (WARN_ON(!src)) - return; - if (WARN_ON(!dst)) - return; - - src->sequence = ctx->sequence_out++; - dst->sequence = ctx->sequence_cap++; - - if (v4l2_m2m_is_last_draining_src_buf(ctx->fh.m2m_ctx, src)) { - dst->flags |= V4L2_BUF_FLAG_LAST; - v4l2_event_queue_fh(&ctx->fh, &hantro_eos_event); - v4l2_m2m_mark_stopped(ctx->fh.m2m_ctx); - } - - v4l2_m2m_buf_done_and_job_finish(ctx->dev->m2m_dev, ctx->fh.m2m_ctx, - result); -} - -static void hantro_job_finish(struct hantro_dev *vpu, - struct hantro_ctx *ctx, - enum vb2_buffer_state result) -{ - pm_runtime_mark_last_busy(vpu->dev); - pm_runtime_put_autosuspend(vpu->dev); - - clk_bulk_disable(vpu->variant->num_clocks, vpu->clocks); - - hantro_job_finish_no_pm(vpu, ctx, result); -} - -void hantro_irq_done(struct hantro_dev *vpu, - enum vb2_buffer_state result) -{ - struct hantro_ctx *ctx = - v4l2_m2m_get_curr_priv(vpu->m2m_dev); - - /* - * If cancel_delayed_work returns false - * the timeout expired. The watchdog is running, - * and will take care of finishing the job. - */ - if (cancel_delayed_work(&vpu->watchdog_work)) { - if (result == VB2_BUF_STATE_DONE && ctx->codec_ops->done) - ctx->codec_ops->done(ctx); - hantro_job_finish(vpu, ctx, result); - } -} - -void hantro_watchdog(struct work_struct *work) -{ - struct hantro_dev *vpu; - struct hantro_ctx *ctx; - - vpu = container_of(to_delayed_work(work), - struct hantro_dev, watchdog_work); - ctx = v4l2_m2m_get_curr_priv(vpu->m2m_dev); - if (ctx) { - vpu_err("frame processing timed out!\n"); - ctx->codec_ops->reset(ctx); - hantro_job_finish(vpu, ctx, VB2_BUF_STATE_ERROR); - } -} - -void hantro_start_prepare_run(struct hantro_ctx *ctx) -{ - struct vb2_v4l2_buffer *src_buf; - - src_buf = hantro_get_src_buf(ctx); - v4l2_ctrl_request_setup(src_buf->vb2_buf.req_obj.req, - &ctx->ctrl_handler); - - if (!ctx->is_encoder && !ctx->dev->variant->late_postproc) { - if (hantro_needs_postproc(ctx, ctx->vpu_dst_fmt)) - hantro_postproc_enable(ctx); - else - hantro_postproc_disable(ctx); - } -} - -void hantro_end_prepare_run(struct hantro_ctx *ctx) -{ - struct vb2_v4l2_buffer *src_buf; - - if (!ctx->is_encoder && ctx->dev->variant->late_postproc) { - if (hantro_needs_postproc(ctx, ctx->vpu_dst_fmt)) - hantro_postproc_enable(ctx); - else - hantro_postproc_disable(ctx); - } - - src_buf = hantro_get_src_buf(ctx); - v4l2_ctrl_request_complete(src_buf->vb2_buf.req_obj.req, - &ctx->ctrl_handler); - - /* Kick the watchdog. */ - schedule_delayed_work(&ctx->dev->watchdog_work, - msecs_to_jiffies(2000)); -} - -static void device_run(void *priv) -{ - struct hantro_ctx *ctx = priv; - struct vb2_v4l2_buffer *src, *dst; - int ret; - - src = hantro_get_src_buf(ctx); - dst = hantro_get_dst_buf(ctx); - - ret = pm_runtime_resume_and_get(ctx->dev->dev); - if (ret < 0) - goto err_cancel_job; - - ret = clk_bulk_enable(ctx->dev->variant->num_clocks, ctx->dev->clocks); - if (ret) - goto err_cancel_job; - - v4l2_m2m_buf_copy_metadata(src, dst, true); - - if (ctx->codec_ops->run(ctx)) - goto err_cancel_job; - - return; - -err_cancel_job: - hantro_job_finish_no_pm(ctx->dev, ctx, VB2_BUF_STATE_ERROR); -} - -static const struct v4l2_m2m_ops vpu_m2m_ops = { - .device_run = device_run, -}; - -static int -queue_init(void *priv, struct vb2_queue *src_vq, struct vb2_queue *dst_vq) -{ - struct hantro_ctx *ctx = priv; - int ret; - - src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; - src_vq->io_modes = VB2_MMAP | VB2_DMABUF; - src_vq->drv_priv = ctx; - src_vq->ops = &hantro_queue_ops; - src_vq->mem_ops = &vb2_dma_contig_memops; - - /* - * Driver does mostly sequential access, so sacrifice TLB efficiency - * for faster allocation. Also, no CPU access on the source queue, - * so no kernel mapping needed. - */ - src_vq->dma_attrs = DMA_ATTR_ALLOC_SINGLE_PAGES | - DMA_ATTR_NO_KERNEL_MAPPING; - src_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer); - src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; - src_vq->lock = &ctx->dev->vpu_mutex; - src_vq->dev = ctx->dev->v4l2_dev.dev; - src_vq->supports_requests = true; - - ret = vb2_queue_init(src_vq); - if (ret) - return ret; - - dst_vq->bidirectional = true; - dst_vq->mem_ops = &vb2_dma_contig_memops; - dst_vq->dma_attrs = DMA_ATTR_ALLOC_SINGLE_PAGES; - /* - * The Kernel needs access to the JPEG destination buffer for the - * JPEG encoder to fill in the JPEG headers. - */ - if (!ctx->is_encoder) - dst_vq->dma_attrs |= DMA_ATTR_NO_KERNEL_MAPPING; - - dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; - dst_vq->io_modes = VB2_MMAP | VB2_DMABUF; - dst_vq->drv_priv = ctx; - dst_vq->ops = &hantro_queue_ops; - dst_vq->buf_struct_size = sizeof(struct hantro_decoded_buffer); - dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; - dst_vq->lock = &ctx->dev->vpu_mutex; - dst_vq->dev = ctx->dev->v4l2_dev.dev; - - return vb2_queue_init(dst_vq); -} - -static int hantro_try_ctrl(struct v4l2_ctrl *ctrl) -{ - if (ctrl->id == V4L2_CID_STATELESS_H264_SPS) { - const struct v4l2_ctrl_h264_sps *sps = ctrl->p_new.p_h264_sps; - - if (sps->chroma_format_idc > 1) - /* Only 4:0:0 and 4:2:0 are supported */ - return -EINVAL; - if (sps->bit_depth_luma_minus8 != sps->bit_depth_chroma_minus8) - /* Luma and chroma bit depth mismatch */ - return -EINVAL; - if (sps->bit_depth_luma_minus8 != 0) - /* Only 8-bit is supported */ - return -EINVAL; - } else if (ctrl->id == V4L2_CID_STATELESS_HEVC_SPS) { - const struct v4l2_ctrl_hevc_sps *sps = ctrl->p_new.p_hevc_sps; - - if (sps->bit_depth_luma_minus8 != sps->bit_depth_chroma_minus8) - /* Luma and chroma bit depth mismatch */ - return -EINVAL; - if (sps->bit_depth_luma_minus8 != 0) - /* Only 8-bit is supported */ - return -EINVAL; - } else if (ctrl->id == V4L2_CID_STATELESS_VP9_FRAME) { - const struct v4l2_ctrl_vp9_frame *dec_params = ctrl->p_new.p_vp9_frame; - - /* We only support profile 0 */ - if (dec_params->profile != 0) - return -EINVAL; - } - return 0; -} - -static int hantro_jpeg_s_ctrl(struct v4l2_ctrl *ctrl) -{ - struct hantro_ctx *ctx; - - ctx = container_of(ctrl->handler, - struct hantro_ctx, ctrl_handler); - - vpu_debug(1, "s_ctrl: id = %d, val = %d\n", ctrl->id, ctrl->val); - - switch (ctrl->id) { - case V4L2_CID_JPEG_COMPRESSION_QUALITY: - ctx->jpeg_quality = ctrl->val; - break; - default: - return -EINVAL; - } - - return 0; -} - -static int hantro_vp9_s_ctrl(struct v4l2_ctrl *ctrl) -{ - struct hantro_ctx *ctx; - - ctx = container_of(ctrl->handler, - struct hantro_ctx, ctrl_handler); - - switch (ctrl->id) { - case V4L2_CID_STATELESS_VP9_FRAME: - ctx->bit_depth = ctrl->p_new.p_vp9_frame->bit_depth; - break; - default: - return -EINVAL; - } - - return 0; -} - -static const struct v4l2_ctrl_ops hantro_ctrl_ops = { - .try_ctrl = hantro_try_ctrl, -}; - -static const struct v4l2_ctrl_ops hantro_jpeg_ctrl_ops = { - .s_ctrl = hantro_jpeg_s_ctrl, -}; - -static const struct v4l2_ctrl_ops hantro_vp9_ctrl_ops = { - .s_ctrl = hantro_vp9_s_ctrl, -}; - -#define HANTRO_JPEG_ACTIVE_MARKERS (V4L2_JPEG_ACTIVE_MARKER_APP0 | \ - V4L2_JPEG_ACTIVE_MARKER_COM | \ - V4L2_JPEG_ACTIVE_MARKER_DQT | \ - V4L2_JPEG_ACTIVE_MARKER_DHT) - -static const struct hantro_ctrl controls[] = { - { - .codec = HANTRO_JPEG_ENCODER, - .cfg = { - .id = V4L2_CID_JPEG_COMPRESSION_QUALITY, - .min = 5, - .max = 100, - .step = 1, - .def = 50, - .ops = &hantro_jpeg_ctrl_ops, - }, - }, { - .codec = HANTRO_JPEG_ENCODER, - .cfg = { - .id = V4L2_CID_JPEG_ACTIVE_MARKER, - .max = HANTRO_JPEG_ACTIVE_MARKERS, - .def = HANTRO_JPEG_ACTIVE_MARKERS, - /* - * Changing the set of active markers/segments also - * messes up the alignment of the JPEG header, which - * is needed to allow the hardware to write directly - * to the output buffer. Implementing this introduces - * a lot of complexity for little gain, as the markers - * enabled is already the minimum required set. - */ - .flags = V4L2_CTRL_FLAG_READ_ONLY, - }, - }, { - .codec = HANTRO_MPEG2_DECODER, - .cfg = { - .id = V4L2_CID_STATELESS_MPEG2_SEQUENCE, - }, - }, { - .codec = HANTRO_MPEG2_DECODER, - .cfg = { - .id = V4L2_CID_STATELESS_MPEG2_PICTURE, - }, - }, { - .codec = HANTRO_MPEG2_DECODER, - .cfg = { - .id = V4L2_CID_STATELESS_MPEG2_QUANTISATION, - }, - }, { - .codec = HANTRO_VP8_DECODER, - .cfg = { - .id = V4L2_CID_STATELESS_VP8_FRAME, - }, - }, { - .codec = HANTRO_H264_DECODER, - .cfg = { - .id = V4L2_CID_STATELESS_H264_DECODE_PARAMS, - }, - }, { - .codec = HANTRO_H264_DECODER, - .cfg = { - .id = V4L2_CID_STATELESS_H264_SPS, - .ops = &hantro_ctrl_ops, - }, - }, { - .codec = HANTRO_H264_DECODER, - .cfg = { - .id = V4L2_CID_STATELESS_H264_PPS, - }, - }, { - .codec = HANTRO_H264_DECODER, - .cfg = { - .id = V4L2_CID_STATELESS_H264_SCALING_MATRIX, - }, - }, { - .codec = HANTRO_H264_DECODER, - .cfg = { - .id = V4L2_CID_STATELESS_H264_DECODE_MODE, - .min = V4L2_STATELESS_H264_DECODE_MODE_FRAME_BASED, - .def = V4L2_STATELESS_H264_DECODE_MODE_FRAME_BASED, - .max = V4L2_STATELESS_H264_DECODE_MODE_FRAME_BASED, - }, - }, { - .codec = HANTRO_H264_DECODER, - .cfg = { - .id = V4L2_CID_STATELESS_H264_START_CODE, - .min = V4L2_STATELESS_H264_START_CODE_ANNEX_B, - .def = V4L2_STATELESS_H264_START_CODE_ANNEX_B, - .max = V4L2_STATELESS_H264_START_CODE_ANNEX_B, - }, - }, { - .codec = HANTRO_H264_DECODER, - .cfg = { - .id = V4L2_CID_MPEG_VIDEO_H264_PROFILE, - .min = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE, - .max = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, - .menu_skip_mask = - BIT(V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED), - .def = V4L2_MPEG_VIDEO_H264_PROFILE_MAIN, - } - }, { - .codec = HANTRO_HEVC_DECODER, - .cfg = { - .id = V4L2_CID_STATELESS_HEVC_DECODE_MODE, - .min = V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED, - .max = V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED, - .def = V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED, - }, - }, { - .codec = HANTRO_HEVC_DECODER, - .cfg = { - .id = V4L2_CID_STATELESS_HEVC_START_CODE, - .min = V4L2_STATELESS_HEVC_START_CODE_ANNEX_B, - .max = V4L2_STATELESS_HEVC_START_CODE_ANNEX_B, - .def = V4L2_STATELESS_HEVC_START_CODE_ANNEX_B, - }, - }, { - .codec = HANTRO_HEVC_DECODER, - .cfg = { - .id = V4L2_CID_MPEG_VIDEO_HEVC_PROFILE, - .min = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN, - .max = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10, - .def = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN, - }, - }, { - .codec = HANTRO_HEVC_DECODER, - .cfg = { - .id = V4L2_CID_MPEG_VIDEO_HEVC_LEVEL, - .min = V4L2_MPEG_VIDEO_HEVC_LEVEL_1, - .max = V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1, - }, - }, { - .codec = HANTRO_HEVC_DECODER, - .cfg = { - .id = V4L2_CID_STATELESS_HEVC_SPS, - .ops = &hantro_ctrl_ops, - }, - }, { - .codec = HANTRO_HEVC_DECODER, - .cfg = { - .id = V4L2_CID_STATELESS_HEVC_PPS, - }, - }, { - .codec = HANTRO_HEVC_DECODER, - .cfg = { - .id = V4L2_CID_STATELESS_HEVC_DECODE_PARAMS, - }, - }, { - .codec = HANTRO_HEVC_DECODER, - .cfg = { - .id = V4L2_CID_STATELESS_HEVC_SCALING_MATRIX, - }, - }, { - .codec = HANTRO_VP9_DECODER, - .cfg = { - .id = V4L2_CID_STATELESS_VP9_FRAME, - .ops = &hantro_vp9_ctrl_ops, - }, - }, { - .codec = HANTRO_VP9_DECODER, - .cfg = { - .id = V4L2_CID_STATELESS_VP9_COMPRESSED_HDR, - }, - }, -}; - -static int hantro_ctrls_setup(struct hantro_dev *vpu, - struct hantro_ctx *ctx, - int allowed_codecs) -{ - int i, num_ctrls = ARRAY_SIZE(controls); - - v4l2_ctrl_handler_init(&ctx->ctrl_handler, num_ctrls); - - for (i = 0; i < num_ctrls; i++) { - if (!(allowed_codecs & controls[i].codec)) - continue; - - v4l2_ctrl_new_custom(&ctx->ctrl_handler, - &controls[i].cfg, NULL); - if (ctx->ctrl_handler.error) { - vpu_err("Adding control (%d) failed %d\n", - controls[i].cfg.id, - ctx->ctrl_handler.error); - v4l2_ctrl_handler_free(&ctx->ctrl_handler); - return ctx->ctrl_handler.error; - } - } - return v4l2_ctrl_handler_setup(&ctx->ctrl_handler); -} - -/* - * V4L2 file operations. - */ - -static int hantro_open(struct file *filp) -{ - struct hantro_dev *vpu = video_drvdata(filp); - struct video_device *vdev = video_devdata(filp); - struct hantro_func *func = hantro_vdev_to_func(vdev); - struct hantro_ctx *ctx; - int allowed_codecs, ret; - - /* - * We do not need any extra locking here, because we operate only - * on local data here, except reading few fields from dev, which - * do not change through device's lifetime (which is guaranteed by - * reference on module from open()) and V4L2 internal objects (such - * as vdev and ctx->fh), which have proper locking done in respective - * helper functions used here. - */ - - ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); - if (!ctx) - return -ENOMEM; - - ctx->dev = vpu; - if (func->id == MEDIA_ENT_F_PROC_VIDEO_ENCODER) { - allowed_codecs = vpu->variant->codec & HANTRO_ENCODERS; - ctx->is_encoder = true; - } else if (func->id == MEDIA_ENT_F_PROC_VIDEO_DECODER) { - allowed_codecs = vpu->variant->codec & HANTRO_DECODERS; - ctx->is_encoder = false; - } else { - ret = -ENODEV; - goto err_ctx_free; - } - - ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(vpu->m2m_dev, ctx, queue_init); - if (IS_ERR(ctx->fh.m2m_ctx)) { - ret = PTR_ERR(ctx->fh.m2m_ctx); - goto err_ctx_free; - } - - v4l2_fh_init(&ctx->fh, vdev); - filp->private_data = &ctx->fh; - v4l2_fh_add(&ctx->fh); - - hantro_reset_fmts(ctx); - - ret = hantro_ctrls_setup(vpu, ctx, allowed_codecs); - if (ret) { - vpu_err("Failed to set up controls\n"); - goto err_fh_free; - } - ctx->fh.ctrl_handler = &ctx->ctrl_handler; - - return 0; - -err_fh_free: - v4l2_fh_del(&ctx->fh); - v4l2_fh_exit(&ctx->fh); -err_ctx_free: - kfree(ctx); - return ret; -} - -static int hantro_release(struct file *filp) -{ - struct hantro_ctx *ctx = - container_of(filp->private_data, struct hantro_ctx, fh); - - /* - * No need for extra locking because this was the last reference - * to this file. - */ - v4l2_m2m_ctx_release(ctx->fh.m2m_ctx); - v4l2_fh_del(&ctx->fh); - v4l2_fh_exit(&ctx->fh); - v4l2_ctrl_handler_free(&ctx->ctrl_handler); - kfree(ctx); - - return 0; -} - -static const struct v4l2_file_operations hantro_fops = { - .owner = THIS_MODULE, - .open = hantro_open, - .release = hantro_release, - .poll = v4l2_m2m_fop_poll, - .unlocked_ioctl = video_ioctl2, - .mmap = v4l2_m2m_fop_mmap, -}; - -static const struct of_device_id of_hantro_match[] = { -#ifdef CONFIG_VIDEO_HANTRO_ROCKCHIP - { .compatible = "rockchip,px30-vpu", .data = &px30_vpu_variant, }, - { .compatible = "rockchip,rk3036-vpu", .data = &rk3036_vpu_variant, }, - { .compatible = "rockchip,rk3066-vpu", .data = &rk3066_vpu_variant, }, - { .compatible = "rockchip,rk3288-vpu", .data = &rk3288_vpu_variant, }, - { .compatible = "rockchip,rk3328-vpu", .data = &rk3328_vpu_variant, }, - { .compatible = "rockchip,rk3399-vpu", .data = &rk3399_vpu_variant, }, - { .compatible = "rockchip,rk3568-vepu", .data = &rk3568_vepu_variant, }, - { .compatible = "rockchip,rk3568-vpu", .data = &rk3568_vpu_variant, }, -#endif -#ifdef CONFIG_VIDEO_HANTRO_IMX8M - { .compatible = "nxp,imx8mm-vpu-g1", .data = &imx8mm_vpu_g1_variant, }, - { .compatible = "nxp,imx8mq-vpu", .data = &imx8mq_vpu_variant, }, - { .compatible = "nxp,imx8mq-vpu-g1", .data = &imx8mq_vpu_g1_variant }, - { .compatible = "nxp,imx8mq-vpu-g2", .data = &imx8mq_vpu_g2_variant }, -#endif -#ifdef CONFIG_VIDEO_HANTRO_SAMA5D4 - { .compatible = "microchip,sama5d4-vdec", .data = &sama5d4_vdec_variant, }, -#endif -#ifdef CONFIG_VIDEO_HANTRO_SUNXI - { .compatible = "allwinner,sun50i-h6-vpu-g2", .data = &sunxi_vpu_variant, }, -#endif - { /* sentinel */ } -}; -MODULE_DEVICE_TABLE(of, of_hantro_match); - -static int hantro_register_entity(struct media_device *mdev, - struct media_entity *entity, - const char *entity_name, - struct media_pad *pads, int num_pads, - int function, struct video_device *vdev) -{ - char *name; - int ret; - - entity->obj_type = MEDIA_ENTITY_TYPE_BASE; - if (function == MEDIA_ENT_F_IO_V4L) { - entity->info.dev.major = VIDEO_MAJOR; - entity->info.dev.minor = vdev->minor; - } - - name = devm_kasprintf(mdev->dev, GFP_KERNEL, "%s-%s", vdev->name, - entity_name); - if (!name) - return -ENOMEM; - - entity->name = name; - entity->function = function; - - ret = media_entity_pads_init(entity, num_pads, pads); - if (ret) - return ret; - - ret = media_device_register_entity(mdev, entity); - if (ret) - return ret; - - return 0; -} - -static int hantro_attach_func(struct hantro_dev *vpu, - struct hantro_func *func) -{ - struct media_device *mdev = &vpu->mdev; - struct media_link *link; - int ret; - - /* Create the three encoder entities with their pads */ - func->source_pad.flags = MEDIA_PAD_FL_SOURCE; - ret = hantro_register_entity(mdev, &func->vdev.entity, "source", - &func->source_pad, 1, MEDIA_ENT_F_IO_V4L, - &func->vdev); - if (ret) - return ret; - - func->proc_pads[0].flags = MEDIA_PAD_FL_SINK; - func->proc_pads[1].flags = MEDIA_PAD_FL_SOURCE; - ret = hantro_register_entity(mdev, &func->proc, "proc", - func->proc_pads, 2, func->id, - &func->vdev); - if (ret) - goto err_rel_entity0; - - func->sink_pad.flags = MEDIA_PAD_FL_SINK; - ret = hantro_register_entity(mdev, &func->sink, "sink", - &func->sink_pad, 1, MEDIA_ENT_F_IO_V4L, - &func->vdev); - if (ret) - goto err_rel_entity1; - - /* Connect the three entities */ - ret = media_create_pad_link(&func->vdev.entity, 0, &func->proc, 0, - MEDIA_LNK_FL_IMMUTABLE | - MEDIA_LNK_FL_ENABLED); - if (ret) - goto err_rel_entity2; - - ret = media_create_pad_link(&func->proc, 1, &func->sink, 0, - MEDIA_LNK_FL_IMMUTABLE | - MEDIA_LNK_FL_ENABLED); - if (ret) - goto err_rm_links0; - - /* Create video interface */ - func->intf_devnode = media_devnode_create(mdev, MEDIA_INTF_T_V4L_VIDEO, - 0, VIDEO_MAJOR, - func->vdev.minor); - if (!func->intf_devnode) { - ret = -ENOMEM; - goto err_rm_links1; - } - - /* Connect the two DMA engines to the interface */ - link = media_create_intf_link(&func->vdev.entity, - &func->intf_devnode->intf, - MEDIA_LNK_FL_IMMUTABLE | - MEDIA_LNK_FL_ENABLED); - if (!link) { - ret = -ENOMEM; - goto err_rm_devnode; - } - - link = media_create_intf_link(&func->sink, &func->intf_devnode->intf, - MEDIA_LNK_FL_IMMUTABLE | - MEDIA_LNK_FL_ENABLED); - if (!link) { - ret = -ENOMEM; - goto err_rm_devnode; - } - return 0; - -err_rm_devnode: - media_devnode_remove(func->intf_devnode); - -err_rm_links1: - media_entity_remove_links(&func->sink); - -err_rm_links0: - media_entity_remove_links(&func->proc); - media_entity_remove_links(&func->vdev.entity); - -err_rel_entity2: - media_device_unregister_entity(&func->sink); - -err_rel_entity1: - media_device_unregister_entity(&func->proc); - -err_rel_entity0: - media_device_unregister_entity(&func->vdev.entity); - return ret; -} - -static void hantro_detach_func(struct hantro_func *func) -{ - media_devnode_remove(func->intf_devnode); - media_entity_remove_links(&func->sink); - media_entity_remove_links(&func->proc); - media_entity_remove_links(&func->vdev.entity); - media_device_unregister_entity(&func->sink); - media_device_unregister_entity(&func->proc); - media_device_unregister_entity(&func->vdev.entity); -} - -static int hantro_add_func(struct hantro_dev *vpu, unsigned int funcid) -{ - const struct of_device_id *match; - struct hantro_func *func; - struct video_device *vfd; - int ret; - - match = of_match_node(of_hantro_match, vpu->dev->of_node); - func = devm_kzalloc(vpu->dev, sizeof(*func), GFP_KERNEL); - if (!func) { - v4l2_err(&vpu->v4l2_dev, "Failed to allocate video device\n"); - return -ENOMEM; - } - - func->id = funcid; - - vfd = &func->vdev; - vfd->fops = &hantro_fops; - vfd->release = video_device_release_empty; - vfd->lock = &vpu->vpu_mutex; - vfd->v4l2_dev = &vpu->v4l2_dev; - vfd->vfl_dir = VFL_DIR_M2M; - vfd->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_M2M_MPLANE; - vfd->ioctl_ops = &hantro_ioctl_ops; - snprintf(vfd->name, sizeof(vfd->name), "%s-%s", match->compatible, - funcid == MEDIA_ENT_F_PROC_VIDEO_ENCODER ? "enc" : "dec"); - - if (funcid == MEDIA_ENT_F_PROC_VIDEO_ENCODER) { - vpu->encoder = func; - } else { - vpu->decoder = func; - v4l2_disable_ioctl(vfd, VIDIOC_TRY_ENCODER_CMD); - v4l2_disable_ioctl(vfd, VIDIOC_ENCODER_CMD); - } - - video_set_drvdata(vfd, vpu); - - ret = video_register_device(vfd, VFL_TYPE_VIDEO, -1); - if (ret) { - v4l2_err(&vpu->v4l2_dev, "Failed to register video device\n"); - return ret; - } - - ret = hantro_attach_func(vpu, func); - if (ret) { - v4l2_err(&vpu->v4l2_dev, - "Failed to attach functionality to the media device\n"); - goto err_unreg_dev; - } - - v4l2_info(&vpu->v4l2_dev, "registered %s as /dev/video%d\n", vfd->name, - vfd->num); - - return 0; - -err_unreg_dev: - video_unregister_device(vfd); - return ret; -} - -static int hantro_add_enc_func(struct hantro_dev *vpu) -{ - if (!vpu->variant->enc_fmts) - return 0; - - return hantro_add_func(vpu, MEDIA_ENT_F_PROC_VIDEO_ENCODER); -} - -static int hantro_add_dec_func(struct hantro_dev *vpu) -{ - if (!vpu->variant->dec_fmts) - return 0; - - return hantro_add_func(vpu, MEDIA_ENT_F_PROC_VIDEO_DECODER); -} - -static void hantro_remove_func(struct hantro_dev *vpu, - unsigned int funcid) -{ - struct hantro_func *func; - - if (funcid == MEDIA_ENT_F_PROC_VIDEO_ENCODER) - func = vpu->encoder; - else - func = vpu->decoder; - - if (!func) - return; - - hantro_detach_func(func); - video_unregister_device(&func->vdev); -} - -static void hantro_remove_enc_func(struct hantro_dev *vpu) -{ - hantro_remove_func(vpu, MEDIA_ENT_F_PROC_VIDEO_ENCODER); -} - -static void hantro_remove_dec_func(struct hantro_dev *vpu) -{ - hantro_remove_func(vpu, MEDIA_ENT_F_PROC_VIDEO_DECODER); -} - -static const struct media_device_ops hantro_m2m_media_ops = { - .req_validate = vb2_request_validate, - .req_queue = v4l2_m2m_request_queue, -}; - -static int hantro_probe(struct platform_device *pdev) -{ - const struct of_device_id *match; - struct hantro_dev *vpu; - struct resource *res; - int num_bases; - int i, ret; - - vpu = devm_kzalloc(&pdev->dev, sizeof(*vpu), GFP_KERNEL); - if (!vpu) - return -ENOMEM; - - vpu->dev = &pdev->dev; - vpu->pdev = pdev; - mutex_init(&vpu->vpu_mutex); - spin_lock_init(&vpu->irqlock); - - match = of_match_node(of_hantro_match, pdev->dev.of_node); - vpu->variant = match->data; - - /* - * Support for nxp,imx8mq-vpu is kept for backwards compatibility - * but it's deprecated. Please update your DTS file to use - * nxp,imx8mq-vpu-g1 or nxp,imx8mq-vpu-g2 instead. - */ - if (of_device_is_compatible(pdev->dev.of_node, "nxp,imx8mq-vpu")) - dev_warn(&pdev->dev, "%s compatible is deprecated\n", - match->compatible); - - INIT_DELAYED_WORK(&vpu->watchdog_work, hantro_watchdog); - - vpu->clocks = devm_kcalloc(&pdev->dev, vpu->variant->num_clocks, - sizeof(*vpu->clocks), GFP_KERNEL); - if (!vpu->clocks) - return -ENOMEM; - - if (vpu->variant->num_clocks > 1) { - for (i = 0; i < vpu->variant->num_clocks; i++) - vpu->clocks[i].id = vpu->variant->clk_names[i]; - - ret = devm_clk_bulk_get(&pdev->dev, vpu->variant->num_clocks, - vpu->clocks); - if (ret) - return ret; - } else { - /* - * If the driver has a single clk, chances are there will be no - * actual name in the DT bindings. - */ - vpu->clocks[0].clk = devm_clk_get(&pdev->dev, NULL); - if (IS_ERR(vpu->clocks[0].clk)) - return PTR_ERR(vpu->clocks[0].clk); - } - - vpu->resets = devm_reset_control_array_get(&pdev->dev, false, true); - if (IS_ERR(vpu->resets)) - return PTR_ERR(vpu->resets); - - num_bases = vpu->variant->num_regs ?: 1; - vpu->reg_bases = devm_kcalloc(&pdev->dev, num_bases, - sizeof(*vpu->reg_bases), GFP_KERNEL); - if (!vpu->reg_bases) - return -ENOMEM; - - for (i = 0; i < num_bases; i++) { - res = vpu->variant->reg_names ? - platform_get_resource_byname(vpu->pdev, IORESOURCE_MEM, - vpu->variant->reg_names[i]) : - platform_get_resource(vpu->pdev, IORESOURCE_MEM, 0); - vpu->reg_bases[i] = devm_ioremap_resource(vpu->dev, res); - if (IS_ERR(vpu->reg_bases[i])) - return PTR_ERR(vpu->reg_bases[i]); - } - vpu->enc_base = vpu->reg_bases[0] + vpu->variant->enc_offset; - vpu->dec_base = vpu->reg_bases[0] + vpu->variant->dec_offset; - - /** - * TODO: Eventually allow taking advantage of full 64-bit address space. - * Until then we assume the MSB portion of buffers' base addresses is - * always 0 due to this masking operation. - */ - ret = dma_set_coherent_mask(vpu->dev, DMA_BIT_MASK(32)); - if (ret) { - dev_err(vpu->dev, "Could not set DMA coherent mask.\n"); - return ret; - } - vb2_dma_contig_set_max_seg_size(&pdev->dev, DMA_BIT_MASK(32)); - - for (i = 0; i < vpu->variant->num_irqs; i++) { - const char *irq_name; - int irq; - - if (!vpu->variant->irqs[i].handler) - continue; - - if (vpu->variant->num_irqs > 1) { - irq_name = vpu->variant->irqs[i].name; - irq = platform_get_irq_byname(vpu->pdev, irq_name); - } else { - /* - * If the driver has a single IRQ, chances are there - * will be no actual name in the DT bindings. - */ - irq_name = "default"; - irq = platform_get_irq(vpu->pdev, 0); - } - if (irq <= 0) - return -ENXIO; - - ret = devm_request_irq(vpu->dev, irq, - vpu->variant->irqs[i].handler, 0, - dev_name(vpu->dev), vpu); - if (ret) { - dev_err(vpu->dev, "Could not request %s IRQ.\n", - irq_name); - return ret; - } - } - - if (vpu->variant->init) { - ret = vpu->variant->init(vpu); - if (ret) { - dev_err(&pdev->dev, "Failed to init VPU hardware\n"); - return ret; - } - } - - pm_runtime_set_autosuspend_delay(vpu->dev, 100); - pm_runtime_use_autosuspend(vpu->dev); - pm_runtime_enable(vpu->dev); - - ret = reset_control_deassert(vpu->resets); - if (ret) { - dev_err(&pdev->dev, "Failed to deassert resets\n"); - goto err_pm_disable; - } - - ret = clk_bulk_prepare(vpu->variant->num_clocks, vpu->clocks); - if (ret) { - dev_err(&pdev->dev, "Failed to prepare clocks\n"); - goto err_rst_assert; - } - - ret = v4l2_device_register(&pdev->dev, &vpu->v4l2_dev); - if (ret) { - dev_err(&pdev->dev, "Failed to register v4l2 device\n"); - goto err_clk_unprepare; - } - platform_set_drvdata(pdev, vpu); - - vpu->m2m_dev = v4l2_m2m_init(&vpu_m2m_ops); - if (IS_ERR(vpu->m2m_dev)) { - v4l2_err(&vpu->v4l2_dev, "Failed to init mem2mem device\n"); - ret = PTR_ERR(vpu->m2m_dev); - goto err_v4l2_unreg; - } - - vpu->mdev.dev = vpu->dev; - strscpy(vpu->mdev.model, DRIVER_NAME, sizeof(vpu->mdev.model)); - strscpy(vpu->mdev.bus_info, "platform: " DRIVER_NAME, - sizeof(vpu->mdev.bus_info)); - media_device_init(&vpu->mdev); - vpu->mdev.ops = &hantro_m2m_media_ops; - vpu->v4l2_dev.mdev = &vpu->mdev; - - ret = hantro_add_enc_func(vpu); - if (ret) { - dev_err(&pdev->dev, "Failed to register encoder\n"); - goto err_m2m_rel; - } - - ret = hantro_add_dec_func(vpu); - if (ret) { - dev_err(&pdev->dev, "Failed to register decoder\n"); - goto err_rm_enc_func; - } - - ret = media_device_register(&vpu->mdev); - if (ret) { - v4l2_err(&vpu->v4l2_dev, "Failed to register mem2mem media device\n"); - goto err_rm_dec_func; - } - - return 0; - -err_rm_dec_func: - hantro_remove_dec_func(vpu); -err_rm_enc_func: - hantro_remove_enc_func(vpu); -err_m2m_rel: - media_device_cleanup(&vpu->mdev); - v4l2_m2m_release(vpu->m2m_dev); -err_v4l2_unreg: - v4l2_device_unregister(&vpu->v4l2_dev); -err_clk_unprepare: - clk_bulk_unprepare(vpu->variant->num_clocks, vpu->clocks); -err_rst_assert: - reset_control_assert(vpu->resets); -err_pm_disable: - pm_runtime_dont_use_autosuspend(vpu->dev); - pm_runtime_disable(vpu->dev); - return ret; -} - -static int hantro_remove(struct platform_device *pdev) -{ - struct hantro_dev *vpu = platform_get_drvdata(pdev); - - v4l2_info(&vpu->v4l2_dev, "Removing %s\n", pdev->name); - - media_device_unregister(&vpu->mdev); - hantro_remove_dec_func(vpu); - hantro_remove_enc_func(vpu); - media_device_cleanup(&vpu->mdev); - v4l2_m2m_release(vpu->m2m_dev); - v4l2_device_unregister(&vpu->v4l2_dev); - clk_bulk_unprepare(vpu->variant->num_clocks, vpu->clocks); - reset_control_assert(vpu->resets); - pm_runtime_dont_use_autosuspend(vpu->dev); - pm_runtime_disable(vpu->dev); - return 0; -} - -#ifdef CONFIG_PM -static int hantro_runtime_resume(struct device *dev) -{ - struct hantro_dev *vpu = dev_get_drvdata(dev); - - if (vpu->variant->runtime_resume) - return vpu->variant->runtime_resume(vpu); - - return 0; -} -#endif - -static const struct dev_pm_ops hantro_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, - pm_runtime_force_resume) - SET_RUNTIME_PM_OPS(NULL, hantro_runtime_resume, NULL) -}; - -static struct platform_driver hantro_driver = { - .probe = hantro_probe, - .remove = hantro_remove, - .driver = { - .name = DRIVER_NAME, - .of_match_table = of_match_ptr(of_hantro_match), - .pm = &hantro_pm_ops, - }, -}; -module_platform_driver(hantro_driver); - -MODULE_LICENSE("GPL v2"); -MODULE_AUTHOR("Alpha Lin <Alpha.Lin@Rock-Chips.com>"); -MODULE_AUTHOR("Tomasz Figa <tfiga@chromium.org>"); -MODULE_AUTHOR("Ezequiel Garcia <ezequiel@collabora.com>"); -MODULE_DESCRIPTION("Hantro VPU codec driver"); diff --git a/drivers/staging/media/hantro/hantro_g1.c b/drivers/staging/media/hantro/hantro_g1.c deleted file mode 100644 index 0ab1cee62218..000000000000 --- a/drivers/staging/media/hantro/hantro_g1.c +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Hantro VPU codec driver - * - * Copyright (C) 2018 Rockchip Electronics Co., Ltd. - * Jeffy Chen <jeffy.chen@rock-chips.com> - * Copyright (C) 2019 Pengutronix, Philipp Zabel <kernel@pengutronix.de> - * Copyright (C) 2021 Collabora Ltd, Emil Velikov <emil.velikov@collabora.com> - */ - -#include "hantro.h" -#include "hantro_g1_regs.h" - -irqreturn_t hantro_g1_irq(int irq, void *dev_id) -{ - struct hantro_dev *vpu = dev_id; - enum vb2_buffer_state state; - u32 status; - - status = vdpu_read(vpu, G1_REG_INTERRUPT); - state = (status & G1_REG_INTERRUPT_DEC_RDY_INT) ? - VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR; - - vdpu_write(vpu, 0, G1_REG_INTERRUPT); - vdpu_write(vpu, G1_REG_CONFIG_DEC_CLK_GATE_E, G1_REG_CONFIG); - - hantro_irq_done(vpu, state); - - return IRQ_HANDLED; -} - -void hantro_g1_reset(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - - vdpu_write(vpu, G1_REG_INTERRUPT_DEC_IRQ_DIS, G1_REG_INTERRUPT); - vdpu_write(vpu, G1_REG_CONFIG_DEC_CLK_GATE_E, G1_REG_CONFIG); - vdpu_write(vpu, 1, G1_REG_SOFT_RESET); -} diff --git a/drivers/staging/media/hantro/hantro_g1_h264_dec.c b/drivers/staging/media/hantro/hantro_g1_h264_dec.c deleted file mode 100644 index 9de7f05eff2a..000000000000 --- a/drivers/staging/media/hantro/hantro_g1_h264_dec.c +++ /dev/null @@ -1,284 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Rockchip RK3288 VPU codec driver - * - * Copyright (c) 2014 Rockchip Electronics Co., Ltd. - * Hertz Wong <hertz.wong@rock-chips.com> - * Herman Chen <herman.chen@rock-chips.com> - * - * Copyright (C) 2014 Google, Inc. - * Tomasz Figa <tfiga@chromium.org> - */ - -#include <linux/types.h> -#include <linux/sort.h> - -#include <media/v4l2-mem2mem.h> - -#include "hantro_g1_regs.h" -#include "hantro_hw.h" -#include "hantro_v4l2.h" - -static void set_params(struct hantro_ctx *ctx, struct vb2_v4l2_buffer *src_buf) -{ - const struct hantro_h264_dec_ctrls *ctrls = &ctx->h264_dec.ctrls; - const struct v4l2_ctrl_h264_decode_params *dec_param = ctrls->decode; - const struct v4l2_ctrl_h264_sps *sps = ctrls->sps; - const struct v4l2_ctrl_h264_pps *pps = ctrls->pps; - struct hantro_dev *vpu = ctx->dev; - u32 reg; - - /* Decoder control register 0. */ - reg = G1_REG_DEC_CTRL0_DEC_AXI_AUTO; - if (sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD) - reg |= G1_REG_DEC_CTRL0_SEQ_MBAFF_E; - if (sps->profile_idc > 66) { - reg |= G1_REG_DEC_CTRL0_PICORD_COUNT_E; - if (dec_param->nal_ref_idc) - reg |= G1_REG_DEC_CTRL0_WRITE_MVS_E; - } - - if (!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY) && - (sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD || - dec_param->flags & V4L2_H264_DECODE_PARAM_FLAG_FIELD_PIC)) - reg |= G1_REG_DEC_CTRL0_PIC_INTERLACE_E; - if (dec_param->flags & V4L2_H264_DECODE_PARAM_FLAG_FIELD_PIC) - reg |= G1_REG_DEC_CTRL0_PIC_FIELDMODE_E; - if (!(dec_param->flags & V4L2_H264_DECODE_PARAM_FLAG_BOTTOM_FIELD)) - reg |= G1_REG_DEC_CTRL0_PIC_TOPFIELD_E; - vdpu_write_relaxed(vpu, reg, G1_REG_DEC_CTRL0); - - /* Decoder control register 1. */ - reg = G1_REG_DEC_CTRL1_PIC_MB_WIDTH(MB_WIDTH(ctx->src_fmt.width)) | - G1_REG_DEC_CTRL1_PIC_MB_HEIGHT_P(MB_HEIGHT(ctx->src_fmt.height)) | - G1_REG_DEC_CTRL1_REF_FRAMES(sps->max_num_ref_frames); - vdpu_write_relaxed(vpu, reg, G1_REG_DEC_CTRL1); - - /* Decoder control register 2. */ - reg = G1_REG_DEC_CTRL2_CH_QP_OFFSET(pps->chroma_qp_index_offset) | - G1_REG_DEC_CTRL2_CH_QP_OFFSET2(pps->second_chroma_qp_index_offset); - - if (pps->flags & V4L2_H264_PPS_FLAG_SCALING_MATRIX_PRESENT) - reg |= G1_REG_DEC_CTRL2_TYPE1_QUANT_E; - if (!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY)) - reg |= G1_REG_DEC_CTRL2_FIELDPIC_FLAG_E; - vdpu_write_relaxed(vpu, reg, G1_REG_DEC_CTRL2); - - /* Decoder control register 3. */ - reg = G1_REG_DEC_CTRL3_START_CODE_E | - G1_REG_DEC_CTRL3_INIT_QP(pps->pic_init_qp_minus26 + 26) | - G1_REG_DEC_CTRL3_STREAM_LEN(vb2_get_plane_payload(&src_buf->vb2_buf, 0)); - vdpu_write_relaxed(vpu, reg, G1_REG_DEC_CTRL3); - - /* Decoder control register 4. */ - reg = G1_REG_DEC_CTRL4_FRAMENUM_LEN(sps->log2_max_frame_num_minus4 + 4) | - G1_REG_DEC_CTRL4_FRAMENUM(dec_param->frame_num) | - G1_REG_DEC_CTRL4_WEIGHT_BIPR_IDC(pps->weighted_bipred_idc); - if (pps->flags & V4L2_H264_PPS_FLAG_ENTROPY_CODING_MODE) - reg |= G1_REG_DEC_CTRL4_CABAC_E; - if (sps->flags & V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE) - reg |= G1_REG_DEC_CTRL4_DIR_8X8_INFER_E; - if (sps->profile_idc >= 100 && sps->chroma_format_idc == 0) - reg |= G1_REG_DEC_CTRL4_BLACKWHITE_E; - if (pps->flags & V4L2_H264_PPS_FLAG_WEIGHTED_PRED) - reg |= G1_REG_DEC_CTRL4_WEIGHT_PRED_E; - vdpu_write_relaxed(vpu, reg, G1_REG_DEC_CTRL4); - - /* Decoder control register 5. */ - reg = G1_REG_DEC_CTRL5_REFPIC_MK_LEN(dec_param->dec_ref_pic_marking_bit_size) | - G1_REG_DEC_CTRL5_IDR_PIC_ID(dec_param->idr_pic_id); - if (pps->flags & V4L2_H264_PPS_FLAG_CONSTRAINED_INTRA_PRED) - reg |= G1_REG_DEC_CTRL5_CONST_INTRA_E; - if (pps->flags & V4L2_H264_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT) - reg |= G1_REG_DEC_CTRL5_FILT_CTRL_PRES; - if (pps->flags & V4L2_H264_PPS_FLAG_REDUNDANT_PIC_CNT_PRESENT) - reg |= G1_REG_DEC_CTRL5_RDPIC_CNT_PRES; - if (pps->flags & V4L2_H264_PPS_FLAG_TRANSFORM_8X8_MODE) - reg |= G1_REG_DEC_CTRL5_8X8TRANS_FLAG_E; - if (dec_param->flags & V4L2_H264_DECODE_PARAM_FLAG_IDR_PIC) - reg |= G1_REG_DEC_CTRL5_IDR_PIC_E; - vdpu_write_relaxed(vpu, reg, G1_REG_DEC_CTRL5); - - /* Decoder control register 6. */ - reg = G1_REG_DEC_CTRL6_PPS_ID(pps->pic_parameter_set_id) | - G1_REG_DEC_CTRL6_REFIDX0_ACTIVE(pps->num_ref_idx_l0_default_active_minus1 + 1) | - G1_REG_DEC_CTRL6_REFIDX1_ACTIVE(pps->num_ref_idx_l1_default_active_minus1 + 1) | - G1_REG_DEC_CTRL6_POC_LENGTH(dec_param->pic_order_cnt_bit_size); - vdpu_write_relaxed(vpu, reg, G1_REG_DEC_CTRL6); - - /* Error concealment register. */ - vdpu_write_relaxed(vpu, 0, G1_REG_ERR_CONC); - - /* Prediction filter tap register. */ - vdpu_write_relaxed(vpu, - G1_REG_PRED_FLT_PRED_BC_TAP_0_0(1) | - G1_REG_PRED_FLT_PRED_BC_TAP_0_1(-5 & 0x3ff) | - G1_REG_PRED_FLT_PRED_BC_TAP_0_2(20), - G1_REG_PRED_FLT); - - /* Reference picture buffer control register. */ - vdpu_write_relaxed(vpu, 0, G1_REG_REF_BUF_CTRL); - - /* Reference picture buffer control register 2. */ - vdpu_write_relaxed(vpu, G1_REG_REF_BUF_CTRL2_APF_THRESHOLD(8), - G1_REG_REF_BUF_CTRL2); -} - -static void set_ref(struct hantro_ctx *ctx) -{ - const struct v4l2_h264_reference *b0_reflist, *b1_reflist, *p_reflist; - struct hantro_dev *vpu = ctx->dev; - int reg_num; - u32 reg; - int i; - - vdpu_write_relaxed(vpu, ctx->h264_dec.dpb_valid, G1_REG_VALID_REF); - vdpu_write_relaxed(vpu, ctx->h264_dec.dpb_longterm, G1_REG_LT_REF); - - /* - * Set up reference frame picture numbers. - * - * Each G1_REG_REF_PIC(x) register contains numbers of two - * subsequential reference pictures. - */ - for (i = 0; i < HANTRO_H264_DPB_SIZE; i += 2) { - reg = G1_REG_REF_PIC_REFER0_NBR(hantro_h264_get_ref_nbr(ctx, i)) | - G1_REG_REF_PIC_REFER1_NBR(hantro_h264_get_ref_nbr(ctx, i + 1)); - vdpu_write_relaxed(vpu, reg, G1_REG_REF_PIC(i / 2)); - } - - b0_reflist = ctx->h264_dec.reflists.b0; - b1_reflist = ctx->h264_dec.reflists.b1; - p_reflist = ctx->h264_dec.reflists.p; - - /* - * Each G1_REG_BD_REF_PIC(x) register contains three entries - * of each forward and backward picture list. - */ - reg_num = 0; - for (i = 0; i < 15; i += 3) { - reg = G1_REG_BD_REF_PIC_BINIT_RLIST_F0(b0_reflist[i].index) | - G1_REG_BD_REF_PIC_BINIT_RLIST_F1(b0_reflist[i + 1].index) | - G1_REG_BD_REF_PIC_BINIT_RLIST_F2(b0_reflist[i + 2].index) | - G1_REG_BD_REF_PIC_BINIT_RLIST_B0(b1_reflist[i].index) | - G1_REG_BD_REF_PIC_BINIT_RLIST_B1(b1_reflist[i + 1].index) | - G1_REG_BD_REF_PIC_BINIT_RLIST_B2(b1_reflist[i + 2].index); - vdpu_write_relaxed(vpu, reg, G1_REG_BD_REF_PIC(reg_num++)); - } - - /* - * G1_REG_BD_P_REF_PIC register contains last entries (index 15) - * of forward and backward reference picture lists and first 4 entries - * of P forward picture list. - */ - reg = G1_REG_BD_P_REF_PIC_BINIT_RLIST_F15(b0_reflist[15].index) | - G1_REG_BD_P_REF_PIC_BINIT_RLIST_B15(b1_reflist[15].index) | - G1_REG_BD_P_REF_PIC_PINIT_RLIST_F0(p_reflist[0].index) | - G1_REG_BD_P_REF_PIC_PINIT_RLIST_F1(p_reflist[1].index) | - G1_REG_BD_P_REF_PIC_PINIT_RLIST_F2(p_reflist[2].index) | - G1_REG_BD_P_REF_PIC_PINIT_RLIST_F3(p_reflist[3].index); - vdpu_write_relaxed(vpu, reg, G1_REG_BD_P_REF_PIC); - - /* - * Each G1_REG_FWD_PIC(x) register contains six consecutive - * entries of P forward picture list, starting from index 4. - */ - reg_num = 0; - for (i = 4; i < HANTRO_H264_DPB_SIZE; i += 6) { - reg = G1_REG_FWD_PIC_PINIT_RLIST_F0(p_reflist[i].index) | - G1_REG_FWD_PIC_PINIT_RLIST_F1(p_reflist[i + 1].index) | - G1_REG_FWD_PIC_PINIT_RLIST_F2(p_reflist[i + 2].index) | - G1_REG_FWD_PIC_PINIT_RLIST_F3(p_reflist[i + 3].index) | - G1_REG_FWD_PIC_PINIT_RLIST_F4(p_reflist[i + 4].index) | - G1_REG_FWD_PIC_PINIT_RLIST_F5(p_reflist[i + 5].index); - vdpu_write_relaxed(vpu, reg, G1_REG_FWD_PIC(reg_num++)); - } - - /* Set up addresses of DPB buffers. */ - for (i = 0; i < HANTRO_H264_DPB_SIZE; i++) { - dma_addr_t dma_addr = hantro_h264_get_ref_buf(ctx, i); - - vdpu_write_relaxed(vpu, dma_addr, G1_REG_ADDR_REF(i)); - } -} - -static void set_buffers(struct hantro_ctx *ctx, struct vb2_v4l2_buffer *src_buf) -{ - const struct hantro_h264_dec_ctrls *ctrls = &ctx->h264_dec.ctrls; - struct vb2_v4l2_buffer *dst_buf; - struct hantro_dev *vpu = ctx->dev; - dma_addr_t src_dma, dst_dma; - size_t offset = 0; - - /* Source (stream) buffer. */ - src_dma = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0); - vdpu_write_relaxed(vpu, src_dma, G1_REG_ADDR_STR); - - /* Destination (decoded frame) buffer. */ - dst_buf = hantro_get_dst_buf(ctx); - dst_dma = hantro_get_dec_buf_addr(ctx, &dst_buf->vb2_buf); - /* Adjust dma addr to start at second line for bottom field */ - if (ctrls->decode->flags & V4L2_H264_DECODE_PARAM_FLAG_BOTTOM_FIELD) - offset = ALIGN(ctx->src_fmt.width, MB_DIM); - vdpu_write_relaxed(vpu, dst_dma + offset, G1_REG_ADDR_DST); - - /* Higher profiles require DMV buffer appended to reference frames. */ - if (ctrls->sps->profile_idc > 66 && ctrls->decode->nal_ref_idc) { - unsigned int bytes_per_mb = 384; - - /* DMV buffer for monochrome start directly after Y-plane */ - if (ctrls->sps->profile_idc >= 100 && - ctrls->sps->chroma_format_idc == 0) - bytes_per_mb = 256; - offset = bytes_per_mb * MB_WIDTH(ctx->src_fmt.width) * - MB_HEIGHT(ctx->src_fmt.height); - - /* - * DMV buffer is split in two for field encoded frames, - * adjust offset for bottom field - */ - if (ctrls->decode->flags & V4L2_H264_DECODE_PARAM_FLAG_BOTTOM_FIELD) - offset += 32 * MB_WIDTH(ctx->src_fmt.width) * - MB_HEIGHT(ctx->src_fmt.height); - vdpu_write_relaxed(vpu, dst_dma + offset, G1_REG_ADDR_DIR_MV); - } - - /* Auxiliary buffer prepared in hantro_g1_h264_dec_prepare_table(). */ - vdpu_write_relaxed(vpu, ctx->h264_dec.priv.dma, G1_REG_ADDR_QTABLE); -} - -int hantro_g1_h264_dec_run(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - struct vb2_v4l2_buffer *src_buf; - int ret; - - /* Prepare the H264 decoder context. */ - ret = hantro_h264_dec_prepare_run(ctx); - if (ret) - return ret; - - /* Configure hardware registers. */ - src_buf = hantro_get_src_buf(ctx); - set_params(ctx, src_buf); - set_ref(ctx); - set_buffers(ctx, src_buf); - - hantro_end_prepare_run(ctx); - - /* Start decoding! */ - vdpu_write_relaxed(vpu, - G1_REG_CONFIG_DEC_AXI_RD_ID(0xffu) | - G1_REG_CONFIG_DEC_TIMEOUT_E | - G1_REG_CONFIG_DEC_OUT_ENDIAN | - G1_REG_CONFIG_DEC_STRENDIAN_E | - G1_REG_CONFIG_DEC_MAX_BURST(16) | - G1_REG_CONFIG_DEC_OUTSWAP32_E | - G1_REG_CONFIG_DEC_INSWAP32_E | - G1_REG_CONFIG_DEC_STRSWAP32_E | - G1_REG_CONFIG_DEC_CLK_GATE_E, - G1_REG_CONFIG); - vdpu_write(vpu, G1_REG_INTERRUPT_DEC_E, G1_REG_INTERRUPT); - - return 0; -} diff --git a/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c b/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c deleted file mode 100644 index 9aea331e1a3c..000000000000 --- a/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c +++ /dev/null @@ -1,240 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Hantro VPU codec driver - * - * Copyright (C) 2018 Rockchip Electronics Co., Ltd. - */ - -#include <asm/unaligned.h> -#include <linux/bitfield.h> -#include <media/v4l2-mem2mem.h> -#include "hantro.h" -#include "hantro_hw.h" -#include "hantro_g1_regs.h" - -#define G1_SWREG(nr) ((nr) * 4) - -#define G1_REG_RLC_VLC_BASE G1_SWREG(12) -#define G1_REG_DEC_OUT_BASE G1_SWREG(13) -#define G1_REG_REFER0_BASE G1_SWREG(14) -#define G1_REG_REFER1_BASE G1_SWREG(15) -#define G1_REG_REFER2_BASE G1_SWREG(16) -#define G1_REG_REFER3_BASE G1_SWREG(17) -#define G1_REG_QTABLE_BASE G1_SWREG(40) - -#define G1_REG_DEC_AXI_RD_ID(v) (((v) << 24) & GENMASK(31, 24)) -#define G1_REG_DEC_TIMEOUT_E(v) ((v) ? BIT(23) : 0) -#define G1_REG_DEC_STRSWAP32_E(v) ((v) ? BIT(22) : 0) -#define G1_REG_DEC_STRENDIAN_E(v) ((v) ? BIT(21) : 0) -#define G1_REG_DEC_INSWAP32_E(v) ((v) ? BIT(20) : 0) -#define G1_REG_DEC_OUTSWAP32_E(v) ((v) ? BIT(19) : 0) -#define G1_REG_DEC_DATA_DISC_E(v) ((v) ? BIT(18) : 0) -#define G1_REG_DEC_LATENCY(v) (((v) << 11) & GENMASK(16, 11)) -#define G1_REG_DEC_CLK_GATE_E(v) ((v) ? BIT(10) : 0) -#define G1_REG_DEC_IN_ENDIAN(v) ((v) ? BIT(9) : 0) -#define G1_REG_DEC_OUT_ENDIAN(v) ((v) ? BIT(8) : 0) -#define G1_REG_DEC_ADV_PRE_DIS(v) ((v) ? BIT(6) : 0) -#define G1_REG_DEC_SCMD_DIS(v) ((v) ? BIT(5) : 0) -#define G1_REG_DEC_MAX_BURST(v) (((v) << 0) & GENMASK(4, 0)) - -#define G1_REG_DEC_MODE(v) (((v) << 28) & GENMASK(31, 28)) -#define G1_REG_RLC_MODE_E(v) ((v) ? BIT(27) : 0) -#define G1_REG_PIC_INTERLACE_E(v) ((v) ? BIT(23) : 0) -#define G1_REG_PIC_FIELDMODE_E(v) ((v) ? BIT(22) : 0) -#define G1_REG_PIC_B_E(v) ((v) ? BIT(21) : 0) -#define G1_REG_PIC_INTER_E(v) ((v) ? BIT(20) : 0) -#define G1_REG_PIC_TOPFIELD_E(v) ((v) ? BIT(19) : 0) -#define G1_REG_FWD_INTERLACE_E(v) ((v) ? BIT(18) : 0) -#define G1_REG_FILTERING_DIS(v) ((v) ? BIT(14) : 0) -#define G1_REG_WRITE_MVS_E(v) ((v) ? BIT(12) : 0) -#define G1_REG_DEC_AXI_WR_ID(v) (((v) << 0) & GENMASK(7, 0)) - -#define G1_REG_PIC_MB_WIDTH(v) (((v) << 23) & GENMASK(31, 23)) -#define G1_REG_PIC_MB_HEIGHT_P(v) (((v) << 11) & GENMASK(18, 11)) -#define G1_REG_ALT_SCAN_E(v) ((v) ? BIT(6) : 0) -#define G1_REG_TOPFIELDFIRST_E(v) ((v) ? BIT(5) : 0) - -#define G1_REG_STRM_START_BIT(v) (((v) << 26) & GENMASK(31, 26)) -#define G1_REG_QSCALE_TYPE(v) ((v) ? BIT(24) : 0) -#define G1_REG_CON_MV_E(v) ((v) ? BIT(4) : 0) -#define G1_REG_INTRA_DC_PREC(v) (((v) << 2) & GENMASK(3, 2)) -#define G1_REG_INTRA_VLC_TAB(v) ((v) ? BIT(1) : 0) -#define G1_REG_FRAME_PRED_DCT(v) ((v) ? BIT(0) : 0) - -#define G1_REG_INIT_QP(v) (((v) << 25) & GENMASK(30, 25)) -#define G1_REG_STREAM_LEN(v) (((v) << 0) & GENMASK(23, 0)) - -#define G1_REG_ALT_SCAN_FLAG_E(v) ((v) ? BIT(19) : 0) -#define G1_REG_FCODE_FWD_HOR(v) (((v) << 15) & GENMASK(18, 15)) -#define G1_REG_FCODE_FWD_VER(v) (((v) << 11) & GENMASK(14, 11)) -#define G1_REG_FCODE_BWD_HOR(v) (((v) << 7) & GENMASK(10, 7)) -#define G1_REG_FCODE_BWD_VER(v) (((v) << 3) & GENMASK(6, 3)) -#define G1_REG_MV_ACCURACY_FWD(v) ((v) ? BIT(2) : 0) -#define G1_REG_MV_ACCURACY_BWD(v) ((v) ? BIT(1) : 0) - -#define G1_REG_STARTMB_X(v) (((v) << 23) & GENMASK(31, 23)) -#define G1_REG_STARTMB_Y(v) (((v) << 15) & GENMASK(22, 15)) - -#define G1_REG_APF_THRESHOLD(v) (((v) << 0) & GENMASK(13, 0)) - -static void -hantro_g1_mpeg2_dec_set_quantisation(struct hantro_dev *vpu, - struct hantro_ctx *ctx) -{ - struct v4l2_ctrl_mpeg2_quantisation *q; - - q = hantro_get_ctrl(ctx, V4L2_CID_STATELESS_MPEG2_QUANTISATION); - hantro_mpeg2_dec_copy_qtable(ctx->mpeg2_dec.qtable.cpu, q); - vdpu_write_relaxed(vpu, ctx->mpeg2_dec.qtable.dma, G1_REG_QTABLE_BASE); -} - -static void -hantro_g1_mpeg2_dec_set_buffers(struct hantro_dev *vpu, struct hantro_ctx *ctx, - struct vb2_buffer *src_buf, - struct vb2_buffer *dst_buf, - const struct v4l2_ctrl_mpeg2_sequence *seq, - const struct v4l2_ctrl_mpeg2_picture *pic) -{ - dma_addr_t forward_addr = 0, backward_addr = 0; - dma_addr_t current_addr, addr; - - switch (pic->picture_coding_type) { - case V4L2_MPEG2_PIC_CODING_TYPE_B: - backward_addr = hantro_get_ref(ctx, pic->backward_ref_ts); - fallthrough; - case V4L2_MPEG2_PIC_CODING_TYPE_P: - forward_addr = hantro_get_ref(ctx, pic->forward_ref_ts); - } - - /* Source bitstream buffer */ - addr = vb2_dma_contig_plane_dma_addr(src_buf, 0); - vdpu_write_relaxed(vpu, addr, G1_REG_RLC_VLC_BASE); - - /* Destination frame buffer */ - addr = hantro_get_dec_buf_addr(ctx, dst_buf); - current_addr = addr; - - if (pic->picture_structure == V4L2_MPEG2_PIC_BOTTOM_FIELD) - addr += ALIGN(ctx->dst_fmt.width, 16); - vdpu_write_relaxed(vpu, addr, G1_REG_DEC_OUT_BASE); - - if (!forward_addr) - forward_addr = current_addr; - if (!backward_addr) - backward_addr = current_addr; - - /* Set forward ref frame (top/bottom field) */ - if (pic->picture_structure == V4L2_MPEG2_PIC_FRAME || - pic->picture_coding_type == V4L2_MPEG2_PIC_CODING_TYPE_B || - (pic->picture_structure == V4L2_MPEG2_PIC_TOP_FIELD && - pic->flags & V4L2_MPEG2_PIC_FLAG_TOP_FIELD_FIRST) || - (pic->picture_structure == V4L2_MPEG2_PIC_BOTTOM_FIELD && - !(pic->flags & V4L2_MPEG2_PIC_FLAG_TOP_FIELD_FIRST))) { - vdpu_write_relaxed(vpu, forward_addr, G1_REG_REFER0_BASE); - vdpu_write_relaxed(vpu, forward_addr, G1_REG_REFER1_BASE); - } else if (pic->picture_structure == V4L2_MPEG2_PIC_TOP_FIELD) { - vdpu_write_relaxed(vpu, forward_addr, G1_REG_REFER0_BASE); - vdpu_write_relaxed(vpu, current_addr, G1_REG_REFER1_BASE); - } else if (pic->picture_structure == V4L2_MPEG2_PIC_BOTTOM_FIELD) { - vdpu_write_relaxed(vpu, current_addr, G1_REG_REFER0_BASE); - vdpu_write_relaxed(vpu, forward_addr, G1_REG_REFER1_BASE); - } - - /* Set backward ref frame (top/bottom field) */ - vdpu_write_relaxed(vpu, backward_addr, G1_REG_REFER2_BASE); - vdpu_write_relaxed(vpu, backward_addr, G1_REG_REFER3_BASE); -} - -int hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - struct vb2_v4l2_buffer *src_buf, *dst_buf; - const struct v4l2_ctrl_mpeg2_sequence *seq; - const struct v4l2_ctrl_mpeg2_picture *pic; - u32 reg; - - src_buf = hantro_get_src_buf(ctx); - dst_buf = hantro_get_dst_buf(ctx); - - /* Apply request controls if any */ - hantro_start_prepare_run(ctx); - - seq = hantro_get_ctrl(ctx, - V4L2_CID_STATELESS_MPEG2_SEQUENCE); - pic = hantro_get_ctrl(ctx, - V4L2_CID_STATELESS_MPEG2_PICTURE); - - reg = G1_REG_DEC_AXI_RD_ID(0) | - G1_REG_DEC_TIMEOUT_E(1) | - G1_REG_DEC_STRSWAP32_E(1) | - G1_REG_DEC_STRENDIAN_E(1) | - G1_REG_DEC_INSWAP32_E(1) | - G1_REG_DEC_OUTSWAP32_E(1) | - G1_REG_DEC_DATA_DISC_E(0) | - G1_REG_DEC_LATENCY(0) | - G1_REG_DEC_CLK_GATE_E(1) | - G1_REG_DEC_IN_ENDIAN(1) | - G1_REG_DEC_OUT_ENDIAN(1) | - G1_REG_DEC_ADV_PRE_DIS(0) | - G1_REG_DEC_SCMD_DIS(0) | - G1_REG_DEC_MAX_BURST(16); - vdpu_write_relaxed(vpu, reg, G1_SWREG(2)); - - reg = G1_REG_DEC_MODE(5) | - G1_REG_RLC_MODE_E(0) | - G1_REG_PIC_INTERLACE_E(!(seq->flags & V4L2_MPEG2_SEQ_FLAG_PROGRESSIVE)) | - G1_REG_PIC_FIELDMODE_E(pic->picture_structure != V4L2_MPEG2_PIC_FRAME) | - G1_REG_PIC_B_E(pic->picture_coding_type == V4L2_MPEG2_PIC_CODING_TYPE_B) | - G1_REG_PIC_INTER_E(pic->picture_coding_type != V4L2_MPEG2_PIC_CODING_TYPE_I) | - G1_REG_PIC_TOPFIELD_E(pic->picture_structure == V4L2_MPEG2_PIC_TOP_FIELD) | - G1_REG_FWD_INTERLACE_E(0) | - G1_REG_FILTERING_DIS(1) | - G1_REG_WRITE_MVS_E(0) | - G1_REG_DEC_AXI_WR_ID(0); - vdpu_write_relaxed(vpu, reg, G1_SWREG(3)); - - reg = G1_REG_PIC_MB_WIDTH(MB_WIDTH(ctx->dst_fmt.width)) | - G1_REG_PIC_MB_HEIGHT_P(MB_HEIGHT(ctx->dst_fmt.height)) | - G1_REG_ALT_SCAN_E(pic->flags & V4L2_MPEG2_PIC_FLAG_ALT_SCAN) | - G1_REG_TOPFIELDFIRST_E(pic->flags & V4L2_MPEG2_PIC_FLAG_TOP_FIELD_FIRST); - vdpu_write_relaxed(vpu, reg, G1_SWREG(4)); - - reg = G1_REG_STRM_START_BIT(0) | - G1_REG_QSCALE_TYPE(pic->flags & V4L2_MPEG2_PIC_FLAG_Q_SCALE_TYPE) | - G1_REG_CON_MV_E(pic->flags & V4L2_MPEG2_PIC_FLAG_CONCEALMENT_MV) | - G1_REG_INTRA_DC_PREC(pic->intra_dc_precision) | - G1_REG_INTRA_VLC_TAB(pic->flags & V4L2_MPEG2_PIC_FLAG_INTRA_VLC) | - G1_REG_FRAME_PRED_DCT(pic->flags & V4L2_MPEG2_PIC_FLAG_FRAME_PRED_DCT); - vdpu_write_relaxed(vpu, reg, G1_SWREG(5)); - - reg = G1_REG_INIT_QP(1) | - G1_REG_STREAM_LEN(vb2_get_plane_payload(&src_buf->vb2_buf, 0)); - vdpu_write_relaxed(vpu, reg, G1_SWREG(6)); - - reg = G1_REG_ALT_SCAN_FLAG_E(pic->flags & V4L2_MPEG2_PIC_FLAG_ALT_SCAN) | - G1_REG_FCODE_FWD_HOR(pic->f_code[0][0]) | - G1_REG_FCODE_FWD_VER(pic->f_code[0][1]) | - G1_REG_FCODE_BWD_HOR(pic->f_code[1][0]) | - G1_REG_FCODE_BWD_VER(pic->f_code[1][1]) | - G1_REG_MV_ACCURACY_FWD(1) | - G1_REG_MV_ACCURACY_BWD(1); - vdpu_write_relaxed(vpu, reg, G1_SWREG(18)); - - reg = G1_REG_STARTMB_X(0) | - G1_REG_STARTMB_Y(0); - vdpu_write_relaxed(vpu, reg, G1_SWREG(48)); - - reg = G1_REG_APF_THRESHOLD(8); - vdpu_write_relaxed(vpu, reg, G1_SWREG(55)); - - hantro_g1_mpeg2_dec_set_quantisation(vpu, ctx); - hantro_g1_mpeg2_dec_set_buffers(vpu, ctx, &src_buf->vb2_buf, - &dst_buf->vb2_buf, - seq, pic); - - hantro_end_prepare_run(ctx); - - vdpu_write(vpu, G1_REG_INTERRUPT_DEC_E, G1_REG_INTERRUPT); - - return 0; -} diff --git a/drivers/staging/media/hantro/hantro_g1_regs.h b/drivers/staging/media/hantro/hantro_g1_regs.h deleted file mode 100644 index c623b3b0be18..000000000000 --- a/drivers/staging/media/hantro/hantro_g1_regs.h +++ /dev/null @@ -1,356 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Hantro VPU codec driver - * - * Copyright 2018 Google LLC. - * Tomasz Figa <tfiga@chromium.org> - */ - -#ifndef HANTRO_G1_REGS_H_ -#define HANTRO_G1_REGS_H_ - -#define G1_SWREG(nr) ((nr) * 4) - -/* Decoder registers. */ -#define G1_REG_INTERRUPT 0x004 -#define G1_REG_INTERRUPT_DEC_PIC_INF BIT(24) -#define G1_REG_INTERRUPT_DEC_TIMEOUT BIT(18) -#define G1_REG_INTERRUPT_DEC_SLICE_INT BIT(17) -#define G1_REG_INTERRUPT_DEC_ERROR_INT BIT(16) -#define G1_REG_INTERRUPT_DEC_ASO_INT BIT(15) -#define G1_REG_INTERRUPT_DEC_BUFFER_INT BIT(14) -#define G1_REG_INTERRUPT_DEC_BUS_INT BIT(13) -#define G1_REG_INTERRUPT_DEC_RDY_INT BIT(12) -#define G1_REG_INTERRUPT_DEC_IRQ BIT(8) -#define G1_REG_INTERRUPT_DEC_IRQ_DIS BIT(4) -#define G1_REG_INTERRUPT_DEC_E BIT(0) -#define G1_REG_CONFIG 0x008 -#define G1_REG_CONFIG_DEC_AXI_RD_ID(x) (((x) & 0xff) << 24) -#define G1_REG_CONFIG_DEC_TIMEOUT_E BIT(23) -#define G1_REG_CONFIG_DEC_STRSWAP32_E BIT(22) -#define G1_REG_CONFIG_DEC_STRENDIAN_E BIT(21) -#define G1_REG_CONFIG_DEC_INSWAP32_E BIT(20) -#define G1_REG_CONFIG_DEC_OUTSWAP32_E BIT(19) -#define G1_REG_CONFIG_DEC_DATA_DISC_E BIT(18) -#define G1_REG_CONFIG_TILED_MODE_MSB BIT(17) -#define G1_REG_CONFIG_DEC_OUT_TILED_E BIT(17) -#define G1_REG_CONFIG_DEC_LATENCY(x) (((x) & 0x3f) << 11) -#define G1_REG_CONFIG_DEC_CLK_GATE_E BIT(10) -#define G1_REG_CONFIG_DEC_IN_ENDIAN BIT(9) -#define G1_REG_CONFIG_DEC_OUT_ENDIAN BIT(8) -#define G1_REG_CONFIG_PRIORITY_MODE(x) (((x) & 0x7) << 5) -#define G1_REG_CONFIG_TILED_MODE_LSB BIT(7) -#define G1_REG_CONFIG_DEC_ADV_PRE_DIS BIT(6) -#define G1_REG_CONFIG_DEC_SCMD_DIS BIT(5) -#define G1_REG_CONFIG_DEC_MAX_BURST(x) (((x) & 0x1f) << 0) -#define G1_REG_DEC_CTRL0 0x00c -#define G1_REG_DEC_CTRL0_DEC_MODE(x) (((x) & 0xf) << 28) -#define G1_REG_DEC_CTRL0_RLC_MODE_E BIT(27) -#define G1_REG_DEC_CTRL0_SKIP_MODE BIT(26) -#define G1_REG_DEC_CTRL0_DIVX3_E BIT(25) -#define G1_REG_DEC_CTRL0_PJPEG_E BIT(24) -#define G1_REG_DEC_CTRL0_PIC_INTERLACE_E BIT(23) -#define G1_REG_DEC_CTRL0_PIC_FIELDMODE_E BIT(22) -#define G1_REG_DEC_CTRL0_PIC_B_E BIT(21) -#define G1_REG_DEC_CTRL0_PIC_INTER_E BIT(20) -#define G1_REG_DEC_CTRL0_PIC_TOPFIELD_E BIT(19) -#define G1_REG_DEC_CTRL0_FWD_INTERLACE_E BIT(18) -#define G1_REG_DEC_CTRL0_SORENSON_E BIT(17) -#define G1_REG_DEC_CTRL0_REF_TOPFIELD_E BIT(16) -#define G1_REG_DEC_CTRL0_DEC_OUT_DIS BIT(15) -#define G1_REG_DEC_CTRL0_FILTERING_DIS BIT(14) -#define G1_REG_DEC_CTRL0_WEBP_E BIT(13) -#define G1_REG_DEC_CTRL0_MVC_E BIT(13) -#define G1_REG_DEC_CTRL0_PIC_FIXED_QUANT BIT(13) -#define G1_REG_DEC_CTRL0_WRITE_MVS_E BIT(12) -#define G1_REG_DEC_CTRL0_REFTOPFIRST_E BIT(11) -#define G1_REG_DEC_CTRL0_SEQ_MBAFF_E BIT(10) -#define G1_REG_DEC_CTRL0_PICORD_COUNT_E BIT(9) -#define G1_REG_DEC_CTRL0_DEC_AHB_HLOCK_E BIT(8) -#define G1_REG_DEC_CTRL0_DEC_AXI_WR_ID(x) (((x) & 0xff) << 0) -/* Setting AXI ID to 0xff to get auto generated ID to avoid possible conflicts */ -#define G1_REG_DEC_CTRL0_DEC_AXI_AUTO G1_REG_DEC_CTRL0_DEC_AXI_WR_ID(0xff) -#define G1_REG_DEC_CTRL1 0x010 -#define G1_REG_DEC_CTRL1_PIC_MB_WIDTH(x) (((x) & 0x1ff) << 23) -#define G1_REG_DEC_CTRL1_MB_WIDTH_OFF(x) (((x) & 0xf) << 19) -#define G1_REG_DEC_CTRL1_PIC_MB_HEIGHT_P(x) (((x) & 0xff) << 11) -#define G1_REG_DEC_CTRL1_MB_HEIGHT_OFF(x) (((x) & 0xf) << 7) -#define G1_REG_DEC_CTRL1_ALT_SCAN_E BIT(6) -#define G1_REG_DEC_CTRL1_TOPFIELDFIRST_E BIT(5) -#define G1_REG_DEC_CTRL1_REF_FRAMES(x) (((x) & 0x1f) << 0) -#define G1_REG_DEC_CTRL1_PIC_MB_W_EXT(x) (((x) & 0x7) << 3) -#define G1_REG_DEC_CTRL1_PIC_MB_H_EXT(x) (((x) & 0x7) << 0) -#define G1_REG_DEC_CTRL1_PIC_REFER_FLAG BIT(0) -#define G1_REG_DEC_CTRL2 0x014 -#define G1_REG_DEC_CTRL2_STRM_START_BIT(x) (((x) & 0x3f) << 26) -#define G1_REG_DEC_CTRL2_SYNC_MARKER_E BIT(25) -#define G1_REG_DEC_CTRL2_TYPE1_QUANT_E BIT(24) -#define G1_REG_DEC_CTRL2_CH_QP_OFFSET(x) (((x) & 0x1f) << 19) -#define G1_REG_DEC_CTRL2_CH_QP_OFFSET2(x) (((x) & 0x1f) << 14) -#define G1_REG_DEC_CTRL2_FIELDPIC_FLAG_E BIT(0) -#define G1_REG_DEC_CTRL2_INTRADC_VLC_THR(x) (((x) & 0x7) << 16) -#define G1_REG_DEC_CTRL2_VOP_TIME_INCR(x) (((x) & 0xffff) << 0) -#define G1_REG_DEC_CTRL2_DQ_PROFILE BIT(24) -#define G1_REG_DEC_CTRL2_DQBI_LEVEL BIT(23) -#define G1_REG_DEC_CTRL2_RANGE_RED_FRM_E BIT(22) -#define G1_REG_DEC_CTRL2_FAST_UVMC_E BIT(20) -#define G1_REG_DEC_CTRL2_TRANSDCTAB BIT(17) -#define G1_REG_DEC_CTRL2_TRANSACFRM(x) (((x) & 0x3) << 15) -#define G1_REG_DEC_CTRL2_TRANSACFRM2(x) (((x) & 0x3) << 13) -#define G1_REG_DEC_CTRL2_MB_MODE_TAB(x) (((x) & 0x7) << 10) -#define G1_REG_DEC_CTRL2_MVTAB(x) (((x) & 0x7) << 7) -#define G1_REG_DEC_CTRL2_CBPTAB(x) (((x) & 0x7) << 4) -#define G1_REG_DEC_CTRL2_2MV_BLK_PAT_TAB(x) (((x) & 0x3) << 2) -#define G1_REG_DEC_CTRL2_4MV_BLK_PAT_TAB(x) (((x) & 0x3) << 0) -#define G1_REG_DEC_CTRL2_QSCALE_TYPE BIT(24) -#define G1_REG_DEC_CTRL2_CON_MV_E BIT(4) -#define G1_REG_DEC_CTRL2_INTRA_DC_PREC(x) (((x) & 0x3) << 2) -#define G1_REG_DEC_CTRL2_INTRA_VLC_TAB BIT(1) -#define G1_REG_DEC_CTRL2_FRAME_PRED_DCT BIT(0) -#define G1_REG_DEC_CTRL2_JPEG_QTABLES(x) (((x) & 0x3) << 11) -#define G1_REG_DEC_CTRL2_JPEG_MODE(x) (((x) & 0x7) << 8) -#define G1_REG_DEC_CTRL2_JPEG_FILRIGHT_E BIT(7) -#define G1_REG_DEC_CTRL2_JPEG_STREAM_ALL BIT(6) -#define G1_REG_DEC_CTRL2_CR_AC_VLCTABLE BIT(5) -#define G1_REG_DEC_CTRL2_CB_AC_VLCTABLE BIT(4) -#define G1_REG_DEC_CTRL2_CR_DC_VLCTABLE BIT(3) -#define G1_REG_DEC_CTRL2_CB_DC_VLCTABLE BIT(2) -#define G1_REG_DEC_CTRL2_CR_DC_VLCTABLE3 BIT(1) -#define G1_REG_DEC_CTRL2_CB_DC_VLCTABLE3 BIT(0) -#define G1_REG_DEC_CTRL2_STRM1_START_BIT(x) (((x) & 0x3f) << 18) -#define G1_REG_DEC_CTRL2_HUFFMAN_E BIT(17) -#define G1_REG_DEC_CTRL2_MULTISTREAM_E BIT(16) -#define G1_REG_DEC_CTRL2_BOOLEAN_VALUE(x) (((x) & 0xff) << 8) -#define G1_REG_DEC_CTRL2_BOOLEAN_RANGE(x) (((x) & 0xff) << 0) -#define G1_REG_DEC_CTRL2_ALPHA_OFFSET(x) (((x) & 0x1f) << 5) -#define G1_REG_DEC_CTRL2_BETA_OFFSET(x) (((x) & 0x1f) << 0) -#define G1_REG_DEC_CTRL3 0x018 -#define G1_REG_DEC_CTRL3_START_CODE_E BIT(31) -#define G1_REG_DEC_CTRL3_INIT_QP(x) (((x) & 0x3f) << 25) -#define G1_REG_DEC_CTRL3_CH_8PIX_ILEAV_E BIT(24) -#define G1_REG_DEC_CTRL3_STREAM_LEN_EXT(x) (((x) & 0xff) << 24) -#define G1_REG_DEC_CTRL3_STREAM_LEN(x) (((x) & 0xffffff) << 0) -#define G1_REG_DEC_CTRL4 0x01c -#define G1_REG_DEC_CTRL4_CABAC_E BIT(31) -#define G1_REG_DEC_CTRL4_BLACKWHITE_E BIT(30) -#define G1_REG_DEC_CTRL4_DIR_8X8_INFER_E BIT(29) -#define G1_REG_DEC_CTRL4_WEIGHT_PRED_E BIT(28) -#define G1_REG_DEC_CTRL4_WEIGHT_BIPR_IDC(x) (((x) & 0x3) << 26) -#define G1_REG_DEC_CTRL4_AVS_H264_H_EXT BIT(25) -#define G1_REG_DEC_CTRL4_FRAMENUM_LEN(x) (((x) & 0x1f) << 16) -#define G1_REG_DEC_CTRL4_FRAMENUM(x) (((x) & 0xffff) << 0) -#define G1_REG_DEC_CTRL4_BITPLANE0_E BIT(31) -#define G1_REG_DEC_CTRL4_BITPLANE1_E BIT(30) -#define G1_REG_DEC_CTRL4_BITPLANE2_E BIT(29) -#define G1_REG_DEC_CTRL4_ALT_PQUANT(x) (((x) & 0x1f) << 24) -#define G1_REG_DEC_CTRL4_DQ_EDGES(x) (((x) & 0xf) << 20) -#define G1_REG_DEC_CTRL4_TTMBF BIT(19) -#define G1_REG_DEC_CTRL4_PQINDEX(x) (((x) & 0x1f) << 14) -#define G1_REG_DEC_CTRL4_VC1_HEIGHT_EXT BIT(13) -#define G1_REG_DEC_CTRL4_BILIN_MC_E BIT(12) -#define G1_REG_DEC_CTRL4_UNIQP_E BIT(11) -#define G1_REG_DEC_CTRL4_HALFQP_E BIT(10) -#define G1_REG_DEC_CTRL4_TTFRM(x) (((x) & 0x3) << 8) -#define G1_REG_DEC_CTRL4_2ND_BYTE_EMUL_E BIT(7) -#define G1_REG_DEC_CTRL4_DQUANT_E BIT(6) -#define G1_REG_DEC_CTRL4_VC1_ADV_E BIT(5) -#define G1_REG_DEC_CTRL4_PJPEG_FILDOWN_E BIT(26) -#define G1_REG_DEC_CTRL4_PJPEG_WDIV8 BIT(25) -#define G1_REG_DEC_CTRL4_PJPEG_HDIV8 BIT(24) -#define G1_REG_DEC_CTRL4_PJPEG_AH(x) (((x) & 0xf) << 20) -#define G1_REG_DEC_CTRL4_PJPEG_AL(x) (((x) & 0xf) << 16) -#define G1_REG_DEC_CTRL4_PJPEG_SS(x) (((x) & 0xff) << 8) -#define G1_REG_DEC_CTRL4_PJPEG_SE(x) (((x) & 0xff) << 0) -#define G1_REG_DEC_CTRL4_DCT1_START_BIT(x) (((x) & 0x3f) << 26) -#define G1_REG_DEC_CTRL4_DCT2_START_BIT(x) (((x) & 0x3f) << 20) -#define G1_REG_DEC_CTRL4_CH_MV_RES BIT(13) -#define G1_REG_DEC_CTRL4_INIT_DC_MATCH0(x) (((x) & 0x7) << 9) -#define G1_REG_DEC_CTRL4_INIT_DC_MATCH1(x) (((x) & 0x7) << 6) -#define G1_REG_DEC_CTRL4_VP7_VERSION BIT(5) -#define G1_REG_DEC_CTRL5 0x020 -#define G1_REG_DEC_CTRL5_CONST_INTRA_E BIT(31) -#define G1_REG_DEC_CTRL5_FILT_CTRL_PRES BIT(30) -#define G1_REG_DEC_CTRL5_RDPIC_CNT_PRES BIT(29) -#define G1_REG_DEC_CTRL5_8X8TRANS_FLAG_E BIT(28) -#define G1_REG_DEC_CTRL5_REFPIC_MK_LEN(x) (((x) & 0x7ff) << 17) -#define G1_REG_DEC_CTRL5_IDR_PIC_E BIT(16) -#define G1_REG_DEC_CTRL5_IDR_PIC_ID(x) (((x) & 0xffff) << 0) -#define G1_REG_DEC_CTRL5_MV_SCALEFACTOR(x) (((x) & 0xff) << 24) -#define G1_REG_DEC_CTRL5_REF_DIST_FWD(x) (((x) & 0x1f) << 19) -#define G1_REG_DEC_CTRL5_REF_DIST_BWD(x) (((x) & 0x1f) << 14) -#define G1_REG_DEC_CTRL5_LOOP_FILT_LIMIT(x) (((x) & 0xf) << 14) -#define G1_REG_DEC_CTRL5_VARIANCE_TEST_E BIT(13) -#define G1_REG_DEC_CTRL5_MV_THRESHOLD(x) (((x) & 0x7) << 10) -#define G1_REG_DEC_CTRL5_VAR_THRESHOLD(x) (((x) & 0x3ff) << 0) -#define G1_REG_DEC_CTRL5_DIVX_IDCT_E BIT(8) -#define G1_REG_DEC_CTRL5_DIVX3_SLICE_SIZE(x) (((x) & 0xff) << 0) -#define G1_REG_DEC_CTRL5_PJPEG_REST_FREQ(x) (((x) & 0xffff) << 0) -#define G1_REG_DEC_CTRL5_RV_PROFILE(x) (((x) & 0x3) << 30) -#define G1_REG_DEC_CTRL5_RV_OSV_QUANT(x) (((x) & 0x3) << 28) -#define G1_REG_DEC_CTRL5_RV_FWD_SCALE(x) (((x) & 0x3fff) << 14) -#define G1_REG_DEC_CTRL5_RV_BWD_SCALE(x) (((x) & 0x3fff) << 0) -#define G1_REG_DEC_CTRL5_INIT_DC_COMP0(x) (((x) & 0xffff) << 16) -#define G1_REG_DEC_CTRL5_INIT_DC_COMP1(x) (((x) & 0xffff) << 0) -#define G1_REG_DEC_CTRL6 0x024 -#define G1_REG_DEC_CTRL6_PPS_ID(x) (((x) & 0xff) << 24) -#define G1_REG_DEC_CTRL6_REFIDX1_ACTIVE(x) (((x) & 0x1f) << 19) -#define G1_REG_DEC_CTRL6_REFIDX0_ACTIVE(x) (((x) & 0x1f) << 14) -#define G1_REG_DEC_CTRL6_POC_LENGTH(x) (((x) & 0xff) << 0) -#define G1_REG_DEC_CTRL6_ICOMP0_E BIT(24) -#define G1_REG_DEC_CTRL6_ISCALE0(x) (((x) & 0xff) << 16) -#define G1_REG_DEC_CTRL6_ISHIFT0(x) (((x) & 0xffff) << 0) -#define G1_REG_DEC_CTRL6_STREAM1_LEN(x) (((x) & 0xffffff) << 0) -#define G1_REG_DEC_CTRL6_PIC_SLICE_AM(x) (((x) & 0x1fff) << 0) -#define G1_REG_DEC_CTRL6_COEFFS_PART_AM(x) (((x) & 0xf) << 24) -#define G1_REG_FWD_PIC(i) (0x028 + ((i) * 0x4)) -#define G1_REG_FWD_PIC_PINIT_RLIST_F5(x) (((x) & 0x1f) << 25) -#define G1_REG_FWD_PIC_PINIT_RLIST_F4(x) (((x) & 0x1f) << 20) -#define G1_REG_FWD_PIC_PINIT_RLIST_F3(x) (((x) & 0x1f) << 15) -#define G1_REG_FWD_PIC_PINIT_RLIST_F2(x) (((x) & 0x1f) << 10) -#define G1_REG_FWD_PIC_PINIT_RLIST_F1(x) (((x) & 0x1f) << 5) -#define G1_REG_FWD_PIC_PINIT_RLIST_F0(x) (((x) & 0x1f) << 0) -#define G1_REG_FWD_PIC1_ICOMP1_E BIT(24) -#define G1_REG_FWD_PIC1_ISCALE1(x) (((x) & 0xff) << 16) -#define G1_REG_FWD_PIC1_ISHIFT1(x) (((x) & 0xffff) << 0) -#define G1_REG_FWD_PIC1_SEGMENT_BASE(x) ((x) << 0) -#define G1_REG_FWD_PIC1_SEGMENT_UPD_E BIT(1) -#define G1_REG_FWD_PIC1_SEGMENT_E BIT(0) -#define G1_REG_DEC_CTRL7 0x02c -#define G1_REG_DEC_CTRL7_PINIT_RLIST_F15(x) (((x) & 0x1f) << 25) -#define G1_REG_DEC_CTRL7_PINIT_RLIST_F14(x) (((x) & 0x1f) << 20) -#define G1_REG_DEC_CTRL7_PINIT_RLIST_F13(x) (((x) & 0x1f) << 15) -#define G1_REG_DEC_CTRL7_PINIT_RLIST_F12(x) (((x) & 0x1f) << 10) -#define G1_REG_DEC_CTRL7_PINIT_RLIST_F11(x) (((x) & 0x1f) << 5) -#define G1_REG_DEC_CTRL7_PINIT_RLIST_F10(x) (((x) & 0x1f) << 0) -#define G1_REG_DEC_CTRL7_ICOMP2_E BIT(24) -#define G1_REG_DEC_CTRL7_ISCALE2(x) (((x) & 0xff) << 16) -#define G1_REG_DEC_CTRL7_ISHIFT2(x) (((x) & 0xffff) << 0) -#define G1_REG_DEC_CTRL7_DCT3_START_BIT(x) (((x) & 0x3f) << 24) -#define G1_REG_DEC_CTRL7_DCT4_START_BIT(x) (((x) & 0x3f) << 18) -#define G1_REG_DEC_CTRL7_DCT5_START_BIT(x) (((x) & 0x3f) << 12) -#define G1_REG_DEC_CTRL7_DCT6_START_BIT(x) (((x) & 0x3f) << 6) -#define G1_REG_DEC_CTRL7_DCT7_START_BIT(x) (((x) & 0x3f) << 0) -#define G1_REG_ADDR_STR 0x030 -#define G1_REG_ADDR_DST 0x034 -#define G1_REG_ADDR_REF(i) (0x038 + ((i) * 0x4)) -#define G1_REG_ADDR_REF_FIELD_E BIT(1) -#define G1_REG_ADDR_REF_TOPC_E BIT(0) -#define G1_REG_REF_PIC(i) (0x078 + ((i) * 0x4)) -#define G1_REG_REF_PIC_FILT_TYPE_E BIT(31) -#define G1_REG_REF_PIC_FILT_SHARPNESS(x) (((x) & 0x7) << 28) -#define G1_REG_REF_PIC_MB_ADJ_0(x) (((x) & 0x7f) << 21) -#define G1_REG_REF_PIC_MB_ADJ_1(x) (((x) & 0x7f) << 14) -#define G1_REG_REF_PIC_MB_ADJ_2(x) (((x) & 0x7f) << 7) -#define G1_REG_REF_PIC_MB_ADJ_3(x) (((x) & 0x7f) << 0) -#define G1_REG_REF_PIC_REFER1_NBR(x) (((x) & 0xffff) << 16) -#define G1_REG_REF_PIC_REFER0_NBR(x) (((x) & 0xffff) << 0) -#define G1_REG_REF_PIC_LF_LEVEL_0(x) (((x) & 0x3f) << 18) -#define G1_REG_REF_PIC_LF_LEVEL_1(x) (((x) & 0x3f) << 12) -#define G1_REG_REF_PIC_LF_LEVEL_2(x) (((x) & 0x3f) << 6) -#define G1_REG_REF_PIC_LF_LEVEL_3(x) (((x) & 0x3f) << 0) -#define G1_REG_REF_PIC_QUANT_DELTA_0(x) (((x) & 0x1f) << 27) -#define G1_REG_REF_PIC_QUANT_DELTA_1(x) (((x) & 0x1f) << 22) -#define G1_REG_REF_PIC_QUANT_0(x) (((x) & 0x7ff) << 11) -#define G1_REG_REF_PIC_QUANT_1(x) (((x) & 0x7ff) << 0) -#define G1_REG_LT_REF 0x098 -#define G1_REG_VALID_REF 0x09c -#define G1_REG_ADDR_QTABLE 0x0a0 -#define G1_REG_ADDR_DIR_MV 0x0a4 -#define G1_REG_BD_REF_PIC(i) (0x0a8 + ((i) * 0x4)) -#define G1_REG_BD_REF_PIC_BINIT_RLIST_B2(x) (((x) & 0x1f) << 25) -#define G1_REG_BD_REF_PIC_BINIT_RLIST_F2(x) (((x) & 0x1f) << 20) -#define G1_REG_BD_REF_PIC_BINIT_RLIST_B1(x) (((x) & 0x1f) << 15) -#define G1_REG_BD_REF_PIC_BINIT_RLIST_F1(x) (((x) & 0x1f) << 10) -#define G1_REG_BD_REF_PIC_BINIT_RLIST_B0(x) (((x) & 0x1f) << 5) -#define G1_REG_BD_REF_PIC_BINIT_RLIST_F0(x) (((x) & 0x1f) << 0) -#define G1_REG_BD_REF_PIC_PRED_TAP_2_M1(x) (((x) & 0x3) << 10) -#define G1_REG_BD_REF_PIC_PRED_TAP_2_4(x) (((x) & 0x3) << 8) -#define G1_REG_BD_REF_PIC_PRED_TAP_4_M1(x) (((x) & 0x3) << 6) -#define G1_REG_BD_REF_PIC_PRED_TAP_4_4(x) (((x) & 0x3) << 4) -#define G1_REG_BD_REF_PIC_PRED_TAP_6_M1(x) (((x) & 0x3) << 2) -#define G1_REG_BD_REF_PIC_PRED_TAP_6_4(x) (((x) & 0x3) << 0) -#define G1_REG_BD_REF_PIC_QUANT_DELTA_2(x) (((x) & 0x1f) << 27) -#define G1_REG_BD_REF_PIC_QUANT_DELTA_3(x) (((x) & 0x1f) << 22) -#define G1_REG_BD_REF_PIC_QUANT_2(x) (((x) & 0x7ff) << 11) -#define G1_REG_BD_REF_PIC_QUANT_3(x) (((x) & 0x7ff) << 0) -#define G1_REG_BD_P_REF_PIC 0x0bc -#define G1_REG_BD_P_REF_PIC_QUANT_DELTA_4(x) (((x) & 0x1f) << 27) -#define G1_REG_BD_P_REF_PIC_PINIT_RLIST_F3(x) (((x) & 0x1f) << 25) -#define G1_REG_BD_P_REF_PIC_PINIT_RLIST_F2(x) (((x) & 0x1f) << 20) -#define G1_REG_BD_P_REF_PIC_PINIT_RLIST_F1(x) (((x) & 0x1f) << 15) -#define G1_REG_BD_P_REF_PIC_PINIT_RLIST_F0(x) (((x) & 0x1f) << 10) -#define G1_REG_BD_P_REF_PIC_BINIT_RLIST_B15(x) (((x) & 0x1f) << 5) -#define G1_REG_BD_P_REF_PIC_BINIT_RLIST_F15(x) (((x) & 0x1f) << 0) -#define G1_REG_ERR_CONC 0x0c0 -#define G1_REG_ERR_CONC_STARTMB_X(x) (((x) & 0x1ff) << 23) -#define G1_REG_ERR_CONC_STARTMB_Y(x) (((x) & 0xff) << 15) -#define G1_REG_PRED_FLT 0x0c4 -#define G1_REG_PRED_FLT_PRED_BC_TAP_0_0(x) (((x) & 0x3ff) << 22) -#define G1_REG_PRED_FLT_PRED_BC_TAP_0_1(x) (((x) & 0x3ff) << 12) -#define G1_REG_PRED_FLT_PRED_BC_TAP_0_2(x) (((x) & 0x3ff) << 2) -#define G1_REG_REF_BUF_CTRL 0x0cc -#define G1_REG_REF_BUF_CTRL_REFBU_E BIT(31) -#define G1_REG_REF_BUF_CTRL_REFBU_THR(x) (((x) & 0xfff) << 19) -#define G1_REG_REF_BUF_CTRL_REFBU_PICID(x) (((x) & 0x1f) << 14) -#define G1_REG_REF_BUF_CTRL_REFBU_EVAL_E BIT(13) -#define G1_REG_REF_BUF_CTRL_REFBU_FPARMOD_E BIT(12) -#define G1_REG_REF_BUF_CTRL_REFBU_Y_OFFSET(x) (((x) & 0x1ff) << 0) -#define G1_REG_REF_BUF_CTRL2 0x0dc -#define G1_REG_REF_BUF_CTRL2_REFBU2_BUF_E BIT(31) -#define G1_REG_REF_BUF_CTRL2_REFBU2_THR(x) (((x) & 0xfff) << 19) -#define G1_REG_REF_BUF_CTRL2_REFBU2_PICID(x) (((x) & 0x1f) << 14) -#define G1_REG_REF_BUF_CTRL2_APF_THRESHOLD(x) (((x) & 0x3fff) << 0) -#define G1_REG_SOFT_RESET 0x194 - -/* Post-processor registers. */ -#define G1_REG_PP_INTERRUPT G1_SWREG(60) -#define G1_REG_PP_READY_IRQ BIT(12) -#define G1_REG_PP_IRQ BIT(8) -#define G1_REG_PP_IRQ_DIS BIT(4) -#define G1_REG_PP_PIPELINE_EN BIT(1) -#define G1_REG_PP_EXTERNAL_TRIGGER BIT(0) -#define G1_REG_PP_DEV_CONFIG G1_SWREG(61) -#define G1_REG_PP_AXI_RD_ID(v) (((v) << 24) & GENMASK(31, 24)) -#define G1_REG_PP_AXI_WR_ID(v) (((v) << 16) & GENMASK(23, 16)) -#define G1_REG_PP_INSWAP32_E(v) ((v) ? BIT(10) : 0) -#define G1_REG_PP_DATA_DISC_E(v) ((v) ? BIT(9) : 0) -#define G1_REG_PP_CLK_GATE_E(v) ((v) ? BIT(8) : 0) -#define G1_REG_PP_IN_ENDIAN(v) ((v) ? BIT(7) : 0) -#define G1_REG_PP_OUT_ENDIAN(v) ((v) ? BIT(6) : 0) -#define G1_REG_PP_OUTSWAP32_E(v) ((v) ? BIT(5) : 0) -#define G1_REG_PP_MAX_BURST(v) (((v) << 0) & GENMASK(4, 0)) -#define G1_REG_PP_IN_LUMA_BASE G1_SWREG(63) -#define G1_REG_PP_IN_CB_BASE G1_SWREG(64) -#define G1_REG_PP_IN_CR_BASE G1_SWREG(65) -#define G1_REG_PP_OUT_LUMA_BASE G1_SWREG(66) -#define G1_REG_PP_OUT_CHROMA_BASE G1_SWREG(67) -#define G1_REG_PP_CONTRAST_ADJUST G1_SWREG(68) -#define G1_REG_PP_COLOR_CONVERSION G1_SWREG(69) -#define G1_REG_PP_COLOR_CONVERSION0 G1_SWREG(70) -#define G1_REG_PP_COLOR_CONVERSION1 G1_SWREG(71) -#define G1_REG_PP_INPUT_SIZE G1_SWREG(72) -#define G1_REG_PP_INPUT_SIZE_HEIGHT(v) (((v) << 9) & GENMASK(16, 9)) -#define G1_REG_PP_INPUT_SIZE_WIDTH(v) (((v) << 0) & GENMASK(8, 0)) -#define G1_REG_PP_SCALING0 G1_SWREG(79) -#define G1_REG_PP_PADD_R(v) (((v) << 23) & GENMASK(27, 23)) -#define G1_REG_PP_PADD_G(v) (((v) << 18) & GENMASK(22, 18)) -#define G1_REG_PP_RANGEMAP_Y(v) ((v) ? BIT(31) : 0) -#define G1_REG_PP_RANGEMAP_C(v) ((v) ? BIT(30) : 0) -#define G1_REG_PP_YCBCR_RANGE(v) ((v) ? BIT(29) : 0) -#define G1_REG_PP_RGB_16(v) ((v) ? BIT(28) : 0) -#define G1_REG_PP_SCALING1 G1_SWREG(80) -#define G1_REG_PP_PADD_B(v) (((v) << 18) & GENMASK(22, 18)) -#define G1_REG_PP_MASK_R G1_SWREG(82) -#define G1_REG_PP_MASK_G G1_SWREG(83) -#define G1_REG_PP_MASK_B G1_SWREG(84) -#define G1_REG_PP_CONTROL G1_SWREG(85) -#define G1_REG_PP_CONTROL_IN_FMT(v) (((v) << 29) & GENMASK(31, 29)) -#define G1_REG_PP_CONTROL_OUT_FMT(v) (((v) << 26) & GENMASK(28, 26)) -#define G1_REG_PP_CONTROL_OUT_HEIGHT(v) (((v) << 15) & GENMASK(25, 15)) -#define G1_REG_PP_CONTROL_OUT_WIDTH(v) (((v) << 4) & GENMASK(14, 4)) -#define G1_REG_PP_MASK1_ORIG_WIDTH G1_SWREG(88) -#define G1_REG_PP_ORIG_WIDTH(v) (((v) << 23) & GENMASK(31, 23)) -#define G1_REG_PP_DISPLAY_WIDTH G1_SWREG(92) -#define G1_REG_PP_FUSE G1_SWREG(99) - -#endif /* HANTRO_G1_REGS_H_ */ diff --git a/drivers/staging/media/hantro/hantro_g1_vp8_dec.c b/drivers/staging/media/hantro/hantro_g1_vp8_dec.c deleted file mode 100644 index 851eb67f19f5..000000000000 --- a/drivers/staging/media/hantro/hantro_g1_vp8_dec.c +++ /dev/null @@ -1,511 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Hantro VP8 codec driver - * - * Copyright (C) 2019 Rockchip Electronics Co., Ltd. - * ZhiChao Yu <zhichao.yu@rock-chips.com> - * - * Copyright (C) 2019 Google, Inc. - * Tomasz Figa <tfiga@chromium.org> - */ - -#include <media/v4l2-mem2mem.h> - -#include "hantro_hw.h" -#include "hantro.h" -#include "hantro_g1_regs.h" - -/* DCT partition base address regs */ -static const struct hantro_reg vp8_dec_dct_base[8] = { - { G1_REG_ADDR_STR, 0, 0xffffffff }, - { G1_REG_ADDR_REF(8), 0, 0xffffffff }, - { G1_REG_ADDR_REF(9), 0, 0xffffffff }, - { G1_REG_ADDR_REF(10), 0, 0xffffffff }, - { G1_REG_ADDR_REF(11), 0, 0xffffffff }, - { G1_REG_ADDR_REF(12), 0, 0xffffffff }, - { G1_REG_ADDR_REF(14), 0, 0xffffffff }, - { G1_REG_ADDR_REF(15), 0, 0xffffffff }, -}; - -/* Loop filter level regs */ -static const struct hantro_reg vp8_dec_lf_level[4] = { - { G1_REG_REF_PIC(2), 18, 0x3f }, - { G1_REG_REF_PIC(2), 12, 0x3f }, - { G1_REG_REF_PIC(2), 6, 0x3f }, - { G1_REG_REF_PIC(2), 0, 0x3f }, -}; - -/* Macroblock loop filter level adjustment regs */ -static const struct hantro_reg vp8_dec_mb_adj[4] = { - { G1_REG_REF_PIC(0), 21, 0x7f }, - { G1_REG_REF_PIC(0), 14, 0x7f }, - { G1_REG_REF_PIC(0), 7, 0x7f }, - { G1_REG_REF_PIC(0), 0, 0x7f }, -}; - -/* Reference frame adjustment regs */ -static const struct hantro_reg vp8_dec_ref_adj[4] = { - { G1_REG_REF_PIC(1), 21, 0x7f }, - { G1_REG_REF_PIC(1), 14, 0x7f }, - { G1_REG_REF_PIC(1), 7, 0x7f }, - { G1_REG_REF_PIC(1), 0, 0x7f }, -}; - -/* Quantizer */ -static const struct hantro_reg vp8_dec_quant[4] = { - { G1_REG_REF_PIC(3), 11, 0x7ff }, - { G1_REG_REF_PIC(3), 0, 0x7ff }, - { G1_REG_BD_REF_PIC(4), 11, 0x7ff }, - { G1_REG_BD_REF_PIC(4), 0, 0x7ff }, -}; - -/* Quantizer delta regs */ -static const struct hantro_reg vp8_dec_quant_delta[5] = { - { G1_REG_REF_PIC(3), 27, 0x1f }, - { G1_REG_REF_PIC(3), 22, 0x1f }, - { G1_REG_BD_REF_PIC(4), 27, 0x1f }, - { G1_REG_BD_REF_PIC(4), 22, 0x1f }, - { G1_REG_BD_P_REF_PIC, 27, 0x1f }, -}; - -/* DCT partition start bits regs */ -static const struct hantro_reg vp8_dec_dct_start_bits[8] = { - { G1_REG_DEC_CTRL2, 26, 0x3f }, { G1_REG_DEC_CTRL4, 26, 0x3f }, - { G1_REG_DEC_CTRL4, 20, 0x3f }, { G1_REG_DEC_CTRL7, 24, 0x3f }, - { G1_REG_DEC_CTRL7, 18, 0x3f }, { G1_REG_DEC_CTRL7, 12, 0x3f }, - { G1_REG_DEC_CTRL7, 6, 0x3f }, { G1_REG_DEC_CTRL7, 0, 0x3f }, -}; - -/* Precision filter tap regs */ -static const struct hantro_reg vp8_dec_pred_bc_tap[8][4] = { - { - { G1_REG_PRED_FLT, 22, 0x3ff }, - { G1_REG_PRED_FLT, 12, 0x3ff }, - { G1_REG_PRED_FLT, 2, 0x3ff }, - { G1_REG_REF_PIC(4), 22, 0x3ff }, - }, - { - { G1_REG_REF_PIC(4), 12, 0x3ff }, - { G1_REG_REF_PIC(4), 2, 0x3ff }, - { G1_REG_REF_PIC(5), 22, 0x3ff }, - { G1_REG_REF_PIC(5), 12, 0x3ff }, - }, - { - { G1_REG_REF_PIC(5), 2, 0x3ff }, - { G1_REG_REF_PIC(6), 22, 0x3ff }, - { G1_REG_REF_PIC(6), 12, 0x3ff }, - { G1_REG_REF_PIC(6), 2, 0x3ff }, - }, - { - { G1_REG_REF_PIC(7), 22, 0x3ff }, - { G1_REG_REF_PIC(7), 12, 0x3ff }, - { G1_REG_REF_PIC(7), 2, 0x3ff }, - { G1_REG_LT_REF, 22, 0x3ff }, - }, - { - { G1_REG_LT_REF, 12, 0x3ff }, - { G1_REG_LT_REF, 2, 0x3ff }, - { G1_REG_VALID_REF, 22, 0x3ff }, - { G1_REG_VALID_REF, 12, 0x3ff }, - }, - { - { G1_REG_VALID_REF, 2, 0x3ff }, - { G1_REG_BD_REF_PIC(0), 22, 0x3ff }, - { G1_REG_BD_REF_PIC(0), 12, 0x3ff }, - { G1_REG_BD_REF_PIC(0), 2, 0x3ff }, - }, - { - { G1_REG_BD_REF_PIC(1), 22, 0x3ff }, - { G1_REG_BD_REF_PIC(1), 12, 0x3ff }, - { G1_REG_BD_REF_PIC(1), 2, 0x3ff }, - { G1_REG_BD_REF_PIC(2), 22, 0x3ff }, - }, - { - { G1_REG_BD_REF_PIC(2), 12, 0x3ff }, - { G1_REG_BD_REF_PIC(2), 2, 0x3ff }, - { G1_REG_BD_REF_PIC(3), 22, 0x3ff }, - { G1_REG_BD_REF_PIC(3), 12, 0x3ff }, - }, -}; - -/* - * Set loop filters - */ -static void cfg_lf(struct hantro_ctx *ctx, - const struct v4l2_ctrl_vp8_frame *hdr) -{ - const struct v4l2_vp8_segment *seg = &hdr->segment; - const struct v4l2_vp8_loop_filter *lf = &hdr->lf; - struct hantro_dev *vpu = ctx->dev; - unsigned int i; - u32 reg; - - if (!(seg->flags & V4L2_VP8_SEGMENT_FLAG_ENABLED)) { - hantro_reg_write(vpu, &vp8_dec_lf_level[0], lf->level); - } else if (seg->flags & V4L2_VP8_SEGMENT_FLAG_DELTA_VALUE_MODE) { - for (i = 0; i < 4; i++) { - u32 lf_level = clamp(lf->level + seg->lf_update[i], - 0, 63); - - hantro_reg_write(vpu, &vp8_dec_lf_level[i], lf_level); - } - } else { - for (i = 0; i < 4; i++) - hantro_reg_write(vpu, &vp8_dec_lf_level[i], - seg->lf_update[i]); - } - - reg = G1_REG_REF_PIC_FILT_SHARPNESS(lf->sharpness_level); - if (lf->flags & V4L2_VP8_LF_FILTER_TYPE_SIMPLE) - reg |= G1_REG_REF_PIC_FILT_TYPE_E; - vdpu_write_relaxed(vpu, reg, G1_REG_REF_PIC(0)); - - if (lf->flags & V4L2_VP8_LF_ADJ_ENABLE) { - for (i = 0; i < 4; i++) { - hantro_reg_write(vpu, &vp8_dec_mb_adj[i], - lf->mb_mode_delta[i]); - hantro_reg_write(vpu, &vp8_dec_ref_adj[i], - lf->ref_frm_delta[i]); - } - } -} - -/* - * Set quantization parameters - */ -static void cfg_qp(struct hantro_ctx *ctx, - const struct v4l2_ctrl_vp8_frame *hdr) -{ - const struct v4l2_vp8_quantization *q = &hdr->quant; - const struct v4l2_vp8_segment *seg = &hdr->segment; - struct hantro_dev *vpu = ctx->dev; - unsigned int i; - - if (!(seg->flags & V4L2_VP8_SEGMENT_FLAG_ENABLED)) { - hantro_reg_write(vpu, &vp8_dec_quant[0], q->y_ac_qi); - } else if (seg->flags & V4L2_VP8_SEGMENT_FLAG_DELTA_VALUE_MODE) { - for (i = 0; i < 4; i++) { - u32 quant = clamp(q->y_ac_qi + seg->quant_update[i], - 0, 127); - - hantro_reg_write(vpu, &vp8_dec_quant[i], quant); - } - } else { - for (i = 0; i < 4; i++) - hantro_reg_write(vpu, &vp8_dec_quant[i], - seg->quant_update[i]); - } - - hantro_reg_write(vpu, &vp8_dec_quant_delta[0], q->y_dc_delta); - hantro_reg_write(vpu, &vp8_dec_quant_delta[1], q->y2_dc_delta); - hantro_reg_write(vpu, &vp8_dec_quant_delta[2], q->y2_ac_delta); - hantro_reg_write(vpu, &vp8_dec_quant_delta[3], q->uv_dc_delta); - hantro_reg_write(vpu, &vp8_dec_quant_delta[4], q->uv_ac_delta); -} - -/* - * set control partition and DCT partition regs - * - * VP8 frame stream data layout: - * - * first_part_size parttion_sizes[0] - * ^ ^ - * src_dma | | - * ^ +--------+------+ +-----+-----+ - * | | control part | | | - * +--------+----------------+------------------+-----------+-----+-----------+ - * | tag 3B | extra 7B | hdr | mb_data | DCT sz | DCT part0 | ... | DCT partn | - * +--------+-----------------------------------+-----------+-----+-----------+ - * | | | | - * v +----+---+ v - * mb_start | src_dma_end - * v - * DCT size part - * (num_dct-1)*3B - * Note: - * 1. only key-frames have extra 7-bytes - * 2. all offsets are base on src_dma - * 3. number of DCT parts is 1, 2, 4 or 8 - * 4. the addresses set to the VPU must be 64-bits aligned - */ -static void cfg_parts(struct hantro_ctx *ctx, - const struct v4l2_ctrl_vp8_frame *hdr) -{ - struct hantro_dev *vpu = ctx->dev; - struct vb2_v4l2_buffer *vb2_src; - u32 first_part_offset = V4L2_VP8_FRAME_IS_KEY_FRAME(hdr) ? 10 : 3; - u32 mb_size, mb_offset_bytes, mb_offset_bits, mb_start_bits; - u32 dct_size_part_size, dct_part_offset; - struct hantro_reg reg; - dma_addr_t src_dma; - u32 dct_part_total_len = 0; - u32 count = 0; - unsigned int i; - - vb2_src = hantro_get_src_buf(ctx); - src_dma = vb2_dma_contig_plane_dma_addr(&vb2_src->vb2_buf, 0); - - /* - * Calculate control partition mb data info - * @first_part_header_bits: bits offset of mb data from first - * part start pos - * @mb_offset_bits: bits offset of mb data from src_dma - * base addr - * @mb_offset_byte: bytes offset of mb data from src_dma - * base addr - * @mb_start_bits: bits offset of mb data from mb data - * 64bits alignment addr - */ - mb_offset_bits = first_part_offset * 8 + - hdr->first_part_header_bits + 8; - mb_offset_bytes = mb_offset_bits / 8; - mb_start_bits = mb_offset_bits - - (mb_offset_bytes & (~DEC_8190_ALIGN_MASK)) * 8; - mb_size = hdr->first_part_size - - (mb_offset_bytes - first_part_offset) + - (mb_offset_bytes & DEC_8190_ALIGN_MASK); - - /* Macroblock data aligned base addr */ - vdpu_write_relaxed(vpu, (mb_offset_bytes & (~DEC_8190_ALIGN_MASK)) - + src_dma, G1_REG_ADDR_REF(13)); - - /* Macroblock data start bits */ - reg.base = G1_REG_DEC_CTRL2; - reg.mask = 0x3f; - reg.shift = 18; - hantro_reg_write(vpu, ®, mb_start_bits); - - /* Macroblock aligned data length */ - reg.base = G1_REG_DEC_CTRL6; - reg.mask = 0x3fffff; - reg.shift = 0; - hantro_reg_write(vpu, ®, mb_size + 1); - - /* - * Calculate DCT partition info - * @dct_size_part_size: Containing sizes of DCT part, every DCT part - * has 3 bytes to store its size, except the last - * DCT part - * @dct_part_offset: bytes offset of DCT parts from src_dma base addr - * @dct_part_total_len: total size of all DCT parts - */ - dct_size_part_size = (hdr->num_dct_parts - 1) * 3; - dct_part_offset = first_part_offset + hdr->first_part_size; - for (i = 0; i < hdr->num_dct_parts; i++) - dct_part_total_len += hdr->dct_part_sizes[i]; - dct_part_total_len += dct_size_part_size; - dct_part_total_len += (dct_part_offset & DEC_8190_ALIGN_MASK); - - /* Number of DCT partitions */ - reg.base = G1_REG_DEC_CTRL6; - reg.mask = 0xf; - reg.shift = 24; - hantro_reg_write(vpu, ®, hdr->num_dct_parts - 1); - - /* DCT partition length */ - vdpu_write_relaxed(vpu, - G1_REG_DEC_CTRL3_STREAM_LEN(dct_part_total_len), - G1_REG_DEC_CTRL3); - - /* DCT partitions base address */ - for (i = 0; i < hdr->num_dct_parts; i++) { - u32 byte_offset = dct_part_offset + dct_size_part_size + count; - u32 base_addr = byte_offset + src_dma; - - hantro_reg_write(vpu, &vp8_dec_dct_base[i], - base_addr & (~DEC_8190_ALIGN_MASK)); - - hantro_reg_write(vpu, &vp8_dec_dct_start_bits[i], - (byte_offset & DEC_8190_ALIGN_MASK) * 8); - - count += hdr->dct_part_sizes[i]; - } -} - -/* - * prediction filter taps - * normal 6-tap filters - */ -static void cfg_tap(struct hantro_ctx *ctx, - const struct v4l2_ctrl_vp8_frame *hdr) -{ - struct hantro_dev *vpu = ctx->dev; - struct hantro_reg reg; - u32 val = 0; - int i, j; - - reg.base = G1_REG_BD_REF_PIC(3); - reg.mask = 0xf; - - if ((hdr->version & 0x03) != 0) - return; /* Tap filter not used. */ - - for (i = 0; i < 8; i++) { - val = (hantro_vp8_dec_mc_filter[i][0] << 2) | - hantro_vp8_dec_mc_filter[i][5]; - - for (j = 0; j < 4; j++) - hantro_reg_write(vpu, &vp8_dec_pred_bc_tap[i][j], - hantro_vp8_dec_mc_filter[i][j + 1]); - - switch (i) { - case 2: - reg.shift = 8; - break; - case 4: - reg.shift = 4; - break; - case 6: - reg.shift = 0; - break; - default: - continue; - } - - hantro_reg_write(vpu, ®, val); - } -} - -static void cfg_ref(struct hantro_ctx *ctx, - const struct v4l2_ctrl_vp8_frame *hdr, - struct vb2_v4l2_buffer *vb2_dst) -{ - struct hantro_dev *vpu = ctx->dev; - dma_addr_t ref; - - - ref = hantro_get_ref(ctx, hdr->last_frame_ts); - if (!ref) { - vpu_debug(0, "failed to find last frame ts=%llu\n", - hdr->last_frame_ts); - ref = vb2_dma_contig_plane_dma_addr(&vb2_dst->vb2_buf, 0); - } - vdpu_write_relaxed(vpu, ref, G1_REG_ADDR_REF(0)); - - ref = hantro_get_ref(ctx, hdr->golden_frame_ts); - if (!ref && hdr->golden_frame_ts) - vpu_debug(0, "failed to find golden frame ts=%llu\n", - hdr->golden_frame_ts); - if (!ref) - ref = vb2_dma_contig_plane_dma_addr(&vb2_dst->vb2_buf, 0); - if (hdr->flags & V4L2_VP8_FRAME_FLAG_SIGN_BIAS_GOLDEN) - ref |= G1_REG_ADDR_REF_TOPC_E; - vdpu_write_relaxed(vpu, ref, G1_REG_ADDR_REF(4)); - - ref = hantro_get_ref(ctx, hdr->alt_frame_ts); - if (!ref && hdr->alt_frame_ts) - vpu_debug(0, "failed to find alt frame ts=%llu\n", - hdr->alt_frame_ts); - if (!ref) - ref = vb2_dma_contig_plane_dma_addr(&vb2_dst->vb2_buf, 0); - if (hdr->flags & V4L2_VP8_FRAME_FLAG_SIGN_BIAS_ALT) - ref |= G1_REG_ADDR_REF_TOPC_E; - vdpu_write_relaxed(vpu, ref, G1_REG_ADDR_REF(5)); -} - -static void cfg_buffers(struct hantro_ctx *ctx, - const struct v4l2_ctrl_vp8_frame *hdr, - struct vb2_v4l2_buffer *vb2_dst) -{ - const struct v4l2_vp8_segment *seg = &hdr->segment; - struct hantro_dev *vpu = ctx->dev; - dma_addr_t dst_dma; - u32 reg; - - /* Set probability table buffer address */ - vdpu_write_relaxed(vpu, ctx->vp8_dec.prob_tbl.dma, - G1_REG_ADDR_QTABLE); - - /* Set segment map address */ - reg = G1_REG_FWD_PIC1_SEGMENT_BASE(ctx->vp8_dec.segment_map.dma); - if (seg->flags & V4L2_VP8_SEGMENT_FLAG_ENABLED) { - reg |= G1_REG_FWD_PIC1_SEGMENT_E; - if (seg->flags & V4L2_VP8_SEGMENT_FLAG_UPDATE_MAP) - reg |= G1_REG_FWD_PIC1_SEGMENT_UPD_E; - } - vdpu_write_relaxed(vpu, reg, G1_REG_FWD_PIC(0)); - - dst_dma = hantro_get_dec_buf_addr(ctx, &vb2_dst->vb2_buf); - vdpu_write_relaxed(vpu, dst_dma, G1_REG_ADDR_DST); -} - -int hantro_g1_vp8_dec_run(struct hantro_ctx *ctx) -{ - const struct v4l2_ctrl_vp8_frame *hdr; - struct hantro_dev *vpu = ctx->dev; - struct vb2_v4l2_buffer *vb2_dst; - size_t height = ctx->dst_fmt.height; - size_t width = ctx->dst_fmt.width; - u32 mb_width, mb_height; - u32 reg; - - hantro_start_prepare_run(ctx); - - hdr = hantro_get_ctrl(ctx, V4L2_CID_STATELESS_VP8_FRAME); - if (WARN_ON(!hdr)) - return -EINVAL; - - /* Reset segment_map buffer in keyframe */ - if (V4L2_VP8_FRAME_IS_KEY_FRAME(hdr) && ctx->vp8_dec.segment_map.cpu) - memset(ctx->vp8_dec.segment_map.cpu, 0, - ctx->vp8_dec.segment_map.size); - - hantro_vp8_prob_update(ctx, hdr); - - reg = G1_REG_CONFIG_DEC_TIMEOUT_E | - G1_REG_CONFIG_DEC_STRENDIAN_E | - G1_REG_CONFIG_DEC_INSWAP32_E | - G1_REG_CONFIG_DEC_STRSWAP32_E | - G1_REG_CONFIG_DEC_OUTSWAP32_E | - G1_REG_CONFIG_DEC_CLK_GATE_E | - G1_REG_CONFIG_DEC_IN_ENDIAN | - G1_REG_CONFIG_DEC_OUT_ENDIAN | - G1_REG_CONFIG_DEC_MAX_BURST(16); - vdpu_write_relaxed(vpu, reg, G1_REG_CONFIG); - - reg = G1_REG_DEC_CTRL0_DEC_MODE(10) | - G1_REG_DEC_CTRL0_DEC_AXI_AUTO; - if (!V4L2_VP8_FRAME_IS_KEY_FRAME(hdr)) - reg |= G1_REG_DEC_CTRL0_PIC_INTER_E; - if (!(hdr->flags & V4L2_VP8_FRAME_FLAG_MB_NO_SKIP_COEFF)) - reg |= G1_REG_DEC_CTRL0_SKIP_MODE; - if (hdr->lf.level == 0) - reg |= G1_REG_DEC_CTRL0_FILTERING_DIS; - vdpu_write_relaxed(vpu, reg, G1_REG_DEC_CTRL0); - - /* Frame dimensions */ - mb_width = MB_WIDTH(width); - mb_height = MB_HEIGHT(height); - reg = G1_REG_DEC_CTRL1_PIC_MB_WIDTH(mb_width) | - G1_REG_DEC_CTRL1_PIC_MB_HEIGHT_P(mb_height) | - G1_REG_DEC_CTRL1_PIC_MB_W_EXT(mb_width >> 9) | - G1_REG_DEC_CTRL1_PIC_MB_H_EXT(mb_height >> 8); - vdpu_write_relaxed(vpu, reg, G1_REG_DEC_CTRL1); - - /* Boolean decoder */ - reg = G1_REG_DEC_CTRL2_BOOLEAN_RANGE(hdr->coder_state.range) - | G1_REG_DEC_CTRL2_BOOLEAN_VALUE(hdr->coder_state.value); - vdpu_write_relaxed(vpu, reg, G1_REG_DEC_CTRL2); - - reg = 0; - if (hdr->version != 3) - reg |= G1_REG_DEC_CTRL4_VC1_HEIGHT_EXT; - if (hdr->version & 0x3) - reg |= G1_REG_DEC_CTRL4_BILIN_MC_E; - vdpu_write_relaxed(vpu, reg, G1_REG_DEC_CTRL4); - - cfg_lf(ctx, hdr); - cfg_qp(ctx, hdr); - cfg_parts(ctx, hdr); - cfg_tap(ctx, hdr); - - vb2_dst = hantro_get_dst_buf(ctx); - cfg_ref(ctx, hdr, vb2_dst); - cfg_buffers(ctx, hdr, vb2_dst); - - hantro_end_prepare_run(ctx); - - vdpu_write(vpu, G1_REG_INTERRUPT_DEC_E, G1_REG_INTERRUPT); - - return 0; -} diff --git a/drivers/staging/media/hantro/hantro_g2.c b/drivers/staging/media/hantro/hantro_g2.c deleted file mode 100644 index ee5f14c5f8f2..000000000000 --- a/drivers/staging/media/hantro/hantro_g2.c +++ /dev/null @@ -1,44 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Hantro VPU codec driver - * - * Copyright (C) 2021 Collabora Ltd, Andrzej Pietrasiewicz <andrzej.p@collabora.com> - */ - -#include "hantro_hw.h" -#include "hantro_g2_regs.h" - -void hantro_g2_check_idle(struct hantro_dev *vpu) -{ - int i; - - for (i = 0; i < 3; i++) { - u32 status; - - /* Make sure the VPU is idle */ - status = vdpu_read(vpu, G2_REG_INTERRUPT); - if (status & G2_REG_INTERRUPT_DEC_E) { - dev_warn(vpu->dev, "device still running, aborting"); - status |= G2_REG_INTERRUPT_DEC_ABORT_E | G2_REG_INTERRUPT_DEC_IRQ_DIS; - vdpu_write(vpu, status, G2_REG_INTERRUPT); - } - } -} - -irqreturn_t hantro_g2_irq(int irq, void *dev_id) -{ - struct hantro_dev *vpu = dev_id; - enum vb2_buffer_state state; - u32 status; - - status = vdpu_read(vpu, G2_REG_INTERRUPT); - state = (status & G2_REG_INTERRUPT_DEC_RDY_INT) ? - VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR; - - vdpu_write(vpu, 0, G2_REG_INTERRUPT); - vdpu_write(vpu, G2_REG_CONFIG_DEC_CLK_GATE_E, G2_REG_CONFIG); - - hantro_irq_done(vpu, state); - - return IRQ_HANDLED; -} diff --git a/drivers/staging/media/hantro/hantro_g2_hevc_dec.c b/drivers/staging/media/hantro/hantro_g2_hevc_dec.c deleted file mode 100644 index 233ecd863d5f..000000000000 --- a/drivers/staging/media/hantro/hantro_g2_hevc_dec.c +++ /dev/null @@ -1,629 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Hantro VPU HEVC codec driver - * - * Copyright (C) 2020 Safran Passenger Innovations LLC - */ - -#include "hantro_hw.h" -#include "hantro_g2_regs.h" - -#define G2_ALIGN 16 - -static size_t hantro_hevc_chroma_offset(struct hantro_ctx *ctx) -{ - return ctx->dst_fmt.width * ctx->dst_fmt.height; -} - -static size_t hantro_hevc_motion_vectors_offset(struct hantro_ctx *ctx) -{ - size_t cr_offset = hantro_hevc_chroma_offset(ctx); - - return ALIGN((cr_offset * 3) / 2, G2_ALIGN); -} - -static void prepare_tile_info_buffer(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - const struct hantro_hevc_dec_ctrls *ctrls = &ctx->hevc_dec.ctrls; - const struct v4l2_ctrl_hevc_pps *pps = ctrls->pps; - const struct v4l2_ctrl_hevc_sps *sps = ctrls->sps; - u16 *p = (u16 *)((u8 *)ctx->hevc_dec.tile_sizes.cpu); - unsigned int num_tile_rows = pps->num_tile_rows_minus1 + 1; - unsigned int num_tile_cols = pps->num_tile_columns_minus1 + 1; - unsigned int pic_width_in_ctbs, pic_height_in_ctbs; - unsigned int max_log2_ctb_size, ctb_size; - bool tiles_enabled, uniform_spacing; - u32 no_chroma = 0; - - tiles_enabled = !!(pps->flags & V4L2_HEVC_PPS_FLAG_TILES_ENABLED); - uniform_spacing = !!(pps->flags & V4L2_HEVC_PPS_FLAG_UNIFORM_SPACING); - - hantro_reg_write(vpu, &g2_tile_e, tiles_enabled); - - max_log2_ctb_size = sps->log2_min_luma_coding_block_size_minus3 + 3 + - sps->log2_diff_max_min_luma_coding_block_size; - pic_width_in_ctbs = (sps->pic_width_in_luma_samples + - (1 << max_log2_ctb_size) - 1) >> max_log2_ctb_size; - pic_height_in_ctbs = (sps->pic_height_in_luma_samples + (1 << max_log2_ctb_size) - 1) - >> max_log2_ctb_size; - ctb_size = 1 << max_log2_ctb_size; - - vpu_debug(1, "Preparing tile sizes buffer for %dx%d CTBs (CTB size %d)\n", - pic_width_in_ctbs, pic_height_in_ctbs, ctb_size); - - if (tiles_enabled) { - unsigned int i, j, h; - - vpu_debug(1, "Tiles enabled! %dx%d\n", num_tile_cols, num_tile_rows); - - hantro_reg_write(vpu, &g2_num_tile_rows, num_tile_rows); - hantro_reg_write(vpu, &g2_num_tile_cols, num_tile_cols); - - /* write width + height for each tile in pic */ - if (!uniform_spacing) { - u32 tmp_w = 0, tmp_h = 0; - - for (i = 0; i < num_tile_rows; i++) { - if (i == num_tile_rows - 1) - h = pic_height_in_ctbs - tmp_h; - else - h = pps->row_height_minus1[i] + 1; - tmp_h += h; - if (i == 0 && h == 1 && ctb_size == 16) - no_chroma = 1; - for (j = 0, tmp_w = 0; j < num_tile_cols - 1; j++) { - tmp_w += pps->column_width_minus1[j] + 1; - *p++ = pps->column_width_minus1[j] + 1; - *p++ = h; - if (i == 0 && h == 1 && ctb_size == 16) - no_chroma = 1; - } - /* last column */ - *p++ = pic_width_in_ctbs - tmp_w; - *p++ = h; - } - } else { /* uniform spacing */ - u32 tmp, prev_h, prev_w; - - for (i = 0, prev_h = 0; i < num_tile_rows; i++) { - tmp = (i + 1) * pic_height_in_ctbs / num_tile_rows; - h = tmp - prev_h; - prev_h = tmp; - if (i == 0 && h == 1 && ctb_size == 16) - no_chroma = 1; - for (j = 0, prev_w = 0; j < num_tile_cols; j++) { - tmp = (j + 1) * pic_width_in_ctbs / num_tile_cols; - *p++ = tmp - prev_w; - *p++ = h; - if (j == 0 && - (pps->column_width_minus1[0] + 1) == 1 && - ctb_size == 16) - no_chroma = 1; - prev_w = tmp; - } - } - } - } else { - hantro_reg_write(vpu, &g2_num_tile_rows, 1); - hantro_reg_write(vpu, &g2_num_tile_cols, 1); - - /* There's one tile, with dimensions equal to pic size. */ - p[0] = pic_width_in_ctbs; - p[1] = pic_height_in_ctbs; - } - - if (no_chroma) - vpu_debug(1, "%s: no chroma!\n", __func__); -} - -static int compute_header_skip_length(struct hantro_ctx *ctx) -{ - const struct hantro_hevc_dec_ctrls *ctrls = &ctx->hevc_dec.ctrls; - const struct v4l2_ctrl_hevc_decode_params *decode_params = ctrls->decode_params; - const struct v4l2_ctrl_hevc_sps *sps = ctrls->sps; - const struct v4l2_ctrl_hevc_pps *pps = ctrls->pps; - int skip = 0; - - if (pps->flags & V4L2_HEVC_PPS_FLAG_OUTPUT_FLAG_PRESENT) - /* size of pic_output_flag */ - skip++; - - if (sps->flags & V4L2_HEVC_SPS_FLAG_SEPARATE_COLOUR_PLANE) - /* size of pic_order_cnt_lsb */ - skip += 2; - - if (!(decode_params->flags & V4L2_HEVC_DECODE_PARAM_FLAG_IDR_PIC)) { - /* size of pic_order_cnt_lsb */ - skip += sps->log2_max_pic_order_cnt_lsb_minus4 + 4; - - /* size of short_term_ref_pic_set_sps_flag */ - skip++; - - if (decode_params->short_term_ref_pic_set_size) - /* size of st_ref_pic_set( num_short_term_ref_pic_sets ) */ - skip += decode_params->short_term_ref_pic_set_size; - else if (sps->num_short_term_ref_pic_sets > 1) - skip += fls(sps->num_short_term_ref_pic_sets - 1); - - skip += decode_params->long_term_ref_pic_set_size; - } - - return skip; -} - -static void set_params(struct hantro_ctx *ctx) -{ - const struct hantro_hevc_dec_ctrls *ctrls = &ctx->hevc_dec.ctrls; - const struct v4l2_ctrl_hevc_sps *sps = ctrls->sps; - const struct v4l2_ctrl_hevc_pps *pps = ctrls->pps; - const struct v4l2_ctrl_hevc_decode_params *decode_params = ctrls->decode_params; - struct hantro_dev *vpu = ctx->dev; - u32 min_log2_cb_size, max_log2_ctb_size, min_cb_size, max_ctb_size; - u32 pic_width_in_min_cbs, pic_height_in_min_cbs; - u32 pic_width_aligned, pic_height_aligned; - u32 partial_ctb_x, partial_ctb_y; - - hantro_reg_write(vpu, &g2_bit_depth_y_minus8, sps->bit_depth_luma_minus8); - hantro_reg_write(vpu, &g2_bit_depth_c_minus8, sps->bit_depth_chroma_minus8); - - hantro_reg_write(vpu, &g2_output_8_bits, 0); - - hantro_reg_write(vpu, &g2_hdr_skip_length, compute_header_skip_length(ctx)); - - min_log2_cb_size = sps->log2_min_luma_coding_block_size_minus3 + 3; - max_log2_ctb_size = min_log2_cb_size + sps->log2_diff_max_min_luma_coding_block_size; - - hantro_reg_write(vpu, &g2_min_cb_size, min_log2_cb_size); - hantro_reg_write(vpu, &g2_max_cb_size, max_log2_ctb_size); - - min_cb_size = 1 << min_log2_cb_size; - max_ctb_size = 1 << max_log2_ctb_size; - - pic_width_in_min_cbs = sps->pic_width_in_luma_samples / min_cb_size; - pic_height_in_min_cbs = sps->pic_height_in_luma_samples / min_cb_size; - pic_width_aligned = ALIGN(sps->pic_width_in_luma_samples, max_ctb_size); - pic_height_aligned = ALIGN(sps->pic_height_in_luma_samples, max_ctb_size); - - partial_ctb_x = !!(sps->pic_width_in_luma_samples != pic_width_aligned); - partial_ctb_y = !!(sps->pic_height_in_luma_samples != pic_height_aligned); - - hantro_reg_write(vpu, &g2_partial_ctb_x, partial_ctb_x); - hantro_reg_write(vpu, &g2_partial_ctb_y, partial_ctb_y); - - hantro_reg_write(vpu, &g2_pic_width_in_cbs, pic_width_in_min_cbs); - hantro_reg_write(vpu, &g2_pic_height_in_cbs, pic_height_in_min_cbs); - - hantro_reg_write(vpu, &g2_pic_width_4x4, - (pic_width_in_min_cbs * min_cb_size) / 4); - hantro_reg_write(vpu, &g2_pic_height_4x4, - (pic_height_in_min_cbs * min_cb_size) / 4); - - hantro_reg_write(vpu, &hevc_max_inter_hierdepth, - sps->max_transform_hierarchy_depth_inter); - hantro_reg_write(vpu, &hevc_max_intra_hierdepth, - sps->max_transform_hierarchy_depth_intra); - hantro_reg_write(vpu, &hevc_min_trb_size, - sps->log2_min_luma_transform_block_size_minus2 + 2); - hantro_reg_write(vpu, &hevc_max_trb_size, - sps->log2_min_luma_transform_block_size_minus2 + 2 + - sps->log2_diff_max_min_luma_transform_block_size); - - hantro_reg_write(vpu, &g2_tempor_mvp_e, - !!(sps->flags & V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED) && - !(decode_params->flags & V4L2_HEVC_DECODE_PARAM_FLAG_IDR_PIC)); - hantro_reg_write(vpu, &g2_strong_smooth_e, - !!(sps->flags & V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED)); - hantro_reg_write(vpu, &g2_asym_pred_e, - !!(sps->flags & V4L2_HEVC_SPS_FLAG_AMP_ENABLED)); - hantro_reg_write(vpu, &g2_sao_e, - !!(sps->flags & V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET)); - hantro_reg_write(vpu, &g2_sign_data_hide, - !!(pps->flags & V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED)); - - if (pps->flags & V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED) { - hantro_reg_write(vpu, &g2_cu_qpd_e, 1); - hantro_reg_write(vpu, &g2_max_cu_qpd_depth, pps->diff_cu_qp_delta_depth); - } else { - hantro_reg_write(vpu, &g2_cu_qpd_e, 0); - hantro_reg_write(vpu, &g2_max_cu_qpd_depth, 0); - } - - hantro_reg_write(vpu, &g2_cb_qp_offset, pps->pps_cb_qp_offset); - hantro_reg_write(vpu, &g2_cr_qp_offset, pps->pps_cr_qp_offset); - - hantro_reg_write(vpu, &g2_filt_offset_beta, pps->pps_beta_offset_div2); - hantro_reg_write(vpu, &g2_filt_offset_tc, pps->pps_tc_offset_div2); - hantro_reg_write(vpu, &g2_slice_hdr_ext_e, - !!(pps->flags & V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESENT)); - hantro_reg_write(vpu, &g2_slice_hdr_ext_bits, pps->num_extra_slice_header_bits); - hantro_reg_write(vpu, &g2_slice_chqp_present, - !!(pps->flags & V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT)); - hantro_reg_write(vpu, &g2_weight_bipr_idc, - !!(pps->flags & V4L2_HEVC_PPS_FLAG_WEIGHTED_BIPRED)); - hantro_reg_write(vpu, &g2_transq_bypass, - !!(pps->flags & V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED)); - hantro_reg_write(vpu, &g2_list_mod_e, - !!(pps->flags & V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT)); - hantro_reg_write(vpu, &g2_entropy_sync_e, - !!(pps->flags & V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED)); - hantro_reg_write(vpu, &g2_cabac_init_present, - !!(pps->flags & V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT)); - hantro_reg_write(vpu, &g2_idr_pic_e, - !!(decode_params->flags & V4L2_HEVC_DECODE_PARAM_FLAG_IRAP_PIC)); - hantro_reg_write(vpu, &hevc_parallel_merge, - pps->log2_parallel_merge_level_minus2 + 2); - hantro_reg_write(vpu, &g2_pcm_filt_d, - !!(sps->flags & V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED)); - hantro_reg_write(vpu, &g2_pcm_e, - !!(sps->flags & V4L2_HEVC_SPS_FLAG_PCM_ENABLED)); - if (sps->flags & V4L2_HEVC_SPS_FLAG_PCM_ENABLED) { - hantro_reg_write(vpu, &g2_max_pcm_size, - sps->log2_diff_max_min_pcm_luma_coding_block_size + - sps->log2_min_pcm_luma_coding_block_size_minus3 + 3); - hantro_reg_write(vpu, &g2_min_pcm_size, - sps->log2_min_pcm_luma_coding_block_size_minus3 + 3); - hantro_reg_write(vpu, &g2_bit_depth_pcm_y, - sps->pcm_sample_bit_depth_luma_minus1 + 1); - hantro_reg_write(vpu, &g2_bit_depth_pcm_c, - sps->pcm_sample_bit_depth_chroma_minus1 + 1); - } else { - hantro_reg_write(vpu, &g2_max_pcm_size, 0); - hantro_reg_write(vpu, &g2_min_pcm_size, 0); - hantro_reg_write(vpu, &g2_bit_depth_pcm_y, 0); - hantro_reg_write(vpu, &g2_bit_depth_pcm_c, 0); - } - - hantro_reg_write(vpu, &g2_start_code_e, 1); - hantro_reg_write(vpu, &g2_init_qp, pps->init_qp_minus26 + 26); - hantro_reg_write(vpu, &g2_weight_pred_e, - !!(pps->flags & V4L2_HEVC_PPS_FLAG_WEIGHTED_PRED)); - hantro_reg_write(vpu, &g2_cabac_init_present, - !!(pps->flags & V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT)); - hantro_reg_write(vpu, &g2_const_intra_e, - !!(pps->flags & V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED)); - hantro_reg_write(vpu, &g2_transform_skip, - !!(pps->flags & V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED)); - hantro_reg_write(vpu, &g2_out_filtering_dis, - !!(pps->flags & V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER)); - hantro_reg_write(vpu, &g2_filt_ctrl_pres, - !!(pps->flags & V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT)); - hantro_reg_write(vpu, &g2_dependent_slice, - !!(pps->flags & V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT_ENABLED)); - hantro_reg_write(vpu, &g2_filter_override, - !!(pps->flags & V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED)); - hantro_reg_write(vpu, &g2_refidx0_active, - pps->num_ref_idx_l0_default_active_minus1 + 1); - hantro_reg_write(vpu, &g2_refidx1_active, - pps->num_ref_idx_l1_default_active_minus1 + 1); - hantro_reg_write(vpu, &g2_apf_threshold, 8); -} - -static void set_ref_pic_list(struct hantro_ctx *ctx) -{ - const struct hantro_hevc_dec_ctrls *ctrls = &ctx->hevc_dec.ctrls; - struct hantro_dev *vpu = ctx->dev; - const struct v4l2_ctrl_hevc_decode_params *decode_params = ctrls->decode_params; - u32 list0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX] = {}; - u32 list1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX] = {}; - static const struct hantro_reg ref_pic_regs0[] = { - hevc_rlist_f0, - hevc_rlist_f1, - hevc_rlist_f2, - hevc_rlist_f3, - hevc_rlist_f4, - hevc_rlist_f5, - hevc_rlist_f6, - hevc_rlist_f7, - hevc_rlist_f8, - hevc_rlist_f9, - hevc_rlist_f10, - hevc_rlist_f11, - hevc_rlist_f12, - hevc_rlist_f13, - hevc_rlist_f14, - hevc_rlist_f15, - }; - static const struct hantro_reg ref_pic_regs1[] = { - hevc_rlist_b0, - hevc_rlist_b1, - hevc_rlist_b2, - hevc_rlist_b3, - hevc_rlist_b4, - hevc_rlist_b5, - hevc_rlist_b6, - hevc_rlist_b7, - hevc_rlist_b8, - hevc_rlist_b9, - hevc_rlist_b10, - hevc_rlist_b11, - hevc_rlist_b12, - hevc_rlist_b13, - hevc_rlist_b14, - hevc_rlist_b15, - }; - unsigned int i, j; - - /* List 0 contains: short term before, short term after and long term */ - j = 0; - for (i = 0; i < decode_params->num_poc_st_curr_before && j < ARRAY_SIZE(list0); i++) - list0[j++] = decode_params->poc_st_curr_before[i]; - for (i = 0; i < decode_params->num_poc_st_curr_after && j < ARRAY_SIZE(list0); i++) - list0[j++] = decode_params->poc_st_curr_after[i]; - for (i = 0; i < decode_params->num_poc_lt_curr && j < ARRAY_SIZE(list0); i++) - list0[j++] = decode_params->poc_lt_curr[i]; - - /* Fill the list, copying over and over */ - i = 0; - while (j < ARRAY_SIZE(list0)) - list0[j++] = list0[i++]; - - j = 0; - for (i = 0; i < decode_params->num_poc_st_curr_after && j < ARRAY_SIZE(list1); i++) - list1[j++] = decode_params->poc_st_curr_after[i]; - for (i = 0; i < decode_params->num_poc_st_curr_before && j < ARRAY_SIZE(list1); i++) - list1[j++] = decode_params->poc_st_curr_before[i]; - for (i = 0; i < decode_params->num_poc_lt_curr && j < ARRAY_SIZE(list1); i++) - list1[j++] = decode_params->poc_lt_curr[i]; - - i = 0; - while (j < ARRAY_SIZE(list1)) - list1[j++] = list1[i++]; - - for (i = 0; i < V4L2_HEVC_DPB_ENTRIES_NUM_MAX; i++) { - hantro_reg_write(vpu, &ref_pic_regs0[i], list0[i]); - hantro_reg_write(vpu, &ref_pic_regs1[i], list1[i]); - } -} - -static int set_ref(struct hantro_ctx *ctx) -{ - const struct hantro_hevc_dec_ctrls *ctrls = &ctx->hevc_dec.ctrls; - const struct v4l2_ctrl_hevc_pps *pps = ctrls->pps; - const struct v4l2_ctrl_hevc_decode_params *decode_params = ctrls->decode_params; - const struct v4l2_hevc_dpb_entry *dpb = decode_params->dpb; - dma_addr_t luma_addr, chroma_addr, mv_addr = 0; - struct hantro_dev *vpu = ctx->dev; - struct vb2_v4l2_buffer *vb2_dst; - struct hantro_decoded_buffer *dst; - size_t cr_offset = hantro_hevc_chroma_offset(ctx); - size_t mv_offset = hantro_hevc_motion_vectors_offset(ctx); - u32 max_ref_frames; - u16 dpb_longterm_e; - static const struct hantro_reg cur_poc[] = { - hevc_cur_poc_00, - hevc_cur_poc_01, - hevc_cur_poc_02, - hevc_cur_poc_03, - hevc_cur_poc_04, - hevc_cur_poc_05, - hevc_cur_poc_06, - hevc_cur_poc_07, - hevc_cur_poc_08, - hevc_cur_poc_09, - hevc_cur_poc_10, - hevc_cur_poc_11, - hevc_cur_poc_12, - hevc_cur_poc_13, - hevc_cur_poc_14, - hevc_cur_poc_15, - }; - unsigned int i; - - max_ref_frames = decode_params->num_poc_lt_curr + - decode_params->num_poc_st_curr_before + - decode_params->num_poc_st_curr_after; - /* - * Set max_ref_frames to non-zero to avoid HW hang when decoding - * badly marked I-frames. - */ - max_ref_frames = max_ref_frames ? max_ref_frames : 1; - hantro_reg_write(vpu, &g2_num_ref_frames, max_ref_frames); - hantro_reg_write(vpu, &g2_filter_over_slices, - !!(pps->flags & V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED)); - hantro_reg_write(vpu, &g2_filter_over_tiles, - !!(pps->flags & V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED)); - - /* - * Write POC count diff from current pic. - */ - for (i = 0; i < decode_params->num_active_dpb_entries && i < ARRAY_SIZE(cur_poc); i++) { - char poc_diff = decode_params->pic_order_cnt_val - dpb[i].pic_order_cnt_val; - - hantro_reg_write(vpu, &cur_poc[i], poc_diff); - } - - if (i < ARRAY_SIZE(cur_poc)) { - /* - * After the references, fill one entry pointing to itself, - * i.e. difference is zero. - */ - hantro_reg_write(vpu, &cur_poc[i], 0); - i++; - } - - /* Fill the rest with the current picture */ - for (; i < ARRAY_SIZE(cur_poc); i++) - hantro_reg_write(vpu, &cur_poc[i], decode_params->pic_order_cnt_val); - - set_ref_pic_list(ctx); - - /* We will only keep the reference pictures that are still used */ - hantro_hevc_ref_init(ctx); - - /* Set up addresses of DPB buffers */ - dpb_longterm_e = 0; - for (i = 0; i < decode_params->num_active_dpb_entries && - i < (V4L2_HEVC_DPB_ENTRIES_NUM_MAX - 1); i++) { - luma_addr = hantro_hevc_get_ref_buf(ctx, dpb[i].pic_order_cnt_val); - if (!luma_addr) - return -ENOMEM; - - chroma_addr = luma_addr + cr_offset; - mv_addr = luma_addr + mv_offset; - - if (dpb[i].flags & V4L2_HEVC_DPB_ENTRY_LONG_TERM_REFERENCE) - dpb_longterm_e |= BIT(V4L2_HEVC_DPB_ENTRIES_NUM_MAX - 1 - i); - - hantro_write_addr(vpu, G2_REF_LUMA_ADDR(i), luma_addr); - hantro_write_addr(vpu, G2_REF_CHROMA_ADDR(i), chroma_addr); - hantro_write_addr(vpu, G2_REF_MV_ADDR(i), mv_addr); - } - - vb2_dst = hantro_get_dst_buf(ctx); - dst = vb2_to_hantro_decoded_buf(&vb2_dst->vb2_buf); - luma_addr = hantro_get_dec_buf_addr(ctx, &dst->base.vb.vb2_buf); - if (!luma_addr) - return -ENOMEM; - - if (hantro_hevc_add_ref_buf(ctx, decode_params->pic_order_cnt_val, luma_addr)) - return -EINVAL; - - chroma_addr = luma_addr + cr_offset; - mv_addr = luma_addr + mv_offset; - - hantro_write_addr(vpu, G2_REF_LUMA_ADDR(i), luma_addr); - hantro_write_addr(vpu, G2_REF_CHROMA_ADDR(i), chroma_addr); - hantro_write_addr(vpu, G2_REF_MV_ADDR(i++), mv_addr); - - hantro_write_addr(vpu, G2_OUT_LUMA_ADDR, luma_addr); - hantro_write_addr(vpu, G2_OUT_CHROMA_ADDR, chroma_addr); - hantro_write_addr(vpu, G2_OUT_MV_ADDR, mv_addr); - - for (; i < V4L2_HEVC_DPB_ENTRIES_NUM_MAX; i++) { - hantro_write_addr(vpu, G2_REF_LUMA_ADDR(i), 0); - hantro_write_addr(vpu, G2_REF_CHROMA_ADDR(i), 0); - hantro_write_addr(vpu, G2_REF_MV_ADDR(i), 0); - } - - hantro_reg_write(vpu, &g2_refer_lterm_e, dpb_longterm_e); - - return 0; -} - -static void set_buffers(struct hantro_ctx *ctx) -{ - struct vb2_v4l2_buffer *src_buf; - struct hantro_dev *vpu = ctx->dev; - dma_addr_t src_dma; - u32 src_len, src_buf_len; - - src_buf = hantro_get_src_buf(ctx); - - /* Source (stream) buffer. */ - src_dma = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0); - src_len = vb2_get_plane_payload(&src_buf->vb2_buf, 0); - src_buf_len = vb2_plane_size(&src_buf->vb2_buf, 0); - - hantro_write_addr(vpu, G2_STREAM_ADDR, src_dma); - hantro_reg_write(vpu, &g2_stream_len, src_len); - hantro_reg_write(vpu, &g2_strm_buffer_len, src_buf_len); - hantro_reg_write(vpu, &g2_strm_start_offset, 0); - hantro_reg_write(vpu, &g2_write_mvs_e, 1); - - hantro_write_addr(vpu, G2_TILE_SIZES_ADDR, ctx->hevc_dec.tile_sizes.dma); - hantro_write_addr(vpu, G2_TILE_FILTER_ADDR, ctx->hevc_dec.tile_filter.dma); - hantro_write_addr(vpu, G2_TILE_SAO_ADDR, ctx->hevc_dec.tile_sao.dma); - hantro_write_addr(vpu, G2_TILE_BSD_ADDR, ctx->hevc_dec.tile_bsd.dma); -} - -static void prepare_scaling_list_buffer(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - const struct hantro_hevc_dec_ctrls *ctrls = &ctx->hevc_dec.ctrls; - const struct v4l2_ctrl_hevc_scaling_matrix *sc = ctrls->scaling; - const struct v4l2_ctrl_hevc_sps *sps = ctrls->sps; - u8 *p = ((u8 *)ctx->hevc_dec.scaling_lists.cpu); - unsigned int scaling_list_enabled; - unsigned int i, j, k; - - scaling_list_enabled = !!(sps->flags & V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED); - hantro_reg_write(vpu, &g2_scaling_list_e, scaling_list_enabled); - - if (!scaling_list_enabled) - return; - - for (i = 0; i < ARRAY_SIZE(sc->scaling_list_dc_coef_16x16); i++) - *p++ = sc->scaling_list_dc_coef_16x16[i]; - - for (i = 0; i < ARRAY_SIZE(sc->scaling_list_dc_coef_32x32); i++) - *p++ = sc->scaling_list_dc_coef_32x32[i]; - - /* 128-bit boundary */ - p += 8; - - /* write scaling lists column by column */ - - for (i = 0; i < 6; i++) - for (j = 0; j < 4; j++) - for (k = 0; k < 4; k++) - *p++ = sc->scaling_list_4x4[i][4 * k + j]; - - for (i = 0; i < 6; i++) - for (j = 0; j < 8; j++) - for (k = 0; k < 8; k++) - *p++ = sc->scaling_list_8x8[i][8 * k + j]; - - for (i = 0; i < 6; i++) - for (j = 0; j < 8; j++) - for (k = 0; k < 8; k++) - *p++ = sc->scaling_list_16x16[i][8 * k + j]; - - for (i = 0; i < 2; i++) - for (j = 0; j < 8; j++) - for (k = 0; k < 8; k++) - *p++ = sc->scaling_list_32x32[i][8 * k + j]; - - hantro_write_addr(vpu, G2_HEVC_SCALING_LIST_ADDR, ctx->hevc_dec.scaling_lists.dma); -} - -int hantro_g2_hevc_dec_run(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - int ret; - - hantro_g2_check_idle(vpu); - - /* Prepare HEVC decoder context. */ - ret = hantro_hevc_dec_prepare_run(ctx); - if (ret) - return ret; - - /* Configure hardware registers. */ - set_params(ctx); - - /* set reference pictures */ - ret = set_ref(ctx); - if (ret) - return ret; - - set_buffers(ctx); - prepare_tile_info_buffer(ctx); - - prepare_scaling_list_buffer(ctx); - - hantro_end_prepare_run(ctx); - - hantro_reg_write(vpu, &g2_mode, HEVC_DEC_MODE); - hantro_reg_write(vpu, &g2_clk_gate_e, 1); - - /* Don't disable output */ - hantro_reg_write(vpu, &g2_out_dis, 0); - - /* Don't compress buffers */ - hantro_reg_write(vpu, &g2_ref_compress_bypass, 1); - - /* Bus width and max burst */ - hantro_reg_write(vpu, &g2_buswidth, BUS_WIDTH_128); - hantro_reg_write(vpu, &g2_max_burst, 16); - - /* Swap */ - hantro_reg_write(vpu, &g2_strm_swap, 0xf); - hantro_reg_write(vpu, &g2_dirmv_swap, 0xf); - hantro_reg_write(vpu, &g2_compress_swap, 0xf); - - /* Start decoding! */ - vdpu_write(vpu, G2_REG_INTERRUPT_DEC_E, G2_REG_INTERRUPT); - - return 0; -} diff --git a/drivers/staging/media/hantro/hantro_g2_regs.h b/drivers/staging/media/hantro/hantro_g2_regs.h deleted file mode 100644 index 82606783591a..000000000000 --- a/drivers/staging/media/hantro/hantro_g2_regs.h +++ /dev/null @@ -1,325 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2021, Collabora - * - * Author: Benjamin Gaignard <benjamin.gaignard@collabora.com> - */ - -#ifndef HANTRO_G2_REGS_H_ -#define HANTRO_G2_REGS_H_ - -#include "hantro.h" - -#define G2_SWREG(nr) ((nr) * 4) - -#define G2_DEC_REG(b, s, m) \ - ((const struct hantro_reg) { \ - .base = G2_SWREG(b), \ - .shift = s, \ - .mask = m, \ - }) - -#define G2_REG_VERSION G2_SWREG(0) - -#define G2_REG_INTERRUPT G2_SWREG(1) -#define G2_REG_INTERRUPT_DEC_RDY_INT BIT(12) -#define G2_REG_INTERRUPT_DEC_ABORT_E BIT(5) -#define G2_REG_INTERRUPT_DEC_IRQ_DIS BIT(4) -#define G2_REG_INTERRUPT_DEC_E BIT(0) - -#define HEVC_DEC_MODE 0xc -#define VP9_DEC_MODE 0xd - -#define BUS_WIDTH_32 0 -#define BUS_WIDTH_64 1 -#define BUS_WIDTH_128 2 -#define BUS_WIDTH_256 3 - -#define g2_strm_swap G2_DEC_REG(2, 28, 0xf) -#define g2_strm_swap_old G2_DEC_REG(2, 27, 0x1f) -#define g2_pic_swap G2_DEC_REG(2, 22, 0x1f) -#define g2_dirmv_swap G2_DEC_REG(2, 20, 0xf) -#define g2_dirmv_swap_old G2_DEC_REG(2, 17, 0x1f) -#define g2_tab0_swap_old G2_DEC_REG(2, 12, 0x1f) -#define g2_tab1_swap_old G2_DEC_REG(2, 7, 0x1f) -#define g2_tab2_swap_old G2_DEC_REG(2, 2, 0x1f) - -#define g2_mode G2_DEC_REG(3, 27, 0x1f) -#define g2_compress_swap G2_DEC_REG(3, 20, 0xf) -#define g2_ref_compress_bypass G2_DEC_REG(3, 17, 0x1) -#define g2_out_rs_e G2_DEC_REG(3, 16, 0x1) -#define g2_out_dis G2_DEC_REG(3, 15, 0x1) -#define g2_out_filtering_dis G2_DEC_REG(3, 14, 0x1) -#define g2_write_mvs_e G2_DEC_REG(3, 12, 0x1) -#define g2_tab3_swap_old G2_DEC_REG(3, 7, 0x1f) -#define g2_rscan_swap G2_DEC_REG(3, 2, 0x1f) - -#define g2_pic_width_in_cbs G2_DEC_REG(4, 19, 0x1fff) -#define g2_pic_height_in_cbs G2_DEC_REG(4, 6, 0x1fff) -#define g2_num_ref_frames G2_DEC_REG(4, 0, 0x1f) - -#define g2_start_bit G2_DEC_REG(5, 25, 0x7f) -#define g2_scaling_list_e G2_DEC_REG(5, 24, 0x1) -#define g2_cb_qp_offset G2_DEC_REG(5, 19, 0x1f) -#define g2_cr_qp_offset G2_DEC_REG(5, 14, 0x1f) -#define g2_sign_data_hide G2_DEC_REG(5, 12, 0x1) -#define g2_tempor_mvp_e G2_DEC_REG(5, 11, 0x1) -#define g2_max_cu_qpd_depth G2_DEC_REG(5, 5, 0x3f) -#define g2_cu_qpd_e G2_DEC_REG(5, 4, 0x1) -#define g2_pix_shift G2_DEC_REG(5, 0, 0xf) - -#define g2_stream_len G2_DEC_REG(6, 0, 0xffffffff) - -#define g2_cabac_init_present G2_DEC_REG(7, 31, 0x1) -#define g2_weight_pred_e G2_DEC_REG(7, 28, 0x1) -#define g2_weight_bipr_idc G2_DEC_REG(7, 26, 0x3) -#define g2_filter_over_slices G2_DEC_REG(7, 25, 0x1) -#define g2_filter_over_tiles G2_DEC_REG(7, 24, 0x1) -#define g2_asym_pred_e G2_DEC_REG(7, 23, 0x1) -#define g2_sao_e G2_DEC_REG(7, 22, 0x1) -#define g2_pcm_filt_d G2_DEC_REG(7, 21, 0x1) -#define g2_slice_chqp_present G2_DEC_REG(7, 20, 0x1) -#define g2_dependent_slice G2_DEC_REG(7, 19, 0x1) -#define g2_filter_override G2_DEC_REG(7, 18, 0x1) -#define g2_strong_smooth_e G2_DEC_REG(7, 17, 0x1) -#define g2_filt_offset_beta G2_DEC_REG(7, 12, 0x1f) -#define g2_filt_offset_tc G2_DEC_REG(7, 7, 0x1f) -#define g2_slice_hdr_ext_e G2_DEC_REG(7, 6, 0x1) -#define g2_slice_hdr_ext_bits G2_DEC_REG(7, 3, 0x7) - -#define g2_const_intra_e G2_DEC_REG(8, 31, 0x1) -#define g2_filt_ctrl_pres G2_DEC_REG(8, 30, 0x1) -#define g2_bit_depth_y G2_DEC_REG(8, 21, 0xf) -#define g2_bit_depth_c G2_DEC_REG(8, 17, 0xf) -#define g2_idr_pic_e G2_DEC_REG(8, 16, 0x1) -#define g2_bit_depth_pcm_y G2_DEC_REG(8, 12, 0xf) -#define g2_bit_depth_pcm_c G2_DEC_REG(8, 8, 0xf) -#define g2_bit_depth_y_minus8 G2_DEC_REG(8, 6, 0x3) -#define g2_bit_depth_c_minus8 G2_DEC_REG(8, 4, 0x3) -#define g2_rs_out_bit_depth G2_DEC_REG(8, 4, 0xf) -#define g2_output_8_bits G2_DEC_REG(8, 3, 0x1) -#define g2_output_format G2_DEC_REG(8, 0, 0x7) -#define g2_pp_pix_shift G2_DEC_REG(8, 0, 0xf) - -#define g2_refidx1_active G2_DEC_REG(9, 19, 0x1f) -#define g2_refidx0_active G2_DEC_REG(9, 14, 0x1f) -#define g2_hdr_skip_length G2_DEC_REG(9, 0, 0x3fff) - -#define g2_start_code_e G2_DEC_REG(10, 31, 0x1) -#define g2_init_qp_old G2_DEC_REG(10, 25, 0x3f) -#define g2_init_qp G2_DEC_REG(10, 24, 0x7f) -#define g2_num_tile_cols_old G2_DEC_REG(10, 20, 0x1f) -#define g2_num_tile_cols G2_DEC_REG(10, 19, 0x1f) -#define g2_num_tile_rows_old G2_DEC_REG(10, 15, 0x1f) -#define g2_num_tile_rows G2_DEC_REG(10, 14, 0x1f) -#define g2_tile_e G2_DEC_REG(10, 1, 0x1) -#define g2_entropy_sync_e G2_DEC_REG(10, 0, 0x1) - -#define vp9_transform_mode G2_DEC_REG(11, 27, 0x7) -#define vp9_filt_sharpness G2_DEC_REG(11, 21, 0x7) -#define vp9_mcomp_filt_type G2_DEC_REG(11, 8, 0x7) -#define vp9_high_prec_mv_e G2_DEC_REG(11, 7, 0x1) -#define vp9_comp_pred_mode G2_DEC_REG(11, 4, 0x3) -#define vp9_gref_sign_bias G2_DEC_REG(11, 2, 0x1) -#define vp9_aref_sign_bias G2_DEC_REG(11, 0, 0x1) - -#define g2_refer_lterm_e G2_DEC_REG(12, 16, 0xffff) -#define g2_min_cb_size G2_DEC_REG(12, 13, 0x7) -#define g2_max_cb_size G2_DEC_REG(12, 10, 0x7) -#define g2_min_pcm_size G2_DEC_REG(12, 7, 0x7) -#define g2_max_pcm_size G2_DEC_REG(12, 4, 0x7) -#define g2_pcm_e G2_DEC_REG(12, 3, 0x1) -#define g2_transform_skip G2_DEC_REG(12, 2, 0x1) -#define g2_transq_bypass G2_DEC_REG(12, 1, 0x1) -#define g2_list_mod_e G2_DEC_REG(12, 0, 0x1) - -#define hevc_min_trb_size G2_DEC_REG(13, 13, 0x7) -#define hevc_max_trb_size G2_DEC_REG(13, 10, 0x7) -#define hevc_max_intra_hierdepth G2_DEC_REG(13, 7, 0x7) -#define hevc_max_inter_hierdepth G2_DEC_REG(13, 4, 0x7) -#define hevc_parallel_merge G2_DEC_REG(13, 0, 0xf) - -#define hevc_rlist_f0 G2_DEC_REG(14, 0, 0x1f) -#define hevc_rlist_f1 G2_DEC_REG(14, 10, 0x1f) -#define hevc_rlist_f2 G2_DEC_REG(14, 20, 0x1f) -#define hevc_rlist_b0 G2_DEC_REG(14, 5, 0x1f) -#define hevc_rlist_b1 G2_DEC_REG(14, 15, 0x1f) -#define hevc_rlist_b2 G2_DEC_REG(14, 25, 0x1f) - -#define hevc_rlist_f3 G2_DEC_REG(15, 0, 0x1f) -#define hevc_rlist_f4 G2_DEC_REG(15, 10, 0x1f) -#define hevc_rlist_f5 G2_DEC_REG(15, 20, 0x1f) -#define hevc_rlist_b3 G2_DEC_REG(15, 5, 0x1f) -#define hevc_rlist_b4 G2_DEC_REG(15, 15, 0x1f) -#define hevc_rlist_b5 G2_DEC_REG(15, 25, 0x1f) - -#define hevc_rlist_f6 G2_DEC_REG(16, 0, 0x1f) -#define hevc_rlist_f7 G2_DEC_REG(16, 10, 0x1f) -#define hevc_rlist_f8 G2_DEC_REG(16, 20, 0x1f) -#define hevc_rlist_b6 G2_DEC_REG(16, 5, 0x1f) -#define hevc_rlist_b7 G2_DEC_REG(16, 15, 0x1f) -#define hevc_rlist_b8 G2_DEC_REG(16, 25, 0x1f) - -#define hevc_rlist_f9 G2_DEC_REG(17, 0, 0x1f) -#define hevc_rlist_f10 G2_DEC_REG(17, 10, 0x1f) -#define hevc_rlist_f11 G2_DEC_REG(17, 20, 0x1f) -#define hevc_rlist_b9 G2_DEC_REG(17, 5, 0x1f) -#define hevc_rlist_b10 G2_DEC_REG(17, 15, 0x1f) -#define hevc_rlist_b11 G2_DEC_REG(17, 25, 0x1f) - -#define hevc_rlist_f12 G2_DEC_REG(18, 0, 0x1f) -#define hevc_rlist_f13 G2_DEC_REG(18, 10, 0x1f) -#define hevc_rlist_f14 G2_DEC_REG(18, 20, 0x1f) -#define hevc_rlist_b12 G2_DEC_REG(18, 5, 0x1f) -#define hevc_rlist_b13 G2_DEC_REG(18, 15, 0x1f) -#define hevc_rlist_b14 G2_DEC_REG(18, 25, 0x1f) - -#define hevc_rlist_f15 G2_DEC_REG(19, 0, 0x1f) -#define hevc_rlist_b15 G2_DEC_REG(19, 5, 0x1f) - -#define g2_partial_ctb_x G2_DEC_REG(20, 31, 0x1) -#define g2_partial_ctb_y G2_DEC_REG(20, 30, 0x1) -#define g2_pic_width_4x4 G2_DEC_REG(20, 16, 0xfff) -#define g2_pic_height_4x4 G2_DEC_REG(20, 0, 0xfff) - -#define vp9_qp_delta_y_dc G2_DEC_REG(13, 23, 0x3f) -#define vp9_qp_delta_ch_dc G2_DEC_REG(13, 17, 0x3f) -#define vp9_qp_delta_ch_ac G2_DEC_REG(13, 11, 0x3f) -#define vp9_last_sign_bias G2_DEC_REG(13, 10, 0x1) -#define vp9_lossless_e G2_DEC_REG(13, 9, 0x1) -#define vp9_comp_pred_var_ref1 G2_DEC_REG(13, 7, 0x3) -#define vp9_comp_pred_var_ref0 G2_DEC_REG(13, 5, 0x3) -#define vp9_comp_pred_fixed_ref G2_DEC_REG(13, 3, 0x3) -#define vp9_segment_temp_upd_e G2_DEC_REG(13, 2, 0x1) -#define vp9_segment_upd_e G2_DEC_REG(13, 1, 0x1) -#define vp9_segment_e G2_DEC_REG(13, 0, 0x1) - -#define vp9_filt_level G2_DEC_REG(14, 18, 0x3f) -#define vp9_refpic_seg0 G2_DEC_REG(14, 15, 0x7) -#define vp9_skip_seg0 G2_DEC_REG(14, 14, 0x1) -#define vp9_filt_level_seg0 G2_DEC_REG(14, 8, 0x3f) -#define vp9_quant_seg0 G2_DEC_REG(14, 0, 0xff) - -#define vp9_refpic_seg1 G2_DEC_REG(15, 15, 0x7) -#define vp9_skip_seg1 G2_DEC_REG(15, 14, 0x1) -#define vp9_filt_level_seg1 G2_DEC_REG(15, 8, 0x3f) -#define vp9_quant_seg1 G2_DEC_REG(15, 0, 0xff) - -#define vp9_refpic_seg2 G2_DEC_REG(16, 15, 0x7) -#define vp9_skip_seg2 G2_DEC_REG(16, 14, 0x1) -#define vp9_filt_level_seg2 G2_DEC_REG(16, 8, 0x3f) -#define vp9_quant_seg2 G2_DEC_REG(16, 0, 0xff) - -#define vp9_refpic_seg3 G2_DEC_REG(17, 15, 0x7) -#define vp9_skip_seg3 G2_DEC_REG(17, 14, 0x1) -#define vp9_filt_level_seg3 G2_DEC_REG(17, 8, 0x3f) -#define vp9_quant_seg3 G2_DEC_REG(17, 0, 0xff) - -#define vp9_refpic_seg4 G2_DEC_REG(18, 15, 0x7) -#define vp9_skip_seg4 G2_DEC_REG(18, 14, 0x1) -#define vp9_filt_level_seg4 G2_DEC_REG(18, 8, 0x3f) -#define vp9_quant_seg4 G2_DEC_REG(18, 0, 0xff) - -#define vp9_refpic_seg5 G2_DEC_REG(19, 15, 0x7) -#define vp9_skip_seg5 G2_DEC_REG(19, 14, 0x1) -#define vp9_filt_level_seg5 G2_DEC_REG(19, 8, 0x3f) -#define vp9_quant_seg5 G2_DEC_REG(19, 0, 0xff) - -#define hevc_cur_poc_00 G2_DEC_REG(46, 24, 0xff) -#define hevc_cur_poc_01 G2_DEC_REG(46, 16, 0xff) -#define hevc_cur_poc_02 G2_DEC_REG(46, 8, 0xff) -#define hevc_cur_poc_03 G2_DEC_REG(46, 0, 0xff) - -#define hevc_cur_poc_04 G2_DEC_REG(47, 24, 0xff) -#define hevc_cur_poc_05 G2_DEC_REG(47, 16, 0xff) -#define hevc_cur_poc_06 G2_DEC_REG(47, 8, 0xff) -#define hevc_cur_poc_07 G2_DEC_REG(47, 0, 0xff) - -#define hevc_cur_poc_08 G2_DEC_REG(48, 24, 0xff) -#define hevc_cur_poc_09 G2_DEC_REG(48, 16, 0xff) -#define hevc_cur_poc_10 G2_DEC_REG(48, 8, 0xff) -#define hevc_cur_poc_11 G2_DEC_REG(48, 0, 0xff) - -#define hevc_cur_poc_12 G2_DEC_REG(49, 24, 0xff) -#define hevc_cur_poc_13 G2_DEC_REG(49, 16, 0xff) -#define hevc_cur_poc_14 G2_DEC_REG(49, 8, 0xff) -#define hevc_cur_poc_15 G2_DEC_REG(49, 0, 0xff) - -#define vp9_refpic_seg6 G2_DEC_REG(31, 15, 0x7) -#define vp9_skip_seg6 G2_DEC_REG(31, 14, 0x1) -#define vp9_filt_level_seg6 G2_DEC_REG(31, 8, 0x3f) -#define vp9_quant_seg6 G2_DEC_REG(31, 0, 0xff) - -#define vp9_refpic_seg7 G2_DEC_REG(32, 15, 0x7) -#define vp9_skip_seg7 G2_DEC_REG(32, 14, 0x1) -#define vp9_filt_level_seg7 G2_DEC_REG(32, 8, 0x3f) -#define vp9_quant_seg7 G2_DEC_REG(32, 0, 0xff) - -#define vp9_lref_width G2_DEC_REG(33, 16, 0xffff) -#define vp9_lref_height G2_DEC_REG(33, 0, 0xffff) - -#define vp9_gref_width G2_DEC_REG(34, 16, 0xffff) -#define vp9_gref_height G2_DEC_REG(34, 0, 0xffff) - -#define vp9_aref_width G2_DEC_REG(35, 16, 0xffff) -#define vp9_aref_height G2_DEC_REG(35, 0, 0xffff) - -#define vp9_lref_hor_scale G2_DEC_REG(36, 16, 0xffff) -#define vp9_lref_ver_scale G2_DEC_REG(36, 0, 0xffff) - -#define vp9_gref_hor_scale G2_DEC_REG(37, 16, 0xffff) -#define vp9_gref_ver_scale G2_DEC_REG(37, 0, 0xffff) - -#define vp9_aref_hor_scale G2_DEC_REG(38, 16, 0xffff) -#define vp9_aref_ver_scale G2_DEC_REG(38, 0, 0xffff) - -#define vp9_filt_ref_adj_0 G2_DEC_REG(46, 24, 0x7f) -#define vp9_filt_ref_adj_1 G2_DEC_REG(46, 16, 0x7f) -#define vp9_filt_ref_adj_2 G2_DEC_REG(46, 8, 0x7f) -#define vp9_filt_ref_adj_3 G2_DEC_REG(46, 0, 0x7f) - -#define vp9_filt_mb_adj_0 G2_DEC_REG(47, 24, 0x7f) -#define vp9_filt_mb_adj_1 G2_DEC_REG(47, 16, 0x7f) -#define vp9_filt_mb_adj_2 G2_DEC_REG(47, 8, 0x7f) -#define vp9_filt_mb_adj_3 G2_DEC_REG(47, 0, 0x7f) - -#define g2_apf_threshold G2_DEC_REG(55, 0, 0xffff) - -#define g2_clk_gate_e G2_DEC_REG(58, 16, 0x1) -#define g2_double_buffer_e G2_DEC_REG(58, 15, 0x1) -#define g2_buswidth G2_DEC_REG(58, 8, 0x7) -#define g2_max_burst G2_DEC_REG(58, 0, 0xff) - -#define g2_down_scale_e G2_DEC_REG(184, 7, 0x1) -#define g2_down_scale_y G2_DEC_REG(184, 2, 0x3) -#define g2_down_scale_x G2_DEC_REG(184, 0, 0x3) - -#define G2_REG_CONFIG G2_SWREG(58) -#define G2_REG_CONFIG_DEC_CLK_GATE_E BIT(16) -#define G2_REG_CONFIG_DEC_CLK_GATE_IDLE_E BIT(17) - -#define G2_OUT_LUMA_ADDR (G2_SWREG(65)) -#define G2_REF_LUMA_ADDR(i) (G2_SWREG(67) + ((i) * 0x8)) -#define G2_VP9_SEGMENT_WRITE_ADDR (G2_SWREG(79)) -#define G2_VP9_SEGMENT_READ_ADDR (G2_SWREG(81)) -#define G2_OUT_CHROMA_ADDR (G2_SWREG(99)) -#define G2_REF_CHROMA_ADDR(i) (G2_SWREG(101) + ((i) * 0x8)) -#define G2_OUT_MV_ADDR (G2_SWREG(133)) -#define G2_REF_MV_ADDR(i) (G2_SWREG(135) + ((i) * 0x8)) -#define G2_TILE_SIZES_ADDR (G2_SWREG(167)) -#define G2_STREAM_ADDR (G2_SWREG(169)) -#define G2_HEVC_SCALING_LIST_ADDR (G2_SWREG(171)) -#define G2_VP9_CTX_COUNT_ADDR (G2_SWREG(171)) -#define G2_VP9_PROBS_ADDR (G2_SWREG(173)) -#define G2_RS_OUT_LUMA_ADDR (G2_SWREG(175)) -#define G2_RS_OUT_CHROMA_ADDR (G2_SWREG(177)) -#define G2_TILE_FILTER_ADDR (G2_SWREG(179)) -#define G2_TILE_SAO_ADDR (G2_SWREG(181)) -#define G2_TILE_BSD_ADDR (G2_SWREG(183)) -#define G2_DS_DST (G2_SWREG(186)) -#define G2_DS_DST_CHR (G2_SWREG(188)) - -#define g2_strm_buffer_len G2_DEC_REG(258, 0, 0xffffffff) -#define g2_strm_start_offset G2_DEC_REG(259, 0, 0xffffffff) - -#endif diff --git a/drivers/staging/media/hantro/hantro_g2_vp9_dec.c b/drivers/staging/media/hantro/hantro_g2_vp9_dec.c deleted file mode 100644 index 6fc4b555517f..000000000000 --- a/drivers/staging/media/hantro/hantro_g2_vp9_dec.c +++ /dev/null @@ -1,1014 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Hantro VP9 codec driver - * - * Copyright (C) 2021 Collabora Ltd. - */ -#include "media/videobuf2-core.h" -#include "media/videobuf2-dma-contig.h" -#include "media/videobuf2-v4l2.h" -#include <linux/kernel.h> -#include <linux/vmalloc.h> -#include <media/v4l2-mem2mem.h> -#include <media/v4l2-vp9.h> - -#include "hantro.h" -#include "hantro_vp9.h" -#include "hantro_g2_regs.h" - -#define G2_ALIGN 16 - -enum hantro_ref_frames { - INTRA_FRAME = 0, - LAST_FRAME = 1, - GOLDEN_FRAME = 2, - ALTREF_FRAME = 3, - MAX_REF_FRAMES = 4 -}; - -static int start_prepare_run(struct hantro_ctx *ctx, const struct v4l2_ctrl_vp9_frame **dec_params) -{ - const struct v4l2_ctrl_vp9_compressed_hdr *prob_updates; - struct hantro_vp9_dec_hw_ctx *vp9_ctx = &ctx->vp9_dec; - struct v4l2_ctrl *ctrl; - unsigned int fctx_idx; - - /* v4l2-specific stuff */ - hantro_start_prepare_run(ctx); - - ctrl = v4l2_ctrl_find(&ctx->ctrl_handler, V4L2_CID_STATELESS_VP9_FRAME); - if (WARN_ON(!ctrl)) - return -EINVAL; - *dec_params = ctrl->p_cur.p; - - ctrl = v4l2_ctrl_find(&ctx->ctrl_handler, V4L2_CID_STATELESS_VP9_COMPRESSED_HDR); - if (WARN_ON(!ctrl)) - return -EINVAL; - prob_updates = ctrl->p_cur.p; - vp9_ctx->cur.tx_mode = prob_updates->tx_mode; - - /* - * vp9 stuff - * - * by this point the userspace has done all parts of 6.2 uncompressed_header() - * except this fragment: - * if ( FrameIsIntra || error_resilient_mode ) { - * setup_past_independence ( ) - * if ( frame_type == KEY_FRAME || error_resilient_mode == 1 || - * reset_frame_context == 3 ) { - * for ( i = 0; i < 4; i ++ ) { - * save_probs( i ) - * } - * } else if ( reset_frame_context == 2 ) { - * save_probs( frame_context_idx ) - * } - * frame_context_idx = 0 - * } - */ - fctx_idx = v4l2_vp9_reset_frame_ctx(*dec_params, vp9_ctx->frame_context); - vp9_ctx->cur.frame_context_idx = fctx_idx; - - /* 6.1 frame(sz): load_probs() and load_probs2() */ - vp9_ctx->probability_tables = vp9_ctx->frame_context[fctx_idx]; - - /* - * The userspace has also performed 6.3 compressed_header(), but handling the - * probs in a special way. All probs which need updating, except MV-related, - * have been read from the bitstream and translated through inv_map_table[], - * but no 6.3.6 inv_recenter_nonneg(v, m) has been performed. The values passed - * by userspace are either translated values (there are no 0 values in - * inv_map_table[]), or zero to indicate no update. All MV-related probs which need - * updating have been read from the bitstream and (mv_prob << 1) | 1 has been - * performed. The values passed by userspace are either new values - * to replace old ones (the above mentioned shift and bitwise or never result in - * a zero) or zero to indicate no update. - * fw_update_probs() performs actual probs updates or leaves probs as-is - * for values for which a zero was passed from userspace. - */ - v4l2_vp9_fw_update_probs(&vp9_ctx->probability_tables, prob_updates, *dec_params); - - return 0; -} - -static size_t chroma_offset(const struct hantro_ctx *ctx, - const struct v4l2_ctrl_vp9_frame *dec_params) -{ - int bytes_per_pixel = dec_params->bit_depth == 8 ? 1 : 2; - - return ctx->src_fmt.width * ctx->src_fmt.height * bytes_per_pixel; -} - -static size_t mv_offset(const struct hantro_ctx *ctx, - const struct v4l2_ctrl_vp9_frame *dec_params) -{ - size_t cr_offset = chroma_offset(ctx, dec_params); - - return ALIGN((cr_offset * 3) / 2, G2_ALIGN); -} - -static struct hantro_decoded_buffer * -get_ref_buf(struct hantro_ctx *ctx, struct vb2_v4l2_buffer *dst, u64 timestamp) -{ - struct v4l2_m2m_ctx *m2m_ctx = ctx->fh.m2m_ctx; - struct vb2_queue *cap_q = &m2m_ctx->cap_q_ctx.q; - struct vb2_buffer *buf; - - /* - * If a ref is unused or invalid, address of current destination - * buffer is returned. - */ - buf = vb2_find_buffer(cap_q, timestamp); - if (!buf) - buf = &dst->vb2_buf; - - return vb2_to_hantro_decoded_buf(buf); -} - -static void update_dec_buf_info(struct hantro_decoded_buffer *buf, - const struct v4l2_ctrl_vp9_frame *dec_params) -{ - buf->vp9.width = dec_params->frame_width_minus_1 + 1; - buf->vp9.height = dec_params->frame_height_minus_1 + 1; - buf->vp9.bit_depth = dec_params->bit_depth; -} - -static void update_ctx_cur_info(struct hantro_vp9_dec_hw_ctx *vp9_ctx, - struct hantro_decoded_buffer *buf, - const struct v4l2_ctrl_vp9_frame *dec_params) -{ - vp9_ctx->cur.valid = true; - vp9_ctx->cur.reference_mode = dec_params->reference_mode; - vp9_ctx->cur.interpolation_filter = dec_params->interpolation_filter; - vp9_ctx->cur.flags = dec_params->flags; - vp9_ctx->cur.timestamp = buf->base.vb.vb2_buf.timestamp; -} - -static void config_output(struct hantro_ctx *ctx, - struct hantro_decoded_buffer *dst, - const struct v4l2_ctrl_vp9_frame *dec_params) -{ - dma_addr_t luma_addr, chroma_addr, mv_addr; - - hantro_reg_write(ctx->dev, &g2_out_dis, 0); - if (!ctx->dev->variant->legacy_regs) - hantro_reg_write(ctx->dev, &g2_output_format, 0); - - luma_addr = hantro_get_dec_buf_addr(ctx, &dst->base.vb.vb2_buf); - hantro_write_addr(ctx->dev, G2_OUT_LUMA_ADDR, luma_addr); - - chroma_addr = luma_addr + chroma_offset(ctx, dec_params); - hantro_write_addr(ctx->dev, G2_OUT_CHROMA_ADDR, chroma_addr); - - mv_addr = luma_addr + mv_offset(ctx, dec_params); - hantro_write_addr(ctx->dev, G2_OUT_MV_ADDR, mv_addr); -} - -struct hantro_vp9_ref_reg { - const struct hantro_reg width; - const struct hantro_reg height; - const struct hantro_reg hor_scale; - const struct hantro_reg ver_scale; - u32 y_base; - u32 c_base; -}; - -static void config_ref(struct hantro_ctx *ctx, - struct hantro_decoded_buffer *dst, - const struct hantro_vp9_ref_reg *ref_reg, - const struct v4l2_ctrl_vp9_frame *dec_params, - u64 ref_ts) -{ - struct hantro_decoded_buffer *buf; - dma_addr_t luma_addr, chroma_addr; - u32 refw, refh; - - buf = get_ref_buf(ctx, &dst->base.vb, ref_ts); - refw = buf->vp9.width; - refh = buf->vp9.height; - - hantro_reg_write(ctx->dev, &ref_reg->width, refw); - hantro_reg_write(ctx->dev, &ref_reg->height, refh); - - hantro_reg_write(ctx->dev, &ref_reg->hor_scale, (refw << 14) / dst->vp9.width); - hantro_reg_write(ctx->dev, &ref_reg->ver_scale, (refh << 14) / dst->vp9.height); - - luma_addr = hantro_get_dec_buf_addr(ctx, &buf->base.vb.vb2_buf); - hantro_write_addr(ctx->dev, ref_reg->y_base, luma_addr); - - chroma_addr = luma_addr + chroma_offset(ctx, dec_params); - hantro_write_addr(ctx->dev, ref_reg->c_base, chroma_addr); -} - -static void config_ref_registers(struct hantro_ctx *ctx, - const struct v4l2_ctrl_vp9_frame *dec_params, - struct hantro_decoded_buffer *dst, - struct hantro_decoded_buffer *mv_ref) -{ - static const struct hantro_vp9_ref_reg ref_regs[] = { - { - /* Last */ - .width = vp9_lref_width, - .height = vp9_lref_height, - .hor_scale = vp9_lref_hor_scale, - .ver_scale = vp9_lref_ver_scale, - .y_base = G2_REF_LUMA_ADDR(0), - .c_base = G2_REF_CHROMA_ADDR(0), - }, { - /* Golden */ - .width = vp9_gref_width, - .height = vp9_gref_height, - .hor_scale = vp9_gref_hor_scale, - .ver_scale = vp9_gref_ver_scale, - .y_base = G2_REF_LUMA_ADDR(4), - .c_base = G2_REF_CHROMA_ADDR(4), - }, { - /* Altref */ - .width = vp9_aref_width, - .height = vp9_aref_height, - .hor_scale = vp9_aref_hor_scale, - .ver_scale = vp9_aref_ver_scale, - .y_base = G2_REF_LUMA_ADDR(5), - .c_base = G2_REF_CHROMA_ADDR(5), - }, - }; - dma_addr_t mv_addr; - - config_ref(ctx, dst, &ref_regs[0], dec_params, dec_params->last_frame_ts); - config_ref(ctx, dst, &ref_regs[1], dec_params, dec_params->golden_frame_ts); - config_ref(ctx, dst, &ref_regs[2], dec_params, dec_params->alt_frame_ts); - - mv_addr = hantro_get_dec_buf_addr(ctx, &mv_ref->base.vb.vb2_buf) + - mv_offset(ctx, dec_params); - hantro_write_addr(ctx->dev, G2_REF_MV_ADDR(0), mv_addr); - - hantro_reg_write(ctx->dev, &vp9_last_sign_bias, - dec_params->ref_frame_sign_bias & V4L2_VP9_SIGN_BIAS_LAST ? 1 : 0); - - hantro_reg_write(ctx->dev, &vp9_gref_sign_bias, - dec_params->ref_frame_sign_bias & V4L2_VP9_SIGN_BIAS_GOLDEN ? 1 : 0); - - hantro_reg_write(ctx->dev, &vp9_aref_sign_bias, - dec_params->ref_frame_sign_bias & V4L2_VP9_SIGN_BIAS_ALT ? 1 : 0); -} - -static void recompute_tile_info(unsigned short *tile_info, unsigned int tiles, unsigned int sbs) -{ - int i; - unsigned int accumulated = 0; - unsigned int next_accumulated; - - for (i = 1; i <= tiles; ++i) { - next_accumulated = i * sbs / tiles; - *tile_info++ = next_accumulated - accumulated; - accumulated = next_accumulated; - } -} - -static void -recompute_tile_rc_info(struct hantro_ctx *ctx, - unsigned int tile_r, unsigned int tile_c, - unsigned int sbs_r, unsigned int sbs_c) -{ - struct hantro_vp9_dec_hw_ctx *vp9_ctx = &ctx->vp9_dec; - - recompute_tile_info(vp9_ctx->tile_r_info, tile_r, sbs_r); - recompute_tile_info(vp9_ctx->tile_c_info, tile_c, sbs_c); - - vp9_ctx->last_tile_r = tile_r; - vp9_ctx->last_tile_c = tile_c; - vp9_ctx->last_sbs_r = sbs_r; - vp9_ctx->last_sbs_c = sbs_c; -} - -static inline unsigned int first_tile_row(unsigned int tile_r, unsigned int sbs_r) -{ - if (tile_r == sbs_r + 1) - return 1; - - if (tile_r == sbs_r + 2) - return 2; - - return 0; -} - -static void -fill_tile_info(struct hantro_ctx *ctx, - unsigned int tile_r, unsigned int tile_c, - unsigned int sbs_r, unsigned int sbs_c, - unsigned short *tile_mem) -{ - struct hantro_vp9_dec_hw_ctx *vp9_ctx = &ctx->vp9_dec; - unsigned int i, j; - bool first = true; - - for (i = first_tile_row(tile_r, sbs_r); i < tile_r; ++i) { - unsigned short r_info = vp9_ctx->tile_r_info[i]; - - if (first) { - if (i > 0) - r_info += vp9_ctx->tile_r_info[0]; - if (i == 2) - r_info += vp9_ctx->tile_r_info[1]; - first = false; - } - for (j = 0; j < tile_c; ++j) { - *tile_mem++ = vp9_ctx->tile_c_info[j]; - *tile_mem++ = r_info; - } - } -} - -static void -config_tiles(struct hantro_ctx *ctx, - const struct v4l2_ctrl_vp9_frame *dec_params, - struct hantro_decoded_buffer *dst) -{ - struct hantro_vp9_dec_hw_ctx *vp9_ctx = &ctx->vp9_dec; - struct hantro_aux_buf *misc = &vp9_ctx->misc; - struct hantro_aux_buf *tile_edge = &vp9_ctx->tile_edge; - dma_addr_t addr; - unsigned short *tile_mem; - unsigned int rows, cols; - - addr = misc->dma + vp9_ctx->tile_info_offset; - hantro_write_addr(ctx->dev, G2_TILE_SIZES_ADDR, addr); - - tile_mem = misc->cpu + vp9_ctx->tile_info_offset; - if (dec_params->tile_cols_log2 || dec_params->tile_rows_log2) { - unsigned int tile_r = (1 << dec_params->tile_rows_log2); - unsigned int tile_c = (1 << dec_params->tile_cols_log2); - unsigned int sbs_r = hantro_vp9_num_sbs(dst->vp9.height); - unsigned int sbs_c = hantro_vp9_num_sbs(dst->vp9.width); - - if (tile_r != vp9_ctx->last_tile_r || tile_c != vp9_ctx->last_tile_c || - sbs_r != vp9_ctx->last_sbs_r || sbs_c != vp9_ctx->last_sbs_c) - recompute_tile_rc_info(ctx, tile_r, tile_c, sbs_r, sbs_c); - - fill_tile_info(ctx, tile_r, tile_c, sbs_r, sbs_c, tile_mem); - - cols = tile_c; - rows = tile_r; - hantro_reg_write(ctx->dev, &g2_tile_e, 1); - } else { - tile_mem[0] = hantro_vp9_num_sbs(dst->vp9.width); - tile_mem[1] = hantro_vp9_num_sbs(dst->vp9.height); - - cols = 1; - rows = 1; - hantro_reg_write(ctx->dev, &g2_tile_e, 0); - } - - if (ctx->dev->variant->legacy_regs) { - hantro_reg_write(ctx->dev, &g2_num_tile_cols_old, cols); - hantro_reg_write(ctx->dev, &g2_num_tile_rows_old, rows); - } else { - hantro_reg_write(ctx->dev, &g2_num_tile_cols, cols); - hantro_reg_write(ctx->dev, &g2_num_tile_rows, rows); - } - - /* provide aux buffers even if no tiles are used */ - addr = tile_edge->dma; - hantro_write_addr(ctx->dev, G2_TILE_FILTER_ADDR, addr); - - addr = tile_edge->dma + vp9_ctx->bsd_ctrl_offset; - hantro_write_addr(ctx->dev, G2_TILE_BSD_ADDR, addr); -} - -static void -update_feat_and_flag(struct hantro_vp9_dec_hw_ctx *vp9_ctx, - const struct v4l2_vp9_segmentation *seg, - unsigned int feature, - unsigned int segid) -{ - u8 mask = V4L2_VP9_SEGMENT_FEATURE_ENABLED(feature); - - vp9_ctx->feature_data[segid][feature] = seg->feature_data[segid][feature]; - vp9_ctx->feature_enabled[segid] &= ~mask; - vp9_ctx->feature_enabled[segid] |= (seg->feature_enabled[segid] & mask); -} - -static inline s16 clip3(s16 x, s16 y, s16 z) -{ - return (z < x) ? x : (z > y) ? y : z; -} - -static s16 feat_val_clip3(s16 feat_val, s16 feature_data, bool absolute, u8 clip) -{ - if (absolute) - return feature_data; - - return clip3(0, 255, feat_val + feature_data); -} - -static void config_segment(struct hantro_ctx *ctx, const struct v4l2_ctrl_vp9_frame *dec_params) -{ - struct hantro_vp9_dec_hw_ctx *vp9_ctx = &ctx->vp9_dec; - const struct v4l2_vp9_segmentation *seg; - s16 feat_val; - unsigned char feat_id; - unsigned int segid; - bool segment_enabled, absolute, update_data; - - static const struct hantro_reg seg_regs[8][V4L2_VP9_SEG_LVL_MAX] = { - { vp9_quant_seg0, vp9_filt_level_seg0, vp9_refpic_seg0, vp9_skip_seg0 }, - { vp9_quant_seg1, vp9_filt_level_seg1, vp9_refpic_seg1, vp9_skip_seg1 }, - { vp9_quant_seg2, vp9_filt_level_seg2, vp9_refpic_seg2, vp9_skip_seg2 }, - { vp9_quant_seg3, vp9_filt_level_seg3, vp9_refpic_seg3, vp9_skip_seg3 }, - { vp9_quant_seg4, vp9_filt_level_seg4, vp9_refpic_seg4, vp9_skip_seg4 }, - { vp9_quant_seg5, vp9_filt_level_seg5, vp9_refpic_seg5, vp9_skip_seg5 }, - { vp9_quant_seg6, vp9_filt_level_seg6, vp9_refpic_seg6, vp9_skip_seg6 }, - { vp9_quant_seg7, vp9_filt_level_seg7, vp9_refpic_seg7, vp9_skip_seg7 }, - }; - - segment_enabled = !!(dec_params->seg.flags & V4L2_VP9_SEGMENTATION_FLAG_ENABLED); - hantro_reg_write(ctx->dev, &vp9_segment_e, segment_enabled); - hantro_reg_write(ctx->dev, &vp9_segment_upd_e, - !!(dec_params->seg.flags & V4L2_VP9_SEGMENTATION_FLAG_UPDATE_MAP)); - hantro_reg_write(ctx->dev, &vp9_segment_temp_upd_e, - !!(dec_params->seg.flags & V4L2_VP9_SEGMENTATION_FLAG_TEMPORAL_UPDATE)); - - seg = &dec_params->seg; - absolute = !!(seg->flags & V4L2_VP9_SEGMENTATION_FLAG_ABS_OR_DELTA_UPDATE); - update_data = !!(seg->flags & V4L2_VP9_SEGMENTATION_FLAG_UPDATE_DATA); - - for (segid = 0; segid < 8; ++segid) { - /* Quantizer segment feature */ - feat_id = V4L2_VP9_SEG_LVL_ALT_Q; - feat_val = dec_params->quant.base_q_idx; - if (segment_enabled) { - if (update_data) - update_feat_and_flag(vp9_ctx, seg, feat_id, segid); - if (v4l2_vp9_seg_feat_enabled(vp9_ctx->feature_enabled, feat_id, segid)) - feat_val = feat_val_clip3(feat_val, - vp9_ctx->feature_data[segid][feat_id], - absolute, 255); - } - hantro_reg_write(ctx->dev, &seg_regs[segid][feat_id], feat_val); - - /* Loop filter segment feature */ - feat_id = V4L2_VP9_SEG_LVL_ALT_L; - feat_val = dec_params->lf.level; - if (segment_enabled) { - if (update_data) - update_feat_and_flag(vp9_ctx, seg, feat_id, segid); - if (v4l2_vp9_seg_feat_enabled(vp9_ctx->feature_enabled, feat_id, segid)) - feat_val = feat_val_clip3(feat_val, - vp9_ctx->feature_data[segid][feat_id], - absolute, 63); - } - hantro_reg_write(ctx->dev, &seg_regs[segid][feat_id], feat_val); - - /* Reference frame segment feature */ - feat_id = V4L2_VP9_SEG_LVL_REF_FRAME; - feat_val = 0; - if (segment_enabled) { - if (update_data) - update_feat_and_flag(vp9_ctx, seg, feat_id, segid); - if (!(dec_params->flags & V4L2_VP9_FRAME_FLAG_KEY_FRAME) && - v4l2_vp9_seg_feat_enabled(vp9_ctx->feature_enabled, feat_id, segid)) - feat_val = vp9_ctx->feature_data[segid][feat_id] + 1; - } - hantro_reg_write(ctx->dev, &seg_regs[segid][feat_id], feat_val); - - /* Skip segment feature */ - feat_id = V4L2_VP9_SEG_LVL_SKIP; - feat_val = 0; - if (segment_enabled) { - if (update_data) - update_feat_and_flag(vp9_ctx, seg, feat_id, segid); - feat_val = v4l2_vp9_seg_feat_enabled(vp9_ctx->feature_enabled, - feat_id, segid) ? 1 : 0; - } - hantro_reg_write(ctx->dev, &seg_regs[segid][feat_id], feat_val); - } -} - -static void config_loop_filter(struct hantro_ctx *ctx, const struct v4l2_ctrl_vp9_frame *dec_params) -{ - bool d = dec_params->lf.flags & V4L2_VP9_LOOP_FILTER_FLAG_DELTA_ENABLED; - - hantro_reg_write(ctx->dev, &vp9_filt_level, dec_params->lf.level); - hantro_reg_write(ctx->dev, &g2_out_filtering_dis, dec_params->lf.level == 0); - hantro_reg_write(ctx->dev, &vp9_filt_sharpness, dec_params->lf.sharpness); - - hantro_reg_write(ctx->dev, &vp9_filt_ref_adj_0, d ? dec_params->lf.ref_deltas[0] : 0); - hantro_reg_write(ctx->dev, &vp9_filt_ref_adj_1, d ? dec_params->lf.ref_deltas[1] : 0); - hantro_reg_write(ctx->dev, &vp9_filt_ref_adj_2, d ? dec_params->lf.ref_deltas[2] : 0); - hantro_reg_write(ctx->dev, &vp9_filt_ref_adj_3, d ? dec_params->lf.ref_deltas[3] : 0); - hantro_reg_write(ctx->dev, &vp9_filt_mb_adj_0, d ? dec_params->lf.mode_deltas[0] : 0); - hantro_reg_write(ctx->dev, &vp9_filt_mb_adj_1, d ? dec_params->lf.mode_deltas[1] : 0); -} - -static void config_picture_dimensions(struct hantro_ctx *ctx, struct hantro_decoded_buffer *dst) -{ - u32 pic_w_4x4, pic_h_4x4; - - hantro_reg_write(ctx->dev, &g2_pic_width_in_cbs, (dst->vp9.width + 7) / 8); - hantro_reg_write(ctx->dev, &g2_pic_height_in_cbs, (dst->vp9.height + 7) / 8); - pic_w_4x4 = roundup(dst->vp9.width, 8) >> 2; - pic_h_4x4 = roundup(dst->vp9.height, 8) >> 2; - hantro_reg_write(ctx->dev, &g2_pic_width_4x4, pic_w_4x4); - hantro_reg_write(ctx->dev, &g2_pic_height_4x4, pic_h_4x4); -} - -static void -config_bit_depth(struct hantro_ctx *ctx, const struct v4l2_ctrl_vp9_frame *dec_params) -{ - if (ctx->dev->variant->legacy_regs) { - hantro_reg_write(ctx->dev, &g2_bit_depth_y, dec_params->bit_depth); - hantro_reg_write(ctx->dev, &g2_bit_depth_c, dec_params->bit_depth); - hantro_reg_write(ctx->dev, &g2_pix_shift, 0); - } else { - hantro_reg_write(ctx->dev, &g2_bit_depth_y_minus8, dec_params->bit_depth - 8); - hantro_reg_write(ctx->dev, &g2_bit_depth_c_minus8, dec_params->bit_depth - 8); - } -} - -static inline bool is_lossless(const struct v4l2_vp9_quantization *quant) -{ - return quant->base_q_idx == 0 && quant->delta_q_uv_ac == 0 && - quant->delta_q_uv_dc == 0 && quant->delta_q_y_dc == 0; -} - -static void -config_quant(struct hantro_ctx *ctx, const struct v4l2_ctrl_vp9_frame *dec_params) -{ - hantro_reg_write(ctx->dev, &vp9_qp_delta_y_dc, dec_params->quant.delta_q_y_dc); - hantro_reg_write(ctx->dev, &vp9_qp_delta_ch_dc, dec_params->quant.delta_q_uv_dc); - hantro_reg_write(ctx->dev, &vp9_qp_delta_ch_ac, dec_params->quant.delta_q_uv_ac); - hantro_reg_write(ctx->dev, &vp9_lossless_e, is_lossless(&dec_params->quant)); -} - -static u32 -hantro_interp_filter_from_v4l2(unsigned int interpolation_filter) -{ - switch (interpolation_filter) { - case V4L2_VP9_INTERP_FILTER_EIGHTTAP: - return 0x1; - case V4L2_VP9_INTERP_FILTER_EIGHTTAP_SMOOTH: - return 0; - case V4L2_VP9_INTERP_FILTER_EIGHTTAP_SHARP: - return 0x2; - case V4L2_VP9_INTERP_FILTER_BILINEAR: - return 0x3; - case V4L2_VP9_INTERP_FILTER_SWITCHABLE: - return 0x4; - } - - return 0; -} - -static void -config_others(struct hantro_ctx *ctx, const struct v4l2_ctrl_vp9_frame *dec_params, - bool intra_only, bool resolution_change) -{ - struct hantro_vp9_dec_hw_ctx *vp9_ctx = &ctx->vp9_dec; - - hantro_reg_write(ctx->dev, &g2_idr_pic_e, intra_only); - - hantro_reg_write(ctx->dev, &vp9_transform_mode, vp9_ctx->cur.tx_mode); - - hantro_reg_write(ctx->dev, &vp9_mcomp_filt_type, intra_only ? - 0 : hantro_interp_filter_from_v4l2(dec_params->interpolation_filter)); - - hantro_reg_write(ctx->dev, &vp9_high_prec_mv_e, - !!(dec_params->flags & V4L2_VP9_FRAME_FLAG_ALLOW_HIGH_PREC_MV)); - - hantro_reg_write(ctx->dev, &vp9_comp_pred_mode, dec_params->reference_mode); - - hantro_reg_write(ctx->dev, &g2_tempor_mvp_e, - !(dec_params->flags & V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT) && - !(dec_params->flags & V4L2_VP9_FRAME_FLAG_KEY_FRAME) && - !(vp9_ctx->last.flags & V4L2_VP9_FRAME_FLAG_KEY_FRAME) && - !(dec_params->flags & V4L2_VP9_FRAME_FLAG_INTRA_ONLY) && - !resolution_change && - vp9_ctx->last.flags & V4L2_VP9_FRAME_FLAG_SHOW_FRAME - ); - - hantro_reg_write(ctx->dev, &g2_write_mvs_e, - !(dec_params->flags & V4L2_VP9_FRAME_FLAG_KEY_FRAME)); -} - -static void -config_compound_reference(struct hantro_ctx *ctx, - const struct v4l2_ctrl_vp9_frame *dec_params) -{ - u32 comp_fixed_ref, comp_var_ref[2]; - bool last_ref_frame_sign_bias; - bool golden_ref_frame_sign_bias; - bool alt_ref_frame_sign_bias; - bool comp_ref_allowed = 0; - - comp_fixed_ref = 0; - comp_var_ref[0] = 0; - comp_var_ref[1] = 0; - - last_ref_frame_sign_bias = dec_params->ref_frame_sign_bias & V4L2_VP9_SIGN_BIAS_LAST; - golden_ref_frame_sign_bias = dec_params->ref_frame_sign_bias & V4L2_VP9_SIGN_BIAS_GOLDEN; - alt_ref_frame_sign_bias = dec_params->ref_frame_sign_bias & V4L2_VP9_SIGN_BIAS_ALT; - - /* 6.3.12 Frame reference mode syntax */ - comp_ref_allowed |= golden_ref_frame_sign_bias != last_ref_frame_sign_bias; - comp_ref_allowed |= alt_ref_frame_sign_bias != last_ref_frame_sign_bias; - - if (comp_ref_allowed) { - if (last_ref_frame_sign_bias == - golden_ref_frame_sign_bias) { - comp_fixed_ref = ALTREF_FRAME; - comp_var_ref[0] = LAST_FRAME; - comp_var_ref[1] = GOLDEN_FRAME; - } else if (last_ref_frame_sign_bias == - alt_ref_frame_sign_bias) { - comp_fixed_ref = GOLDEN_FRAME; - comp_var_ref[0] = LAST_FRAME; - comp_var_ref[1] = ALTREF_FRAME; - } else { - comp_fixed_ref = LAST_FRAME; - comp_var_ref[0] = GOLDEN_FRAME; - comp_var_ref[1] = ALTREF_FRAME; - } - } - - hantro_reg_write(ctx->dev, &vp9_comp_pred_fixed_ref, comp_fixed_ref); - hantro_reg_write(ctx->dev, &vp9_comp_pred_var_ref0, comp_var_ref[0]); - hantro_reg_write(ctx->dev, &vp9_comp_pred_var_ref1, comp_var_ref[1]); -} - -#define INNER_LOOP \ -do { \ - for (m = 0; m < ARRAY_SIZE(adaptive->coef[0][0][0][0]); ++m) { \ - memcpy(adaptive->coef[i][j][k][l][m], \ - probs->coef[i][j][k][l][m], \ - sizeof(probs->coef[i][j][k][l][m])); \ - \ - adaptive->coef[i][j][k][l][m][3] = 0; \ - } \ -} while (0) - -static void config_probs(struct hantro_ctx *ctx, const struct v4l2_ctrl_vp9_frame *dec_params) -{ - struct hantro_vp9_dec_hw_ctx *vp9_ctx = &ctx->vp9_dec; - struct hantro_aux_buf *misc = &vp9_ctx->misc; - struct hantro_g2_all_probs *all_probs = misc->cpu; - struct hantro_g2_probs *adaptive; - struct hantro_g2_mv_probs *mv; - const struct v4l2_vp9_segmentation *seg = &dec_params->seg; - const struct v4l2_vp9_frame_context *probs = &vp9_ctx->probability_tables; - int i, j, k, l, m; - - for (i = 0; i < ARRAY_SIZE(all_probs->kf_y_mode_prob); ++i) - for (j = 0; j < ARRAY_SIZE(all_probs->kf_y_mode_prob[0]); ++j) { - memcpy(all_probs->kf_y_mode_prob[i][j], - v4l2_vp9_kf_y_mode_prob[i][j], - ARRAY_SIZE(all_probs->kf_y_mode_prob[i][j])); - - all_probs->kf_y_mode_prob_tail[i][j][0] = - v4l2_vp9_kf_y_mode_prob[i][j][8]; - } - - memcpy(all_probs->mb_segment_tree_probs, seg->tree_probs, - sizeof(all_probs->mb_segment_tree_probs)); - - memcpy(all_probs->segment_pred_probs, seg->pred_probs, - sizeof(all_probs->segment_pred_probs)); - - for (i = 0; i < ARRAY_SIZE(all_probs->kf_uv_mode_prob); ++i) { - memcpy(all_probs->kf_uv_mode_prob[i], v4l2_vp9_kf_uv_mode_prob[i], - ARRAY_SIZE(all_probs->kf_uv_mode_prob[i])); - - all_probs->kf_uv_mode_prob_tail[i][0] = v4l2_vp9_kf_uv_mode_prob[i][8]; - } - - adaptive = &all_probs->probs; - - for (i = 0; i < ARRAY_SIZE(adaptive->inter_mode); ++i) { - memcpy(adaptive->inter_mode[i], probs->inter_mode[i], - ARRAY_SIZE(probs->inter_mode[i])); - - adaptive->inter_mode[i][3] = 0; - } - - memcpy(adaptive->is_inter, probs->is_inter, sizeof(adaptive->is_inter)); - - for (i = 0; i < ARRAY_SIZE(adaptive->uv_mode); ++i) { - memcpy(adaptive->uv_mode[i], probs->uv_mode[i], - sizeof(adaptive->uv_mode[i])); - adaptive->uv_mode_tail[i][0] = probs->uv_mode[i][8]; - } - - memcpy(adaptive->tx8, probs->tx8, sizeof(adaptive->tx8)); - memcpy(adaptive->tx16, probs->tx16, sizeof(adaptive->tx16)); - memcpy(adaptive->tx32, probs->tx32, sizeof(adaptive->tx32)); - - for (i = 0; i < ARRAY_SIZE(adaptive->y_mode); ++i) { - memcpy(adaptive->y_mode[i], probs->y_mode[i], - ARRAY_SIZE(adaptive->y_mode[i])); - - adaptive->y_mode_tail[i][0] = probs->y_mode[i][8]; - } - - for (i = 0; i < ARRAY_SIZE(adaptive->partition[0]); ++i) { - memcpy(adaptive->partition[0][i], v4l2_vp9_kf_partition_probs[i], - sizeof(v4l2_vp9_kf_partition_probs[i])); - - adaptive->partition[0][i][3] = 0; - } - - for (i = 0; i < ARRAY_SIZE(adaptive->partition[1]); ++i) { - memcpy(adaptive->partition[1][i], probs->partition[i], - sizeof(probs->partition[i])); - - adaptive->partition[1][i][3] = 0; - } - - memcpy(adaptive->interp_filter, probs->interp_filter, - sizeof(adaptive->interp_filter)); - - memcpy(adaptive->comp_mode, probs->comp_mode, sizeof(adaptive->comp_mode)); - - memcpy(adaptive->skip, probs->skip, sizeof(adaptive->skip)); - - mv = &adaptive->mv; - - memcpy(mv->joint, probs->mv.joint, sizeof(mv->joint)); - memcpy(mv->sign, probs->mv.sign, sizeof(mv->sign)); - memcpy(mv->class0_bit, probs->mv.class0_bit, sizeof(mv->class0_bit)); - memcpy(mv->fr, probs->mv.fr, sizeof(mv->fr)); - memcpy(mv->class0_hp, probs->mv.class0_hp, sizeof(mv->class0_hp)); - memcpy(mv->hp, probs->mv.hp, sizeof(mv->hp)); - memcpy(mv->classes, probs->mv.classes, sizeof(mv->classes)); - memcpy(mv->class0_fr, probs->mv.class0_fr, sizeof(mv->class0_fr)); - memcpy(mv->bits, probs->mv.bits, sizeof(mv->bits)); - - memcpy(adaptive->single_ref, probs->single_ref, sizeof(adaptive->single_ref)); - - memcpy(adaptive->comp_ref, probs->comp_ref, sizeof(adaptive->comp_ref)); - - for (i = 0; i < ARRAY_SIZE(adaptive->coef); ++i) - for (j = 0; j < ARRAY_SIZE(adaptive->coef[0]); ++j) - for (k = 0; k < ARRAY_SIZE(adaptive->coef[0][0]); ++k) - for (l = 0; l < ARRAY_SIZE(adaptive->coef[0][0][0]); ++l) - INNER_LOOP; - - hantro_write_addr(ctx->dev, G2_VP9_PROBS_ADDR, misc->dma); -} - -static void config_counts(struct hantro_ctx *ctx) -{ - struct hantro_vp9_dec_hw_ctx *vp9_dec = &ctx->vp9_dec; - struct hantro_aux_buf *misc = &vp9_dec->misc; - dma_addr_t addr = misc->dma + vp9_dec->ctx_counters_offset; - - hantro_write_addr(ctx->dev, G2_VP9_CTX_COUNT_ADDR, addr); -} - -static void config_seg_map(struct hantro_ctx *ctx, - const struct v4l2_ctrl_vp9_frame *dec_params, - bool intra_only, bool update_map) -{ - struct hantro_vp9_dec_hw_ctx *vp9_ctx = &ctx->vp9_dec; - struct hantro_aux_buf *segment_map = &vp9_ctx->segment_map; - dma_addr_t addr; - - if (intra_only || - (dec_params->flags & V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT)) { - memset(segment_map->cpu, 0, segment_map->size); - memset(vp9_ctx->feature_data, 0, sizeof(vp9_ctx->feature_data)); - memset(vp9_ctx->feature_enabled, 0, sizeof(vp9_ctx->feature_enabled)); - } - - addr = segment_map->dma + vp9_ctx->active_segment * vp9_ctx->segment_map_size; - hantro_write_addr(ctx->dev, G2_VP9_SEGMENT_READ_ADDR, addr); - - addr = segment_map->dma + (1 - vp9_ctx->active_segment) * vp9_ctx->segment_map_size; - hantro_write_addr(ctx->dev, G2_VP9_SEGMENT_WRITE_ADDR, addr); - - if (update_map) - vp9_ctx->active_segment = 1 - vp9_ctx->active_segment; -} - -static void -config_source(struct hantro_ctx *ctx, const struct v4l2_ctrl_vp9_frame *dec_params, - struct vb2_v4l2_buffer *vb2_src) -{ - dma_addr_t stream_base, tmp_addr; - unsigned int headres_size; - u32 src_len, start_bit, src_buf_len; - - headres_size = dec_params->uncompressed_header_size - + dec_params->compressed_header_size; - - stream_base = vb2_dma_contig_plane_dma_addr(&vb2_src->vb2_buf, 0); - - tmp_addr = stream_base + headres_size; - if (ctx->dev->variant->legacy_regs) - hantro_write_addr(ctx->dev, G2_STREAM_ADDR, (tmp_addr & ~0xf)); - else - hantro_write_addr(ctx->dev, G2_STREAM_ADDR, stream_base); - - start_bit = (tmp_addr & 0xf) * 8; - hantro_reg_write(ctx->dev, &g2_start_bit, start_bit); - - src_len = vb2_get_plane_payload(&vb2_src->vb2_buf, 0); - src_len += start_bit / 8 - headres_size; - hantro_reg_write(ctx->dev, &g2_stream_len, src_len); - - if (!ctx->dev->variant->legacy_regs) { - tmp_addr &= ~0xf; - hantro_reg_write(ctx->dev, &g2_strm_start_offset, tmp_addr - stream_base); - src_buf_len = vb2_plane_size(&vb2_src->vb2_buf, 0); - hantro_reg_write(ctx->dev, &g2_strm_buffer_len, src_buf_len); - } -} - -static void -config_registers(struct hantro_ctx *ctx, const struct v4l2_ctrl_vp9_frame *dec_params, - struct vb2_v4l2_buffer *vb2_src, struct vb2_v4l2_buffer *vb2_dst) -{ - struct hantro_decoded_buffer *dst, *last, *mv_ref; - struct hantro_vp9_dec_hw_ctx *vp9_ctx = &ctx->vp9_dec; - const struct v4l2_vp9_segmentation *seg; - bool intra_only, resolution_change; - - /* vp9 stuff */ - dst = vb2_to_hantro_decoded_buf(&vb2_dst->vb2_buf); - - if (vp9_ctx->last.valid) - last = get_ref_buf(ctx, &dst->base.vb, vp9_ctx->last.timestamp); - else - last = dst; - - update_dec_buf_info(dst, dec_params); - update_ctx_cur_info(vp9_ctx, dst, dec_params); - seg = &dec_params->seg; - - intra_only = !!(dec_params->flags & - (V4L2_VP9_FRAME_FLAG_KEY_FRAME | - V4L2_VP9_FRAME_FLAG_INTRA_ONLY)); - - if (!intra_only && - !(dec_params->flags & V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT) && - vp9_ctx->last.valid) - mv_ref = last; - else - mv_ref = dst; - - resolution_change = dst->vp9.width != last->vp9.width || - dst->vp9.height != last->vp9.height; - - /* configure basic registers */ - hantro_reg_write(ctx->dev, &g2_mode, VP9_DEC_MODE); - if (!ctx->dev->variant->legacy_regs) { - hantro_reg_write(ctx->dev, &g2_strm_swap, 0xf); - hantro_reg_write(ctx->dev, &g2_dirmv_swap, 0xf); - hantro_reg_write(ctx->dev, &g2_compress_swap, 0xf); - hantro_reg_write(ctx->dev, &g2_ref_compress_bypass, 1); - } else { - hantro_reg_write(ctx->dev, &g2_strm_swap_old, 0x1f); - hantro_reg_write(ctx->dev, &g2_pic_swap, 0x10); - hantro_reg_write(ctx->dev, &g2_dirmv_swap_old, 0x10); - hantro_reg_write(ctx->dev, &g2_tab0_swap_old, 0x10); - hantro_reg_write(ctx->dev, &g2_tab1_swap_old, 0x10); - hantro_reg_write(ctx->dev, &g2_tab2_swap_old, 0x10); - hantro_reg_write(ctx->dev, &g2_tab3_swap_old, 0x10); - hantro_reg_write(ctx->dev, &g2_rscan_swap, 0x10); - } - hantro_reg_write(ctx->dev, &g2_buswidth, BUS_WIDTH_128); - hantro_reg_write(ctx->dev, &g2_max_burst, 16); - hantro_reg_write(ctx->dev, &g2_apf_threshold, 8); - hantro_reg_write(ctx->dev, &g2_clk_gate_e, 1); - hantro_reg_write(ctx->dev, &g2_max_cb_size, 6); - hantro_reg_write(ctx->dev, &g2_min_cb_size, 3); - if (ctx->dev->variant->double_buffer) - hantro_reg_write(ctx->dev, &g2_double_buffer_e, 1); - - config_output(ctx, dst, dec_params); - - if (!intra_only) - config_ref_registers(ctx, dec_params, dst, mv_ref); - - config_tiles(ctx, dec_params, dst); - config_segment(ctx, dec_params); - config_loop_filter(ctx, dec_params); - config_picture_dimensions(ctx, dst); - config_bit_depth(ctx, dec_params); - config_quant(ctx, dec_params); - config_others(ctx, dec_params, intra_only, resolution_change); - config_compound_reference(ctx, dec_params); - config_probs(ctx, dec_params); - config_counts(ctx); - config_seg_map(ctx, dec_params, intra_only, - seg->flags & V4L2_VP9_SEGMENTATION_FLAG_UPDATE_MAP); - config_source(ctx, dec_params, vb2_src); -} - -int hantro_g2_vp9_dec_run(struct hantro_ctx *ctx) -{ - const struct v4l2_ctrl_vp9_frame *decode_params; - struct vb2_v4l2_buffer *src; - struct vb2_v4l2_buffer *dst; - int ret; - - hantro_g2_check_idle(ctx->dev); - - ret = start_prepare_run(ctx, &decode_params); - if (ret) { - hantro_end_prepare_run(ctx); - return ret; - } - - src = hantro_get_src_buf(ctx); - dst = hantro_get_dst_buf(ctx); - - config_registers(ctx, decode_params, src, dst); - - hantro_end_prepare_run(ctx); - - vdpu_write(ctx->dev, G2_REG_INTERRUPT_DEC_E, G2_REG_INTERRUPT); - - return 0; -} - -#define copy_tx_and_skip(p1, p2) \ -do { \ - memcpy((p1)->tx8, (p2)->tx8, sizeof((p1)->tx8)); \ - memcpy((p1)->tx16, (p2)->tx16, sizeof((p1)->tx16)); \ - memcpy((p1)->tx32, (p2)->tx32, sizeof((p1)->tx32)); \ - memcpy((p1)->skip, (p2)->skip, sizeof((p1)->skip)); \ -} while (0) - -void hantro_g2_vp9_dec_done(struct hantro_ctx *ctx) -{ - struct hantro_vp9_dec_hw_ctx *vp9_ctx = &ctx->vp9_dec; - unsigned int fctx_idx; - - if (!(vp9_ctx->cur.flags & V4L2_VP9_FRAME_FLAG_REFRESH_FRAME_CTX)) - goto out_update_last; - - fctx_idx = vp9_ctx->cur.frame_context_idx; - - if (!(vp9_ctx->cur.flags & V4L2_VP9_FRAME_FLAG_PARALLEL_DEC_MODE)) { - /* error_resilient_mode == 0 && frame_parallel_decoding_mode == 0 */ - struct v4l2_vp9_frame_context *probs = &vp9_ctx->probability_tables; - bool frame_is_intra = vp9_ctx->cur.flags & - (V4L2_VP9_FRAME_FLAG_KEY_FRAME | V4L2_VP9_FRAME_FLAG_INTRA_ONLY); - struct tx_and_skip { - u8 tx8[2][1]; - u8 tx16[2][2]; - u8 tx32[2][3]; - u8 skip[3]; - } _tx_skip, *tx_skip = &_tx_skip; - struct v4l2_vp9_frame_symbol_counts *counts; - struct symbol_counts *hantro_cnts; - u32 tx16p[2][4]; - int i; - - /* buffer the forward-updated TX and skip probs */ - if (frame_is_intra) - copy_tx_and_skip(tx_skip, probs); - - /* 6.1.2 refresh_probs(): load_probs() and load_probs2() */ - *probs = vp9_ctx->frame_context[fctx_idx]; - - /* if FrameIsIntra then undo the effect of load_probs2() */ - if (frame_is_intra) - copy_tx_and_skip(probs, tx_skip); - - counts = &vp9_ctx->cnts; - hantro_cnts = vp9_ctx->misc.cpu + vp9_ctx->ctx_counters_offset; - for (i = 0; i < ARRAY_SIZE(tx16p); ++i) { - memcpy(tx16p[i], - hantro_cnts->tx16x16_count[i], - sizeof(hantro_cnts->tx16x16_count[0])); - tx16p[i][3] = 0; - } - counts->tx16p = &tx16p; - - v4l2_vp9_adapt_coef_probs(probs, counts, - !vp9_ctx->last.valid || - vp9_ctx->last.flags & V4L2_VP9_FRAME_FLAG_KEY_FRAME, - frame_is_intra); - - if (!frame_is_intra) { - /* load_probs2() already done */ - u32 mv_mode[7][4]; - - for (i = 0; i < ARRAY_SIZE(mv_mode); ++i) { - mv_mode[i][0] = hantro_cnts->inter_mode_counts[i][1][0]; - mv_mode[i][1] = hantro_cnts->inter_mode_counts[i][2][0]; - mv_mode[i][2] = hantro_cnts->inter_mode_counts[i][0][0]; - mv_mode[i][3] = hantro_cnts->inter_mode_counts[i][2][1]; - } - counts->mv_mode = &mv_mode; - v4l2_vp9_adapt_noncoef_probs(&vp9_ctx->probability_tables, counts, - vp9_ctx->cur.reference_mode, - vp9_ctx->cur.interpolation_filter, - vp9_ctx->cur.tx_mode, vp9_ctx->cur.flags); - } - } - - vp9_ctx->frame_context[fctx_idx] = vp9_ctx->probability_tables; - -out_update_last: - vp9_ctx->last = vp9_ctx->cur; -} diff --git a/drivers/staging/media/hantro/hantro_h1_jpeg_enc.c b/drivers/staging/media/hantro/hantro_h1_jpeg_enc.c deleted file mode 100644 index 12d69503d6ba..000000000000 --- a/drivers/staging/media/hantro/hantro_h1_jpeg_enc.c +++ /dev/null @@ -1,166 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Hantro VPU codec driver - * - * Copyright (C) 2018 Rockchip Electronics Co., Ltd. - */ - -#include <asm/unaligned.h> -#include <media/v4l2-mem2mem.h> -#include "hantro_jpeg.h" -#include "hantro.h" -#include "hantro_v4l2.h" -#include "hantro_hw.h" -#include "hantro_h1_regs.h" - -#define H1_JPEG_QUANT_TABLE_COUNT 16 - -static void hantro_h1_set_src_img_ctrl(struct hantro_dev *vpu, - struct hantro_ctx *ctx) -{ - u32 overfill_r, overfill_b; - u32 reg; - - /* - * The format width and height are already macroblock aligned - * by .vidioc_s_fmt_vid_cap_mplane() callback. Destination - * format width and height can be further modified by - * .vidioc_s_selection(), and the width is 4-aligned. - */ - overfill_r = ctx->src_fmt.width - ctx->dst_fmt.width; - overfill_b = ctx->src_fmt.height - ctx->dst_fmt.height; - - reg = H1_REG_IN_IMG_CTRL_ROW_LEN(ctx->src_fmt.width) - | H1_REG_IN_IMG_CTRL_OVRFLR_D4(overfill_r / 4) - | H1_REG_IN_IMG_CTRL_OVRFLB(overfill_b) - | H1_REG_IN_IMG_CTRL_FMT(ctx->vpu_src_fmt->enc_fmt); - vepu_write_relaxed(vpu, reg, H1_REG_IN_IMG_CTRL); -} - -static void hantro_h1_jpeg_enc_set_buffers(struct hantro_dev *vpu, - struct hantro_ctx *ctx, - struct vb2_buffer *src_buf, - struct vb2_buffer *dst_buf) -{ - struct v4l2_pix_format_mplane *pix_fmt = &ctx->src_fmt; - dma_addr_t src[3]; - u32 size_left; - - size_left = vb2_plane_size(dst_buf, 0) - ctx->vpu_dst_fmt->header_size; - if (WARN_ON(vb2_plane_size(dst_buf, 0) < ctx->vpu_dst_fmt->header_size)) - size_left = 0; - - WARN_ON(pix_fmt->num_planes > 3); - - vepu_write_relaxed(vpu, vb2_dma_contig_plane_dma_addr(dst_buf, 0) + - ctx->vpu_dst_fmt->header_size, - H1_REG_ADDR_OUTPUT_STREAM); - vepu_write_relaxed(vpu, size_left, H1_REG_STR_BUF_LIMIT); - - if (pix_fmt->num_planes == 1) { - src[0] = vb2_dma_contig_plane_dma_addr(src_buf, 0); - /* single plane formats we supported are all interlaced */ - vepu_write_relaxed(vpu, src[0], H1_REG_ADDR_IN_PLANE_0); - } else if (pix_fmt->num_planes == 2) { - src[0] = vb2_dma_contig_plane_dma_addr(src_buf, 0); - src[1] = vb2_dma_contig_plane_dma_addr(src_buf, 1); - vepu_write_relaxed(vpu, src[0], H1_REG_ADDR_IN_PLANE_0); - vepu_write_relaxed(vpu, src[1], H1_REG_ADDR_IN_PLANE_1); - } else { - src[0] = vb2_dma_contig_plane_dma_addr(src_buf, 0); - src[1] = vb2_dma_contig_plane_dma_addr(src_buf, 1); - src[2] = vb2_dma_contig_plane_dma_addr(src_buf, 2); - vepu_write_relaxed(vpu, src[0], H1_REG_ADDR_IN_PLANE_0); - vepu_write_relaxed(vpu, src[1], H1_REG_ADDR_IN_PLANE_1); - vepu_write_relaxed(vpu, src[2], H1_REG_ADDR_IN_PLANE_2); - } -} - -static void -hantro_h1_jpeg_enc_set_qtable(struct hantro_dev *vpu, - unsigned char *luma_qtable, - unsigned char *chroma_qtable) -{ - u32 reg, i; - __be32 *luma_qtable_p; - __be32 *chroma_qtable_p; - - luma_qtable_p = (__be32 *)luma_qtable; - chroma_qtable_p = (__be32 *)chroma_qtable; - - /* - * Quantization table registers must be written in contiguous blocks. - * DO NOT collapse the below two "for" loops into one. - */ - for (i = 0; i < H1_JPEG_QUANT_TABLE_COUNT; i++) { - reg = get_unaligned_be32(&luma_qtable_p[i]); - vepu_write_relaxed(vpu, reg, H1_REG_JPEG_LUMA_QUAT(i)); - } - - for (i = 0; i < H1_JPEG_QUANT_TABLE_COUNT; i++) { - reg = get_unaligned_be32(&chroma_qtable_p[i]); - vepu_write_relaxed(vpu, reg, H1_REG_JPEG_CHROMA_QUAT(i)); - } -} - -int hantro_h1_jpeg_enc_run(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - struct vb2_v4l2_buffer *src_buf, *dst_buf; - struct hantro_jpeg_ctx jpeg_ctx; - u32 reg; - - src_buf = hantro_get_src_buf(ctx); - dst_buf = hantro_get_dst_buf(ctx); - - hantro_start_prepare_run(ctx); - - memset(&jpeg_ctx, 0, sizeof(jpeg_ctx)); - jpeg_ctx.buffer = vb2_plane_vaddr(&dst_buf->vb2_buf, 0); - jpeg_ctx.width = ctx->dst_fmt.width; - jpeg_ctx.height = ctx->dst_fmt.height; - jpeg_ctx.quality = ctx->jpeg_quality; - hantro_jpeg_header_assemble(&jpeg_ctx); - - /* Switch to JPEG encoder mode before writing registers */ - vepu_write_relaxed(vpu, H1_REG_ENC_CTRL_ENC_MODE_JPEG, - H1_REG_ENC_CTRL); - - hantro_h1_set_src_img_ctrl(vpu, ctx); - hantro_h1_jpeg_enc_set_buffers(vpu, ctx, &src_buf->vb2_buf, - &dst_buf->vb2_buf); - hantro_h1_jpeg_enc_set_qtable(vpu, jpeg_ctx.hw_luma_qtable, - jpeg_ctx.hw_chroma_qtable); - - reg = H1_REG_AXI_CTRL_OUTPUT_SWAP16 - | H1_REG_AXI_CTRL_INPUT_SWAP16 - | H1_REG_AXI_CTRL_BURST_LEN(16) - | H1_REG_AXI_CTRL_OUTPUT_SWAP32 - | H1_REG_AXI_CTRL_INPUT_SWAP32 - | H1_REG_AXI_CTRL_OUTPUT_SWAP8 - | H1_REG_AXI_CTRL_INPUT_SWAP8; - /* Make sure that all registers are written at this point. */ - vepu_write(vpu, reg, H1_REG_AXI_CTRL); - - reg = H1_REG_ENC_CTRL_WIDTH(MB_WIDTH(ctx->src_fmt.width)) - | H1_REG_ENC_CTRL_HEIGHT(MB_HEIGHT(ctx->src_fmt.height)) - | H1_REG_ENC_CTRL_ENC_MODE_JPEG - | H1_REG_ENC_PIC_INTRA - | H1_REG_ENC_CTRL_EN_BIT; - - hantro_end_prepare_run(ctx); - - vepu_write(vpu, reg, H1_REG_ENC_CTRL); - - return 0; -} - -void hantro_h1_jpeg_enc_done(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - u32 bytesused = vepu_read(vpu, H1_REG_STR_BUF_LIMIT) / 8; - struct vb2_v4l2_buffer *dst_buf = hantro_get_dst_buf(ctx); - - vb2_set_plane_payload(&dst_buf->vb2_buf, 0, - ctx->vpu_dst_fmt->header_size + bytesused); -} diff --git a/drivers/staging/media/hantro/hantro_h1_regs.h b/drivers/staging/media/hantro/hantro_h1_regs.h deleted file mode 100644 index 30e7e7b920b5..000000000000 --- a/drivers/staging/media/hantro/hantro_h1_regs.h +++ /dev/null @@ -1,154 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Hantro VPU codec driver - * - * Copyright 2018 Google LLC. - * Tomasz Figa <tfiga@chromium.org> - */ - -#ifndef HANTRO_H1_REGS_H_ -#define HANTRO_H1_REGS_H_ - -/* Encoder registers. */ -#define H1_REG_INTERRUPT 0x004 -#define H1_REG_INTERRUPT_FRAME_RDY BIT(2) -#define H1_REG_INTERRUPT_DIS_BIT BIT(1) -#define H1_REG_INTERRUPT_BIT BIT(0) -#define H1_REG_AXI_CTRL 0x008 -#define H1_REG_AXI_CTRL_OUTPUT_SWAP16 BIT(15) -#define H1_REG_AXI_CTRL_INPUT_SWAP16 BIT(14) -#define H1_REG_AXI_CTRL_BURST_LEN(x) ((x) << 8) -#define H1_REG_AXI_CTRL_GATE_BIT BIT(4) -#define H1_REG_AXI_CTRL_OUTPUT_SWAP32 BIT(3) -#define H1_REG_AXI_CTRL_INPUT_SWAP32 BIT(2) -#define H1_REG_AXI_CTRL_OUTPUT_SWAP8 BIT(1) -#define H1_REG_AXI_CTRL_INPUT_SWAP8 BIT(0) -#define H1_REG_ADDR_OUTPUT_STREAM 0x014 -#define H1_REG_ADDR_OUTPUT_CTRL 0x018 -#define H1_REG_ADDR_REF_LUMA 0x01c -#define H1_REG_ADDR_REF_CHROMA 0x020 -#define H1_REG_ADDR_REC_LUMA 0x024 -#define H1_REG_ADDR_REC_CHROMA 0x028 -#define H1_REG_ADDR_IN_PLANE_0 0x02c -#define H1_REG_ADDR_IN_PLANE_1 0x030 -#define H1_REG_ADDR_IN_PLANE_2 0x034 -#define H1_REG_ENC_CTRL 0x038 -#define H1_REG_ENC_CTRL_TIMEOUT_EN BIT(31) -#define H1_REG_ENC_CTRL_NAL_MODE_BIT BIT(29) -#define H1_REG_ENC_CTRL_WIDTH(w) ((w) << 19) -#define H1_REG_ENC_CTRL_HEIGHT(h) ((h) << 10) -#define H1_REG_ENC_PIC_INTER (0x0 << 3) -#define H1_REG_ENC_PIC_INTRA (0x1 << 3) -#define H1_REG_ENC_PIC_MVCINTER (0x2 << 3) -#define H1_REG_ENC_CTRL_ENC_MODE_H264 (0x3 << 1) -#define H1_REG_ENC_CTRL_ENC_MODE_JPEG (0x2 << 1) -#define H1_REG_ENC_CTRL_ENC_MODE_VP8 (0x1 << 1) -#define H1_REG_ENC_CTRL_EN_BIT BIT(0) -#define H1_REG_IN_IMG_CTRL 0x03c -#define H1_REG_IN_IMG_CTRL_ROW_LEN(x) ((x) << 12) -#define H1_REG_IN_IMG_CTRL_OVRFLR_D4(x) ((x) << 10) -#define H1_REG_IN_IMG_CTRL_OVRFLB(x) ((x) << 6) -#define H1_REG_IN_IMG_CTRL_FMT(x) ((x) << 2) -#define H1_REG_ENC_CTRL0 0x040 -#define H1_REG_ENC_CTRL0_INIT_QP(x) ((x) << 26) -#define H1_REG_ENC_CTRL0_SLICE_ALPHA(x) ((x) << 22) -#define H1_REG_ENC_CTRL0_SLICE_BETA(x) ((x) << 18) -#define H1_REG_ENC_CTRL0_CHROMA_QP_OFFSET(x) ((x) << 13) -#define H1_REG_ENC_CTRL0_FILTER_DIS(x) ((x) << 5) -#define H1_REG_ENC_CTRL0_IDR_PICID(x) ((x) << 1) -#define H1_REG_ENC_CTRL0_CONSTR_INTRA_PRED BIT(0) -#define H1_REG_ENC_CTRL1 0x044 -#define H1_REG_ENC_CTRL1_PPS_ID(x) ((x) << 24) -#define H1_REG_ENC_CTRL1_INTRA_PRED_MODE(x) ((x) << 16) -#define H1_REG_ENC_CTRL1_FRAME_NUM(x) ((x)) -#define H1_REG_ENC_CTRL2 0x048 -#define H1_REG_ENC_CTRL2_DEBLOCKING_FILETER_MODE(x) ((x) << 30) -#define H1_REG_ENC_CTRL2_H264_SLICE_SIZE(x) ((x) << 23) -#define H1_REG_ENC_CTRL2_DISABLE_QUARTER_PIXMV BIT(22) -#define H1_REG_ENC_CTRL2_TRANS8X8_MODE_EN BIT(21) -#define H1_REG_ENC_CTRL2_CABAC_INIT_IDC(x) ((x) << 19) -#define H1_REG_ENC_CTRL2_ENTROPY_CODING_MODE BIT(18) -#define H1_REG_ENC_CTRL2_H264_INTER4X4_MODE BIT(17) -#define H1_REG_ENC_CTRL2_H264_STREAM_MODE BIT(16) -#define H1_REG_ENC_CTRL2_INTRA16X16_MODE(x) ((x)) -#define H1_REG_ENC_CTRL3 0x04c -#define H1_REG_ENC_CTRL3_MUTIMV_EN BIT(30) -#define H1_REG_ENC_CTRL3_MV_PENALTY_1_4P(x) ((x) << 20) -#define H1_REG_ENC_CTRL3_MV_PENALTY_4P(x) ((x) << 10) -#define H1_REG_ENC_CTRL3_MV_PENALTY_1P(x) ((x)) -#define H1_REG_ENC_CTRL4 0x050 -#define H1_REG_ENC_CTRL4_MV_PENALTY_16X8_8X16(x) ((x) << 20) -#define H1_REG_ENC_CTRL4_MV_PENALTY_8X8(x) ((x) << 10) -#define H1_REG_ENC_CTRL4_8X4_4X8(x) ((x)) -#define H1_REG_ENC_CTRL5 0x054 -#define H1_REG_ENC_CTRL5_MACROBLOCK_PENALTY(x) ((x) << 24) -#define H1_REG_ENC_CTRL5_COMPLETE_SLICES(x) ((x) << 16) -#define H1_REG_ENC_CTRL5_INTER_MODE(x) ((x)) -#define H1_REG_STR_HDR_REM_MSB 0x058 -#define H1_REG_STR_HDR_REM_LSB 0x05c -#define H1_REG_STR_BUF_LIMIT 0x060 -#define H1_REG_MAD_CTRL 0x064 -#define H1_REG_MAD_CTRL_QP_ADJUST(x) ((x) << 28) -#define H1_REG_MAD_CTRL_MAD_THREDHOLD(x) ((x) << 22) -#define H1_REG_MAD_CTRL_QP_SUM_DIV2(x) ((x)) -#define H1_REG_ADDR_VP8_PROB_CNT 0x068 -#define H1_REG_QP_VAL 0x06c -#define H1_REG_QP_VAL_LUM(x) ((x) << 26) -#define H1_REG_QP_VAL_MAX(x) ((x) << 20) -#define H1_REG_QP_VAL_MIN(x) ((x) << 14) -#define H1_REG_QP_VAL_CHECKPOINT_DISTAN(x) ((x)) -#define H1_REG_VP8_QP_VAL(i) (0x06c + ((i) * 0x4)) -#define H1_REG_CHECKPOINT(i) (0x070 + ((i) * 0x4)) -#define H1_REG_CHECKPOINT_CHECK0(x) (((x) & 0xffff)) -#define H1_REG_CHECKPOINT_CHECK1(x) (((x) & 0xffff) << 16) -#define H1_REG_CHECKPOINT_RESULT(x) ((((x) >> (16 - 16 \ - * (i & 1))) & 0xffff) \ - * 32) -#define H1_REG_CHKPT_WORD_ERR(i) (0x084 + ((i) * 0x4)) -#define H1_REG_CHKPT_WORD_ERR_CHK0(x) (((x) & 0xffff)) -#define H1_REG_CHKPT_WORD_ERR_CHK1(x) (((x) & 0xffff) << 16) -#define H1_REG_VP8_BOOL_ENC 0x08c -#define H1_REG_CHKPT_DELTA_QP 0x090 -#define H1_REG_CHKPT_DELTA_QP_CHK0(x) (((x) & 0x0f) << 0) -#define H1_REG_CHKPT_DELTA_QP_CHK1(x) (((x) & 0x0f) << 4) -#define H1_REG_CHKPT_DELTA_QP_CHK2(x) (((x) & 0x0f) << 8) -#define H1_REG_CHKPT_DELTA_QP_CHK3(x) (((x) & 0x0f) << 12) -#define H1_REG_CHKPT_DELTA_QP_CHK4(x) (((x) & 0x0f) << 16) -#define H1_REG_CHKPT_DELTA_QP_CHK5(x) (((x) & 0x0f) << 20) -#define H1_REG_CHKPT_DELTA_QP_CHK6(x) (((x) & 0x0f) << 24) -#define H1_REG_VP8_CTRL0 0x090 -#define H1_REG_RLC_CTRL 0x094 -#define H1_REG_RLC_CTRL_STR_OFFS_SHIFT 23 -#define H1_REG_RLC_CTRL_STR_OFFS_MASK (0x3f << 23) -#define H1_REG_RLC_CTRL_RLC_SUM(x) ((x)) -#define H1_REG_MB_CTRL 0x098 -#define H1_REG_MB_CNT_OUT(x) (((x) & 0xffff)) -#define H1_REG_MB_CNT_SET(x) (((x) & 0xffff) << 16) -#define H1_REG_ADDR_NEXT_PIC 0x09c -#define H1_REG_JPEG_LUMA_QUAT(i) (0x100 + ((i) * 0x4)) -#define H1_REG_JPEG_CHROMA_QUAT(i) (0x140 + ((i) * 0x4)) -#define H1_REG_STABILIZATION_OUTPUT 0x0A0 -#define H1_REG_ADDR_CABAC_TBL 0x0cc -#define H1_REG_ADDR_MV_OUT 0x0d0 -#define H1_REG_RGB_YUV_COEFF(i) (0x0d4 + ((i) * 0x4)) -#define H1_REG_RGB_MASK_MSB 0x0dc -#define H1_REG_INTRA_AREA_CTRL 0x0e0 -#define H1_REG_CIR_INTRA_CTRL 0x0e4 -#define H1_REG_INTRA_SLICE_BITMAP(i) (0x0e8 + ((i) * 0x4)) -#define H1_REG_ADDR_VP8_DCT_PART(i) (0x0e8 + ((i) * 0x4)) -#define H1_REG_FIRST_ROI_AREA 0x0f0 -#define H1_REG_SECOND_ROI_AREA 0x0f4 -#define H1_REG_MVC_CTRL 0x0f8 -#define H1_REG_MVC_CTRL_MV16X16_FAVOR(x) ((x) << 28) -#define H1_REG_VP8_INTRA_PENALTY(i) (0x100 + ((i) * 0x4)) -#define H1_REG_ADDR_VP8_SEG_MAP 0x11c -#define H1_REG_VP8_SEG_QP(i) (0x120 + ((i) * 0x4)) -#define H1_REG_DMV_4P_1P_PENALTY(i) (0x180 + ((i) * 0x4)) -#define H1_REG_DMV_4P_1P_PENALTY_BIT(x, i) ((x) << (i) * 8) -#define H1_REG_DMV_QPEL_PENALTY(i) (0x200 + ((i) * 0x4)) -#define H1_REG_DMV_QPEL_PENALTY_BIT(x, i) ((x) << (i) * 8) -#define H1_REG_VP8_CTRL1 0x280 -#define H1_REG_VP8_BIT_COST_GOLDEN 0x284 -#define H1_REG_VP8_LOOP_FLT_DELTA(i) (0x288 + ((i) * 0x4)) - -#endif /* HANTRO_H1_REGS_H_ */ diff --git a/drivers/staging/media/hantro/hantro_h264.c b/drivers/staging/media/hantro/hantro_h264.c deleted file mode 100644 index 4e9a0ecf5c13..000000000000 --- a/drivers/staging/media/hantro/hantro_h264.c +++ /dev/null @@ -1,521 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Rockchip RK3288 VPU codec driver - * - * Copyright (c) 2014 Rockchip Electronics Co., Ltd. - * Hertz Wong <hertz.wong@rock-chips.com> - * Herman Chen <herman.chen@rock-chips.com> - * - * Copyright (C) 2014 Google, Inc. - * Tomasz Figa <tfiga@chromium.org> - */ - -#include <linux/types.h> -#include <media/v4l2-h264.h> -#include <media/v4l2-mem2mem.h> - -#include "hantro.h" -#include "hantro_hw.h" - -/* Size with u32 units. */ -#define CABAC_INIT_BUFFER_SIZE (460 * 2) -#define POC_BUFFER_SIZE 34 -#define SCALING_LIST_SIZE (6 * 16 + 2 * 64) - -/* - * For valid and long term reference marking, index are reversed, so bit 31 - * indicates the status of the picture 0. - */ -#define REF_BIT(i) BIT(32 - 1 - (i)) - -/* Data structure describing auxiliary buffer format. */ -struct hantro_h264_dec_priv_tbl { - u32 cabac_table[CABAC_INIT_BUFFER_SIZE]; - u32 poc[POC_BUFFER_SIZE]; - u8 scaling_list[SCALING_LIST_SIZE]; -}; - -/* - * Constant CABAC table. - * From drivers/media/platform/rk3288-vpu/rk3288_vpu_hw_h264d.c - * in https://chromium.googlesource.com/chromiumos/third_party/kernel, - * chromeos-3.14 branch. - */ -static const u32 h264_cabac_table[] = { - 0x14f10236, 0x034a14f1, 0x0236034a, 0xe47fe968, 0xfa35ff36, 0x07330000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x0029003f, 0x003f003f, 0xf7530456, 0x0061f948, 0x0d29033e, 0x000b0137, - 0x0045ef7f, 0xf3660052, 0xf94aeb6b, 0xe57fe17f, 0xe87fee5f, 0xe57feb72, - 0xe27fef7b, 0xf473f07a, 0xf573f43f, 0xfe44f154, 0xf368fd46, 0xf85df65a, - 0xe27fff4a, 0xfa61f95b, 0xec7ffc38, 0xfb52f94c, 0xea7df95d, 0xf557fd4d, - 0xfb47fc3f, 0xfc44f454, 0xf93ef941, 0x083d0538, 0xfe420140, 0x003dfe4e, - 0x01320734, 0x0a23002c, 0x0b26012d, 0x002e052c, 0x1f110133, 0x07321c13, - 0x10210e3e, 0xf36cf164, 0xf365f35b, 0xf45ef658, 0xf054f656, 0xf953f357, - 0xed5e0146, 0x0048fb4a, 0x123bf866, 0xf164005f, 0xfc4b0248, 0xf54bfd47, - 0x0f2ef345, 0x003e0041, 0x1525f148, 0x09391036, 0x003e0c48, 0x18000f09, - 0x08190d12, 0x0f090d13, 0x0a250c12, 0x061d1421, 0x0f1e042d, 0x013a003e, - 0x073d0c26, 0x0b2d0f27, 0x0b2a0d2c, 0x102d0c29, 0x0a311e22, 0x122a0a37, - 0x1133112e, 0x00591aed, 0x16ef1aef, 0x1ee71cec, 0x21e925e5, 0x21e928e4, - 0x26ef21f5, 0x28f129fa, 0x26012911, 0x1efa1b03, 0x1a1625f0, 0x23fc26f8, - 0x26fd2503, 0x26052a00, 0x23102716, 0x0e301b25, 0x153c0c44, 0x0261fd47, - 0xfa2afb32, 0xfd36fe3e, 0x003a013f, 0xfe48ff4a, 0xf75bfb43, 0xfb1bfd27, - 0xfe2c002e, 0xf040f844, 0xf64efa4d, 0xf656f45c, 0xf137f63c, 0xfa3efc41, - 0xf449f84c, 0xf950f758, 0xef6ef561, 0xec54f54f, 0xfa49fc4a, 0xf356f360, - 0xf561ed75, 0xf84efb21, 0xfc30fe35, 0xfd3ef347, 0xf64ff456, 0xf35af261, - 0x0000fa5d, 0xfa54f84f, 0x0042ff47, 0x003efe3c, 0xfe3bfb4b, 0xfd3efc3a, - 0xf742ff4f, 0x00470344, 0x0a2cf93e, 0x0f240e28, 0x101b0c1d, 0x012c1424, - 0x1220052a, 0x01300a3e, 0x112e0940, 0xf468f561, 0xf060f958, 0xf855f955, - 0xf755f358, 0x0442fd4d, 0xfd4cfa4c, 0x0a3aff4c, 0xff53f963, 0xf25f025f, - 0x004cfb4a, 0x0046f54b, 0x01440041, 0xf249033e, 0x043eff44, 0xf34b0b37, - 0x05400c46, 0x0f060613, 0x07100c0e, 0x120d0d0b, 0x0d0f0f10, 0x0c170d17, - 0x0f140e1a, 0x0e2c1128, 0x112f1811, 0x15151916, 0x1f1b161d, 0x13230e32, - 0x0a39073f, 0xfe4dfc52, 0xfd5e0945, 0xf46d24dd, 0x24de20e6, 0x25e22ce0, - 0x22ee22f1, 0x28f121f9, 0x23fb2100, 0x2602210d, 0x17230d3a, 0x1dfd1a00, - 0x161e1ff9, 0x23f122fd, 0x220324ff, 0x2205200b, 0x2305220c, 0x270b1e1d, - 0x221a1d27, 0x13421f15, 0x1f1f1932, 0xef78ec70, 0xee72f555, 0xf15cf259, - 0xe647f151, 0xf2500044, 0xf246e838, 0xe944e832, 0xf54a17f3, 0x1af328f1, - 0x31f22c03, 0x2d062c22, 0x21361352, 0xfd4bff17, 0x0122012b, 0x0036fe37, - 0x003d0140, 0x0044f75c, 0xf26af361, 0xf15af45a, 0xee58f649, 0xf74ff256, - 0xf649f646, 0xf645fb42, 0xf740fb3a, 0x023b15f6, 0x18f51cf8, 0x1cff1d03, - 0x1d092314, 0x1d240e43, 0x14f10236, 0x034a14f1, 0x0236034a, 0xe47fe968, - 0xfa35ff36, 0x07331721, 0x17021500, 0x01090031, 0xdb760539, 0xf34ef541, - 0x013e0c31, 0xfc491132, 0x1240092b, 0x1d001a43, 0x105a0968, 0xd27fec68, - 0x0143f34e, 0xf541013e, 0xfa56ef5f, 0xfa3d092d, 0xfd45fa51, 0xf5600637, - 0x0743fb56, 0x0258003a, 0xfd4cf65e, 0x05360445, 0xfd510058, 0xf943fb4a, - 0xfc4afb50, 0xf948013a, 0x0029003f, 0x003f003f, 0xf7530456, 0x0061f948, - 0x0d29033e, 0x002dfc4e, 0xfd60e57e, 0xe462e765, 0xe943e452, 0xec5ef053, - 0xea6eeb5b, 0xee66f35d, 0xe37ff95c, 0xfb59f960, 0xf36cfd2e, 0xff41ff39, - 0xf75dfd4a, 0xf75cf857, 0xe97e0536, 0x063c063b, 0x0645ff30, 0x0044fc45, - 0xf858fe55, 0xfa4eff4b, 0xf94d0236, 0x0532fd44, 0x0132062a, 0xfc51013f, - 0xfc460043, 0x0239fe4c, 0x0b230440, 0x013d0b23, 0x12190c18, 0x0d1d0d24, - 0xf65df949, 0xfe490d2e, 0x0931f964, 0x09350235, 0x0535fe3d, 0x00380038, - 0xf33ffb3c, 0xff3e0439, 0xfa450439, 0x0e270433, 0x0d440340, 0x013d093f, - 0x07321027, 0x052c0434, 0x0b30fb3c, 0xff3b003b, 0x1621052c, 0x0e2bff4e, - 0x003c0945, 0x0b1c0228, 0x032c0031, 0x002e022c, 0x0233002f, 0x0427023e, - 0x062e0036, 0x0336023a, 0x043f0633, 0x06390735, 0x06340637, 0x0b2d0e24, - 0x0835ff52, 0x0737fd4e, 0x0f2e161f, 0xff541907, 0x1ef91c03, 0x1c042000, - 0x22ff1e06, 0x1e062009, 0x1f131a1b, 0x1a1e2514, 0x1c221146, 0x0143053b, - 0x0943101e, 0x12201223, 0x161d181f, 0x1726122b, 0x14290b3f, 0x093b0940, - 0xff5efe59, 0xf76cfa4c, 0xfe2c002d, 0x0034fd40, 0xfe3bfc46, 0xfc4bf852, - 0xef66f74d, 0x0318002a, 0x00300037, 0xfa3bf947, 0xf453f557, 0xe277013a, - 0xfd1dff24, 0x0126022b, 0xfa37003a, 0x0040fd4a, 0xf65a0046, 0xfc1d051f, - 0x072a013b, 0xfe3afd48, 0xfd51f561, 0x003a0805, 0x0a0e0e12, 0x0d1b0228, - 0x003afd46, 0xfa4ff855, 0x0000f36a, 0xf06af657, 0xeb72ee6e, 0xf262ea6e, - 0xeb6aee67, 0xeb6be96c, 0xe670f660, 0xf45ffb5b, 0xf75dea5e, 0xfb560943, - 0xfc50f655, 0xff46073c, 0x093a053d, 0x0c320f32, 0x12311136, 0x0a29072e, - 0xff330731, 0x08340929, 0x062f0237, 0x0d290a2c, 0x06320535, 0x0d31043f, - 0x0640fe45, 0xfe3b0646, 0x0a2c091f, 0x0c2b0335, 0x0e220a26, 0xfd340d28, - 0x1120072c, 0x07260d32, 0x0a391a2b, 0x0e0b0b0e, 0x090b120b, 0x150917fe, - 0x20f120f1, 0x22eb27e9, 0x2adf29e1, 0x2ee426f4, 0x151d2de8, 0x35d330e6, - 0x41d52bed, 0x27f61e09, 0x121a141b, 0x0039f252, 0xfb4bed61, 0xdd7d1b00, - 0x1c001ffc, 0x1b062208, 0x1e0a1816, 0x21131620, 0x1a1f1529, 0x1a2c172f, - 0x10410e47, 0x083c063f, 0x11411518, 0x17141a17, 0x1b201c17, 0x1c181728, - 0x18201c1d, 0x172a1339, 0x1635163d, 0x0b560c28, 0x0b330e3b, 0xfc4ff947, - 0xfb45f746, 0xf842f644, 0xed49f445, 0xf046f143, 0xec3eed46, 0xf042ea41, - 0xec3f09fe, 0x1af721f7, 0x27f929fe, 0x2d033109, 0x2d1b243b, 0xfa42f923, - 0xf92af82d, 0xfb30f438, 0xfa3cfb3e, 0xf842f84c, 0xfb55fa51, 0xf64df951, - 0xef50ee49, 0xfc4af653, 0xf747f743, 0xff3df842, 0xf242003b, 0x023b15f3, - 0x21f227f9, 0x2efe3302, 0x3c063d11, 0x37222a3e, 0x14f10236, 0x034a14f1, - 0x0236034a, 0xe47fe968, 0xfa35ff36, 0x07331619, 0x22001000, 0xfe090429, - 0xe3760241, 0xfa47f34f, 0x05340932, 0xfd460a36, 0x1a221316, 0x28003902, - 0x29241a45, 0xd37ff165, 0xfc4cfa47, 0xf34f0534, 0x0645f35a, 0x0034082b, - 0xfe45fb52, 0xf660023b, 0x024bfd57, 0xfd640138, 0xfd4afa55, 0x003bfd51, - 0xf956fb5f, 0xff42ff4d, 0x0146fe56, 0xfb48003d, 0x0029003f, 0x003f003f, - 0xf7530456, 0x0061f948, 0x0d29033e, 0x0d0f0733, 0x0250d97f, 0xee5bef60, - 0xe651dd62, 0xe866e961, 0xe577e863, 0xeb6eee66, 0xdc7f0050, 0xfb59f95e, - 0xfc5c0027, 0x0041f154, 0xdd7ffe49, 0xf468f75b, 0xe17f0337, 0x07380737, - 0x083dfd35, 0x0044f94a, 0xf758f367, 0xf35bf759, 0xf25cf84c, 0xf457e96e, - 0xe869f64e, 0xec70ef63, 0xb27fba7f, 0xce7fd27f, 0xfc42fb4e, 0xfc47f848, - 0x023bff37, 0xf946fa4b, 0xf859de77, 0xfd4b2014, 0x1e16d47f, 0x0036fb3d, - 0x003aff3c, 0xfd3df843, 0xe754f24a, 0xfb410534, 0x0239003d, 0xf745f546, - 0x1237fc47, 0x003a073d, 0x09291219, 0x0920052b, 0x092f002c, 0x0033022e, - 0x1326fc42, 0x0f260c2a, 0x09220059, 0x042d0a1c, 0x0a1f21f5, 0x34d5120f, - 0x1c0023ea, 0x26e72200, 0x27ee20f4, 0x66a20000, 0x38f121fc, 0x1d0a25fb, - 0x33e327f7, 0x34de45c6, 0x43c12cfb, 0x200737e3, 0x20010000, 0x1b2421e7, - 0x22e224e4, 0x26e426e5, 0x22ee23f0, 0x22f220f8, 0x25fa2300, 0x1e0a1c12, - 0x1a191d29, 0x004b0248, 0x084d0e23, 0x121f1123, 0x151e112d, 0x142a122d, - 0x1b1a1036, 0x07421038, 0x0b490a43, 0xf674e970, 0xf147f93d, 0x0035fb42, - 0xf54df750, 0xf754f657, 0xde7feb65, 0xfd27fb35, 0xf93df54b, 0xf14def5b, - 0xe76be76f, 0xe47af54c, 0xf62cf634, 0xf639f73a, 0xf048f945, 0xfc45fb4a, - 0xf7560242, 0xf7220120, 0x0b1f0534, 0xfe37fe43, 0x0049f859, 0x03340704, - 0x0a081108, 0x10130325, 0xff3dfb49, 0xff46fc4e, 0x0000eb7e, 0xe97cec6e, - 0xe67ee77c, 0xef69e579, 0xe575ef66, 0xe675e574, 0xdf7af65f, 0xf264f85f, - 0xef6fe472, 0xfa59fe50, 0xfc52f755, 0xf851ff48, 0x05400143, 0x09380045, - 0x01450745, 0xf945fa43, 0xf04dfe40, 0x023dfa43, 0xfd400239, 0xfd41fd42, - 0x003e0933, 0xff42fe47, 0xfe4bff46, 0xf7480e3c, 0x1025002f, 0x12230b25, - 0x0c290a29, 0x02300c29, 0x0d29003b, 0x03321328, 0x03421232, 0x13fa12fa, - 0x0e001af4, 0x1ff021e7, 0x21ea25e4, 0x27e22ae2, 0x2fd62ddc, 0x31de29ef, - 0x200945b9, 0x3fc142c0, 0x4db636d9, 0x34dd29f6, 0x240028ff, 0x1e0e1c1a, - 0x17250c37, 0x0b4125df, 0x27dc28db, 0x26e22edf, 0x2ae228e8, 0x31e326f4, - 0x28f626fd, 0x2efb1f14, 0x1d1e192c, 0x0c300b31, 0x1a2d1616, 0x17161b15, - 0x21141a1c, 0x1e181b22, 0x122a1927, 0x12320c46, 0x15360e47, 0x0b531920, - 0x15311536, 0xfb55fa51, 0xf64df951, 0xef50ee49, 0xfc4af653, 0xf747f743, - 0xff3df842, 0xf242003b, 0x023b11f6, 0x20f32af7, 0x31fb3500, 0x4003440a, - 0x421b2f39, 0xfb470018, 0xff24fe2a, 0xfe34f739, 0xfa3ffc41, 0xfc43f952, - 0xfd51fd4c, 0xf948fa4e, 0xf448f244, 0xfd46fa4c, 0xfb42fb3e, 0x0039fc3d, - 0xf73c0136, 0x023a11f6, 0x20f32af7, 0x31fb3500, 0x4003440a, 0x421b2f39, - 0x14f10236, 0x034a14f1, 0x0236034a, 0xe47fe968, 0xfa35ff36, 0x07331d10, - 0x19000e00, 0xf633fd3e, 0xe5631a10, 0xfc55e866, 0x05390639, 0xef490e39, - 0x1428140a, 0x1d003600, 0x252a0c61, 0xe07fea75, 0xfe4afc55, 0xe8660539, - 0xfa5df258, 0xfa2c0437, 0xf559f167, 0xeb741339, 0x143a0454, 0x0660013f, - 0xfb55f36a, 0x053f064b, 0xfd5aff65, 0x0337fc4f, 0xfe4bf461, 0xf932013c, - 0x0029003f, 0x003f003f, 0xf7530456, 0x0061f948, 0x0d29033e, 0x0722f758, - 0xec7fdc7f, 0xef5bf25f, 0xe754e756, 0xf459ef5b, 0xe17ff24c, 0xee67f35a, - 0xdb7f0b50, 0x054c0254, 0x054efa37, 0x043df253, 0xdb7ffb4f, 0xf568f55b, - 0xe27f0041, 0xfe4f0048, 0xfc5cfa38, 0x0344f847, 0xf362fc56, 0xf458fb52, - 0xfd48fc43, 0xf848f059, 0xf745ff3b, 0x05420439, 0xfc47fe47, 0x023aff4a, - 0xfc2cff45, 0x003ef933, 0xfc2ffa2a, 0xfd29fa35, 0x084cf74e, 0xf5530934, - 0x0043fb5a, 0x0143f148, 0xfb4bf850, 0xeb53eb40, 0xf31fe740, 0xe35e094b, - 0x113ff84a, 0xfb23fe1b, 0x0d5b0341, 0xf945084d, 0xf642033e, 0xfd44ec51, - 0x001e0107, 0xfd17eb4a, 0x1042e97c, 0x11252cee, 0x32deea7f, 0x0427002a, - 0x07220b1d, 0x081f0625, 0x072a0328, 0x08210d2b, 0x0d24042f, 0x0337023a, - 0x063c082c, 0x0b2c0e2a, 0x07300438, 0x04340d25, 0x0931133a, 0x0a300c2d, - 0x00451421, 0x083f23ee, 0x21e71cfd, 0x180a1b00, 0x22f234d4, 0x27e81311, - 0x1f19241d, 0x1821220f, 0x1e141649, 0x1422131f, 0x1b2c1310, 0x0f240f24, - 0x151c1915, 0x1e141f0c, 0x1b10182a, 0x005d0e38, 0x0f391a26, 0xe87fe873, - 0xea52f73e, 0x0035003b, 0xf255f359, 0xf35ef55c, 0xe37feb64, 0xf239f443, - 0xf547f64d, 0xeb55f058, 0xe968f162, 0xdb7ff652, 0xf830f83d, 0xf842f946, - 0xf24bf64f, 0xf753f45c, 0xee6cfc4f, 0xea45f04b, 0xfe3a013a, 0xf34ef753, - 0xfc51f363, 0xf351fa26, 0xf33efa3a, 0xfe3bf049, 0xf64cf356, 0xf753f657, - 0x0000ea7f, 0xe77fe778, 0xe57fed72, 0xe975e776, 0xe675e871, 0xe476e178, - 0xdb7cf65e, 0xf166f663, 0xf36ace7f, 0xfb5c1139, 0xfb56f35e, 0xf45bfe4d, - 0x0047ff49, 0x0440f951, 0x05400f39, 0x01430044, 0xf6430144, 0x004d0240, - 0x0044fb4e, 0x0737053b, 0x02410e36, 0x0f2c053c, 0x0246fe4c, 0xee560c46, - 0x0540f446, 0x0b370538, 0x00450241, 0xfa4a0536, 0x0736fa4c, 0xf552fe4d, - 0xfe4d192a, 0x11f310f7, 0x11f41beb, 0x25e229d8, 0x2ad730d1, 0x27e02ed8, - 0x34cd2ed7, 0x34d92bed, 0x200b3dc9, 0x38d23ece, 0x51bd2dec, 0x23fe1c0f, - 0x22012701, 0x1e111426, 0x122d0f36, 0x004f24f0, 0x25f225ef, 0x2001220f, - 0x1d0f1819, 0x22161f10, 0x23121f1c, 0x2129241c, 0x1b2f153e, 0x121f131a, - 0x24181817, 0x1b10181e, 0x1f1d1629, 0x162a103c, 0x0f340e3c, 0x034ef07b, - 0x15351638, 0x193d1521, 0x1332113d, 0xfd4ef84a, 0xf748f648, 0xee4bf447, - 0xf53ffb46, 0xef4bf248, 0xf043f835, 0xf23bf734, 0xf54409fe, 0x1ef61ffc, - 0x21ff2107, 0x1f0c2517, 0x1f261440, 0xf747f925, 0xf82cf531, 0xf638f43b, - 0xf83ff743, 0xfa44f64f, 0xfd4ef84a, 0xf748f648, 0xee4bf447, 0xf53ffb46, - 0xef4bf248, 0xf043f835, 0xf23bf734, 0xf54409fe, 0x1ef61ffc, 0x21ff2107, - 0x1f0c2517, 0x1f261440 -}; - -static void -assemble_scaling_list(struct hantro_ctx *ctx) -{ - const struct hantro_h264_dec_ctrls *ctrls = &ctx->h264_dec.ctrls; - const struct v4l2_ctrl_h264_scaling_matrix *scaling = ctrls->scaling; - const struct v4l2_ctrl_h264_pps *pps = ctrls->pps; - const size_t num_list_4x4 = ARRAY_SIZE(scaling->scaling_list_4x4); - const size_t list_len_4x4 = ARRAY_SIZE(scaling->scaling_list_4x4[0]); - const size_t list_len_8x8 = ARRAY_SIZE(scaling->scaling_list_8x8[0]); - struct hantro_h264_dec_priv_tbl *tbl = ctx->h264_dec.priv.cpu; - u32 *dst = (u32 *)tbl->scaling_list; - const u32 *src; - int i, j; - - if (!(pps->flags & V4L2_H264_PPS_FLAG_SCALING_MATRIX_PRESENT)) - return; - - for (i = 0; i < num_list_4x4; i++) { - src = (u32 *)&scaling->scaling_list_4x4[i]; - for (j = 0; j < list_len_4x4 / 4; j++) - *dst++ = swab32(src[j]); - } - - /* Only Intra/Inter Y lists */ - for (i = 0; i < 2; i++) { - src = (u32 *)&scaling->scaling_list_8x8[i]; - for (j = 0; j < list_len_8x8 / 4; j++) - *dst++ = swab32(src[j]); - } -} - -static void prepare_table(struct hantro_ctx *ctx) -{ - const struct hantro_h264_dec_ctrls *ctrls = &ctx->h264_dec.ctrls; - const struct v4l2_ctrl_h264_decode_params *dec_param = ctrls->decode; - const struct v4l2_ctrl_h264_sps *sps = ctrls->sps; - struct hantro_h264_dec_priv_tbl *tbl = ctx->h264_dec.priv.cpu; - const struct v4l2_h264_dpb_entry *dpb = ctx->h264_dec.dpb; - u32 dpb_longterm = 0; - u32 dpb_valid = 0; - int i; - - for (i = 0; i < HANTRO_H264_DPB_SIZE; ++i) { - tbl->poc[i * 2] = dpb[i].top_field_order_cnt; - tbl->poc[i * 2 + 1] = dpb[i].bottom_field_order_cnt; - - if (!(dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_VALID)) - continue; - - /* - * Set up bit maps of valid and long term DPBs. - * NOTE: The bits are reversed, i.e. MSb is DPB 0. For frame - * decoding, bit 31 to 15 are used, while for field decoding, - * all bits are used, with bit 31 being a top field, 30 a bottom - * field and so on. - */ - if (dec_param->flags & V4L2_H264_DECODE_PARAM_FLAG_FIELD_PIC) { - if (dpb[i].fields & V4L2_H264_TOP_FIELD_REF) - dpb_valid |= REF_BIT(i * 2); - - if (dpb[i].fields & V4L2_H264_BOTTOM_FIELD_REF) - dpb_valid |= REF_BIT(i * 2 + 1); - - if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM) { - dpb_longterm |= REF_BIT(i * 2); - dpb_longterm |= REF_BIT(i * 2 + 1); - } - } else { - dpb_valid |= REF_BIT(i); - - if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM) - dpb_longterm |= REF_BIT(i); - } - } - ctx->h264_dec.dpb_valid = dpb_valid; - ctx->h264_dec.dpb_longterm = dpb_longterm; - - if ((dec_param->flags & V4L2_H264_DECODE_PARAM_FLAG_FIELD_PIC) || - !(sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD)) { - tbl->poc[32] = ctx->h264_dec.cur_poc; - tbl->poc[33] = 0; - } else { - tbl->poc[32] = dec_param->top_field_order_cnt; - tbl->poc[33] = dec_param->bottom_field_order_cnt; - } - - assemble_scaling_list(ctx); -} - -static bool dpb_entry_match(const struct v4l2_h264_dpb_entry *a, - const struct v4l2_h264_dpb_entry *b) -{ - return a->reference_ts == b->reference_ts; -} - -static void update_dpb(struct hantro_ctx *ctx) -{ - const struct v4l2_ctrl_h264_decode_params *dec_param; - DECLARE_BITMAP(new, ARRAY_SIZE(dec_param->dpb)) = { 0, }; - DECLARE_BITMAP(used, ARRAY_SIZE(dec_param->dpb)) = { 0, }; - unsigned int i, j; - - dec_param = ctx->h264_dec.ctrls.decode; - - /* Disable all entries by default. */ - for (i = 0; i < ARRAY_SIZE(ctx->h264_dec.dpb); i++) - ctx->h264_dec.dpb[i].flags = 0; - - /* Try to match new DPB entries with existing ones by their POCs. */ - for (i = 0; i < ARRAY_SIZE(dec_param->dpb); i++) { - const struct v4l2_h264_dpb_entry *ndpb = &dec_param->dpb[i]; - - if (!(ndpb->flags & V4L2_H264_DPB_ENTRY_FLAG_VALID)) - continue; - - /* - * To cut off some comparisons, iterate only on target DPB - * entries which are not used yet. - */ - for_each_clear_bit(j, used, ARRAY_SIZE(ctx->h264_dec.dpb)) { - struct v4l2_h264_dpb_entry *cdpb; - - cdpb = &ctx->h264_dec.dpb[j]; - if (!dpb_entry_match(cdpb, ndpb)) - continue; - - *cdpb = *ndpb; - set_bit(j, used); - break; - } - - if (j == ARRAY_SIZE(ctx->h264_dec.dpb)) - set_bit(i, new); - } - - /* For entries that could not be matched, use remaining free slots. */ - for_each_set_bit(i, new, ARRAY_SIZE(dec_param->dpb)) { - const struct v4l2_h264_dpb_entry *ndpb = &dec_param->dpb[i]; - struct v4l2_h264_dpb_entry *cdpb; - - /* - * Both arrays are of the same sizes, so there is no way - * we can end up with no space in target array, unless - * something is buggy. - */ - j = find_first_zero_bit(used, ARRAY_SIZE(ctx->h264_dec.dpb)); - if (WARN_ON(j >= ARRAY_SIZE(ctx->h264_dec.dpb))) - return; - - cdpb = &ctx->h264_dec.dpb[j]; - *cdpb = *ndpb; - set_bit(j, used); - } -} - -dma_addr_t hantro_h264_get_ref_buf(struct hantro_ctx *ctx, - unsigned int dpb_idx) -{ - struct v4l2_h264_dpb_entry *dpb = ctx->h264_dec.dpb; - dma_addr_t dma_addr = 0; - s32 cur_poc = ctx->h264_dec.cur_poc; - u32 flags; - - if (dpb[dpb_idx].flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE) - dma_addr = hantro_get_ref(ctx, dpb[dpb_idx].reference_ts); - - if (!dma_addr) { - struct vb2_v4l2_buffer *dst_buf; - struct vb2_buffer *buf; - - /* - * If a DPB entry is unused or invalid, address of current - * destination buffer is returned. - */ - dst_buf = hantro_get_dst_buf(ctx); - buf = &dst_buf->vb2_buf; - dma_addr = hantro_get_dec_buf_addr(ctx, buf); - } - - flags = dpb[dpb_idx].flags & V4L2_H264_DPB_ENTRY_FLAG_FIELD ? 0x2 : 0; - flags |= abs(dpb[dpb_idx].top_field_order_cnt - cur_poc) < - abs(dpb[dpb_idx].bottom_field_order_cnt - cur_poc) ? - 0x1 : 0; - - return dma_addr | flags; -} - -u16 hantro_h264_get_ref_nbr(struct hantro_ctx *ctx, unsigned int dpb_idx) -{ - const struct v4l2_h264_dpb_entry *dpb = &ctx->h264_dec.dpb[dpb_idx]; - - if (!(dpb->flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE)) - return 0; - return dpb->frame_num; -} - -/* - * Removes all references with the same parity as the current picture from the - * reference list. The remaining list will have references with the opposite - * parity. This is effectively a deduplication of references since each buffer - * stores two fields. For this reason, each buffer is found twice in the - * reference list. - * - * This technique has been chosen through trial and error. This simple approach - * resulted in the highest conformance score. Note that this method may suffer - * worse quality in the case an opposite reference frame has been lost. If this - * becomes a problem in the future, it should be possible to add a preprocessing - * to identify un-paired fields and avoid removing them. - */ -static void deduplicate_reflist(struct v4l2_h264_reflist_builder *b, - struct v4l2_h264_reference *reflist) -{ - int write_idx = 0; - int i; - - if (b->cur_pic_fields == V4L2_H264_FRAME_REF) { - write_idx = b->num_valid; - goto done; - } - - for (i = 0; i < b->num_valid; i++) { - if (!(b->cur_pic_fields == reflist[i].fields)) { - reflist[write_idx++] = reflist[i]; - continue; - } - } - -done: - /* Should not happen unless we have a bug in the reflist builder. */ - if (WARN_ON(write_idx > 16)) - write_idx = 16; - - /* Clear the remaining, some streams fails otherwise */ - for (; write_idx < 16; write_idx++) - reflist[write_idx].index = 15; -} - -int hantro_h264_dec_prepare_run(struct hantro_ctx *ctx) -{ - struct hantro_h264_dec_hw_ctx *h264_ctx = &ctx->h264_dec; - struct hantro_h264_dec_ctrls *ctrls = &h264_ctx->ctrls; - struct v4l2_h264_reflist_builder reflist_builder; - - hantro_start_prepare_run(ctx); - - ctrls->scaling = - hantro_get_ctrl(ctx, V4L2_CID_STATELESS_H264_SCALING_MATRIX); - if (WARN_ON(!ctrls->scaling)) - return -EINVAL; - - ctrls->decode = - hantro_get_ctrl(ctx, V4L2_CID_STATELESS_H264_DECODE_PARAMS); - if (WARN_ON(!ctrls->decode)) - return -EINVAL; - - ctrls->sps = - hantro_get_ctrl(ctx, V4L2_CID_STATELESS_H264_SPS); - if (WARN_ON(!ctrls->sps)) - return -EINVAL; - - ctrls->pps = - hantro_get_ctrl(ctx, V4L2_CID_STATELESS_H264_PPS); - if (WARN_ON(!ctrls->pps)) - return -EINVAL; - - /* Update the DPB with new refs. */ - update_dpb(ctx); - - /* Build the P/B{0,1} ref lists. */ - v4l2_h264_init_reflist_builder(&reflist_builder, ctrls->decode, - ctrls->sps, ctx->h264_dec.dpb); - h264_ctx->cur_poc = reflist_builder.cur_pic_order_count; - - /* Prepare data in memory. */ - prepare_table(ctx); - - v4l2_h264_build_p_ref_list(&reflist_builder, h264_ctx->reflists.p); - v4l2_h264_build_b_ref_lists(&reflist_builder, h264_ctx->reflists.b0, - h264_ctx->reflists.b1); - - /* - * Reduce ref lists to at most 16 entries, Hantro hardware will deduce - * the actual picture lists in field through the dpb_valid, - * dpb_longterm bitmap along with the current frame parity. - */ - if (reflist_builder.cur_pic_fields != V4L2_H264_FRAME_REF) { - deduplicate_reflist(&reflist_builder, h264_ctx->reflists.p); - deduplicate_reflist(&reflist_builder, h264_ctx->reflists.b0); - deduplicate_reflist(&reflist_builder, h264_ctx->reflists.b1); - } - - return 0; -} - -void hantro_h264_dec_exit(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - struct hantro_h264_dec_hw_ctx *h264_dec = &ctx->h264_dec; - struct hantro_aux_buf *priv = &h264_dec->priv; - - dma_free_coherent(vpu->dev, priv->size, priv->cpu, priv->dma); -} - -int hantro_h264_dec_init(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - struct hantro_h264_dec_hw_ctx *h264_dec = &ctx->h264_dec; - struct hantro_aux_buf *priv = &h264_dec->priv; - struct hantro_h264_dec_priv_tbl *tbl; - - priv->cpu = dma_alloc_coherent(vpu->dev, sizeof(*tbl), &priv->dma, - GFP_KERNEL); - if (!priv->cpu) - return -ENOMEM; - - priv->size = sizeof(*tbl); - tbl = priv->cpu; - memcpy(tbl->cabac_table, h264_cabac_table, sizeof(tbl->cabac_table)); - - return 0; -} diff --git a/drivers/staging/media/hantro/hantro_hevc.c b/drivers/staging/media/hantro/hantro_hevc.c deleted file mode 100644 index b990bc98164c..000000000000 --- a/drivers/staging/media/hantro/hantro_hevc.c +++ /dev/null @@ -1,284 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Hantro VPU HEVC codec driver - * - * Copyright (C) 2020 Safran Passenger Innovations LLC - */ - -#include <linux/types.h> -#include <media/v4l2-mem2mem.h> - -#include "hantro.h" -#include "hantro_hw.h" - -#define VERT_FILTER_RAM_SIZE 8 /* bytes per pixel row */ -/* - * BSD control data of current picture at tile border - * 128 bits per 4x4 tile = 128/(8*4) bytes per row - */ -#define BSD_CTRL_RAM_SIZE 4 /* bytes per pixel row */ -/* tile border coefficients of filter */ -#define VERT_SAO_RAM_SIZE 48 /* bytes per pixel */ - -#define SCALING_LIST_SIZE (16 * 64) - -#define MAX_TILE_COLS 20 -#define MAX_TILE_ROWS 22 - -void hantro_hevc_ref_init(struct hantro_ctx *ctx) -{ - struct hantro_hevc_dec_hw_ctx *hevc_dec = &ctx->hevc_dec; - - hevc_dec->ref_bufs_used = 0; -} - -dma_addr_t hantro_hevc_get_ref_buf(struct hantro_ctx *ctx, - s32 poc) -{ - struct hantro_hevc_dec_hw_ctx *hevc_dec = &ctx->hevc_dec; - int i; - - /* Find the reference buffer in already known ones */ - for (i = 0; i < NUM_REF_PICTURES; i++) { - if (hevc_dec->ref_bufs_poc[i] == poc) { - hevc_dec->ref_bufs_used |= 1 << i; - return hevc_dec->ref_bufs[i].dma; - } - } - - return 0; -} - -int hantro_hevc_add_ref_buf(struct hantro_ctx *ctx, int poc, dma_addr_t addr) -{ - struct hantro_hevc_dec_hw_ctx *hevc_dec = &ctx->hevc_dec; - int i; - - /* Add a new reference buffer */ - for (i = 0; i < NUM_REF_PICTURES; i++) { - if (!(hevc_dec->ref_bufs_used & 1 << i)) { - hevc_dec->ref_bufs_used |= 1 << i; - hevc_dec->ref_bufs_poc[i] = poc; - hevc_dec->ref_bufs[i].dma = addr; - return 0; - } - } - - return -EINVAL; -} - -static int tile_buffer_reallocate(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - struct hantro_hevc_dec_hw_ctx *hevc_dec = &ctx->hevc_dec; - const struct hantro_hevc_dec_ctrls *ctrls = &ctx->hevc_dec.ctrls; - const struct v4l2_ctrl_hevc_pps *pps = ctrls->pps; - const struct v4l2_ctrl_hevc_sps *sps = ctrls->sps; - unsigned int num_tile_cols = pps->num_tile_columns_minus1 + 1; - unsigned int height64 = (sps->pic_height_in_luma_samples + 63) & ~63; - unsigned int size; - - if (num_tile_cols <= 1 || - num_tile_cols <= hevc_dec->num_tile_cols_allocated) - return 0; - - /* Need to reallocate due to tiles passed via PPS */ - if (hevc_dec->tile_filter.cpu) { - dma_free_coherent(vpu->dev, hevc_dec->tile_filter.size, - hevc_dec->tile_filter.cpu, - hevc_dec->tile_filter.dma); - hevc_dec->tile_filter.cpu = NULL; - } - - if (hevc_dec->tile_sao.cpu) { - dma_free_coherent(vpu->dev, hevc_dec->tile_sao.size, - hevc_dec->tile_sao.cpu, - hevc_dec->tile_sao.dma); - hevc_dec->tile_sao.cpu = NULL; - } - - if (hevc_dec->tile_bsd.cpu) { - dma_free_coherent(vpu->dev, hevc_dec->tile_bsd.size, - hevc_dec->tile_bsd.cpu, - hevc_dec->tile_bsd.dma); - hevc_dec->tile_bsd.cpu = NULL; - } - - size = VERT_FILTER_RAM_SIZE * height64 * (num_tile_cols - 1); - hevc_dec->tile_filter.cpu = dma_alloc_coherent(vpu->dev, size, - &hevc_dec->tile_filter.dma, - GFP_KERNEL); - if (!hevc_dec->tile_filter.cpu) - goto err_free_tile_buffers; - hevc_dec->tile_filter.size = size; - - size = VERT_SAO_RAM_SIZE * height64 * (num_tile_cols - 1); - hevc_dec->tile_sao.cpu = dma_alloc_coherent(vpu->dev, size, - &hevc_dec->tile_sao.dma, - GFP_KERNEL); - if (!hevc_dec->tile_sao.cpu) - goto err_free_tile_buffers; - hevc_dec->tile_sao.size = size; - - size = BSD_CTRL_RAM_SIZE * height64 * (num_tile_cols - 1); - hevc_dec->tile_bsd.cpu = dma_alloc_coherent(vpu->dev, size, - &hevc_dec->tile_bsd.dma, - GFP_KERNEL); - if (!hevc_dec->tile_bsd.cpu) - goto err_free_tile_buffers; - hevc_dec->tile_bsd.size = size; - - hevc_dec->num_tile_cols_allocated = num_tile_cols; - - return 0; - -err_free_tile_buffers: - if (hevc_dec->tile_filter.cpu) - dma_free_coherent(vpu->dev, hevc_dec->tile_filter.size, - hevc_dec->tile_filter.cpu, - hevc_dec->tile_filter.dma); - hevc_dec->tile_filter.cpu = NULL; - - if (hevc_dec->tile_sao.cpu) - dma_free_coherent(vpu->dev, hevc_dec->tile_sao.size, - hevc_dec->tile_sao.cpu, - hevc_dec->tile_sao.dma); - hevc_dec->tile_sao.cpu = NULL; - - if (hevc_dec->tile_bsd.cpu) - dma_free_coherent(vpu->dev, hevc_dec->tile_bsd.size, - hevc_dec->tile_bsd.cpu, - hevc_dec->tile_bsd.dma); - hevc_dec->tile_bsd.cpu = NULL; - - return -ENOMEM; -} - -static int hantro_hevc_validate_sps(struct hantro_ctx *ctx, const struct v4l2_ctrl_hevc_sps *sps) -{ - /* - * for tile pixel format check if the width and height match - * hardware constraints - */ - if (ctx->vpu_dst_fmt->fourcc == V4L2_PIX_FMT_NV12_4L4) { - if (ctx->dst_fmt.width != - ALIGN(sps->pic_width_in_luma_samples, ctx->vpu_dst_fmt->frmsize.step_width)) - return -EINVAL; - - if (ctx->dst_fmt.height != - ALIGN(sps->pic_height_in_luma_samples, ctx->vpu_dst_fmt->frmsize.step_height)) - return -EINVAL; - } - - return 0; -} - -int hantro_hevc_dec_prepare_run(struct hantro_ctx *ctx) -{ - struct hantro_hevc_dec_hw_ctx *hevc_ctx = &ctx->hevc_dec; - struct hantro_hevc_dec_ctrls *ctrls = &hevc_ctx->ctrls; - int ret; - - hantro_start_prepare_run(ctx); - - ctrls->decode_params = - hantro_get_ctrl(ctx, V4L2_CID_STATELESS_HEVC_DECODE_PARAMS); - if (WARN_ON(!ctrls->decode_params)) - return -EINVAL; - - ctrls->scaling = - hantro_get_ctrl(ctx, V4L2_CID_STATELESS_HEVC_SCALING_MATRIX); - if (WARN_ON(!ctrls->scaling)) - return -EINVAL; - - ctrls->sps = - hantro_get_ctrl(ctx, V4L2_CID_STATELESS_HEVC_SPS); - if (WARN_ON(!ctrls->sps)) - return -EINVAL; - - ret = hantro_hevc_validate_sps(ctx, ctrls->sps); - if (ret) - return ret; - - ctrls->pps = - hantro_get_ctrl(ctx, V4L2_CID_STATELESS_HEVC_PPS); - if (WARN_ON(!ctrls->pps)) - return -EINVAL; - - ret = tile_buffer_reallocate(ctx); - if (ret) - return ret; - - return 0; -} - -void hantro_hevc_dec_exit(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - struct hantro_hevc_dec_hw_ctx *hevc_dec = &ctx->hevc_dec; - - if (hevc_dec->tile_sizes.cpu) - dma_free_coherent(vpu->dev, hevc_dec->tile_sizes.size, - hevc_dec->tile_sizes.cpu, - hevc_dec->tile_sizes.dma); - hevc_dec->tile_sizes.cpu = NULL; - - if (hevc_dec->scaling_lists.cpu) - dma_free_coherent(vpu->dev, hevc_dec->scaling_lists.size, - hevc_dec->scaling_lists.cpu, - hevc_dec->scaling_lists.dma); - hevc_dec->scaling_lists.cpu = NULL; - - if (hevc_dec->tile_filter.cpu) - dma_free_coherent(vpu->dev, hevc_dec->tile_filter.size, - hevc_dec->tile_filter.cpu, - hevc_dec->tile_filter.dma); - hevc_dec->tile_filter.cpu = NULL; - - if (hevc_dec->tile_sao.cpu) - dma_free_coherent(vpu->dev, hevc_dec->tile_sao.size, - hevc_dec->tile_sao.cpu, - hevc_dec->tile_sao.dma); - hevc_dec->tile_sao.cpu = NULL; - - if (hevc_dec->tile_bsd.cpu) - dma_free_coherent(vpu->dev, hevc_dec->tile_bsd.size, - hevc_dec->tile_bsd.cpu, - hevc_dec->tile_bsd.dma); - hevc_dec->tile_bsd.cpu = NULL; -} - -int hantro_hevc_dec_init(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - struct hantro_hevc_dec_hw_ctx *hevc_dec = &ctx->hevc_dec; - unsigned int size; - - memset(hevc_dec, 0, sizeof(*hevc_dec)); - - /* - * Maximum number of tiles times width and height (2 bytes each), - * rounding up to next 16 bytes boundary + one extra 16 byte - * chunk (HW guys wanted to have this). - */ - size = round_up(MAX_TILE_COLS * MAX_TILE_ROWS * 4 * sizeof(u16) + 16, 16); - hevc_dec->tile_sizes.cpu = dma_alloc_coherent(vpu->dev, size, - &hevc_dec->tile_sizes.dma, - GFP_KERNEL); - if (!hevc_dec->tile_sizes.cpu) - return -ENOMEM; - - hevc_dec->tile_sizes.size = size; - - hevc_dec->scaling_lists.cpu = dma_alloc_coherent(vpu->dev, SCALING_LIST_SIZE, - &hevc_dec->scaling_lists.dma, - GFP_KERNEL); - if (!hevc_dec->scaling_lists.cpu) - return -ENOMEM; - - hevc_dec->scaling_lists.size = SCALING_LIST_SIZE; - - hantro_hevc_ref_init(ctx); - - return 0; -} diff --git a/drivers/staging/media/hantro/hantro_hw.h b/drivers/staging/media/hantro/hantro_hw.h deleted file mode 100644 index e83f0c523a30..000000000000 --- a/drivers/staging/media/hantro/hantro_hw.h +++ /dev/null @@ -1,441 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Hantro VPU codec driver - * - * Copyright 2018 Google LLC. - * Tomasz Figa <tfiga@chromium.org> - */ - -#ifndef HANTRO_HW_H_ -#define HANTRO_HW_H_ - -#include <linux/interrupt.h> -#include <linux/v4l2-controls.h> -#include <media/v4l2-ctrls.h> -#include <media/v4l2-vp9.h> -#include <media/videobuf2-core.h> - -#define DEC_8190_ALIGN_MASK 0x07U - -#define MB_DIM 16 -#define TILE_MB_DIM 4 -#define MB_WIDTH(w) DIV_ROUND_UP(w, MB_DIM) -#define MB_HEIGHT(h) DIV_ROUND_UP(h, MB_DIM) - -#define FMT_MIN_WIDTH 48 -#define FMT_MIN_HEIGHT 48 -#define FMT_HD_WIDTH 1280 -#define FMT_HD_HEIGHT 720 -#define FMT_FHD_WIDTH 1920 -#define FMT_FHD_HEIGHT 1088 -#define FMT_UHD_WIDTH 3840 -#define FMT_UHD_HEIGHT 2160 -#define FMT_4K_WIDTH 4096 -#define FMT_4K_HEIGHT 2304 - -#define NUM_REF_PICTURES (V4L2_HEVC_DPB_ENTRIES_NUM_MAX + 1) - -struct hantro_dev; -struct hantro_ctx; -struct hantro_buf; -struct hantro_variant; - -/** - * struct hantro_aux_buf - auxiliary DMA buffer for hardware data - * - * @cpu: CPU pointer to the buffer. - * @dma: DMA address of the buffer. - * @size: Size of the buffer. - * @attrs: Attributes of the DMA mapping. - */ -struct hantro_aux_buf { - void *cpu; - dma_addr_t dma; - size_t size; - unsigned long attrs; -}; - -/* Max. number of entries in the DPB (HW limitation). */ -#define HANTRO_H264_DPB_SIZE 16 - -/** - * struct hantro_h264_dec_ctrls - * - * @decode: Decode params - * @scaling: Scaling info - * @sps: SPS info - * @pps: PPS info - */ -struct hantro_h264_dec_ctrls { - const struct v4l2_ctrl_h264_decode_params *decode; - const struct v4l2_ctrl_h264_scaling_matrix *scaling; - const struct v4l2_ctrl_h264_sps *sps; - const struct v4l2_ctrl_h264_pps *pps; -}; - -/** - * struct hantro_h264_dec_reflists - * - * @p: P reflist - * @b0: B0 reflist - * @b1: B1 reflist - */ -struct hantro_h264_dec_reflists { - struct v4l2_h264_reference p[V4L2_H264_REF_LIST_LEN]; - struct v4l2_h264_reference b0[V4L2_H264_REF_LIST_LEN]; - struct v4l2_h264_reference b1[V4L2_H264_REF_LIST_LEN]; -}; - -/** - * struct hantro_h264_dec_hw_ctx - * - * @priv: Private auxiliary buffer for hardware. - * @dpb: DPB - * @reflists: P/B0/B1 reflists - * @ctrls: V4L2 controls attached to a run - * @dpb_longterm: DPB long-term - * @dpb_valid: DPB valid - * @cur_poc: Current picture order count - */ -struct hantro_h264_dec_hw_ctx { - struct hantro_aux_buf priv; - struct v4l2_h264_dpb_entry dpb[HANTRO_H264_DPB_SIZE]; - struct hantro_h264_dec_reflists reflists; - struct hantro_h264_dec_ctrls ctrls; - u32 dpb_longterm; - u32 dpb_valid; - s32 cur_poc; -}; - -/** - * struct hantro_hevc_dec_ctrls - * @decode_params: Decode params - * @scaling: Scaling matrix - * @sps: SPS info - * @pps: PPS info - * @hevc_hdr_skip_length: the number of data (in bits) to skip in the - * slice segment header syntax after 'slice type' - * token - */ -struct hantro_hevc_dec_ctrls { - const struct v4l2_ctrl_hevc_decode_params *decode_params; - const struct v4l2_ctrl_hevc_scaling_matrix *scaling; - const struct v4l2_ctrl_hevc_sps *sps; - const struct v4l2_ctrl_hevc_pps *pps; - u32 hevc_hdr_skip_length; -}; - -/** - * struct hantro_hevc_dec_hw_ctx - * @tile_sizes: Tile sizes buffer - * @tile_filter: Tile vertical filter buffer - * @tile_sao: Tile SAO buffer - * @tile_bsd: Tile BSD control buffer - * @ref_bufs: Internal reference buffers - * @scaling_lists: Scaling lists buffer - * @ref_bufs_poc: Internal reference buffers picture order count - * @ref_bufs_used: Bitfield of used reference buffers - * @ctrls: V4L2 controls attached to a run - * @num_tile_cols_allocated: number of allocated tiles - */ -struct hantro_hevc_dec_hw_ctx { - struct hantro_aux_buf tile_sizes; - struct hantro_aux_buf tile_filter; - struct hantro_aux_buf tile_sao; - struct hantro_aux_buf tile_bsd; - struct hantro_aux_buf ref_bufs[NUM_REF_PICTURES]; - struct hantro_aux_buf scaling_lists; - s32 ref_bufs_poc[NUM_REF_PICTURES]; - u32 ref_bufs_used; - struct hantro_hevc_dec_ctrls ctrls; - unsigned int num_tile_cols_allocated; -}; - -/** - * struct hantro_mpeg2_dec_hw_ctx - * - * @qtable: Quantization table - */ -struct hantro_mpeg2_dec_hw_ctx { - struct hantro_aux_buf qtable; -}; - -/** - * struct hantro_vp8_dec_hw_ctx - * - * @segment_map: Segment map buffer. - * @prob_tbl: Probability table buffer. - */ -struct hantro_vp8_dec_hw_ctx { - struct hantro_aux_buf segment_map; - struct hantro_aux_buf prob_tbl; -}; - -/** - * struct hantro_vp9_frame_info - * - * @valid: frame info valid flag - * @frame_context_idx: index of frame context - * @reference_mode: inter prediction type - * @tx_mode: transform mode - * @interpolation_filter: filter selection for inter prediction - * @flags: frame flags - * @timestamp: frame timestamp - */ -struct hantro_vp9_frame_info { - u32 valid : 1; - u32 frame_context_idx : 2; - u32 reference_mode : 2; - u32 tx_mode : 3; - u32 interpolation_filter : 3; - u32 flags; - u64 timestamp; -}; - -#define MAX_SB_COLS 64 -#define MAX_SB_ROWS 34 - -/** - * struct hantro_vp9_dec_hw_ctx - * - * @tile_edge: auxiliary DMA buffer for tile edge processing - * @segment_map: auxiliary DMA buffer for segment map - * @misc: auxiliary DMA buffer for tile info, probabilities and hw counters - * @cnts: vp9 library struct for abstracting hw counters access - * @probability_tables: VP9 probability tables implied by the spec - * @frame_context: VP9 frame contexts - * @cur: current frame information - * @last: last frame information - * @bsd_ctrl_offset: bsd offset into tile_edge - * @segment_map_size: size of segment map - * @ctx_counters_offset: hw counters offset into misc - * @tile_info_offset: tile info offset into misc - * @tile_r_info: per-tile information array - * @tile_c_info: per-tile information array - * @last_tile_r: last number of tile rows - * @last_tile_c: last number of tile cols - * @last_sbs_r: last number of superblock rows - * @last_sbs_c: last number of superblock cols - * @active_segment: number of active segment (alternating between 0 and 1) - * @feature_enabled: segmentation feature enabled flags - * @feature_data: segmentation feature data - */ -struct hantro_vp9_dec_hw_ctx { - struct hantro_aux_buf tile_edge; - struct hantro_aux_buf segment_map; - struct hantro_aux_buf misc; - struct v4l2_vp9_frame_symbol_counts cnts; - struct v4l2_vp9_frame_context probability_tables; - struct v4l2_vp9_frame_context frame_context[4]; - struct hantro_vp9_frame_info cur; - struct hantro_vp9_frame_info last; - - unsigned int bsd_ctrl_offset; - unsigned int segment_map_size; - unsigned int ctx_counters_offset; - unsigned int tile_info_offset; - - unsigned short tile_r_info[MAX_SB_ROWS]; - unsigned short tile_c_info[MAX_SB_COLS]; - unsigned int last_tile_r; - unsigned int last_tile_c; - unsigned int last_sbs_r; - unsigned int last_sbs_c; - - unsigned int active_segment; - u8 feature_enabled[8]; - s16 feature_data[8][4]; -}; - -/** - * struct hantro_postproc_ctx - * - * @dec_q: References buffers, in decoder format. - */ -struct hantro_postproc_ctx { - struct hantro_aux_buf dec_q[VB2_MAX_FRAME]; -}; - -/** - * struct hantro_postproc_ops - post-processor operations - * - * @enable: Enable the post-processor block. Optional. - * @disable: Disable the post-processor block. Optional. - * @enum_framesizes: Enumerate possible scaled output formats. - * Returns zero if OK, a negative value in error cases. - * Optional. - */ -struct hantro_postproc_ops { - void (*enable)(struct hantro_ctx *ctx); - void (*disable)(struct hantro_ctx *ctx); - int (*enum_framesizes)(struct hantro_ctx *ctx, struct v4l2_frmsizeenum *fsize); -}; - -/** - * struct hantro_codec_ops - codec mode specific operations - * - * @init: If needed, can be used for initialization. - * Optional and called from process context. - * @exit: If needed, can be used to undo the .init phase. - * Optional and called from process context. - * @run: Start single {en,de)coding job. Called from atomic context - * to indicate that a pair of buffers is ready and the hardware - * should be programmed and started. Returns zero if OK, a - * negative value in error cases. - * @done: Read back processing results and additional data from hardware. - * @reset: Reset the hardware in case of a timeout. - */ -struct hantro_codec_ops { - int (*init)(struct hantro_ctx *ctx); - void (*exit)(struct hantro_ctx *ctx); - int (*run)(struct hantro_ctx *ctx); - void (*done)(struct hantro_ctx *ctx); - void (*reset)(struct hantro_ctx *ctx); -}; - -/** - * enum hantro_enc_fmt - source format ID for hardware registers. - * - * @ROCKCHIP_VPU_ENC_FMT_YUV420P: Y/CbCr 4:2:0 planar format - * @ROCKCHIP_VPU_ENC_FMT_YUV420SP: Y/CbCr 4:2:0 semi-planar format - * @ROCKCHIP_VPU_ENC_FMT_YUYV422: YUV 4:2:2 packed format (YUYV) - * @ROCKCHIP_VPU_ENC_FMT_UYVY422: YUV 4:2:2 packed format (UYVY) - */ -enum hantro_enc_fmt { - ROCKCHIP_VPU_ENC_FMT_YUV420P = 0, - ROCKCHIP_VPU_ENC_FMT_YUV420SP = 1, - ROCKCHIP_VPU_ENC_FMT_YUYV422 = 2, - ROCKCHIP_VPU_ENC_FMT_UYVY422 = 3, -}; - -extern const struct hantro_variant imx8mm_vpu_g1_variant; -extern const struct hantro_variant imx8mq_vpu_g1_variant; -extern const struct hantro_variant imx8mq_vpu_g2_variant; -extern const struct hantro_variant imx8mq_vpu_variant; -extern const struct hantro_variant px30_vpu_variant; -extern const struct hantro_variant rk3036_vpu_variant; -extern const struct hantro_variant rk3066_vpu_variant; -extern const struct hantro_variant rk3288_vpu_variant; -extern const struct hantro_variant rk3328_vpu_variant; -extern const struct hantro_variant rk3399_vpu_variant; -extern const struct hantro_variant rk3568_vepu_variant; -extern const struct hantro_variant rk3568_vpu_variant; -extern const struct hantro_variant sama5d4_vdec_variant; -extern const struct hantro_variant sunxi_vpu_variant; - -extern const struct hantro_postproc_ops hantro_g1_postproc_ops; -extern const struct hantro_postproc_ops hantro_g2_postproc_ops; - -extern const u32 hantro_vp8_dec_mc_filter[8][6]; - -void hantro_watchdog(struct work_struct *work); -void hantro_run(struct hantro_ctx *ctx); -void hantro_irq_done(struct hantro_dev *vpu, - enum vb2_buffer_state result); -void hantro_start_prepare_run(struct hantro_ctx *ctx); -void hantro_end_prepare_run(struct hantro_ctx *ctx); - -irqreturn_t hantro_g1_irq(int irq, void *dev_id); -void hantro_g1_reset(struct hantro_ctx *ctx); - -int hantro_h1_jpeg_enc_run(struct hantro_ctx *ctx); -int rockchip_vpu2_jpeg_enc_run(struct hantro_ctx *ctx); -void hantro_h1_jpeg_enc_done(struct hantro_ctx *ctx); -void rockchip_vpu2_jpeg_enc_done(struct hantro_ctx *ctx); - -dma_addr_t hantro_h264_get_ref_buf(struct hantro_ctx *ctx, - unsigned int dpb_idx); -u16 hantro_h264_get_ref_nbr(struct hantro_ctx *ctx, - unsigned int dpb_idx); -int hantro_h264_dec_prepare_run(struct hantro_ctx *ctx); -int rockchip_vpu2_h264_dec_run(struct hantro_ctx *ctx); -int hantro_g1_h264_dec_run(struct hantro_ctx *ctx); -int hantro_h264_dec_init(struct hantro_ctx *ctx); -void hantro_h264_dec_exit(struct hantro_ctx *ctx); - -int hantro_hevc_dec_init(struct hantro_ctx *ctx); -void hantro_hevc_dec_exit(struct hantro_ctx *ctx); -int hantro_g2_hevc_dec_run(struct hantro_ctx *ctx); -int hantro_hevc_dec_prepare_run(struct hantro_ctx *ctx); -void hantro_hevc_ref_init(struct hantro_ctx *ctx); -dma_addr_t hantro_hevc_get_ref_buf(struct hantro_ctx *ctx, s32 poc); -int hantro_hevc_add_ref_buf(struct hantro_ctx *ctx, int poc, dma_addr_t addr); - - -static inline unsigned short hantro_vp9_num_sbs(unsigned short dimension) -{ - return (dimension + 63) / 64; -} - -static inline size_t -hantro_vp9_mv_size(unsigned int width, unsigned int height) -{ - int num_ctbs; - - /* - * There can be up to (CTBs x 64) number of blocks, - * and the motion vector for each block needs 16 bytes. - */ - num_ctbs = hantro_vp9_num_sbs(width) * hantro_vp9_num_sbs(height); - return (num_ctbs * 64) * 16; -} - -static inline size_t -hantro_h264_mv_size(unsigned int width, unsigned int height) -{ - /* - * A decoded 8-bit 4:2:0 NV12 frame may need memory for up to - * 448 bytes per macroblock with additional 32 bytes on - * multi-core variants. - * - * The H264 decoder needs extra space on the output buffers - * to store motion vectors. This is needed for reference - * frames and only if the format is non-post-processed NV12. - * - * Memory layout is as follow: - * - * +---------------------------+ - * | Y-plane 256 bytes x MBs | - * +---------------------------+ - * | UV-plane 128 bytes x MBs | - * +---------------------------+ - * | MV buffer 64 bytes x MBs | - * +---------------------------+ - * | MC sync 32 bytes | - * +---------------------------+ - */ - return 64 * MB_WIDTH(width) * MB_WIDTH(height) + 32; -} - -static inline size_t -hantro_hevc_mv_size(unsigned int width, unsigned int height) -{ - /* - * A CTB can be 64x64, 32x32 or 16x16. - * Allocated memory for the "worse" case: 16x16 - */ - return width * height / 16; -} - -int hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx); -int rockchip_vpu2_mpeg2_dec_run(struct hantro_ctx *ctx); -void hantro_mpeg2_dec_copy_qtable(u8 *qtable, - const struct v4l2_ctrl_mpeg2_quantisation *ctrl); -int hantro_mpeg2_dec_init(struct hantro_ctx *ctx); -void hantro_mpeg2_dec_exit(struct hantro_ctx *ctx); - -int hantro_g1_vp8_dec_run(struct hantro_ctx *ctx); -int rockchip_vpu2_vp8_dec_run(struct hantro_ctx *ctx); -int hantro_vp8_dec_init(struct hantro_ctx *ctx); -void hantro_vp8_dec_exit(struct hantro_ctx *ctx); -void hantro_vp8_prob_update(struct hantro_ctx *ctx, - const struct v4l2_ctrl_vp8_frame *hdr); - -int hantro_g2_vp9_dec_run(struct hantro_ctx *ctx); -void hantro_g2_vp9_dec_done(struct hantro_ctx *ctx); -int hantro_vp9_dec_init(struct hantro_ctx *ctx); -void hantro_vp9_dec_exit(struct hantro_ctx *ctx); -void hantro_g2_check_idle(struct hantro_dev *vpu); -irqreturn_t hantro_g2_irq(int irq, void *dev_id); - -#endif /* HANTRO_HW_H_ */ diff --git a/drivers/staging/media/hantro/hantro_jpeg.c b/drivers/staging/media/hantro/hantro_jpeg.c deleted file mode 100644 index d07b1b449b61..000000000000 --- a/drivers/staging/media/hantro/hantro_jpeg.c +++ /dev/null @@ -1,348 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * Copyright (C) Collabora, Ltd. - * - * Based on GSPCA and CODA drivers: - * Copyright (C) Jean-Francois Moine (http://moinejf.free.fr) - * Copyright (C) 2014 Philipp Zabel, Pengutronix - */ - -#include <linux/align.h> -#include <linux/build_bug.h> -#include <linux/kernel.h> -#include <linux/string.h> -#include "hantro_jpeg.h" -#include "hantro.h" - -#define LUMA_QUANT_OFF 25 -#define CHROMA_QUANT_OFF 90 -#define HEIGHT_OFF 159 -#define WIDTH_OFF 161 - -#define HUFF_LUMA_DC_OFF 178 -#define HUFF_LUMA_AC_OFF 211 -#define HUFF_CHROMA_DC_OFF 394 -#define HUFF_CHROMA_AC_OFF 427 - -/* Default tables from JPEG ITU-T.81 - * (ISO/IEC 10918-1) Annex K, tables K.1 and K.2 - */ -static const unsigned char luma_q_table[] = { - 0x10, 0x0b, 0x0a, 0x10, 0x18, 0x28, 0x33, 0x3d, - 0x0c, 0x0c, 0x0e, 0x13, 0x1a, 0x3a, 0x3c, 0x37, - 0x0e, 0x0d, 0x10, 0x18, 0x28, 0x39, 0x45, 0x38, - 0x0e, 0x11, 0x16, 0x1d, 0x33, 0x57, 0x50, 0x3e, - 0x12, 0x16, 0x25, 0x38, 0x44, 0x6d, 0x67, 0x4d, - 0x18, 0x23, 0x37, 0x40, 0x51, 0x68, 0x71, 0x5c, - 0x31, 0x40, 0x4e, 0x57, 0x67, 0x79, 0x78, 0x65, - 0x48, 0x5c, 0x5f, 0x62, 0x70, 0x64, 0x67, 0x63 -}; - -static const unsigned char chroma_q_table[] = { - 0x11, 0x12, 0x18, 0x2f, 0x63, 0x63, 0x63, 0x63, - 0x12, 0x15, 0x1a, 0x42, 0x63, 0x63, 0x63, 0x63, - 0x18, 0x1a, 0x38, 0x63, 0x63, 0x63, 0x63, 0x63, - 0x2f, 0x42, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, - 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, - 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, - 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, - 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63 -}; - -static const unsigned char zigzag[] = { - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, - 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, - 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63 -}; - -static const u32 hw_reorder[] = { - 0, 8, 16, 24, 1, 9, 17, 25, - 32, 40, 48, 56, 33, 41, 49, 57, - 2, 10, 18, 26, 3, 11, 19, 27, - 34, 42, 50, 58, 35, 43, 51, 59, - 4, 12, 20, 28, 5, 13, 21, 29, - 36, 44, 52, 60, 37, 45, 53, 61, - 6, 14, 22, 30, 7, 15, 23, 31, - 38, 46, 54, 62, 39, 47, 55, 63 -}; - -/* Huffman tables are shared with CODA */ -static const unsigned char luma_dc_table[] = { - 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, -}; - -static const unsigned char chroma_dc_table[] = { - 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, -}; - -static const unsigned char luma_ac_table[] = { - 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, - 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7d, - 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, - 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, - 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, - 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, - 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, - 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, - 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, - 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, - 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, - 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, - 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, - 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, - 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, - 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, - 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, - 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, - 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, - 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, - 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, - 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, - 0xf9, 0xfa, -}; - -static const unsigned char chroma_ac_table[] = { - 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, - 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, - 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, - 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, - 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, - 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, - 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, - 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, - 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, - 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, - 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, - 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, - 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, - 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, - 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, - 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, - 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, - 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, - 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, - 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, - 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, - 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, - 0xf9, 0xfa, -}; - -/* For simplicity, we keep a pre-formatted JPEG header, - * and we'll use fixed offsets to change the width, height - * quantization tables, etc. - */ -static const unsigned char hantro_jpeg_header[] = { - /* SOI */ - 0xff, 0xd8, - - /* JFIF-APP0 */ - 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, 0x49, 0x46, - 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, - 0x00, 0x00, - - /* DQT */ - 0xff, 0xdb, 0x00, 0x84, - - 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - - 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - - /* SOF */ - 0xff, 0xc0, 0x00, 0x11, 0x08, 0x00, 0xf0, 0x01, - 0x40, 0x03, 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, - 0x03, 0x11, 0x01, - - /* DHT */ - 0xff, 0xc4, 0x00, 0x1f, 0x00, - - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - - /* DHT */ - 0xff, 0xc4, 0x00, 0xb5, 0x10, - - 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - - /* DHT */ - 0xff, 0xc4, 0x00, 0x1f, 0x01, - - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - - /* DHT */ - 0xff, 0xc4, 0x00, 0xb5, 0x11, - - 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - - /* COM */ - 0xff, 0xfe, 0x00, 0x03, 0x00, - - /* SOS */ - 0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, - 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, -}; - -/* - * JPEG_HEADER_SIZE is used in other parts of the driver in lieu of - * "sizeof(hantro_jpeg_header)". The two must be equal. - */ -static_assert(sizeof(hantro_jpeg_header) == JPEG_HEADER_SIZE); - -/* - * hantro_jpeg_header is padded with a COM segment, so that the payload - * of the SOS segment (the entropy-encoded image scan), which should - * trail the whole header, is 8-byte aligned for the hardware to write - * to directly. - */ -static_assert(IS_ALIGNED(sizeof(hantro_jpeg_header), 8), - "Hantro JPEG header size needs to be 8-byte aligned."); - -static unsigned char jpeg_scale_qp(const unsigned char qp, int scale) -{ - unsigned int temp; - - temp = DIV_ROUND_CLOSEST((unsigned int)qp * scale, 100); - if (temp <= 0) - temp = 1; - if (temp > 255) - temp = 255; - - return (unsigned char)temp; -} - -static void -jpeg_scale_quant_table(unsigned char *file_q_tab, - unsigned char *reordered_q_tab, - const unsigned char *tab, int scale) -{ - int i; - - BUILD_BUG_ON(ARRAY_SIZE(zigzag) != JPEG_QUANT_SIZE); - BUILD_BUG_ON(ARRAY_SIZE(hw_reorder) != JPEG_QUANT_SIZE); - - for (i = 0; i < JPEG_QUANT_SIZE; i++) { - file_q_tab[i] = jpeg_scale_qp(tab[zigzag[i]], scale); - reordered_q_tab[i] = jpeg_scale_qp(tab[hw_reorder[i]], scale); - } -} - -static void jpeg_set_quality(struct hantro_jpeg_ctx *ctx) -{ - int scale; - - /* - * Non-linear scaling factor: - * [5,50] -> [1000..100], [51,100] -> [98..0] - */ - if (ctx->quality < 50) - scale = 5000 / ctx->quality; - else - scale = 200 - 2 * ctx->quality; - - BUILD_BUG_ON(ARRAY_SIZE(luma_q_table) != JPEG_QUANT_SIZE); - BUILD_BUG_ON(ARRAY_SIZE(chroma_q_table) != JPEG_QUANT_SIZE); - BUILD_BUG_ON(ARRAY_SIZE(ctx->hw_luma_qtable) != JPEG_QUANT_SIZE); - BUILD_BUG_ON(ARRAY_SIZE(ctx->hw_chroma_qtable) != JPEG_QUANT_SIZE); - - jpeg_scale_quant_table(ctx->buffer + LUMA_QUANT_OFF, - ctx->hw_luma_qtable, luma_q_table, scale); - jpeg_scale_quant_table(ctx->buffer + CHROMA_QUANT_OFF, - ctx->hw_chroma_qtable, chroma_q_table, scale); -} - -void hantro_jpeg_header_assemble(struct hantro_jpeg_ctx *ctx) -{ - char *buf = ctx->buffer; - - memcpy(buf, hantro_jpeg_header, - sizeof(hantro_jpeg_header)); - - buf[HEIGHT_OFF + 0] = ctx->height >> 8; - buf[HEIGHT_OFF + 1] = ctx->height; - buf[WIDTH_OFF + 0] = ctx->width >> 8; - buf[WIDTH_OFF + 1] = ctx->width; - - memcpy(buf + HUFF_LUMA_DC_OFF, luma_dc_table, sizeof(luma_dc_table)); - memcpy(buf + HUFF_LUMA_AC_OFF, luma_ac_table, sizeof(luma_ac_table)); - memcpy(buf + HUFF_CHROMA_DC_OFF, chroma_dc_table, - sizeof(chroma_dc_table)); - memcpy(buf + HUFF_CHROMA_AC_OFF, chroma_ac_table, - sizeof(chroma_ac_table)); - - jpeg_set_quality(ctx); -} diff --git a/drivers/staging/media/hantro/hantro_jpeg.h b/drivers/staging/media/hantro/hantro_jpeg.h deleted file mode 100644 index 0b49d0b82caa..000000000000 --- a/drivers/staging/media/hantro/hantro_jpeg.h +++ /dev/null @@ -1,15 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0+ */ - -#define JPEG_HEADER_SIZE 624 -#define JPEG_QUANT_SIZE 64 - -struct hantro_jpeg_ctx { - int width; - int height; - int quality; - unsigned char *buffer; - unsigned char hw_luma_qtable[JPEG_QUANT_SIZE]; - unsigned char hw_chroma_qtable[JPEG_QUANT_SIZE]; -}; - -void hantro_jpeg_header_assemble(struct hantro_jpeg_ctx *ctx); diff --git a/drivers/staging/media/hantro/hantro_mpeg2.c b/drivers/staging/media/hantro/hantro_mpeg2.c deleted file mode 100644 index 04e545eb0a83..000000000000 --- a/drivers/staging/media/hantro/hantro_mpeg2.c +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Hantro VPU codec driver - * - * Copyright (C) 2018 Rockchip Electronics Co., Ltd. - */ - -#include "hantro.h" - -static const u8 zigzag[64] = { - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, - 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, - 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63 -}; - -void hantro_mpeg2_dec_copy_qtable(u8 *qtable, - const struct v4l2_ctrl_mpeg2_quantisation *ctrl) -{ - int i, n; - - if (!qtable || !ctrl) - return; - - for (i = 0; i < ARRAY_SIZE(zigzag); i++) { - n = zigzag[i]; - qtable[n + 0] = ctrl->intra_quantiser_matrix[i]; - qtable[n + 64] = ctrl->non_intra_quantiser_matrix[i]; - qtable[n + 128] = ctrl->chroma_intra_quantiser_matrix[i]; - qtable[n + 192] = ctrl->chroma_non_intra_quantiser_matrix[i]; - } -} - -int hantro_mpeg2_dec_init(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - - ctx->mpeg2_dec.qtable.size = ARRAY_SIZE(zigzag) * 4; - ctx->mpeg2_dec.qtable.cpu = - dma_alloc_coherent(vpu->dev, - ctx->mpeg2_dec.qtable.size, - &ctx->mpeg2_dec.qtable.dma, - GFP_KERNEL); - if (!ctx->mpeg2_dec.qtable.cpu) - return -ENOMEM; - return 0; -} - -void hantro_mpeg2_dec_exit(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - - dma_free_coherent(vpu->dev, - ctx->mpeg2_dec.qtable.size, - ctx->mpeg2_dec.qtable.cpu, - ctx->mpeg2_dec.qtable.dma); -} diff --git a/drivers/staging/media/hantro/hantro_postproc.c b/drivers/staging/media/hantro/hantro_postproc.c deleted file mode 100644 index a0928c508434..000000000000 --- a/drivers/staging/media/hantro/hantro_postproc.c +++ /dev/null @@ -1,279 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Hantro G1 post-processor support - * - * Copyright (C) 2019 Collabora, Ltd. - */ - -#include <linux/dma-mapping.h> -#include <linux/types.h> - -#include "hantro.h" -#include "hantro_hw.h" -#include "hantro_g1_regs.h" -#include "hantro_g2_regs.h" -#include "hantro_v4l2.h" - -#define HANTRO_PP_REG_WRITE(vpu, reg_name, val) \ -{ \ - hantro_reg_write(vpu, \ - &hantro_g1_postproc_regs.reg_name, \ - val); \ -} - -#define HANTRO_PP_REG_WRITE_S(vpu, reg_name, val) \ -{ \ - hantro_reg_write_s(vpu, \ - &hantro_g1_postproc_regs.reg_name, \ - val); \ -} - -#define VPU_PP_IN_YUYV 0x0 -#define VPU_PP_IN_NV12 0x1 -#define VPU_PP_IN_YUV420 0x2 -#define VPU_PP_IN_YUV240_TILED 0x5 -#define VPU_PP_OUT_RGB 0x0 -#define VPU_PP_OUT_YUYV 0x3 - -static const struct hantro_postproc_regs hantro_g1_postproc_regs = { - .pipeline_en = {G1_REG_PP_INTERRUPT, 1, 0x1}, - .max_burst = {G1_REG_PP_DEV_CONFIG, 0, 0x1f}, - .clk_gate = {G1_REG_PP_DEV_CONFIG, 1, 0x1}, - .out_swap32 = {G1_REG_PP_DEV_CONFIG, 5, 0x1}, - .out_endian = {G1_REG_PP_DEV_CONFIG, 6, 0x1}, - .out_luma_base = {G1_REG_PP_OUT_LUMA_BASE, 0, 0xffffffff}, - .input_width = {G1_REG_PP_INPUT_SIZE, 0, 0x1ff}, - .input_height = {G1_REG_PP_INPUT_SIZE, 9, 0x1ff}, - .output_width = {G1_REG_PP_CONTROL, 4, 0x7ff}, - .output_height = {G1_REG_PP_CONTROL, 15, 0x7ff}, - .input_fmt = {G1_REG_PP_CONTROL, 29, 0x7}, - .output_fmt = {G1_REG_PP_CONTROL, 26, 0x7}, - .orig_width = {G1_REG_PP_MASK1_ORIG_WIDTH, 23, 0x1ff}, - .display_width = {G1_REG_PP_DISPLAY_WIDTH, 0, 0xfff}, -}; - -bool hantro_needs_postproc(const struct hantro_ctx *ctx, - const struct hantro_fmt *fmt) -{ - if (ctx->is_encoder) - return false; - return fmt->postprocessed; -} - -static void hantro_postproc_g1_enable(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - struct vb2_v4l2_buffer *dst_buf; - u32 src_pp_fmt, dst_pp_fmt; - dma_addr_t dst_dma; - - /* Turn on pipeline mode. Must be done first. */ - HANTRO_PP_REG_WRITE_S(vpu, pipeline_en, 0x1); - - src_pp_fmt = VPU_PP_IN_NV12; - - switch (ctx->vpu_dst_fmt->fourcc) { - case V4L2_PIX_FMT_YUYV: - dst_pp_fmt = VPU_PP_OUT_YUYV; - break; - default: - WARN(1, "output format %d not supported by the post-processor, this wasn't expected.", - ctx->vpu_dst_fmt->fourcc); - dst_pp_fmt = 0; - break; - } - - dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); - dst_dma = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0); - - HANTRO_PP_REG_WRITE(vpu, clk_gate, 0x1); - HANTRO_PP_REG_WRITE(vpu, out_endian, 0x1); - HANTRO_PP_REG_WRITE(vpu, out_swap32, 0x1); - HANTRO_PP_REG_WRITE(vpu, max_burst, 16); - HANTRO_PP_REG_WRITE(vpu, out_luma_base, dst_dma); - HANTRO_PP_REG_WRITE(vpu, input_width, MB_WIDTH(ctx->dst_fmt.width)); - HANTRO_PP_REG_WRITE(vpu, input_height, MB_HEIGHT(ctx->dst_fmt.height)); - HANTRO_PP_REG_WRITE(vpu, input_fmt, src_pp_fmt); - HANTRO_PP_REG_WRITE(vpu, output_fmt, dst_pp_fmt); - HANTRO_PP_REG_WRITE(vpu, output_width, ctx->dst_fmt.width); - HANTRO_PP_REG_WRITE(vpu, output_height, ctx->dst_fmt.height); - HANTRO_PP_REG_WRITE(vpu, orig_width, MB_WIDTH(ctx->dst_fmt.width)); - HANTRO_PP_REG_WRITE(vpu, display_width, ctx->dst_fmt.width); -} - -static int down_scale_factor(struct hantro_ctx *ctx) -{ - if (ctx->src_fmt.width == ctx->dst_fmt.width) - return 0; - - return DIV_ROUND_CLOSEST(ctx->src_fmt.width, ctx->dst_fmt.width); -} - -static void hantro_postproc_g2_enable(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - struct vb2_v4l2_buffer *dst_buf; - int down_scale = down_scale_factor(ctx); - size_t chroma_offset; - dma_addr_t dst_dma; - - dst_buf = hantro_get_dst_buf(ctx); - dst_dma = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0); - chroma_offset = ctx->dst_fmt.plane_fmt[0].bytesperline * - ctx->dst_fmt.height; - - if (down_scale) { - hantro_reg_write(vpu, &g2_down_scale_e, 1); - hantro_reg_write(vpu, &g2_down_scale_y, down_scale >> 2); - hantro_reg_write(vpu, &g2_down_scale_x, down_scale >> 2); - hantro_write_addr(vpu, G2_DS_DST, dst_dma); - hantro_write_addr(vpu, G2_DS_DST_CHR, dst_dma + (chroma_offset >> down_scale)); - } else { - hantro_write_addr(vpu, G2_RS_OUT_LUMA_ADDR, dst_dma); - hantro_write_addr(vpu, G2_RS_OUT_CHROMA_ADDR, dst_dma + chroma_offset); - } - if (ctx->dev->variant->legacy_regs) { - int out_depth = hantro_get_format_depth(ctx->dst_fmt.pixelformat); - u8 pp_shift = 0; - - if (out_depth > 8) - pp_shift = 16 - out_depth; - - hantro_reg_write(ctx->dev, &g2_rs_out_bit_depth, out_depth); - hantro_reg_write(ctx->dev, &g2_pp_pix_shift, pp_shift); - } - hantro_reg_write(vpu, &g2_out_rs_e, 1); -} - -static int hantro_postproc_g2_enum_framesizes(struct hantro_ctx *ctx, - struct v4l2_frmsizeenum *fsize) -{ - /** - * G2 scaler can scale down by 0, 2, 4 or 8 - * use fsize->index has power of 2 diviser - **/ - if (fsize->index > 3) - return -EINVAL; - - if (!ctx->src_fmt.width || !ctx->src_fmt.height) - return -EINVAL; - - fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE; - fsize->discrete.width = ctx->src_fmt.width >> fsize->index; - fsize->discrete.height = ctx->src_fmt.height >> fsize->index; - - return 0; -} - -void hantro_postproc_free(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - unsigned int i; - - for (i = 0; i < VB2_MAX_FRAME; ++i) { - struct hantro_aux_buf *priv = &ctx->postproc.dec_q[i]; - - if (priv->cpu) { - dma_free_attrs(vpu->dev, priv->size, priv->cpu, - priv->dma, priv->attrs); - priv->cpu = NULL; - } - } -} - -int hantro_postproc_alloc(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - struct v4l2_m2m_ctx *m2m_ctx = ctx->fh.m2m_ctx; - struct vb2_queue *cap_queue = &m2m_ctx->cap_q_ctx.q; - unsigned int num_buffers = cap_queue->num_buffers; - struct v4l2_pix_format_mplane pix_mp; - const struct hantro_fmt *fmt; - unsigned int i, buf_size; - - /* this should always pick native format */ - fmt = hantro_get_default_fmt(ctx, false); - if (!fmt) - return -EINVAL; - v4l2_fill_pixfmt_mp(&pix_mp, fmt->fourcc, ctx->src_fmt.width, - ctx->src_fmt.height); - - buf_size = pix_mp.plane_fmt[0].sizeimage; - if (ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_H264_SLICE) - buf_size += hantro_h264_mv_size(pix_mp.width, - pix_mp.height); - else if (ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_VP9_FRAME) - buf_size += hantro_vp9_mv_size(pix_mp.width, - pix_mp.height); - else if (ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_HEVC_SLICE) - buf_size += hantro_hevc_mv_size(pix_mp.width, - pix_mp.height); - - for (i = 0; i < num_buffers; ++i) { - struct hantro_aux_buf *priv = &ctx->postproc.dec_q[i]; - - /* - * The buffers on this queue are meant as intermediate - * buffers for the decoder, so no mapping is needed. - */ - priv->attrs = DMA_ATTR_NO_KERNEL_MAPPING; - priv->cpu = dma_alloc_attrs(vpu->dev, buf_size, &priv->dma, - GFP_KERNEL, priv->attrs); - if (!priv->cpu) - return -ENOMEM; - priv->size = buf_size; - } - return 0; -} - -static void hantro_postproc_g1_disable(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - - HANTRO_PP_REG_WRITE_S(vpu, pipeline_en, 0x0); -} - -static void hantro_postproc_g2_disable(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - - hantro_reg_write(vpu, &g2_out_rs_e, 0); -} - -void hantro_postproc_disable(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - - if (vpu->variant->postproc_ops && vpu->variant->postproc_ops->disable) - vpu->variant->postproc_ops->disable(ctx); -} - -void hantro_postproc_enable(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - - if (vpu->variant->postproc_ops && vpu->variant->postproc_ops->enable) - vpu->variant->postproc_ops->enable(ctx); -} - -int hanto_postproc_enum_framesizes(struct hantro_ctx *ctx, - struct v4l2_frmsizeenum *fsize) -{ - struct hantro_dev *vpu = ctx->dev; - - if (vpu->variant->postproc_ops && vpu->variant->postproc_ops->enum_framesizes) - return vpu->variant->postproc_ops->enum_framesizes(ctx, fsize); - - return -EINVAL; -} - -const struct hantro_postproc_ops hantro_g1_postproc_ops = { - .enable = hantro_postproc_g1_enable, - .disable = hantro_postproc_g1_disable, -}; - -const struct hantro_postproc_ops hantro_g2_postproc_ops = { - .enable = hantro_postproc_g2_enable, - .disable = hantro_postproc_g2_disable, - .enum_framesizes = hantro_postproc_g2_enum_framesizes, -}; diff --git a/drivers/staging/media/hantro/hantro_v4l2.c b/drivers/staging/media/hantro/hantro_v4l2.c deleted file mode 100644 index 2c7a805289e7..000000000000 --- a/drivers/staging/media/hantro/hantro_v4l2.c +++ /dev/null @@ -1,990 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Hantro VPU codec driver - * - * Copyright (C) 2018 Collabora, Ltd. - * Copyright (C) 2018 Rockchip Electronics Co., Ltd. - * Alpha Lin <Alpha.Lin@rock-chips.com> - * Jeffy Chen <jeffy.chen@rock-chips.com> - * - * Copyright 2018 Google LLC. - * Tomasz Figa <tfiga@chromium.org> - * - * Based on s5p-mfc driver by Samsung Electronics Co., Ltd. - * Copyright (C) 2010-2011 Samsung Electronics Co., Ltd. - */ - -#include <linux/interrupt.h> -#include <linux/io.h> -#include <linux/module.h> -#include <linux/pm_runtime.h> -#include <linux/videodev2.h> -#include <linux/workqueue.h> -#include <media/v4l2-ctrls.h> -#include <media/v4l2-event.h> -#include <media/v4l2-mem2mem.h> - -#include "hantro.h" -#include "hantro_hw.h" -#include "hantro_v4l2.h" - -static int hantro_set_fmt_out(struct hantro_ctx *ctx, - struct v4l2_pix_format_mplane *pix_mp); -static int hantro_set_fmt_cap(struct hantro_ctx *ctx, - struct v4l2_pix_format_mplane *pix_mp); - -static const struct hantro_fmt * -hantro_get_formats(const struct hantro_ctx *ctx, unsigned int *num_fmts) -{ - const struct hantro_fmt *formats; - - if (ctx->is_encoder) { - formats = ctx->dev->variant->enc_fmts; - *num_fmts = ctx->dev->variant->num_enc_fmts; - } else { - formats = ctx->dev->variant->dec_fmts; - *num_fmts = ctx->dev->variant->num_dec_fmts; - } - - return formats; -} - -static const struct hantro_fmt * -hantro_get_postproc_formats(const struct hantro_ctx *ctx, - unsigned int *num_fmts) -{ - struct hantro_dev *vpu = ctx->dev; - - if (ctx->is_encoder || !vpu->variant->postproc_fmts) { - *num_fmts = 0; - return NULL; - } - - *num_fmts = ctx->dev->variant->num_postproc_fmts; - return ctx->dev->variant->postproc_fmts; -} - -int hantro_get_format_depth(u32 fourcc) -{ - switch (fourcc) { - case V4L2_PIX_FMT_P010: - case V4L2_PIX_FMT_P010_4L4: - return 10; - default: - return 8; - } -} - -static bool -hantro_check_depth_match(const struct hantro_ctx *ctx, - const struct hantro_fmt *fmt) -{ - int fmt_depth, ctx_depth = 8; - - if (!fmt->match_depth && !fmt->postprocessed) - return true; - - /* 0 means default depth, which is 8 */ - if (ctx->bit_depth) - ctx_depth = ctx->bit_depth; - - fmt_depth = hantro_get_format_depth(fmt->fourcc); - - /* - * Allow only downconversion for postproc formats for now. - * It may be possible to relax that on some HW. - */ - if (!fmt->match_depth) - return fmt_depth <= ctx_depth; - - return fmt_depth == ctx_depth; -} - -static const struct hantro_fmt * -hantro_find_format(const struct hantro_ctx *ctx, u32 fourcc) -{ - const struct hantro_fmt *formats; - unsigned int i, num_fmts; - - formats = hantro_get_formats(ctx, &num_fmts); - for (i = 0; i < num_fmts; i++) - if (formats[i].fourcc == fourcc) - return &formats[i]; - - formats = hantro_get_postproc_formats(ctx, &num_fmts); - for (i = 0; i < num_fmts; i++) - if (formats[i].fourcc == fourcc) - return &formats[i]; - return NULL; -} - -const struct hantro_fmt * -hantro_get_default_fmt(const struct hantro_ctx *ctx, bool bitstream) -{ - const struct hantro_fmt *formats; - unsigned int i, num_fmts; - - formats = hantro_get_formats(ctx, &num_fmts); - for (i = 0; i < num_fmts; i++) { - if (bitstream == (formats[i].codec_mode != - HANTRO_MODE_NONE) && - hantro_check_depth_match(ctx, &formats[i])) - return &formats[i]; - } - return NULL; -} - -static int vidioc_querycap(struct file *file, void *priv, - struct v4l2_capability *cap) -{ - struct hantro_dev *vpu = video_drvdata(file); - struct video_device *vdev = video_devdata(file); - - strscpy(cap->driver, vpu->dev->driver->name, sizeof(cap->driver)); - strscpy(cap->card, vdev->name, sizeof(cap->card)); - snprintf(cap->bus_info, sizeof(cap->bus_info), "platform: %s", - vpu->dev->driver->name); - return 0; -} - -static int vidioc_enum_framesizes(struct file *file, void *priv, - struct v4l2_frmsizeenum *fsize) -{ - struct hantro_ctx *ctx = fh_to_ctx(priv); - const struct hantro_fmt *fmt; - - fmt = hantro_find_format(ctx, fsize->pixel_format); - if (!fmt) { - vpu_debug(0, "unsupported bitstream format (%08x)\n", - fsize->pixel_format); - return -EINVAL; - } - - /* For non-coded formats check if postprocessing scaling is possible */ - if (fmt->codec_mode == HANTRO_MODE_NONE && hantro_needs_postproc(ctx, fmt)) { - return hanto_postproc_enum_framesizes(ctx, fsize); - } else if (fsize->index != 0) { - vpu_debug(0, "invalid frame size index (expected 0, got %d)\n", - fsize->index); - return -EINVAL; - } - - fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE; - fsize->stepwise = fmt->frmsize; - - return 0; -} - -static int vidioc_enum_fmt(struct file *file, void *priv, - struct v4l2_fmtdesc *f, bool capture) - -{ - struct hantro_ctx *ctx = fh_to_ctx(priv); - const struct hantro_fmt *fmt, *formats; - unsigned int num_fmts, i, j = 0; - bool skip_mode_none; - - /* - * When dealing with an encoder: - * - on the capture side we want to filter out all MODE_NONE formats. - * - on the output side we want to filter out all formats that are - * not MODE_NONE. - * When dealing with a decoder: - * - on the capture side we want to filter out all formats that are - * not MODE_NONE. - * - on the output side we want to filter out all MODE_NONE formats. - */ - skip_mode_none = capture == ctx->is_encoder; - - formats = hantro_get_formats(ctx, &num_fmts); - for (i = 0; i < num_fmts; i++) { - bool mode_none = formats[i].codec_mode == HANTRO_MODE_NONE; - fmt = &formats[i]; - - if (skip_mode_none == mode_none) - continue; - if (!hantro_check_depth_match(ctx, fmt)) - continue; - if (j == f->index) { - f->pixelformat = fmt->fourcc; - return 0; - } - ++j; - } - - /* - * Enumerate post-processed formats. As per the specification, - * we enumerated these formats after natively decoded formats - * as a hint for applications on what's the preferred fomat. - */ - if (!capture) - return -EINVAL; - formats = hantro_get_postproc_formats(ctx, &num_fmts); - for (i = 0; i < num_fmts; i++) { - fmt = &formats[i]; - - if (!hantro_check_depth_match(ctx, fmt)) - continue; - if (j == f->index) { - f->pixelformat = fmt->fourcc; - return 0; - } - ++j; - } - - return -EINVAL; -} - -static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv, - struct v4l2_fmtdesc *f) -{ - return vidioc_enum_fmt(file, priv, f, true); -} - -static int vidioc_enum_fmt_vid_out(struct file *file, void *priv, - struct v4l2_fmtdesc *f) -{ - return vidioc_enum_fmt(file, priv, f, false); -} - -static int vidioc_g_fmt_out_mplane(struct file *file, void *priv, - struct v4l2_format *f) -{ - struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp; - struct hantro_ctx *ctx = fh_to_ctx(priv); - - vpu_debug(4, "f->type = %d\n", f->type); - - *pix_mp = ctx->src_fmt; - - return 0; -} - -static int vidioc_g_fmt_cap_mplane(struct file *file, void *priv, - struct v4l2_format *f) -{ - struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp; - struct hantro_ctx *ctx = fh_to_ctx(priv); - - vpu_debug(4, "f->type = %d\n", f->type); - - *pix_mp = ctx->dst_fmt; - - return 0; -} - -static int hantro_try_fmt(const struct hantro_ctx *ctx, - struct v4l2_pix_format_mplane *pix_mp, - enum v4l2_buf_type type) -{ - const struct hantro_fmt *fmt, *vpu_fmt; - bool capture = V4L2_TYPE_IS_CAPTURE(type); - bool coded; - - coded = capture == ctx->is_encoder; - - vpu_debug(4, "trying format %c%c%c%c\n", - (pix_mp->pixelformat & 0x7f), - (pix_mp->pixelformat >> 8) & 0x7f, - (pix_mp->pixelformat >> 16) & 0x7f, - (pix_mp->pixelformat >> 24) & 0x7f); - - fmt = hantro_find_format(ctx, pix_mp->pixelformat); - if (!fmt) { - fmt = hantro_get_default_fmt(ctx, coded); - pix_mp->pixelformat = fmt->fourcc; - } - - if (coded) { - pix_mp->num_planes = 1; - vpu_fmt = fmt; - } else if (ctx->is_encoder) { - vpu_fmt = ctx->vpu_dst_fmt; - } else { - vpu_fmt = fmt; - /* - * Width/height on the CAPTURE end of a decoder are ignored and - * replaced by the OUTPUT ones. - */ - pix_mp->width = ctx->src_fmt.width; - pix_mp->height = ctx->src_fmt.height; - } - - pix_mp->field = V4L2_FIELD_NONE; - - v4l2_apply_frmsize_constraints(&pix_mp->width, &pix_mp->height, - &vpu_fmt->frmsize); - - if (!coded) { - /* Fill remaining fields */ - v4l2_fill_pixfmt_mp(pix_mp, fmt->fourcc, pix_mp->width, - pix_mp->height); - if (ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_H264_SLICE && - !hantro_needs_postproc(ctx, fmt)) - pix_mp->plane_fmt[0].sizeimage += - hantro_h264_mv_size(pix_mp->width, - pix_mp->height); - else if (ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_VP9_FRAME && - !hantro_needs_postproc(ctx, fmt)) - pix_mp->plane_fmt[0].sizeimage += - hantro_vp9_mv_size(pix_mp->width, - pix_mp->height); - else if (ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_HEVC_SLICE && - !hantro_needs_postproc(ctx, fmt)) - pix_mp->plane_fmt[0].sizeimage += - hantro_hevc_mv_size(pix_mp->width, - pix_mp->height); - } else if (!pix_mp->plane_fmt[0].sizeimage) { - /* - * For coded formats the application can specify - * sizeimage. If the application passes a zero sizeimage, - * let's default to the maximum frame size. - */ - pix_mp->plane_fmt[0].sizeimage = fmt->header_size + - pix_mp->width * pix_mp->height * fmt->max_depth; - } - - return 0; -} - -static int vidioc_try_fmt_cap_mplane(struct file *file, void *priv, - struct v4l2_format *f) -{ - return hantro_try_fmt(fh_to_ctx(priv), &f->fmt.pix_mp, f->type); -} - -static int vidioc_try_fmt_out_mplane(struct file *file, void *priv, - struct v4l2_format *f) -{ - return hantro_try_fmt(fh_to_ctx(priv), &f->fmt.pix_mp, f->type); -} - -static void -hantro_reset_fmt(struct v4l2_pix_format_mplane *fmt, - const struct hantro_fmt *vpu_fmt) -{ - memset(fmt, 0, sizeof(*fmt)); - - fmt->pixelformat = vpu_fmt->fourcc; - fmt->field = V4L2_FIELD_NONE; - fmt->colorspace = V4L2_COLORSPACE_JPEG; - fmt->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; - fmt->quantization = V4L2_QUANTIZATION_DEFAULT; - fmt->xfer_func = V4L2_XFER_FUNC_DEFAULT; -} - -static void -hantro_reset_encoded_fmt(struct hantro_ctx *ctx) -{ - const struct hantro_fmt *vpu_fmt; - struct v4l2_pix_format_mplane *fmt; - - vpu_fmt = hantro_get_default_fmt(ctx, true); - - if (ctx->is_encoder) { - ctx->vpu_dst_fmt = vpu_fmt; - fmt = &ctx->dst_fmt; - } else { - ctx->vpu_src_fmt = vpu_fmt; - fmt = &ctx->src_fmt; - } - - hantro_reset_fmt(fmt, vpu_fmt); - fmt->width = vpu_fmt->frmsize.min_width; - fmt->height = vpu_fmt->frmsize.min_height; - if (ctx->is_encoder) - hantro_set_fmt_cap(ctx, fmt); - else - hantro_set_fmt_out(ctx, fmt); -} - -static void -hantro_reset_raw_fmt(struct hantro_ctx *ctx) -{ - const struct hantro_fmt *raw_vpu_fmt; - struct v4l2_pix_format_mplane *raw_fmt, *encoded_fmt; - - raw_vpu_fmt = hantro_get_default_fmt(ctx, false); - - if (ctx->is_encoder) { - ctx->vpu_src_fmt = raw_vpu_fmt; - raw_fmt = &ctx->src_fmt; - encoded_fmt = &ctx->dst_fmt; - } else { - ctx->vpu_dst_fmt = raw_vpu_fmt; - raw_fmt = &ctx->dst_fmt; - encoded_fmt = &ctx->src_fmt; - } - - hantro_reset_fmt(raw_fmt, raw_vpu_fmt); - raw_fmt->width = encoded_fmt->width; - raw_fmt->height = encoded_fmt->height; - if (ctx->is_encoder) - hantro_set_fmt_out(ctx, raw_fmt); - else - hantro_set_fmt_cap(ctx, raw_fmt); -} - -void hantro_reset_fmts(struct hantro_ctx *ctx) -{ - hantro_reset_encoded_fmt(ctx); - hantro_reset_raw_fmt(ctx); -} - -static void -hantro_update_requires_request(struct hantro_ctx *ctx, u32 fourcc) -{ - switch (fourcc) { - case V4L2_PIX_FMT_JPEG: - ctx->fh.m2m_ctx->out_q_ctx.q.requires_requests = false; - break; - case V4L2_PIX_FMT_MPEG2_SLICE: - case V4L2_PIX_FMT_VP8_FRAME: - case V4L2_PIX_FMT_H264_SLICE: - case V4L2_PIX_FMT_HEVC_SLICE: - case V4L2_PIX_FMT_VP9_FRAME: - ctx->fh.m2m_ctx->out_q_ctx.q.requires_requests = true; - break; - default: - break; - } -} - -static void -hantro_update_requires_hold_capture_buf(struct hantro_ctx *ctx, u32 fourcc) -{ - struct vb2_queue *vq; - - vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, - V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); - - switch (fourcc) { - case V4L2_PIX_FMT_JPEG: - case V4L2_PIX_FMT_MPEG2_SLICE: - case V4L2_PIX_FMT_VP8_FRAME: - case V4L2_PIX_FMT_HEVC_SLICE: - case V4L2_PIX_FMT_VP9_FRAME: - vq->subsystem_flags &= ~(VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF); - break; - case V4L2_PIX_FMT_H264_SLICE: - vq->subsystem_flags |= VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF; - break; - default: - break; - } -} - -static int hantro_set_fmt_out(struct hantro_ctx *ctx, - struct v4l2_pix_format_mplane *pix_mp) -{ - struct vb2_queue *vq; - int ret; - - vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, - V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); - ret = hantro_try_fmt(ctx, pix_mp, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); - if (ret) - return ret; - - if (!ctx->is_encoder) { - struct vb2_queue *peer_vq; - - /* - * In order to support dynamic resolution change, - * the decoder admits a resolution change, as long - * as the pixelformat remains. Can't be done if streaming. - */ - if (vb2_is_streaming(vq) || (vb2_is_busy(vq) && - pix_mp->pixelformat != ctx->src_fmt.pixelformat)) - return -EBUSY; - /* - * Since format change on the OUTPUT queue will reset - * the CAPTURE queue, we can't allow doing so - * when the CAPTURE queue has buffers allocated. - */ - peer_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, - V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); - if (vb2_is_busy(peer_vq)) - return -EBUSY; - } else { - /* - * The encoder doesn't admit a format change if - * there are OUTPUT buffers allocated. - */ - if (vb2_is_busy(vq)) - return -EBUSY; - } - - ctx->vpu_src_fmt = hantro_find_format(ctx, pix_mp->pixelformat); - ctx->src_fmt = *pix_mp; - - /* - * Current raw format might have become invalid with newly - * selected codec, so reset it to default just to be safe and - * keep internal driver state sane. User is mandated to set - * the raw format again after we return, so we don't need - * anything smarter. - * Note that hantro_reset_raw_fmt() also propagates size - * changes to the raw format. - */ - if (!ctx->is_encoder) - hantro_reset_raw_fmt(ctx); - - /* Colorimetry information are always propagated. */ - ctx->dst_fmt.colorspace = pix_mp->colorspace; - ctx->dst_fmt.ycbcr_enc = pix_mp->ycbcr_enc; - ctx->dst_fmt.xfer_func = pix_mp->xfer_func; - ctx->dst_fmt.quantization = pix_mp->quantization; - - hantro_update_requires_request(ctx, pix_mp->pixelformat); - hantro_update_requires_hold_capture_buf(ctx, pix_mp->pixelformat); - - vpu_debug(0, "OUTPUT codec mode: %d\n", ctx->vpu_src_fmt->codec_mode); - vpu_debug(0, "fmt - w: %d, h: %d\n", - pix_mp->width, pix_mp->height); - return 0; -} - -static int hantro_set_fmt_cap(struct hantro_ctx *ctx, - struct v4l2_pix_format_mplane *pix_mp) -{ - struct vb2_queue *vq; - int ret; - - /* Change not allowed if queue is busy. */ - vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, - V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); - if (vb2_is_busy(vq)) - return -EBUSY; - - if (ctx->is_encoder) { - struct vb2_queue *peer_vq; - - /* - * Since format change on the CAPTURE queue will reset - * the OUTPUT queue, we can't allow doing so - * when the OUTPUT queue has buffers allocated. - */ - peer_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, - V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); - if (vb2_is_busy(peer_vq) && - (pix_mp->pixelformat != ctx->dst_fmt.pixelformat || - pix_mp->height != ctx->dst_fmt.height || - pix_mp->width != ctx->dst_fmt.width)) - return -EBUSY; - } - - ret = hantro_try_fmt(ctx, pix_mp, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); - if (ret) - return ret; - - ctx->vpu_dst_fmt = hantro_find_format(ctx, pix_mp->pixelformat); - ctx->dst_fmt = *pix_mp; - - /* - * Current raw format might have become invalid with newly - * selected codec, so reset it to default just to be safe and - * keep internal driver state sane. User is mandated to set - * the raw format again after we return, so we don't need - * anything smarter. - * Note that hantro_reset_raw_fmt() also propagates size - * changes to the raw format. - */ - if (ctx->is_encoder) - hantro_reset_raw_fmt(ctx); - - /* Colorimetry information are always propagated. */ - ctx->src_fmt.colorspace = pix_mp->colorspace; - ctx->src_fmt.ycbcr_enc = pix_mp->ycbcr_enc; - ctx->src_fmt.xfer_func = pix_mp->xfer_func; - ctx->src_fmt.quantization = pix_mp->quantization; - - vpu_debug(0, "CAPTURE codec mode: %d\n", ctx->vpu_dst_fmt->codec_mode); - vpu_debug(0, "fmt - w: %d, h: %d\n", - pix_mp->width, pix_mp->height); - - hantro_update_requires_request(ctx, pix_mp->pixelformat); - - return 0; -} - -static int -vidioc_s_fmt_out_mplane(struct file *file, void *priv, struct v4l2_format *f) -{ - return hantro_set_fmt_out(fh_to_ctx(priv), &f->fmt.pix_mp); -} - -static int -vidioc_s_fmt_cap_mplane(struct file *file, void *priv, struct v4l2_format *f) -{ - return hantro_set_fmt_cap(fh_to_ctx(priv), &f->fmt.pix_mp); -} - -static int vidioc_g_selection(struct file *file, void *priv, - struct v4l2_selection *sel) -{ - struct hantro_ctx *ctx = fh_to_ctx(priv); - - /* Crop only supported on source. */ - if (!ctx->is_encoder || - sel->type != V4L2_BUF_TYPE_VIDEO_OUTPUT) - return -EINVAL; - - switch (sel->target) { - case V4L2_SEL_TGT_CROP_DEFAULT: - case V4L2_SEL_TGT_CROP_BOUNDS: - sel->r.top = 0; - sel->r.left = 0; - sel->r.width = ctx->src_fmt.width; - sel->r.height = ctx->src_fmt.height; - break; - case V4L2_SEL_TGT_CROP: - sel->r.top = 0; - sel->r.left = 0; - sel->r.width = ctx->dst_fmt.width; - sel->r.height = ctx->dst_fmt.height; - break; - default: - return -EINVAL; - } - - return 0; -} - -static int vidioc_s_selection(struct file *file, void *priv, - struct v4l2_selection *sel) -{ - struct hantro_ctx *ctx = fh_to_ctx(priv); - struct v4l2_rect *rect = &sel->r; - struct vb2_queue *vq; - - /* Crop only supported on source. */ - if (!ctx->is_encoder || - sel->type != V4L2_BUF_TYPE_VIDEO_OUTPUT) - return -EINVAL; - - /* Change not allowed if the queue is streaming. */ - vq = v4l2_m2m_get_src_vq(ctx->fh.m2m_ctx); - if (vb2_is_streaming(vq)) - return -EBUSY; - - if (sel->target != V4L2_SEL_TGT_CROP) - return -EINVAL; - - /* - * We do not support offsets, and we can crop only inside - * right-most or bottom-most macroblocks. - */ - if (rect->left != 0 || rect->top != 0 || - round_up(rect->width, MB_DIM) != ctx->src_fmt.width || - round_up(rect->height, MB_DIM) != ctx->src_fmt.height) { - /* Default to full frame for incorrect settings. */ - rect->left = 0; - rect->top = 0; - rect->width = ctx->src_fmt.width; - rect->height = ctx->src_fmt.height; - } else { - /* We support widths aligned to 4 pixels and arbitrary heights. */ - rect->width = round_up(rect->width, 4); - } - - ctx->dst_fmt.width = rect->width; - ctx->dst_fmt.height = rect->height; - - return 0; -} - -static const struct v4l2_event hantro_eos_event = { - .type = V4L2_EVENT_EOS -}; - -static int vidioc_encoder_cmd(struct file *file, void *priv, - struct v4l2_encoder_cmd *ec) -{ - struct hantro_ctx *ctx = fh_to_ctx(priv); - int ret; - - ret = v4l2_m2m_ioctl_try_encoder_cmd(file, priv, ec); - if (ret < 0) - return ret; - - if (!vb2_is_streaming(v4l2_m2m_get_src_vq(ctx->fh.m2m_ctx)) || - !vb2_is_streaming(v4l2_m2m_get_dst_vq(ctx->fh.m2m_ctx))) - return 0; - - ret = v4l2_m2m_ioctl_encoder_cmd(file, priv, ec); - if (ret < 0) - return ret; - - if (ec->cmd == V4L2_ENC_CMD_STOP && - v4l2_m2m_has_stopped(ctx->fh.m2m_ctx)) - v4l2_event_queue_fh(&ctx->fh, &hantro_eos_event); - - if (ec->cmd == V4L2_ENC_CMD_START) - vb2_clear_last_buffer_dequeued(&ctx->fh.m2m_ctx->cap_q_ctx.q); - - return 0; -} - -const struct v4l2_ioctl_ops hantro_ioctl_ops = { - .vidioc_querycap = vidioc_querycap, - .vidioc_enum_framesizes = vidioc_enum_framesizes, - - .vidioc_try_fmt_vid_cap_mplane = vidioc_try_fmt_cap_mplane, - .vidioc_try_fmt_vid_out_mplane = vidioc_try_fmt_out_mplane, - .vidioc_s_fmt_vid_out_mplane = vidioc_s_fmt_out_mplane, - .vidioc_s_fmt_vid_cap_mplane = vidioc_s_fmt_cap_mplane, - .vidioc_g_fmt_vid_out_mplane = vidioc_g_fmt_out_mplane, - .vidioc_g_fmt_vid_cap_mplane = vidioc_g_fmt_cap_mplane, - .vidioc_enum_fmt_vid_out = vidioc_enum_fmt_vid_out, - .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap, - - .vidioc_reqbufs = v4l2_m2m_ioctl_reqbufs, - .vidioc_querybuf = v4l2_m2m_ioctl_querybuf, - .vidioc_qbuf = v4l2_m2m_ioctl_qbuf, - .vidioc_dqbuf = v4l2_m2m_ioctl_dqbuf, - .vidioc_prepare_buf = v4l2_m2m_ioctl_prepare_buf, - .vidioc_create_bufs = v4l2_m2m_ioctl_create_bufs, - .vidioc_expbuf = v4l2_m2m_ioctl_expbuf, - - .vidioc_subscribe_event = v4l2_ctrl_subscribe_event, - .vidioc_unsubscribe_event = v4l2_event_unsubscribe, - - .vidioc_streamon = v4l2_m2m_ioctl_streamon, - .vidioc_streamoff = v4l2_m2m_ioctl_streamoff, - - .vidioc_g_selection = vidioc_g_selection, - .vidioc_s_selection = vidioc_s_selection, - - .vidioc_try_encoder_cmd = v4l2_m2m_ioctl_try_encoder_cmd, - .vidioc_encoder_cmd = vidioc_encoder_cmd, -}; - -static int -hantro_queue_setup(struct vb2_queue *vq, unsigned int *num_buffers, - unsigned int *num_planes, unsigned int sizes[], - struct device *alloc_devs[]) -{ - struct hantro_ctx *ctx = vb2_get_drv_priv(vq); - struct v4l2_pix_format_mplane *pixfmt; - int i; - - switch (vq->type) { - case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: - pixfmt = &ctx->dst_fmt; - break; - case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: - pixfmt = &ctx->src_fmt; - break; - default: - vpu_err("invalid queue type: %d\n", vq->type); - return -EINVAL; - } - - if (*num_planes) { - if (*num_planes != pixfmt->num_planes) - return -EINVAL; - for (i = 0; i < pixfmt->num_planes; ++i) - if (sizes[i] < pixfmt->plane_fmt[i].sizeimage) - return -EINVAL; - return 0; - } - - *num_planes = pixfmt->num_planes; - for (i = 0; i < pixfmt->num_planes; ++i) - sizes[i] = pixfmt->plane_fmt[i].sizeimage; - return 0; -} - -static int -hantro_buf_plane_check(struct vb2_buffer *vb, - struct v4l2_pix_format_mplane *pixfmt) -{ - unsigned int sz; - int i; - - for (i = 0; i < pixfmt->num_planes; ++i) { - sz = pixfmt->plane_fmt[i].sizeimage; - vpu_debug(4, "plane %d size: %ld, sizeimage: %u\n", - i, vb2_plane_size(vb, i), sz); - if (vb2_plane_size(vb, i) < sz) { - vpu_err("plane %d is too small for output\n", i); - return -EINVAL; - } - } - return 0; -} - -static int hantro_buf_prepare(struct vb2_buffer *vb) -{ - struct vb2_queue *vq = vb->vb2_queue; - struct hantro_ctx *ctx = vb2_get_drv_priv(vq); - struct v4l2_pix_format_mplane *pix_fmt; - int ret; - - if (V4L2_TYPE_IS_OUTPUT(vq->type)) - pix_fmt = &ctx->src_fmt; - else - pix_fmt = &ctx->dst_fmt; - ret = hantro_buf_plane_check(vb, pix_fmt); - if (ret) - return ret; - /* - * Buffer's bytesused must be written by driver for CAPTURE buffers. - * (for OUTPUT buffers, if userspace passes 0 bytesused, v4l2-core sets - * it to buffer length). - */ - if (V4L2_TYPE_IS_CAPTURE(vq->type)) { - if (ctx->is_encoder) - vb2_set_plane_payload(vb, 0, 0); - else - vb2_set_plane_payload(vb, 0, pix_fmt->plane_fmt[0].sizeimage); - } - - return 0; -} - -static void hantro_buf_queue(struct vb2_buffer *vb) -{ - struct hantro_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue); - struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); - - if (V4L2_TYPE_IS_CAPTURE(vb->vb2_queue->type) && - vb2_is_streaming(vb->vb2_queue) && - v4l2_m2m_dst_buf_is_last(ctx->fh.m2m_ctx)) { - unsigned int i; - - for (i = 0; i < vb->num_planes; i++) - vb2_set_plane_payload(vb, i, 0); - - vbuf->field = V4L2_FIELD_NONE; - vbuf->sequence = ctx->sequence_cap++; - - v4l2_m2m_last_buffer_done(ctx->fh.m2m_ctx, vbuf); - v4l2_event_queue_fh(&ctx->fh, &hantro_eos_event); - return; - } - - v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf); -} - -static bool hantro_vq_is_coded(struct vb2_queue *q) -{ - struct hantro_ctx *ctx = vb2_get_drv_priv(q); - - return ctx->is_encoder != V4L2_TYPE_IS_OUTPUT(q->type); -} - -static int hantro_start_streaming(struct vb2_queue *q, unsigned int count) -{ - struct hantro_ctx *ctx = vb2_get_drv_priv(q); - int ret = 0; - - v4l2_m2m_update_start_streaming_state(ctx->fh.m2m_ctx, q); - - if (V4L2_TYPE_IS_OUTPUT(q->type)) - ctx->sequence_out = 0; - else - ctx->sequence_cap = 0; - - if (hantro_vq_is_coded(q)) { - enum hantro_codec_mode codec_mode; - - if (V4L2_TYPE_IS_OUTPUT(q->type)) - codec_mode = ctx->vpu_src_fmt->codec_mode; - else - codec_mode = ctx->vpu_dst_fmt->codec_mode; - - vpu_debug(4, "Codec mode = %d\n", codec_mode); - ctx->codec_ops = &ctx->dev->variant->codec_ops[codec_mode]; - if (ctx->codec_ops->init) { - ret = ctx->codec_ops->init(ctx); - if (ret) - return ret; - } - - if (hantro_needs_postproc(ctx, ctx->vpu_dst_fmt)) { - ret = hantro_postproc_alloc(ctx); - if (ret) - goto err_codec_exit; - } - } - return ret; - -err_codec_exit: - if (ctx->codec_ops->exit) - ctx->codec_ops->exit(ctx); - return ret; -} - -static void -hantro_return_bufs(struct vb2_queue *q, - struct vb2_v4l2_buffer *(*buf_remove)(struct v4l2_m2m_ctx *)) -{ - struct hantro_ctx *ctx = vb2_get_drv_priv(q); - - for (;;) { - struct vb2_v4l2_buffer *vbuf; - - vbuf = buf_remove(ctx->fh.m2m_ctx); - if (!vbuf) - break; - v4l2_ctrl_request_complete(vbuf->vb2_buf.req_obj.req, - &ctx->ctrl_handler); - v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR); - } -} - -static void hantro_stop_streaming(struct vb2_queue *q) -{ - struct hantro_ctx *ctx = vb2_get_drv_priv(q); - - if (hantro_vq_is_coded(q)) { - hantro_postproc_free(ctx); - if (ctx->codec_ops && ctx->codec_ops->exit) - ctx->codec_ops->exit(ctx); - } - - /* - * The mem2mem framework calls v4l2_m2m_cancel_job before - * .stop_streaming, so there isn't any job running and - * it is safe to return all the buffers. - */ - if (V4L2_TYPE_IS_OUTPUT(q->type)) - hantro_return_bufs(q, v4l2_m2m_src_buf_remove); - else - hantro_return_bufs(q, v4l2_m2m_dst_buf_remove); - - v4l2_m2m_update_stop_streaming_state(ctx->fh.m2m_ctx, q); - - if (V4L2_TYPE_IS_OUTPUT(q->type) && - v4l2_m2m_has_stopped(ctx->fh.m2m_ctx)) - v4l2_event_queue_fh(&ctx->fh, &hantro_eos_event); -} - -static void hantro_buf_request_complete(struct vb2_buffer *vb) -{ - struct hantro_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue); - - v4l2_ctrl_request_complete(vb->req_obj.req, &ctx->ctrl_handler); -} - -static int hantro_buf_out_validate(struct vb2_buffer *vb) -{ - struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); - - vbuf->field = V4L2_FIELD_NONE; - return 0; -} - -const struct vb2_ops hantro_queue_ops = { - .queue_setup = hantro_queue_setup, - .buf_prepare = hantro_buf_prepare, - .buf_queue = hantro_buf_queue, - .buf_out_validate = hantro_buf_out_validate, - .buf_request_complete = hantro_buf_request_complete, - .start_streaming = hantro_start_streaming, - .stop_streaming = hantro_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, -}; diff --git a/drivers/staging/media/hantro/hantro_v4l2.h b/drivers/staging/media/hantro/hantro_v4l2.h deleted file mode 100644 index 64f6f57e9d7a..000000000000 --- a/drivers/staging/media/hantro/hantro_v4l2.h +++ /dev/null @@ -1,29 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Hantro VPU codec driver - * - * Copyright (C) 2018 Rockchip Electronics Co., Ltd. - * Alpha Lin <Alpha.Lin@rock-chips.com> - * Jeffy Chen <jeffy.chen@rock-chips.com> - * - * Copyright 2018 Google LLC. - * Tomasz Figa <tfiga@chromium.org> - * - * Based on s5p-mfc driver by Samsung Electronics Co., Ltd. - * Copyright (C) 2011 Samsung Electronics Co., Ltd. - */ - -#ifndef HANTRO_V4L2_H_ -#define HANTRO_V4L2_H_ - -#include "hantro.h" - -extern const struct v4l2_ioctl_ops hantro_ioctl_ops; -extern const struct vb2_ops hantro_queue_ops; - -void hantro_reset_fmts(struct hantro_ctx *ctx); -int hantro_get_format_depth(u32 fourcc); -const struct hantro_fmt * -hantro_get_default_fmt(const struct hantro_ctx *ctx, bool bitstream); - -#endif /* HANTRO_V4L2_H_ */ diff --git a/drivers/staging/media/hantro/hantro_vp8.c b/drivers/staging/media/hantro/hantro_vp8.c deleted file mode 100644 index 381bc1d3bfda..000000000000 --- a/drivers/staging/media/hantro/hantro_vp8.c +++ /dev/null @@ -1,201 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Hantro VPU codec driver - * - * Copyright (C) 2018 Rockchip Electronics Co., Ltd. - */ - -#include "hantro.h" - -/* - * probs table with packed - */ -struct vp8_prob_tbl_packed { - u8 prob_mb_skip_false; - u8 prob_intra; - u8 prob_ref_last; - u8 prob_ref_golden; - u8 prob_segment[3]; - u8 padding0; - - u8 prob_luma_16x16_pred_mode[4]; - u8 prob_chroma_pred_mode[3]; - u8 padding1; - - /* mv prob */ - u8 prob_mv_context[2][V4L2_VP8_MV_PROB_CNT]; - u8 padding2[2]; - - /* coeff probs */ - u8 prob_coeffs[4][8][3][V4L2_VP8_COEFF_PROB_CNT]; - u8 padding3[96]; -}; - -/* - * filter taps taken to 7-bit precision, - * reference RFC6386#Page-16, filters[8][6] - */ -const u32 hantro_vp8_dec_mc_filter[8][6] = { - { 0, 0, 128, 0, 0, 0 }, - { 0, -6, 123, 12, -1, 0 }, - { 2, -11, 108, 36, -8, 1 }, - { 0, -9, 93, 50, -6, 0 }, - { 3, -16, 77, 77, -16, 3 }, - { 0, -6, 50, 93, -9, 0 }, - { 1, -8, 36, 108, -11, 2 }, - { 0, -1, 12, 123, -6, 0 } -}; - -void hantro_vp8_prob_update(struct hantro_ctx *ctx, - const struct v4l2_ctrl_vp8_frame *hdr) -{ - const struct v4l2_vp8_entropy *entropy = &hdr->entropy; - u32 i, j, k; - u8 *dst; - - /* first probs */ - dst = ctx->vp8_dec.prob_tbl.cpu; - - dst[0] = hdr->prob_skip_false; - dst[1] = hdr->prob_intra; - dst[2] = hdr->prob_last; - dst[3] = hdr->prob_gf; - dst[4] = hdr->segment.segment_probs[0]; - dst[5] = hdr->segment.segment_probs[1]; - dst[6] = hdr->segment.segment_probs[2]; - dst[7] = 0; - - dst += 8; - dst[0] = entropy->y_mode_probs[0]; - dst[1] = entropy->y_mode_probs[1]; - dst[2] = entropy->y_mode_probs[2]; - dst[3] = entropy->y_mode_probs[3]; - dst[4] = entropy->uv_mode_probs[0]; - dst[5] = entropy->uv_mode_probs[1]; - dst[6] = entropy->uv_mode_probs[2]; - dst[7] = 0; /*unused */ - - /* mv probs */ - dst += 8; - dst[0] = entropy->mv_probs[0][0]; /* is short */ - dst[1] = entropy->mv_probs[1][0]; - dst[2] = entropy->mv_probs[0][1]; /* sign */ - dst[3] = entropy->mv_probs[1][1]; - dst[4] = entropy->mv_probs[0][8 + 9]; - dst[5] = entropy->mv_probs[0][9 + 9]; - dst[6] = entropy->mv_probs[1][8 + 9]; - dst[7] = entropy->mv_probs[1][9 + 9]; - dst += 8; - for (i = 0; i < 2; ++i) { - for (j = 0; j < 8; j += 4) { - dst[0] = entropy->mv_probs[i][j + 9 + 0]; - dst[1] = entropy->mv_probs[i][j + 9 + 1]; - dst[2] = entropy->mv_probs[i][j + 9 + 2]; - dst[3] = entropy->mv_probs[i][j + 9 + 3]; - dst += 4; - } - } - for (i = 0; i < 2; ++i) { - dst[0] = entropy->mv_probs[i][0 + 2]; - dst[1] = entropy->mv_probs[i][1 + 2]; - dst[2] = entropy->mv_probs[i][2 + 2]; - dst[3] = entropy->mv_probs[i][3 + 2]; - dst[4] = entropy->mv_probs[i][4 + 2]; - dst[5] = entropy->mv_probs[i][5 + 2]; - dst[6] = entropy->mv_probs[i][6 + 2]; - dst[7] = 0; /*unused */ - dst += 8; - } - - /* coeff probs (header part) */ - dst = ctx->vp8_dec.prob_tbl.cpu; - dst += (8 * 7); - for (i = 0; i < 4; ++i) { - for (j = 0; j < 8; ++j) { - for (k = 0; k < 3; ++k) { - dst[0] = entropy->coeff_probs[i][j][k][0]; - dst[1] = entropy->coeff_probs[i][j][k][1]; - dst[2] = entropy->coeff_probs[i][j][k][2]; - dst[3] = entropy->coeff_probs[i][j][k][3]; - dst += 4; - } - } - } - - /* coeff probs (footer part) */ - dst = ctx->vp8_dec.prob_tbl.cpu; - dst += (8 * 55); - for (i = 0; i < 4; ++i) { - for (j = 0; j < 8; ++j) { - for (k = 0; k < 3; ++k) { - dst[0] = entropy->coeff_probs[i][j][k][4]; - dst[1] = entropy->coeff_probs[i][j][k][5]; - dst[2] = entropy->coeff_probs[i][j][k][6]; - dst[3] = entropy->coeff_probs[i][j][k][7]; - dst[4] = entropy->coeff_probs[i][j][k][8]; - dst[5] = entropy->coeff_probs[i][j][k][9]; - dst[6] = entropy->coeff_probs[i][j][k][10]; - dst[7] = 0; /*unused */ - dst += 8; - } - } - } -} - -int hantro_vp8_dec_init(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - struct hantro_aux_buf *aux_buf; - unsigned int mb_width, mb_height; - size_t segment_map_size; - int ret; - - /* segment map table size calculation */ - mb_width = DIV_ROUND_UP(ctx->dst_fmt.width, 16); - mb_height = DIV_ROUND_UP(ctx->dst_fmt.height, 16); - segment_map_size = round_up(DIV_ROUND_UP(mb_width * mb_height, 4), 64); - - /* - * In context init the dma buffer for segment map must be allocated. - * And the data in segment map buffer must be set to all zero. - */ - aux_buf = &ctx->vp8_dec.segment_map; - aux_buf->size = segment_map_size; - aux_buf->cpu = dma_alloc_coherent(vpu->dev, aux_buf->size, - &aux_buf->dma, GFP_KERNEL); - if (!aux_buf->cpu) - return -ENOMEM; - - /* - * Allocate probability table buffer, - * total 1208 bytes, 4K page is far enough. - */ - aux_buf = &ctx->vp8_dec.prob_tbl; - aux_buf->size = sizeof(struct vp8_prob_tbl_packed); - aux_buf->cpu = dma_alloc_coherent(vpu->dev, aux_buf->size, - &aux_buf->dma, GFP_KERNEL); - if (!aux_buf->cpu) { - ret = -ENOMEM; - goto err_free_seg_map; - } - - return 0; - -err_free_seg_map: - dma_free_coherent(vpu->dev, ctx->vp8_dec.segment_map.size, - ctx->vp8_dec.segment_map.cpu, - ctx->vp8_dec.segment_map.dma); - - return ret; -} - -void hantro_vp8_dec_exit(struct hantro_ctx *ctx) -{ - struct hantro_vp8_dec_hw_ctx *vp8_dec = &ctx->vp8_dec; - struct hantro_dev *vpu = ctx->dev; - - dma_free_coherent(vpu->dev, vp8_dec->segment_map.size, - vp8_dec->segment_map.cpu, vp8_dec->segment_map.dma); - dma_free_coherent(vpu->dev, vp8_dec->prob_tbl.size, - vp8_dec->prob_tbl.cpu, vp8_dec->prob_tbl.dma); -} diff --git a/drivers/staging/media/hantro/hantro_vp9.c b/drivers/staging/media/hantro/hantro_vp9.c deleted file mode 100644 index 566cd376c097..000000000000 --- a/drivers/staging/media/hantro/hantro_vp9.c +++ /dev/null @@ -1,240 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Hantro VP9 codec driver - * - * Copyright (C) 2021 Collabora Ltd. - */ - -#include <linux/types.h> -#include <media/v4l2-mem2mem.h> - -#include "hantro.h" -#include "hantro_hw.h" -#include "hantro_vp9.h" - -#define POW2(x) (1 << (x)) - -#define MAX_LOG2_TILE_COLUMNS 6 -#define MAX_NUM_TILE_COLS POW2(MAX_LOG2_TILE_COLUMNS) -#define MAX_TILE_COLS 20 -#define MAX_TILE_ROWS 22 - -static size_t hantro_vp9_tile_filter_size(unsigned int height) -{ - u32 h, height32, size; - - h = roundup(height, 8); - - height32 = roundup(h, 64); - size = 24 * height32 * (MAX_NUM_TILE_COLS - 1); /* luma: 8, chroma: 8 + 8 */ - - return size; -} - -static size_t hantro_vp9_bsd_control_size(unsigned int height) -{ - u32 h, height32; - - h = roundup(height, 8); - height32 = roundup(h, 64); - - return 16 * (height32 / 4) * (MAX_NUM_TILE_COLS - 1); -} - -static size_t hantro_vp9_segment_map_size(unsigned int width, unsigned int height) -{ - u32 w, h; - int num_ctbs; - - w = roundup(width, 8); - h = roundup(height, 8); - num_ctbs = ((w + 63) / 64) * ((h + 63) / 64); - - return num_ctbs * 32; -} - -static inline size_t hantro_vp9_prob_tab_size(void) -{ - return roundup(sizeof(struct hantro_g2_all_probs), 16); -} - -static inline size_t hantro_vp9_count_tab_size(void) -{ - return roundup(sizeof(struct symbol_counts), 16); -} - -static inline size_t hantro_vp9_tile_info_size(void) -{ - return roundup((MAX_TILE_COLS * MAX_TILE_ROWS * 4 * sizeof(u16) + 15 + 16) & ~0xf, 16); -} - -static void *get_coeffs_arr(struct symbol_counts *cnts, int i, int j, int k, int l, int m) -{ - if (i == 0) - return &cnts->count_coeffs[j][k][l][m]; - - if (i == 1) - return &cnts->count_coeffs8x8[j][k][l][m]; - - if (i == 2) - return &cnts->count_coeffs16x16[j][k][l][m]; - - if (i == 3) - return &cnts->count_coeffs32x32[j][k][l][m]; - - return NULL; -} - -static void *get_eobs1(struct symbol_counts *cnts, int i, int j, int k, int l, int m) -{ - if (i == 0) - return &cnts->count_coeffs[j][k][l][m][3]; - - if (i == 1) - return &cnts->count_coeffs8x8[j][k][l][m][3]; - - if (i == 2) - return &cnts->count_coeffs16x16[j][k][l][m][3]; - - if (i == 3) - return &cnts->count_coeffs32x32[j][k][l][m][3]; - - return NULL; -} - -#define INNER_LOOP \ - do { \ - for (m = 0; m < ARRAY_SIZE(vp9_ctx->cnts.coeff[i][0][0][0]); ++m) { \ - vp9_ctx->cnts.coeff[i][j][k][l][m] = \ - get_coeffs_arr(cnts, i, j, k, l, m); \ - vp9_ctx->cnts.eob[i][j][k][l][m][0] = \ - &cnts->count_eobs[i][j][k][l][m]; \ - vp9_ctx->cnts.eob[i][j][k][l][m][1] = \ - get_eobs1(cnts, i, j, k, l, m); \ - } \ - } while (0) - -static void init_v4l2_vp9_count_tbl(struct hantro_ctx *ctx) -{ - struct hantro_vp9_dec_hw_ctx *vp9_ctx = &ctx->vp9_dec; - struct symbol_counts *cnts = vp9_ctx->misc.cpu + vp9_ctx->ctx_counters_offset; - int i, j, k, l, m; - - vp9_ctx->cnts.partition = &cnts->partition_counts; - vp9_ctx->cnts.skip = &cnts->mbskip_count; - vp9_ctx->cnts.intra_inter = &cnts->intra_inter_count; - vp9_ctx->cnts.tx32p = &cnts->tx32x32_count; - /* - * g2 hardware uses tx16x16_count[2][3], while the api - * expects tx16p[2][4], so this must be explicitly copied - * into vp9_ctx->cnts.tx16p when passing the data to the - * vp9 library function - */ - vp9_ctx->cnts.tx8p = &cnts->tx8x8_count; - - vp9_ctx->cnts.y_mode = &cnts->sb_ymode_counts; - vp9_ctx->cnts.uv_mode = &cnts->uv_mode_counts; - vp9_ctx->cnts.comp = &cnts->comp_inter_count; - vp9_ctx->cnts.comp_ref = &cnts->comp_ref_count; - vp9_ctx->cnts.single_ref = &cnts->single_ref_count; - vp9_ctx->cnts.filter = &cnts->switchable_interp_counts; - vp9_ctx->cnts.mv_joint = &cnts->mv_counts.joints; - vp9_ctx->cnts.sign = &cnts->mv_counts.sign; - vp9_ctx->cnts.classes = &cnts->mv_counts.classes; - vp9_ctx->cnts.class0 = &cnts->mv_counts.class0; - vp9_ctx->cnts.bits = &cnts->mv_counts.bits; - vp9_ctx->cnts.class0_fp = &cnts->mv_counts.class0_fp; - vp9_ctx->cnts.fp = &cnts->mv_counts.fp; - vp9_ctx->cnts.class0_hp = &cnts->mv_counts.class0_hp; - vp9_ctx->cnts.hp = &cnts->mv_counts.hp; - - for (i = 0; i < ARRAY_SIZE(vp9_ctx->cnts.coeff); ++i) - for (j = 0; j < ARRAY_SIZE(vp9_ctx->cnts.coeff[i]); ++j) - for (k = 0; k < ARRAY_SIZE(vp9_ctx->cnts.coeff[i][0]); ++k) - for (l = 0; l < ARRAY_SIZE(vp9_ctx->cnts.coeff[i][0][0]); ++l) - INNER_LOOP; -} - -int hantro_vp9_dec_init(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - const struct hantro_variant *variant = vpu->variant; - struct hantro_vp9_dec_hw_ctx *vp9_dec = &ctx->vp9_dec; - struct hantro_aux_buf *tile_edge = &vp9_dec->tile_edge; - struct hantro_aux_buf *segment_map = &vp9_dec->segment_map; - struct hantro_aux_buf *misc = &vp9_dec->misc; - u32 i, max_width, max_height, size; - - if (variant->num_dec_fmts < 1) - return -EINVAL; - - for (i = 0; i < variant->num_dec_fmts; ++i) - if (variant->dec_fmts[i].fourcc == V4L2_PIX_FMT_VP9_FRAME) - break; - - if (i == variant->num_dec_fmts) - return -EINVAL; - - max_width = vpu->variant->dec_fmts[i].frmsize.max_width; - max_height = vpu->variant->dec_fmts[i].frmsize.max_height; - - size = hantro_vp9_tile_filter_size(max_height); - vp9_dec->bsd_ctrl_offset = size; - size += hantro_vp9_bsd_control_size(max_height); - - tile_edge->cpu = dma_alloc_coherent(vpu->dev, size, &tile_edge->dma, GFP_KERNEL); - if (!tile_edge->cpu) - return -ENOMEM; - - tile_edge->size = size; - memset(tile_edge->cpu, 0, size); - - size = hantro_vp9_segment_map_size(max_width, max_height); - vp9_dec->segment_map_size = size; - size *= 2; /* we need two areas of this size, used alternately */ - - segment_map->cpu = dma_alloc_coherent(vpu->dev, size, &segment_map->dma, GFP_KERNEL); - if (!segment_map->cpu) - goto err_segment_map; - - segment_map->size = size; - memset(segment_map->cpu, 0, size); - - size = hantro_vp9_prob_tab_size(); - vp9_dec->ctx_counters_offset = size; - size += hantro_vp9_count_tab_size(); - vp9_dec->tile_info_offset = size; - size += hantro_vp9_tile_info_size(); - - misc->cpu = dma_alloc_coherent(vpu->dev, size, &misc->dma, GFP_KERNEL); - if (!misc->cpu) - goto err_misc; - - misc->size = size; - memset(misc->cpu, 0, size); - - init_v4l2_vp9_count_tbl(ctx); - - return 0; - -err_misc: - dma_free_coherent(vpu->dev, segment_map->size, segment_map->cpu, segment_map->dma); - -err_segment_map: - dma_free_coherent(vpu->dev, tile_edge->size, tile_edge->cpu, tile_edge->dma); - - return -ENOMEM; -} - -void hantro_vp9_dec_exit(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - struct hantro_vp9_dec_hw_ctx *vp9_dec = &ctx->vp9_dec; - struct hantro_aux_buf *tile_edge = &vp9_dec->tile_edge; - struct hantro_aux_buf *segment_map = &vp9_dec->segment_map; - struct hantro_aux_buf *misc = &vp9_dec->misc; - - dma_free_coherent(vpu->dev, misc->size, misc->cpu, misc->dma); - dma_free_coherent(vpu->dev, segment_map->size, segment_map->cpu, segment_map->dma); - dma_free_coherent(vpu->dev, tile_edge->size, tile_edge->cpu, tile_edge->dma); -} diff --git a/drivers/staging/media/hantro/hantro_vp9.h b/drivers/staging/media/hantro/hantro_vp9.h deleted file mode 100644 index 26b69275f098..000000000000 --- a/drivers/staging/media/hantro/hantro_vp9.h +++ /dev/null @@ -1,102 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Hantro VP9 codec driver - * - * Copyright (C) 2021 Collabora Ltd. - */ - -struct hantro_g2_mv_probs { - u8 joint[3]; - u8 sign[2]; - u8 class0_bit[2][1]; - u8 fr[2][3]; - u8 class0_hp[2]; - u8 hp[2]; - u8 classes[2][10]; - u8 class0_fr[2][2][3]; - u8 bits[2][10]; -}; - -struct hantro_g2_probs { - u8 inter_mode[7][4]; - u8 is_inter[4]; - u8 uv_mode[10][8]; - u8 tx8[2][1]; - u8 tx16[2][2]; - u8 tx32[2][3]; - u8 y_mode_tail[4][1]; - u8 y_mode[4][8]; - u8 partition[2][16][4]; /* [keyframe][][], [inter][][] */ - u8 uv_mode_tail[10][1]; - u8 interp_filter[4][2]; - u8 comp_mode[5]; - u8 skip[3]; - - u8 pad1[1]; - - struct hantro_g2_mv_probs mv; - - u8 single_ref[5][2]; - u8 comp_ref[5]; - - u8 pad2[17]; - - u8 coef[4][2][2][6][6][4]; -}; - -struct hantro_g2_all_probs { - u8 kf_y_mode_prob[10][10][8]; - - u8 kf_y_mode_prob_tail[10][10][1]; - u8 ref_pred_probs[3]; - u8 mb_segment_tree_probs[7]; - u8 segment_pred_probs[3]; - u8 ref_scores[4]; - u8 prob_comppred[2]; - - u8 pad1[9]; - - u8 kf_uv_mode_prob[10][8]; - u8 kf_uv_mode_prob_tail[10][1]; - - u8 pad2[6]; - - struct hantro_g2_probs probs; -}; - -struct mv_counts { - u32 joints[4]; - u32 sign[2][2]; - u32 classes[2][11]; - u32 class0[2][2]; - u32 bits[2][10][2]; - u32 class0_fp[2][2][4]; - u32 fp[2][4]; - u32 class0_hp[2][2]; - u32 hp[2][2]; -}; - -struct symbol_counts { - u32 inter_mode_counts[7][3][2]; - u32 sb_ymode_counts[4][10]; - u32 uv_mode_counts[10][10]; - u32 partition_counts[16][4]; - u32 switchable_interp_counts[4][3]; - u32 intra_inter_count[4][2]; - u32 comp_inter_count[5][2]; - u32 single_ref_count[5][2][2]; - u32 comp_ref_count[5][2]; - u32 tx32x32_count[2][4]; - u32 tx16x16_count[2][3]; - u32 tx8x8_count[2][2]; - u32 mbskip_count[3][2]; - - struct mv_counts mv_counts; - - u32 count_coeffs[2][2][6][6][4]; - u32 count_coeffs8x8[2][2][6][6][4]; - u32 count_coeffs16x16[2][2][6][6][4]; - u32 count_coeffs32x32[2][2][6][6][4]; - - u32 count_eobs[4][2][2][6][6]; -}; diff --git a/drivers/staging/media/hantro/imx8m_vpu_hw.c b/drivers/staging/media/hantro/imx8m_vpu_hw.c deleted file mode 100644 index 77f574fdfa77..000000000000 --- a/drivers/staging/media/hantro/imx8m_vpu_hw.c +++ /dev/null @@ -1,373 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Hantro VPU codec driver - * - * Copyright (C) 2019 Pengutronix, Philipp Zabel <kernel@pengutronix.de> - */ - -#include <linux/clk.h> -#include <linux/delay.h> - -#include "hantro.h" -#include "hantro_jpeg.h" -#include "hantro_g1_regs.h" -#include "hantro_g2_regs.h" - -#define CTRL_SOFT_RESET 0x00 -#define RESET_G1 BIT(1) -#define RESET_G2 BIT(0) - -#define CTRL_CLOCK_ENABLE 0x04 -#define CLOCK_G1 BIT(1) -#define CLOCK_G2 BIT(0) - -#define CTRL_G1_DEC_FUSE 0x08 -#define CTRL_G1_PP_FUSE 0x0c -#define CTRL_G2_DEC_FUSE 0x10 - -static void imx8m_soft_reset(struct hantro_dev *vpu, u32 reset_bits) -{ - u32 val; - - /* Assert */ - val = readl(vpu->ctrl_base + CTRL_SOFT_RESET); - val &= ~reset_bits; - writel(val, vpu->ctrl_base + CTRL_SOFT_RESET); - - udelay(2); - - /* Release */ - val = readl(vpu->ctrl_base + CTRL_SOFT_RESET); - val |= reset_bits; - writel(val, vpu->ctrl_base + CTRL_SOFT_RESET); -} - -static void imx8m_clk_enable(struct hantro_dev *vpu, u32 clock_bits) -{ - u32 val; - - val = readl(vpu->ctrl_base + CTRL_CLOCK_ENABLE); - val |= clock_bits; - writel(val, vpu->ctrl_base + CTRL_CLOCK_ENABLE); -} - -static int imx8mq_runtime_resume(struct hantro_dev *vpu) -{ - int ret; - - ret = clk_bulk_prepare_enable(vpu->variant->num_clocks, vpu->clocks); - if (ret) { - dev_err(vpu->dev, "Failed to enable clocks\n"); - return ret; - } - - imx8m_soft_reset(vpu, RESET_G1 | RESET_G2); - imx8m_clk_enable(vpu, CLOCK_G1 | CLOCK_G2); - - /* Set values of the fuse registers */ - writel(0xffffffff, vpu->ctrl_base + CTRL_G1_DEC_FUSE); - writel(0xffffffff, vpu->ctrl_base + CTRL_G1_PP_FUSE); - writel(0xffffffff, vpu->ctrl_base + CTRL_G2_DEC_FUSE); - - clk_bulk_disable_unprepare(vpu->variant->num_clocks, vpu->clocks); - - return 0; -} - -/* - * Supported formats. - */ - -static const struct hantro_fmt imx8m_vpu_postproc_fmts[] = { - { - .fourcc = V4L2_PIX_FMT_YUYV, - .codec_mode = HANTRO_MODE_NONE, - .postprocessed = true, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_UHD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_UHD_HEIGHT, - .step_height = MB_DIM, - }, - }, -}; - -static const struct hantro_fmt imx8m_vpu_dec_fmts[] = { - { - .fourcc = V4L2_PIX_FMT_NV12, - .codec_mode = HANTRO_MODE_NONE, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_UHD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_UHD_HEIGHT, - .step_height = MB_DIM, - }, - }, - { - .fourcc = V4L2_PIX_FMT_MPEG2_SLICE, - .codec_mode = HANTRO_MODE_MPEG2_DEC, - .max_depth = 2, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_FHD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_FHD_HEIGHT, - .step_height = MB_DIM, - }, - }, - { - .fourcc = V4L2_PIX_FMT_VP8_FRAME, - .codec_mode = HANTRO_MODE_VP8_DEC, - .max_depth = 2, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_UHD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_UHD_HEIGHT, - .step_height = MB_DIM, - }, - }, - { - .fourcc = V4L2_PIX_FMT_H264_SLICE, - .codec_mode = HANTRO_MODE_H264_DEC, - .max_depth = 2, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_UHD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_UHD_HEIGHT, - .step_height = MB_DIM, - }, - }, -}; - -static const struct hantro_fmt imx8m_vpu_g2_postproc_fmts[] = { - { - .fourcc = V4L2_PIX_FMT_NV12, - .codec_mode = HANTRO_MODE_NONE, - .postprocessed = true, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_UHD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_UHD_HEIGHT, - .step_height = MB_DIM, - }, - }, -}; - -static const struct hantro_fmt imx8m_vpu_g2_dec_fmts[] = { - { - .fourcc = V4L2_PIX_FMT_NV12_4L4, - .codec_mode = HANTRO_MODE_NONE, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_UHD_WIDTH, - .step_width = TILE_MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_UHD_HEIGHT, - .step_height = TILE_MB_DIM, - }, - }, - { - .fourcc = V4L2_PIX_FMT_HEVC_SLICE, - .codec_mode = HANTRO_MODE_HEVC_DEC, - .max_depth = 2, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_UHD_WIDTH, - .step_width = TILE_MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_UHD_HEIGHT, - .step_height = TILE_MB_DIM, - }, - }, - { - .fourcc = V4L2_PIX_FMT_VP9_FRAME, - .codec_mode = HANTRO_MODE_VP9_DEC, - .max_depth = 2, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_UHD_WIDTH, - .step_width = TILE_MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_UHD_HEIGHT, - .step_height = TILE_MB_DIM, - }, - }, -}; - -static irqreturn_t imx8m_vpu_g1_irq(int irq, void *dev_id) -{ - struct hantro_dev *vpu = dev_id; - enum vb2_buffer_state state; - u32 status; - - status = vdpu_read(vpu, G1_REG_INTERRUPT); - state = (status & G1_REG_INTERRUPT_DEC_RDY_INT) ? - VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR; - - vdpu_write(vpu, 0, G1_REG_INTERRUPT); - vdpu_write(vpu, G1_REG_CONFIG_DEC_CLK_GATE_E, G1_REG_CONFIG); - - hantro_irq_done(vpu, state); - - return IRQ_HANDLED; -} - -static int imx8mq_vpu_hw_init(struct hantro_dev *vpu) -{ - vpu->ctrl_base = vpu->reg_bases[vpu->variant->num_regs - 1]; - - return 0; -} - -static void imx8m_vpu_g1_reset(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - - imx8m_soft_reset(vpu, RESET_G1); -} - -/* - * Supported codec ops. - */ - -static const struct hantro_codec_ops imx8mq_vpu_codec_ops[] = { - [HANTRO_MODE_MPEG2_DEC] = { - .run = hantro_g1_mpeg2_dec_run, - .reset = imx8m_vpu_g1_reset, - .init = hantro_mpeg2_dec_init, - .exit = hantro_mpeg2_dec_exit, - }, - [HANTRO_MODE_VP8_DEC] = { - .run = hantro_g1_vp8_dec_run, - .reset = imx8m_vpu_g1_reset, - .init = hantro_vp8_dec_init, - .exit = hantro_vp8_dec_exit, - }, - [HANTRO_MODE_H264_DEC] = { - .run = hantro_g1_h264_dec_run, - .reset = imx8m_vpu_g1_reset, - .init = hantro_h264_dec_init, - .exit = hantro_h264_dec_exit, - }, -}; - -static const struct hantro_codec_ops imx8mq_vpu_g1_codec_ops[] = { - [HANTRO_MODE_MPEG2_DEC] = { - .run = hantro_g1_mpeg2_dec_run, - .init = hantro_mpeg2_dec_init, - .exit = hantro_mpeg2_dec_exit, - }, - [HANTRO_MODE_VP8_DEC] = { - .run = hantro_g1_vp8_dec_run, - .init = hantro_vp8_dec_init, - .exit = hantro_vp8_dec_exit, - }, - [HANTRO_MODE_H264_DEC] = { - .run = hantro_g1_h264_dec_run, - .init = hantro_h264_dec_init, - .exit = hantro_h264_dec_exit, - }, -}; - -static const struct hantro_codec_ops imx8mq_vpu_g2_codec_ops[] = { - [HANTRO_MODE_HEVC_DEC] = { - .run = hantro_g2_hevc_dec_run, - .init = hantro_hevc_dec_init, - .exit = hantro_hevc_dec_exit, - }, - [HANTRO_MODE_VP9_DEC] = { - .run = hantro_g2_vp9_dec_run, - .done = hantro_g2_vp9_dec_done, - .init = hantro_vp9_dec_init, - .exit = hantro_vp9_dec_exit, - }, -}; - -/* - * VPU variants. - */ - -static const struct hantro_irq imx8mq_irqs[] = { - { "g1", imx8m_vpu_g1_irq }, -}; - -static const struct hantro_irq imx8mq_g2_irqs[] = { - { "g2", hantro_g2_irq }, -}; - -static const char * const imx8mq_clk_names[] = { "g1", "g2", "bus" }; -static const char * const imx8mq_reg_names[] = { "g1", "g2", "ctrl" }; -static const char * const imx8mq_g1_clk_names[] = { "g1" }; -static const char * const imx8mq_g2_clk_names[] = { "g2" }; - -const struct hantro_variant imx8mq_vpu_variant = { - .dec_fmts = imx8m_vpu_dec_fmts, - .num_dec_fmts = ARRAY_SIZE(imx8m_vpu_dec_fmts), - .postproc_fmts = imx8m_vpu_postproc_fmts, - .num_postproc_fmts = ARRAY_SIZE(imx8m_vpu_postproc_fmts), - .postproc_ops = &hantro_g1_postproc_ops, - .codec = HANTRO_MPEG2_DECODER | HANTRO_VP8_DECODER | - HANTRO_H264_DECODER, - .codec_ops = imx8mq_vpu_codec_ops, - .init = imx8mq_vpu_hw_init, - .runtime_resume = imx8mq_runtime_resume, - .irqs = imx8mq_irqs, - .num_irqs = ARRAY_SIZE(imx8mq_irqs), - .clk_names = imx8mq_clk_names, - .num_clocks = ARRAY_SIZE(imx8mq_clk_names), - .reg_names = imx8mq_reg_names, - .num_regs = ARRAY_SIZE(imx8mq_reg_names) -}; - -const struct hantro_variant imx8mq_vpu_g1_variant = { - .dec_fmts = imx8m_vpu_dec_fmts, - .num_dec_fmts = ARRAY_SIZE(imx8m_vpu_dec_fmts), - .postproc_fmts = imx8m_vpu_postproc_fmts, - .num_postproc_fmts = ARRAY_SIZE(imx8m_vpu_postproc_fmts), - .postproc_ops = &hantro_g1_postproc_ops, - .codec = HANTRO_MPEG2_DECODER | HANTRO_VP8_DECODER | - HANTRO_H264_DECODER, - .codec_ops = imx8mq_vpu_g1_codec_ops, - .irqs = imx8mq_irqs, - .num_irqs = ARRAY_SIZE(imx8mq_irqs), - .clk_names = imx8mq_g1_clk_names, - .num_clocks = ARRAY_SIZE(imx8mq_g1_clk_names), -}; - -const struct hantro_variant imx8mq_vpu_g2_variant = { - .dec_offset = 0x0, - .dec_fmts = imx8m_vpu_g2_dec_fmts, - .num_dec_fmts = ARRAY_SIZE(imx8m_vpu_g2_dec_fmts), - .postproc_fmts = imx8m_vpu_g2_postproc_fmts, - .num_postproc_fmts = ARRAY_SIZE(imx8m_vpu_g2_postproc_fmts), - .postproc_ops = &hantro_g2_postproc_ops, - .codec = HANTRO_HEVC_DECODER | HANTRO_VP9_DECODER, - .codec_ops = imx8mq_vpu_g2_codec_ops, - .irqs = imx8mq_g2_irqs, - .num_irqs = ARRAY_SIZE(imx8mq_g2_irqs), - .clk_names = imx8mq_g2_clk_names, - .num_clocks = ARRAY_SIZE(imx8mq_g2_clk_names), -}; - -const struct hantro_variant imx8mm_vpu_g1_variant = { - .dec_fmts = imx8m_vpu_dec_fmts, - .num_dec_fmts = ARRAY_SIZE(imx8m_vpu_dec_fmts), - .codec = HANTRO_MPEG2_DECODER | HANTRO_VP8_DECODER | - HANTRO_H264_DECODER, - .codec_ops = imx8mq_vpu_g1_codec_ops, - .irqs = imx8mq_irqs, - .num_irqs = ARRAY_SIZE(imx8mq_irqs), - .clk_names = imx8mq_g1_clk_names, - .num_clocks = ARRAY_SIZE(imx8mq_g1_clk_names), -}; diff --git a/drivers/staging/media/hantro/rockchip_vpu2_hw_h264_dec.c b/drivers/staging/media/hantro/rockchip_vpu2_hw_h264_dec.c deleted file mode 100644 index 46c1a83bcc4e..000000000000 --- a/drivers/staging/media/hantro/rockchip_vpu2_hw_h264_dec.c +++ /dev/null @@ -1,491 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Hantro VPU codec driver - * - * Copyright (c) 2014 Rockchip Electronics Co., Ltd. - * Hertz Wong <hertz.wong@rock-chips.com> - * Herman Chen <herman.chen@rock-chips.com> - * - * Copyright (C) 2014 Google, Inc. - * Tomasz Figa <tfiga@chromium.org> - */ - -#include <linux/types.h> -#include <linux/sort.h> - -#include <media/v4l2-mem2mem.h> - -#include "hantro_hw.h" -#include "hantro_v4l2.h" - -#define VDPU_SWREG(nr) ((nr) * 4) - -#define VDPU_REG_DEC_OUT_BASE VDPU_SWREG(63) -#define VDPU_REG_RLC_VLC_BASE VDPU_SWREG(64) -#define VDPU_REG_QTABLE_BASE VDPU_SWREG(61) -#define VDPU_REG_DIR_MV_BASE VDPU_SWREG(62) -#define VDPU_REG_REFER_BASE(i) (VDPU_SWREG(84 + (i))) -#define VDPU_REG_DEC_E(v) ((v) ? BIT(0) : 0) - -#define VDPU_REG_DEC_ADV_PRE_DIS(v) ((v) ? BIT(11) : 0) -#define VDPU_REG_DEC_SCMD_DIS(v) ((v) ? BIT(10) : 0) -#define VDPU_REG_FILTERING_DIS(v) ((v) ? BIT(8) : 0) -#define VDPU_REG_PIC_FIXED_QUANT(v) ((v) ? BIT(7) : 0) -#define VDPU_REG_DEC_LATENCY(v) (((v) << 1) & GENMASK(6, 1)) - -#define VDPU_REG_INIT_QP(v) (((v) << 25) & GENMASK(30, 25)) -#define VDPU_REG_STREAM_LEN(v) (((v) << 0) & GENMASK(23, 0)) - -#define VDPU_REG_APF_THRESHOLD(v) (((v) << 17) & GENMASK(30, 17)) -#define VDPU_REG_STARTMB_X(v) (((v) << 8) & GENMASK(16, 8)) -#define VDPU_REG_STARTMB_Y(v) (((v) << 0) & GENMASK(7, 0)) - -#define VDPU_REG_DEC_MODE(v) (((v) << 0) & GENMASK(3, 0)) - -#define VDPU_REG_DEC_STRENDIAN_E(v) ((v) ? BIT(5) : 0) -#define VDPU_REG_DEC_STRSWAP32_E(v) ((v) ? BIT(4) : 0) -#define VDPU_REG_DEC_OUTSWAP32_E(v) ((v) ? BIT(3) : 0) -#define VDPU_REG_DEC_INSWAP32_E(v) ((v) ? BIT(2) : 0) -#define VDPU_REG_DEC_OUT_ENDIAN(v) ((v) ? BIT(1) : 0) -#define VDPU_REG_DEC_IN_ENDIAN(v) ((v) ? BIT(0) : 0) - -#define VDPU_REG_DEC_DATA_DISC_E(v) ((v) ? BIT(22) : 0) -#define VDPU_REG_DEC_MAX_BURST(v) (((v) << 16) & GENMASK(20, 16)) -#define VDPU_REG_DEC_AXI_WR_ID(v) (((v) << 8) & GENMASK(15, 8)) -#define VDPU_REG_DEC_AXI_RD_ID(v) (((v) << 0) & GENMASK(7, 0)) - -#define VDPU_REG_START_CODE_E(v) ((v) ? BIT(22) : 0) -#define VDPU_REG_CH_8PIX_ILEAV_E(v) ((v) ? BIT(21) : 0) -#define VDPU_REG_RLC_MODE_E(v) ((v) ? BIT(20) : 0) -#define VDPU_REG_PIC_INTERLACE_E(v) ((v) ? BIT(17) : 0) -#define VDPU_REG_PIC_FIELDMODE_E(v) ((v) ? BIT(16) : 0) -#define VDPU_REG_PIC_TOPFIELD_E(v) ((v) ? BIT(13) : 0) -#define VDPU_REG_WRITE_MVS_E(v) ((v) ? BIT(10) : 0) -#define VDPU_REG_SEQ_MBAFF_E(v) ((v) ? BIT(7) : 0) -#define VDPU_REG_PICORD_COUNT_E(v) ((v) ? BIT(6) : 0) -#define VDPU_REG_DEC_TIMEOUT_E(v) ((v) ? BIT(5) : 0) -#define VDPU_REG_DEC_CLK_GATE_E(v) ((v) ? BIT(4) : 0) - -#define VDPU_REG_PRED_BC_TAP_0_0(v) (((v) << 22) & GENMASK(31, 22)) -#define VDPU_REG_PRED_BC_TAP_0_1(v) (((v) << 12) & GENMASK(21, 12)) -#define VDPU_REG_PRED_BC_TAP_0_2(v) (((v) << 2) & GENMASK(11, 2)) - -#define VDPU_REG_REFBU_E(v) ((v) ? BIT(31) : 0) - -#define VDPU_REG_PINIT_RLIST_F9(v) (((v) << 25) & GENMASK(29, 25)) -#define VDPU_REG_PINIT_RLIST_F8(v) (((v) << 20) & GENMASK(24, 20)) -#define VDPU_REG_PINIT_RLIST_F7(v) (((v) << 15) & GENMASK(19, 15)) -#define VDPU_REG_PINIT_RLIST_F6(v) (((v) << 10) & GENMASK(14, 10)) -#define VDPU_REG_PINIT_RLIST_F5(v) (((v) << 5) & GENMASK(9, 5)) -#define VDPU_REG_PINIT_RLIST_F4(v) (((v) << 0) & GENMASK(4, 0)) - -#define VDPU_REG_PINIT_RLIST_F15(v) (((v) << 25) & GENMASK(29, 25)) -#define VDPU_REG_PINIT_RLIST_F14(v) (((v) << 20) & GENMASK(24, 20)) -#define VDPU_REG_PINIT_RLIST_F13(v) (((v) << 15) & GENMASK(19, 15)) -#define VDPU_REG_PINIT_RLIST_F12(v) (((v) << 10) & GENMASK(14, 10)) -#define VDPU_REG_PINIT_RLIST_F11(v) (((v) << 5) & GENMASK(9, 5)) -#define VDPU_REG_PINIT_RLIST_F10(v) (((v) << 0) & GENMASK(4, 0)) - -#define VDPU_REG_REFER1_NBR(v) (((v) << 16) & GENMASK(31, 16)) -#define VDPU_REG_REFER0_NBR(v) (((v) << 0) & GENMASK(15, 0)) - -#define VDPU_REG_REFER3_NBR(v) (((v) << 16) & GENMASK(31, 16)) -#define VDPU_REG_REFER2_NBR(v) (((v) << 0) & GENMASK(15, 0)) - -#define VDPU_REG_REFER5_NBR(v) (((v) << 16) & GENMASK(31, 16)) -#define VDPU_REG_REFER4_NBR(v) (((v) << 0) & GENMASK(15, 0)) - -#define VDPU_REG_REFER7_NBR(v) (((v) << 16) & GENMASK(31, 16)) -#define VDPU_REG_REFER6_NBR(v) (((v) << 0) & GENMASK(15, 0)) - -#define VDPU_REG_REFER9_NBR(v) (((v) << 16) & GENMASK(31, 16)) -#define VDPU_REG_REFER8_NBR(v) (((v) << 0) & GENMASK(15, 0)) - -#define VDPU_REG_REFER11_NBR(v) (((v) << 16) & GENMASK(31, 16)) -#define VDPU_REG_REFER10_NBR(v) (((v) << 0) & GENMASK(15, 0)) - -#define VDPU_REG_REFER13_NBR(v) (((v) << 16) & GENMASK(31, 16)) -#define VDPU_REG_REFER12_NBR(v) (((v) << 0) & GENMASK(15, 0)) - -#define VDPU_REG_REFER15_NBR(v) (((v) << 16) & GENMASK(31, 16)) -#define VDPU_REG_REFER14_NBR(v) (((v) << 0) & GENMASK(15, 0)) - -#define VDPU_REG_BINIT_RLIST_F5(v) (((v) << 25) & GENMASK(29, 25)) -#define VDPU_REG_BINIT_RLIST_F4(v) (((v) << 20) & GENMASK(24, 20)) -#define VDPU_REG_BINIT_RLIST_F3(v) (((v) << 15) & GENMASK(19, 15)) -#define VDPU_REG_BINIT_RLIST_F2(v) (((v) << 10) & GENMASK(14, 10)) -#define VDPU_REG_BINIT_RLIST_F1(v) (((v) << 5) & GENMASK(9, 5)) -#define VDPU_REG_BINIT_RLIST_F0(v) (((v) << 0) & GENMASK(4, 0)) - -#define VDPU_REG_BINIT_RLIST_F11(v) (((v) << 25) & GENMASK(29, 25)) -#define VDPU_REG_BINIT_RLIST_F10(v) (((v) << 20) & GENMASK(24, 20)) -#define VDPU_REG_BINIT_RLIST_F9(v) (((v) << 15) & GENMASK(19, 15)) -#define VDPU_REG_BINIT_RLIST_F8(v) (((v) << 10) & GENMASK(14, 10)) -#define VDPU_REG_BINIT_RLIST_F7(v) (((v) << 5) & GENMASK(9, 5)) -#define VDPU_REG_BINIT_RLIST_F6(v) (((v) << 0) & GENMASK(4, 0)) - -#define VDPU_REG_BINIT_RLIST_F15(v) (((v) << 15) & GENMASK(19, 15)) -#define VDPU_REG_BINIT_RLIST_F14(v) (((v) << 10) & GENMASK(14, 10)) -#define VDPU_REG_BINIT_RLIST_F13(v) (((v) << 5) & GENMASK(9, 5)) -#define VDPU_REG_BINIT_RLIST_F12(v) (((v) << 0) & GENMASK(4, 0)) - -#define VDPU_REG_BINIT_RLIST_B5(v) (((v) << 25) & GENMASK(29, 25)) -#define VDPU_REG_BINIT_RLIST_B4(v) (((v) << 20) & GENMASK(24, 20)) -#define VDPU_REG_BINIT_RLIST_B3(v) (((v) << 15) & GENMASK(19, 15)) -#define VDPU_REG_BINIT_RLIST_B2(v) (((v) << 10) & GENMASK(14, 10)) -#define VDPU_REG_BINIT_RLIST_B1(v) (((v) << 5) & GENMASK(9, 5)) -#define VDPU_REG_BINIT_RLIST_B0(v) (((v) << 0) & GENMASK(4, 0)) - -#define VDPU_REG_BINIT_RLIST_B11(v) (((v) << 25) & GENMASK(29, 25)) -#define VDPU_REG_BINIT_RLIST_B10(v) (((v) << 20) & GENMASK(24, 20)) -#define VDPU_REG_BINIT_RLIST_B9(v) (((v) << 15) & GENMASK(19, 15)) -#define VDPU_REG_BINIT_RLIST_B8(v) (((v) << 10) & GENMASK(14, 10)) -#define VDPU_REG_BINIT_RLIST_B7(v) (((v) << 5) & GENMASK(9, 5)) -#define VDPU_REG_BINIT_RLIST_B6(v) (((v) << 0) & GENMASK(4, 0)) - -#define VDPU_REG_BINIT_RLIST_B15(v) (((v) << 15) & GENMASK(19, 15)) -#define VDPU_REG_BINIT_RLIST_B14(v) (((v) << 10) & GENMASK(14, 10)) -#define VDPU_REG_BINIT_RLIST_B13(v) (((v) << 5) & GENMASK(9, 5)) -#define VDPU_REG_BINIT_RLIST_B12(v) (((v) << 0) & GENMASK(4, 0)) - -#define VDPU_REG_PINIT_RLIST_F3(v) (((v) << 15) & GENMASK(19, 15)) -#define VDPU_REG_PINIT_RLIST_F2(v) (((v) << 10) & GENMASK(14, 10)) -#define VDPU_REG_PINIT_RLIST_F1(v) (((v) << 5) & GENMASK(9, 5)) -#define VDPU_REG_PINIT_RLIST_F0(v) (((v) << 0) & GENMASK(4, 0)) - -#define VDPU_REG_REFER_LTERM_E(v) (((v) << 0) & GENMASK(31, 0)) - -#define VDPU_REG_REFER_VALID_E(v) (((v) << 0) & GENMASK(31, 0)) - -#define VDPU_REG_STRM_START_BIT(v) (((v) << 0) & GENMASK(5, 0)) - -#define VDPU_REG_CH_QP_OFFSET2(v) (((v) << 22) & GENMASK(26, 22)) -#define VDPU_REG_CH_QP_OFFSET(v) (((v) << 17) & GENMASK(21, 17)) -#define VDPU_REG_PIC_MB_HEIGHT_P(v) (((v) << 9) & GENMASK(16, 9)) -#define VDPU_REG_PIC_MB_WIDTH(v) (((v) << 0) & GENMASK(8, 0)) - -#define VDPU_REG_WEIGHT_BIPR_IDC(v) (((v) << 16) & GENMASK(17, 16)) -#define VDPU_REG_REF_FRAMES(v) (((v) << 0) & GENMASK(4, 0)) - -#define VDPU_REG_FILT_CTRL_PRES(v) ((v) ? BIT(31) : 0) -#define VDPU_REG_RDPIC_CNT_PRES(v) ((v) ? BIT(30) : 0) -#define VDPU_REG_FRAMENUM_LEN(v) (((v) << 16) & GENMASK(20, 16)) -#define VDPU_REG_FRAMENUM(v) (((v) << 0) & GENMASK(15, 0)) - -#define VDPU_REG_REFPIC_MK_LEN(v) (((v) << 16) & GENMASK(26, 16)) -#define VDPU_REG_IDR_PIC_ID(v) (((v) << 0) & GENMASK(15, 0)) - -#define VDPU_REG_PPS_ID(v) (((v) << 24) & GENMASK(31, 24)) -#define VDPU_REG_REFIDX1_ACTIVE(v) (((v) << 19) & GENMASK(23, 19)) -#define VDPU_REG_REFIDX0_ACTIVE(v) (((v) << 14) & GENMASK(18, 14)) -#define VDPU_REG_POC_LENGTH(v) (((v) << 0) & GENMASK(7, 0)) - -#define VDPU_REG_IDR_PIC_E(v) ((v) ? BIT(8) : 0) -#define VDPU_REG_DIR_8X8_INFER_E(v) ((v) ? BIT(7) : 0) -#define VDPU_REG_BLACKWHITE_E(v) ((v) ? BIT(6) : 0) -#define VDPU_REG_CABAC_E(v) ((v) ? BIT(5) : 0) -#define VDPU_REG_WEIGHT_PRED_E(v) ((v) ? BIT(4) : 0) -#define VDPU_REG_CONST_INTRA_E(v) ((v) ? BIT(3) : 0) -#define VDPU_REG_8X8TRANS_FLAG_E(v) ((v) ? BIT(2) : 0) -#define VDPU_REG_TYPE1_QUANT_E(v) ((v) ? BIT(1) : 0) -#define VDPU_REG_FIELDPIC_FLAG_E(v) ((v) ? BIT(0) : 0) - -static void set_params(struct hantro_ctx *ctx, struct vb2_v4l2_buffer *src_buf) -{ - const struct hantro_h264_dec_ctrls *ctrls = &ctx->h264_dec.ctrls; - const struct v4l2_ctrl_h264_decode_params *dec_param = ctrls->decode; - const struct v4l2_ctrl_h264_sps *sps = ctrls->sps; - const struct v4l2_ctrl_h264_pps *pps = ctrls->pps; - struct hantro_dev *vpu = ctx->dev; - u32 reg; - - reg = VDPU_REG_DEC_ADV_PRE_DIS(0) | - VDPU_REG_DEC_SCMD_DIS(0) | - VDPU_REG_FILTERING_DIS(0) | - VDPU_REG_PIC_FIXED_QUANT(0) | - VDPU_REG_DEC_LATENCY(0); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(50)); - - reg = VDPU_REG_INIT_QP(pps->pic_init_qp_minus26 + 26) | - VDPU_REG_STREAM_LEN(vb2_get_plane_payload(&src_buf->vb2_buf, 0)); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(51)); - - reg = VDPU_REG_APF_THRESHOLD(8) | - VDPU_REG_STARTMB_X(0) | - VDPU_REG_STARTMB_Y(0); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(52)); - - reg = VDPU_REG_DEC_MODE(0); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(53)); - - reg = VDPU_REG_DEC_STRENDIAN_E(1) | - VDPU_REG_DEC_STRSWAP32_E(1) | - VDPU_REG_DEC_OUTSWAP32_E(1) | - VDPU_REG_DEC_INSWAP32_E(1) | - VDPU_REG_DEC_OUT_ENDIAN(1) | - VDPU_REG_DEC_IN_ENDIAN(0); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(54)); - - reg = VDPU_REG_DEC_DATA_DISC_E(0) | - VDPU_REG_DEC_MAX_BURST(16) | - VDPU_REG_DEC_AXI_WR_ID(0) | - VDPU_REG_DEC_AXI_RD_ID(0xff); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(56)); - - reg = VDPU_REG_START_CODE_E(1) | - VDPU_REG_CH_8PIX_ILEAV_E(0) | - VDPU_REG_RLC_MODE_E(0) | - VDPU_REG_PIC_INTERLACE_E(!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY) && - (sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD || - dec_param->flags & V4L2_H264_DECODE_PARAM_FLAG_FIELD_PIC)) | - VDPU_REG_PIC_FIELDMODE_E(dec_param->flags & V4L2_H264_DECODE_PARAM_FLAG_FIELD_PIC) | - VDPU_REG_PIC_TOPFIELD_E(!(dec_param->flags & V4L2_H264_DECODE_PARAM_FLAG_BOTTOM_FIELD)) | - VDPU_REG_WRITE_MVS_E((sps->profile_idc > 66) && dec_param->nal_ref_idc) | - VDPU_REG_SEQ_MBAFF_E(sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD) | - VDPU_REG_PICORD_COUNT_E(sps->profile_idc > 66) | - VDPU_REG_DEC_TIMEOUT_E(1) | - VDPU_REG_DEC_CLK_GATE_E(1); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(57)); - - reg = VDPU_REG_PRED_BC_TAP_0_0(1) | - VDPU_REG_PRED_BC_TAP_0_1((u32)-5) | - VDPU_REG_PRED_BC_TAP_0_2(20); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(59)); - - reg = VDPU_REG_REFBU_E(0); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(65)); - - reg = VDPU_REG_STRM_START_BIT(0); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(109)); - - reg = VDPU_REG_CH_QP_OFFSET2(pps->second_chroma_qp_index_offset) | - VDPU_REG_CH_QP_OFFSET(pps->chroma_qp_index_offset) | - VDPU_REG_PIC_MB_HEIGHT_P(MB_HEIGHT(ctx->src_fmt.height)) | - VDPU_REG_PIC_MB_WIDTH(MB_WIDTH(ctx->src_fmt.width)); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(110)); - - reg = VDPU_REG_WEIGHT_BIPR_IDC(pps->weighted_bipred_idc) | - VDPU_REG_REF_FRAMES(sps->max_num_ref_frames); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(111)); - - reg = VDPU_REG_FILT_CTRL_PRES(pps->flags & V4L2_H264_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT) | - VDPU_REG_RDPIC_CNT_PRES(pps->flags & V4L2_H264_PPS_FLAG_REDUNDANT_PIC_CNT_PRESENT) | - VDPU_REG_FRAMENUM_LEN(sps->log2_max_frame_num_minus4 + 4) | - VDPU_REG_FRAMENUM(dec_param->frame_num); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(112)); - - reg = VDPU_REG_REFPIC_MK_LEN(dec_param->dec_ref_pic_marking_bit_size) | - VDPU_REG_IDR_PIC_ID(dec_param->idr_pic_id); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(113)); - - reg = VDPU_REG_PPS_ID(pps->pic_parameter_set_id) | - VDPU_REG_REFIDX1_ACTIVE(pps->num_ref_idx_l1_default_active_minus1 + 1) | - VDPU_REG_REFIDX0_ACTIVE(pps->num_ref_idx_l0_default_active_minus1 + 1) | - VDPU_REG_POC_LENGTH(dec_param->pic_order_cnt_bit_size); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(114)); - - reg = VDPU_REG_IDR_PIC_E(dec_param->flags & V4L2_H264_DECODE_PARAM_FLAG_IDR_PIC) | - VDPU_REG_DIR_8X8_INFER_E(sps->flags & V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE) | - VDPU_REG_BLACKWHITE_E(sps->profile_idc >= 100 && sps->chroma_format_idc == 0) | - VDPU_REG_CABAC_E(pps->flags & V4L2_H264_PPS_FLAG_ENTROPY_CODING_MODE) | - VDPU_REG_WEIGHT_PRED_E(pps->flags & V4L2_H264_PPS_FLAG_WEIGHTED_PRED) | - VDPU_REG_CONST_INTRA_E(pps->flags & V4L2_H264_PPS_FLAG_CONSTRAINED_INTRA_PRED) | - VDPU_REG_8X8TRANS_FLAG_E(pps->flags & V4L2_H264_PPS_FLAG_TRANSFORM_8X8_MODE) | - VDPU_REG_TYPE1_QUANT_E(pps->flags & V4L2_H264_PPS_FLAG_SCALING_MATRIX_PRESENT) | - VDPU_REG_FIELDPIC_FLAG_E(!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY)); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(115)); -} - -static void set_ref(struct hantro_ctx *ctx) -{ - const struct v4l2_h264_reference *b0_reflist, *b1_reflist, *p_reflist; - struct hantro_dev *vpu = ctx->dev; - u32 reg; - int i; - - b0_reflist = ctx->h264_dec.reflists.b0; - b1_reflist = ctx->h264_dec.reflists.b1; - p_reflist = ctx->h264_dec.reflists.p; - - reg = VDPU_REG_PINIT_RLIST_F9(p_reflist[9].index) | - VDPU_REG_PINIT_RLIST_F8(p_reflist[8].index) | - VDPU_REG_PINIT_RLIST_F7(p_reflist[7].index) | - VDPU_REG_PINIT_RLIST_F6(p_reflist[6].index) | - VDPU_REG_PINIT_RLIST_F5(p_reflist[5].index) | - VDPU_REG_PINIT_RLIST_F4(p_reflist[4].index); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(74)); - - reg = VDPU_REG_PINIT_RLIST_F15(p_reflist[15].index) | - VDPU_REG_PINIT_RLIST_F14(p_reflist[14].index) | - VDPU_REG_PINIT_RLIST_F13(p_reflist[13].index) | - VDPU_REG_PINIT_RLIST_F12(p_reflist[12].index) | - VDPU_REG_PINIT_RLIST_F11(p_reflist[11].index) | - VDPU_REG_PINIT_RLIST_F10(p_reflist[10].index); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(75)); - - reg = VDPU_REG_REFER1_NBR(hantro_h264_get_ref_nbr(ctx, 1)) | - VDPU_REG_REFER0_NBR(hantro_h264_get_ref_nbr(ctx, 0)); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(76)); - - reg = VDPU_REG_REFER3_NBR(hantro_h264_get_ref_nbr(ctx, 3)) | - VDPU_REG_REFER2_NBR(hantro_h264_get_ref_nbr(ctx, 2)); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(77)); - - reg = VDPU_REG_REFER5_NBR(hantro_h264_get_ref_nbr(ctx, 5)) | - VDPU_REG_REFER4_NBR(hantro_h264_get_ref_nbr(ctx, 4)); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(78)); - - reg = VDPU_REG_REFER7_NBR(hantro_h264_get_ref_nbr(ctx, 7)) | - VDPU_REG_REFER6_NBR(hantro_h264_get_ref_nbr(ctx, 6)); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(79)); - - reg = VDPU_REG_REFER9_NBR(hantro_h264_get_ref_nbr(ctx, 9)) | - VDPU_REG_REFER8_NBR(hantro_h264_get_ref_nbr(ctx, 8)); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(80)); - - reg = VDPU_REG_REFER11_NBR(hantro_h264_get_ref_nbr(ctx, 11)) | - VDPU_REG_REFER10_NBR(hantro_h264_get_ref_nbr(ctx, 10)); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(81)); - - reg = VDPU_REG_REFER13_NBR(hantro_h264_get_ref_nbr(ctx, 13)) | - VDPU_REG_REFER12_NBR(hantro_h264_get_ref_nbr(ctx, 12)); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(82)); - - reg = VDPU_REG_REFER15_NBR(hantro_h264_get_ref_nbr(ctx, 15)) | - VDPU_REG_REFER14_NBR(hantro_h264_get_ref_nbr(ctx, 14)); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(83)); - - reg = VDPU_REG_BINIT_RLIST_F5(b0_reflist[5].index) | - VDPU_REG_BINIT_RLIST_F4(b0_reflist[4].index) | - VDPU_REG_BINIT_RLIST_F3(b0_reflist[3].index) | - VDPU_REG_BINIT_RLIST_F2(b0_reflist[2].index) | - VDPU_REG_BINIT_RLIST_F1(b0_reflist[1].index) | - VDPU_REG_BINIT_RLIST_F0(b0_reflist[0].index); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(100)); - - reg = VDPU_REG_BINIT_RLIST_F11(b0_reflist[11].index) | - VDPU_REG_BINIT_RLIST_F10(b0_reflist[10].index) | - VDPU_REG_BINIT_RLIST_F9(b0_reflist[9].index) | - VDPU_REG_BINIT_RLIST_F8(b0_reflist[8].index) | - VDPU_REG_BINIT_RLIST_F7(b0_reflist[7].index) | - VDPU_REG_BINIT_RLIST_F6(b0_reflist[6].index); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(101)); - - reg = VDPU_REG_BINIT_RLIST_F15(b0_reflist[15].index) | - VDPU_REG_BINIT_RLIST_F14(b0_reflist[14].index) | - VDPU_REG_BINIT_RLIST_F13(b0_reflist[13].index) | - VDPU_REG_BINIT_RLIST_F12(b0_reflist[12].index); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(102)); - - reg = VDPU_REG_BINIT_RLIST_B5(b1_reflist[5].index) | - VDPU_REG_BINIT_RLIST_B4(b1_reflist[4].index) | - VDPU_REG_BINIT_RLIST_B3(b1_reflist[3].index) | - VDPU_REG_BINIT_RLIST_B2(b1_reflist[2].index) | - VDPU_REG_BINIT_RLIST_B1(b1_reflist[1].index) | - VDPU_REG_BINIT_RLIST_B0(b1_reflist[0].index); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(103)); - - reg = VDPU_REG_BINIT_RLIST_B11(b1_reflist[11].index) | - VDPU_REG_BINIT_RLIST_B10(b1_reflist[10].index) | - VDPU_REG_BINIT_RLIST_B9(b1_reflist[9].index) | - VDPU_REG_BINIT_RLIST_B8(b1_reflist[8].index) | - VDPU_REG_BINIT_RLIST_B7(b1_reflist[7].index) | - VDPU_REG_BINIT_RLIST_B6(b1_reflist[6].index); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(104)); - - reg = VDPU_REG_BINIT_RLIST_B15(b1_reflist[15].index) | - VDPU_REG_BINIT_RLIST_B14(b1_reflist[14].index) | - VDPU_REG_BINIT_RLIST_B13(b1_reflist[13].index) | - VDPU_REG_BINIT_RLIST_B12(b1_reflist[12].index); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(105)); - - reg = VDPU_REG_PINIT_RLIST_F3(p_reflist[3].index) | - VDPU_REG_PINIT_RLIST_F2(p_reflist[2].index) | - VDPU_REG_PINIT_RLIST_F1(p_reflist[1].index) | - VDPU_REG_PINIT_RLIST_F0(p_reflist[0].index); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(106)); - - reg = VDPU_REG_REFER_LTERM_E(ctx->h264_dec.dpb_longterm); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(107)); - - reg = VDPU_REG_REFER_VALID_E(ctx->h264_dec.dpb_valid); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(108)); - - /* Set up addresses of DPB buffers. */ - for (i = 0; i < HANTRO_H264_DPB_SIZE; i++) { - dma_addr_t dma_addr = hantro_h264_get_ref_buf(ctx, i); - - vdpu_write_relaxed(vpu, dma_addr, VDPU_REG_REFER_BASE(i)); - } -} - -static void set_buffers(struct hantro_ctx *ctx, struct vb2_v4l2_buffer *src_buf) -{ - const struct hantro_h264_dec_ctrls *ctrls = &ctx->h264_dec.ctrls; - struct vb2_v4l2_buffer *dst_buf; - struct hantro_dev *vpu = ctx->dev; - dma_addr_t src_dma, dst_dma; - size_t offset = 0; - - /* Source (stream) buffer. */ - src_dma = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0); - vdpu_write_relaxed(vpu, src_dma, VDPU_REG_RLC_VLC_BASE); - - /* Destination (decoded frame) buffer. */ - dst_buf = hantro_get_dst_buf(ctx); - dst_dma = hantro_get_dec_buf_addr(ctx, &dst_buf->vb2_buf); - /* Adjust dma addr to start at second line for bottom field */ - if (ctrls->decode->flags & V4L2_H264_DECODE_PARAM_FLAG_BOTTOM_FIELD) - offset = ALIGN(ctx->src_fmt.width, MB_DIM); - vdpu_write_relaxed(vpu, dst_dma + offset, VDPU_REG_DEC_OUT_BASE); - - /* Higher profiles require DMV buffer appended to reference frames. */ - if (ctrls->sps->profile_idc > 66 && ctrls->decode->nal_ref_idc) { - unsigned int bytes_per_mb = 384; - - /* DMV buffer for monochrome start directly after Y-plane */ - if (ctrls->sps->profile_idc >= 100 && - ctrls->sps->chroma_format_idc == 0) - bytes_per_mb = 256; - offset = bytes_per_mb * MB_WIDTH(ctx->src_fmt.width) * - MB_HEIGHT(ctx->src_fmt.height); - - /* - * DMV buffer is split in two for field encoded frames, - * adjust offset for bottom field - */ - if (ctrls->decode->flags & V4L2_H264_DECODE_PARAM_FLAG_BOTTOM_FIELD) - offset += 32 * MB_WIDTH(ctx->src_fmt.width) * - MB_HEIGHT(ctx->src_fmt.height); - vdpu_write_relaxed(vpu, dst_dma + offset, VDPU_REG_DIR_MV_BASE); - } - - /* Auxiliary buffer prepared in hantro_g1_h264_dec_prepare_table(). */ - vdpu_write_relaxed(vpu, ctx->h264_dec.priv.dma, VDPU_REG_QTABLE_BASE); -} - -int rockchip_vpu2_h264_dec_run(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - struct vb2_v4l2_buffer *src_buf; - u32 reg; - int ret; - - /* Prepare the H264 decoder context. */ - ret = hantro_h264_dec_prepare_run(ctx); - if (ret) - return ret; - - src_buf = hantro_get_src_buf(ctx); - set_params(ctx, src_buf); - set_ref(ctx); - set_buffers(ctx, src_buf); - - hantro_end_prepare_run(ctx); - - /* Start decoding! */ - reg = vdpu_read(vpu, VDPU_SWREG(57)) | VDPU_REG_DEC_E(1); - vdpu_write(vpu, reg, VDPU_SWREG(57)); - - return 0; -} diff --git a/drivers/staging/media/hantro/rockchip_vpu2_hw_jpeg_enc.c b/drivers/staging/media/hantro/rockchip_vpu2_hw_jpeg_enc.c deleted file mode 100644 index 8395c4d48dd0..000000000000 --- a/drivers/staging/media/hantro/rockchip_vpu2_hw_jpeg_enc.c +++ /dev/null @@ -1,197 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Hantro VPU codec driver - * - * Copyright (C) 2018 Rockchip Electronics Co., Ltd. - * - * JPEG encoder - * ------------ - * The VPU JPEG encoder produces JPEG baseline sequential format. - * The quantization coefficients are 8-bit values, complying with - * the baseline specification. Therefore, it requires - * luma and chroma quantization tables. The hardware does entropy - * encoding using internal Huffman tables, as specified in the JPEG - * specification. - * - * In other words, only the luma and chroma quantization tables are - * required for the encoding operation. - * - * Quantization luma table values are written to registers - * VEPU_swreg_0-VEPU_swreg_15, and chroma table values to - * VEPU_swreg_16-VEPU_swreg_31. A special order is needed, neither - * zigzag, nor linear. - */ - -#include <asm/unaligned.h> -#include <media/v4l2-mem2mem.h> -#include "hantro_jpeg.h" -#include "hantro.h" -#include "hantro_v4l2.h" -#include "hantro_hw.h" -#include "rockchip_vpu2_regs.h" - -#define VEPU_JPEG_QUANT_TABLE_COUNT 16 - -static void rockchip_vpu2_set_src_img_ctrl(struct hantro_dev *vpu, - struct hantro_ctx *ctx) -{ - u32 overfill_r, overfill_b; - u32 reg; - - /* - * The format width and height are already macroblock aligned - * by .vidioc_s_fmt_vid_cap_mplane() callback. Destination - * format width and height can be further modified by - * .vidioc_s_selection(), and the width is 4-aligned. - */ - overfill_r = ctx->src_fmt.width - ctx->dst_fmt.width; - overfill_b = ctx->src_fmt.height - ctx->dst_fmt.height; - - reg = VEPU_REG_IN_IMG_CTRL_ROW_LEN(ctx->src_fmt.width); - vepu_write_relaxed(vpu, reg, VEPU_REG_INPUT_LUMA_INFO); - - reg = VEPU_REG_IN_IMG_CTRL_OVRFLR_D4(overfill_r / 4) | - VEPU_REG_IN_IMG_CTRL_OVRFLB(overfill_b); - /* - * This register controls the input crop, as the offset - * from the right/bottom within the last macroblock. The offset from the - * right must be divided by 4 and so the crop must be aligned to 4 pixels - * horizontally. - */ - vepu_write_relaxed(vpu, reg, VEPU_REG_ENC_OVER_FILL_STRM_OFFSET); - - reg = VEPU_REG_IN_IMG_CTRL_FMT(ctx->vpu_src_fmt->enc_fmt); - vepu_write_relaxed(vpu, reg, VEPU_REG_ENC_CTRL1); -} - -static void rockchip_vpu2_jpeg_enc_set_buffers(struct hantro_dev *vpu, - struct hantro_ctx *ctx, - struct vb2_buffer *src_buf, - struct vb2_buffer *dst_buf) -{ - struct v4l2_pix_format_mplane *pix_fmt = &ctx->src_fmt; - dma_addr_t src[3]; - u32 size_left; - - size_left = vb2_plane_size(dst_buf, 0) - ctx->vpu_dst_fmt->header_size; - if (WARN_ON(vb2_plane_size(dst_buf, 0) < ctx->vpu_dst_fmt->header_size)) - size_left = 0; - - WARN_ON(pix_fmt->num_planes > 3); - - vepu_write_relaxed(vpu, vb2_dma_contig_plane_dma_addr(dst_buf, 0) + - ctx->vpu_dst_fmt->header_size, - VEPU_REG_ADDR_OUTPUT_STREAM); - vepu_write_relaxed(vpu, size_left, VEPU_REG_STR_BUF_LIMIT); - - if (pix_fmt->num_planes == 1) { - src[0] = vb2_dma_contig_plane_dma_addr(src_buf, 0); - vepu_write_relaxed(vpu, src[0], VEPU_REG_ADDR_IN_PLANE_0); - } else if (pix_fmt->num_planes == 2) { - src[0] = vb2_dma_contig_plane_dma_addr(src_buf, 0); - src[1] = vb2_dma_contig_plane_dma_addr(src_buf, 1); - vepu_write_relaxed(vpu, src[0], VEPU_REG_ADDR_IN_PLANE_0); - vepu_write_relaxed(vpu, src[1], VEPU_REG_ADDR_IN_PLANE_1); - } else { - src[0] = vb2_dma_contig_plane_dma_addr(src_buf, 0); - src[1] = vb2_dma_contig_plane_dma_addr(src_buf, 1); - src[2] = vb2_dma_contig_plane_dma_addr(src_buf, 2); - vepu_write_relaxed(vpu, src[0], VEPU_REG_ADDR_IN_PLANE_0); - vepu_write_relaxed(vpu, src[1], VEPU_REG_ADDR_IN_PLANE_1); - vepu_write_relaxed(vpu, src[2], VEPU_REG_ADDR_IN_PLANE_2); - } -} - -static void -rockchip_vpu2_jpeg_enc_set_qtable(struct hantro_dev *vpu, - unsigned char *luma_qtable, - unsigned char *chroma_qtable) -{ - u32 reg, i; - __be32 *luma_qtable_p; - __be32 *chroma_qtable_p; - - luma_qtable_p = (__be32 *)luma_qtable; - chroma_qtable_p = (__be32 *)chroma_qtable; - - /* - * Quantization table registers must be written in contiguous blocks. - * DO NOT collapse the below two "for" loops into one. - */ - for (i = 0; i < VEPU_JPEG_QUANT_TABLE_COUNT; i++) { - reg = get_unaligned_be32(&luma_qtable_p[i]); - vepu_write_relaxed(vpu, reg, VEPU_REG_JPEG_LUMA_QUAT(i)); - } - - for (i = 0; i < VEPU_JPEG_QUANT_TABLE_COUNT; i++) { - reg = get_unaligned_be32(&chroma_qtable_p[i]); - vepu_write_relaxed(vpu, reg, VEPU_REG_JPEG_CHROMA_QUAT(i)); - } -} - -int rockchip_vpu2_jpeg_enc_run(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - struct vb2_v4l2_buffer *src_buf, *dst_buf; - struct hantro_jpeg_ctx jpeg_ctx; - u32 reg; - - src_buf = hantro_get_src_buf(ctx); - dst_buf = hantro_get_dst_buf(ctx); - - hantro_start_prepare_run(ctx); - - memset(&jpeg_ctx, 0, sizeof(jpeg_ctx)); - jpeg_ctx.buffer = vb2_plane_vaddr(&dst_buf->vb2_buf, 0); - if (!jpeg_ctx.buffer) - return -ENOMEM; - - jpeg_ctx.width = ctx->dst_fmt.width; - jpeg_ctx.height = ctx->dst_fmt.height; - jpeg_ctx.quality = ctx->jpeg_quality; - hantro_jpeg_header_assemble(&jpeg_ctx); - - /* Switch to JPEG encoder mode before writing registers */ - vepu_write_relaxed(vpu, VEPU_REG_ENCODE_FORMAT_JPEG, - VEPU_REG_ENCODE_START); - - rockchip_vpu2_set_src_img_ctrl(vpu, ctx); - rockchip_vpu2_jpeg_enc_set_buffers(vpu, ctx, &src_buf->vb2_buf, - &dst_buf->vb2_buf); - rockchip_vpu2_jpeg_enc_set_qtable(vpu, jpeg_ctx.hw_luma_qtable, - jpeg_ctx.hw_chroma_qtable); - - reg = VEPU_REG_OUTPUT_SWAP32 - | VEPU_REG_OUTPUT_SWAP16 - | VEPU_REG_OUTPUT_SWAP8 - | VEPU_REG_INPUT_SWAP8 - | VEPU_REG_INPUT_SWAP16 - | VEPU_REG_INPUT_SWAP32; - /* Make sure that all registers are written at this point. */ - vepu_write(vpu, reg, VEPU_REG_DATA_ENDIAN); - - reg = VEPU_REG_AXI_CTRL_BURST_LEN(16); - vepu_write_relaxed(vpu, reg, VEPU_REG_AXI_CTRL); - - reg = VEPU_REG_MB_WIDTH(MB_WIDTH(ctx->src_fmt.width)) - | VEPU_REG_MB_HEIGHT(MB_HEIGHT(ctx->src_fmt.height)) - | VEPU_REG_FRAME_TYPE_INTRA - | VEPU_REG_ENCODE_FORMAT_JPEG - | VEPU_REG_ENCODE_ENABLE; - - /* Kick the watchdog and start encoding */ - hantro_end_prepare_run(ctx); - vepu_write(vpu, reg, VEPU_REG_ENCODE_START); - - return 0; -} - -void rockchip_vpu2_jpeg_enc_done(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - u32 bytesused = vepu_read(vpu, VEPU_REG_STR_BUF_LIMIT) / 8; - struct vb2_v4l2_buffer *dst_buf = hantro_get_dst_buf(ctx); - - vb2_set_plane_payload(&dst_buf->vb2_buf, 0, - ctx->vpu_dst_fmt->header_size + bytesused); -} diff --git a/drivers/staging/media/hantro/rockchip_vpu2_hw_mpeg2_dec.c b/drivers/staging/media/hantro/rockchip_vpu2_hw_mpeg2_dec.c deleted file mode 100644 index b66737fab46b..000000000000 --- a/drivers/staging/media/hantro/rockchip_vpu2_hw_mpeg2_dec.c +++ /dev/null @@ -1,248 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Hantro VPU codec driver - * - * Copyright (C) 2018 Rockchip Electronics Co., Ltd. - */ - -#include <asm/unaligned.h> -#include <linux/bitfield.h> -#include <media/v4l2-mem2mem.h> -#include "hantro.h" -#include "hantro_hw.h" - -#define VDPU_SWREG(nr) ((nr) * 4) - -#define VDPU_REG_DEC_OUT_BASE VDPU_SWREG(63) -#define VDPU_REG_RLC_VLC_BASE VDPU_SWREG(64) -#define VDPU_REG_QTABLE_BASE VDPU_SWREG(61) -#define VDPU_REG_REFER0_BASE VDPU_SWREG(131) -#define VDPU_REG_REFER2_BASE VDPU_SWREG(134) -#define VDPU_REG_REFER3_BASE VDPU_SWREG(135) -#define VDPU_REG_REFER1_BASE VDPU_SWREG(148) -#define VDPU_REG_DEC_E(v) ((v) ? BIT(0) : 0) - -#define VDPU_REG_DEC_ADV_PRE_DIS(v) ((v) ? BIT(11) : 0) -#define VDPU_REG_DEC_SCMD_DIS(v) ((v) ? BIT(10) : 0) -#define VDPU_REG_FILTERING_DIS(v) ((v) ? BIT(8) : 0) -#define VDPU_REG_DEC_LATENCY(v) (((v) << 1) & GENMASK(6, 1)) - -#define VDPU_REG_INIT_QP(v) (((v) << 25) & GENMASK(30, 25)) -#define VDPU_REG_STREAM_LEN(v) (((v) << 0) & GENMASK(23, 0)) - -#define VDPU_REG_APF_THRESHOLD(v) (((v) << 17) & GENMASK(30, 17)) -#define VDPU_REG_STARTMB_X(v) (((v) << 8) & GENMASK(16, 8)) -#define VDPU_REG_STARTMB_Y(v) (((v) << 0) & GENMASK(7, 0)) - -#define VDPU_REG_DEC_MODE(v) (((v) << 0) & GENMASK(3, 0)) - -#define VDPU_REG_DEC_STRENDIAN_E(v) ((v) ? BIT(5) : 0) -#define VDPU_REG_DEC_STRSWAP32_E(v) ((v) ? BIT(4) : 0) -#define VDPU_REG_DEC_OUTSWAP32_E(v) ((v) ? BIT(3) : 0) -#define VDPU_REG_DEC_INSWAP32_E(v) ((v) ? BIT(2) : 0) -#define VDPU_REG_DEC_OUT_ENDIAN(v) ((v) ? BIT(1) : 0) -#define VDPU_REG_DEC_IN_ENDIAN(v) ((v) ? BIT(0) : 0) - -#define VDPU_REG_DEC_DATA_DISC_E(v) ((v) ? BIT(22) : 0) -#define VDPU_REG_DEC_MAX_BURST(v) (((v) << 16) & GENMASK(20, 16)) -#define VDPU_REG_DEC_AXI_WR_ID(v) (((v) << 8) & GENMASK(15, 8)) -#define VDPU_REG_DEC_AXI_RD_ID(v) (((v) << 0) & GENMASK(7, 0)) - -#define VDPU_REG_RLC_MODE_E(v) ((v) ? BIT(20) : 0) -#define VDPU_REG_PIC_INTERLACE_E(v) ((v) ? BIT(17) : 0) -#define VDPU_REG_PIC_FIELDMODE_E(v) ((v) ? BIT(16) : 0) -#define VDPU_REG_PIC_B_E(v) ((v) ? BIT(15) : 0) -#define VDPU_REG_PIC_INTER_E(v) ((v) ? BIT(14) : 0) -#define VDPU_REG_PIC_TOPFIELD_E(v) ((v) ? BIT(13) : 0) -#define VDPU_REG_FWD_INTERLACE_E(v) ((v) ? BIT(12) : 0) -#define VDPU_REG_WRITE_MVS_E(v) ((v) ? BIT(10) : 0) -#define VDPU_REG_DEC_TIMEOUT_E(v) ((v) ? BIT(5) : 0) -#define VDPU_REG_DEC_CLK_GATE_E(v) ((v) ? BIT(4) : 0) - -#define VDPU_REG_PIC_MB_WIDTH(v) (((v) << 23) & GENMASK(31, 23)) -#define VDPU_REG_PIC_MB_HEIGHT_P(v) (((v) << 11) & GENMASK(18, 11)) -#define VDPU_REG_ALT_SCAN_E(v) ((v) ? BIT(6) : 0) -#define VDPU_REG_TOPFIELDFIRST_E(v) ((v) ? BIT(5) : 0) - -#define VDPU_REG_STRM_START_BIT(v) (((v) << 26) & GENMASK(31, 26)) -#define VDPU_REG_QSCALE_TYPE(v) ((v) ? BIT(24) : 0) -#define VDPU_REG_CON_MV_E(v) ((v) ? BIT(4) : 0) -#define VDPU_REG_INTRA_DC_PREC(v) (((v) << 2) & GENMASK(3, 2)) -#define VDPU_REG_INTRA_VLC_TAB(v) ((v) ? BIT(1) : 0) -#define VDPU_REG_FRAME_PRED_DCT(v) ((v) ? BIT(0) : 0) - -#define VDPU_REG_ALT_SCAN_FLAG_E(v) ((v) ? BIT(19) : 0) -#define VDPU_REG_FCODE_FWD_HOR(v) (((v) << 15) & GENMASK(18, 15)) -#define VDPU_REG_FCODE_FWD_VER(v) (((v) << 11) & GENMASK(14, 11)) -#define VDPU_REG_FCODE_BWD_HOR(v) (((v) << 7) & GENMASK(10, 7)) -#define VDPU_REG_FCODE_BWD_VER(v) (((v) << 3) & GENMASK(6, 3)) -#define VDPU_REG_MV_ACCURACY_FWD(v) ((v) ? BIT(2) : 0) -#define VDPU_REG_MV_ACCURACY_BWD(v) ((v) ? BIT(1) : 0) - -static void -rockchip_vpu2_mpeg2_dec_set_quantisation(struct hantro_dev *vpu, - struct hantro_ctx *ctx) -{ - struct v4l2_ctrl_mpeg2_quantisation *q; - - q = hantro_get_ctrl(ctx, V4L2_CID_STATELESS_MPEG2_QUANTISATION); - hantro_mpeg2_dec_copy_qtable(ctx->mpeg2_dec.qtable.cpu, q); - vdpu_write_relaxed(vpu, ctx->mpeg2_dec.qtable.dma, VDPU_REG_QTABLE_BASE); -} - -static void -rockchip_vpu2_mpeg2_dec_set_buffers(struct hantro_dev *vpu, - struct hantro_ctx *ctx, - struct vb2_buffer *src_buf, - struct vb2_buffer *dst_buf, - const struct v4l2_ctrl_mpeg2_sequence *seq, - const struct v4l2_ctrl_mpeg2_picture *pic) -{ - dma_addr_t forward_addr = 0, backward_addr = 0; - dma_addr_t current_addr, addr; - - switch (pic->picture_coding_type) { - case V4L2_MPEG2_PIC_CODING_TYPE_B: - backward_addr = hantro_get_ref(ctx, pic->backward_ref_ts); - fallthrough; - case V4L2_MPEG2_PIC_CODING_TYPE_P: - forward_addr = hantro_get_ref(ctx, pic->forward_ref_ts); - } - - /* Source bitstream buffer */ - addr = vb2_dma_contig_plane_dma_addr(src_buf, 0); - vdpu_write_relaxed(vpu, addr, VDPU_REG_RLC_VLC_BASE); - - /* Destination frame buffer */ - addr = vb2_dma_contig_plane_dma_addr(dst_buf, 0); - current_addr = addr; - - if (pic->picture_structure == V4L2_MPEG2_PIC_BOTTOM_FIELD) - addr += ALIGN(ctx->dst_fmt.width, 16); - vdpu_write_relaxed(vpu, addr, VDPU_REG_DEC_OUT_BASE); - - if (!forward_addr) - forward_addr = current_addr; - if (!backward_addr) - backward_addr = current_addr; - - /* Set forward ref frame (top/bottom field) */ - if (pic->picture_structure == V4L2_MPEG2_PIC_FRAME || - pic->picture_coding_type == V4L2_MPEG2_PIC_CODING_TYPE_B || - (pic->picture_structure == V4L2_MPEG2_PIC_TOP_FIELD && - pic->flags & V4L2_MPEG2_PIC_TOP_FIELD) || - (pic->picture_structure == V4L2_MPEG2_PIC_BOTTOM_FIELD && - !(pic->flags & V4L2_MPEG2_PIC_TOP_FIELD))) { - vdpu_write_relaxed(vpu, forward_addr, VDPU_REG_REFER0_BASE); - vdpu_write_relaxed(vpu, forward_addr, VDPU_REG_REFER1_BASE); - } else if (pic->picture_structure == V4L2_MPEG2_PIC_TOP_FIELD) { - vdpu_write_relaxed(vpu, forward_addr, VDPU_REG_REFER0_BASE); - vdpu_write_relaxed(vpu, current_addr, VDPU_REG_REFER1_BASE); - } else if (pic->picture_structure == V4L2_MPEG2_PIC_BOTTOM_FIELD) { - vdpu_write_relaxed(vpu, current_addr, VDPU_REG_REFER0_BASE); - vdpu_write_relaxed(vpu, forward_addr, VDPU_REG_REFER1_BASE); - } - - /* Set backward ref frame (top/bottom field) */ - vdpu_write_relaxed(vpu, backward_addr, VDPU_REG_REFER2_BASE); - vdpu_write_relaxed(vpu, backward_addr, VDPU_REG_REFER3_BASE); -} - -int rockchip_vpu2_mpeg2_dec_run(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - struct vb2_v4l2_buffer *src_buf, *dst_buf; - const struct v4l2_ctrl_mpeg2_sequence *seq; - const struct v4l2_ctrl_mpeg2_picture *pic; - u32 reg; - - src_buf = hantro_get_src_buf(ctx); - dst_buf = hantro_get_dst_buf(ctx); - - hantro_start_prepare_run(ctx); - - seq = hantro_get_ctrl(ctx, - V4L2_CID_STATELESS_MPEG2_SEQUENCE); - pic = hantro_get_ctrl(ctx, - V4L2_CID_STATELESS_MPEG2_PICTURE); - - reg = VDPU_REG_DEC_ADV_PRE_DIS(0) | - VDPU_REG_DEC_SCMD_DIS(0) | - VDPU_REG_FILTERING_DIS(1) | - VDPU_REG_DEC_LATENCY(0); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(50)); - - reg = VDPU_REG_INIT_QP(1) | - VDPU_REG_STREAM_LEN(vb2_get_plane_payload(&src_buf->vb2_buf, 0)); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(51)); - - reg = VDPU_REG_APF_THRESHOLD(8) | - VDPU_REG_STARTMB_X(0) | - VDPU_REG_STARTMB_Y(0); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(52)); - - reg = VDPU_REG_DEC_MODE(5); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(53)); - - reg = VDPU_REG_DEC_STRENDIAN_E(1) | - VDPU_REG_DEC_STRSWAP32_E(1) | - VDPU_REG_DEC_OUTSWAP32_E(1) | - VDPU_REG_DEC_INSWAP32_E(1) | - VDPU_REG_DEC_OUT_ENDIAN(1) | - VDPU_REG_DEC_IN_ENDIAN(1); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(54)); - - reg = VDPU_REG_DEC_DATA_DISC_E(0) | - VDPU_REG_DEC_MAX_BURST(16) | - VDPU_REG_DEC_AXI_WR_ID(0) | - VDPU_REG_DEC_AXI_RD_ID(0); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(56)); - - reg = VDPU_REG_RLC_MODE_E(0) | - VDPU_REG_PIC_INTERLACE_E(!(seq->flags & V4L2_MPEG2_SEQ_FLAG_PROGRESSIVE)) | - VDPU_REG_PIC_FIELDMODE_E(pic->picture_structure != V4L2_MPEG2_PIC_FRAME) | - VDPU_REG_PIC_B_E(pic->picture_coding_type == V4L2_MPEG2_PIC_CODING_TYPE_B) | - VDPU_REG_PIC_INTER_E(pic->picture_coding_type != V4L2_MPEG2_PIC_CODING_TYPE_I) | - VDPU_REG_PIC_TOPFIELD_E(pic->picture_structure == V4L2_MPEG2_PIC_TOP_FIELD) | - VDPU_REG_FWD_INTERLACE_E(0) | - VDPU_REG_WRITE_MVS_E(0) | - VDPU_REG_DEC_TIMEOUT_E(1) | - VDPU_REG_DEC_CLK_GATE_E(1); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(57)); - - reg = VDPU_REG_PIC_MB_WIDTH(MB_WIDTH(ctx->dst_fmt.width)) | - VDPU_REG_PIC_MB_HEIGHT_P(MB_HEIGHT(ctx->dst_fmt.height)) | - VDPU_REG_ALT_SCAN_E(pic->flags & V4L2_MPEG2_PIC_FLAG_ALT_SCAN) | - VDPU_REG_TOPFIELDFIRST_E(pic->flags & V4L2_MPEG2_PIC_FLAG_TOP_FIELD_FIRST); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(120)); - - reg = VDPU_REG_STRM_START_BIT(0) | - VDPU_REG_QSCALE_TYPE(pic->flags & V4L2_MPEG2_PIC_FLAG_Q_SCALE_TYPE) | - VDPU_REG_CON_MV_E(pic->flags & V4L2_MPEG2_PIC_FLAG_CONCEALMENT_MV) | - VDPU_REG_INTRA_DC_PREC(pic->intra_dc_precision) | - VDPU_REG_INTRA_VLC_TAB(pic->flags & V4L2_MPEG2_PIC_FLAG_INTRA_VLC) | - VDPU_REG_FRAME_PRED_DCT(pic->flags & V4L2_MPEG2_PIC_FLAG_FRAME_PRED_DCT); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(122)); - - reg = VDPU_REG_ALT_SCAN_FLAG_E(pic->flags & V4L2_MPEG2_PIC_FLAG_ALT_SCAN) | - VDPU_REG_FCODE_FWD_HOR(pic->f_code[0][0]) | - VDPU_REG_FCODE_FWD_VER(pic->f_code[0][1]) | - VDPU_REG_FCODE_BWD_HOR(pic->f_code[1][0]) | - VDPU_REG_FCODE_BWD_VER(pic->f_code[1][1]) | - VDPU_REG_MV_ACCURACY_FWD(1) | - VDPU_REG_MV_ACCURACY_BWD(1); - vdpu_write_relaxed(vpu, reg, VDPU_SWREG(136)); - - rockchip_vpu2_mpeg2_dec_set_quantisation(vpu, ctx); - - rockchip_vpu2_mpeg2_dec_set_buffers(vpu, ctx, &src_buf->vb2_buf, - &dst_buf->vb2_buf, seq, pic); - - /* Kick the watchdog and start decoding */ - hantro_end_prepare_run(ctx); - - reg = vdpu_read(vpu, VDPU_SWREG(57)) | VDPU_REG_DEC_E(1); - vdpu_write(vpu, reg, VDPU_SWREG(57)); - - return 0; -} diff --git a/drivers/staging/media/hantro/rockchip_vpu2_hw_vp8_dec.c b/drivers/staging/media/hantro/rockchip_vpu2_hw_vp8_dec.c deleted file mode 100644 index d079075448c9..000000000000 --- a/drivers/staging/media/hantro/rockchip_vpu2_hw_vp8_dec.c +++ /dev/null @@ -1,600 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Rockchip VPU codec vp8 decode driver - * - * Copyright (C) 2014 Rockchip Electronics Co., Ltd. - * ZhiChao Yu <zhichao.yu@rock-chips.com> - * - * Copyright (C) 2014 Google LLC. - * Tomasz Figa <tfiga@chromium.org> - * - * Copyright (C) 2015 Rockchip Electronics Co., Ltd. - * Alpha Lin <alpha.lin@rock-chips.com> - */ - -#include <media/v4l2-mem2mem.h> - -#include "hantro_hw.h" -#include "hantro.h" -#include "hantro_g1_regs.h" - -#define VDPU_REG_DEC_CTRL0 0x0c8 -#define VDPU_REG_STREAM_LEN 0x0cc -#define VDPU_REG_DEC_FORMAT 0x0d4 -#define VDPU_REG_DEC_CTRL0_DEC_MODE(x) (((x) & 0xf) << 0) -#define VDPU_REG_DATA_ENDIAN 0x0d8 -#define VDPU_REG_CONFIG_DEC_STRENDIAN_E BIT(5) -#define VDPU_REG_CONFIG_DEC_STRSWAP32_E BIT(4) -#define VDPU_REG_CONFIG_DEC_OUTSWAP32_E BIT(3) -#define VDPU_REG_CONFIG_DEC_INSWAP32_E BIT(2) -#define VDPU_REG_CONFIG_DEC_OUT_ENDIAN BIT(1) -#define VDPU_REG_CONFIG_DEC_IN_ENDIAN BIT(0) -#define VDPU_REG_AXI_CTRL 0x0e0 -#define VDPU_REG_CONFIG_DEC_MAX_BURST(x) (((x) & 0x1f) << 16) -#define VDPU_REG_EN_FLAGS 0x0e4 -#define VDPU_REG_DEC_CTRL0_PIC_INTER_E BIT(14) -#define VDPU_REG_CONFIG_DEC_TIMEOUT_E BIT(5) -#define VDPU_REG_CONFIG_DEC_CLK_GATE_E BIT(4) -#define VDPU_REG_PRED_FLT 0x0ec -#define VDPU_REG_ADDR_QTABLE 0x0f4 -#define VDPU_REG_ADDR_DST 0x0fc -#define VDPU_REG_ADDR_STR 0x100 -#define VDPU_REG_VP8_PIC_MB_SIZE 0x1e0 -#define VDPU_REG_VP8_DCT_START_BIT 0x1e4 -#define VDPU_REG_DEC_CTRL4_VC1_HEIGHT_EXT BIT(13) -#define VDPU_REG_DEC_CTRL4_BILIN_MC_E BIT(12) -#define VDPU_REG_VP8_CTRL0 0x1e8 -#define VDPU_REG_VP8_DATA_VAL 0x1f0 -#define VDPU_REG_PRED_FLT7 0x1f4 -#define VDPU_REG_PRED_FLT8 0x1f8 -#define VDPU_REG_PRED_FLT9 0x1fc -#define VDPU_REG_PRED_FLT10 0x200 -#define VDPU_REG_FILTER_LEVEL 0x204 -#define VDPU_REG_VP8_QUANTER0 0x208 -#define VDPU_REG_VP8_ADDR_REF0 0x20c -#define VDPU_REG_FILTER_MB_ADJ 0x210 -#define VDPU_REG_REF_PIC_FILT_TYPE_E BIT(31) -#define VDPU_REG_REF_PIC_FILT_SHARPNESS(x) (((x) & 0x7) << 28) -#define VDPU_REG_FILTER_REF_ADJ 0x214 -#define VDPU_REG_VP8_ADDR_REF2_5(i) (0x218 + ((i) * 0x4)) -#define VDPU_REG_VP8_GREF_SIGN_BIAS BIT(0) -#define VDPU_REG_VP8_AREF_SIGN_BIAS BIT(0) -#define VDPU_REG_VP8_DCT_BASE(i) \ - (0x230 + ((((i) < 5) ? (i) : ((i) + 1)) * 0x4)) -#define VDPU_REG_VP8_ADDR_CTRL_PART 0x244 -#define VDPU_REG_VP8_SEGMENT_VAL 0x254 -#define VDPU_REG_FWD_PIC1_SEGMENT_BASE(x) ((x) << 0) -#define VDPU_REG_FWD_PIC1_SEGMENT_UPD_E BIT(1) -#define VDPU_REG_FWD_PIC1_SEGMENT_E BIT(0) -#define VDPU_REG_VP8_DCT_START_BIT2 0x258 -#define VDPU_REG_VP8_QUANTER1 0x25c -#define VDPU_REG_VP8_QUANTER2 0x260 -#define VDPU_REG_PRED_FLT1 0x264 -#define VDPU_REG_PRED_FLT2 0x268 -#define VDPU_REG_PRED_FLT3 0x26c -#define VDPU_REG_PRED_FLT4 0x270 -#define VDPU_REG_PRED_FLT5 0x274 -#define VDPU_REG_PRED_FLT6 0x278 - -static const struct hantro_reg vp8_dec_dct_base[8] = { - { VDPU_REG_ADDR_STR, 0, 0xffffffff }, - { VDPU_REG_VP8_DCT_BASE(0), 0, 0xffffffff }, - { VDPU_REG_VP8_DCT_BASE(1), 0, 0xffffffff }, - { VDPU_REG_VP8_DCT_BASE(2), 0, 0xffffffff }, - { VDPU_REG_VP8_DCT_BASE(3), 0, 0xffffffff }, - { VDPU_REG_VP8_DCT_BASE(4), 0, 0xffffffff }, - { VDPU_REG_VP8_DCT_BASE(5), 0, 0xffffffff }, - { VDPU_REG_VP8_DCT_BASE(6), 0, 0xffffffff }, -}; - -static const struct hantro_reg vp8_dec_lf_level[4] = { - { VDPU_REG_FILTER_LEVEL, 18, 0x3f }, - { VDPU_REG_FILTER_LEVEL, 12, 0x3f }, - { VDPU_REG_FILTER_LEVEL, 6, 0x3f }, - { VDPU_REG_FILTER_LEVEL, 0, 0x3f }, -}; - -static const struct hantro_reg vp8_dec_mb_adj[4] = { - { VDPU_REG_FILTER_MB_ADJ, 21, 0x7f }, - { VDPU_REG_FILTER_MB_ADJ, 14, 0x7f }, - { VDPU_REG_FILTER_MB_ADJ, 7, 0x7f }, - { VDPU_REG_FILTER_MB_ADJ, 0, 0x7f }, -}; - -static const struct hantro_reg vp8_dec_ref_adj[4] = { - { VDPU_REG_FILTER_REF_ADJ, 21, 0x7f }, - { VDPU_REG_FILTER_REF_ADJ, 14, 0x7f }, - { VDPU_REG_FILTER_REF_ADJ, 7, 0x7f }, - { VDPU_REG_FILTER_REF_ADJ, 0, 0x7f }, -}; - -static const struct hantro_reg vp8_dec_quant[4] = { - { VDPU_REG_VP8_QUANTER0, 11, 0x7ff }, - { VDPU_REG_VP8_QUANTER0, 0, 0x7ff }, - { VDPU_REG_VP8_QUANTER1, 11, 0x7ff }, - { VDPU_REG_VP8_QUANTER1, 0, 0x7ff }, -}; - -static const struct hantro_reg vp8_dec_quant_delta[5] = { - { VDPU_REG_VP8_QUANTER0, 27, 0x1f }, - { VDPU_REG_VP8_QUANTER0, 22, 0x1f }, - { VDPU_REG_VP8_QUANTER1, 27, 0x1f }, - { VDPU_REG_VP8_QUANTER1, 22, 0x1f }, - { VDPU_REG_VP8_QUANTER2, 27, 0x1f }, -}; - -static const struct hantro_reg vp8_dec_dct_start_bits[8] = { - { VDPU_REG_VP8_CTRL0, 26, 0x3f }, - { VDPU_REG_VP8_DCT_START_BIT, 26, 0x3f }, - { VDPU_REG_VP8_DCT_START_BIT, 20, 0x3f }, - { VDPU_REG_VP8_DCT_START_BIT2, 24, 0x3f }, - { VDPU_REG_VP8_DCT_START_BIT2, 18, 0x3f }, - { VDPU_REG_VP8_DCT_START_BIT2, 12, 0x3f }, - { VDPU_REG_VP8_DCT_START_BIT2, 6, 0x3f }, - { VDPU_REG_VP8_DCT_START_BIT2, 0, 0x3f }, -}; - -static const struct hantro_reg vp8_dec_pred_bc_tap[8][6] = { - { - { 0, 0, 0}, - { VDPU_REG_PRED_FLT, 22, 0x3ff }, - { VDPU_REG_PRED_FLT, 12, 0x3ff }, - { VDPU_REG_PRED_FLT, 2, 0x3ff }, - { VDPU_REG_PRED_FLT1, 22, 0x3ff }, - { 0, 0, 0}, - }, { - { 0, 0, 0}, - { VDPU_REG_PRED_FLT1, 12, 0x3ff }, - { VDPU_REG_PRED_FLT1, 2, 0x3ff }, - { VDPU_REG_PRED_FLT2, 22, 0x3ff }, - { VDPU_REG_PRED_FLT2, 12, 0x3ff }, - { 0, 0, 0}, - }, { - { VDPU_REG_PRED_FLT10, 10, 0x3 }, - { VDPU_REG_PRED_FLT2, 2, 0x3ff }, - { VDPU_REG_PRED_FLT3, 22, 0x3ff }, - { VDPU_REG_PRED_FLT3, 12, 0x3ff }, - { VDPU_REG_PRED_FLT3, 2, 0x3ff }, - { VDPU_REG_PRED_FLT10, 8, 0x3}, - }, { - { 0, 0, 0}, - { VDPU_REG_PRED_FLT4, 22, 0x3ff }, - { VDPU_REG_PRED_FLT4, 12, 0x3ff }, - { VDPU_REG_PRED_FLT4, 2, 0x3ff }, - { VDPU_REG_PRED_FLT5, 22, 0x3ff }, - { 0, 0, 0}, - }, { - { VDPU_REG_PRED_FLT10, 6, 0x3 }, - { VDPU_REG_PRED_FLT5, 12, 0x3ff }, - { VDPU_REG_PRED_FLT5, 2, 0x3ff }, - { VDPU_REG_PRED_FLT6, 22, 0x3ff }, - { VDPU_REG_PRED_FLT6, 12, 0x3ff }, - { VDPU_REG_PRED_FLT10, 4, 0x3 }, - }, { - { 0, 0, 0}, - { VDPU_REG_PRED_FLT6, 2, 0x3ff }, - { VDPU_REG_PRED_FLT7, 22, 0x3ff }, - { VDPU_REG_PRED_FLT7, 12, 0x3ff }, - { VDPU_REG_PRED_FLT7, 2, 0x3ff }, - { 0, 0, 0}, - }, { - { VDPU_REG_PRED_FLT10, 2, 0x3 }, - { VDPU_REG_PRED_FLT8, 22, 0x3ff }, - { VDPU_REG_PRED_FLT8, 12, 0x3ff }, - { VDPU_REG_PRED_FLT8, 2, 0x3ff }, - { VDPU_REG_PRED_FLT9, 22, 0x3ff }, - { VDPU_REG_PRED_FLT10, 0, 0x3 }, - }, { - { 0, 0, 0}, - { VDPU_REG_PRED_FLT9, 12, 0x3ff }, - { VDPU_REG_PRED_FLT9, 2, 0x3ff }, - { VDPU_REG_PRED_FLT10, 22, 0x3ff }, - { VDPU_REG_PRED_FLT10, 12, 0x3ff }, - { 0, 0, 0}, - }, -}; - -static const struct hantro_reg vp8_dec_mb_start_bit = { - .base = VDPU_REG_VP8_CTRL0, - .shift = 18, - .mask = 0x3f -}; - -static const struct hantro_reg vp8_dec_mb_aligned_data_len = { - .base = VDPU_REG_VP8_DATA_VAL, - .shift = 0, - .mask = 0x3fffff -}; - -static const struct hantro_reg vp8_dec_num_dct_partitions = { - .base = VDPU_REG_VP8_DATA_VAL, - .shift = 24, - .mask = 0xf -}; - -static const struct hantro_reg vp8_dec_stream_len = { - .base = VDPU_REG_STREAM_LEN, - .shift = 0, - .mask = 0xffffff -}; - -static const struct hantro_reg vp8_dec_mb_width = { - .base = VDPU_REG_VP8_PIC_MB_SIZE, - .shift = 23, - .mask = 0x1ff -}; - -static const struct hantro_reg vp8_dec_mb_height = { - .base = VDPU_REG_VP8_PIC_MB_SIZE, - .shift = 11, - .mask = 0xff -}; - -static const struct hantro_reg vp8_dec_mb_width_ext = { - .base = VDPU_REG_VP8_PIC_MB_SIZE, - .shift = 3, - .mask = 0x7 -}; - -static const struct hantro_reg vp8_dec_mb_height_ext = { - .base = VDPU_REG_VP8_PIC_MB_SIZE, - .shift = 0, - .mask = 0x7 -}; - -static const struct hantro_reg vp8_dec_bool_range = { - .base = VDPU_REG_VP8_CTRL0, - .shift = 0, - .mask = 0xff -}; - -static const struct hantro_reg vp8_dec_bool_value = { - .base = VDPU_REG_VP8_CTRL0, - .shift = 8, - .mask = 0xff -}; - -static const struct hantro_reg vp8_dec_filter_disable = { - .base = VDPU_REG_DEC_CTRL0, - .shift = 8, - .mask = 1 -}; - -static const struct hantro_reg vp8_dec_skip_mode = { - .base = VDPU_REG_DEC_CTRL0, - .shift = 9, - .mask = 1 -}; - -static const struct hantro_reg vp8_dec_start_dec = { - .base = VDPU_REG_EN_FLAGS, - .shift = 0, - .mask = 1 -}; - -static void cfg_lf(struct hantro_ctx *ctx, - const struct v4l2_ctrl_vp8_frame *hdr) -{ - const struct v4l2_vp8_segment *seg = &hdr->segment; - const struct v4l2_vp8_loop_filter *lf = &hdr->lf; - struct hantro_dev *vpu = ctx->dev; - unsigned int i; - u32 reg; - - if (!(seg->flags & V4L2_VP8_SEGMENT_FLAG_ENABLED)) { - hantro_reg_write(vpu, &vp8_dec_lf_level[0], lf->level); - } else if (seg->flags & V4L2_VP8_SEGMENT_FLAG_DELTA_VALUE_MODE) { - for (i = 0; i < 4; i++) { - u32 lf_level = clamp(lf->level + seg->lf_update[i], - 0, 63); - - hantro_reg_write(vpu, &vp8_dec_lf_level[i], lf_level); - } - } else { - for (i = 0; i < 4; i++) - hantro_reg_write(vpu, &vp8_dec_lf_level[i], - seg->lf_update[i]); - } - - reg = VDPU_REG_REF_PIC_FILT_SHARPNESS(lf->sharpness_level); - if (lf->flags & V4L2_VP8_LF_FILTER_TYPE_SIMPLE) - reg |= VDPU_REG_REF_PIC_FILT_TYPE_E; - vdpu_write_relaxed(vpu, reg, VDPU_REG_FILTER_MB_ADJ); - - if (lf->flags & V4L2_VP8_LF_ADJ_ENABLE) { - for (i = 0; i < 4; i++) { - hantro_reg_write(vpu, &vp8_dec_mb_adj[i], - lf->mb_mode_delta[i]); - hantro_reg_write(vpu, &vp8_dec_ref_adj[i], - lf->ref_frm_delta[i]); - } - } -} - -static void cfg_qp(struct hantro_ctx *ctx, - const struct v4l2_ctrl_vp8_frame *hdr) -{ - const struct v4l2_vp8_quantization *q = &hdr->quant; - const struct v4l2_vp8_segment *seg = &hdr->segment; - struct hantro_dev *vpu = ctx->dev; - unsigned int i; - - if (!(seg->flags & V4L2_VP8_SEGMENT_FLAG_ENABLED)) { - hantro_reg_write(vpu, &vp8_dec_quant[0], q->y_ac_qi); - } else if (seg->flags & V4L2_VP8_SEGMENT_FLAG_DELTA_VALUE_MODE) { - for (i = 0; i < 4; i++) { - u32 quant = clamp(q->y_ac_qi + seg->quant_update[i], - 0, 127); - - hantro_reg_write(vpu, &vp8_dec_quant[i], quant); - } - } else { - for (i = 0; i < 4; i++) - hantro_reg_write(vpu, &vp8_dec_quant[i], - seg->quant_update[i]); - } - - hantro_reg_write(vpu, &vp8_dec_quant_delta[0], q->y_dc_delta); - hantro_reg_write(vpu, &vp8_dec_quant_delta[1], q->y2_dc_delta); - hantro_reg_write(vpu, &vp8_dec_quant_delta[2], q->y2_ac_delta); - hantro_reg_write(vpu, &vp8_dec_quant_delta[3], q->uv_dc_delta); - hantro_reg_write(vpu, &vp8_dec_quant_delta[4], q->uv_ac_delta); -} - -static void cfg_parts(struct hantro_ctx *ctx, - const struct v4l2_ctrl_vp8_frame *hdr) -{ - struct hantro_dev *vpu = ctx->dev; - struct vb2_v4l2_buffer *vb2_src; - u32 first_part_offset = V4L2_VP8_FRAME_IS_KEY_FRAME(hdr) ? 10 : 3; - u32 mb_size, mb_offset_bytes, mb_offset_bits, mb_start_bits; - u32 dct_size_part_size, dct_part_offset; - dma_addr_t src_dma; - u32 dct_part_total_len = 0; - u32 count = 0; - unsigned int i; - - vb2_src = hantro_get_src_buf(ctx); - src_dma = vb2_dma_contig_plane_dma_addr(&vb2_src->vb2_buf, 0); - - /* - * Calculate control partition mb data info - * @first_part_header_bits: bits offset of mb data from first - * part start pos - * @mb_offset_bits: bits offset of mb data from src_dma - * base addr - * @mb_offset_byte: bytes offset of mb data from src_dma - * base addr - * @mb_start_bits: bits offset of mb data from mb data - * 64bits alignment addr - */ - mb_offset_bits = first_part_offset * 8 + - hdr->first_part_header_bits + 8; - mb_offset_bytes = mb_offset_bits / 8; - mb_start_bits = mb_offset_bits - - (mb_offset_bytes & (~DEC_8190_ALIGN_MASK)) * 8; - mb_size = hdr->first_part_size - - (mb_offset_bytes - first_part_offset) + - (mb_offset_bytes & DEC_8190_ALIGN_MASK); - - /* Macroblock data aligned base addr */ - vdpu_write_relaxed(vpu, (mb_offset_bytes & (~DEC_8190_ALIGN_MASK)) + - src_dma, VDPU_REG_VP8_ADDR_CTRL_PART); - hantro_reg_write(vpu, &vp8_dec_mb_start_bit, mb_start_bits); - hantro_reg_write(vpu, &vp8_dec_mb_aligned_data_len, mb_size); - - /* - * Calculate DCT partition info - * @dct_size_part_size: Containing sizes of DCT part, every DCT part - * has 3 bytes to store its size, except the last - * DCT part - * @dct_part_offset: bytes offset of DCT parts from src_dma base addr - * @dct_part_total_len: total size of all DCT parts - */ - dct_size_part_size = (hdr->num_dct_parts - 1) * 3; - dct_part_offset = first_part_offset + hdr->first_part_size; - for (i = 0; i < hdr->num_dct_parts; i++) - dct_part_total_len += hdr->dct_part_sizes[i]; - dct_part_total_len += dct_size_part_size; - dct_part_total_len += (dct_part_offset & DEC_8190_ALIGN_MASK); - - /* Number of DCT partitions */ - hantro_reg_write(vpu, &vp8_dec_num_dct_partitions, - hdr->num_dct_parts - 1); - - /* DCT partition length */ - hantro_reg_write(vpu, &vp8_dec_stream_len, dct_part_total_len); - - /* DCT partitions base address */ - for (i = 0; i < hdr->num_dct_parts; i++) { - u32 byte_offset = dct_part_offset + dct_size_part_size + count; - u32 base_addr = byte_offset + src_dma; - - hantro_reg_write(vpu, &vp8_dec_dct_base[i], - base_addr & (~DEC_8190_ALIGN_MASK)); - - hantro_reg_write(vpu, &vp8_dec_dct_start_bits[i], - (byte_offset & DEC_8190_ALIGN_MASK) * 8); - - count += hdr->dct_part_sizes[i]; - } -} - -/* - * prediction filter taps - * normal 6-tap filters - */ -static void cfg_tap(struct hantro_ctx *ctx, - const struct v4l2_ctrl_vp8_frame *hdr) -{ - struct hantro_dev *vpu = ctx->dev; - int i, j; - - if ((hdr->version & 0x03) != 0) - return; /* Tap filter not used. */ - - for (i = 0; i < 8; i++) { - for (j = 0; j < 6; j++) { - if (vp8_dec_pred_bc_tap[i][j].base != 0) - hantro_reg_write(vpu, - &vp8_dec_pred_bc_tap[i][j], - hantro_vp8_dec_mc_filter[i][j]); - } - } -} - -static void cfg_ref(struct hantro_ctx *ctx, - const struct v4l2_ctrl_vp8_frame *hdr, - struct vb2_v4l2_buffer *vb2_dst) -{ - struct hantro_dev *vpu = ctx->dev; - dma_addr_t ref; - - ref = hantro_get_ref(ctx, hdr->last_frame_ts); - if (!ref) { - vpu_debug(0, "failed to find last frame ts=%llu\n", - hdr->last_frame_ts); - ref = vb2_dma_contig_plane_dma_addr(&vb2_dst->vb2_buf, 0); - } - vdpu_write_relaxed(vpu, ref, VDPU_REG_VP8_ADDR_REF0); - - ref = hantro_get_ref(ctx, hdr->golden_frame_ts); - if (!ref && hdr->golden_frame_ts) - vpu_debug(0, "failed to find golden frame ts=%llu\n", - hdr->golden_frame_ts); - if (!ref) - ref = vb2_dma_contig_plane_dma_addr(&vb2_dst->vb2_buf, 0); - if (hdr->flags & V4L2_VP8_FRAME_FLAG_SIGN_BIAS_GOLDEN) - ref |= VDPU_REG_VP8_GREF_SIGN_BIAS; - vdpu_write_relaxed(vpu, ref, VDPU_REG_VP8_ADDR_REF2_5(2)); - - ref = hantro_get_ref(ctx, hdr->alt_frame_ts); - if (!ref && hdr->alt_frame_ts) - vpu_debug(0, "failed to find alt frame ts=%llu\n", - hdr->alt_frame_ts); - if (!ref) - ref = vb2_dma_contig_plane_dma_addr(&vb2_dst->vb2_buf, 0); - if (hdr->flags & V4L2_VP8_FRAME_FLAG_SIGN_BIAS_ALT) - ref |= VDPU_REG_VP8_AREF_SIGN_BIAS; - vdpu_write_relaxed(vpu, ref, VDPU_REG_VP8_ADDR_REF2_5(3)); -} - -static void cfg_buffers(struct hantro_ctx *ctx, - const struct v4l2_ctrl_vp8_frame *hdr, - struct vb2_v4l2_buffer *vb2_dst) -{ - const struct v4l2_vp8_segment *seg = &hdr->segment; - struct hantro_dev *vpu = ctx->dev; - dma_addr_t dst_dma; - u32 reg; - - /* Set probability table buffer address */ - vdpu_write_relaxed(vpu, ctx->vp8_dec.prob_tbl.dma, - VDPU_REG_ADDR_QTABLE); - - /* Set segment map address */ - reg = VDPU_REG_FWD_PIC1_SEGMENT_BASE(ctx->vp8_dec.segment_map.dma); - if (seg->flags & V4L2_VP8_SEGMENT_FLAG_ENABLED) { - reg |= VDPU_REG_FWD_PIC1_SEGMENT_E; - if (seg->flags & V4L2_VP8_SEGMENT_FLAG_UPDATE_MAP) - reg |= VDPU_REG_FWD_PIC1_SEGMENT_UPD_E; - } - vdpu_write_relaxed(vpu, reg, VDPU_REG_VP8_SEGMENT_VAL); - - /* set output frame buffer address */ - dst_dma = vb2_dma_contig_plane_dma_addr(&vb2_dst->vb2_buf, 0); - vdpu_write_relaxed(vpu, dst_dma, VDPU_REG_ADDR_DST); -} - -int rockchip_vpu2_vp8_dec_run(struct hantro_ctx *ctx) -{ - const struct v4l2_ctrl_vp8_frame *hdr; - struct hantro_dev *vpu = ctx->dev; - struct vb2_v4l2_buffer *vb2_dst; - size_t height = ctx->dst_fmt.height; - size_t width = ctx->dst_fmt.width; - u32 mb_width, mb_height; - u32 reg; - - hantro_start_prepare_run(ctx); - - hdr = hantro_get_ctrl(ctx, V4L2_CID_STATELESS_VP8_FRAME); - if (WARN_ON(!hdr)) - return -EINVAL; - - /* Reset segment_map buffer in keyframe */ - if (V4L2_VP8_FRAME_IS_KEY_FRAME(hdr) && ctx->vp8_dec.segment_map.cpu) - memset(ctx->vp8_dec.segment_map.cpu, 0, - ctx->vp8_dec.segment_map.size); - - hantro_vp8_prob_update(ctx, hdr); - - /* - * Extensive testing shows that the hardware does not properly - * clear the internal state from previous a decoding run. This - * causes corruption in decoded frames for multi-instance use cases. - * A soft reset before programming the registers has been found - * to resolve those problems. - */ - ctx->codec_ops->reset(ctx); - - reg = VDPU_REG_CONFIG_DEC_TIMEOUT_E - | VDPU_REG_CONFIG_DEC_CLK_GATE_E; - if (!V4L2_VP8_FRAME_IS_KEY_FRAME(hdr)) - reg |= VDPU_REG_DEC_CTRL0_PIC_INTER_E; - vdpu_write_relaxed(vpu, reg, VDPU_REG_EN_FLAGS); - - reg = VDPU_REG_CONFIG_DEC_STRENDIAN_E - | VDPU_REG_CONFIG_DEC_INSWAP32_E - | VDPU_REG_CONFIG_DEC_STRSWAP32_E - | VDPU_REG_CONFIG_DEC_OUTSWAP32_E - | VDPU_REG_CONFIG_DEC_IN_ENDIAN - | VDPU_REG_CONFIG_DEC_OUT_ENDIAN; - vdpu_write_relaxed(vpu, reg, VDPU_REG_DATA_ENDIAN); - - reg = VDPU_REG_CONFIG_DEC_MAX_BURST(16); - vdpu_write_relaxed(vpu, reg, VDPU_REG_AXI_CTRL); - - reg = VDPU_REG_DEC_CTRL0_DEC_MODE(10); - vdpu_write_relaxed(vpu, reg, VDPU_REG_DEC_FORMAT); - - if (!(hdr->flags & V4L2_VP8_FRAME_FLAG_MB_NO_SKIP_COEFF)) - hantro_reg_write(vpu, &vp8_dec_skip_mode, 1); - if (hdr->lf.level == 0) - hantro_reg_write(vpu, &vp8_dec_filter_disable, 1); - - /* Frame dimensions */ - mb_width = MB_WIDTH(width); - mb_height = MB_HEIGHT(height); - - hantro_reg_write(vpu, &vp8_dec_mb_width, mb_width); - hantro_reg_write(vpu, &vp8_dec_mb_height, mb_height); - hantro_reg_write(vpu, &vp8_dec_mb_width_ext, mb_width >> 9); - hantro_reg_write(vpu, &vp8_dec_mb_height_ext, mb_height >> 8); - - /* Boolean decoder */ - hantro_reg_write(vpu, &vp8_dec_bool_range, hdr->coder_state.range); - hantro_reg_write(vpu, &vp8_dec_bool_value, hdr->coder_state.value); - - reg = vdpu_read(vpu, VDPU_REG_VP8_DCT_START_BIT); - if (hdr->version != 3) - reg |= VDPU_REG_DEC_CTRL4_VC1_HEIGHT_EXT; - if (hdr->version & 0x3) - reg |= VDPU_REG_DEC_CTRL4_BILIN_MC_E; - vdpu_write_relaxed(vpu, reg, VDPU_REG_VP8_DCT_START_BIT); - - cfg_lf(ctx, hdr); - cfg_qp(ctx, hdr); - cfg_parts(ctx, hdr); - cfg_tap(ctx, hdr); - - vb2_dst = hantro_get_dst_buf(ctx); - cfg_ref(ctx, hdr, vb2_dst); - cfg_buffers(ctx, hdr, vb2_dst); - - hantro_end_prepare_run(ctx); - - hantro_reg_write(vpu, &vp8_dec_start_dec, 1); - - return 0; -} diff --git a/drivers/staging/media/hantro/rockchip_vpu2_regs.h b/drivers/staging/media/hantro/rockchip_vpu2_regs.h deleted file mode 100644 index 49e40889545b..000000000000 --- a/drivers/staging/media/hantro/rockchip_vpu2_regs.h +++ /dev/null @@ -1,600 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Hantro VPU codec driver - * - * Copyright (C) 2018 Rockchip Electronics Co., Ltd. - * Alpha Lin <alpha.lin@rock-chips.com> - */ - -#ifndef ROCKCHIP_VPU2_REGS_H_ -#define ROCKCHIP_VPU2_REGS_H_ - -/* Encoder registers. */ -#define VEPU_REG_VP8_QUT_1ST(i) (0x000 + ((i) * 0x24)) -#define VEPU_REG_VP8_QUT_DC_Y2(x) (((x) & 0x3fff) << 16) -#define VEPU_REG_VP8_QUT_DC_Y1(x) (((x) & 0x3fff) << 0) -#define VEPU_REG_VP8_QUT_2ND(i) (0x004 + ((i) * 0x24)) -#define VEPU_REG_VP8_QUT_AC_Y1(x) (((x) & 0x3fff) << 16) -#define VEPU_REG_VP8_QUT_DC_CHR(x) (((x) & 0x3fff) << 0) -#define VEPU_REG_VP8_QUT_3RD(i) (0x008 + ((i) * 0x24)) -#define VEPU_REG_VP8_QUT_AC_CHR(x) (((x) & 0x3fff) << 16) -#define VEPU_REG_VP8_QUT_AC_Y2(x) (((x) & 0x3fff) << 0) -#define VEPU_REG_VP8_QUT_4TH(i) (0x00c + ((i) * 0x24)) -#define VEPU_REG_VP8_QUT_ZB_DC_CHR(x) (((x) & 0x1ff) << 18) -#define VEPU_REG_VP8_QUT_ZB_DC_Y2(x) (((x) & 0x1ff) << 9) -#define VEPU_REG_VP8_QUT_ZB_DC_Y1(x) (((x) & 0x1ff) << 0) -#define VEPU_REG_VP8_QUT_5TH(i) (0x010 + ((i) * 0x24)) -#define VEPU_REG_VP8_QUT_ZB_AC_CHR(x) (((x) & 0x1ff) << 18) -#define VEPU_REG_VP8_QUT_ZB_AC_Y2(x) (((x) & 0x1ff) << 9) -#define VEPU_REG_VP8_QUT_ZB_AC_Y1(x) (((x) & 0x1ff) << 0) -#define VEPU_REG_VP8_QUT_6TH(i) (0x014 + ((i) * 0x24)) -#define VEPU_REG_VP8_QUT_RND_DC_CHR(x) (((x) & 0xff) << 16) -#define VEPU_REG_VP8_QUT_RND_DC_Y2(x) (((x) & 0xff) << 8) -#define VEPU_REG_VP8_QUT_RND_DC_Y1(x) (((x) & 0xff) << 0) -#define VEPU_REG_VP8_QUT_7TH(i) (0x018 + ((i) * 0x24)) -#define VEPU_REG_VP8_QUT_RND_AC_CHR(x) (((x) & 0xff) << 16) -#define VEPU_REG_VP8_QUT_RND_AC_Y2(x) (((x) & 0xff) << 8) -#define VEPU_REG_VP8_QUT_RND_AC_Y1(x) (((x) & 0xff) << 0) -#define VEPU_REG_VP8_QUT_8TH(i) (0x01c + ((i) * 0x24)) -#define VEPU_REG_VP8_SEG_FILTER_LEVEL(x) (((x) & 0x3f) << 25) -#define VEPU_REG_VP8_DEQUT_DC_CHR(x) (((x) & 0xff) << 17) -#define VEPU_REG_VP8_DEQUT_DC_Y2(x) (((x) & 0x1ff) << 8) -#define VEPU_REG_VP8_DEQUT_DC_Y1(x) (((x) & 0xff) << 0) -#define VEPU_REG_VP8_QUT_9TH(i) (0x020 + ((i) * 0x24)) -#define VEPU_REG_VP8_DEQUT_AC_CHR(x) (((x) & 0x1ff) << 18) -#define VEPU_REG_VP8_DEQUT_AC_Y2(x) (((x) & 0x1ff) << 9) -#define VEPU_REG_VP8_DEQUT_AC_Y1(x) (((x) & 0x1ff) << 0) -#define VEPU_REG_ADDR_VP8_SEG_MAP 0x06c -#define VEPU_REG_VP8_INTRA_4X4_PENALTY(i) (0x070 + ((i) * 0x4)) -#define VEPU_REG_VP8_INTRA_4X4_PENALTY_0(x) (((x) & 0xfff) << 0) -#define VEPU_REG_VP8_INTRA_4x4_PENALTY_1(x) (((x) & 0xfff) << 16) -#define VEPU_REG_VP8_INTRA_16X16_PENALTY(i) (0x084 + ((i) * 0x4)) -#define VEPU_REG_VP8_INTRA_16X16_PENALTY_0(x) (((x) & 0xfff) << 0) -#define VEPU_REG_VP8_INTRA_16X16_PENALTY_1(x) (((x) & 0xfff) << 16) -#define VEPU_REG_VP8_CONTROL 0x0a0 -#define VEPU_REG_VP8_LF_MODE_DELTA_BPRED(x) (((x) & 0x1f) << 24) -#define VEPU_REG_VP8_LF_REF_DELTA_INTRA_MB(x) (((x) & 0x7f) << 16) -#define VEPU_REG_VP8_INTER_TYPE_BIT_COST(x) (((x) & 0xfff) << 0) -#define VEPU_REG_VP8_REF_FRAME_VAL 0x0a4 -#define VEPU_REG_VP8_COEF_DMV_PENALTY(x) (((x) & 0xfff) << 16) -#define VEPU_REG_VP8_REF_FRAME(x) (((x) & 0xfff) << 0) -#define VEPU_REG_VP8_LOOP_FILTER_REF_DELTA 0x0a8 -#define VEPU_REG_VP8_LF_REF_DELTA_ALT_REF(x) (((x) & 0x7f) << 16) -#define VEPU_REG_VP8_LF_REF_DELTA_LAST_REF(x) (((x) & 0x7f) << 8) -#define VEPU_REG_VP8_LF_REF_DELTA_GOLDEN(x) (((x) & 0x7f) << 0) -#define VEPU_REG_VP8_LOOP_FILTER_MODE_DELTA 0x0ac -#define VEPU_REG_VP8_LF_MODE_DELTA_SPLITMV(x) (((x) & 0x7f) << 16) -#define VEPU_REG_VP8_LF_MODE_DELTA_ZEROMV(x) (((x) & 0x7f) << 8) -#define VEPU_REG_VP8_LF_MODE_DELTA_NEWMV(x) (((x) & 0x7f) << 0) -#define VEPU_REG_JPEG_LUMA_QUAT(i) (0x000 + ((i) * 0x4)) -#define VEPU_REG_JPEG_CHROMA_QUAT(i) (0x040 + ((i) * 0x4)) -#define VEPU_REG_INTRA_SLICE_BITMAP(i) (0x0b0 + ((i) * 0x4)) -#define VEPU_REG_ADDR_VP8_DCT_PART(i) (0x0b0 + ((i) * 0x4)) -#define VEPU_REG_INTRA_AREA_CTRL 0x0b8 -#define VEPU_REG_INTRA_AREA_TOP(x) (((x) & 0xff) << 24) -#define VEPU_REG_INTRA_AREA_BOTTOM(x) (((x) & 0xff) << 16) -#define VEPU_REG_INTRA_AREA_LEFT(x) (((x) & 0xff) << 8) -#define VEPU_REG_INTRA_AREA_RIGHT(x) (((x) & 0xff) << 0) -#define VEPU_REG_CIR_INTRA_CTRL 0x0bc -#define VEPU_REG_CIR_INTRA_FIRST_MB(x) (((x) & 0xffff) << 16) -#define VEPU_REG_CIR_INTRA_INTERVAL(x) (((x) & 0xffff) << 0) -#define VEPU_REG_ADDR_IN_PLANE_0 0x0c0 -#define VEPU_REG_ADDR_IN_PLANE_1 0x0c4 -#define VEPU_REG_ADDR_IN_PLANE_2 0x0c8 -#define VEPU_REG_STR_HDR_REM_MSB 0x0cc -#define VEPU_REG_STR_HDR_REM_LSB 0x0d0 -#define VEPU_REG_STR_BUF_LIMIT 0x0d4 -#define VEPU_REG_AXI_CTRL 0x0d8 -#define VEPU_REG_AXI_CTRL_READ_ID(x) (((x) & 0xff) << 24) -#define VEPU_REG_AXI_CTRL_WRITE_ID(x) (((x) & 0xff) << 16) -#define VEPU_REG_AXI_CTRL_BURST_LEN(x) (((x) & 0x3f) << 8) -#define VEPU_REG_AXI_CTRL_INCREMENT_MODE(x) (((x) & 0x01) << 2) -#define VEPU_REG_AXI_CTRL_BIRST_DISCARD(x) (((x) & 0x01) << 1) -#define VEPU_REG_AXI_CTRL_BIRST_DISABLE BIT(0) -#define VEPU_QP_ADJUST_MAD_DELTA_ROI 0x0dc -#define VEPU_REG_ROI_QP_DELTA_1 (((x) & 0xf) << 12) -#define VEPU_REG_ROI_QP_DELTA_2 (((x) & 0xf) << 8) -#define VEPU_REG_MAD_QP_ADJUSTMENT (((x) & 0xf) << 0) -#define VEPU_REG_ADDR_REF_LUMA 0x0e0 -#define VEPU_REG_ADDR_REF_CHROMA 0x0e4 -#define VEPU_REG_QP_SUM_DIV2 0x0e8 -#define VEPU_REG_QP_SUM(x) (((x) & 0x001fffff) * 2) -#define VEPU_REG_ENC_CTRL0 0x0ec -#define VEPU_REG_DISABLE_QUARTER_PIXEL_MV BIT(28) -#define VEPU_REG_DEBLOCKING_FILTER_MODE(x) (((x) & 0x3) << 24) -#define VEPU_REG_CABAC_INIT_IDC(x) (((x) & 0x3) << 21) -#define VEPU_REG_ENTROPY_CODING_MODE BIT(20) -#define VEPU_REG_H264_TRANS8X8_MODE BIT(17) -#define VEPU_REG_H264_INTER4X4_MODE BIT(16) -#define VEPU_REG_H264_STREAM_MODE BIT(15) -#define VEPU_REG_H264_SLICE_SIZE(x) (((x) & 0x7f) << 8) -#define VEPU_REG_ENC_OVER_FILL_STRM_OFFSET 0x0f0 -#define VEPU_REG_STREAM_START_OFFSET(x) (((x) & 0x3f) << 16) -#define VEPU_REG_SKIP_MACROBLOCK_PENALTY(x) (((x) & 0xff) << 8) -#define VEPU_REG_IN_IMG_CTRL_OVRFLR_D4(x) (((x) & 0x3) << 4) -#define VEPU_REG_IN_IMG_CTRL_OVRFLB(x) (((x) & 0xf) << 0) -#define VEPU_REG_INPUT_LUMA_INFO 0x0f4 -#define VEPU_REG_IN_IMG_CHROMA_OFFSET(x) (((x) & 0x7) << 20) -#define VEPU_REG_IN_IMG_LUMA_OFFSET(x) (((x) & 0x7) << 16) -#define VEPU_REG_IN_IMG_CTRL_ROW_LEN(x) (((x) & 0x3fff) << 0) -#define VEPU_REG_RLC_SUM 0x0f8 -#define VEPU_REG_RLC_SUM_OUT(x) (((x) & 0x007fffff) * 4) -#define VEPU_REG_SPLIT_PENALTY_4X4 0x0f8 -#define VEPU_REG_VP8_SPLIT_PENALTY_4X4 (((x) & 0x1ff) << 19) -#define VEPU_REG_ADDR_REC_LUMA 0x0fc -#define VEPU_REG_ADDR_REC_CHROMA 0x100 -#define VEPU_REG_CHECKPOINT(i) (0x104 + ((i) * 0x4)) -#define VEPU_REG_CHECKPOINT_CHECK0(x) (((x) & 0xffff)) -#define VEPU_REG_CHECKPOINT_CHECK1(x) (((x) & 0xffff) << 16) -#define VEPU_REG_CHECKPOINT_RESULT(x) \ - ((((x) >> (16 - 16 * ((i) & 1))) & 0xffff) * 32) -#define VEPU_REG_VP8_SEG0_QUANT_AC_Y1 0x104 -#define VEPU_REG_VP8_SEG0_RND_AC_Y1(x) (((x) & 0xff) << 23) -#define VEPU_REG_VP8_SEG0_ZBIN_AC_Y1(x) (((x) & 0x1ff) << 14) -#define VEPU_REG_VP8_SEG0_QUT_AC_Y1(x) (((x) & 0x3fff) << 0) -#define VEPU_REG_VP8_SEG0_QUANT_DC_Y2 0x108 -#define VEPU_REG_VP8_SEG0_RND_DC_Y2(x) (((x) & 0xff) << 23) -#define VEPU_REG_VP8_SEG0_ZBIN_DC_Y2(x) (((x) & 0x1ff) << 14) -#define VEPU_REG_VP8_SEG0_QUT_DC_Y2(x) (((x) & 0x3fff) << 0) -#define VEPU_REG_VP8_SEG0_QUANT_AC_Y2 0x10c -#define VEPU_REG_VP8_SEG0_RND_AC_Y2(x) (((x) & 0xff) << 23) -#define VEPU_REG_VP8_SEG0_ZBIN_AC_Y2(x) (((x) & 0x1ff) << 14) -#define VEPU_REG_VP8_SEG0_QUT_AC_Y2(x) (((x) & 0x3fff) << 0) -#define VEPU_REG_VP8_SEG0_QUANT_DC_CHR 0x110 -#define VEPU_REG_VP8_SEG0_RND_DC_CHR(x) (((x) & 0xff) << 23) -#define VEPU_REG_VP8_SEG0_ZBIN_DC_CHR(x) (((x) & 0x1ff) << 14) -#define VEPU_REG_VP8_SEG0_QUT_DC_CHR(x) (((x) & 0x3fff) << 0) -#define VEPU_REG_VP8_SEG0_QUANT_AC_CHR 0x114 -#define VEPU_REG_VP8_SEG0_RND_AC_CHR(x) (((x) & 0xff) << 23) -#define VEPU_REG_VP8_SEG0_ZBIN_AC_CHR(x) (((x) & 0x1ff) << 14) -#define VEPU_REG_VP8_SEG0_QUT_AC_CHR(x) (((x) & 0x3fff) << 0) -#define VEPU_REG_VP8_SEG0_QUANT_DQUT 0x118 -#define VEPU_REG_VP8_MV_REF_IDX1(x) (((x) & 0x03) << 26) -#define VEPU_REG_VP8_SEG0_DQUT_DC_Y2(x) (((x) & 0x1ff) << 17) -#define VEPU_REG_VP8_SEG0_DQUT_AC_Y1(x) (((x) & 0x1ff) << 8) -#define VEPU_REG_VP8_SEG0_DQUT_DC_Y1(x) (((x) & 0xff) << 0) -#define VEPU_REG_CHKPT_WORD_ERR(i) (0x118 + ((i) * 0x4)) -#define VEPU_REG_CHKPT_WORD_ERR_CHK0(x) (((x) & 0xffff)) -#define VEPU_REG_CHKPT_WORD_ERR_CHK1(x) (((x) & 0xffff) << 16) -#define VEPU_REG_VP8_SEG0_QUANT_DQUT_1 0x11c -#define VEPU_REG_VP8_SEGMENT_MAP_UPDATE BIT(30) -#define VEPU_REG_VP8_SEGMENT_EN BIT(29) -#define VEPU_REG_VP8_MV_REF_IDX2_EN BIT(28) -#define VEPU_REG_VP8_MV_REF_IDX2(x) (((x) & 0x03) << 26) -#define VEPU_REG_VP8_SEG0_DQUT_AC_CHR(x) (((x) & 0x1ff) << 17) -#define VEPU_REG_VP8_SEG0_DQUT_DC_CHR(x) (((x) & 0xff) << 9) -#define VEPU_REG_VP8_SEG0_DQUT_AC_Y2(x) (((x) & 0x1ff) << 0) -#define VEPU_REG_VP8_BOOL_ENC_VALUE 0x120 -#define VEPU_REG_CHKPT_DELTA_QP 0x124 -#define VEPU_REG_CHKPT_DELTA_QP_CHK0(x) (((x) & 0x0f) << 0) -#define VEPU_REG_CHKPT_DELTA_QP_CHK1(x) (((x) & 0x0f) << 4) -#define VEPU_REG_CHKPT_DELTA_QP_CHK2(x) (((x) & 0x0f) << 8) -#define VEPU_REG_CHKPT_DELTA_QP_CHK3(x) (((x) & 0x0f) << 12) -#define VEPU_REG_CHKPT_DELTA_QP_CHK4(x) (((x) & 0x0f) << 16) -#define VEPU_REG_CHKPT_DELTA_QP_CHK5(x) (((x) & 0x0f) << 20) -#define VEPU_REG_CHKPT_DELTA_QP_CHK6(x) (((x) & 0x0f) << 24) -#define VEPU_REG_VP8_ENC_CTRL2 0x124 -#define VEPU_REG_VP8_ZERO_MV_PENALTY_FOR_REF2(x) (((x) & 0xff) << 24) -#define VEPU_REG_VP8_FILTER_SHARPNESS(x) (((x) & 0x07) << 21) -#define VEPU_REG_VP8_FILTER_LEVEL(x) (((x) & 0x3f) << 15) -#define VEPU_REG_VP8_DCT_PARTITION_CNT(x) (((x) & 0x03) << 13) -#define VEPU_REG_VP8_BOOL_ENC_VALUE_BITS(x) (((x) & 0x1f) << 8) -#define VEPU_REG_VP8_BOOL_ENC_RANGE(x) (((x) & 0xff) << 0) -#define VEPU_REG_ENC_CTRL1 0x128 -#define VEPU_REG_MAD_THRESHOLD(x) (((x) & 0x3f) << 24) -#define VEPU_REG_COMPLETED_SLICES(x) (((x) & 0xff) << 16) -#define VEPU_REG_IN_IMG_CTRL_FMT(x) (((x) & 0xf) << 4) -#define VEPU_REG_IN_IMG_ROTATE_MODE(x) (((x) & 0x3) << 2) -#define VEPU_REG_SIZE_TABLE_PRESENT BIT(0) -#define VEPU_REG_INTRA_INTER_MODE 0x12c -#define VEPU_REG_INTRA16X16_MODE(x) (((x) & 0xffff) << 16) -#define VEPU_REG_INTER_MODE(x) (((x) & 0xffff) << 0) -#define VEPU_REG_ENC_CTRL2 0x130 -#define VEPU_REG_PPS_INIT_QP(x) (((x) & 0x3f) << 26) -#define VEPU_REG_SLICE_FILTER_ALPHA(x) (((x) & 0xf) << 22) -#define VEPU_REG_SLICE_FILTER_BETA(x) (((x) & 0xf) << 18) -#define VEPU_REG_CHROMA_QP_OFFSET(x) (((x) & 0x1f) << 13) -#define VEPU_REG_FILTER_DISABLE BIT(5) -#define VEPU_REG_IDR_PIC_ID(x) (((x) & 0xf) << 1) -#define VEPU_REG_CONSTRAINED_INTRA_PREDICTION BIT(0) -#define VEPU_REG_ADDR_OUTPUT_STREAM 0x134 -#define VEPU_REG_ADDR_OUTPUT_CTRL 0x138 -#define VEPU_REG_ADDR_NEXT_PIC 0x13c -#define VEPU_REG_ADDR_MV_OUT 0x140 -#define VEPU_REG_ADDR_CABAC_TBL 0x144 -#define VEPU_REG_ROI1 0x148 -#define VEPU_REG_ROI1_TOP_MB(x) (((x) & 0xff) << 24) -#define VEPU_REG_ROI1_BOTTOM_MB(x) (((x) & 0xff) << 16) -#define VEPU_REG_ROI1_LEFT_MB(x) (((x) & 0xff) << 8) -#define VEPU_REG_ROI1_RIGHT_MB(x) (((x) & 0xff) << 0) -#define VEPU_REG_ROI2 0x14c -#define VEPU_REG_ROI2_TOP_MB(x) (((x) & 0xff) << 24) -#define VEPU_REG_ROI2_BOTTOM_MB(x) (((x) & 0xff) << 16) -#define VEPU_REG_ROI2_LEFT_MB(x) (((x) & 0xff) << 8) -#define VEPU_REG_ROI2_RIGHT_MB(x) (((x) & 0xff) << 0) -#define VEPU_REG_STABLE_MATRIX(i) (0x150 + ((i) * 0x4)) -#define VEPU_REG_STABLE_MOTION_SUM 0x174 -#define VEPU_REG_STABILIZATION_OUTPUT 0x178 -#define VEPU_REG_STABLE_MIN_VALUE(x) (((x) & 0xffffff) << 8) -#define VEPU_REG_STABLE_MODE_SEL(x) (((x) & 0x3) << 6) -#define VEPU_REG_STABLE_HOR_GMV(x) (((x) & 0x3f) << 0) -#define VEPU_REG_RGB2YUV_CONVERSION_COEF1 0x17c -#define VEPU_REG_RGB2YUV_CONVERSION_COEFB(x) (((x) & 0xffff) << 16) -#define VEPU_REG_RGB2YUV_CONVERSION_COEFA(x) (((x) & 0xffff) << 0) -#define VEPU_REG_RGB2YUV_CONVERSION_COEF2 0x180 -#define VEPU_REG_RGB2YUV_CONVERSION_COEFE(x) (((x) & 0xffff) << 16) -#define VEPU_REG_RGB2YUV_CONVERSION_COEFC(x) (((x) & 0xffff) << 0) -#define VEPU_REG_RGB2YUV_CONVERSION_COEF3 0x184 -#define VEPU_REG_RGB2YUV_CONVERSION_COEFF(x) (((x) & 0xffff) << 0) -#define VEPU_REG_RGB_MASK_MSB 0x188 -#define VEPU_REG_RGB_MASK_B_MSB(x) (((x) & 0x1f) << 16) -#define VEPU_REG_RGB_MASK_G_MSB(x) (((x) & 0x1f) << 8) -#define VEPU_REG_RGB_MASK_R_MSB(x) (((x) & 0x1f) << 0) -#define VEPU_REG_MV_PENALTY 0x18c -#define VEPU_REG_1MV_PENALTY(x) (((x) & 0x3ff) << 21) -#define VEPU_REG_QMV_PENALTY(x) (((x) & 0x3ff) << 11) -#define VEPU_REG_4MV_PENALTY(x) (((x) & 0x3ff) << 1) -#define VEPU_REG_SPLIT_MV_MODE_EN BIT(0) -#define VEPU_REG_QP_VAL 0x190 -#define VEPU_REG_H264_LUMA_INIT_QP(x) (((x) & 0x3f) << 26) -#define VEPU_REG_H264_QP_MAX(x) (((x) & 0x3f) << 20) -#define VEPU_REG_H264_QP_MIN(x) (((x) & 0x3f) << 14) -#define VEPU_REG_H264_CHKPT_DISTANCE(x) (((x) & 0xfff) << 0) -#define VEPU_REG_VP8_SEG0_QUANT_DC_Y1 0x190 -#define VEPU_REG_VP8_SEG0_RND_DC_Y1(x) (((x) & 0xff) << 23) -#define VEPU_REG_VP8_SEG0_ZBIN_DC_Y1(x) (((x) & 0x1ff) << 14) -#define VEPU_REG_VP8_SEG0_QUT_DC_Y1(x) (((x) & 0x3fff) << 0) -#define VEPU_REG_MVC_RELATE 0x198 -#define VEPU_REG_ZERO_MV_FAVOR_D2(x) (((x) & 0xf) << 20) -#define VEPU_REG_PENALTY_4X4MV(x) (((x) & 0x1ff) << 11) -#define VEPU_REG_MVC_VIEW_ID(x) (((x) & 0x7) << 8) -#define VEPU_REG_MVC_ANCHOR_PIC_FLAG BIT(7) -#define VEPU_REG_MVC_PRIORITY_ID(x) (((x) & 0x7) << 4) -#define VEPU_REG_MVC_TEMPORAL_ID(x) (((x) & 0x7) << 1) -#define VEPU_REG_MVC_INTER_VIEW_FLAG BIT(0) -#define VEPU_REG_ENCODE_START 0x19c -#define VEPU_REG_MB_HEIGHT(x) (((x) & 0x1ff) << 20) -#define VEPU_REG_MB_WIDTH(x) (((x) & 0x1ff) << 8) -#define VEPU_REG_FRAME_TYPE_INTER (0x0 << 6) -#define VEPU_REG_FRAME_TYPE_INTRA (0x1 << 6) -#define VEPU_REG_FRAME_TYPE_MVCINTER (0x2 << 6) -#define VEPU_REG_ENCODE_FORMAT_JPEG (0x2 << 4) -#define VEPU_REG_ENCODE_FORMAT_H264 (0x3 << 4) -#define VEPU_REG_ENCODE_ENABLE BIT(0) -#define VEPU_REG_MB_CTRL 0x1a0 -#define VEPU_REG_MB_CNT_OUT(x) (((x) & 0xffff) << 16) -#define VEPU_REG_MB_CNT_SET(x) (((x) & 0xffff) << 0) -#define VEPU_REG_DATA_ENDIAN 0x1a4 -#define VEPU_REG_INPUT_SWAP8 BIT(31) -#define VEPU_REG_INPUT_SWAP16 BIT(30) -#define VEPU_REG_INPUT_SWAP32 BIT(29) -#define VEPU_REG_OUTPUT_SWAP8 BIT(28) -#define VEPU_REG_OUTPUT_SWAP16 BIT(27) -#define VEPU_REG_OUTPUT_SWAP32 BIT(26) -#define VEPU_REG_TEST_IRQ BIT(24) -#define VEPU_REG_TEST_COUNTER(x) (((x) & 0xf) << 20) -#define VEPU_REG_TEST_REG BIT(19) -#define VEPU_REG_TEST_MEMORY BIT(18) -#define VEPU_REG_TEST_LEN(x) (((x) & 0x3ffff) << 0) -#define VEPU_REG_ENC_CTRL3 0x1a8 -#define VEPU_REG_PPS_ID(x) (((x) & 0xff) << 24) -#define VEPU_REG_INTRA_PRED_MODE(x) (((x) & 0xff) << 16) -#define VEPU_REG_FRAME_NUM(x) (((x) & 0xffff) << 0) -#define VEPU_REG_ENC_CTRL4 0x1ac -#define VEPU_REG_MV_PENALTY_16X8_8X16(x) (((x) & 0x3ff) << 20) -#define VEPU_REG_MV_PENALTY_8X8(x) (((x) & 0x3ff) << 10) -#define VEPU_REG_MV_PENALTY_8X4_4X8(x) (((x) & 0x3ff) << 0) -#define VEPU_REG_ADDR_VP8_PROB_CNT 0x1b0 -#define VEPU_REG_INTERRUPT 0x1b4 -#define VEPU_REG_INTERRUPT_NON BIT(28) -#define VEPU_REG_MV_WRITE_EN BIT(24) -#define VEPU_REG_RECON_WRITE_DIS BIT(20) -#define VEPU_REG_INTERRUPT_SLICE_READY_EN BIT(16) -#define VEPU_REG_CLK_GATING_EN BIT(12) -#define VEPU_REG_INTERRUPT_TIMEOUT_EN BIT(10) -#define VEPU_REG_INTERRUPT_RESET BIT(9) -#define VEPU_REG_INTERRUPT_DIS_BIT BIT(8) -#define VEPU_REG_INTERRUPT_TIMEOUT BIT(6) -#define VEPU_REG_INTERRUPT_BUFFER_FULL BIT(5) -#define VEPU_REG_INTERRUPT_BUS_ERROR BIT(4) -#define VEPU_REG_INTERRUPT_FUSE BIT(3) -#define VEPU_REG_INTERRUPT_SLICE_READY BIT(2) -#define VEPU_REG_INTERRUPT_FRAME_READY BIT(1) -#define VEPU_REG_INTERRUPT_BIT BIT(0) -#define VEPU_REG_DMV_PENALTY_TBL(i) (0x1E0 + ((i) * 0x4)) -#define VEPU_REG_DMV_PENALTY_TABLE_BIT(x, i) ((x) << (i) * 8) -#define VEPU_REG_DMV_Q_PIXEL_PENALTY_TBL(i) (0x260 + ((i) * 0x4)) -#define VEPU_REG_DMV_Q_PIXEL_PENALTY_TABLE_BIT(x, i) ((x) << (i) * 8) - -/* vpu decoder register */ -#define VDPU_REG_DEC_CTRL0 0x0c8 // 50 -#define VDPU_REG_REF_BUF_CTRL2_REFBU2_PICID(x) (((x) & 0x1f) << 25) -#define VDPU_REG_REF_BUF_CTRL2_REFBU2_THR(x) (((x) & 0xfff) << 13) -#define VDPU_REG_CONFIG_TILED_MODE_LSB BIT(12) -#define VDPU_REG_CONFIG_DEC_ADV_PRE_DIS BIT(11) -#define VDPU_REG_CONFIG_DEC_SCMD_DIS BIT(10) -#define VDPU_REG_DEC_CTRL0_SKIP_MODE BIT(9) -#define VDPU_REG_DEC_CTRL0_FILTERING_DIS BIT(8) -#define VDPU_REG_DEC_CTRL0_PIC_FIXED_QUANT BIT(7) -#define VDPU_REG_CONFIG_DEC_LATENCY(x) (((x) & 0x3f) << 1) -#define VDPU_REG_CONFIG_TILED_MODE_MSB(x) BIT(0) -#define VDPU_REG_CONFIG_DEC_OUT_TILED_E BIT(0) -#define VDPU_REG_STREAM_LEN 0x0cc -#define VDPU_REG_DEC_CTRL3_INIT_QP(x) (((x) & 0x3f) << 25) -#define VDPU_REG_DEC_STREAM_LEN_HI BIT(24) -#define VDPU_REG_DEC_CTRL3_STREAM_LEN(x) (((x) & 0xffffff) << 0) -#define VDPU_REG_ERROR_CONCEALMENT 0x0d0 -#define VDPU_REG_REF_BUF_CTRL2_APF_THRESHOLD(x) (((x) & 0x3fff) << 17) -#define VDPU_REG_ERR_CONC_STARTMB_X(x) (((x) & 0x1ff) << 8) -#define VDPU_REG_ERR_CONC_STARTMB_Y(x) (((x) & 0xff) << 0) -#define VDPU_REG_DEC_FORMAT 0x0d4 -#define VDPU_REG_DEC_CTRL0_DEC_MODE(x) (((x) & 0xf) << 0) -#define VDPU_REG_DATA_ENDIAN 0x0d8 -#define VDPU_REG_CONFIG_DEC_STRENDIAN_E BIT(5) -#define VDPU_REG_CONFIG_DEC_STRSWAP32_E BIT(4) -#define VDPU_REG_CONFIG_DEC_OUTSWAP32_E BIT(3) -#define VDPU_REG_CONFIG_DEC_INSWAP32_E BIT(2) -#define VDPU_REG_CONFIG_DEC_OUT_ENDIAN BIT(1) -#define VDPU_REG_CONFIG_DEC_IN_ENDIAN BIT(0) -#define VDPU_REG_INTERRUPT 0x0dc -#define VDPU_REG_INTERRUPT_DEC_TIMEOUT BIT(13) -#define VDPU_REG_INTERRUPT_DEC_ERROR_INT BIT(12) -#define VDPU_REG_INTERRUPT_DEC_PIC_INF BIT(10) -#define VDPU_REG_INTERRUPT_DEC_SLICE_INT BIT(9) -#define VDPU_REG_INTERRUPT_DEC_ASO_INT BIT(8) -#define VDPU_REG_INTERRUPT_DEC_BUFFER_INT BIT(6) -#define VDPU_REG_INTERRUPT_DEC_BUS_INT BIT(5) -#define VDPU_REG_INTERRUPT_DEC_RDY_INT BIT(4) -#define VDPU_REG_INTERRUPT_DEC_IRQ_DIS BIT(1) -#define VDPU_REG_INTERRUPT_DEC_IRQ BIT(0) -#define VDPU_REG_AXI_CTRL 0x0e0 -#define VDPU_REG_AXI_DEC_SEL BIT(23) -#define VDPU_REG_CONFIG_DEC_DATA_DISC_E BIT(22) -#define VDPU_REG_PARAL_BUS_E(x) BIT(21) -#define VDPU_REG_CONFIG_DEC_MAX_BURST(x) (((x) & 0x1f) << 16) -#define VDPU_REG_DEC_CTRL0_DEC_AXI_WR_ID(x) (((x) & 0xff) << 8) -#define VDPU_REG_CONFIG_DEC_AXI_RD_ID(x) (((x) & 0xff) << 0) -#define VDPU_REG_EN_FLAGS 0x0e4 -#define VDPU_REG_AHB_HLOCK_E BIT(31) -#define VDPU_REG_CACHE_E BIT(29) -#define VDPU_REG_PREFETCH_SINGLE_CHANNEL_E BIT(28) -#define VDPU_REG_INTRA_3_CYCLE_ENHANCE BIT(27) -#define VDPU_REG_INTRA_DOUBLE_SPEED BIT(26) -#define VDPU_REG_INTER_DOUBLE_SPEED BIT(25) -#define VDPU_REG_DEC_CTRL3_START_CODE_E BIT(22) -#define VDPU_REG_DEC_CTRL3_CH_8PIX_ILEAV_E BIT(21) -#define VDPU_REG_DEC_CTRL0_RLC_MODE_E BIT(20) -#define VDPU_REG_DEC_CTRL0_DIVX3_E BIT(19) -#define VDPU_REG_DEC_CTRL0_PJPEG_E BIT(18) -#define VDPU_REG_DEC_CTRL0_PIC_INTERLACE_E BIT(17) -#define VDPU_REG_DEC_CTRL0_PIC_FIELDMODE_E BIT(16) -#define VDPU_REG_DEC_CTRL0_PIC_B_E BIT(15) -#define VDPU_REG_DEC_CTRL0_PIC_INTER_E BIT(14) -#define VDPU_REG_DEC_CTRL0_PIC_TOPFIELD_E BIT(13) -#define VDPU_REG_DEC_CTRL0_FWD_INTERLACE_E BIT(12) -#define VDPU_REG_DEC_CTRL0_SORENSON_E BIT(11) -#define VDPU_REG_DEC_CTRL0_WRITE_MVS_E BIT(10) -#define VDPU_REG_DEC_CTRL0_REF_TOPFIELD_E BIT(9) -#define VDPU_REG_DEC_CTRL0_REFTOPFIRST_E BIT(8) -#define VDPU_REG_DEC_CTRL0_SEQ_MBAFF_E BIT(7) -#define VDPU_REG_DEC_CTRL0_PICORD_COUNT_E BIT(6) -#define VDPU_REG_CONFIG_DEC_TIMEOUT_E BIT(5) -#define VDPU_REG_CONFIG_DEC_CLK_GATE_E BIT(4) -#define VDPU_REG_DEC_CTRL0_DEC_OUT_DIS BIT(2) -#define VDPU_REG_REF_BUF_CTRL2_REFBU2_BUF_E BIT(1) -#define VDPU_REG_INTERRUPT_DEC_E BIT(0) -#define VDPU_REG_SOFT_RESET 0x0e8 -#define VDPU_REG_PRED_FLT 0x0ec -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_0_0(x) (((x) & 0x3ff) << 22) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_0_1(x) (((x) & 0x3ff) << 12) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_0_2(x) (((x) & 0x3ff) << 2) -#define VDPU_REG_ADDITIONAL_CHROMA_ADDRESS 0x0f0 -#define VDPU_REG_ADDR_QTABLE 0x0f4 -#define VDPU_REG_DIRECT_MV_ADDR 0x0f8 -#define VDPU_REG_ADDR_DST 0x0fc -#define VDPU_REG_ADDR_STR 0x100 -#define VDPU_REG_REFBUF_RELATED 0x104 -#define VDPU_REG_FWD_PIC(i) (0x128 + ((i) * 0x4)) -#define VDPU_REG_FWD_PIC_PINIT_RLIST_F5(x) (((x) & 0x1f) << 25) -#define VDPU_REG_FWD_PIC_PINIT_RLIST_F4(x) (((x) & 0x1f) << 20) -#define VDPU_REG_FWD_PIC_PINIT_RLIST_F3(x) (((x) & 0x1f) << 15) -#define VDPU_REG_FWD_PIC_PINIT_RLIST_F2(x) (((x) & 0x1f) << 10) -#define VDPU_REG_FWD_PIC_PINIT_RLIST_F1(x) (((x) & 0x1f) << 5) -#define VDPU_REG_FWD_PIC_PINIT_RLIST_F0(x) (((x) & 0x1f) << 0) -#define VDPU_REG_REF_PIC(i) (0x130 + ((i) * 0x4)) -#define VDPU_REG_REF_PIC_REFER1_NBR(x) (((x) & 0xffff) << 16) -#define VDPU_REG_REF_PIC_REFER0_NBR(x) (((x) & 0xffff) << 0) -#define VDPU_REG_H264_ADDR_REF(i) (0x150 + ((i) * 0x4)) -#define VDPU_REG_ADDR_REF_FIELD_E BIT(1) -#define VDPU_REG_ADDR_REF_TOPC_E BIT(0) -#define VDPU_REG_INITIAL_REF_PIC_LIST0 0x190 -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_F5(x) (((x) & 0x1f) << 25) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_F4(x) (((x) & 0x1f) << 20) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_F3(x) (((x) & 0x1f) << 15) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_F2(x) (((x) & 0x1f) << 10) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_F1(x) (((x) & 0x1f) << 5) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_F0(x) (((x) & 0x1f) << 0) -#define VDPU_REG_INITIAL_REF_PIC_LIST1 0x194 -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_F11(x) (((x) & 0x1f) << 25) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_F10(x) (((x) & 0x1f) << 20) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_F9(x) (((x) & 0x1f) << 15) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_F8(x) (((x) & 0x1f) << 10) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_F7(x) (((x) & 0x1f) << 5) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_F6(x) (((x) & 0x1f) << 0) -#define VDPU_REG_INITIAL_REF_PIC_LIST2 0x198 -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_F15(x) (((x) & 0x1f) << 15) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_F14(x) (((x) & 0x1f) << 10) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_F13(x) (((x) & 0x1f) << 5) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_F12(x) (((x) & 0x1f) << 0) -#define VDPU_REG_INITIAL_REF_PIC_LIST3 0x19c -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_B5(x) (((x) & 0x1f) << 25) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_B4(x) (((x) & 0x1f) << 20) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_B3(x) (((x) & 0x1f) << 15) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_B2(x) (((x) & 0x1f) << 10) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_B1(x) (((x) & 0x1f) << 5) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_B0(x) (((x) & 0x1f) << 0) -#define VDPU_REG_INITIAL_REF_PIC_LIST4 0x1a0 -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_B11(x) (((x) & 0x1f) << 25) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_B10(x) (((x) & 0x1f) << 20) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_B9(x) (((x) & 0x1f) << 15) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_B8(x) (((x) & 0x1f) << 10) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_B7(x) (((x) & 0x1f) << 5) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_B6(x) (((x) & 0x1f) << 0) -#define VDPU_REG_INITIAL_REF_PIC_LIST5 0x1a4 -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_B15(x) (((x) & 0x1f) << 15) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_B14(x) (((x) & 0x1f) << 10) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_B13(x) (((x) & 0x1f) << 5) -#define VDPU_REG_BD_REF_PIC_BINIT_RLIST_B12(x) (((x) & 0x1f) << 0) -#define VDPU_REG_INITIAL_REF_PIC_LIST6 0x1a8 -#define VDPU_REG_BD_P_REF_PIC_PINIT_RLIST_F3(x) (((x) & 0x1f) << 15) -#define VDPU_REG_BD_P_REF_PIC_PINIT_RLIST_F2(x) (((x) & 0x1f) << 10) -#define VDPU_REG_BD_P_REF_PIC_PINIT_RLIST_F1(x) (((x) & 0x1f) << 5) -#define VDPU_REG_BD_P_REF_PIC_PINIT_RLIST_F0(x) (((x) & 0x1f) << 0) -#define VDPU_REG_LT_REF 0x1ac -#define VDPU_REG_VALID_REF 0x1b0 -#define VDPU_REG_H264_PIC_MB_SIZE 0x1b8 -#define VDPU_REG_DEC_CTRL2_CH_QP_OFFSET2(x) (((x) & 0x1f) << 22) -#define VDPU_REG_DEC_CTRL2_CH_QP_OFFSET(x) (((x) & 0x1f) << 17) -#define VDPU_REG_DEC_CTRL1_PIC_MB_HEIGHT_P(x) (((x) & 0xff) << 9) -#define VDPU_REG_DEC_CTRL1_PIC_MB_WIDTH(x) (((x) & 0x1ff) << 0) -#define VDPU_REG_H264_CTRL 0x1bc -#define VDPU_REG_DEC_CTRL4_WEIGHT_BIPR_IDC(x) (((x) & 0x3) << 16) -#define VDPU_REG_DEC_CTRL1_REF_FRAMES(x) (((x) & 0x1f) << 0) -#define VDPU_REG_CURRENT_FRAME 0x1c0 -#define VDPU_REG_DEC_CTRL5_FILT_CTRL_PRES BIT(31) -#define VDPU_REG_DEC_CTRL5_RDPIC_CNT_PRES BIT(30) -#define VDPU_REG_DEC_CTRL4_FRAMENUM_LEN(x) (((x) & 0x1f) << 16) -#define VDPU_REG_DEC_CTRL4_FRAMENUM(x) (((x) & 0xffff) << 0) -#define VDPU_REG_REF_FRAME 0x1c4 -#define VDPU_REG_DEC_CTRL5_REFPIC_MK_LEN(x) (((x) & 0x7ff) << 16) -#define VDPU_REG_DEC_CTRL5_IDR_PIC_ID(x) (((x) & 0xffff) << 0) -#define VDPU_REG_DEC_CTRL6 0x1c8 -#define VDPU_REG_DEC_CTRL6_PPS_ID(x) (((x) & 0xff) << 24) -#define VDPU_REG_DEC_CTRL6_REFIDX1_ACTIVE(x) (((x) & 0x1f) << 19) -#define VDPU_REG_DEC_CTRL6_REFIDX0_ACTIVE(x) (((x) & 0x1f) << 14) -#define VDPU_REG_DEC_CTRL6_POC_LENGTH(x) (((x) & 0xff) << 0) -#define VDPU_REG_ENABLE_FLAG 0x1cc -#define VDPU_REG_DEC_CTRL5_IDR_PIC_E BIT(8) -#define VDPU_REG_DEC_CTRL4_DIR_8X8_INFER_E BIT(7) -#define VDPU_REG_DEC_CTRL4_BLACKWHITE_E BIT(6) -#define VDPU_REG_DEC_CTRL4_CABAC_E BIT(5) -#define VDPU_REG_DEC_CTRL4_WEIGHT_PRED_E BIT(4) -#define VDPU_REG_DEC_CTRL5_CONST_INTRA_E BIT(3) -#define VDPU_REG_DEC_CTRL5_8X8TRANS_FLAG_E BIT(2) -#define VDPU_REG_DEC_CTRL2_TYPE1_QUANT_E BIT(1) -#define VDPU_REG_DEC_CTRL2_FIELDPIC_FLAG_E BIT(0) -#define VDPU_REG_VP8_PIC_MB_SIZE 0x1e0 -#define VDPU_REG_DEC_PIC_MB_WIDTH(x) (((x) & 0x1ff) << 23) -#define VDPU_REG_DEC_MB_WIDTH_OFF(x) (((x) & 0xf) << 19) -#define VDPU_REG_DEC_PIC_MB_HEIGHT_P(x) (((x) & 0xff) << 11) -#define VDPU_REG_DEC_MB_HEIGHT_OFF(x) (((x) & 0xf) << 7) -#define VDPU_REG_DEC_CTRL1_PIC_MB_W_EXT(x) (((x) & 0x7) << 3) -#define VDPU_REG_DEC_CTRL1_PIC_MB_H_EXT(x) (((x) & 0x7) << 0) -#define VDPU_REG_VP8_DCT_START_BIT 0x1e4 -#define VDPU_REG_DEC_CTRL4_DCT1_START_BIT(x) (((x) & 0x3f) << 26) -#define VDPU_REG_DEC_CTRL4_DCT2_START_BIT(x) (((x) & 0x3f) << 20) -#define VDPU_REG_DEC_CTRL4_VC1_HEIGHT_EXT BIT(13) -#define VDPU_REG_DEC_CTRL4_BILIN_MC_E BIT(12) -#define VDPU_REG_VP8_CTRL0 0x1e8 -#define VDPU_REG_DEC_CTRL2_STRM_START_BIT(x) (((x) & 0x3f) << 26) -#define VDPU_REG_DEC_CTRL2_STRM1_START_BIT(x) (((x) & 0x3f) << 18) -#define VDPU_REG_DEC_CTRL2_BOOLEAN_VALUE(x) (((x) & 0xff) << 8) -#define VDPU_REG_DEC_CTRL2_BOOLEAN_RANGE(x) (((x) & 0xff) << 0) -#define VDPU_REG_VP8_DATA_VAL 0x1f0 -#define VDPU_REG_DEC_CTRL6_COEFFS_PART_AM(x) (((x) & 0xf) << 24) -#define VDPU_REG_DEC_CTRL6_STREAM1_LEN(x) (((x) & 0xffffff) << 0) -#define VDPU_REG_PRED_FLT7 0x1f4 -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_5_1(x) (((x) & 0x3ff) << 22) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_5_2(x) (((x) & 0x3ff) << 12) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_5_3(x) (((x) & 0x3ff) << 2) -#define VDPU_REG_PRED_FLT8 0x1f8 -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_6_0(x) (((x) & 0x3ff) << 22) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_6_1(x) (((x) & 0x3ff) << 12) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_6_2(x) (((x) & 0x3ff) << 2) -#define VDPU_REG_PRED_FLT9 0x1fc -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_6_3(x) (((x) & 0x3ff) << 22) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_7_0(x) (((x) & 0x3ff) << 12) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_7_1(x) (((x) & 0x3ff) << 2) -#define VDPU_REG_PRED_FLT10 0x200 -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_7_2(x) (((x) & 0x3ff) << 22) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_7_3(x) (((x) & 0x3ff) << 12) -#define VDPU_REG_BD_REF_PIC_PRED_TAP_2_M1(x) (((x) & 0x3) << 10) -#define VDPU_REG_BD_REF_PIC_PRED_TAP_2_4(x) (((x) & 0x3) << 8) -#define VDPU_REG_BD_REF_PIC_PRED_TAP_4_M1(x) (((x) & 0x3) << 6) -#define VDPU_REG_BD_REF_PIC_PRED_TAP_4_4(x) (((x) & 0x3) << 4) -#define VDPU_REG_BD_REF_PIC_PRED_TAP_6_M1(x) (((x) & 0x3) << 2) -#define VDPU_REG_BD_REF_PIC_PRED_TAP_6_4(x) (((x) & 0x3) << 0) -#define VDPU_REG_FILTER_LEVEL 0x204 -#define VDPU_REG_REF_PIC_LF_LEVEL_0(x) (((x) & 0x3f) << 18) -#define VDPU_REG_REF_PIC_LF_LEVEL_1(x) (((x) & 0x3f) << 12) -#define VDPU_REG_REF_PIC_LF_LEVEL_2(x) (((x) & 0x3f) << 6) -#define VDPU_REG_REF_PIC_LF_LEVEL_3(x) (((x) & 0x3f) << 0) -#define VDPU_REG_VP8_QUANTER0 0x208 -#define VDPU_REG_REF_PIC_QUANT_DELTA_0(x) (((x) & 0x1f) << 27) -#define VDPU_REG_REF_PIC_QUANT_DELTA_1(x) (((x) & 0x1f) << 22) -#define VDPU_REG_REF_PIC_QUANT_0(x) (((x) & 0x7ff) << 11) -#define VDPU_REG_REF_PIC_QUANT_1(x) (((x) & 0x7ff) << 0) -#define VDPU_REG_VP8_ADDR_REF0 0x20c -#define VDPU_REG_FILTER_MB_ADJ 0x210 -#define VDPU_REG_REF_PIC_FILT_TYPE_E BIT(31) -#define VDPU_REG_REF_PIC_FILT_SHARPNESS(x) (((x) & 0x7) << 28) -#define VDPU_REG_FILT_MB_ADJ_0(x) (((x) & 0x7f) << 21) -#define VDPU_REG_FILT_MB_ADJ_1(x) (((x) & 0x7f) << 14) -#define VDPU_REG_FILT_MB_ADJ_2(x) (((x) & 0x7f) << 7) -#define VDPU_REG_FILT_MB_ADJ_3(x) (((x) & 0x7f) << 0) -#define VDPU_REG_FILTER_REF_ADJ 0x214 -#define VDPU_REG_REF_PIC_ADJ_0(x) (((x) & 0x7f) << 21) -#define VDPU_REG_REF_PIC_ADJ_1(x) (((x) & 0x7f) << 14) -#define VDPU_REG_REF_PIC_ADJ_2(x) (((x) & 0x7f) << 7) -#define VDPU_REG_REF_PIC_ADJ_3(x) (((x) & 0x7f) << 0) -#define VDPU_REG_VP8_ADDR_REF2_5(i) (0x218 + ((i) * 0x4)) -#define VDPU_REG_VP8_GREF_SIGN_BIAS BIT(0) -#define VDPU_REG_VP8_AREF_SIGN_BIAS BIT(0) -#define VDPU_REG_VP8_DCT_BASE(i) (0x230 + ((i) * 0x4)) -#define VDPU_REG_VP8_ADDR_CTRL_PART 0x244 -#define VDPU_REG_VP8_ADDR_REF1 0x250 -#define VDPU_REG_VP8_SEGMENT_VAL 0x254 -#define VDPU_REG_FWD_PIC1_SEGMENT_BASE(x) ((x) << 0) -#define VDPU_REG_FWD_PIC1_SEGMENT_UPD_E BIT(1) -#define VDPU_REG_FWD_PIC1_SEGMENT_E BIT(0) -#define VDPU_REG_VP8_DCT_START_BIT2 0x258 -#define VDPU_REG_DEC_CTRL7_DCT3_START_BIT(x) (((x) & 0x3f) << 24) -#define VDPU_REG_DEC_CTRL7_DCT4_START_BIT(x) (((x) & 0x3f) << 18) -#define VDPU_REG_DEC_CTRL7_DCT5_START_BIT(x) (((x) & 0x3f) << 12) -#define VDPU_REG_DEC_CTRL7_DCT6_START_BIT(x) (((x) & 0x3f) << 6) -#define VDPU_REG_DEC_CTRL7_DCT7_START_BIT(x) (((x) & 0x3f) << 0) -#define VDPU_REG_VP8_QUANTER1 0x25c -#define VDPU_REG_REF_PIC_QUANT_DELTA_2(x) (((x) & 0x1f) << 27) -#define VDPU_REG_REF_PIC_QUANT_DELTA_3(x) (((x) & 0x1f) << 22) -#define VDPU_REG_REF_PIC_QUANT_2(x) (((x) & 0x7ff) << 11) -#define VDPU_REG_REF_PIC_QUANT_3(x) (((x) & 0x7ff) << 0) -#define VDPU_REG_VP8_QUANTER2 0x260 -#define VDPU_REG_REF_PIC_QUANT_DELTA_4(x) (((x) & 0x1f) << 27) -#define VDPU_REG_REF_PIC_QUANT_4(x) (((x) & 0x7ff) << 11) -#define VDPU_REG_REF_PIC_QUANT_5(x) (((x) & 0x7ff) << 0) -#define VDPU_REG_PRED_FLT1 0x264 -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_0_3(x) (((x) & 0x3ff) << 22) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_1_0(x) (((x) & 0x3ff) << 12) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_1_1(x) (((x) & 0x3ff) << 2) -#define VDPU_REG_PRED_FLT2 0x268 -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_1_2(x) (((x) & 0x3ff) << 22) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_1_3(x) (((x) & 0x3ff) << 12) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_2_0(x) (((x) & 0x3ff) << 2) -#define VDPU_REG_PRED_FLT3 0x26c -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_2_1(x) (((x) & 0x3ff) << 22) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_2_2(x) (((x) & 0x3ff) << 12) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_2_3(x) (((x) & 0x3ff) << 2) -#define VDPU_REG_PRED_FLT4 0x270 -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_3_0(x) (((x) & 0x3ff) << 22) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_3_1(x) (((x) & 0x3ff) << 12) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_3_2(x) (((x) & 0x3ff) << 2) -#define VDPU_REG_PRED_FLT5 0x274 -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_3_3(x) (((x) & 0x3ff) << 22) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_4_0(x) (((x) & 0x3ff) << 12) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_4_1(x) (((x) & 0x3ff) << 2) -#define VDPU_REG_PRED_FLT6 0x278 -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_4_2(x) (((x) & 0x3ff) << 22) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_4_3(x) (((x) & 0x3ff) << 12) -#define VDPU_REG_PRED_FLT_PRED_BC_TAP_5_0(x) (((x) & 0x3ff) << 2) - -#endif /* ROCKCHIP_VPU2_REGS_H_ */ diff --git a/drivers/staging/media/hantro/rockchip_vpu_hw.c b/drivers/staging/media/hantro/rockchip_vpu_hw.c deleted file mode 100644 index 8de6fd2e8eef..000000000000 --- a/drivers/staging/media/hantro/rockchip_vpu_hw.c +++ /dev/null @@ -1,680 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Hantro VPU codec driver - * - * Copyright (C) 2018 Rockchip Electronics Co., Ltd. - * Jeffy Chen <jeffy.chen@rock-chips.com> - */ - -#include <linux/clk.h> - -#include "hantro.h" -#include "hantro_jpeg.h" -#include "hantro_g1_regs.h" -#include "hantro_h1_regs.h" -#include "rockchip_vpu2_regs.h" - -#define RK3066_ACLK_MAX_FREQ (300 * 1000 * 1000) -#define RK3288_ACLK_MAX_FREQ (400 * 1000 * 1000) - -/* - * Supported formats. - */ - -static const struct hantro_fmt rockchip_vpu_enc_fmts[] = { - { - .fourcc = V4L2_PIX_FMT_YUV420M, - .codec_mode = HANTRO_MODE_NONE, - .enc_fmt = ROCKCHIP_VPU_ENC_FMT_YUV420P, - }, - { - .fourcc = V4L2_PIX_FMT_NV12M, - .codec_mode = HANTRO_MODE_NONE, - .enc_fmt = ROCKCHIP_VPU_ENC_FMT_YUV420SP, - }, - { - .fourcc = V4L2_PIX_FMT_YUYV, - .codec_mode = HANTRO_MODE_NONE, - .enc_fmt = ROCKCHIP_VPU_ENC_FMT_YUYV422, - }, - { - .fourcc = V4L2_PIX_FMT_UYVY, - .codec_mode = HANTRO_MODE_NONE, - .enc_fmt = ROCKCHIP_VPU_ENC_FMT_UYVY422, - }, - { - .fourcc = V4L2_PIX_FMT_JPEG, - .codec_mode = HANTRO_MODE_JPEG_ENC, - .max_depth = 2, - .header_size = JPEG_HEADER_SIZE, - .frmsize = { - .min_width = 96, - .max_width = 8192, - .step_width = MB_DIM, - .min_height = 32, - .max_height = 8192, - .step_height = MB_DIM, - }, - }, -}; - -static const struct hantro_fmt rockchip_vpu1_postproc_fmts[] = { - { - .fourcc = V4L2_PIX_FMT_YUYV, - .codec_mode = HANTRO_MODE_NONE, - .postprocessed = true, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_FHD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_FHD_HEIGHT, - .step_height = MB_DIM, - }, - }, -}; - -static const struct hantro_fmt rk3066_vpu_dec_fmts[] = { - { - .fourcc = V4L2_PIX_FMT_NV12, - .codec_mode = HANTRO_MODE_NONE, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_FHD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_FHD_HEIGHT, - .step_height = MB_DIM, - }, - }, - { - .fourcc = V4L2_PIX_FMT_H264_SLICE, - .codec_mode = HANTRO_MODE_H264_DEC, - .max_depth = 2, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_FHD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_FHD_HEIGHT, - .step_height = MB_DIM, - }, - }, - { - .fourcc = V4L2_PIX_FMT_MPEG2_SLICE, - .codec_mode = HANTRO_MODE_MPEG2_DEC, - .max_depth = 2, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_FHD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_FHD_HEIGHT, - .step_height = MB_DIM, - }, - }, - { - .fourcc = V4L2_PIX_FMT_VP8_FRAME, - .codec_mode = HANTRO_MODE_VP8_DEC, - .max_depth = 2, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_FHD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_FHD_HEIGHT, - .step_height = MB_DIM, - }, - }, -}; - -static const struct hantro_fmt rk3288_vpu_dec_fmts[] = { - { - .fourcc = V4L2_PIX_FMT_NV12, - .codec_mode = HANTRO_MODE_NONE, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_4K_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_4K_HEIGHT, - .step_height = MB_DIM, - }, - }, - { - .fourcc = V4L2_PIX_FMT_H264_SLICE, - .codec_mode = HANTRO_MODE_H264_DEC, - .max_depth = 2, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_4K_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_4K_HEIGHT, - .step_height = MB_DIM, - }, - }, - { - .fourcc = V4L2_PIX_FMT_MPEG2_SLICE, - .codec_mode = HANTRO_MODE_MPEG2_DEC, - .max_depth = 2, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_FHD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_FHD_HEIGHT, - .step_height = MB_DIM, - }, - }, - { - .fourcc = V4L2_PIX_FMT_VP8_FRAME, - .codec_mode = HANTRO_MODE_VP8_DEC, - .max_depth = 2, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_UHD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_UHD_HEIGHT, - .step_height = MB_DIM, - }, - }, -}; - -static const struct hantro_fmt rockchip_vdpu2_dec_fmts[] = { - { - .fourcc = V4L2_PIX_FMT_NV12, - .codec_mode = HANTRO_MODE_NONE, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_FHD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_FHD_HEIGHT, - .step_height = MB_DIM, - }, - }, - { - .fourcc = V4L2_PIX_FMT_H264_SLICE, - .codec_mode = HANTRO_MODE_H264_DEC, - .max_depth = 2, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_FHD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_FHD_HEIGHT, - .step_height = MB_DIM, - }, - }, - { - .fourcc = V4L2_PIX_FMT_MPEG2_SLICE, - .codec_mode = HANTRO_MODE_MPEG2_DEC, - .max_depth = 2, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_FHD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_FHD_HEIGHT, - .step_height = MB_DIM, - }, - }, - { - .fourcc = V4L2_PIX_FMT_VP8_FRAME, - .codec_mode = HANTRO_MODE_VP8_DEC, - .max_depth = 2, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_UHD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_UHD_HEIGHT, - .step_height = MB_DIM, - }, - }, -}; - -static const struct hantro_fmt rk3399_vpu_dec_fmts[] = { - { - .fourcc = V4L2_PIX_FMT_NV12, - .codec_mode = HANTRO_MODE_NONE, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_FHD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_FHD_HEIGHT, - .step_height = MB_DIM, - }, - }, - { - .fourcc = V4L2_PIX_FMT_MPEG2_SLICE, - .codec_mode = HANTRO_MODE_MPEG2_DEC, - .max_depth = 2, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_FHD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_FHD_HEIGHT, - .step_height = MB_DIM, - }, - }, - { - .fourcc = V4L2_PIX_FMT_VP8_FRAME, - .codec_mode = HANTRO_MODE_VP8_DEC, - .max_depth = 2, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_UHD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_UHD_HEIGHT, - .step_height = MB_DIM, - }, - }, -}; - -static irqreturn_t rockchip_vpu1_vepu_irq(int irq, void *dev_id) -{ - struct hantro_dev *vpu = dev_id; - enum vb2_buffer_state state; - u32 status; - - status = vepu_read(vpu, H1_REG_INTERRUPT); - state = (status & H1_REG_INTERRUPT_FRAME_RDY) ? - VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR; - - vepu_write(vpu, 0, H1_REG_INTERRUPT); - vepu_write(vpu, 0, H1_REG_AXI_CTRL); - - hantro_irq_done(vpu, state); - - return IRQ_HANDLED; -} - -static irqreturn_t rockchip_vpu2_vdpu_irq(int irq, void *dev_id) -{ - struct hantro_dev *vpu = dev_id; - enum vb2_buffer_state state; - u32 status; - - status = vdpu_read(vpu, VDPU_REG_INTERRUPT); - state = (status & VDPU_REG_INTERRUPT_DEC_IRQ) ? - VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR; - - vdpu_write(vpu, 0, VDPU_REG_INTERRUPT); - vdpu_write(vpu, 0, VDPU_REG_AXI_CTRL); - - hantro_irq_done(vpu, state); - - return IRQ_HANDLED; -} - -static irqreturn_t rockchip_vpu2_vepu_irq(int irq, void *dev_id) -{ - struct hantro_dev *vpu = dev_id; - enum vb2_buffer_state state; - u32 status; - - status = vepu_read(vpu, VEPU_REG_INTERRUPT); - state = (status & VEPU_REG_INTERRUPT_FRAME_READY) ? - VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR; - - vepu_write(vpu, 0, VEPU_REG_INTERRUPT); - vepu_write(vpu, 0, VEPU_REG_AXI_CTRL); - - hantro_irq_done(vpu, state); - - return IRQ_HANDLED; -} - -static int rk3036_vpu_hw_init(struct hantro_dev *vpu) -{ - /* Bump ACLK to max. possible freq. to improve performance. */ - clk_set_rate(vpu->clocks[0].clk, RK3066_ACLK_MAX_FREQ); - return 0; -} - -static int rk3066_vpu_hw_init(struct hantro_dev *vpu) -{ - /* Bump ACLKs to max. possible freq. to improve performance. */ - clk_set_rate(vpu->clocks[0].clk, RK3066_ACLK_MAX_FREQ); - clk_set_rate(vpu->clocks[2].clk, RK3066_ACLK_MAX_FREQ); - return 0; -} - -static int rockchip_vpu_hw_init(struct hantro_dev *vpu) -{ - /* Bump ACLK to max. possible freq. to improve performance. */ - clk_set_rate(vpu->clocks[0].clk, RK3288_ACLK_MAX_FREQ); - return 0; -} - -static void rk3066_vpu_dec_reset(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - - vdpu_write(vpu, G1_REG_INTERRUPT_DEC_IRQ_DIS, G1_REG_INTERRUPT); - vdpu_write(vpu, G1_REG_CONFIG_DEC_CLK_GATE_E, G1_REG_CONFIG); -} - -static void rockchip_vpu1_enc_reset(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - - vepu_write(vpu, H1_REG_INTERRUPT_DIS_BIT, H1_REG_INTERRUPT); - vepu_write(vpu, 0, H1_REG_ENC_CTRL); - vepu_write(vpu, 0, H1_REG_AXI_CTRL); -} - -static void rockchip_vpu2_dec_reset(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - - vdpu_write(vpu, VDPU_REG_INTERRUPT_DEC_IRQ_DIS, VDPU_REG_INTERRUPT); - vdpu_write(vpu, 0, VDPU_REG_EN_FLAGS); - vdpu_write(vpu, 1, VDPU_REG_SOFT_RESET); -} - -static void rockchip_vpu2_enc_reset(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - - vepu_write(vpu, VEPU_REG_INTERRUPT_DIS_BIT, VEPU_REG_INTERRUPT); - vepu_write(vpu, 0, VEPU_REG_ENCODE_START); - vepu_write(vpu, 0, VEPU_REG_AXI_CTRL); -} - -/* - * Supported codec ops. - */ -static const struct hantro_codec_ops rk3036_vpu_codec_ops[] = { - [HANTRO_MODE_H264_DEC] = { - .run = hantro_g1_h264_dec_run, - .reset = hantro_g1_reset, - .init = hantro_h264_dec_init, - .exit = hantro_h264_dec_exit, - }, - [HANTRO_MODE_MPEG2_DEC] = { - .run = hantro_g1_mpeg2_dec_run, - .reset = hantro_g1_reset, - .init = hantro_mpeg2_dec_init, - .exit = hantro_mpeg2_dec_exit, - }, - [HANTRO_MODE_VP8_DEC] = { - .run = hantro_g1_vp8_dec_run, - .reset = hantro_g1_reset, - .init = hantro_vp8_dec_init, - .exit = hantro_vp8_dec_exit, - }, -}; - -static const struct hantro_codec_ops rk3066_vpu_codec_ops[] = { - [HANTRO_MODE_JPEG_ENC] = { - .run = hantro_h1_jpeg_enc_run, - .reset = rockchip_vpu1_enc_reset, - .done = hantro_h1_jpeg_enc_done, - }, - [HANTRO_MODE_H264_DEC] = { - .run = hantro_g1_h264_dec_run, - .reset = rk3066_vpu_dec_reset, - .init = hantro_h264_dec_init, - .exit = hantro_h264_dec_exit, - }, - [HANTRO_MODE_MPEG2_DEC] = { - .run = hantro_g1_mpeg2_dec_run, - .reset = rk3066_vpu_dec_reset, - .init = hantro_mpeg2_dec_init, - .exit = hantro_mpeg2_dec_exit, - }, - [HANTRO_MODE_VP8_DEC] = { - .run = hantro_g1_vp8_dec_run, - .reset = rk3066_vpu_dec_reset, - .init = hantro_vp8_dec_init, - .exit = hantro_vp8_dec_exit, - }, -}; - -static const struct hantro_codec_ops rk3288_vpu_codec_ops[] = { - [HANTRO_MODE_JPEG_ENC] = { - .run = hantro_h1_jpeg_enc_run, - .reset = rockchip_vpu1_enc_reset, - .done = hantro_h1_jpeg_enc_done, - }, - [HANTRO_MODE_H264_DEC] = { - .run = hantro_g1_h264_dec_run, - .reset = hantro_g1_reset, - .init = hantro_h264_dec_init, - .exit = hantro_h264_dec_exit, - }, - [HANTRO_MODE_MPEG2_DEC] = { - .run = hantro_g1_mpeg2_dec_run, - .reset = hantro_g1_reset, - .init = hantro_mpeg2_dec_init, - .exit = hantro_mpeg2_dec_exit, - }, - [HANTRO_MODE_VP8_DEC] = { - .run = hantro_g1_vp8_dec_run, - .reset = hantro_g1_reset, - .init = hantro_vp8_dec_init, - .exit = hantro_vp8_dec_exit, - }, -}; - -static const struct hantro_codec_ops rk3399_vpu_codec_ops[] = { - [HANTRO_MODE_JPEG_ENC] = { - .run = rockchip_vpu2_jpeg_enc_run, - .reset = rockchip_vpu2_enc_reset, - .done = rockchip_vpu2_jpeg_enc_done, - }, - [HANTRO_MODE_H264_DEC] = { - .run = rockchip_vpu2_h264_dec_run, - .reset = rockchip_vpu2_dec_reset, - .init = hantro_h264_dec_init, - .exit = hantro_h264_dec_exit, - }, - [HANTRO_MODE_MPEG2_DEC] = { - .run = rockchip_vpu2_mpeg2_dec_run, - .reset = rockchip_vpu2_dec_reset, - .init = hantro_mpeg2_dec_init, - .exit = hantro_mpeg2_dec_exit, - }, - [HANTRO_MODE_VP8_DEC] = { - .run = rockchip_vpu2_vp8_dec_run, - .reset = rockchip_vpu2_dec_reset, - .init = hantro_vp8_dec_init, - .exit = hantro_vp8_dec_exit, - }, -}; - -static const struct hantro_codec_ops rk3568_vepu_codec_ops[] = { - [HANTRO_MODE_JPEG_ENC] = { - .run = rockchip_vpu2_jpeg_enc_run, - .reset = rockchip_vpu2_enc_reset, - .done = rockchip_vpu2_jpeg_enc_done, - }, -}; - -/* - * VPU variant. - */ - -static const struct hantro_irq rockchip_vdpu1_irqs[] = { - { "vdpu", hantro_g1_irq }, -}; - -static const struct hantro_irq rockchip_vpu1_irqs[] = { - { "vepu", rockchip_vpu1_vepu_irq }, - { "vdpu", hantro_g1_irq }, -}; - -static const struct hantro_irq rockchip_vdpu2_irqs[] = { - { "vdpu", rockchip_vpu2_vdpu_irq }, -}; - -static const struct hantro_irq rockchip_vpu2_irqs[] = { - { "vepu", rockchip_vpu2_vepu_irq }, - { "vdpu", rockchip_vpu2_vdpu_irq }, -}; - -static const struct hantro_irq rk3568_vepu_irqs[] = { - { "vepu", rockchip_vpu2_vepu_irq }, -}; - -static const char * const rk3066_vpu_clk_names[] = { - "aclk_vdpu", "hclk_vdpu", - "aclk_vepu", "hclk_vepu" -}; - -static const char * const rockchip_vpu_clk_names[] = { - "aclk", "hclk" -}; - -/* VDPU1/VEPU1 */ - -const struct hantro_variant rk3036_vpu_variant = { - .dec_offset = 0x400, - .dec_fmts = rk3066_vpu_dec_fmts, - .num_dec_fmts = ARRAY_SIZE(rk3066_vpu_dec_fmts), - .postproc_fmts = rockchip_vpu1_postproc_fmts, - .num_postproc_fmts = ARRAY_SIZE(rockchip_vpu1_postproc_fmts), - .postproc_ops = &hantro_g1_postproc_ops, - .codec = HANTRO_MPEG2_DECODER | HANTRO_VP8_DECODER | - HANTRO_H264_DECODER, - .codec_ops = rk3036_vpu_codec_ops, - .irqs = rockchip_vdpu1_irqs, - .num_irqs = ARRAY_SIZE(rockchip_vdpu1_irqs), - .init = rk3036_vpu_hw_init, - .clk_names = rockchip_vpu_clk_names, - .num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names) -}; - -/* - * Despite this variant has separate clocks for decoder and encoder, - * it's still required to enable all four of them for either decoding - * or encoding and we can't split it in separate g1/h1 variants. - */ -const struct hantro_variant rk3066_vpu_variant = { - .enc_offset = 0x0, - .enc_fmts = rockchip_vpu_enc_fmts, - .num_enc_fmts = ARRAY_SIZE(rockchip_vpu_enc_fmts), - .dec_offset = 0x400, - .dec_fmts = rk3066_vpu_dec_fmts, - .num_dec_fmts = ARRAY_SIZE(rk3066_vpu_dec_fmts), - .postproc_fmts = rockchip_vpu1_postproc_fmts, - .num_postproc_fmts = ARRAY_SIZE(rockchip_vpu1_postproc_fmts), - .postproc_ops = &hantro_g1_postproc_ops, - .codec = HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER | - HANTRO_VP8_DECODER | HANTRO_H264_DECODER, - .codec_ops = rk3066_vpu_codec_ops, - .irqs = rockchip_vpu1_irqs, - .num_irqs = ARRAY_SIZE(rockchip_vpu1_irqs), - .init = rk3066_vpu_hw_init, - .clk_names = rk3066_vpu_clk_names, - .num_clocks = ARRAY_SIZE(rk3066_vpu_clk_names) -}; - -const struct hantro_variant rk3288_vpu_variant = { - .enc_offset = 0x0, - .enc_fmts = rockchip_vpu_enc_fmts, - .num_enc_fmts = ARRAY_SIZE(rockchip_vpu_enc_fmts), - .dec_offset = 0x400, - .dec_fmts = rk3288_vpu_dec_fmts, - .num_dec_fmts = ARRAY_SIZE(rk3288_vpu_dec_fmts), - .postproc_fmts = rockchip_vpu1_postproc_fmts, - .num_postproc_fmts = ARRAY_SIZE(rockchip_vpu1_postproc_fmts), - .postproc_ops = &hantro_g1_postproc_ops, - .codec = HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER | - HANTRO_VP8_DECODER | HANTRO_H264_DECODER, - .codec_ops = rk3288_vpu_codec_ops, - .irqs = rockchip_vpu1_irqs, - .num_irqs = ARRAY_SIZE(rockchip_vpu1_irqs), - .init = rockchip_vpu_hw_init, - .clk_names = rockchip_vpu_clk_names, - .num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names) -}; - -/* VDPU2/VEPU2 */ - -const struct hantro_variant rk3328_vpu_variant = { - .dec_offset = 0x400, - .dec_fmts = rockchip_vdpu2_dec_fmts, - .num_dec_fmts = ARRAY_SIZE(rockchip_vdpu2_dec_fmts), - .codec = HANTRO_MPEG2_DECODER | HANTRO_VP8_DECODER | - HANTRO_H264_DECODER, - .codec_ops = rk3399_vpu_codec_ops, - .irqs = rockchip_vdpu2_irqs, - .num_irqs = ARRAY_SIZE(rockchip_vdpu2_irqs), - .init = rockchip_vpu_hw_init, - .clk_names = rockchip_vpu_clk_names, - .num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names), -}; - -/* - * H.264 decoding explicitly disabled in RK3399. - * This ensures userspace applications use the Rockchip VDEC core, - * which has better performance. - */ -const struct hantro_variant rk3399_vpu_variant = { - .enc_offset = 0x0, - .enc_fmts = rockchip_vpu_enc_fmts, - .num_enc_fmts = ARRAY_SIZE(rockchip_vpu_enc_fmts), - .dec_offset = 0x400, - .dec_fmts = rk3399_vpu_dec_fmts, - .num_dec_fmts = ARRAY_SIZE(rk3399_vpu_dec_fmts), - .codec = HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER | - HANTRO_VP8_DECODER, - .codec_ops = rk3399_vpu_codec_ops, - .irqs = rockchip_vpu2_irqs, - .num_irqs = ARRAY_SIZE(rockchip_vpu2_irqs), - .init = rockchip_vpu_hw_init, - .clk_names = rockchip_vpu_clk_names, - .num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names) -}; - -const struct hantro_variant rk3568_vepu_variant = { - .enc_offset = 0x0, - .enc_fmts = rockchip_vpu_enc_fmts, - .num_enc_fmts = ARRAY_SIZE(rockchip_vpu_enc_fmts), - .codec = HANTRO_JPEG_ENCODER, - .codec_ops = rk3568_vepu_codec_ops, - .irqs = rk3568_vepu_irqs, - .num_irqs = ARRAY_SIZE(rk3568_vepu_irqs), - .init = rockchip_vpu_hw_init, - .clk_names = rockchip_vpu_clk_names, - .num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names) -}; - -const struct hantro_variant rk3568_vpu_variant = { - .dec_offset = 0x400, - .dec_fmts = rockchip_vdpu2_dec_fmts, - .num_dec_fmts = ARRAY_SIZE(rockchip_vdpu2_dec_fmts), - .codec = HANTRO_MPEG2_DECODER | - HANTRO_VP8_DECODER | HANTRO_H264_DECODER, - .codec_ops = rk3399_vpu_codec_ops, - .irqs = rockchip_vdpu2_irqs, - .num_irqs = ARRAY_SIZE(rockchip_vdpu2_irqs), - .init = rockchip_vpu_hw_init, - .clk_names = rockchip_vpu_clk_names, - .num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names) -}; - -const struct hantro_variant px30_vpu_variant = { - .enc_offset = 0x0, - .enc_fmts = rockchip_vpu_enc_fmts, - .num_enc_fmts = ARRAY_SIZE(rockchip_vpu_enc_fmts), - .dec_offset = 0x400, - .dec_fmts = rockchip_vdpu2_dec_fmts, - .num_dec_fmts = ARRAY_SIZE(rockchip_vdpu2_dec_fmts), - .codec = HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER | - HANTRO_VP8_DECODER | HANTRO_H264_DECODER, - .codec_ops = rk3399_vpu_codec_ops, - .irqs = rockchip_vpu2_irqs, - .num_irqs = ARRAY_SIZE(rockchip_vpu2_irqs), - .init = rk3036_vpu_hw_init, - .clk_names = rockchip_vpu_clk_names, - .num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names) -}; diff --git a/drivers/staging/media/hantro/sama5d4_vdec_hw.c b/drivers/staging/media/hantro/sama5d4_vdec_hw.c deleted file mode 100644 index b205e2db5b04..000000000000 --- a/drivers/staging/media/hantro/sama5d4_vdec_hw.c +++ /dev/null @@ -1,128 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Hantro VDEC driver - * - * Copyright (C) 2021 Collabora Ltd, Emil Velikov <emil.velikov@collabora.com> - */ - -#include "hantro.h" - -/* - * Supported formats. - */ - -static const struct hantro_fmt sama5d4_vdec_postproc_fmts[] = { - { - .fourcc = V4L2_PIX_FMT_YUYV, - .codec_mode = HANTRO_MODE_NONE, - .postprocessed = true, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_HD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_HD_HEIGHT, - .step_height = MB_DIM, - }, - }, -}; - -static const struct hantro_fmt sama5d4_vdec_fmts[] = { - { - .fourcc = V4L2_PIX_FMT_NV12, - .codec_mode = HANTRO_MODE_NONE, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_HD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_HD_HEIGHT, - .step_height = MB_DIM, - }, - }, - { - .fourcc = V4L2_PIX_FMT_MPEG2_SLICE, - .codec_mode = HANTRO_MODE_MPEG2_DEC, - .max_depth = 2, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_HD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_HD_HEIGHT, - .step_height = MB_DIM, - }, - }, - { - .fourcc = V4L2_PIX_FMT_VP8_FRAME, - .codec_mode = HANTRO_MODE_VP8_DEC, - .max_depth = 2, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_HD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_HD_HEIGHT, - .step_height = MB_DIM, - }, - }, - { - .fourcc = V4L2_PIX_FMT_H264_SLICE, - .codec_mode = HANTRO_MODE_H264_DEC, - .max_depth = 2, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_HD_WIDTH, - .step_width = MB_DIM, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_HD_HEIGHT, - .step_height = MB_DIM, - }, - }, -}; - -/* - * Supported codec ops. - */ - -static const struct hantro_codec_ops sama5d4_vdec_codec_ops[] = { - [HANTRO_MODE_MPEG2_DEC] = { - .run = hantro_g1_mpeg2_dec_run, - .reset = hantro_g1_reset, - .init = hantro_mpeg2_dec_init, - .exit = hantro_mpeg2_dec_exit, - }, - [HANTRO_MODE_VP8_DEC] = { - .run = hantro_g1_vp8_dec_run, - .reset = hantro_g1_reset, - .init = hantro_vp8_dec_init, - .exit = hantro_vp8_dec_exit, - }, - [HANTRO_MODE_H264_DEC] = { - .run = hantro_g1_h264_dec_run, - .reset = hantro_g1_reset, - .init = hantro_h264_dec_init, - .exit = hantro_h264_dec_exit, - }, -}; - -static const struct hantro_irq sama5d4_irqs[] = { - { "vdec", hantro_g1_irq }, -}; - -static const char * const sama5d4_clk_names[] = { "vdec_clk" }; - -const struct hantro_variant sama5d4_vdec_variant = { - .dec_fmts = sama5d4_vdec_fmts, - .num_dec_fmts = ARRAY_SIZE(sama5d4_vdec_fmts), - .postproc_fmts = sama5d4_vdec_postproc_fmts, - .num_postproc_fmts = ARRAY_SIZE(sama5d4_vdec_postproc_fmts), - .postproc_ops = &hantro_g1_postproc_ops, - .codec = HANTRO_MPEG2_DECODER | HANTRO_VP8_DECODER | - HANTRO_H264_DECODER, - .codec_ops = sama5d4_vdec_codec_ops, - .irqs = sama5d4_irqs, - .num_irqs = ARRAY_SIZE(sama5d4_irqs), - .clk_names = sama5d4_clk_names, - .num_clocks = ARRAY_SIZE(sama5d4_clk_names), -}; diff --git a/drivers/staging/media/hantro/sunxi_vpu_hw.c b/drivers/staging/media/hantro/sunxi_vpu_hw.c deleted file mode 100644 index 02ce8b064a8f..000000000000 --- a/drivers/staging/media/hantro/sunxi_vpu_hw.c +++ /dev/null @@ -1,129 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Allwinner Hantro G2 VPU codec driver - * - * Copyright (C) 2021 Jernej Skrabec <jernej.skrabec@gmail.com> - */ - -#include <linux/clk.h> - -#include "hantro.h" - -static const struct hantro_fmt sunxi_vpu_postproc_fmts[] = { - { - .fourcc = V4L2_PIX_FMT_NV12, - .codec_mode = HANTRO_MODE_NONE, - .postprocessed = true, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_UHD_WIDTH, - .step_width = 32, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_UHD_HEIGHT, - .step_height = 32, - }, - }, - { - .fourcc = V4L2_PIX_FMT_P010, - .codec_mode = HANTRO_MODE_NONE, - .postprocessed = true, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_UHD_WIDTH, - .step_width = 32, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_UHD_HEIGHT, - .step_height = 32, - }, - }, -}; - -static const struct hantro_fmt sunxi_vpu_dec_fmts[] = { - { - .fourcc = V4L2_PIX_FMT_NV12_4L4, - .codec_mode = HANTRO_MODE_NONE, - .match_depth = true, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_UHD_WIDTH, - .step_width = 32, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_UHD_HEIGHT, - .step_height = 32, - }, - }, - { - .fourcc = V4L2_PIX_FMT_P010_4L4, - .codec_mode = HANTRO_MODE_NONE, - .match_depth = true, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_UHD_WIDTH, - .step_width = 32, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_UHD_HEIGHT, - .step_height = 32, - }, - }, - { - .fourcc = V4L2_PIX_FMT_VP9_FRAME, - .codec_mode = HANTRO_MODE_VP9_DEC, - .max_depth = 2, - .frmsize = { - .min_width = FMT_MIN_WIDTH, - .max_width = FMT_UHD_WIDTH, - .step_width = 32, - .min_height = FMT_MIN_HEIGHT, - .max_height = FMT_UHD_HEIGHT, - .step_height = 32, - }, - }, -}; - -static int sunxi_vpu_hw_init(struct hantro_dev *vpu) -{ - clk_set_rate(vpu->clocks[0].clk, 300000000); - - return 0; -} - -static void sunxi_vpu_reset(struct hantro_ctx *ctx) -{ - struct hantro_dev *vpu = ctx->dev; - - reset_control_reset(vpu->resets); -} - -static const struct hantro_codec_ops sunxi_vpu_codec_ops[] = { - [HANTRO_MODE_VP9_DEC] = { - .run = hantro_g2_vp9_dec_run, - .done = hantro_g2_vp9_dec_done, - .reset = sunxi_vpu_reset, - .init = hantro_vp9_dec_init, - .exit = hantro_vp9_dec_exit, - }, -}; - -static const struct hantro_irq sunxi_irqs[] = { - { NULL, hantro_g2_irq }, -}; - -static const char * const sunxi_clk_names[] = { "mod", "bus" }; - -const struct hantro_variant sunxi_vpu_variant = { - .dec_fmts = sunxi_vpu_dec_fmts, - .num_dec_fmts = ARRAY_SIZE(sunxi_vpu_dec_fmts), - .postproc_fmts = sunxi_vpu_postproc_fmts, - .num_postproc_fmts = ARRAY_SIZE(sunxi_vpu_postproc_fmts), - .postproc_ops = &hantro_g2_postproc_ops, - .codec = HANTRO_VP9_DECODER, - .codec_ops = sunxi_vpu_codec_ops, - .init = sunxi_vpu_hw_init, - .irqs = sunxi_irqs, - .num_irqs = ARRAY_SIZE(sunxi_irqs), - .clk_names = sunxi_clk_names, - .num_clocks = ARRAY_SIZE(sunxi_clk_names), - .double_buffer = 1, - .legacy_regs = 1, - .late_postproc = 1, -}; |