mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-11 05:17:10 +09:00
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:
@@ -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"},
|
||||
|
||||
@@ -27,6 +27,7 @@ enum firmware_type_e {
|
||||
VIDEO_ENC_H264,
|
||||
VIDEO_ENC_JPEG,
|
||||
VIDEO_PACKAGE,
|
||||
VIDEO_DEC_H264_MULTI_MMU,
|
||||
FIRMWARE_MAX
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
Reference in New Issue
Block a user