decoder: fixed the issure of the h264 4k source can not playback.

PD#156749: add the h264 mmu fw and update the ucode bin.

Change-Id: Icd1ecaedd9276281dd68da4c5e4624b6e9a32d2c
Signed-off-by: Nanxin Qin <nanxin.qin@amlogic.com>
This commit is contained in:
Nanxin Qin
2017-12-21 19:48:49 +08:00
committed by Dongjin Kim
parent 38d5f13777
commit 5cb7626bc3
5 changed files with 38 additions and 3 deletions

View File

@@ -17,6 +17,7 @@ static const struct type_name_s type_name[] = {
{VIDEO_DEC_H264_4k2K_SINGLE, "h264_4k2k_single"},
{VIDEO_DEC_H264_MVC, "h264_mvc"},
{VIDEO_DEC_H264_MULTI, "h264_multi"},
{VIDEO_DEC_H264_MULTI_MMU, "h264_multi_mmu"},
{VIDEO_DEC_HEVC, "hevc"},
{VIDEO_DEC_HEVC_MMU, "hevc_mmu"},
{VIDEO_DEC_VP9, "vp9"},

View File

@@ -27,6 +27,7 @@ enum firmware_type_e {
VIDEO_ENC_H264,
VIDEO_ENC_JPEG,
VIDEO_PACKAGE,
VIDEO_DEC_H264_MULTI_MMU,
FIRMWARE_MAX
};

View File

@@ -686,6 +686,7 @@ struct vdec_h264_hw_s {
u32 cfg_param4;
int valve_count;
struct firmware_s *fw;
struct firmware_s *fw_mmu;
};
@@ -4610,6 +4611,31 @@ static s32 vh264_init(struct vdec_h264_hw_s *hw)
memcpy((u8 *) hw->mc_cpu_addr + MC_OFFSET_MAIN + 0x3000,
fw->data + 0x5000, 0x1000);
if (mmu_enable) {
int fw_mmu_size = 0x1000 * 16;
struct firmware_s *fw_mmu = NULL;
pr_debug("start load mmu fw ...\n");
fw_mmu = vmalloc(sizeof(struct firmware_s) + fw_mmu_size);
if (IS_ERR_OR_NULL(fw_mmu))
return -ENOMEM;
size = get_firmware_data(VIDEO_DEC_H264_MULTI_MMU,
fw_mmu->data);
if (size < 0) {
pr_err("get mmu fw fail.\n");
vfree(fw_mmu);
return -1;
}
ret = amhevc_loadmc_ex(VFORMAT_HEVC,
NULL, fw_mmu->data);
fw_mmu->len = size;
hw->fw_mmu = fw_mmu;
}
if (ret < 0) {
dpb_print(DECODE_ID(hw), PRINT_FLAG_ERROR,
"264 load orignal firmware error.\n");
@@ -4758,6 +4784,11 @@ static int vh264_stop(struct vdec_h264_hw_s *hw)
vfree(hw->fw);
hw->fw = NULL;
if (mmu_enable) {
vfree(hw->fw_mmu);
hw->fw_mmu = NULL;
}
dpb_print(DECODE_ID(hw), 0,
"%s\n",
__func__);
@@ -4946,8 +4977,8 @@ result_done:
READ_VREG(VLD_MEM_VIFIFO_RP));
vdec_vframe_dirty(hw_to_vdec(hw), hw->chunk);
amvdec_stop();
if (mmu_enable)
amhevc_stop();
//if (mmu_enable)
//amhevc_stop();
} else if (hw->dec_result == DEC_RESULT_AGAIN) {
/*
stream base: stream buf empty or timeout

View File

@@ -603,8 +603,10 @@ static int video_port_init(struct port_priv_s *priv,
priv->vdec->sys_info->width) > 1920*1088) {
pbuf->for_4k = 1;
if (get_cpu_type() >= MESON_CPU_MAJOR_ID_TXLX
&& port->vformat == VFORMAT_H264)
&& port->vformat == VFORMAT_H264) {
amports_switch_gate("clk_hevc_mux", 1);
vdec_poweron(VDEC_HEVC);
}
} else {
pbuf->for_4k = 0;
}

Binary file not shown.