From 040fa9e2fe4873442f936cd16728814447170882 Mon Sep 17 00:00:00 2001 From: Hui Zhang Date: Fri, 20 Jul 2018 15:34:09 +0800 Subject: [PATCH] media_module: add 265 non-mmu ucode support PD#170347: vh265: for multi-instances application . double write will be set to 0x10 for memory saving , (double write only mode), it must run under non-mmu mode. so add non-mmu ucode to support it. ucode gerrit: 48398 Change-Id: I70d9c2186ceb03fb3eff28478548da571d265b4c Signed-off-by: Hui Zhang --- .../frame_provider/decoder/h265/vh265.c | 22 ++++-------------- firmware/video/video_ucode.bin | Bin 832512 -> 870144 bytes 2 files changed, 5 insertions(+), 17 deletions(-) mode change 100644 => 100755 firmware/video/video_ucode.bin diff --git a/drivers/amlogic/media_modules/frame_provider/decoder/h265/vh265.c b/drivers/amlogic/media_modules/frame_provider/decoder/h265/vh265.c index 229a0ae1ef37..e34227fbe55c 100644 --- a/drivers/amlogic/media_modules/frame_provider/decoder/h265/vh265.c +++ b/drivers/amlogic/media_modules/frame_provider/decoder/h265/vh265.c @@ -9055,13 +9055,8 @@ static s32 vh265_init(struct hevc_state_s *hevc) #endif if (hevc->mmu_enable) { - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_G12A) { - size = get_firmware_data(VIDEO_DEC_HEVC, fw->data); - hevc_print(hevc, 0, "vh265 ucode loaded!\n"); - } else { - size = get_firmware_data(VIDEO_DEC_HEVC_MMU, fw->data); - hevc_print(hevc, 0, "vh265 mmu ucode loaded!\n"); - } + size = get_firmware_data(VIDEO_DEC_HEVC_MMU, fw->data); + hevc_print(hevc, 0, "vh265 mmu ucode loaded!\n"); } else { size = get_firmware_data(VIDEO_DEC_HEVC, fw->data); hevc_print(hevc, 0, "vh265 ucode loaded!\n"); @@ -9102,10 +9097,7 @@ static s32 vh265_init(struct hevc_state_s *hevc) pr_info ("tee load ok"); if (hevc->mmu_enable) { - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_G12A) - ret = tee_load_video_fw((u32)VIDEO_DEC_HEVC, 0); - else - ret = tee_load_video_fw((u32)VIDEO_DEC_HEVC_MMU, 0); + ret = tee_load_video_fw((u32)VIDEO_DEC_HEVC_MMU, 0); } else ret = tee_load_video_fw((u32)VIDEO_DEC_HEVC, 0); } else @@ -9977,12 +9969,8 @@ static void run(struct vdec_s *vdec, unsigned long mask, } if (hevc->mmu_enable) { - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_G12A) - loadr = amhevc_vdec_loadmc_ex(vdec, - "vh265_mc", hevc->fw->data); - else - loadr = amhevc_vdec_loadmc_ex(vdec, - "vh265_mc_mmu", hevc->fw->data); + loadr = amhevc_vdec_loadmc_ex(vdec, + "vh265_mc_mmu", hevc->fw->data); } else loadr = amhevc_vdec_loadmc_ex(vdec, "vh265_mc", hevc->fw->data); diff --git a/firmware/video/video_ucode.bin b/firmware/video/video_ucode.bin old mode 100644 new mode 100755 index f2147e41d3d817650096b90412c1e08e9e8de4df..f936aa56a7d6324e7ffd4344e16d7325e565494b GIT binary patch delta 13366 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 delta 11027 zcmd^_dsr3K-pALPHJ3fZfZSD3+<=OTAQ0hQM?L1HLQ&JwqiI@}cEC%T`Gzbg3$2hG z-@Woih<7VBb}?qAqh)}Wns&_0OgrU0uN})9o!{&k6||?0J@WqZ@;p9kubJ8F@>{>} zXTED~X~DhpSW1q^{r=oDLuc*Z|I?u*@2rg(yZFPAd(J-+c5KGPLuYc6=hc7ryE7+o z$AH6gUzq$*-h@HzdiEb2+xB2=$od&t<-RpLH*LuJG$wv*QrCZ9X`Z((HSa)&%x_=* z)%+~1a^JF7lgAEA3R&>&kqF}dXdQLryVKW_Xkqk<0eyZR`RUvPFF&^Y`9?XJd4uMi z{rd57{@4CFW>D7O+)Y3EV((cNl=b=O$rlQHz5Q$Uy_2sry0kyH@MM>FD=#fMP;uz^ zr{b5#*8H%p=-Uq5ri7A=Wvfm*UK-PF|B>k3_r3eb zcl^Lzflb{5-q_Mh$Q;6cj2ao-w|m9$@6szjmvZZH>iyli^hKpAdTsB(RZVq&{BMJM zN*RKsHf=|wrluz8K{(WZ;*(E3nUy&@aq5$gXO4y|A#DasdfeT6Ql>j4&7It~U25BQ zNp0OJNy%-H^XGi~dKIB@2;JK(Wr%mg!^zmdPb*}c!C#agspWny$yPtF3U|LB?Z$kP zaM>&YYX?+})7!3iG{*UQ$)d$U z(~w%OAihNy6;HOO63x~JmTU?ek5r2w3Zf$2YJb*-=q(m^#)5au;wu&`%yGam3YMW;1I9boYqk;U6JteI~U!4(GKT}Zsw6&t7QK@JD zLQy(T6|^#2)r$1f8Lg$sl5eQ2@SG5>KiKc-`mZ}3hald}HS5qqyN(L=-TS^G6R6^S zum1yBcjJ1c-*9d($8nhNc~5A^*&M7Qsa>@Q$MKK)3BjipaiTW}w8Ejy-WDzp%M$&v z>=TRfhhkBdthy2dFM3z))vk@U3K64`{FsR(`bJXP(idUpeWrH)5IsDsu}`VFS(g^7zeU83#2A@yX)%j zPmfL#$Of!}XKt(ys7kQV$_^GuLxK)t)ukf7B6oyhy-c(MqxYNA zL>zX7ioLpw@N?J673IyteWkk&TfbgR^emFb<4`tXk<_i@2iQl*EFSO*pOXOe+I;&O zEyQZHiCpx}DZXb=F;aWMeHSl@Su|IqW$eU!t&OM@wl9=UMIG~d)dKt;t;&cX!n6Q7Kcf>z9lG*x0j$eGFL2)w3c8E1YpdE zVz-7XZ-!rk&sO-+EA};wvTYxVjqoxn%FE>fC&2z}-UjhQoM#ODNbHaC_r|J?A_Vv= zJHY6Q!I|P{0Y7Jq*(&B>?jmBH-mEv!B z1KYh#JSwlY18%-!1-vOcwp~o%wmCt6^)vCAA-5!4XD zCM1FyHdR{=`0QJbMb2_~Y&B?0Z8exnYpOxp;HaS$s9}loojRtWWjLR z%7Tbm=tip+x3Y$^l?C3~?xsxUG=tm5-T9GKa`GRay+F`f-#B~uoU?*9fcp!{_9xvy z&~A1!h#Pw6Ug%Fcs4D`D*FURC6aw3&v*c$F!9L|mp7UT55C8->` z$i^HK(q(i`^zEA|+k8wIB%_nptI@}WI2j$gUd=czL~@9+%;Q2jhgPtS$AwI6vV;@D zAP(&_GKY!^#u|J5q|nG8dF(BwM2i*5J~}CMjxtm2OXUevlF%ZbD>GZ#*H9Z4aZ32U zh53T0D##R3-zjQEdsFf~OYLWA&dny#YQ1WCUDoj@p&Rs=`;*XzL#^2Q;o@VQdDe&; zAr7=g^4b~U1r9yUELo_rakgQ~GKPqK6nfrHC-k#kv}B+{PdU}odexGq3O(*rPwI(FBW_JLPJ5pv zo)89NYW!oU=!ZG8LJx391yoNq^eNkTQt0$wWt%qL&NiCy$Js{LK(>W*S}yDKlh741 z>8au1Eh+n8xHuBlqTvW}5RBzvR&YkhgUgp56Q6}88$VKvWcg=>K(=6{_;=YHXD1wG zc$64dpLV=G-{{lRRLZ)H0>^B!@uS2Z!RX_fnTEEoZKK3A>x7`}aS<|&_P&v6;Z(al z)6DM1woAe)%+W^1z3}*mlb%@K5!LJDt`oel8o@o5eV;;nds)lAzsG5Zn1V@Hj_zRTm_(@NXGCqb zM-%B0QiF1aRsSCDyPyuGEJOV;oB9T6k%GR1`%tF` zp;TZeW|e+WR^_NO0e|RQsH;?jf0FEPO6UMPEs&Rj=^khws0aU~8E~EMW|?zIxPrcb zegdGqU94a(%v77qPKczpLd)TLAhcV~I!UAjr+vc4NTh(%K4h0AGC|Sq<5br~O`xT0 z*nE=4p|xzai=5|Z37ffq4CCkmc47g^9nUPw|nT4)q3Bmr2VIrczM4%_HQAlI|m zem|1VX;WAWl}roQniBh6fJ|Q*2M6Y~uCY-i3RbjXFguuqIh3t0Cha27U>IcxJn#ra zDHKKvWiKe{!z^GCnarUKRun*vu%}DN8>~SfsTWMs?A6fLa=w;m8cSSE!h_L1XaVK} ziz(&TgSe%#%s>($Xgjg0u;iV5DD0nSE+%O)S_1SD0Y?lF?Vb^)q_u=GIrV&~qXc$2 zkfep1aWJ+>Dpo|AlGzMehm&)y8B1JZLI4EQ z*^wX;#nA{R29u^7s>c$8Nv2{3LpzP3onW>sm?Uy&JKGx!&uf0{GL#V-tR{lL{Cd#d zZ^a6NV*uYOi7YLIH1#vz;M4+$A0^MR(IKRJ0A0bUGW;wt8kX8z&en&Jb{ty5E{4F8 zqZe7#GN{vqY*;7>=jeGhIh4fYnE9N#0~$ftIdgf@uA8T)sJ}s?_uK_G!?~yBaca8t z>`%_UtHp}O+25lSzDMBR9^}%V<ry7YhS0 zYu%n-$eDB5-u8SNN1rwVI`I8KcuB0&D$)uMV415(x^bu@f5?w5DI?Dt9eVTmg0W%) zsYi?h{rJWs0ox6LEbvp{HSQ|^&G=`sJ=fp>-S_gY;%b#Mb4W{Gd*V80#^VGzf2wcU z%oH|LCpj2cKZkUKB+_ra%^Xy8gE@1E>}q1mL}QEA^RWu5H`NCj^F_7;gB(GI zB1bL;Qvuf3im_E%=Vv?%@Q{1(0@js~b}i^NM~qJC(u$Sb0PN}sD)8mc3|r;sGFwJS zjAH&`tA~zay9wzOWairU6?nck1}(7YkNA(msX= z074f00CEV*UQp71u_%FbP0;{y79350n*~P=N(+vr1vje>r3FXx0Ne){Y6mPh#wULb zx1oxx64*#V)79BXzk+%-HqyN|8_^DXxYyZ;KDXFdSKbc202)DLfW~fkoJ~fw1ulbJ z=w_RY=0=;0=KD4oP0fkfI~EyR<5e~o(LxK1k78zVF$))1SiA?nVo|XUmZ#bypwHP* zG@rGhXil)9XolPlMI<;-G#`d(LA14pEhx6HKLExDOhiyxOr-sxZHtZlEhavT@An~* zJ2aVPmH*hfi4d&#CG zs$x%sko&;W-h`y~zcwW4>oz3mcpH-F6&sT1CmWL5B*QEu03^f7t&r?v9Ii`V_9Nz(+3e9@aYs*Yz5{a` zWPw2&lT$oLpD{9Y=~A7Dxx-wkhL>2Z9dUxkfI?d=<=jN@gwnIoPkR)R^a9BHEx=@u$m!`U^E@|Pgl z2Bqn;L8-Y|Ky&^c{FVjE_RTTp1Dc8K@>WiouiBb7ud!tt_*nUhqn!yBCOZdBuSrQ% zz+!mvaoZEN=x?PY{hykY)Q&+qTeP#N3Z-_GMQ!BclN|?X!P9~ybsQve93*udByt=i z1qW$;%`%J@Gp!OJ>0@d&18Fg}IwZ|+EJ*fe%{TF>LARJl4NT-FzOKB>2BiibauX~D zSjd+A{c^d@N%K?IDS?m2U?3CtSs46d0zXl9?4t(uaWmfw`zM_^3f?@zKJk#YezrKso;`?rZV!D4xnPEBIDm?Tf4;pY5pN<6uM=p$Kw3 zBz?z5qXr(blCK*Cub1j*H1A=VX?!GaJIIy9=O8Qj*3q{ZNOX&VG+VOEX?*K2;OBKN zQpZ0c@Q>U0ZV7odz0Dq`R`qal@Cbhtv{|D$N`TUgo1W~JjOQKZ94$5Cn_FldXF zj-#a8S?P8_t79n5TMQ+23?-5rLkVcK3?<^P8_H!jS!phH3}uO9DDxacIp1OB1;4-6$3?S~9-lxZqKU)LBt*zafJ+T8EMk16A^HJby<-JgxS+U9=QcZ&NzBwVzt