s5p_mfc_opr_v5.c revision 3c75a2e1cfcabe01e5914a92e949188720918933
1d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech/* 2d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech * drivers/media/platform/samsung/mfc5/s5p_mfc_opr_v5.c 3d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech * 4d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech * Samsung MFC (Multi Function Codec - FIMV) driver 5d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech * This file contains hw related functions. 6d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech * 7d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech * Kamil Debski, Copyright (c) 2011 Samsung Electronics 8d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech * http://www.samsung.com/ 9d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech * 10d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech * This program is free software; you can redistribute it and/or modify 11d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech * it under the terms of the GNU General Public License version 2 as 12d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech * published by the Free Software Foundation. 13d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech */ 14d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 15d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech#include "s5p_mfc_common.h" 16d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech#include "s5p_mfc_cmd.h" 17d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech#include "s5p_mfc_ctrl.h" 18d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech#include "s5p_mfc_debug.h" 19d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech#include "s5p_mfc_intr.h" 20d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech#include "s5p_mfc_pm.h" 21d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech#include "s5p_mfc_opr.h" 22d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech#include "s5p_mfc_opr_v5.h" 23d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech#include <asm/cacheflush.h> 24d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech#include <linux/delay.h> 25d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech#include <linux/dma-mapping.h> 26d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech#include <linux/err.h> 27d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech#include <linux/firmware.h> 28d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech#include <linux/io.h> 29d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech#include <linux/jiffies.h> 30d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech#include <linux/mm.h> 31d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech#include <linux/sched.h> 32d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 33d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech#define OFFSETA(x) (((x) - dev->bank1) >> MFC_OFFSET_SHIFT) 34d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech#define OFFSETB(x) (((x) - dev->bank2) >> MFC_OFFSET_SHIFT) 35d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 36d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech/* Allocate temporary buffers for decoding */ 37d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olechstatic int s5p_mfc_alloc_dec_temp_buffers_v5(struct s5p_mfc_ctx *ctx) 38d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech{ 39d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech struct s5p_mfc_dev *dev = ctx->dev; 40d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech struct s5p_mfc_buf_size_v5 *buf_size = dev->variant->buf_size->priv; 41d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech int ret; 42d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 434b87361d49c04894458f4d4e80f9669abc894ae1Tony Olech ctx->dsc.size = buf_size->dsc; 44d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ret = s5p_mfc_alloc_priv_buf(dev->mem_dev_l, &ctx->dsc); 45d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech if (ret) { 46d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_err("Failed to allocate temporary buffer\n"); 47d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech return ret; 48d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech } 49d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 50d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech BUG_ON(ctx->dsc.dma & ((1 << MFC_BANK1_ALIGN_ORDER) - 1)); 51d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech memset(ctx->dsc.virt, 0, ctx->dsc.size); 5227729aadd31dafddaaf64c24f8ef6d0ff750f3aaEric Lescouet wmb(); 53d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech return 0; 54d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech} 55d2066eb659e6ee915383510c136da38eff86ef15Matthias Kaehlcke 56d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 57d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech/* Release temporary buffers for decoding */ 58d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olechstatic void s5p_mfc_release_dec_desc_buffer_v5(struct s5p_mfc_ctx *ctx) 5947f8468e6008a1d62f7dacbcff4ec3e115a500c8David Brownell{ 6047f8468e6008a1d62f7dacbcff4ec3e115a500c8David Brownell s5p_mfc_release_priv_buf(ctx->dev->mem_dev_l, &ctx->dsc); 6147f8468e6008a1d62f7dacbcff4ec3e115a500c8David Brownell} 6247f8468e6008a1d62f7dacbcff4ec3e115a500c8David Brownell 6347f8468e6008a1d62f7dacbcff4ec3e115a500c8David Brownell/* Allocate codec buffers */ 6447f8468e6008a1d62f7dacbcff4ec3e115a500c8David Brownellstatic int s5p_mfc_alloc_codec_buffers_v5(struct s5p_mfc_ctx *ctx) 6547f8468e6008a1d62f7dacbcff4ec3e115a500c8David Brownell{ 66d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech struct s5p_mfc_dev *dev = ctx->dev; 67d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech unsigned int enc_ref_y_size = 0; 68d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech unsigned int enc_ref_c_size = 0; 69b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker unsigned int guard_width, guard_height; 70d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech int ret; 71d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 72d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech if (ctx->type == MFCINST_DECODER) { 73d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_debug(2, "Luma size:%d Chroma size:%d MV size:%d\n", 74d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ctx->luma_size, ctx->chroma_size, ctx->mv_size); 75d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_debug(2, "Totals bufs: %d\n", ctx->total_dpb_count); 7690ab5ee94171b3e28de6bb42ee30b527014e0be7Rusty Russell } else if (ctx->type == MFCINST_ENCODER) { 77d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech enc_ref_y_size = ALIGN(ctx->img_width, S5P_FIMV_NV12MT_HALIGN) 78d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech * ALIGN(ctx->img_height, S5P_FIMV_NV12MT_VALIGN); 79b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker enc_ref_y_size = ALIGN(enc_ref_y_size, S5P_FIMV_NV12MT_SALIGN); 8027a3de4cfc3508b30803b7350ca6385b3c53f223Adrian Bunk 81d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech if (ctx->codec_mode == S5P_MFC_CODEC_H264_ENC) { 82d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech enc_ref_c_size = ALIGN(ctx->img_width, 83d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_NV12MT_HALIGN) 84d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech * ALIGN(ctx->img_height >> 1, 85d2066eb659e6ee915383510c136da38eff86ef15Matthias Kaehlcke S5P_FIMV_NV12MT_VALIGN); 86b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker enc_ref_c_size = ALIGN(enc_ref_c_size, 87b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_NV12MT_SALIGN); 88d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech } else { 89d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech guard_width = ALIGN(ctx->img_width + 16, 90d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_NV12MT_HALIGN); 91d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech guard_height = ALIGN((ctx->img_height >> 1) + 4, 92d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_NV12MT_VALIGN); 93d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech enc_ref_c_size = ALIGN(guard_width * guard_height, 94d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_NV12MT_SALIGN); 95d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech } 96d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_debug(2, "recon luma size: %d chroma size: %d\n", 97d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech enc_ref_y_size, enc_ref_c_size); 98d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech } else { 99b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return -EINVAL; 100b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 101b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* Codecs have different memory requirements */ 102b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker switch (ctx->codec_mode) { 103b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_MFC_CODEC_H264_DEC: 104b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->bank1.size = 105b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ALIGN(S5P_FIMV_DEC_NB_IP_SIZE + 106b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_DEC_VERT_NB_MV_SIZE, 107b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_DEC_BUF_ALIGN); 108b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->bank2.size = ctx->total_dpb_count * ctx->mv_size; 109b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 110b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_MFC_CODEC_MPEG4_DEC: 111b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->bank1.size = 112b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ALIGN(S5P_FIMV_DEC_NB_DCAC_SIZE + 113b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_DEC_UPNB_MV_SIZE + 114b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_DEC_SUB_ANCHOR_MV_SIZE + 115d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_DEC_STX_PARSER_SIZE + 116d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_DEC_OVERLAP_TRANSFORM_SIZE, 117b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_DEC_BUF_ALIGN); 118b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->bank2.size = 0; 119b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 120b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_MFC_CODEC_VC1RCV_DEC: 121b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_MFC_CODEC_VC1_DEC: 122d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ctx->bank1.size = 123d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ALIGN(S5P_FIMV_DEC_OVERLAP_TRANSFORM_SIZE + 124b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_DEC_UPNB_MV_SIZE + 125d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_DEC_SUB_ANCHOR_MV_SIZE + 126d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_DEC_NB_DCAC_SIZE + 127b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 3 * S5P_FIMV_DEC_VC1_BITPLANE_SIZE, 128b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_DEC_BUF_ALIGN); 129b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->bank2.size = 0; 130b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 131b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_MFC_CODEC_MPEG2_DEC: 132b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->bank1.size = 0; 133b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->bank2.size = 0; 134b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 135d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech case S5P_MFC_CODEC_H263_DEC: 136d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ctx->bank1.size = 137d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ALIGN(S5P_FIMV_DEC_OVERLAP_TRANSFORM_SIZE + 138d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_DEC_UPNB_MV_SIZE + 139d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_DEC_SUB_ANCHOR_MV_SIZE + 140b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_DEC_NB_DCAC_SIZE, 141b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_DEC_BUF_ALIGN); 142d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ctx->bank2.size = 0; 143d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech break; 144b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_MFC_CODEC_H264_ENC: 145d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ctx->bank1.size = (enc_ref_y_size * 2) + 146d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_ENC_UPMV_SIZE + 147b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_ENC_COLFLG_SIZE + 148b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_ENC_INTRAMD_SIZE + 149b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_ENC_NBORINFO_SIZE; 150b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->bank2.size = (enc_ref_y_size * 2) + 151b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker (enc_ref_c_size * 4) + 152b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_ENC_INTRAPRED_SIZE; 153b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 154b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_MFC_CODEC_MPEG4_ENC: 155b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->bank1.size = (enc_ref_y_size * 2) + 156b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_ENC_UPMV_SIZE + 157b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_ENC_COLFLG_SIZE + 158b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_ENC_ACDCCOEF_SIZE; 159b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->bank2.size = (enc_ref_y_size * 2) + 160b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker (enc_ref_c_size * 4); 161b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 162b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_MFC_CODEC_H263_ENC: 163b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->bank1.size = (enc_ref_y_size * 2) + 164b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_ENC_UPMV_SIZE + 165b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_ENC_ACDCCOEF_SIZE; 166b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->bank2.size = (enc_ref_y_size * 2) + 167b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker (enc_ref_c_size * 4); 168b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 169b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker default: 170b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 171b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 172b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* Allocate only if memory from bank 1 is necessary */ 173d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech if (ctx->bank1.size > 0) { 174d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 175b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ret = s5p_mfc_alloc_priv_buf(dev->mem_dev_l, &ctx->bank1); 176b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (ret) { 177b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_err("Failed to allocate Bank1 temporary buffer\n"); 178b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return ret; 179b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 180b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker BUG_ON(ctx->bank1.dma & ((1 << MFC_BANK1_ALIGN_ORDER) - 1)); 181d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech } 182d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech /* Allocate only if memory from bank 2 is necessary */ 183b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (ctx->bank2.size > 0) { 184b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ret = s5p_mfc_alloc_priv_buf(dev->mem_dev_r, &ctx->bank2); 185b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (ret) { 18650d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker mfc_err("Failed to allocate Bank2 temporary buffer\n"); 187b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_release_priv_buf(ctx->dev->mem_dev_l, &ctx->bank1); 188b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return ret; 189b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 190b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker BUG_ON(ctx->bank2.dma & ((1 << MFC_BANK2_ALIGN_ORDER) - 1)); 191b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 192b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return 0; 193b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 194b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 195b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker/* Release buffers allocated for codec */ 196b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic void s5p_mfc_release_codec_buffers_v5(struct s5p_mfc_ctx *ctx) 197b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 198b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_release_priv_buf(ctx->dev->mem_dev_l, &ctx->bank1); 199b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_release_priv_buf(ctx->dev->mem_dev_r, &ctx->bank2); 200b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 201b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 202b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker/* Allocate memory for instance data buffer */ 203b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_alloc_instance_buffer_v5(struct s5p_mfc_ctx *ctx) 204b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 205b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_dev *dev = ctx->dev; 206b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_buf_size_v5 *buf_size = dev->variant->buf_size->priv; 207b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker int ret; 208d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 2099ce8540c884c19c0f5f38c9e85d4bdc192baf321Adrian Bunk if (ctx->codec_mode == S5P_MFC_CODEC_H264_DEC || 210d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ctx->codec_mode == S5P_MFC_CODEC_H264_ENC) 2110779bf2d2ecc4d9b1e9437ae659f50e6776a7666Matt LaPlante ctx->ctx.size = buf_size->h264_ctx; 212d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech else 213d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ctx->ctx.size = buf_size->non_h264_ctx; 2144b87361d49c04894458f4d4e80f9669abc894ae1Tony Olech 215b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ret = s5p_mfc_alloc_priv_buf(dev->mem_dev_l, &ctx->ctx); 2164b87361d49c04894458f4d4e80f9669abc894ae1Tony Olech if (ret) { 217b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_err("Failed to allocate instance buffer\n"); 218d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech return ret; 219b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 220b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->ctx.ofs = OFFSETA(ctx->ctx.dma); 221d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 222b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* Zero content of the allocated memory */ 223b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker memset(ctx->ctx.virt, 0, ctx->ctx.size); 224d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech wmb(); 225d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 226b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* Initialize shared memory */ 227b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->shm.size = buf_size->shm; 228d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ret = s5p_mfc_alloc_priv_buf(dev->mem_dev_l, &ctx->shm); 229d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech if (ret) { 230d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_err("Failed to allocate shared memory buffer\n"); 231d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech return ret; 232b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 233d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 234d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech /* shared memory offset only keeps the offset from base (port a) */ 235d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ctx->shm.ofs = ctx->shm.dma - dev->bank1; 236d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech BUG_ON(ctx->shm.ofs & ((1 << MFC_BANK1_ALIGN_ORDER) - 1)); 237b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 238d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech memset(ctx->shm.virt, 0, buf_size->shm); 239d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech wmb(); 240d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech return 0; 241d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech} 242b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 243d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech/* Release instance buffer */ 244d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olechstatic void s5p_mfc_release_instance_buffer_v5(struct s5p_mfc_ctx *ctx) 245d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech{ 246d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech s5p_mfc_release_priv_buf(ctx->dev->mem_dev_l, &ctx->ctx); 247d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech s5p_mfc_release_priv_buf(ctx->dev->mem_dev_l, &ctx->shm); 248d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech} 249d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 250d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olechstatic int s5p_mfc_alloc_dev_context_buffer_v5(struct s5p_mfc_dev *dev) 251d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech{ 252b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* NOP */ 253b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 254d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech return 0; 255d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech} 256b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 257b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic void s5p_mfc_release_dev_context_buffer_v5(struct s5p_mfc_dev *dev) 258b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 259b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* NOP */ 260b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 261b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 262b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic void s5p_mfc_write_info_v5(struct s5p_mfc_ctx *ctx, unsigned int data, 263b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker unsigned int ofs) 264b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 265b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker writel(data, (ctx->shm.virt + ofs)); 266b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker wmb(); 267d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech} 268d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 269d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olechstatic unsigned int s5p_mfc_read_info_v5(struct s5p_mfc_ctx *ctx, 270d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech unsigned int ofs) 271b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 272d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech rmb(); 273d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech return readl(ctx->shm.virt + ofs); 274d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech} 275d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 276b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic void s5p_mfc_dec_calc_dpb_size_v5(struct s5p_mfc_ctx *ctx) 277d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech{ 278d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech unsigned int guard_width, guard_height; 279d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 280d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ctx->buf_width = ALIGN(ctx->img_width, S5P_FIMV_NV12MT_HALIGN); 281b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->buf_height = ALIGN(ctx->img_height, S5P_FIMV_NV12MT_VALIGN); 282b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_debug(2, 283b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker "SEQ Done: Movie dimensions %dx%d, buffer dimensions: %dx%d\n", 284b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->img_width, ctx->img_height, ctx->buf_width, 285b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->buf_height); 286d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 287d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech if (ctx->codec_mode == S5P_MFC_CODEC_H264_DEC) { 288d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ctx->luma_size = ALIGN(ctx->buf_width * ctx->buf_height, 289d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_DEC_BUF_ALIGN); 290b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->chroma_size = ALIGN(ctx->buf_width * 291d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ALIGN((ctx->img_height >> 1), 292d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_NV12MT_VALIGN), 293d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_DEC_BUF_ALIGN); 294d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ctx->mv_size = ALIGN(ctx->buf_width * 295b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ALIGN((ctx->buf_height >> 2), 296d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_NV12MT_VALIGN), 297d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_DEC_BUF_ALIGN); 298d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech } else { 299b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker guard_width = 300d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ALIGN(ctx->img_width + 24, S5P_FIMV_NV12MT_HALIGN); 301b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker guard_height = 302d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ALIGN(ctx->img_height + 16, S5P_FIMV_NV12MT_VALIGN); 303d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ctx->luma_size = ALIGN(guard_width * guard_height, 304d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_DEC_BUF_ALIGN); 305d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 306b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker guard_width = 307d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ALIGN(ctx->img_width + 16, S5P_FIMV_NV12MT_HALIGN); 308d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech guard_height = 309d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ALIGN((ctx->img_height >> 1) + 4, 310b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_NV12MT_VALIGN); 311d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ctx->chroma_size = ALIGN(guard_width * guard_height, 312b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_DEC_BUF_ALIGN); 313b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 314b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->mv_size = 0; 315b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 316b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 317b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 318d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olechstatic void s5p_mfc_enc_calc_src_size_v5(struct s5p_mfc_ctx *ctx) 319d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech{ 320d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech if (ctx->src_fmt->fourcc == V4L2_PIX_FMT_NV12M) { 321b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->buf_width = ALIGN(ctx->img_width, S5P_FIMV_NV12M_HALIGN); 322d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 323b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->luma_size = ALIGN(ctx->img_width, S5P_FIMV_NV12M_HALIGN) 324b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker * ALIGN(ctx->img_height, S5P_FIMV_NV12M_LVALIGN); 325d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ctx->chroma_size = ALIGN(ctx->img_width, S5P_FIMV_NV12M_HALIGN) 326d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech * ALIGN((ctx->img_height >> 1), S5P_FIMV_NV12M_CVALIGN); 327d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 328d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ctx->luma_size = ALIGN(ctx->luma_size, S5P_FIMV_NV12M_SALIGN); 329b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->chroma_size = 330b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ALIGN(ctx->chroma_size, S5P_FIMV_NV12M_SALIGN); 331d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech } else if (ctx->src_fmt->fourcc == V4L2_PIX_FMT_NV12MT) { 332d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ctx->buf_width = ALIGN(ctx->img_width, S5P_FIMV_NV12MT_HALIGN); 333d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 334d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ctx->luma_size = ALIGN(ctx->img_width, S5P_FIMV_NV12MT_HALIGN) 335b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker * ALIGN(ctx->img_height, S5P_FIMV_NV12MT_VALIGN); 336b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->chroma_size = 337b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ALIGN(ctx->img_width, S5P_FIMV_NV12MT_HALIGN) 338b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker * ALIGN((ctx->img_height >> 1), S5P_FIMV_NV12MT_VALIGN); 339b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 340b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->luma_size = ALIGN(ctx->luma_size, S5P_FIMV_NV12MT_SALIGN); 341b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->chroma_size = 342b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ALIGN(ctx->chroma_size, S5P_FIMV_NV12MT_SALIGN); 343b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 344b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 345b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 346b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker/* Set registers for decoding temporary buffers */ 347b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic void s5p_mfc_set_dec_desc_buffer(struct s5p_mfc_ctx *ctx) 348b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 349b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_dev *dev = ctx->dev; 350b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_buf_size_v5 *buf_size = dev->variant->buf_size->priv; 351b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 352b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(ctx->dsc.dma), S5P_FIMV_SI_CH0_DESC_ADR); 353b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, buf_size->dsc, S5P_FIMV_SI_CH0_DESC_SIZE); 354b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 355b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 356b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker/* Set registers for shared buffer */ 357b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic void s5p_mfc_set_shared_buffer(struct s5p_mfc_ctx *ctx) 358b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 359b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_dev *dev = ctx->dev; 360b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, ctx->shm.ofs, S5P_FIMV_SI_CH0_HOST_WR_ADR); 361b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 362b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 363b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker/* Set registers for decoding stream buffer */ 364b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_set_dec_stream_buffer_v5(struct s5p_mfc_ctx *ctx, 365b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker int buf_addr, unsigned int start_num_byte, 366b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker unsigned int buf_size) 367b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 368b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_dev *dev = ctx->dev; 369b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 370d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_write(dev, OFFSETA(buf_addr), S5P_FIMV_SI_CH0_SB_ST_ADR); 371d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_write(dev, ctx->dec_src_buf_size, S5P_FIMV_SI_CH0_CPB_SIZE); 372d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_write(dev, buf_size, S5P_FIMV_SI_CH0_SB_FRM_SIZE); 373d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech s5p_mfc_write_info_v5(ctx, start_num_byte, START_BYTE_NUM); 374b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return 0; 375d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech} 376d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 377d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech/* Set decoding frame buffer */ 378d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olechstatic int s5p_mfc_set_dec_frame_buffer_v5(struct s5p_mfc_ctx *ctx) 379b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 380d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech unsigned int frame_size, i; 381d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech unsigned int frame_size_ch, frame_size_mv; 382d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech struct s5p_mfc_dev *dev = ctx->dev; 383b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker unsigned int dpb; 384d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech size_t buf_addr1, buf_addr2; 385b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker int buf_size1, buf_size2; 386b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 387d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_addr1 = ctx->bank1.dma; 388d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_size1 = ctx->bank1.size; 389d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_addr2 = ctx->bank2.dma; 390b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size2 = ctx->bank2.size; 391d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech dpb = mfc_read(dev, S5P_FIMV_SI_CH0_DPB_CONF_CTRL) & 392c4028958b6ecad064b1a6303a6a5906d4fe48d73David Howells ~S5P_FIMV_DPB_COUNT_MASK; 393c4028958b6ecad064b1a6303a6a5906d4fe48d73David Howells mfc_write(dev, ctx->total_dpb_count | dpb, 394d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_SI_CH0_DPB_CONF_CTRL); 395d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech s5p_mfc_set_shared_buffer(ctx); 396d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech switch (ctx->codec_mode) { 397d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech case S5P_MFC_CODEC_H264_DEC: 398b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(buf_addr1), 399b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_H264_VERT_NB_MV_ADR); 400d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_addr1 += S5P_FIMV_DEC_VERT_NB_MV_SIZE; 401d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_size1 -= S5P_FIMV_DEC_VERT_NB_MV_SIZE; 402d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_H264_NB_IP_ADR); 403d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_addr1 += S5P_FIMV_DEC_NB_IP_SIZE; 404b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1 -= S5P_FIMV_DEC_NB_IP_SIZE; 405d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech break; 406d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech case S5P_MFC_CODEC_MPEG4_DEC: 407d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_MPEG4_NB_DCAC_ADR); 408d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_addr1 += S5P_FIMV_DEC_NB_DCAC_SIZE; 409c4028958b6ecad064b1a6303a6a5906d4fe48d73David Howells buf_size1 -= S5P_FIMV_DEC_NB_DCAC_SIZE; 410c4028958b6ecad064b1a6303a6a5906d4fe48d73David Howells mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_MPEG4_UP_NB_MV_ADR); 411d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_addr1 += S5P_FIMV_DEC_UPNB_MV_SIZE; 412d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_size1 -= S5P_FIMV_DEC_UPNB_MV_SIZE; 413d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_MPEG4_SA_MV_ADR); 414d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_addr1 += S5P_FIMV_DEC_SUB_ANCHOR_MV_SIZE; 415c4028958b6ecad064b1a6303a6a5906d4fe48d73David Howells buf_size1 -= S5P_FIMV_DEC_SUB_ANCHOR_MV_SIZE; 416c4028958b6ecad064b1a6303a6a5906d4fe48d73David Howells mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_MPEG4_SP_ADR); 417d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_addr1 += S5P_FIMV_DEC_STX_PARSER_SIZE; 418d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_size1 -= S5P_FIMV_DEC_STX_PARSER_SIZE; 419d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_MPEG4_OT_LINE_ADR); 420d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_addr1 += S5P_FIMV_DEC_OVERLAP_TRANSFORM_SIZE; 421b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1 -= S5P_FIMV_DEC_OVERLAP_TRANSFORM_SIZE; 422b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 423d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech case S5P_MFC_CODEC_H263_DEC: 424d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_H263_OT_LINE_ADR); 425d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_addr1 += S5P_FIMV_DEC_OVERLAP_TRANSFORM_SIZE; 426d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_size1 -= S5P_FIMV_DEC_OVERLAP_TRANSFORM_SIZE; 427b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_H263_UP_NB_MV_ADR); 428b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr1 += S5P_FIMV_DEC_UPNB_MV_SIZE; 429b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1 -= S5P_FIMV_DEC_UPNB_MV_SIZE; 430b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_H263_SA_MV_ADR); 431b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr1 += S5P_FIMV_DEC_SUB_ANCHOR_MV_SIZE; 432b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1 -= S5P_FIMV_DEC_SUB_ANCHOR_MV_SIZE; 433b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_H263_NB_DCAC_ADR); 434b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr1 += S5P_FIMV_DEC_NB_DCAC_SIZE; 435b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1 -= S5P_FIMV_DEC_NB_DCAC_SIZE; 436b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 437b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_MFC_CODEC_VC1_DEC: 438b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_MFC_CODEC_VC1RCV_DEC: 439b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_VC1_NB_DCAC_ADR); 440b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr1 += S5P_FIMV_DEC_NB_DCAC_SIZE; 441b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1 -= S5P_FIMV_DEC_NB_DCAC_SIZE; 442b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_VC1_OT_LINE_ADR); 443b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr1 += S5P_FIMV_DEC_OVERLAP_TRANSFORM_SIZE; 444b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1 -= S5P_FIMV_DEC_OVERLAP_TRANSFORM_SIZE; 445b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_VC1_UP_NB_MV_ADR); 446b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr1 += S5P_FIMV_DEC_UPNB_MV_SIZE; 447b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1 -= S5P_FIMV_DEC_UPNB_MV_SIZE; 448b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_VC1_SA_MV_ADR); 449b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr1 += S5P_FIMV_DEC_SUB_ANCHOR_MV_SIZE; 450b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1 -= S5P_FIMV_DEC_SUB_ANCHOR_MV_SIZE; 451b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_VC1_BITPLANE3_ADR); 452b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr1 += S5P_FIMV_DEC_VC1_BITPLANE_SIZE; 453b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1 -= S5P_FIMV_DEC_VC1_BITPLANE_SIZE; 454b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_VC1_BITPLANE2_ADR); 455b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr1 += S5P_FIMV_DEC_VC1_BITPLANE_SIZE; 456b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1 -= S5P_FIMV_DEC_VC1_BITPLANE_SIZE; 457b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_VC1_BITPLANE1_ADR); 458b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr1 += S5P_FIMV_DEC_VC1_BITPLANE_SIZE; 459b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1 -= S5P_FIMV_DEC_VC1_BITPLANE_SIZE; 460b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 461b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_MFC_CODEC_MPEG2_DEC: 462b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 463b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker default: 464b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_err("Unknown codec for decoding (%x)\n", 465b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->codec_mode); 466b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return -EINVAL; 467b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 468b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker frame_size = ctx->luma_size; 469b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker frame_size_ch = ctx->chroma_size; 470b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker frame_size_mv = ctx->mv_size; 471b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_debug(2, "Frm size: %d ch: %d mv: %d\n", frame_size, frame_size_ch, 472b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker frame_size_mv); 473b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker for (i = 0; i < ctx->total_dpb_count; i++) { 474b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* Bank2 */ 475b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_debug(2, "Luma %d: %x\n", i, 476d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech ctx->dst_bufs[i].cookie.raw.luma); 477d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_write(dev, OFFSETB(ctx->dst_bufs[i].cookie.raw.luma), 478c4028958b6ecad064b1a6303a6a5906d4fe48d73David Howells S5P_FIMV_DEC_LUMA_ADR + i * 4); 479d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_debug(2, "\tChroma %d: %x\n", i, 480b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->dst_bufs[i].cookie.raw.chroma); 481b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(ctx->dst_bufs[i].cookie.raw.chroma), 482b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_DEC_CHROMA_ADR + i * 4); 483b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (ctx->codec_mode == S5P_MFC_CODEC_H264_DEC) { 484b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_debug(2, "\tBuf2: %x, size: %d\n", 485b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr2, buf_size2); 486b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETB(buf_addr2), 487b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_H264_MV_ADR + i * 4); 488b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr2 += frame_size_mv; 489b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size2 -= frame_size_mv; 490b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 491b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 492b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_debug(2, "Buf1: %u, buf_size1: %d\n", buf_addr1, buf_size1); 493b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_debug(2, "Buf 1/2 size after: %d/%d (frames %d)\n", 494b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1, buf_size2, ctx->total_dpb_count); 495b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (buf_size1 < 0 || buf_size2 < 0) { 496b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_debug(2, "Not enough memory has been allocated\n"); 497b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return -ENOMEM; 498b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 499b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_write_info_v5(ctx, frame_size, ALLOC_LUMA_DPB_SIZE); 500b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_write_info_v5(ctx, frame_size_ch, ALLOC_CHROMA_DPB_SIZE); 501b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (ctx->codec_mode == S5P_MFC_CODEC_H264_DEC) 502b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_write_info_v5(ctx, frame_size_mv, ALLOC_MV_SIZE); 503b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, ((S5P_FIMV_CH_INIT_BUFS & S5P_FIMV_CH_MASK) 504b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker << S5P_FIMV_CH_SHIFT) | (ctx->inst_no), 505b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_SI_CH0_INST_ID); 506b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return 0; 507b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 508b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 509d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech/* Set registers for encoding stream buffer */ 510d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olechstatic int s5p_mfc_set_enc_stream_buffer_v5(struct s5p_mfc_ctx *ctx, 511d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech unsigned long addr, unsigned int size) 512b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 513d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech struct s5p_mfc_dev *dev = ctx->dev; 514b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 515b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(addr), S5P_FIMV_ENC_SI_CH0_SB_ADR); 516b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, size, S5P_FIMV_ENC_SI_CH0_SB_SIZE); 517b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return 0; 518b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 519e9df41c5c5899259541dc928872cad4d07b82076Alan Stern 520b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic void s5p_mfc_set_enc_frame_buffer_v5(struct s5p_mfc_ctx *ctx, 521b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker unsigned long y_addr, unsigned long c_addr) 522b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 523b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_dev *dev = ctx->dev; 524b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 525b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETB(y_addr), S5P_FIMV_ENC_SI_CH0_CUR_Y_ADR); 526b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETB(c_addr), S5P_FIMV_ENC_SI_CH0_CUR_C_ADR); 527b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 528b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 529b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic void s5p_mfc_get_enc_frame_buffer_v5(struct s5p_mfc_ctx *ctx, 530b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker unsigned long *y_addr, unsigned long *c_addr) 531b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 532b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_dev *dev = ctx->dev; 533b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 534b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker *y_addr = dev->bank2 + (mfc_read(dev, S5P_FIMV_ENCODED_Y_ADDR) 53550d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker << MFC_OFFSET_SHIFT); 536b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker *c_addr = dev->bank2 + (mfc_read(dev, S5P_FIMV_ENCODED_C_ADDR) 537b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker << MFC_OFFSET_SHIFT); 538b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 539b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 54050d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker/* Set encoding ref & codec buffer */ 541b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_set_enc_ref_buffer_v5(struct s5p_mfc_ctx *ctx) 5424a00027dcb088bf90fa8fb14a7e8ba3506d78f22Alan Stern{ 543d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech struct s5p_mfc_dev *dev = ctx->dev; 544d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech size_t buf_addr1, buf_addr2; 545d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech size_t buf_size1, buf_size2; 546b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker unsigned int enc_ref_y_size, enc_ref_c_size; 547d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech unsigned int guard_width, guard_height; 548b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker int i; 549d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 550d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_addr1 = ctx->bank1.dma; 551d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_size1 = ctx->bank1.size; 552b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr2 = ctx->bank2.dma; 553d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_size2 = ctx->bank2.size; 554b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker enc_ref_y_size = ALIGN(ctx->img_width, S5P_FIMV_NV12MT_HALIGN) 555b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker * ALIGN(ctx->img_height, S5P_FIMV_NV12MT_VALIGN); 556b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker enc_ref_y_size = ALIGN(enc_ref_y_size, S5P_FIMV_NV12MT_SALIGN); 557b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (ctx->codec_mode == S5P_MFC_CODEC_H264_ENC) { 558e9df41c5c5899259541dc928872cad4d07b82076Alan Stern enc_ref_c_size = ALIGN(ctx->img_width, S5P_FIMV_NV12MT_HALIGN) 559b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker * ALIGN((ctx->img_height >> 1), S5P_FIMV_NV12MT_VALIGN); 560b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker enc_ref_c_size = ALIGN(enc_ref_c_size, S5P_FIMV_NV12MT_SALIGN); 561b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } else { 562b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker guard_width = ALIGN(ctx->img_width + 16, 563b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_NV12MT_HALIGN); 564b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker guard_height = ALIGN((ctx->img_height >> 1) + 4, 565b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_NV12MT_VALIGN); 566b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker enc_ref_c_size = ALIGN(guard_width * guard_height, 567b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_NV12MT_SALIGN); 568b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 569b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_debug(2, "buf_size1: %d, buf_size2: %d\n", buf_size1, buf_size2); 570b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker switch (ctx->codec_mode) { 571b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_MFC_CODEC_H264_ENC: 572b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker for (i = 0; i < 2; i++) { 5737f26b3a7533bbc1ddd88b297c935ee4da8f74ceaJoe Perches mfc_write(dev, OFFSETA(buf_addr1), 5747f26b3a7533bbc1ddd88b297c935ee4da8f74ceaJoe Perches S5P_FIMV_ENC_REF0_LUMA_ADR + (4 * i)); 575d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_addr1 += enc_ref_y_size; 576d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_size1 -= enc_ref_y_size; 577d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 578b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETB(buf_addr2), 579b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_ENC_REF2_LUMA_ADR + (4 * i)); 580b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr2 += enc_ref_y_size; 581b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size2 -= enc_ref_y_size; 582d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech } 583b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker for (i = 0; i < 4; i++) { 584b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETB(buf_addr2), 585d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_ENC_REF0_CHROMA_ADR + (4 * i)); 586d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_addr2 += enc_ref_c_size; 587d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_size2 -= enc_ref_c_size; 588b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 589b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_H264_UP_MV_ADR); 590b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr1 += S5P_FIMV_ENC_UPMV_SIZE; 591b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1 -= S5P_FIMV_ENC_UPMV_SIZE; 592d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_write(dev, OFFSETA(buf_addr1), 593b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_H264_COZERO_FLAG_ADR); 594b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr1 += S5P_FIMV_ENC_COLFLG_SIZE; 595d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_size1 -= S5P_FIMV_ENC_COLFLG_SIZE; 596d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_write(dev, OFFSETA(buf_addr1), 597d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_H264_UP_INTRA_MD_ADR); 598b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr1 += S5P_FIMV_ENC_INTRAMD_SIZE; 599b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1 -= S5P_FIMV_ENC_INTRAMD_SIZE; 600b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETB(buf_addr2), 601b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_H264_UP_INTRA_PRED_ADR); 602d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_addr2 += S5P_FIMV_ENC_INTRAPRED_SIZE; 603b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size2 -= S5P_FIMV_ENC_INTRAPRED_SIZE; 604b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(buf_addr1), 605d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_H264_NBOR_INFO_ADR); 606d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_addr1 += S5P_FIMV_ENC_NBORINFO_SIZE; 607d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_size1 -= S5P_FIMV_ENC_NBORINFO_SIZE; 608b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_debug(2, "buf_size1: %d, buf_size2: %d\n", 609b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1, buf_size2); 610b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 611b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_MFC_CODEC_MPEG4_ENC: 612d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech for (i = 0; i < 2; i++) { 613b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(buf_addr1), 614b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_ENC_REF0_LUMA_ADR + (4 * i)); 615d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_addr1 += enc_ref_y_size; 616d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_size1 -= enc_ref_y_size; 617d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_write(dev, OFFSETB(buf_addr2), 618d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_ENC_REF2_LUMA_ADR + (4 * i)); 619d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_addr2 += enc_ref_y_size; 620d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech buf_size2 -= enc_ref_y_size; 621d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech } 622d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech for (i = 0; i < 4; i++) { 623b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETB(buf_addr2), 624b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_ENC_REF0_CHROMA_ADR + (4 * i)); 625b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr2 += enc_ref_c_size; 626b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size2 -= enc_ref_c_size; 627b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 628b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_MPEG4_UP_MV_ADR); 629b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr1 += S5P_FIMV_ENC_UPMV_SIZE; 63050d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker buf_size1 -= S5P_FIMV_ENC_UPMV_SIZE; 631b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(buf_addr1), 632b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_MPEG4_COZERO_FLAG_ADR); 633b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr1 += S5P_FIMV_ENC_COLFLG_SIZE; 63450d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker buf_size1 -= S5P_FIMV_ENC_COLFLG_SIZE; 635b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(buf_addr1), 636b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_MPEG4_ACDC_COEF_ADR); 637b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr1 += S5P_FIMV_ENC_ACDCCOEF_SIZE; 638b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1 -= S5P_FIMV_ENC_ACDCCOEF_SIZE; 63950d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker mfc_debug(2, "buf_size1: %d, buf_size2: %d\n", 640b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1, buf_size2); 641b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 642b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_MFC_CODEC_H263_ENC: 643eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern for (i = 0; i < 2; i++) { 644eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern mfc_write(dev, OFFSETA(buf_addr1), 64550d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker S5P_FIMV_ENC_REF0_LUMA_ADR + (4 * i)); 646b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr1 += enc_ref_y_size; 647b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1 -= enc_ref_y_size; 648eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern mfc_write(dev, OFFSETB(buf_addr2), 649b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_ENC_REF2_LUMA_ADR + (4 * i)); 650b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr2 += enc_ref_y_size; 651b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size2 -= enc_ref_y_size; 652b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 653b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker for (i = 0; i < 4; i++) { 654b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETB(buf_addr2), 655b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_ENC_REF0_CHROMA_ADR + (4 * i)); 656b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr2 += enc_ref_c_size; 657b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size2 -= enc_ref_c_size; 658b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 659b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_H263_UP_MV_ADR); 660b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr1 += S5P_FIMV_ENC_UPMV_SIZE; 661b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1 -= S5P_FIMV_ENC_UPMV_SIZE; 662b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_H263_ACDC_COEF_ADR); 663b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_addr1 += S5P_FIMV_ENC_ACDCCOEF_SIZE; 664b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1 -= S5P_FIMV_ENC_ACDCCOEF_SIZE; 66550d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker mfc_debug(2, "buf_size1: %d, buf_size2: %d\n", 666b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker buf_size1, buf_size2); 667b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 668b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker default: 669b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_err("Unknown codec set for encoding: %d\n", 670b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->codec_mode); 671b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return -EINVAL; 672b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 673b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return 0; 674b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 675b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 676b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_set_enc_params(struct s5p_mfc_ctx *ctx) 677b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 678b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_dev *dev = ctx->dev; 67950d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker struct s5p_mfc_enc_params *p = &ctx->enc_params; 680b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker unsigned int reg; 681b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker unsigned int shm; 682b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 683b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* width */ 684b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, ctx->img_width, S5P_FIMV_ENC_HSIZE_PX); 685b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* height */ 686b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, ctx->img_height, S5P_FIMV_ENC_VSIZE_PX); 687b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* pictype : enable, IDR period */ 68850d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker reg = mfc_read(dev, S5P_FIMV_ENC_PIC_TYPE_CTRL); 689b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= (1 << 18); 690b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg &= ~(0xFFFF); 691b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= p->gop_size; 692b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, reg, S5P_FIMV_ENC_PIC_TYPE_CTRL); 693b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, 0, S5P_FIMV_ENC_B_RECON_WRITE_ON); 694b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* multi-slice control */ 695b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* multi-slice MB number or bit size */ 696b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, p->slice_mode, S5P_FIMV_ENC_MSLICE_CTRL); 697b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (p->slice_mode == V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB) { 698b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, p->slice_mb, S5P_FIMV_ENC_MSLICE_MB); 699b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } else if (p->slice_mode == V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES) { 700b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, p->slice_bit, S5P_FIMV_ENC_MSLICE_BIT); 701b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } else { 702b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, 0, S5P_FIMV_ENC_MSLICE_MB); 703b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, 0, S5P_FIMV_ENC_MSLICE_BIT); 704b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 705b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* cyclic intra refresh */ 706b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, p->intra_refresh_mb, S5P_FIMV_ENC_CIR_CTRL); 707b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* memory structure cur. frame */ 70850d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker if (ctx->src_fmt->fourcc == V4L2_PIX_FMT_NV12M) 709b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, 0, S5P_FIMV_ENC_MAP_FOR_CUR); 710b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker else if (ctx->src_fmt->fourcc == V4L2_PIX_FMT_NV12MT) 711b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, 3, S5P_FIMV_ENC_MAP_FOR_CUR); 712b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* padding control & value */ 713b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg = mfc_read(dev, S5P_FIMV_ENC_PADDING_CTRL); 714eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern if (p->pad) { 715eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern /** enable */ 71650d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker reg |= (1 << 31); 7174a00027dcb088bf90fa8fb14a7e8ba3506d78f22Alan Stern /** cr value */ 718b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg &= ~(0xFF << 16); 719b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= (p->pad_cr << 16); 720d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech /** cb value */ 721d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech reg &= ~(0xFF << 8); 722d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech reg |= (p->pad_cb << 8); 723b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /** y value */ 724b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg &= ~(0xFF); 725b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= (p->pad_luma); 726b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } else { 727b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /** disable & all value clear */ 728b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg = 0; 72950d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker } 730b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, reg, S5P_FIMV_ENC_PADDING_CTRL); 731b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* rate control config. */ 732b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg = mfc_read(dev, S5P_FIMV_ENC_RC_CONFIG); 73350d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker /** frame-level rate control */ 734b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg &= ~(0x1 << 9); 735b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= (p->rc_frame << 9); 736b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, reg, S5P_FIMV_ENC_RC_CONFIG); 737b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* bit rate */ 73850d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker if (p->rc_frame) 739b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, p->rc_bitrate, 740b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_ENC_RC_BIT_RATE); 741b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker else 742eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern mfc_write(dev, 0, S5P_FIMV_ENC_RC_BIT_RATE); 743eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern /* reaction coefficient */ 74450d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker if (p->rc_frame) 745b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, p->rc_reaction_coeff, S5P_FIMV_ENC_RC_RPARA); 746b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm = s5p_mfc_read_info_v5(ctx, EXT_ENC_CONTROL); 747eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern /* seq header ctrl */ 748b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm &= ~(0x1 << 3); 749b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm |= (p->seq_hdr_mode << 3); 750b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* frame skip mode */ 751b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm &= ~(0x3 << 1); 752b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm |= (p->frame_skip_mode << 1); 75350d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker s5p_mfc_write_info_v5(ctx, shm, EXT_ENC_CONTROL); 754b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* fixed target bit */ 755b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_write_info_v5(ctx, p->fixed_target_bit, RC_CONTROL_CONFIG); 756b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return 0; 757b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 758b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 759b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_set_enc_params_h264(struct s5p_mfc_ctx *ctx) 76050d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker{ 761b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_dev *dev = ctx->dev; 762b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_enc_params *p = &ctx->enc_params; 763b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_h264_enc_params *p_264 = &p->codec.h264; 764b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker unsigned int reg; 765eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern unsigned int shm; 766eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern 76750d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker s5p_mfc_set_enc_params(ctx); 7684a00027dcb088bf90fa8fb14a7e8ba3506d78f22Alan Stern /* pictype : number of B */ 769b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg = mfc_read(dev, S5P_FIMV_ENC_PIC_TYPE_CTRL); 770b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* num_b_frame - 0 ~ 2 */ 771d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech reg &= ~(0x3 << 16); 772d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech reg |= (p->num_b_frame << 16); 773d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_write(dev, reg, S5P_FIMV_ENC_PIC_TYPE_CTRL); 774b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* profile & level */ 775b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg = mfc_read(dev, S5P_FIMV_ENC_PROFILE); 776b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* level */ 777b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg &= ~(0xFF << 8); 778b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= (p_264->level << 8); 779b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* profile - 0 ~ 2 */ 780b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg &= ~(0x3F); 78150d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker reg |= p_264->profile; 782b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, reg, S5P_FIMV_ENC_PROFILE); 783b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* interlace */ 784b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, p_264->interlace, S5P_FIMV_ENC_PIC_STRUCT); 78550d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker /* height */ 786b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (p_264->interlace) 787b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, ctx->img_height >> 1, S5P_FIMV_ENC_VSIZE_PX); 788b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* loopfilter ctrl */ 789b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, p_264->loop_filter_mode, S5P_FIMV_ENC_LF_CTRL); 79050d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker /* loopfilter alpha offset */ 791b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (p_264->loop_filter_alpha < 0) { 792b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg = 0x10; 793b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= (0xFF - p_264->loop_filter_alpha) + 1; 794eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern } else { 795eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern reg = 0x00; 79650d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker reg |= (p_264->loop_filter_alpha & 0xF); 797b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 798b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, reg, S5P_FIMV_ENC_ALPHA_OFF); 799eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern /* loopfilter beta offset */ 800b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (p_264->loop_filter_beta < 0) { 801b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg = 0x10; 802b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= (0xFF - p_264->loop_filter_beta) + 1; 803b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } else { 804b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg = 0x00; 805b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= (p_264->loop_filter_beta & 0xF); 806b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 807b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, reg, S5P_FIMV_ENC_BETA_OFF); 808b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* entropy coding mode */ 809b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (p_264->entropy_mode == V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC) 810b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, 1, S5P_FIMV_ENC_H264_ENTROPY_MODE); 811b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker else 812b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, 0, S5P_FIMV_ENC_H264_ENTROPY_MODE); 813b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* number of ref. picture */ 814b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg = mfc_read(dev, S5P_FIMV_ENC_H264_NUM_OF_REF); 81550d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker /* num of ref. pictures of P */ 816b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg &= ~(0x3 << 5); 817b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= (p_264->num_ref_pic_4p << 5); 818b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* max number of ref. pictures */ 819b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg &= ~(0x1F); 820b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= p_264->max_ref_pic; 821b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, reg, S5P_FIMV_ENC_H264_NUM_OF_REF); 822b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* 8x8 transform enable */ 823b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, p_264->_8x8_transform, S5P_FIMV_ENC_H264_TRANS_FLAG); 824b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* rate control config. */ 825b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg = mfc_read(dev, S5P_FIMV_ENC_RC_CONFIG); 826b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* macroblock level rate control */ 82750d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker reg &= ~(0x1 << 8); 828b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= (p->rc_mb << 8); 829b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* frame QP */ 830b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg &= ~(0x3F); 831b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= p_264->rc_frame_qp; 832b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, reg, S5P_FIMV_ENC_RC_CONFIG); 833b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* frame rate */ 834b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (p->rc_frame && p->rc_framerate_denom) 835b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, p->rc_framerate_num * 1000 83650d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker / p->rc_framerate_denom, S5P_FIMV_ENC_RC_FRAME_RATE); 837b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker else 838b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, 0, S5P_FIMV_ENC_RC_FRAME_RATE); 839b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* max & min value of QP */ 840b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg = mfc_read(dev, S5P_FIMV_ENC_RC_QBOUND); 841b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* max QP */ 842b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg &= ~(0x3F << 8); 843b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= (p_264->rc_max_qp << 8); 844b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* min QP */ 845b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg &= ~(0x3F); 84650d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker reg |= p_264->rc_min_qp; 847b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, reg, S5P_FIMV_ENC_RC_QBOUND); 848b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* macroblock adaptive scaling features */ 849b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (p->rc_mb) { 850b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg = mfc_read(dev, S5P_FIMV_ENC_RC_MB_CTRL); 851b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* dark region */ 85250d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker reg &= ~(0x1 << 3); 853b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= (p_264->rc_mb_dark << 3); 854b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* smooth region */ 855b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg &= ~(0x1 << 2); 856b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= (p_264->rc_mb_smooth << 2); 857b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* static region */ 858b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg &= ~(0x1 << 1); 859b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= (p_264->rc_mb_static << 1); 860b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* high activity region */ 861b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg &= ~(0x1); 86250d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker reg |= p_264->rc_mb_activity; 863b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, reg, S5P_FIMV_ENC_RC_MB_CTRL); 864b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 865b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (!p->rc_frame && !p->rc_mb) { 866b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm = s5p_mfc_read_info_v5(ctx, P_B_FRAME_QP); 867b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm &= ~(0xFFF); 868eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern shm |= ((p_264->rc_b_frame_qp & 0x3F) << 6); 869eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern shm |= (p_264->rc_p_frame_qp & 0x3F); 87050d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker s5p_mfc_write_info_v5(ctx, shm, P_B_FRAME_QP); 8714a00027dcb088bf90fa8fb14a7e8ba3506d78f22Alan Stern } 872b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* extended encoder ctrl */ 873b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm = s5p_mfc_read_info_v5(ctx, EXT_ENC_CONTROL); 874d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech /* AR VUI control */ 875d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech shm &= ~(0x1 << 15); 876d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech shm |= (p_264->vui_sar << 1); 877b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_write_info_v5(ctx, shm, EXT_ENC_CONTROL); 878b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (p_264->vui_sar) { 879b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* aspect ration IDC */ 880b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm = s5p_mfc_read_info_v5(ctx, SAMPLE_ASPECT_RATIO_IDC); 881b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm &= ~(0xFF); 88250d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker shm |= p_264->vui_sar_idc; 883b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_write_info_v5(ctx, shm, SAMPLE_ASPECT_RATIO_IDC); 884b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (p_264->vui_sar_idc == 0xFF) { 885b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* sample AR info */ 88650d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker shm = s5p_mfc_read_info_v5(ctx, EXTENDED_SAR); 887b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm &= ~(0xFFFFFFFF); 888b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm |= p_264->vui_ext_sar_width << 16; 889b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm |= p_264->vui_ext_sar_height; 890b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_write_info_v5(ctx, shm, EXTENDED_SAR); 89150d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker } 892b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 893b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* intra picture period for H.264 */ 894b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm = s5p_mfc_read_info_v5(ctx, H264_I_PERIOD); 895eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern /* control */ 896eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern shm &= ~(0x1 << 16); 89750d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker shm |= (p_264->open_gop << 16); 898b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* value */ 899b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (p_264->open_gop) { 900eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern shm &= ~(0xFFFF); 90150d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker shm |= p_264->open_gop_size; 902b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 903b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_write_info_v5(ctx, shm, H264_I_PERIOD); 904b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* extended encoder ctrl */ 905eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern shm = s5p_mfc_read_info_v5(ctx, EXT_ENC_CONTROL); 906eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern /* vbv buffer size */ 90750d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker if (p->frame_skip_mode == 9084a00027dcb088bf90fa8fb14a7e8ba3506d78f22Alan Stern V4L2_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT) { 909b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm &= ~(0xFFFF << 16); 910b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm |= (p_264->cpb_size << 16); 911d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech } 912d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech s5p_mfc_write_info_v5(ctx, shm, EXT_ENC_CONTROL); 913d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech return 0; 914b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 915b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 916b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_set_enc_params_mpeg4(struct s5p_mfc_ctx *ctx) 917b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 918b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_dev *dev = ctx->dev; 919b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_enc_params *p = &ctx->enc_params; 92050d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker struct s5p_mfc_mpeg4_enc_params *p_mpeg4 = &p->codec.mpeg4; 921b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker unsigned int reg; 922b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker unsigned int shm; 923b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker unsigned int framerate; 92450d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker 925b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_set_enc_params(ctx); 926b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* pictype : number of B */ 927b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg = mfc_read(dev, S5P_FIMV_ENC_PIC_TYPE_CTRL); 928b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* num_b_frame - 0 ~ 2 */ 92950d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker reg &= ~(0x3 << 16); 930b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= (p->num_b_frame << 16); 931b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, reg, S5P_FIMV_ENC_PIC_TYPE_CTRL); 932b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* profile & level */ 933eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern reg = mfc_read(dev, S5P_FIMV_ENC_PROFILE); 934eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern /* level */ 93550d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker reg &= ~(0xFF << 8); 936b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= (p_mpeg4->level << 8); 937b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* profile - 0 ~ 2 */ 938eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern reg &= ~(0x3F); 939b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= p_mpeg4->profile; 940b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, reg, S5P_FIMV_ENC_PROFILE); 941b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* quarter_pixel */ 942b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, p_mpeg4->quarter_pixel, S5P_FIMV_ENC_MPEG4_QUART_PXL); 943b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* qp */ 944b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (!p->rc_frame) { 945b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm = s5p_mfc_read_info_v5(ctx, P_B_FRAME_QP); 946b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm &= ~(0xFFF); 947b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm |= ((p_mpeg4->rc_b_frame_qp & 0x3F) << 6); 948b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm |= (p_mpeg4->rc_p_frame_qp & 0x3F); 949b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_write_info_v5(ctx, shm, P_B_FRAME_QP); 950b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 951b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* frame rate */ 95250d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker if (p->rc_frame) { 953b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (p->rc_framerate_denom > 0) { 954b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker framerate = p->rc_framerate_num * 1000 / 955b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker p->rc_framerate_denom; 956b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, framerate, 957b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_ENC_RC_FRAME_RATE); 958b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm = s5p_mfc_read_info_v5(ctx, RC_VOP_TIMING); 959b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm &= ~(0xFFFFFFFF); 960b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm |= (1 << 31); 96150d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker shm |= ((p->rc_framerate_num & 0x7FFF) << 16); 962b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm |= (p->rc_framerate_denom & 0xFFFF); 963b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_write_info_v5(ctx, shm, RC_VOP_TIMING); 964b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 965b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } else { 966b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, 0, S5P_FIMV_ENC_RC_FRAME_RATE); 967b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 96850d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker /* rate control config. */ 969b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg = mfc_read(dev, S5P_FIMV_ENC_RC_CONFIG); 970b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* frame QP */ 971b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg &= ~(0x3F); 972b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= p_mpeg4->rc_frame_qp; 973b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, reg, S5P_FIMV_ENC_RC_CONFIG); 974b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* max & min value of QP */ 975b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg = mfc_read(dev, S5P_FIMV_ENC_RC_QBOUND); 976b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* max QP */ 977eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern reg &= ~(0x3F << 8); 978eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern reg |= (p_mpeg4->rc_max_qp << 8); 97950d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker /* min QP */ 9804a00027dcb088bf90fa8fb14a7e8ba3506d78f22Alan Stern reg &= ~(0x3F); 981b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= p_mpeg4->rc_min_qp; 982b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, reg, S5P_FIMV_ENC_RC_QBOUND); 983d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech /* extended encoder ctrl */ 984d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech shm = s5p_mfc_read_info_v5(ctx, EXT_ENC_CONTROL); 985d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech /* vbv buffer size */ 986b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (p->frame_skip_mode == 987b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker V4L2_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT) { 988b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm &= ~(0xFFFF << 16); 989b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm |= (p->vbv_size << 16); 990b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 99150d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker s5p_mfc_write_info_v5(ctx, shm, EXT_ENC_CONTROL); 992b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return 0; 993b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 994b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 99550d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walkerstatic int s5p_mfc_set_enc_params_h263(struct s5p_mfc_ctx *ctx) 996b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 997b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_dev *dev = ctx->dev; 998b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_enc_params *p = &ctx->enc_params; 999b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_mpeg4_enc_params *p_h263 = &p->codec.mpeg4; 100050d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker unsigned int reg; 1001b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker unsigned int shm; 1002b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1003b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_set_enc_params(ctx); 1004eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern /* qp */ 1005eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern if (!p->rc_frame) { 100650d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker shm = s5p_mfc_read_info_v5(ctx, P_B_FRAME_QP); 1007b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm &= ~(0xFFF); 1008b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm |= (p_h263->rc_p_frame_qp & 0x3F); 1009eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern s5p_mfc_write_info_v5(ctx, shm, P_B_FRAME_QP); 101050d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker } 1011b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* frame rate */ 1012b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (p->rc_frame && p->rc_framerate_denom) 1013b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, p->rc_framerate_num * 1000 1014eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern / p->rc_framerate_denom, S5P_FIMV_ENC_RC_FRAME_RATE); 1015eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern else 101650d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker mfc_write(dev, 0, S5P_FIMV_ENC_RC_FRAME_RATE); 10174a00027dcb088bf90fa8fb14a7e8ba3506d78f22Alan Stern /* rate control config. */ 1018b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg = mfc_read(dev, S5P_FIMV_ENC_RC_CONFIG); 1019b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* frame QP */ 1020d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech reg &= ~(0x3F); 1021d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech reg |= p_h263->rc_frame_qp; 1022d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_write(dev, reg, S5P_FIMV_ENC_RC_CONFIG); 1023b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* max & min value of QP */ 1024b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg = mfc_read(dev, S5P_FIMV_ENC_RC_QBOUND); 1025b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* max QP */ 1026b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg &= ~(0x3F << 8); 1027b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= (p_h263->rc_max_qp << 8); 1028b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* min QP */ 102950d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker reg &= ~(0x3F); 1030b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reg |= p_h263->rc_min_qp; 1031b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, reg, S5P_FIMV_ENC_RC_QBOUND); 1032b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* extended encoder ctrl */ 103350d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker shm = s5p_mfc_read_info_v5(ctx, EXT_ENC_CONTROL); 1034b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* vbv buffer size */ 1035b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (p->frame_skip_mode == 1036b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker V4L2_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT) { 1037b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker shm &= ~(0xFFFF << 16); 103850d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker shm |= (p->vbv_size << 16); 1039b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 1040b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_write_info_v5(ctx, shm, EXT_ENC_CONTROL); 1041b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return 0; 1042eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern} 1043eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern 104450d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker/* Initialize decoding */ 1045b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_init_decode_v5(struct s5p_mfc_ctx *ctx) 1046b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1047eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern struct s5p_mfc_dev *dev = ctx->dev; 1048b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1049b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_set_shared_buffer(ctx); 1050b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* Setup loop filter, for decoding this is only valid for MPEG4 */ 105150d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker if (ctx->codec_mode == S5P_MFC_CODEC_MPEG4_DEC) 1052b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, ctx->loop_filter_mpeg4, S5P_FIMV_ENC_LF_CTRL); 1053b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker else 1054b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, 0, S5P_FIMV_ENC_LF_CTRL); 1055b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, ((ctx->slice_interface & S5P_FIMV_SLICE_INT_MASK) << 1056b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_SLICE_INT_SHIFT) | (ctx->display_delay_enable << 1057b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_DDELAY_ENA_SHIFT) | ((ctx->display_delay & 1058b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_DDELAY_VAL_MASK) << S5P_FIMV_DDELAY_VAL_SHIFT), 1059b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_SI_CH0_DPB_CONF_CTRL); 1060b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, 1061b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ((S5P_FIMV_CH_SEQ_HEADER & S5P_FIMV_CH_MASK) << S5P_FIMV_CH_SHIFT) 106250d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker | (ctx->inst_no), S5P_FIMV_SI_CH0_INST_ID); 1063b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return 0; 1064b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1065b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1066b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic void s5p_mfc_set_flush(struct s5p_mfc_ctx *ctx, int flush) 1067b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1068b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_dev *dev = ctx->dev; 1069b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker unsigned int dpb; 1070b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1071b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (flush) 1072eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern dpb = mfc_read(dev, S5P_FIMV_SI_CH0_DPB_CONF_CTRL) | ( 1073eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern S5P_FIMV_DPB_FLUSH_MASK << S5P_FIMV_DPB_FLUSH_SHIFT); 107450d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker else 10754a00027dcb088bf90fa8fb14a7e8ba3506d78f22Alan Stern dpb = mfc_read(dev, S5P_FIMV_SI_CH0_DPB_CONF_CTRL) & 1076b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ~(S5P_FIMV_DPB_FLUSH_MASK << S5P_FIMV_DPB_FLUSH_SHIFT); 1077b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, dpb, S5P_FIMV_SI_CH0_DPB_CONF_CTRL); 1078d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech} 1079d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 1080d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech/* Decode a single frame */ 1081b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_decode_one_frame_v5(struct s5p_mfc_ctx *ctx, 1082b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker enum s5p_mfc_decode_arg last_frame) 1083b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1084b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_dev *dev = ctx->dev; 1085b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1086b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, ctx->dec_dst_flag, S5P_FIMV_SI_CH0_RELEASE_BUF); 1087b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_set_shared_buffer(ctx); 108850d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker s5p_mfc_set_flush(ctx, ctx->dpb_flush_flag); 1089b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* Issue different commands to instance basing on whether it 1090b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker * is the last frame or not. */ 1091b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker switch (last_frame) { 109250d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker case MFC_DEC_FRAME: 1093b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, ((S5P_FIMV_CH_FRAME_START & S5P_FIMV_CH_MASK) << 1094b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_CH_SHIFT) | (ctx->inst_no), S5P_FIMV_SI_CH0_INST_ID); 1095b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1096b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case MFC_DEC_LAST_FRAME: 109750d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker mfc_write(dev, ((S5P_FIMV_CH_LAST_FRAME & S5P_FIMV_CH_MASK) << 1098b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_CH_SHIFT) | (ctx->inst_no), S5P_FIMV_SI_CH0_INST_ID); 1099b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1100b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case MFC_DEC_RES_CHANGE: 1101eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern mfc_write(dev, ((S5P_FIMV_CH_FRAME_START_REALLOC & 1102eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern S5P_FIMV_CH_MASK) << S5P_FIMV_CH_SHIFT) | (ctx->inst_no), 110350d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker S5P_FIMV_SI_CH0_INST_ID); 1104b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1105b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 1106eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern mfc_debug(2, "Decoding a usual frame\n"); 1107b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return 0; 1108b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 110950d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker 1110b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_init_encode_v5(struct s5p_mfc_ctx *ctx) 1111b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1112b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_dev *dev = ctx->dev; 1113eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern 1114eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern if (ctx->codec_mode == S5P_MFC_CODEC_H264_ENC) 111550d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker s5p_mfc_set_enc_params_h264(ctx); 11164a00027dcb088bf90fa8fb14a7e8ba3506d78f22Alan Stern else if (ctx->codec_mode == S5P_MFC_CODEC_MPEG4_ENC) 1117b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_set_enc_params_mpeg4(ctx); 1118b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker else if (ctx->codec_mode == S5P_MFC_CODEC_H263_ENC) 1119d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech s5p_mfc_set_enc_params_h263(ctx); 1120d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech else { 1121d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_err("Unknown codec for encoding (%x)\n", 1122b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->codec_mode); 1123b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return -EINVAL; 1124b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 1125b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_set_shared_buffer(ctx); 1126b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, ((S5P_FIMV_CH_SEQ_HEADER << 16) & 0x70000) | 112750d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker (ctx->inst_no), S5P_FIMV_SI_CH0_INST_ID); 1128b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return 0; 1129b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1130b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 113150d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker/* Encode a single frame */ 1132b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_encode_one_frame_v5(struct s5p_mfc_ctx *ctx) 1133b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1134b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_dev *dev = ctx->dev; 1135b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker int cmd; 113650d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker /* memory structure cur. frame */ 1137b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (ctx->src_fmt->fourcc == V4L2_PIX_FMT_NV12M) 1138b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, 0, S5P_FIMV_ENC_MAP_FOR_CUR); 1139b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker else if (ctx->src_fmt->fourcc == V4L2_PIX_FMT_NV12MT) 1140eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern mfc_write(dev, 3, S5P_FIMV_ENC_MAP_FOR_CUR); 1141eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern s5p_mfc_set_shared_buffer(ctx); 114250d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker 1143b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (ctx->state == MFCINST_FINISHING) 1144b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker cmd = S5P_FIMV_CH_LAST_FRAME; 1145eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern else 1146b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker cmd = S5P_FIMV_CH_FRAME_START; 1147b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, ((cmd & S5P_FIMV_CH_MASK) << S5P_FIMV_CH_SHIFT) 114850d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker | (ctx->inst_no), S5P_FIMV_SI_CH0_INST_ID); 1149b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1150b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return 0; 1151b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1152b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1153b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_get_new_ctx(struct s5p_mfc_dev *dev) 1154b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1155b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker unsigned long flags; 1156eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern int new_ctx; 1157eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern int cnt; 115850d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker 11594a00027dcb088bf90fa8fb14a7e8ba3506d78f22Alan Stern spin_lock_irqsave(&dev->condlock, flags); 1160b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker new_ctx = (dev->curr_ctx + 1) % MFC_NUM_CONTEXTS; 1161b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker cnt = 0; 1162d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech while (!test_bit(new_ctx, &dev->ctx_work_bits)) { 1163d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech new_ctx = (new_ctx + 1) % MFC_NUM_CONTEXTS; 1164d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech if (++cnt > MFC_NUM_CONTEXTS) { 1165b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* No contexts to run */ 1166b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker spin_unlock_irqrestore(&dev->condlock, flags); 1167b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return -EAGAIN; 1168b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 1169b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 117050d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker spin_unlock_irqrestore(&dev->condlock, flags); 1171b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return new_ctx; 1172b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1173b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 117450d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walkerstatic void s5p_mfc_run_res_change(struct s5p_mfc_ctx *ctx) 1175b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1176b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_dev *dev = ctx->dev; 1177b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1178b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_set_dec_stream_buffer_v5(ctx, 0, 0, 0); 117950d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker dev->curr_ctx = ctx->num; 1180b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_clean_ctx_int_flags(ctx); 1181b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_decode_one_frame_v5(ctx, MFC_DEC_RES_CHANGE); 1182b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1183eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern 1184eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Sternstatic int s5p_mfc_run_dec_frame(struct s5p_mfc_ctx *ctx, int last_frame) 118550d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker{ 1186b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_dev *dev = ctx->dev; 1187b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_buf *temp_vb; 1188eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern unsigned long flags; 118950d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker unsigned int index; 1190b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1191b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker spin_lock_irqsave(&dev->irqlock, flags); 1192b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* Frames are being decoded */ 1193eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern if (list_empty(&ctx->src_queue)) { 1194eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern mfc_debug(2, "No src buffers\n"); 119550d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker spin_unlock_irqrestore(&dev->irqlock, flags); 11964a00027dcb088bf90fa8fb14a7e8ba3506d78f22Alan Stern return -EAGAIN; 1197b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 1198b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* Get the next source buffer */ 1199d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech temp_vb = list_entry(ctx->src_queue.next, struct s5p_mfc_buf, list); 1200d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech temp_vb->flags |= MFC_BUF_FLAG_USED; 1201d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech s5p_mfc_set_dec_stream_buffer_v5(ctx, 1202b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker vb2_dma_contig_plane_dma_addr(temp_vb->b, 0), 1203b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->consumed_stream, temp_vb->b->v4l2_planes[0].bytesused); 1204b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker spin_unlock_irqrestore(&dev->irqlock, flags); 1205b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker index = temp_vb->b->v4l2_buf.index; 1206b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker dev->curr_ctx = ctx->num; 1207b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_clean_ctx_int_flags(ctx); 120850d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker if (temp_vb->b->v4l2_planes[0].bytesused == 0) { 1209b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker last_frame = MFC_DEC_LAST_FRAME; 1210b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_debug(2, "Setting ctx->state to FINISHING\n"); 1211b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->state = MFCINST_FINISHING; 121250d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker } 1213b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_decode_one_frame_v5(ctx, last_frame); 1214b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return 0; 1215b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1216b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 121750d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walkerstatic int s5p_mfc_run_enc_frame(struct s5p_mfc_ctx *ctx) 1218b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1219b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_dev *dev = ctx->dev; 1220b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker unsigned long flags; 1221eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern struct s5p_mfc_buf *dst_mb; 1222eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern struct s5p_mfc_buf *src_mb; 122350d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker unsigned long src_y_addr, src_c_addr, dst_addr; 1224b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker unsigned int dst_size; 1225b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1226eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern spin_lock_irqsave(&dev->irqlock, flags); 1227b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (list_empty(&ctx->src_queue) && ctx->state != MFCINST_FINISHING) { 1228b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_debug(2, "no src buffers\n"); 1229b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker spin_unlock_irqrestore(&dev->irqlock, flags); 1230b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return -EAGAIN; 1231b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 1232b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (list_empty(&ctx->dst_queue)) { 1233b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_debug(2, "no dst buffers\n"); 1234b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker spin_unlock_irqrestore(&dev->irqlock, flags); 1235b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return -EAGAIN; 1236b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 123750d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker if (list_empty(&ctx->src_queue)) { 1238b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* send null frame */ 1239b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_set_enc_frame_buffer_v5(ctx, dev->bank2, dev->bank2); 1240b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker src_mb = NULL; 1241b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } else { 1242b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker src_mb = list_entry(ctx->src_queue.next, struct s5p_mfc_buf, 1243b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker list); 1244b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker src_mb->flags |= MFC_BUF_FLAG_USED; 1245eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern if (src_mb->b->v4l2_planes[0].bytesused == 0) { 1246eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern /* send null frame */ 124750d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker s5p_mfc_set_enc_frame_buffer_v5(ctx, dev->bank2, 12484a00027dcb088bf90fa8fb14a7e8ba3506d78f22Alan Stern dev->bank2); 1249b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->state = MFCINST_FINISHING; 1250b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } else { 1251d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech src_y_addr = vb2_dma_contig_plane_dma_addr(src_mb->b, 1252d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 0); 1253d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech src_c_addr = vb2_dma_contig_plane_dma_addr(src_mb->b, 1254b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1); 1255b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_set_enc_frame_buffer_v5(ctx, src_y_addr, 1256b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker src_c_addr); 1257b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (src_mb->flags & MFC_BUF_FLAG_EOS) 1258b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->state = MFCINST_FINISHING; 1259b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 126050d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker } 1261b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker dst_mb = list_entry(ctx->dst_queue.next, struct s5p_mfc_buf, list); 1262b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker dst_mb->flags |= MFC_BUF_FLAG_USED; 1263b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker dst_addr = vb2_dma_contig_plane_dma_addr(dst_mb->b, 0); 126450d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker dst_size = vb2_plane_size(dst_mb->b, 0); 1265b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_set_enc_stream_buffer_v5(ctx, dst_addr, dst_size); 1266b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker spin_unlock_irqrestore(&dev->irqlock, flags); 1267b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker dev->curr_ctx = ctx->num; 1268b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_clean_ctx_int_flags(ctx); 126950d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker mfc_debug(2, "encoding buffer with index=%d state=%d", 1270b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker src_mb ? src_mb->b->v4l2_buf.index : -1, ctx->state); 1271b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_encode_one_frame_v5(ctx); 1272b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return 0; 1273eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern} 1274eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern 127550d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walkerstatic void s5p_mfc_run_init_dec(struct s5p_mfc_ctx *ctx) 1276b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1277b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_dev *dev = ctx->dev; 1278eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern unsigned long flags; 1279b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_buf *temp_vb; 1280b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 128150d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker /* Initializing decoding - parsing header */ 1282b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker spin_lock_irqsave(&dev->irqlock, flags); 1283b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_debug(2, "Preparing to init decoding\n"); 1284b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker temp_vb = list_entry(ctx->src_queue.next, struct s5p_mfc_buf, list); 1285b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_set_dec_desc_buffer(ctx); 1286b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_debug(2, "Header size: %d\n", temp_vb->b->v4l2_planes[0].bytesused); 1287b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_set_dec_stream_buffer_v5(ctx, 1288b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker vb2_dma_contig_plane_dma_addr(temp_vb->b, 0), 1289eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern 0, temp_vb->b->v4l2_planes[0].bytesused); 1290eb23105462304fd35571fd0cab1de7aec79a9ec5Alan Stern spin_unlock_irqrestore(&dev->irqlock, flags); 129150d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker dev->curr_ctx = ctx->num; 12924a00027dcb088bf90fa8fb14a7e8ba3506d78f22Alan Stern s5p_mfc_clean_ctx_int_flags(ctx); 1293b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_init_decode_v5(ctx); 1294b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1295d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 1296d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olechstatic void s5p_mfc_run_init_enc(struct s5p_mfc_ctx *ctx) 1297d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech{ 1298d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech struct s5p_mfc_dev *dev = ctx->dev; 1299d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech unsigned long flags; 1300d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech struct s5p_mfc_buf *dst_mb; 1301c4028958b6ecad064b1a6303a6a5906d4fe48d73David Howells unsigned long dst_addr; 1302d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech unsigned int dst_size; 1303b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1304c4028958b6ecad064b1a6303a6a5906d4fe48d73David Howells s5p_mfc_set_enc_ref_buffer_v5(ctx); 1305b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker spin_lock_irqsave(&dev->irqlock, flags); 130650d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker dst_mb = list_entry(ctx->dst_queue.next, struct s5p_mfc_buf, list); 1307b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker dst_addr = vb2_dma_contig_plane_dma_addr(dst_mb->b, 0); 130850d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker dst_size = vb2_plane_size(dst_mb->b, 0); 1309b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_set_enc_stream_buffer_v5(ctx, dst_addr, dst_size); 1310b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker spin_unlock_irqrestore(&dev->irqlock, flags); 1311b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker dev->curr_ctx = ctx->num; 1312b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_clean_ctx_int_flags(ctx); 1313b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_init_encode_v5(ctx); 1314b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1315b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1316b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_run_init_dec_buffers(struct s5p_mfc_ctx *ctx) 1317b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1318b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_dev *dev = ctx->dev; 1319b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker unsigned long flags; 1320b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_buf *temp_vb; 1321b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker int ret; 1322b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1323b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* 1324b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker * Header was parsed now starting processing 132550d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker * First set the output frame buffers 1326b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker */ 1327b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (ctx->capture_state != QUEUE_BUFS_MMAPED) { 1328b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_err("It seems that not all destionation buffers were " 1329b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker "mmaped\nMFC requires that all destination are mmaped " 1330b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker "before starting processing\n"); 1331b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return -EAGAIN; 1332b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 1333b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker spin_lock_irqsave(&dev->irqlock, flags); 1334b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (list_empty(&ctx->src_queue)) { 1335b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_err("Header has been deallocated in the middle of" 1336b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker " initialization\n"); 1337b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker spin_unlock_irqrestore(&dev->irqlock, flags); 1338b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return -EIO; 133950d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker } 1340b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker temp_vb = list_entry(ctx->src_queue.next, struct s5p_mfc_buf, list); 1341b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_debug(2, "Header size: %d\n", temp_vb->b->v4l2_planes[0].bytesused); 1342b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_set_dec_stream_buffer_v5(ctx, 1343b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker vb2_dma_contig_plane_dma_addr(temp_vb->b, 0), 1344b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 0, temp_vb->b->v4l2_planes[0].bytesused); 1345b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker spin_unlock_irqrestore(&dev->irqlock, flags); 1346b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker dev->curr_ctx = ctx->num; 1347b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_clean_ctx_int_flags(ctx); 1348b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ret = s5p_mfc_set_dec_frame_buffer_v5(ctx); 134950d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker if (ret) { 1350b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_err("Failed to alloc frame mem\n"); 1351b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->state = MFCINST_ERROR; 135250d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker } 1353b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return ret; 1354b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1355b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1356b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker/* Try running an operation on hardware */ 135750d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walkerstatic void s5p_mfc_try_run_v5(struct s5p_mfc_dev *dev) 1358b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1359b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_ctx *ctx; 1360b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker int new_ctx; 1361d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech unsigned int ret = 0; 1362d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 1363c4028958b6ecad064b1a6303a6a5906d4fe48d73David Howells if (test_bit(0, &dev->enter_suspend)) { 1364d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech mfc_debug(1, "Entering suspend so do not schedule any jobs\n"); 1365b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return; 1366b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 1367c4028958b6ecad064b1a6303a6a5906d4fe48d73David Howells /* Check whether hardware is not running */ 1368b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (test_and_set_bit(0, &dev->hw_lock) != 0) { 136950d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker /* This is perfectly ok, the scheduled ctx should wait */ 1370b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_debug(1, "Couldn't lock HW\n"); 1371b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return; 1372b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 1373b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* Choose the context to run */ 1374b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker new_ctx = s5p_mfc_get_new_ctx(dev); 1375b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (new_ctx < 0) { 137650d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker /* No contexts to run */ 1377b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (test_and_clear_bit(0, &dev->hw_lock) == 0) { 1378b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_err("Failed to unlock hardware\n"); 1379b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return; 138050d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker } 1381b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_debug(1, "No ctx is scheduled to be run\n"); 1382b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return; 1383b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 138450d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker ctx = dev->ctx[new_ctx]; 1385b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* Got context to run in ctx */ 1386b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* 1387b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker * Last frame has already been sent to MFC. 138850d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker * Now obtaining frames from MFC buffer 1389b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker */ 1390b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_clock_on(); 1391b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (ctx->type == MFCINST_DECODER) { 1392b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_set_dec_desc_buffer(ctx); 1393b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker switch (ctx->state) { 139450d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker case MFCINST_FINISHING: 1395b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_run_dec_frame(ctx, MFC_DEC_LAST_FRAME); 1396b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1397b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case MFCINST_RUNNING: 1398b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ret = s5p_mfc_run_dec_frame(ctx, MFC_DEC_FRAME); 1399b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1400b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case MFCINST_INIT: 1401b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_clean_ctx_int_flags(ctx); 1402b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ret = s5p_mfc_hw_call(dev->mfc_cmds, open_inst_cmd, 1403b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx); 140450d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker break; 1405b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case MFCINST_RETURN_INST: 1406b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_clean_ctx_int_flags(ctx); 1407b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ret = s5p_mfc_hw_call(dev->mfc_cmds, close_inst_cmd, 1408b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx); 1409b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1410b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case MFCINST_GOT_INST: 1411b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_run_init_dec(ctx); 1412b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1413b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case MFCINST_HEAD_PARSED: 141450d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker ret = s5p_mfc_run_init_dec_buffers(ctx); 1415b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_debug(1, "head parsed\n"); 1416b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1417b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case MFCINST_RES_CHANGE_INIT: 1418b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_run_res_change(ctx); 1419b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1420b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case MFCINST_RES_CHANGE_FLUSH: 1421b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_run_dec_frame(ctx, MFC_DEC_FRAME); 1422b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1423b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case MFCINST_RES_CHANGE_END: 142450d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker mfc_debug(2, "Finished remaining frames after resolution change\n"); 1425b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx->capture_state = QUEUE_FREE; 1426b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_debug(2, "Will re-init the codec\n"); 1427b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_run_init_dec(ctx); 1428b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1429b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker default: 1430b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ret = -EAGAIN; 1431b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 1432b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } else if (ctx->type == MFCINST_ENCODER) { 1433b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker switch (ctx->state) { 1434b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case MFCINST_FINISHING: 1435b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case MFCINST_RUNNING: 1436b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ret = s5p_mfc_run_enc_frame(ctx); 143750d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker break; 1438b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case MFCINST_INIT: 1439b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_clean_ctx_int_flags(ctx); 1440b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ret = s5p_mfc_hw_call(dev->mfc_cmds, open_inst_cmd, 1441b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx); 1442b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1443b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case MFCINST_RETURN_INST: 1444b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_clean_ctx_int_flags(ctx); 1445b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ret = s5p_mfc_hw_call(dev->mfc_cmds, close_inst_cmd, 1446b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ctx); 14471d6ec813e2b2f82666230fc3c0fbf13032da945eRandy Dunlap break; 1448b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case MFCINST_GOT_INST: 1449b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_run_init_enc(ctx); 1450b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 145150d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker default: 1452b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ret = -EAGAIN; 1453b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 1454b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } else { 1455b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_err("Invalid context type: %d\n", ctx->type); 1456b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker ret = -EAGAIN; 1457b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 1458b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1459b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (ret) { 1460b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* Free hardware lock */ 1461b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker if (test_and_clear_bit(0, &dev->hw_lock) == 0) 146250d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker mfc_err("Failed to unlock hardware\n"); 1463b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1464b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* This is in deed imporant, as no operation has been 1465b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker * scheduled, reduce the clock count as no one will 1466b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker * ever do this, because no interrupt related to this try_run 1467b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker * will ever come from hardware. */ 1468b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker s5p_mfc_clock_off(); 1469b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 1470b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1471b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 147250d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker 1473b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic void s5p_mfc_cleanup_queue_v5(struct list_head *lh, struct vb2_queue *vq) 1474b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1475b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker struct s5p_mfc_buf *b; 1476b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker int i; 1477b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1478b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker while (!list_empty(lh)) { 1479b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker b = list_entry(lh->next, struct s5p_mfc_buf, list); 1480b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker for (i = 0; i < b->b->num_planes; i++) 1481b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker vb2_set_plane_payload(b->b, i, 0); 1482b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker vb2_buffer_done(b->b, VB2_BUF_STATE_ERROR); 1483b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker list_del(&b->list); 1484b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker } 148550d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker} 1486b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1487b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic void s5p_mfc_clear_int_flags_v5(struct s5p_mfc_dev *dev) 1488b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1489b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, 0, S5P_FIMV_RISC_HOST_INT); 1490b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, 0, S5P_FIMV_RISC2HOST_CMD); 1491b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker mfc_write(dev, 0xffff, S5P_FIMV_SI_RTN_CHID); 1492b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1493b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1494b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_get_dspl_y_adr_v5(struct s5p_mfc_dev *dev) 149550d8ca9b5624bf50cc3ff624fe9ababf0c789bd2Daniel Walker{ 1496b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return mfc_read(dev, S5P_FIMV_SI_DISPLAY_Y_ADR) << MFC_OFFSET_SHIFT; 1497b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1498b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1499b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_get_dec_y_adr_v5(struct s5p_mfc_dev *dev) 1500b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1501b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return mfc_read(dev, S5P_FIMV_SI_DECODE_Y_ADR) << MFC_OFFSET_SHIFT; 1502b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1503b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1504b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_get_dspl_status_v5(struct s5p_mfc_dev *dev) 1505b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1506b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return mfc_read(dev, S5P_FIMV_SI_DISPLAY_STATUS); 1507d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech} 15085b570d43cea0f5a6aa5bec2da2a0f68b96a37346Gabriel C 1509d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olechstatic int s5p_mfc_get_dec_status_v5(struct s5p_mfc_dev *dev) 1510d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech{ 1511d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech return mfc_read(dev, S5P_FIMV_SI_DECODE_STATUS); 1512b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1513d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 1514d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olechstatic int s5p_mfc_get_dec_frame_type_v5(struct s5p_mfc_dev *dev) 15155b570d43cea0f5a6aa5bec2da2a0f68b96a37346Gabriel C{ 15165b570d43cea0f5a6aa5bec2da2a0f68b96a37346Gabriel C return mfc_read(dev, S5P_FIMV_DECODE_FRAME_TYPE) & 1517d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech S5P_FIMV_DECODE_FRAME_MASK; 1518d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech} 1519b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1520b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_get_disp_frame_type_v5(struct s5p_mfc_ctx *ctx) 1521b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1522b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return (s5p_mfc_read_info_v5(ctx, DISP_PIC_FRAME_TYPE) >> 1523b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_SHARED_DISP_FRAME_TYPE_SHIFT) & 1524b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_DECODE_FRAME_MASK; 1525b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1526b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1527b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_get_consumed_stream_v5(struct s5p_mfc_dev *dev) 1528b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1529d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech return mfc_read(dev, S5P_FIMV_SI_CONSUMED_BYTES); 1530d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech} 1531d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 1532d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olechstatic int s5p_mfc_get_int_reason_v5(struct s5p_mfc_dev *dev) 1533b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1534b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker int reason; 1535b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reason = mfc_read(dev, S5P_FIMV_RISC2HOST_CMD) & 1536b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker S5P_FIMV_RISC2HOST_CMD_MASK; 1537b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker switch (reason) { 1538b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_FIMV_R2H_CMD_OPEN_INSTANCE_RET: 1539b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reason = S5P_MFC_R2H_CMD_OPEN_INSTANCE_RET; 1540b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1541b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_FIMV_R2H_CMD_CLOSE_INSTANCE_RET: 1542b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reason = S5P_MFC_R2H_CMD_CLOSE_INSTANCE_RET; 1543b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1544b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_FIMV_R2H_CMD_SEQ_DONE_RET: 1545b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reason = S5P_MFC_R2H_CMD_SEQ_DONE_RET; 1546b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1547b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_FIMV_R2H_CMD_FRAME_DONE_RET: 1548b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reason = S5P_MFC_R2H_CMD_FRAME_DONE_RET; 1549b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1550d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech case S5P_FIMV_R2H_CMD_SLICE_DONE_RET: 1551d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech reason = S5P_MFC_R2H_CMD_SLICE_DONE_RET; 1552d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech break; 1553d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech case S5P_FIMV_R2H_CMD_SYS_INIT_RET: 1554b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reason = S5P_MFC_R2H_CMD_SYS_INIT_RET; 1555b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1556b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_FIMV_R2H_CMD_FW_STATUS_RET: 1557b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reason = S5P_MFC_R2H_CMD_FW_STATUS_RET; 1558b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1559b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_FIMV_R2H_CMD_SLEEP_RET: 1560b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reason = S5P_MFC_R2H_CMD_SLEEP_RET; 1561b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1562b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_FIMV_R2H_CMD_WAKEUP_RET: 1563b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reason = S5P_MFC_R2H_CMD_WAKEUP_RET; 1564b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1565d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech case S5P_FIMV_R2H_CMD_INIT_BUFFERS_RET: 1566d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech reason = S5P_MFC_R2H_CMD_INIT_BUFFERS_RET; 1567d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech break; 1568d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech case S5P_FIMV_R2H_CMD_ENC_COMPLETE_RET: 1569b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reason = S5P_MFC_R2H_CMD_COMPLETE_SEQ_RET; 1570b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1571b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker case S5P_FIMV_R2H_CMD_ERR_RET: 1572b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reason = S5P_MFC_R2H_CMD_ERR_RET; 1573b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker break; 1574b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker default: 1575b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker reason = S5P_MFC_R2H_CMD_EMPTY; 1576b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker }; 1577b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return reason; 1578b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1579b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1580b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_get_int_err_v5(struct s5p_mfc_dev *dev) 1581b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1582b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return mfc_read(dev, S5P_FIMV_RISC2HOST_ARG2); 1583b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1584b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1585b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_err_dec_v5(unsigned int err) 1586b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1587b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return (err & S5P_FIMV_ERR_DEC_MASK) >> S5P_FIMV_ERR_DEC_SHIFT; 1588b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1589b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1590b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_err_dspl_v5(unsigned int err) 1591b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1592b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return (err & S5P_FIMV_ERR_DSPL_MASK) >> S5P_FIMV_ERR_DSPL_SHIFT; 1593d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech} 1594d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 1595d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olechstatic int s5p_mfc_get_img_width_v5(struct s5p_mfc_dev *dev) 1596d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech{ 1597d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech return mfc_read(dev, S5P_FIMV_SI_HRESOL); 1598d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech} 1599d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech 1600d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olechstatic int s5p_mfc_get_img_height_v5(struct s5p_mfc_dev *dev) 1601d774efeabccf5f5207aa70d5c126fc928e8b30bdTony Olech{ 1602b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return mfc_read(dev, S5P_FIMV_SI_VRESOL); 1603b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1604b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1605b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_get_dpb_count_v5(struct s5p_mfc_dev *dev) 1606b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1607b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return mfc_read(dev, S5P_FIMV_SI_BUF_NUMBER); 1608b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1609b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1610b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_get_mv_count_v5(struct s5p_mfc_dev *dev) 1611b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1612b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker /* NOP */ 1613b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return -1; 1614b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1615b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1616b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_get_inst_no_v5(struct s5p_mfc_dev *dev) 1617b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1618b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return mfc_read(dev, S5P_FIMV_RISC2HOST_ARG1); 1619b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1620b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1621b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_get_enc_strm_size_v5(struct s5p_mfc_dev *dev) 1622b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1623b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return mfc_read(dev, S5P_FIMV_ENC_SI_STRM_SIZE); 1624b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1625b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1626b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_get_enc_slice_type_v5(struct s5p_mfc_dev *dev) 1627b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1628b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return mfc_read(dev, S5P_FIMV_ENC_SI_SLICE_TYPE); 1629b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1630b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1631b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_get_enc_dpb_count_v5(struct s5p_mfc_dev *dev) 1632b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1633b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return -1; 1634b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1635b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1636b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_get_enc_pic_count_v5(struct s5p_mfc_dev *dev) 1637b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1638b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return mfc_read(dev, S5P_FIMV_ENC_SI_PIC_CNT); 1639b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1640b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1641b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_get_sei_avail_status_v5(struct s5p_mfc_ctx *ctx) 1642b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1643b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return s5p_mfc_read_info_v5(ctx, FRAME_PACK_SEI_AVAIL); 1644b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1645b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1646b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_get_mvc_num_views_v5(struct s5p_mfc_dev *dev) 1647b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1648b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return -1; 1649b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1650b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1651b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic int s5p_mfc_get_mvc_view_id_v5(struct s5p_mfc_dev *dev) 1652b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1653b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return -1; 1654b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1655b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1656b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic unsigned int s5p_mfc_get_pic_type_top_v5(struct s5p_mfc_ctx *ctx) 1657b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1658b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return s5p_mfc_read_info_v5(ctx, PIC_TIME_TOP); 1659b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1660b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1661b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic unsigned int s5p_mfc_get_pic_type_bot_v5(struct s5p_mfc_ctx *ctx) 1662b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1663b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return s5p_mfc_read_info_v5(ctx, PIC_TIME_BOT); 1664b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1665b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1666b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic unsigned int s5p_mfc_get_crop_info_h_v5(struct s5p_mfc_ctx *ctx) 1667b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1668b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return s5p_mfc_read_info_v5(ctx, CROP_INFO_H); 1669b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1670b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1671b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic unsigned int s5p_mfc_get_crop_info_v_v5(struct s5p_mfc_ctx *ctx) 1672b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1673b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return s5p_mfc_read_info_v5(ctx, CROP_INFO_V); 1674b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1675b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1676b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker/* Initialize opr function pointers for MFC v5 */ 1677b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstatic struct s5p_mfc_hw_ops s5p_mfc_ops_v5 = { 1678b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .alloc_dec_temp_buffers = s5p_mfc_alloc_dec_temp_buffers_v5, 1679b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .release_dec_desc_buffer = s5p_mfc_release_dec_desc_buffer_v5, 1680b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .alloc_codec_buffers = s5p_mfc_alloc_codec_buffers_v5, 1681b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .release_codec_buffers = s5p_mfc_release_codec_buffers_v5, 1682b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .alloc_instance_buffer = s5p_mfc_alloc_instance_buffer_v5, 1683b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .release_instance_buffer = s5p_mfc_release_instance_buffer_v5, 1684b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .alloc_dev_context_buffer = s5p_mfc_alloc_dev_context_buffer_v5, 1685b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .release_dev_context_buffer = s5p_mfc_release_dev_context_buffer_v5, 1686b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .dec_calc_dpb_size = s5p_mfc_dec_calc_dpb_size_v5, 1687b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .enc_calc_src_size = s5p_mfc_enc_calc_src_size_v5, 1688b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .set_dec_stream_buffer = s5p_mfc_set_dec_stream_buffer_v5, 1689b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .set_dec_frame_buffer = s5p_mfc_set_dec_frame_buffer_v5, 1690b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .set_enc_stream_buffer = s5p_mfc_set_enc_stream_buffer_v5, 1691b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .set_enc_frame_buffer = s5p_mfc_set_enc_frame_buffer_v5, 1692b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_enc_frame_buffer = s5p_mfc_get_enc_frame_buffer_v5, 1693b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .set_enc_ref_buffer = s5p_mfc_set_enc_ref_buffer_v5, 1694b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .init_decode = s5p_mfc_init_decode_v5, 1695b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .init_encode = s5p_mfc_init_encode_v5, 1696b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .encode_one_frame = s5p_mfc_encode_one_frame_v5, 1697b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .try_run = s5p_mfc_try_run_v5, 1698b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .cleanup_queue = s5p_mfc_cleanup_queue_v5, 1699b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .clear_int_flags = s5p_mfc_clear_int_flags_v5, 1700b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .write_info = s5p_mfc_write_info_v5, 1701b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .read_info = s5p_mfc_read_info_v5, 1702b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_dspl_y_adr = s5p_mfc_get_dspl_y_adr_v5, 1703b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_dec_y_adr = s5p_mfc_get_dec_y_adr_v5, 1704b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_dspl_status = s5p_mfc_get_dspl_status_v5, 1705b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_dec_status = s5p_mfc_get_dec_status_v5, 1706b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_dec_frame_type = s5p_mfc_get_dec_frame_type_v5, 1707b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_disp_frame_type = s5p_mfc_get_disp_frame_type_v5, 1708b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_consumed_stream = s5p_mfc_get_consumed_stream_v5, 1709b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_int_reason = s5p_mfc_get_int_reason_v5, 1710b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_int_err = s5p_mfc_get_int_err_v5, 1711b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .err_dec = s5p_mfc_err_dec_v5, 1712b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .err_dspl = s5p_mfc_err_dspl_v5, 1713b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_img_width = s5p_mfc_get_img_width_v5, 1714b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_img_height = s5p_mfc_get_img_height_v5, 1715b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_dpb_count = s5p_mfc_get_dpb_count_v5, 1716b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_mv_count = s5p_mfc_get_mv_count_v5, 1717b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_inst_no = s5p_mfc_get_inst_no_v5, 1718b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_enc_strm_size = s5p_mfc_get_enc_strm_size_v5, 1719b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_enc_slice_type = s5p_mfc_get_enc_slice_type_v5, 1720b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_enc_dpb_count = s5p_mfc_get_enc_dpb_count_v5, 1721b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_enc_pic_count = s5p_mfc_get_enc_pic_count_v5, 1722b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_sei_avail_status = s5p_mfc_get_sei_avail_status_v5, 1723b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_mvc_num_views = s5p_mfc_get_mvc_num_views_v5, 1724b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_mvc_view_id = s5p_mfc_get_mvc_view_id_v5, 1725b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_pic_type_top = s5p_mfc_get_pic_type_top_v5, 1726b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_pic_type_bot = s5p_mfc_get_pic_type_bot_v5, 1727b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_crop_info_h = s5p_mfc_get_crop_info_h_v5, 1728b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker .get_crop_info_v = s5p_mfc_get_crop_info_v_v5, 1729b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker}; 1730b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker 1731b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walkerstruct s5p_mfc_hw_ops *s5p_mfc_init_hw_ops_v5(void) 1732b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker{ 1733b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker return &s5p_mfc_ops_v5; 1734b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker} 1735b40f8d3980d3eef26b3bd77da5314728a5b30aeaDaniel Walker