diff --git a/drivers/amlogic/media_modules/common/firmware/firmware_type.c b/drivers/amlogic/media_modules/common/firmware/firmware_type.c index cf5e306359bc..40a21ec6e87c 100644 --- a/drivers/amlogic/media_modules/common/firmware/firmware_type.c +++ b/drivers/amlogic/media_modules/common/firmware/firmware_type.c @@ -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"}, diff --git a/drivers/amlogic/media_modules/common/firmware/firmware_type.h b/drivers/amlogic/media_modules/common/firmware/firmware_type.h index 74c962f4cdb8..0bd842e098f3 100644 --- a/drivers/amlogic/media_modules/common/firmware/firmware_type.h +++ b/drivers/amlogic/media_modules/common/firmware/firmware_type.h @@ -27,6 +27,7 @@ enum firmware_type_e { VIDEO_ENC_H264, VIDEO_ENC_JPEG, VIDEO_PACKAGE, + VIDEO_DEC_H264_MULTI_MMU, FIRMWARE_MAX }; diff --git a/drivers/amlogic/media_modules/frame_provider/decoder/h264_multi/vmh264.c b/drivers/amlogic/media_modules/frame_provider/decoder/h264_multi/vmh264.c index cb5d128d6b08..402b3e9a454e 100644 --- a/drivers/amlogic/media_modules/frame_provider/decoder/h264_multi/vmh264.c +++ b/drivers/amlogic/media_modules/frame_provider/decoder/h264_multi/vmh264.c @@ -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 diff --git a/drivers/amlogic/media_modules/stream_input/amports/amstream.c b/drivers/amlogic/media_modules/stream_input/amports/amstream.c index 894f3aad8b5f..ef7b1f0f8a50 100644 --- a/drivers/amlogic/media_modules/stream_input/amports/amstream.c +++ b/drivers/amlogic/media_modules/stream_input/amports/amstream.c @@ -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; } diff --git a/firmware/video/video_ucode.bin b/firmware/video/video_ucode.bin index 08a3f302b4cb..0d748ae2a3f6 100644 Binary files a/firmware/video/video_ucode.bin and b/firmware/video/video_ucode.bin differ