|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
- * drivers/media/platform/samsung/mfc5/s5p_mfc_opr.c
|
|
|
+ * drivers/media/platform/samsung/mfc5/s5p_mfc_opr_v5.c
|
|
|
*
|
|
|
* Samsung MFC (Multi Function Codec - FIMV) driver
|
|
|
* This file contains hw related functions.
|
|
@@ -12,14 +12,14 @@
|
|
|
* published by the Free Software Foundation.
|
|
|
*/
|
|
|
|
|
|
-#include "regs-mfc.h"
|
|
|
-#include "s5p_mfc_cmd_v5.h"
|
|
|
#include "s5p_mfc_common.h"
|
|
|
+#include "s5p_mfc_cmd.h"
|
|
|
#include "s5p_mfc_ctrl.h"
|
|
|
#include "s5p_mfc_debug.h"
|
|
|
#include "s5p_mfc_intr.h"
|
|
|
-#include "s5p_mfc_opr_v5.h"
|
|
|
#include "s5p_mfc_pm.h"
|
|
|
+#include "s5p_mfc_opr.h"
|
|
|
+#include "s5p_mfc_opr_v5.h"
|
|
|
#include <asm/cacheflush.h>
|
|
|
#include <linux/delay.h>
|
|
|
#include <linux/dma-mapping.h>
|
|
@@ -34,7 +34,7 @@
|
|
|
#define OFFSETB(x) (((x) - dev->bank2) >> MFC_OFFSET_SHIFT)
|
|
|
|
|
|
/* Allocate temporary buffers for decoding */
|
|
|
-int s5p_mfc_alloc_dec_temp_buffers(struct s5p_mfc_ctx *ctx)
|
|
|
+int s5p_mfc_alloc_dec_temp_buffers_v5(struct s5p_mfc_ctx *ctx)
|
|
|
{
|
|
|
void *desc_virt;
|
|
|
struct s5p_mfc_dev *dev = ctx->dev;
|
|
@@ -63,7 +63,7 @@ int s5p_mfc_alloc_dec_temp_buffers(struct s5p_mfc_ctx *ctx)
|
|
|
}
|
|
|
|
|
|
/* Release temporary buffers for decoding */
|
|
|
-void s5p_mfc_release_dec_desc_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
+void s5p_mfc_release_dec_desc_buffer_v5(struct s5p_mfc_ctx *ctx)
|
|
|
{
|
|
|
if (ctx->desc_phys) {
|
|
|
vb2_dma_contig_memops.put(ctx->desc_buf);
|
|
@@ -73,7 +73,7 @@ void s5p_mfc_release_dec_desc_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
}
|
|
|
|
|
|
/* Allocate codec buffers */
|
|
|
-int s5p_mfc_alloc_codec_buffers(struct s5p_mfc_ctx *ctx)
|
|
|
+int s5p_mfc_alloc_codec_buffers_v5(struct s5p_mfc_ctx *ctx)
|
|
|
{
|
|
|
struct s5p_mfc_dev *dev = ctx->dev;
|
|
|
unsigned int enc_ref_y_size = 0;
|
|
@@ -89,7 +89,7 @@ int s5p_mfc_alloc_codec_buffers(struct s5p_mfc_ctx *ctx)
|
|
|
* ALIGN(ctx->img_height, S5P_FIMV_NV12MT_VALIGN);
|
|
|
enc_ref_y_size = ALIGN(enc_ref_y_size, S5P_FIMV_NV12MT_SALIGN);
|
|
|
|
|
|
- if (ctx->codec_mode == S5P_FIMV_CODEC_H264_ENC) {
|
|
|
+ if (ctx->codec_mode == S5P_MFC_CODEC_H264_ENC) {
|
|
|
enc_ref_c_size = ALIGN(ctx->img_width,
|
|
|
S5P_FIMV_NV12MT_HALIGN)
|
|
|
* ALIGN(ctx->img_height >> 1,
|
|
@@ -111,14 +111,14 @@ int s5p_mfc_alloc_codec_buffers(struct s5p_mfc_ctx *ctx)
|
|
|
}
|
|
|
/* Codecs have different memory requirements */
|
|
|
switch (ctx->codec_mode) {
|
|
|
- case S5P_FIMV_CODEC_H264_DEC:
|
|
|
+ case S5P_MFC_CODEC_H264_DEC:
|
|
|
ctx->bank1_size =
|
|
|
ALIGN(S5P_FIMV_DEC_NB_IP_SIZE +
|
|
|
S5P_FIMV_DEC_VERT_NB_MV_SIZE,
|
|
|
S5P_FIMV_DEC_BUF_ALIGN);
|
|
|
ctx->bank2_size = ctx->total_dpb_count * ctx->mv_size;
|
|
|
break;
|
|
|
- case S5P_FIMV_CODEC_MPEG4_DEC:
|
|
|
+ case S5P_MFC_CODEC_MPEG4_DEC:
|
|
|
ctx->bank1_size =
|
|
|
ALIGN(S5P_FIMV_DEC_NB_DCAC_SIZE +
|
|
|
S5P_FIMV_DEC_UPNB_MV_SIZE +
|
|
@@ -128,8 +128,8 @@ int s5p_mfc_alloc_codec_buffers(struct s5p_mfc_ctx *ctx)
|
|
|
S5P_FIMV_DEC_BUF_ALIGN);
|
|
|
ctx->bank2_size = 0;
|
|
|
break;
|
|
|
- case S5P_FIMV_CODEC_VC1RCV_DEC:
|
|
|
- case S5P_FIMV_CODEC_VC1_DEC:
|
|
|
+ case S5P_MFC_CODEC_VC1RCV_DEC:
|
|
|
+ case S5P_MFC_CODEC_VC1_DEC:
|
|
|
ctx->bank1_size =
|
|
|
ALIGN(S5P_FIMV_DEC_OVERLAP_TRANSFORM_SIZE +
|
|
|
S5P_FIMV_DEC_UPNB_MV_SIZE +
|
|
@@ -139,11 +139,11 @@ int s5p_mfc_alloc_codec_buffers(struct s5p_mfc_ctx *ctx)
|
|
|
S5P_FIMV_DEC_BUF_ALIGN);
|
|
|
ctx->bank2_size = 0;
|
|
|
break;
|
|
|
- case S5P_FIMV_CODEC_MPEG2_DEC:
|
|
|
+ case S5P_MFC_CODEC_MPEG2_DEC:
|
|
|
ctx->bank1_size = 0;
|
|
|
ctx->bank2_size = 0;
|
|
|
break;
|
|
|
- case S5P_FIMV_CODEC_H263_DEC:
|
|
|
+ case S5P_MFC_CODEC_H263_DEC:
|
|
|
ctx->bank1_size =
|
|
|
ALIGN(S5P_FIMV_DEC_OVERLAP_TRANSFORM_SIZE +
|
|
|
S5P_FIMV_DEC_UPNB_MV_SIZE +
|
|
@@ -152,7 +152,7 @@ int s5p_mfc_alloc_codec_buffers(struct s5p_mfc_ctx *ctx)
|
|
|
S5P_FIMV_DEC_BUF_ALIGN);
|
|
|
ctx->bank2_size = 0;
|
|
|
break;
|
|
|
- case S5P_FIMV_CODEC_H264_ENC:
|
|
|
+ case S5P_MFC_CODEC_H264_ENC:
|
|
|
ctx->bank1_size = (enc_ref_y_size * 2) +
|
|
|
S5P_FIMV_ENC_UPMV_SIZE +
|
|
|
S5P_FIMV_ENC_COLFLG_SIZE +
|
|
@@ -162,7 +162,7 @@ int s5p_mfc_alloc_codec_buffers(struct s5p_mfc_ctx *ctx)
|
|
|
(enc_ref_c_size * 4) +
|
|
|
S5P_FIMV_ENC_INTRAPRED_SIZE;
|
|
|
break;
|
|
|
- case S5P_FIMV_CODEC_MPEG4_ENC:
|
|
|
+ case S5P_MFC_CODEC_MPEG4_ENC:
|
|
|
ctx->bank1_size = (enc_ref_y_size * 2) +
|
|
|
S5P_FIMV_ENC_UPMV_SIZE +
|
|
|
S5P_FIMV_ENC_COLFLG_SIZE +
|
|
@@ -170,7 +170,7 @@ int s5p_mfc_alloc_codec_buffers(struct s5p_mfc_ctx *ctx)
|
|
|
ctx->bank2_size = (enc_ref_y_size * 2) +
|
|
|
(enc_ref_c_size * 4);
|
|
|
break;
|
|
|
- case S5P_FIMV_CODEC_H263_ENC:
|
|
|
+ case S5P_MFC_CODEC_H263_ENC:
|
|
|
ctx->bank1_size = (enc_ref_y_size * 2) +
|
|
|
S5P_FIMV_ENC_UPMV_SIZE +
|
|
|
S5P_FIMV_ENC_ACDCCOEF_SIZE;
|
|
@@ -211,7 +211,7 @@ int s5p_mfc_alloc_codec_buffers(struct s5p_mfc_ctx *ctx)
|
|
|
}
|
|
|
|
|
|
/* Release buffers allocated for codec */
|
|
|
-void s5p_mfc_release_codec_buffers(struct s5p_mfc_ctx *ctx)
|
|
|
+void s5p_mfc_release_codec_buffers_v5(struct s5p_mfc_ctx *ctx)
|
|
|
{
|
|
|
if (ctx->bank1_buf) {
|
|
|
vb2_dma_contig_memops.put(ctx->bank1_buf);
|
|
@@ -228,7 +228,7 @@ void s5p_mfc_release_codec_buffers(struct s5p_mfc_ctx *ctx)
|
|
|
}
|
|
|
|
|
|
/* Allocate memory for instance data buffer */
|
|
|
-int s5p_mfc_alloc_instance_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
+int s5p_mfc_alloc_instance_buffer_v5(struct s5p_mfc_ctx *ctx)
|
|
|
{
|
|
|
void *context_virt;
|
|
|
struct s5p_mfc_dev *dev = ctx->dev;
|
|
@@ -289,7 +289,7 @@ int s5p_mfc_alloc_instance_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
}
|
|
|
|
|
|
/* Release instance buffer */
|
|
|
-void s5p_mfc_release_instance_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
+void s5p_mfc_release_instance_buffer_v5(struct s5p_mfc_ctx *ctx)
|
|
|
{
|
|
|
if (ctx->ctx_buf) {
|
|
|
vb2_dma_contig_memops.put(ctx->ctx_buf);
|
|
@@ -303,22 +303,44 @@ void s5p_mfc_release_instance_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void s5p_mfc_write_info_v5(struct s5p_mfc_ctx *ctx, unsigned int data,
|
|
|
+int s5p_mfc_alloc_dev_context_buffer_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ /* NOP */
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+void s5p_mfc_release_dev_context_buffer_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ /* NOP */
|
|
|
+}
|
|
|
+
|
|
|
+static void s5p_mfc_write_info_v5(struct s5p_mfc_ctx *ctx, unsigned int data,
|
|
|
unsigned int ofs)
|
|
|
{
|
|
|
writel(data, (ctx->shm + ofs));
|
|
|
wmb();
|
|
|
}
|
|
|
|
|
|
-unsigned int s5p_mfc_read_info_v5(struct s5p_mfc_ctx *ctx,
|
|
|
+static unsigned int s5p_mfc_read_info_v5(struct s5p_mfc_ctx *ctx,
|
|
|
unsigned int ofs)
|
|
|
{
|
|
|
rmb();
|
|
|
return readl(ctx->shm + ofs);
|
|
|
}
|
|
|
|
|
|
+void s5p_mfc_dec_calc_dpb_size_v5(struct s5p_mfc_ctx *ctx)
|
|
|
+{
|
|
|
+ /* NOP */
|
|
|
+}
|
|
|
+
|
|
|
+void s5p_mfc_enc_calc_src_size_v5(struct s5p_mfc_ctx *ctx)
|
|
|
+{
|
|
|
+ /* NOP */
|
|
|
+}
|
|
|
+
|
|
|
/* Set registers for decoding temporary buffers */
|
|
|
-void s5p_mfc_set_dec_desc_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
+static void s5p_mfc_set_dec_desc_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
{
|
|
|
struct s5p_mfc_dev *dev = ctx->dev;
|
|
|
|
|
@@ -334,7 +356,7 @@ static void s5p_mfc_set_shared_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
}
|
|
|
|
|
|
/* Set registers for decoding stream buffer */
|
|
|
-int s5p_mfc_set_dec_stream_buffer(struct s5p_mfc_ctx *ctx, int buf_addr,
|
|
|
+int s5p_mfc_set_dec_stream_buffer_v5(struct s5p_mfc_ctx *ctx, int buf_addr,
|
|
|
unsigned int start_num_byte, unsigned int buf_size)
|
|
|
{
|
|
|
struct s5p_mfc_dev *dev = ctx->dev;
|
|
@@ -347,7 +369,7 @@ int s5p_mfc_set_dec_stream_buffer(struct s5p_mfc_ctx *ctx, int buf_addr,
|
|
|
}
|
|
|
|
|
|
/* Set decoding frame buffer */
|
|
|
-int s5p_mfc_set_dec_frame_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
+int s5p_mfc_set_dec_frame_buffer_v5(struct s5p_mfc_ctx *ctx)
|
|
|
{
|
|
|
unsigned int frame_size, i;
|
|
|
unsigned int frame_size_ch, frame_size_mv;
|
|
@@ -366,7 +388,7 @@ int s5p_mfc_set_dec_frame_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
S5P_FIMV_SI_CH0_DPB_CONF_CTRL);
|
|
|
s5p_mfc_set_shared_buffer(ctx);
|
|
|
switch (ctx->codec_mode) {
|
|
|
- case S5P_FIMV_CODEC_H264_DEC:
|
|
|
+ case S5P_MFC_CODEC_H264_DEC:
|
|
|
mfc_write(dev, OFFSETA(buf_addr1),
|
|
|
S5P_FIMV_H264_VERT_NB_MV_ADR);
|
|
|
buf_addr1 += S5P_FIMV_DEC_VERT_NB_MV_SIZE;
|
|
@@ -375,7 +397,7 @@ int s5p_mfc_set_dec_frame_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
buf_addr1 += S5P_FIMV_DEC_NB_IP_SIZE;
|
|
|
buf_size1 -= S5P_FIMV_DEC_NB_IP_SIZE;
|
|
|
break;
|
|
|
- case S5P_FIMV_CODEC_MPEG4_DEC:
|
|
|
+ case S5P_MFC_CODEC_MPEG4_DEC:
|
|
|
mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_MPEG4_NB_DCAC_ADR);
|
|
|
buf_addr1 += S5P_FIMV_DEC_NB_DCAC_SIZE;
|
|
|
buf_size1 -= S5P_FIMV_DEC_NB_DCAC_SIZE;
|
|
@@ -392,7 +414,7 @@ int s5p_mfc_set_dec_frame_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
buf_addr1 += S5P_FIMV_DEC_OVERLAP_TRANSFORM_SIZE;
|
|
|
buf_size1 -= S5P_FIMV_DEC_OVERLAP_TRANSFORM_SIZE;
|
|
|
break;
|
|
|
- case S5P_FIMV_CODEC_H263_DEC:
|
|
|
+ case S5P_MFC_CODEC_H263_DEC:
|
|
|
mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_H263_OT_LINE_ADR);
|
|
|
buf_addr1 += S5P_FIMV_DEC_OVERLAP_TRANSFORM_SIZE;
|
|
|
buf_size1 -= S5P_FIMV_DEC_OVERLAP_TRANSFORM_SIZE;
|
|
@@ -406,8 +428,8 @@ int s5p_mfc_set_dec_frame_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
buf_addr1 += S5P_FIMV_DEC_NB_DCAC_SIZE;
|
|
|
buf_size1 -= S5P_FIMV_DEC_NB_DCAC_SIZE;
|
|
|
break;
|
|
|
- case S5P_FIMV_CODEC_VC1_DEC:
|
|
|
- case S5P_FIMV_CODEC_VC1RCV_DEC:
|
|
|
+ case S5P_MFC_CODEC_VC1_DEC:
|
|
|
+ case S5P_MFC_CODEC_VC1RCV_DEC:
|
|
|
mfc_write(dev, OFFSETA(buf_addr1), S5P_FIMV_VC1_NB_DCAC_ADR);
|
|
|
buf_addr1 += S5P_FIMV_DEC_NB_DCAC_SIZE;
|
|
|
buf_size1 -= S5P_FIMV_DEC_NB_DCAC_SIZE;
|
|
@@ -430,7 +452,7 @@ int s5p_mfc_set_dec_frame_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
buf_addr1 += S5P_FIMV_DEC_VC1_BITPLANE_SIZE;
|
|
|
buf_size1 -= S5P_FIMV_DEC_VC1_BITPLANE_SIZE;
|
|
|
break;
|
|
|
- case S5P_FIMV_CODEC_MPEG2_DEC:
|
|
|
+ case S5P_MFC_CODEC_MPEG2_DEC:
|
|
|
break;
|
|
|
default:
|
|
|
mfc_err("Unknown codec for decoding (%x)\n",
|
|
@@ -453,7 +475,7 @@ int s5p_mfc_set_dec_frame_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
ctx->dst_bufs[i].cookie.raw.chroma);
|
|
|
mfc_write(dev, OFFSETA(ctx->dst_bufs[i].cookie.raw.chroma),
|
|
|
S5P_FIMV_DEC_CHROMA_ADR + i * 4);
|
|
|
- if (ctx->codec_mode == S5P_FIMV_CODEC_H264_DEC) {
|
|
|
+ if (ctx->codec_mode == S5P_MFC_CODEC_H264_DEC) {
|
|
|
mfc_debug(2, "\tBuf2: %x, size: %d\n",
|
|
|
buf_addr2, buf_size2);
|
|
|
mfc_write(dev, OFFSETB(buf_addr2),
|
|
@@ -471,7 +493,7 @@ int s5p_mfc_set_dec_frame_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
}
|
|
|
s5p_mfc_write_info_v5(ctx, frame_size, ALLOC_LUMA_DPB_SIZE);
|
|
|
s5p_mfc_write_info_v5(ctx, frame_size_ch, ALLOC_CHROMA_DPB_SIZE);
|
|
|
- if (ctx->codec_mode == S5P_FIMV_CODEC_H264_DEC)
|
|
|
+ if (ctx->codec_mode == S5P_MFC_CODEC_H264_DEC)
|
|
|
s5p_mfc_write_info_v5(ctx, frame_size_mv, ALLOC_MV_SIZE);
|
|
|
mfc_write(dev, ((S5P_FIMV_CH_INIT_BUFS & S5P_FIMV_CH_MASK)
|
|
|
<< S5P_FIMV_CH_SHIFT) | (ctx->inst_no),
|
|
@@ -480,7 +502,7 @@ int s5p_mfc_set_dec_frame_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
}
|
|
|
|
|
|
/* Set registers for encoding stream buffer */
|
|
|
-int s5p_mfc_set_enc_stream_buffer(struct s5p_mfc_ctx *ctx,
|
|
|
+int s5p_mfc_set_enc_stream_buffer_v5(struct s5p_mfc_ctx *ctx,
|
|
|
unsigned long addr, unsigned int size)
|
|
|
{
|
|
|
struct s5p_mfc_dev *dev = ctx->dev;
|
|
@@ -490,7 +512,7 @@ int s5p_mfc_set_enc_stream_buffer(struct s5p_mfc_ctx *ctx,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-void s5p_mfc_set_enc_frame_buffer(struct s5p_mfc_ctx *ctx,
|
|
|
+void s5p_mfc_set_enc_frame_buffer_v5(struct s5p_mfc_ctx *ctx,
|
|
|
unsigned long y_addr, unsigned long c_addr)
|
|
|
{
|
|
|
struct s5p_mfc_dev *dev = ctx->dev;
|
|
@@ -499,7 +521,7 @@ void s5p_mfc_set_enc_frame_buffer(struct s5p_mfc_ctx *ctx,
|
|
|
mfc_write(dev, OFFSETB(c_addr), S5P_FIMV_ENC_SI_CH0_CUR_C_ADR);
|
|
|
}
|
|
|
|
|
|
-void s5p_mfc_get_enc_frame_buffer(struct s5p_mfc_ctx *ctx,
|
|
|
+void s5p_mfc_get_enc_frame_buffer_v5(struct s5p_mfc_ctx *ctx,
|
|
|
unsigned long *y_addr, unsigned long *c_addr)
|
|
|
{
|
|
|
struct s5p_mfc_dev *dev = ctx->dev;
|
|
@@ -511,7 +533,7 @@ void s5p_mfc_get_enc_frame_buffer(struct s5p_mfc_ctx *ctx,
|
|
|
}
|
|
|
|
|
|
/* Set encoding ref & codec buffer */
|
|
|
-int s5p_mfc_set_enc_ref_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
+int s5p_mfc_set_enc_ref_buffer_v5(struct s5p_mfc_ctx *ctx)
|
|
|
{
|
|
|
struct s5p_mfc_dev *dev = ctx->dev;
|
|
|
size_t buf_addr1, buf_addr2;
|
|
@@ -527,7 +549,7 @@ int s5p_mfc_set_enc_ref_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
enc_ref_y_size = ALIGN(ctx->img_width, S5P_FIMV_NV12MT_HALIGN)
|
|
|
* ALIGN(ctx->img_height, S5P_FIMV_NV12MT_VALIGN);
|
|
|
enc_ref_y_size = ALIGN(enc_ref_y_size, S5P_FIMV_NV12MT_SALIGN);
|
|
|
- if (ctx->codec_mode == S5P_FIMV_CODEC_H264_ENC) {
|
|
|
+ if (ctx->codec_mode == S5P_MFC_CODEC_H264_ENC) {
|
|
|
enc_ref_c_size = ALIGN(ctx->img_width, S5P_FIMV_NV12MT_HALIGN)
|
|
|
* ALIGN((ctx->img_height >> 1), S5P_FIMV_NV12MT_VALIGN);
|
|
|
enc_ref_c_size = ALIGN(enc_ref_c_size, S5P_FIMV_NV12MT_SALIGN);
|
|
@@ -541,7 +563,7 @@ int s5p_mfc_set_enc_ref_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
}
|
|
|
mfc_debug(2, "buf_size1: %d, buf_size2: %d\n", buf_size1, buf_size2);
|
|
|
switch (ctx->codec_mode) {
|
|
|
- case S5P_FIMV_CODEC_H264_ENC:
|
|
|
+ case S5P_MFC_CODEC_H264_ENC:
|
|
|
for (i = 0; i < 2; i++) {
|
|
|
mfc_write(dev, OFFSETA(buf_addr1),
|
|
|
S5P_FIMV_ENC_REF0_LUMA_ADR + (4 * i));
|
|
@@ -581,7 +603,7 @@ int s5p_mfc_set_enc_ref_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
mfc_debug(2, "buf_size1: %d, buf_size2: %d\n",
|
|
|
buf_size1, buf_size2);
|
|
|
break;
|
|
|
- case S5P_FIMV_CODEC_MPEG4_ENC:
|
|
|
+ case S5P_MFC_CODEC_MPEG4_ENC:
|
|
|
for (i = 0; i < 2; i++) {
|
|
|
mfc_write(dev, OFFSETA(buf_addr1),
|
|
|
S5P_FIMV_ENC_REF0_LUMA_ADR + (4 * i));
|
|
@@ -612,7 +634,7 @@ int s5p_mfc_set_enc_ref_buffer(struct s5p_mfc_ctx *ctx)
|
|
|
mfc_debug(2, "buf_size1: %d, buf_size2: %d\n",
|
|
|
buf_size1, buf_size2);
|
|
|
break;
|
|
|
- case S5P_FIMV_CODEC_H263_ENC:
|
|
|
+ case S5P_MFC_CODEC_H263_ENC:
|
|
|
for (i = 0; i < 2; i++) {
|
|
|
mfc_write(dev, OFFSETA(buf_addr1),
|
|
|
S5P_FIMV_ENC_REF0_LUMA_ADR + (4 * i));
|
|
@@ -1016,13 +1038,13 @@ static int s5p_mfc_set_enc_params_h263(struct s5p_mfc_ctx *ctx)
|
|
|
}
|
|
|
|
|
|
/* Initialize decoding */
|
|
|
-int s5p_mfc_init_decode(struct s5p_mfc_ctx *ctx)
|
|
|
+int s5p_mfc_init_decode_v5(struct s5p_mfc_ctx *ctx)
|
|
|
{
|
|
|
struct s5p_mfc_dev *dev = ctx->dev;
|
|
|
|
|
|
s5p_mfc_set_shared_buffer(ctx);
|
|
|
/* Setup loop filter, for decoding this is only valid for MPEG4 */
|
|
|
- if (ctx->codec_mode == S5P_FIMV_CODEC_MPEG4_DEC)
|
|
|
+ if (ctx->codec_mode == S5P_MFC_CODEC_MPEG4_DEC)
|
|
|
mfc_write(dev, ctx->loop_filter_mpeg4, S5P_FIMV_ENC_LF_CTRL);
|
|
|
else
|
|
|
mfc_write(dev, 0, S5P_FIMV_ENC_LF_CTRL);
|
|
@@ -1052,7 +1074,7 @@ static void s5p_mfc_set_flush(struct s5p_mfc_ctx *ctx, int flush)
|
|
|
}
|
|
|
|
|
|
/* Decode a single frame */
|
|
|
-int s5p_mfc_decode_one_frame(struct s5p_mfc_ctx *ctx,
|
|
|
+int s5p_mfc_decode_one_frame_v5(struct s5p_mfc_ctx *ctx,
|
|
|
enum s5p_mfc_decode_arg last_frame)
|
|
|
{
|
|
|
struct s5p_mfc_dev *dev = ctx->dev;
|
|
@@ -1081,15 +1103,15 @@ int s5p_mfc_decode_one_frame(struct s5p_mfc_ctx *ctx,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int s5p_mfc_init_encode(struct s5p_mfc_ctx *ctx)
|
|
|
+int s5p_mfc_init_encode_v5(struct s5p_mfc_ctx *ctx)
|
|
|
{
|
|
|
struct s5p_mfc_dev *dev = ctx->dev;
|
|
|
|
|
|
- if (ctx->codec_mode == S5P_FIMV_CODEC_H264_ENC)
|
|
|
+ if (ctx->codec_mode == S5P_MFC_CODEC_H264_ENC)
|
|
|
s5p_mfc_set_enc_params_h264(ctx);
|
|
|
- else if (ctx->codec_mode == S5P_FIMV_CODEC_MPEG4_ENC)
|
|
|
+ else if (ctx->codec_mode == S5P_MFC_CODEC_MPEG4_ENC)
|
|
|
s5p_mfc_set_enc_params_mpeg4(ctx);
|
|
|
- else if (ctx->codec_mode == S5P_FIMV_CODEC_H263_ENC)
|
|
|
+ else if (ctx->codec_mode == S5P_MFC_CODEC_H263_ENC)
|
|
|
s5p_mfc_set_enc_params_h263(ctx);
|
|
|
else {
|
|
|
mfc_err("Unknown codec for encoding (%x)\n",
|
|
@@ -1103,7 +1125,7 @@ int s5p_mfc_init_encode(struct s5p_mfc_ctx *ctx)
|
|
|
}
|
|
|
|
|
|
/* Encode a single frame */
|
|
|
-int s5p_mfc_encode_one_frame(struct s5p_mfc_ctx *ctx)
|
|
|
+int s5p_mfc_encode_one_frame_v5(struct s5p_mfc_ctx *ctx)
|
|
|
{
|
|
|
struct s5p_mfc_dev *dev = ctx->dev;
|
|
|
int cmd;
|
|
@@ -1149,10 +1171,10 @@ static void s5p_mfc_run_res_change(struct s5p_mfc_ctx *ctx)
|
|
|
{
|
|
|
struct s5p_mfc_dev *dev = ctx->dev;
|
|
|
|
|
|
- s5p_mfc_set_dec_stream_buffer(ctx, 0, 0, 0);
|
|
|
+ s5p_mfc_set_dec_stream_buffer_v5(ctx, 0, 0, 0);
|
|
|
dev->curr_ctx = ctx->num;
|
|
|
s5p_mfc_clean_ctx_int_flags(ctx);
|
|
|
- s5p_mfc_decode_one_frame(ctx, MFC_DEC_RES_CHANGE);
|
|
|
+ s5p_mfc_decode_one_frame_v5(ctx, MFC_DEC_RES_CHANGE);
|
|
|
}
|
|
|
|
|
|
static int s5p_mfc_run_dec_frame(struct s5p_mfc_ctx *ctx, int last_frame)
|
|
@@ -1172,9 +1194,9 @@ static int s5p_mfc_run_dec_frame(struct s5p_mfc_ctx *ctx, int last_frame)
|
|
|
/* Get the next source buffer */
|
|
|
temp_vb = list_entry(ctx->src_queue.next, struct s5p_mfc_buf, list);
|
|
|
temp_vb->flags |= MFC_BUF_FLAG_USED;
|
|
|
- s5p_mfc_set_dec_stream_buffer(ctx,
|
|
|
- vb2_dma_contig_plane_dma_addr(temp_vb->b, 0), ctx->consumed_stream,
|
|
|
- temp_vb->b->v4l2_planes[0].bytesused);
|
|
|
+ s5p_mfc_set_dec_stream_buffer_v5(ctx,
|
|
|
+ vb2_dma_contig_plane_dma_addr(temp_vb->b, 0),
|
|
|
+ ctx->consumed_stream, temp_vb->b->v4l2_planes[0].bytesused);
|
|
|
spin_unlock_irqrestore(&dev->irqlock, flags);
|
|
|
index = temp_vb->b->v4l2_buf.index;
|
|
|
dev->curr_ctx = ctx->num;
|
|
@@ -1184,7 +1206,7 @@ static int s5p_mfc_run_dec_frame(struct s5p_mfc_ctx *ctx, int last_frame)
|
|
|
mfc_debug(2, "Setting ctx->state to FINISHING\n");
|
|
|
ctx->state = MFCINST_FINISHING;
|
|
|
}
|
|
|
- s5p_mfc_decode_one_frame(ctx, last_frame);
|
|
|
+ s5p_mfc_decode_one_frame_v5(ctx, last_frame);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1210,7 +1232,7 @@ static int s5p_mfc_run_enc_frame(struct s5p_mfc_ctx *ctx)
|
|
|
}
|
|
|
if (list_empty(&ctx->src_queue)) {
|
|
|
/* send null frame */
|
|
|
- s5p_mfc_set_enc_frame_buffer(ctx, dev->bank2, dev->bank2);
|
|
|
+ s5p_mfc_set_enc_frame_buffer_v5(ctx, dev->bank2, dev->bank2);
|
|
|
src_mb = NULL;
|
|
|
} else {
|
|
|
src_mb = list_entry(ctx->src_queue.next, struct s5p_mfc_buf,
|
|
@@ -1218,7 +1240,7 @@ static int s5p_mfc_run_enc_frame(struct s5p_mfc_ctx *ctx)
|
|
|
src_mb->flags |= MFC_BUF_FLAG_USED;
|
|
|
if (src_mb->b->v4l2_planes[0].bytesused == 0) {
|
|
|
/* send null frame */
|
|
|
- s5p_mfc_set_enc_frame_buffer(ctx, dev->bank2,
|
|
|
+ s5p_mfc_set_enc_frame_buffer_v5(ctx, dev->bank2,
|
|
|
dev->bank2);
|
|
|
ctx->state = MFCINST_FINISHING;
|
|
|
} else {
|
|
@@ -1226,7 +1248,7 @@ static int s5p_mfc_run_enc_frame(struct s5p_mfc_ctx *ctx)
|
|
|
0);
|
|
|
src_c_addr = vb2_dma_contig_plane_dma_addr(src_mb->b,
|
|
|
1);
|
|
|
- s5p_mfc_set_enc_frame_buffer(ctx, src_y_addr,
|
|
|
+ s5p_mfc_set_enc_frame_buffer_v5(ctx, src_y_addr,
|
|
|
src_c_addr);
|
|
|
if (src_mb->flags & MFC_BUF_FLAG_EOS)
|
|
|
ctx->state = MFCINST_FINISHING;
|
|
@@ -1236,13 +1258,13 @@ static int s5p_mfc_run_enc_frame(struct s5p_mfc_ctx *ctx)
|
|
|
dst_mb->flags |= MFC_BUF_FLAG_USED;
|
|
|
dst_addr = vb2_dma_contig_plane_dma_addr(dst_mb->b, 0);
|
|
|
dst_size = vb2_plane_size(dst_mb->b, 0);
|
|
|
- s5p_mfc_set_enc_stream_buffer(ctx, dst_addr, dst_size);
|
|
|
+ s5p_mfc_set_enc_stream_buffer_v5(ctx, dst_addr, dst_size);
|
|
|
spin_unlock_irqrestore(&dev->irqlock, flags);
|
|
|
dev->curr_ctx = ctx->num;
|
|
|
s5p_mfc_clean_ctx_int_flags(ctx);
|
|
|
mfc_debug(2, "encoding buffer with index=%d state=%d",
|
|
|
src_mb ? src_mb->b->v4l2_buf.index : -1, ctx->state);
|
|
|
- s5p_mfc_encode_one_frame(ctx);
|
|
|
+ s5p_mfc_encode_one_frame_v5(ctx);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1258,13 +1280,13 @@ static void s5p_mfc_run_init_dec(struct s5p_mfc_ctx *ctx)
|
|
|
temp_vb = list_entry(ctx->src_queue.next, struct s5p_mfc_buf, list);
|
|
|
s5p_mfc_set_dec_desc_buffer(ctx);
|
|
|
mfc_debug(2, "Header size: %d\n", temp_vb->b->v4l2_planes[0].bytesused);
|
|
|
- s5p_mfc_set_dec_stream_buffer(ctx,
|
|
|
+ s5p_mfc_set_dec_stream_buffer_v5(ctx,
|
|
|
vb2_dma_contig_plane_dma_addr(temp_vb->b, 0),
|
|
|
0, temp_vb->b->v4l2_planes[0].bytesused);
|
|
|
spin_unlock_irqrestore(&dev->irqlock, flags);
|
|
|
dev->curr_ctx = ctx->num;
|
|
|
s5p_mfc_clean_ctx_int_flags(ctx);
|
|
|
- s5p_mfc_init_decode(ctx);
|
|
|
+ s5p_mfc_init_decode_v5(ctx);
|
|
|
}
|
|
|
|
|
|
static void s5p_mfc_run_init_enc(struct s5p_mfc_ctx *ctx)
|
|
@@ -1275,16 +1297,16 @@ static void s5p_mfc_run_init_enc(struct s5p_mfc_ctx *ctx)
|
|
|
unsigned long dst_addr;
|
|
|
unsigned int dst_size;
|
|
|
|
|
|
- s5p_mfc_set_enc_ref_buffer(ctx);
|
|
|
+ s5p_mfc_set_enc_ref_buffer_v5(ctx);
|
|
|
spin_lock_irqsave(&dev->irqlock, flags);
|
|
|
dst_mb = list_entry(ctx->dst_queue.next, struct s5p_mfc_buf, list);
|
|
|
dst_addr = vb2_dma_contig_plane_dma_addr(dst_mb->b, 0);
|
|
|
dst_size = vb2_plane_size(dst_mb->b, 0);
|
|
|
- s5p_mfc_set_enc_stream_buffer(ctx, dst_addr, dst_size);
|
|
|
+ s5p_mfc_set_enc_stream_buffer_v5(ctx, dst_addr, dst_size);
|
|
|
spin_unlock_irqrestore(&dev->irqlock, flags);
|
|
|
dev->curr_ctx = ctx->num;
|
|
|
s5p_mfc_clean_ctx_int_flags(ctx);
|
|
|
- s5p_mfc_init_encode(ctx);
|
|
|
+ s5p_mfc_init_encode_v5(ctx);
|
|
|
}
|
|
|
|
|
|
static int s5p_mfc_run_init_dec_buffers(struct s5p_mfc_ctx *ctx)
|
|
@@ -1313,13 +1335,13 @@ static int s5p_mfc_run_init_dec_buffers(struct s5p_mfc_ctx *ctx)
|
|
|
}
|
|
|
temp_vb = list_entry(ctx->src_queue.next, struct s5p_mfc_buf, list);
|
|
|
mfc_debug(2, "Header size: %d\n", temp_vb->b->v4l2_planes[0].bytesused);
|
|
|
- s5p_mfc_set_dec_stream_buffer(ctx,
|
|
|
+ s5p_mfc_set_dec_stream_buffer_v5(ctx,
|
|
|
vb2_dma_contig_plane_dma_addr(temp_vb->b, 0),
|
|
|
0, temp_vb->b->v4l2_planes[0].bytesused);
|
|
|
spin_unlock_irqrestore(&dev->irqlock, flags);
|
|
|
dev->curr_ctx = ctx->num;
|
|
|
s5p_mfc_clean_ctx_int_flags(ctx);
|
|
|
- ret = s5p_mfc_set_dec_frame_buffer(ctx);
|
|
|
+ ret = s5p_mfc_set_dec_frame_buffer_v5(ctx);
|
|
|
if (ret) {
|
|
|
mfc_err("Failed to alloc frame mem\n");
|
|
|
ctx->state = MFCINST_ERROR;
|
|
@@ -1328,7 +1350,7 @@ static int s5p_mfc_run_init_dec_buffers(struct s5p_mfc_ctx *ctx)
|
|
|
}
|
|
|
|
|
|
/* Try running an operation on hardware */
|
|
|
-void s5p_mfc_try_run(struct s5p_mfc_dev *dev)
|
|
|
+void s5p_mfc_try_run_v5(struct s5p_mfc_dev *dev)
|
|
|
{
|
|
|
struct s5p_mfc_ctx *ctx;
|
|
|
int new_ctx;
|
|
@@ -1373,11 +1395,13 @@ void s5p_mfc_try_run(struct s5p_mfc_dev *dev)
|
|
|
break;
|
|
|
case MFCINST_INIT:
|
|
|
s5p_mfc_clean_ctx_int_flags(ctx);
|
|
|
- ret = s5p_mfc_open_inst_cmd(ctx);
|
|
|
+ ret = s5p_mfc_hw_call(dev->mfc_cmds, open_inst_cmd,
|
|
|
+ ctx);
|
|
|
break;
|
|
|
case MFCINST_RETURN_INST:
|
|
|
s5p_mfc_clean_ctx_int_flags(ctx);
|
|
|
- ret = s5p_mfc_close_inst_cmd(ctx);
|
|
|
+ ret = s5p_mfc_hw_call(dev->mfc_cmds, close_inst_cmd,
|
|
|
+ ctx);
|
|
|
break;
|
|
|
case MFCINST_GOT_INST:
|
|
|
s5p_mfc_run_init_dec(ctx);
|
|
@@ -1409,11 +1433,13 @@ void s5p_mfc_try_run(struct s5p_mfc_dev *dev)
|
|
|
break;
|
|
|
case MFCINST_INIT:
|
|
|
s5p_mfc_clean_ctx_int_flags(ctx);
|
|
|
- ret = s5p_mfc_open_inst_cmd(ctx);
|
|
|
+ ret = s5p_mfc_hw_call(dev->mfc_cmds, open_inst_cmd,
|
|
|
+ ctx);
|
|
|
break;
|
|
|
case MFCINST_RETURN_INST:
|
|
|
s5p_mfc_clean_ctx_int_flags(ctx);
|
|
|
- ret = s5p_mfc_close_inst_cmd(ctx);
|
|
|
+ ret = s5p_mfc_hw_call(dev->mfc_cmds, close_inst_cmd,
|
|
|
+ ctx);
|
|
|
break;
|
|
|
case MFCINST_GOT_INST:
|
|
|
s5p_mfc_run_init_enc(ctx);
|
|
@@ -1440,7 +1466,7 @@ void s5p_mfc_try_run(struct s5p_mfc_dev *dev)
|
|
|
}
|
|
|
|
|
|
|
|
|
-void s5p_mfc_cleanup_queue(struct list_head *lh, struct vb2_queue *vq)
|
|
|
+void s5p_mfc_cleanup_queue_v5(struct list_head *lh, struct vb2_queue *vq)
|
|
|
{
|
|
|
struct s5p_mfc_buf *b;
|
|
|
int i;
|
|
@@ -1454,3 +1480,250 @@ void s5p_mfc_cleanup_queue(struct list_head *lh, struct vb2_queue *vq)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void s5p_mfc_clear_int_flags_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ mfc_write(dev, 0, S5P_FIMV_RISC_HOST_INT);
|
|
|
+ mfc_write(dev, 0, S5P_FIMV_RISC2HOST_CMD);
|
|
|
+ mfc_write(dev, 0xffff, S5P_FIMV_SI_RTN_CHID);
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_dspl_y_adr_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ return mfc_read(dev, S5P_FIMV_SI_DISPLAY_Y_ADR) << MFC_OFFSET_SHIFT;
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_dec_y_adr_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ return mfc_read(dev, S5P_FIMV_SI_DECODE_Y_ADR) << MFC_OFFSET_SHIFT;
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_dspl_status_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ return mfc_read(dev, S5P_FIMV_SI_DISPLAY_STATUS);
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_dec_status_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ return mfc_read(dev, S5P_FIMV_SI_DECODE_STATUS);
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_dec_frame_type_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ return mfc_read(dev, S5P_FIMV_DECODE_FRAME_TYPE) &
|
|
|
+ S5P_FIMV_DECODE_FRAME_MASK;
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_disp_frame_type_v5(struct s5p_mfc_ctx *ctx)
|
|
|
+{
|
|
|
+ /* NOP */
|
|
|
+ return -1;
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_consumed_stream_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ return mfc_read(dev, S5P_FIMV_SI_CONSUMED_BYTES);
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_int_reason_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ int reason;
|
|
|
+ reason = mfc_read(dev, S5P_FIMV_RISC2HOST_CMD) &
|
|
|
+ S5P_FIMV_RISC2HOST_CMD_MASK;
|
|
|
+ switch (reason) {
|
|
|
+ case S5P_FIMV_R2H_CMD_OPEN_INSTANCE_RET:
|
|
|
+ reason = S5P_MFC_R2H_CMD_OPEN_INSTANCE_RET;
|
|
|
+ break;
|
|
|
+ case S5P_FIMV_R2H_CMD_CLOSE_INSTANCE_RET:
|
|
|
+ reason = S5P_MFC_R2H_CMD_CLOSE_INSTANCE_RET;
|
|
|
+ break;
|
|
|
+ case S5P_FIMV_R2H_CMD_SEQ_DONE_RET:
|
|
|
+ reason = S5P_MFC_R2H_CMD_SEQ_DONE_RET;
|
|
|
+ break;
|
|
|
+ case S5P_FIMV_R2H_CMD_FRAME_DONE_RET:
|
|
|
+ reason = S5P_MFC_R2H_CMD_FRAME_DONE_RET;
|
|
|
+ break;
|
|
|
+ case S5P_FIMV_R2H_CMD_SLICE_DONE_RET:
|
|
|
+ reason = S5P_MFC_R2H_CMD_SLICE_DONE_RET;
|
|
|
+ break;
|
|
|
+ case S5P_FIMV_R2H_CMD_SYS_INIT_RET:
|
|
|
+ reason = S5P_MFC_R2H_CMD_SYS_INIT_RET;
|
|
|
+ break;
|
|
|
+ case S5P_FIMV_R2H_CMD_FW_STATUS_RET:
|
|
|
+ reason = S5P_MFC_R2H_CMD_FW_STATUS_RET;
|
|
|
+ break;
|
|
|
+ case S5P_FIMV_R2H_CMD_SLEEP_RET:
|
|
|
+ reason = S5P_MFC_R2H_CMD_SLEEP_RET;
|
|
|
+ break;
|
|
|
+ case S5P_FIMV_R2H_CMD_WAKEUP_RET:
|
|
|
+ reason = S5P_MFC_R2H_CMD_WAKEUP_RET;
|
|
|
+ break;
|
|
|
+ case S5P_FIMV_R2H_CMD_INIT_BUFFERS_RET:
|
|
|
+ reason = S5P_MFC_R2H_CMD_INIT_BUFFERS_RET;
|
|
|
+ break;
|
|
|
+ case S5P_FIMV_R2H_CMD_ENC_COMPLETE_RET:
|
|
|
+ reason = S5P_MFC_R2H_CMD_COMPLETE_SEQ_RET;
|
|
|
+ break;
|
|
|
+ case S5P_FIMV_R2H_CMD_ERR_RET:
|
|
|
+ reason = S5P_MFC_R2H_CMD_ERR_RET;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ reason = S5P_MFC_R2H_CMD_EMPTY;
|
|
|
+ };
|
|
|
+ return reason;
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_int_err_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ return mfc_read(dev, S5P_FIMV_RISC2HOST_ARG2);
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_err_dec_v5(unsigned int err)
|
|
|
+{
|
|
|
+ return (err & S5P_FIMV_ERR_DEC_MASK) >> S5P_FIMV_ERR_DEC_SHIFT;
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_err_dspl_v5(unsigned int err)
|
|
|
+{
|
|
|
+ return (err & S5P_FIMV_ERR_DSPL_MASK) >> S5P_FIMV_ERR_DSPL_SHIFT;
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_img_width_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ return mfc_read(dev, S5P_FIMV_SI_HRESOL);
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_img_height_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ return mfc_read(dev, S5P_FIMV_SI_VRESOL);
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_dpb_count_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ return mfc_read(dev, S5P_FIMV_SI_BUF_NUMBER);
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_mv_count_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ /* NOP */
|
|
|
+ return -1;
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_inst_no_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ return mfc_read(dev, S5P_FIMV_RISC2HOST_ARG1);
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_enc_strm_size_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ return mfc_read(dev, S5P_FIMV_ENC_SI_STRM_SIZE);
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_enc_slice_type_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ return mfc_read(dev, S5P_FIMV_ENC_SI_SLICE_TYPE);
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_enc_dpb_count_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ return -1;
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_enc_pic_count_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ return mfc_read(dev, S5P_FIMV_ENC_SI_PIC_CNT);
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_sei_avail_status_v5(struct s5p_mfc_ctx *ctx)
|
|
|
+{
|
|
|
+ return s5p_mfc_read_info_v5(ctx, FRAME_PACK_SEI_AVAIL);
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_mvc_num_views_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ return -1;
|
|
|
+}
|
|
|
+
|
|
|
+int s5p_mfc_get_mvc_view_id_v5(struct s5p_mfc_dev *dev)
|
|
|
+{
|
|
|
+ return -1;
|
|
|
+}
|
|
|
+
|
|
|
+unsigned int s5p_mfc_get_pic_type_top_v5(struct s5p_mfc_ctx *ctx)
|
|
|
+{
|
|
|
+ return s5p_mfc_read_info_v5(ctx, PIC_TIME_TOP);
|
|
|
+}
|
|
|
+
|
|
|
+unsigned int s5p_mfc_get_pic_type_bot_v5(struct s5p_mfc_ctx *ctx)
|
|
|
+{
|
|
|
+ return s5p_mfc_read_info_v5(ctx, PIC_TIME_BOT);
|
|
|
+}
|
|
|
+
|
|
|
+unsigned int s5p_mfc_get_crop_info_h_v5(struct s5p_mfc_ctx *ctx)
|
|
|
+{
|
|
|
+ return s5p_mfc_read_info_v5(ctx, CROP_INFO_H);
|
|
|
+}
|
|
|
+
|
|
|
+unsigned int s5p_mfc_get_crop_info_v_v5(struct s5p_mfc_ctx *ctx)
|
|
|
+{
|
|
|
+ return s5p_mfc_read_info_v5(ctx, CROP_INFO_V);
|
|
|
+}
|
|
|
+
|
|
|
+/* Initialize opr function pointers for MFC v5 */
|
|
|
+static struct s5p_mfc_hw_ops s5p_mfc_ops_v5 = {
|
|
|
+ .alloc_dec_temp_buffers = s5p_mfc_alloc_dec_temp_buffers_v5,
|
|
|
+ .release_dec_desc_buffer = s5p_mfc_release_dec_desc_buffer_v5,
|
|
|
+ .alloc_codec_buffers = s5p_mfc_alloc_codec_buffers_v5,
|
|
|
+ .release_codec_buffers = s5p_mfc_release_codec_buffers_v5,
|
|
|
+ .alloc_instance_buffer = s5p_mfc_alloc_instance_buffer_v5,
|
|
|
+ .release_instance_buffer = s5p_mfc_release_instance_buffer_v5,
|
|
|
+ .alloc_dev_context_buffer = s5p_mfc_alloc_dev_context_buffer_v5,
|
|
|
+ .release_dev_context_buffer = s5p_mfc_release_dev_context_buffer_v5,
|
|
|
+ .dec_calc_dpb_size = s5p_mfc_dec_calc_dpb_size_v5,
|
|
|
+ .enc_calc_src_size = s5p_mfc_enc_calc_src_size_v5,
|
|
|
+ .set_dec_stream_buffer = s5p_mfc_set_dec_stream_buffer_v5,
|
|
|
+ .set_dec_frame_buffer = s5p_mfc_set_dec_frame_buffer_v5,
|
|
|
+ .set_enc_stream_buffer = s5p_mfc_set_enc_stream_buffer_v5,
|
|
|
+ .set_enc_frame_buffer = s5p_mfc_set_enc_frame_buffer_v5,
|
|
|
+ .get_enc_frame_buffer = s5p_mfc_get_enc_frame_buffer_v5,
|
|
|
+ .set_enc_ref_buffer = s5p_mfc_set_enc_ref_buffer_v5,
|
|
|
+ .init_decode = s5p_mfc_init_decode_v5,
|
|
|
+ .init_encode = s5p_mfc_init_encode_v5,
|
|
|
+ .encode_one_frame = s5p_mfc_encode_one_frame_v5,
|
|
|
+ .try_run = s5p_mfc_try_run_v5,
|
|
|
+ .cleanup_queue = s5p_mfc_cleanup_queue_v5,
|
|
|
+ .clear_int_flags = s5p_mfc_clear_int_flags_v5,
|
|
|
+ .write_info = s5p_mfc_write_info_v5,
|
|
|
+ .read_info = s5p_mfc_read_info_v5,
|
|
|
+ .get_dspl_y_adr = s5p_mfc_get_dspl_y_adr_v5,
|
|
|
+ .get_dec_y_adr = s5p_mfc_get_dec_y_adr_v5,
|
|
|
+ .get_dspl_status = s5p_mfc_get_dspl_status_v5,
|
|
|
+ .get_dec_status = s5p_mfc_get_dec_status_v5,
|
|
|
+ .get_dec_frame_type = s5p_mfc_get_dec_frame_type_v5,
|
|
|
+ .get_disp_frame_type = s5p_mfc_get_disp_frame_type_v5,
|
|
|
+ .get_consumed_stream = s5p_mfc_get_consumed_stream_v5,
|
|
|
+ .get_int_reason = s5p_mfc_get_int_reason_v5,
|
|
|
+ .get_int_err = s5p_mfc_get_int_err_v5,
|
|
|
+ .err_dec = s5p_mfc_err_dec_v5,
|
|
|
+ .err_dspl = s5p_mfc_err_dspl_v5,
|
|
|
+ .get_img_width = s5p_mfc_get_img_width_v5,
|
|
|
+ .get_img_height = s5p_mfc_get_img_height_v5,
|
|
|
+ .get_dpb_count = s5p_mfc_get_dpb_count_v5,
|
|
|
+ .get_mv_count = s5p_mfc_get_mv_count_v5,
|
|
|
+ .get_inst_no = s5p_mfc_get_inst_no_v5,
|
|
|
+ .get_enc_strm_size = s5p_mfc_get_enc_strm_size_v5,
|
|
|
+ .get_enc_slice_type = s5p_mfc_get_enc_slice_type_v5,
|
|
|
+ .get_enc_dpb_count = s5p_mfc_get_enc_dpb_count_v5,
|
|
|
+ .get_enc_pic_count = s5p_mfc_get_enc_pic_count_v5,
|
|
|
+ .get_sei_avail_status = s5p_mfc_get_sei_avail_status_v5,
|
|
|
+ .get_mvc_num_views = s5p_mfc_get_mvc_num_views_v5,
|
|
|
+ .get_mvc_view_id = s5p_mfc_get_mvc_view_id_v5,
|
|
|
+ .get_pic_type_top = s5p_mfc_get_pic_type_top_v5,
|
|
|
+ .get_pic_type_bot = s5p_mfc_get_pic_type_bot_v5,
|
|
|
+ .get_crop_info_h = s5p_mfc_get_crop_info_h_v5,
|
|
|
+ .get_crop_info_v = s5p_mfc_get_crop_info_v_v5,
|
|
|
+};
|
|
|
+
|
|
|
+struct s5p_mfc_hw_ops *s5p_mfc_init_hw_ops_v5(void)
|
|
|
+{
|
|
|
+ return &s5p_mfc_ops_v5;
|
|
|
+}
|