From 0b1d56559cc5eaeb9bef0c08bb02f13772731bd9 Mon Sep 17 00:00:00 2001 From: Nanxin Qin Date: Tue, 12 Dec 2017 21:21:48 +0800 Subject: [PATCH] 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: Ie0c2590d0547d44a97119737cd784f950d3d1b77 Signed-off-by: Nanxin Qin --- .../common/firmware/firmware_type.c | 1 + .../common/firmware/firmware_type.h | 1 + .../decoder/h264_multi/vmh264.c | 35 +++++++++++++++++- .../stream_input/amports/amstream.c | 4 +- firmware/video/video_ucode.bin | Bin 424704 -> 429568 bytes 5 files changed, 38 insertions(+), 3 deletions(-) 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..d8eb28b12d32 100644 --- a/drivers/amlogic/media_modules/common/firmware/firmware_type.h +++ b/drivers/amlogic/media_modules/common/firmware/firmware_type.h @@ -20,6 +20,7 @@ enum firmware_type_e { VIDEO_DEC_H264_4k2K_SINGLE, VIDEO_DEC_H264_MVC, VIDEO_DEC_H264_MULTI, + VIDEO_DEC_H264_MULTI_MMU, VIDEO_DEC_HEVC, VIDEO_DEC_HEVC_MMU, VIDEO_DEC_VP9, 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 08a3f302b4cb573c1a6bf1eb4250d926ef0ef7ca..0d748ae2a3f6341fdf4e22d010a53365ef4544eb 100644 GIT binary patch delta 2745 zcmb`JdrVtZ9LLW+y*;-rWjx0y!>t3F@CbcCJ02PAB4i*8Qg9<~t}f?TDE!vS$4QH;UXKt!h(&?rO+?BN`a1PO6EOklDJE+l&T8t@PIkM1Vzz31HD z`JC_X)l=pl8PgtOmfxLQ8tV9NrM*a&Gk)*Qxl+HN;l8~~k!NemhcA8cAzExyO`p;( z{B|Wj;JDQ%b0+le5BDBxt41PknSMFP!-1j;6l$Vp3LEXij26?BtOprYvk*X5GT9bi$C? zqdRBISkyG?-zs{~XkG-*6AEZ4=Wgbtr|H3Y1X9mWTZ$jT4pvSSS|Lf0ibbuk70TI2fsQII z(Iq6Pb*vu|$eIKZ+KjSNxh77oNlMn}lH=m#acWHha9u82_Yi;@0CEOY2W=DeYQie~ zg@DXS+ayX2h0M4uBwPt0{W+VhI4$COfD|C9h&`-`u&pR&Q9l`vYKTo-8YLBjUUXl? zAkM&MD+?fZlfA4QfQ*L*|IBRy{!4Xx+$eg|V*k zwTdF6u})c1QMIbRwnRmUXSIjP3ZgmYw zBL*>IKmvT{9QVKx8f_k>Q4nAdO*uJ%LJ?{IY{7HpVEhG=_8_456$7}#%g%Qj0xSX$ zPH`MGIW{UR;~Zjx5BE4lyM@?o2df=(LJo)ka0=T;0y03(Ab-4%FD^n(=oG;?#hCGS zZVwnVCEbD#M_Y9TiwPT zi1VB4{<-Q~f`&96Z+UR)wYX$~LBoUNsT8cvQ7MjG7zMoQcyRKyxL$!_2ah@)XWg;u zYS0q>!?m)S+XJM5ug`egU5ES8V;oM#s=D36rbs~+Rr&UQ5<68)k-ge!8g`YT&{n+VBS8v0ri#Yn+Zj5{}OWSpJ6Cynfd+DYO< z{|7#3myBXMB{VWgEwhoxL@*XZ6xvE~mg7;VG=Q6=q|rCT2-G$>jx^4Q*p7UKj7vpQ zFS-{|G(%-Q--4(aM#32zq?{!-8ma7%Xrz4+AIdRme0u$Bmd>d-Dh8ix-YE>_-54fm zRxuP+0K_7Hd?bAfq%l?qsRD^}JnS5MXGA%UFD{Mq`5v#Q)EottF)JI8_nAT=joDFTwdM&pe(I;3>g&Y8%NDD}c0 ze=g*FU;E(K*)N=~*3;IXP`xY{=DMjuyujy=mzIe036FTeW1Btd&+r?cI&B-q*e$f| zFVF4v1xmj)l_zrrynk_C$1-cah4U7X5GFtU6E%X`i`UB=%w9UFQg5q)8kCJ3ce?QA3ykr~`sM>7M)O{_N zh@IhDEl(Fi!}R;^Y_XF?^dp!Ka81tB_hWJ}o4ik7iHX5z`acggX-1>T|Mc6K4y0~w zGuXv4S%FbxvxDhL`^}skA&k`Wsv+ZM#_pIxY8v;CQsX8dMZ~s3#@LCJxemoR7AAtm z84^q;?T}<*$he(xIuk+P5-`t!fdOis0pm6<=2%Apz9nFs0kUzv%&~@)8HeJ!28vy$ zfb6=%%(05pa-9j|c9v(%krW0V!nYvvG+8J$4_Kri;x>mRmQX$;5Vt7C-KW?%l*kBT zrCwwJ6LKjlr3o1k7eM27P;4B+vlfioIexSLQDCt#Y_OOn&89Hffk|Mxg$$c2fy8J; zuwdwb)gRmB*ygY>p4~oIiOoim`@jOO2DS