From d3cbebf2c5f9f9c694f5a329e3e3d5024f53fcf8 Mon Sep 17 00:00:00 2001 From: amazingfate Date: Wed, 26 Jul 2023 01:02:02 +0800 Subject: [PATCH] Add Hinlink H88K platform --- configs/h88k.conf | 3 + .../Platform/Hinlink/Drivers/LogoDxe/Logo.bmp | Bin 0 -> 504138 bytes .../Platform/Hinlink/Drivers/LogoDxe/Logo.c | 144 ++++++++ .../Platform/Hinlink/Drivers/LogoDxe/Logo.idf | 10 + .../Hinlink/Drivers/LogoDxe/LogoDxe.inf | 48 +++ .../Hinlink/H88K/AcpiTables/AcpiTables.inf | 71 ++++ .../Platform/Hinlink/H88K/AcpiTables/Dsdt.asl | 37 ++ .../Hinlink/H88K/H88K.Modules.fdf.inc | 13 + edk2-rockchip/Platform/Hinlink/H88K/H88K.dsc | 85 +++++ .../RockchipPlatformLib/RockchipPlatformLib.c | 317 ++++++++++++++++++ .../RockchipPlatformLib.inf | 41 +++ 11 files changed, 769 insertions(+) create mode 100644 configs/h88k.conf create mode 100644 edk2-rockchip/Platform/Hinlink/Drivers/LogoDxe/Logo.bmp create mode 100644 edk2-rockchip/Platform/Hinlink/Drivers/LogoDxe/Logo.c create mode 100644 edk2-rockchip/Platform/Hinlink/Drivers/LogoDxe/Logo.idf create mode 100644 edk2-rockchip/Platform/Hinlink/Drivers/LogoDxe/LogoDxe.inf create mode 100644 edk2-rockchip/Platform/Hinlink/H88K/AcpiTables/AcpiTables.inf create mode 100755 edk2-rockchip/Platform/Hinlink/H88K/AcpiTables/Dsdt.asl create mode 100644 edk2-rockchip/Platform/Hinlink/H88K/H88K.Modules.fdf.inc create mode 100644 edk2-rockchip/Platform/Hinlink/H88K/H88K.dsc create mode 100644 edk2-rockchip/Platform/Hinlink/H88K/Library/RockchipPlatformLib/RockchipPlatformLib.c create mode 100644 edk2-rockchip/Platform/Hinlink/H88K/Library/RockchipPlatformLib/RockchipPlatformLib.inf diff --git a/configs/h88k.conf b/configs/h88k.conf new file mode 100644 index 000000000..cb71fdc4c --- /dev/null +++ b/configs/h88k.conf @@ -0,0 +1,3 @@ +DSC_FILE=edk2-rockchip/Platform/Hinlink/H88K/H88K.dsc +PLATFORM_NAME=H88K +SOC=RK3588 diff --git a/edk2-rockchip/Platform/Hinlink/Drivers/LogoDxe/Logo.bmp b/edk2-rockchip/Platform/Hinlink/Drivers/LogoDxe/Logo.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9c393fd5d2fdeba7a667d7505463f835f017e2c7 GIT binary patch literal 504138 zcmeEv2VfM%{{QXnwKPKSAWi9AMd=-B(tGcrcao6adoE%_?C+`XS)O7=5tJf`iay1L z(tA%YfWH6l|C!yp%O$zH?CvGul6==O?Cs9Z&U|L}GvE2ncfK=t?5Ot*8g?Y&|6u%| z%V{*@@js_&$S!O4?KEgwchQLdix1^NhldUsK6cEw(WA!>95|?9gGT74 z1ynFk{dHxnU&{AAMWC4YTjXb{87mUI#E()RR~JEgk4~pszkcJ#AAb7h?`N-H&dkZY zotJYbKks&a-kn=FGf$s7x9gM7{FbdS8oWUA(j)3#SMsS61ufqTB{N`q#o@a#j$ukF zw?5jnYrlQ_j;{|NIe+%bt?M~CnRjxt?w}sCGxM)py7B$dA6|O#<(@qs1o@+wa!P_C z7X~Xdwihb`6Pr8~eRW~pie8sfG>TJx2sCNZR-50qa{ zo`3%NqemTQLb`MG`|aDGbM!^T$HyPofAHY`!w2>s+Q09s1N-fVr=Nbd z2d&2eJbS2E`0BvnuMQqwv~V#8EXw-O8+3j8^xgO6f$WSsIT?RRAvg0cbI7`zD}~Iv zApEZne=}~}c%IYqoR(wScv%!-n`KCj5H9h?C!c)k^WA&CIr8mMw1Nr>NAaR>zxno& zUXO4ZLE>tZLM(`8_h-8g95@K%QI7`?AmBu*2(dQz9oqNhSNpy=F!Hfcw#AXoyLIcf zf8YME4t{;;t3wBoh`oU8JKuXB@e4V!WJ2n$pfFk?Bqa3QnakN3w?XMS8Fxzt@O*Ce z?Q2(VzOdsZPfsr%L$FfjQ@H1!d+ETwLoC>~$$f_ph++SihxfBv2No?}q%Pxjo|yR#e9Ac;h3z9({l3hc~XJ z=VTQy#BzXGMTMLKG`6hF+@V8FEx!DDHHb3`vZcc$E+(rS-LA-eG?0NP^%TY2NHCMz!fUYxd<)Y=3q;%^Qn((l2r|BrX$!Uy6kAJ-S zT2@9L8+t&f$ha#t$o%a8C7Xrk!jtsBk+;b3GUj&l6vKy)IDPUg zD|^P@g|D;6?IJkrLqnCN-^>mT4QC2^2Y}c`39s9D$pP) zkBBYvwn(t%W?7g{=3i(PkbJ_!BAlk9=q7jn{SWNJal#q{X6z zWZueq^Ivb*tXT`w3W{Dyk;@i=BHWHfQj*YcCH?OUXRnFxwNI*Lk|hhbTSl@VQUptW z@-qJ)Ye?C*KmByKBPz4V?FFo>V$IKf*t2^-27% zD%vQ`nJDCT*0UFu#r7>2%iIkQkCd5hC()1#G?GyxNB{iO?@R(Wa{>UgeVz4OgxB(^ zW~bl1aV0A*CQ*_%T*TH%Ch3+O1VnDnE0o*q*C4q4x@cu>x9!P!Pw8>Y+@1x=M`RdF zgOM7Q#O;t?O6PW_PO-L0Ya=W?*|U2eYjs77f-BHivQc~%)5h3u$;eWf%I$cm(P;em zqg~k<`S>pEztnz>u;MWJHv7)8pMI`gyDoISP9VmMa3I3-J6_C8$LyY?cZtXs*Af>( zr!yv0o-12_RKl!vl1-U zpGr@}`2y|uaT70JxQW8bsYF|Dmr9E9T5@uVMe$y=U9t=na=WeEZi6i&UT}Lvc$Cuo zmy8c$U$K1Uh4Ytl*?fT&H%BKT$m~=7A0)9eCoe8summZ%h-%4P(G?X4R8MZl2)dXW z1Ff;*xgFVfe#Z+Kj5sD+N8c2?o|pAM=%S%gi;aob3VP?Y56x#vaw<9zHZXD2c@^P9 zD>pjJgN)DL?&DR2+hLE|xl^~_em+rbqQnU-CAl4<2)dgF^&5zTuY1PrXpMTkAt@o{ z`c)WcS%%N0&^v1+Vvlp@yCXmL>D|}i;KO{ z7A{zLo_3^0z z8x@h<9BD0z167>c#iywsnUqcJ=KxHR!V3j!`ViQp4x%x8BLlD6phl zdhN4u3Wir%`R~2^e!Y72F!NJvI9#+K^sC|!K!vsx?POqGP@G}R<17rdpkyw0Zbwc& z|LhCoL6l&{MrG!9k%iL#XW_BZbTWA`vtc$rOml9ZzTAM@#ZPJa^cj~gUWe*f{Mc=o zLHedj|FZJ3m|_`o$5|QqV@8j2^j)D7Y1*XOufO~bOBfsKF3vec;gXw&qE9(b)Ap{F z+jXK^qtH;qIk&U&ve8Nz=wu{Sxg*d@euQFtrfo1Eux{bGH~;;1P9|m>G4tzS?%qKo z1S=L(;2b*eEwgAXHlAepD0gm03+dLaD=b@>HIb~cNCq>1V=nmCjjXh^C$u`Uhbh@) z?&TFUB;t0d0suvY>16OJJ@nASC;mJI!%mA7r=Huls~*|VArWZo8#iuh zudgXzZbzRral)kEe?1|ZY2C?XdA4nhcIz7A`W?(lUp#+##fnu@XJ@zV(Zzd(0CBq& z`HJNBh7B8i_ucpTd9cS5tr?kZu>v>L z<95+tsd90S0OhzbqaVL;_Nqm`mBoh= zw>#~7Jb1(LN7 z7G1s92%u_OlD=K61wc{mIvISoJhyGzHY~|xmX<|`9duoi&uy zTyRhzDP&6Lc8tf_)ZU$+{`*U6YTB@&!+Ss4=g~*XCG>i@x2K19$vnF;x3dXf%no#D z-}&bse^)er3eJ?n?GqTc7fwA`z$pW{9nAoTB|+8>8#QYD;rlSYm1F2=+xG6J-^hLL z*%u9Z58DK-DbtCYAb{E-ZkOr;P?R&bb6B6Ual^*+Tj`R-UNPJb-Ttq?{FcM!%1hVD zz@!;k-}u->z0P>AnyCA7JL59J!%$=IX9p}2yDjOJa&F~zyP`Yfb}ZzdFm7_m71Nrs zm`g?8S@w|@UcmFcd-wV7o9~&F&MYNL$+;y0v!lCu`R10*{$f&vJ;l9hD)e3_2%wHE z+zu5%i8VWtr3xFTlbwv%{sD!mwM*=S;`j;UCtkUHjV+HVbiQHxSwTvde&XbIc4h&- zqgyw!As@2oEeQG6VEGuW={S+wC2kk(pd52M%-F;L&k}QH%@;jPmXscyw4<`T<;L93 zV-dk?ul`%KZ*fkEtSV7ESbcx>a=IiNy92kQF+e>&Yv$Y&$Kl{YlGtS_lycJl%FVd@ z>#;v4O_~DhAP1B7W!VfUEf*0e!tJ6zB^%9vE$tAutLJurj1Q_ukDkB%dR&yBof#rR zeuG`vPe1-Td)Dmc_cia+r_bq==NX5Ks}CgE+e+!y6M5V&t<|;ac`WsdzJpc$os3&K z8`f`tlVKMdm5Yy8Ft^L+DM8T1M8#*`gkg+xVrRf+-n{*fSN_$#dk^?oHKlB`5UB-o zOYdyy&CwB5gxqd07{fxtuUxu`mScUjjFY=rx9;rQbGY3D9nqMH*j;Sl74x_oal3~5 zeD@cysw(VUq)`LYLbH)$rM7RcQ>V`1Lr2)Wq^$wJR5Z(HE?QiG!|(k5+n?RKc88pg z+QG5+^DkirQ=Z(;UJ4_5IEF&2!y7B6?Kygj8*)1^!K&WH3zuEJm?5^$(ugtruN~W8 zW*jJLLHhRXmjOQymWsA}Qr_GSi5=c8UU(jED)a1Sz|loadBY^;pRfMQ$J9$fJR%WlPL?i9SK?wMMZ@)uxIy|Rg&8Q2%MPZ!uhb7*ue}Xgl7!lGhj-0_u_>s z262RnC(;gb(`77Z+p77q_17O4v^Z`_4_+NU@L9m zxSJVKGafD}!@I=oVw%^l-E7^ub+K35W~0K+%bD9TZ2{*k=TRKVrjh+C9-^`Vf21u! z3abF)r`D}o9sBXu()Ae3|M1`69{Ij*-MY3&`uh5U+pV=`m*LBg+mVxD!-oCv!w-3R zkk|`9D7)FPy$IdlpTD1(H+LTSV6U*oUxqJ2y}Qos7tUW4H`EaK)F`^ghv-(3sd<^g z0dgt(YYsM+1{NXKYB*ge))qEJcj5L7c-xcfza8+dS+h3%CfgdX*aCCgk4QSlU^yW^ z8Dr<7)UK%*ZohQ#GQ>+;Mk>Q*rYNa<$L%ORBX%(qayxX?pYPs_zO__hL_7cEx6{3P zJzA^=?=81u4EXK0-{$1x=H}#=Y;_KcW4!gnh-?>0;sie<#q_1 z%>7puf~ZJm3m=MxBCDG%Bwr=C9oSBsIPv0zOUw|u^ilBLH(q}etWvUBTDhHVbA#nh zf!SG9iHKvv9jgKafa4ZIX+i&NI+XJ$->mCQfBt%%q^A|NXDG(4jl3!AipIcm8|yXR#@ocPDpL9J*d95GY%2XATMN z&83>lV_j+~+%Ck$#lxgf^zrDhI1*!AxtP9i{t_lJI_@k;ZZF2J z<;m@4wM^s2jeq$5zvBFBGOr+|Dt5yEOCVh}(fGzCMhv-+Al(I<@L+dA+nTw-Z&N+j1IZOhTXnxZT>EnDL%d zZZGx;7yIe{ay#U=pO5_vVi(6R1)@&IzT6I5m-lyms5i)3>qp#PtR<8qw+nngKwx$j z^l8|g+?jC~rpT{dy}4-7;!=qnADWwRJKF=@f!uCII6wQZ17CjKsY4f0>R>a=M3t2k z0UK_Ylqc5qY&&FQBTy%MVV^&LK0l9b{UaLYVbvs>5CT+@EU;Z3vj373@Hm@%bTE76 z&fE?dvBvz%FZRKbALA5EuCZM$GVdbKHcPZDYrWI&9{%dv+O_Ml$u}8#P1m{omt()P zs$m@~@?Z(pAvvyR-Ki`#kYJ&*<91Q=z}OiEe=zyuXU?2?Zbj{++z-4&jQ=8j_X z#s;;y!NH+;O3sIWZ@C>M`|-yg+3=a^VeAVVg=J)|;_h$9PKG3RF%3DUKT= zP=ecSTyoQpNWLN2y&pchl+gjMyuT+sz{; zv44@4k6ANTow*$!01n3O+6Q~G9c)o?#dOh@>XX9pGH!=LhUsL)QosQe`-seH5atSu zEez3$yFWXCq2y%?w_{!E|6_U;^{7k%-W*_-Y5;;LHf+#Xt7XF+Yie}j<_HkC zTPp}q95`@*iQJMOd%N5&j$}Xmcu&2$klgq_z55P0*7jD7fA+kyB$+fOjYmwe4n)}wkPO-h}&)Gi}ktb*YlPx#>#qwz#Bt@!`a4# zaKh%0+y94N75h_MICuH+vEv}Y0#aLqOFeg;+rK)6UmM~_B2#<1}8RR@P zB=pAhTQG@aTY$lVSoR%e{pgt9Mcc@`M-CnB*&RM14M<;X#AfFV&R<7&?;!%Hrn1z@ zxK@%vxt%p&YcLNR%UfUAsOtda&<8#bK4(opF2CUwilLx0|?QZnuobnVv_qlc`k+{6LEMyW%U% z+^*7ZWPfwydw6Bf%E&{l!AF)uZqN9CsNx&fZmn3c64p?xcUE|~54R)Z$Un4*r%#;` zJ^O*%3q)>rM(@x^VYcY_FQ+F@oCTZI|6qY5c6QQk9e0uKFZMd*_FsSb zjfs4sz;Eqz3X5Ro_A9k()m4AC7mJ zs=;nBC&;wx0EA(JXqLAWIWa#Dz#+89#l5<{>Kld$ ztHi<~p-r~g#Hbv(-IAcDZ{NOXmY{dZSeM}d10j3Gx4C%t-090}*R0nHI&tBuNbkyf zI%^*2q+AhjQ*M`{^QD-El za*J_07(gWUBHW%2ZvVnLw_E$}5@m5mZbxpJ>Zy=etlTadnLFb40sRNE6*}SuRb|EP z7?J(s)i*HwfuW?F`YIX64Y?hKY2K{)#~*#d40oZKL0h$vqeR$Cv=hescW&Ltij7Wy zI*aGP@XBY8N}@wo$_D}Bc3WHz9{kEI9Ti!YXl>*;v0uvvpE z#E$G0=XQ86XF@wH=V3NumfK-b|0Qv|M$^B4ecZKTP z?}bhVP@s{s2_}qB#Z{#eu@}({*yjNYV$j@TR!&s2XJzE4rli4RjEl5D+-_!OYg2Tp zlL1`cAN`(9nuwyi^{+#EcT}OM%FH{bPMq!6ufOY`X&G?)SLGtNqiATKI<0Qj%-Me) zKgE`2ur1f6X=N*=TTi5Rjz%u+!jq5vwfpz$U(BnR>kZy@z$pc(W@U2wg^HX@y+_>M zpg{v^4=It`&5c|>w5Lh(pqDQB3Z+-vncG=en9l{_(MS7y`|WqEr7>>DdzVXq?TDV=D{wuPOp@`h>2Heg}_0aZY+sTL$&}CzH<9V#ViDEv=DN!Qa@g*{+=o5N_14@yS2WiZ+dkduMA!-@2Z= zVf|*-M%2!q+Sau^Zbza1a%d-0KKgcZCYeeF1?6GQ1qC28RAbsITZ0^l-o>wg*%z7R zc5r)6cFyI?S2k_j1pi3ne8#rY@A*0Ew2<3HY1yW~wk5Q`?+v$G1$dj2Pj`Lph&GuG zWG-{D%L0}ZIiO-k+>Yvi3h}pJe+RcSazJo~i4`BVSXE?oX7u>ekH^}yX;X$ZyYsyd zkSu0P*(;bggF?zOvwar4lR2}2WNVkCe!;F~p!l_3IPX3-kl=PF_I}_Q%qD}|=i3Dt zBo(k_YgRgTss&bJD6(9lm=tQQMDYZgAFRa8DA<YH4;~?dT%o_8T|Ng|b=u zAbxA+3`mvBxZRFhUG8wXa=T5w!Ou@U^;CLBdVaq69oYzbOrA$85=W-^%FF@$o|l)N zo^CRk;CY7V-3H5hd|HCrZ98k*W?#YFZZBWQ0`5e zHeI@ODVGtr%_=;|04$RbV6b&&5pK_g1Jvy7H{N)|$Hxa>P_YE*=RH9H_2`aryJdB! zEu~w}opAeq{_~&w`~u4ce;8V#&D#l1xE-|sOg3)ZaP{idTsSUcHZ!)&VEvkGPekQp zR>2>~PmX+S6cQ-gs+85rug`Ce7S# zZ|%~dgWpJ1U$mdHKF+v3Kj*JfeGXW&Jt4k-M z+>Sq>_ne%Z{rmTqy2GIJSJT}xL;&25Pk?Rv3-QKMk3~<|w{ZR}bFWmc2lE5T)}`Lb z&bTcF^BPr2pI}kTIN^3tC&Snn-@aHJSUcDWaJ?d`+wC(0$_RR2xM<;tKTp8t2Fpo0 zvLw0`U=vK%56W_qc{e+=;Pc&kx_0S`2g@2F?){w~LFIz^!JP zUNQr?^7Bukz8wIf(_}_&MT0ntaq+^HS~csIe7vlSQ+j$gu4Rb(xv*Vbm|DzEz&hN5 zxpU__ON-M$hJ5|C*E2FQ7$dQySTmMppY2p)#+{4juECjGd1w`C)~v}aGsQgEj<(pj zwJuOQIR#8^x5w>Y9r#9S(ySDPA8BFR#`XNX+Yu4r&M=XEk2NEX>(;#+9KU0sH`~}9 za!xK7+(P9g{sp&7*RT%=hOTgYjSfQg3n^l`AOH>X@!$VA{@aN^en0ug@24Dv@4h`+ zw!%!w!tDBV*UcNZZeGvC*A3s%Qn-0N9B`tY2W_X!B*Ut`N+B{I`>V z0YQkb)xo_+*&naJ_ODA9uU)!$_0q*F)^PdKRVkRST)OY7Y)sszyFSB)!Y5Chf|Diu{p0wF!-tQ&`R}(^ty;r&P@==V5tuw_ z^2;y3dho!Z-+n!Q_RP66XU?5GdHToy9^1Wp&$ew(4d_2e+>zY9%Rsp!1j+*e`(ko= zyh&77<8{_h_!2vp3UA6kQ&JXiyCmU5hG8dgqM>7(NV4%Jw7s|{DBEa5em2c9&AC;Q zY5VUeBlPSiUV&GYBf+XkbbNx!M6F39EGD9}u^ZFBNi(MvSO&YV5(}ohbSy1(Pua}{ zT_gku0YZQfAOr{jLVyq;1PB2_fDj-A2mwNX5Fi8y0YZQfAOr{jLVyq;1PB2_fDj-A z2mwNX5Fi8y0YZQfAOr{jLVyq;1PB2_fDj-A2mwNX5Fi8y0YZQfAOr{jLO=}yw#yxH zE(Iwe>rZPO+q-IBM$Zrega9Ex2$VMh%%K7cY@-O~4_(6v*m#XOT@Zi5{fZQ@S*Ez6 zpRMX=i}#Ck0Og%YN}muQ1PB2_KoJ6hhSPDpUc>7&yq06WS48(K5~FK5PRnb=3pj-X zOkVI51U>Vy!~Ce;L7s2Q*mL3ql5Qt3H&m6!@EI?x5ZDGvTD@ArMmXe>&X!F@D1Oph|5dMq1?~!qI65`?=9tv1`e}DsrrjQvn%y|AO3;L1A;pAEswV{h7D?ES`-u&b|4`3crQ~PsJLy~Z7U%cJ86=3 z2cg(S7k{=9Ux#ETq}&XRJo?0nw2)DwCbiesWMc`Yv|)BRqE(KF0TlnZt`-h@ju0RO z2!X1C0EkckA&QoZP-R2=@kmqS))778S3S2a^wapLZ+eK7?jl8()#DK97bIPNKIFaU zRzDRtxa*MSUbT6hj;Y`=#DEnJbVs7`WmTyiDhDAz2oM5l5MUy%meUw8W7*6gEa_H1 zVPSk|#F5d-x4@!hMaX5I4sJx9z0a>pm(yjQPULY z8A5;%sPqVkx@x9^VY`5G{6lqwfWd=PS3m6^`$w58Rmz;$izV3El>c1xq3!FQ4jwh; z(S~{*#CTH5RQeW51t0_n0l5e;aTXRYAak}x6m};tEZ6mK>X|h9k=Wob9!||I#+jAq zXVsO86`q`%_-#uKBu4r%3yqG93y#*@rqljn`%VpzFIQ9MF`5Fi9969UXE9JYhd zOndP{@5Y{C<7Y>Pd^sj1V}vQE5;3{+tWHU}u|DdDh?!f*H?QHz3pyC$>olI|&X^*e z4nlwsAOxx!0^-7cw&18o9b?4E-aCRmT$p^_IZsy7yO7~WrDi6C?tgA{_aO~*Mghy9 z*kFYYLVyq;1gZ`Kl2)Brs%x7W^jrHk3-RBzBH=8S3t>94lCrm)Y{Oc9dh+$qpgl2z zJGEgt8XkIh9W#+E47Rll?k^c^BhWb^KnM^5?t=i_cEJOqkHAmuQtzdu>o>=r8j+Ie z&NeV|cw14N87ViPU1gfmy}7qRz&wK&n|82xtF#F7_*Zg?WBb=~(|szFazY3Y0)&7W z0eEBSQNv@~*kK!^k3C|_Yvp+5ks`vZM3Gyk-R^73Ss(MWY3hte>U!%8JoBL-(!14I zlDM5d7(##$aDN2AR4@;LyIljPS=`O%sa2+hiI-=l+^R%`Tpn2+nUayZ=?%Yr!@VU( zIc&)mDwEBz+KTJebCTQLzo}CW34v;bfPopq2%Wt3p%bRfjXzhl_3Dax0Vty$OHNOk zGNWr94=r2Es?m!^p;~MpQi9=$+pE=ALxm*-+#dm*Mrc|?m$o!KH12qZ>ZgQp&h{PC z3Kk_@N?G^HoX*Yku%OXENrU-SY#LHrdM9po|E5kkBm}Az0#L{__vRC}eBhkrs`K3i zDL0dYKMNh$y@6im!NGZOabgG66Sr5ZuZ9Xs2)I82P{|l{eE72M)tSBJlzmOYnWrCb z+um2FgO@Q4gm~r`UYcbkZg>B7PB|n5sv82Z;0CvcOj_Q86f#b2_%Rc)KJo1K#hV8- z^@RODHhA^Gey$ef49V@)?Zct+5&~|H07wZU=<;4omL^@1BfeJWIG9}>my#am|K6nb z-X1)*dxaAk=AMA$b~kV2ls!VA8X~}^204Cs>zYqSd|jP+TYlNGV^n;=`?DYJ0Z%*F zs#RLL3M0~L*m$VOga9Gnwg@n461e+3g=hTVs#Z%-<&(MHm}y~OuIkgvQ!Dst*v?Z3 zZd=8aF+zY4sD=oL`zUeV0{`;DHFh^PwaaXDF)`spSj3S{{T|fo1rN@E%>}Dr3XQYvZBQ>6zZ04nlwsAOze80jx{q z;M#U`-*){|v*nXpv6$!=>Q}`8AD9c1Zw^nj@3kH~Pi=|%c}wqlHL%q-ucduG+^1Pn zP6&bOjsP}Rf>U2XnB3N5b=;rD7+dB~DC(p9wr?6gcjM!8H$Of%u$)7HnEuwW^Mc0C z!(ZDI>8F#wiXK5h0v?~YZ9%}4`2+Pi3p zpw(#0H3%9lb`{ifx=p=&XC>d5keca;-f=x7{P3a&>tod_{6@M(y;3F!0Yad9BLHp} zH@Vj6c_Dh$_Q@$3P8iI|t)Nw}`)IX#4vRL~eted|iEb37zfLaNM#H%j)9yt}BG|^Y z`~urgurQ2h?!6}Nq?5AaR=2c*xS&1LI@I&RvL@zPli42;%UADji%L%jxCH{33yhyU zuAfQeKG)$vU*6}b)q|JWQl2Vvz_^jGFYuc~zj4m()03}Z$dkPBje(6l4H^#v#~WGK zL+oB5U8vOK+xPcsO$J-m7d%E;!jU&XV5|9W()D19ZaaLJR&Vd2i}4Zy7JkU zGJG<$Hx)d)B&2;!cm#$^F%WxI>gJr)DcvIk2m!Z60Ng&agJD79Mdt#lqq~DsvxEEJ zuVdR3mBQ_Ai-6sXL2icyOwi<|&bhs_sX#(zdeXJz2_x!ib$SK^$?bMQrHh0BAs`C@ zNfMU+%6h;-q|P;TPi}p$tqcLRB*Vi7GHUK7ouGq4+(Gh{?=ngPr9X}9a zZTHHu_%nfh+j%c>R|hLVMej!D z6~(XE$Y6IE%xKzq8>0h1Dp_Q^S1=zvz?A#)ijZ!#wdm>4+p4IJiY+F+jSwIN+!6t{ z84z#O3W5Ebb*iVwEFMhwlx7qZ%kjFnfe#Ez&9X~brCwZ+bZJSq+AvUeXR=lb3*tk` zfVael{oZ*EAP*xnQS0fAtZCN2v9+Qr@KZiqV}hrvq5c_6JIY}6=pEAB0dD+5Mi zV2IxlQx~;SI1{lh=J!PpH}*l#tI=Ouv~U~cHwdUDE5nK)RZ zZ4UgrYaOj8qjU2?+^)D?(gTD*HA8@DQP{4X8Uv?`7&CEo;zfAt3ZJsd$Q!i0u22gg z8x{!sb+r7B<*BMY4}|!C)ClXBRP-ydGg-kAtwkAszsJ^?pRJ@V^Q4n0KWxeZ1I&k* zZwGb|w^wit((4F;%7p+p2V4Q`Yj~F(f4}cjTi=)1CVcrbdd>rWSU~(rON7+mh&*x5 z+Exmc4_2ZJjQXi}11K=ehtdqVbNo);+Q{HN){@FUc|P!sX`Ows1`42H(JuO2DJZTU zcSeWuMhFlBWrhHoFxB!x1D*EexhsaIm?uCZgFe3xD~OoKD#hdh_JQagHl)E|wbQ8+ zl5ehiw6%rWi)R4W%dGSjo=`2GOI;B!pVF-{XQkdUt=RT}rxxsvMY}wvtVMdS#8^}~ z`1C?Tpjsh-(LEN{Z0hB)CHfaDldOn4J+g@w9t>3+kSd|6pWUtQl7tJ^1Qne?nG-*8 zmZW?r$>b%k$jPLor;ro39OGy?!GCrj3aCP1H8JV>mZ80M*ghN3klbF5wM0o10+k*C zFrJa)@Anm6UiB547=!ehY3@yp?l zT@|;pRg|@PA>99C+cf2$L#BOs<1b9aH;*+j8cv#>|YrziCB>sh;%Hx_2` z20`%RbRHTESqhJesePzZrgrpMA9tdkgFTp>pw!h=uqN?*^y5Q~f)BK1#O)PRW%L$8 zpfVx=cI(zan;7u%nxs>>w)i z9Y}xkW}C(h@kM5tvI<#M zP&M-MNU;b3LZGrD07VDb7wqt0J?)N-&)S{W3kW~dwPvAUtD>kYdU(O&MLwU~#;lii zH+J$&<_;2^tK!{-kH85!*N8X7tbfB=OlX|oYj<2qx+&~H_{ta8j~Ls(p;rx_N%D9b zjL4zqXD?RLqZPi;=^1(t^r>6tMB5ft(K$-->gMPAH)h`5v0)!0csd9HLVyqu5nyt) zpwa92@DYzqaIj2rRl>%flC&W)) zfHhfC`twq5!VQ;n4ly21=|huMH2_t(3T|@neHO?_5Lg;Y#nqvW*fz6c^SF9oNyGldf*2{7K0-@Y3dK zcNQg_4-48IF+Y6W!^R%9z?=rrtqtf?1c0R_otgits8Zo^Ba~R$14w{L{*X3jeo!Y{rOV9Yf88&OnyzY&g*I*Wt5aqGe zA2Xihb+A!~+8n7$QoW+i2agCEU6WX4gPo~FFWA&oK9%tl~rWwDEzE9JFI zPY?oxfcqf;7htt@+Q?NeIN#zeWX&tyaHK9$hYGnJ%7^fY^O{&RA&zLu(e-&rS7V0s z(7|7s3wm$N!-DlNY5ahvkPxuT(Ys1shquOtX?Hfn{qfSem!BQmcUqU)jr2NDy8$|G zW`M|uUE+2{)ywqloUVaRNN{2M666*Y7rWuj1_rofCT>?$0~DDMsLBYy%6evZua$9s zmgF?sD}liWnu?|>pm!DA4t@3FN4wi5sOWq_(&deQ|J3s?X=Rul38&F(I0MJMIb$gH z>{FBnM4p>`d2{@qQPJOqZ+tUy^vJQTJnCsV$nNTtA$W|bWd!}^1<6WtQY`-Lq|1wX zG{kf>?0lHquBM8rawDg*5dzf;0dNb5UC-$gru+4_%qJEj4eQVO2^U5*6%0%_5Aslq z6Q1ec+-Gk5xh|%BYnt*;9yR5y-MYWF4t6Wb-)+gP^rU3eXc{-AuksZ`wi!l2R>d5T zn6=gbC5^gORZL?K)sBAi(19b=`rAR49!t$0n3@x|DAG$1^iVuu9Kj6U=^z9Mf$E5W zM061GI{9i-0^VPjaArzMhAnp$JI6HZ@?JeX1g48nq0a>;H}lX21@AAGto)xrkw+hH z2(`U>Znsu5k_heBVs_ExxAJph8#6ZeleWHC--;xaXN++>m{>cvv+w%&Q}^4O#kPHy zlk>4Dx3&kp)w?lh9SFf-hN+0G<)srsfDouY2r$8p(|GWFU?1-liRV`(U0f`hh&Un; z7!8I@^n=D51AjF%hIKkTAG${Ubn4^DxBPmwC@Xn%SPP?n-0zMGEC2eWr0cUf)MS{b zIK<^fsD`e!_5R`C$bV_cm_t&t#;4p0daNh9ULD(Nn;j~0M2`>xgh1s-fKfm_L7T87 zzN;y}lc}ItY5M0)OP+%Qhb`&BGDw97XbgrN>t=*2-9^sIW5{0c=qY%)s5N($xte(h zp&|SGl%|QYzTNH#oYDijjYCGlS_T;cC`xgGf(VBvr;Xb1&!MT=UF=zA+I@A&iHXetO*{@?ZCI9L>v)yc}}t|A6DT%T}S<{KSF8=aC7GPDo8%V>$)RW}ZL zkPxWk2td&E;Dp$P3Y?iNOu9I?lg0=pQa+i=X81V1v7ikL`O*{&<0oD!&Y#s~>}Ntb$l@#ji?m-7g4FB7}` zXAyA1CfZz(f%KaXE*w#Izs@bi4@>IgFb4M=nP{r*K^>rGUr)z^& ztDjEoU@BNSXrvx~W!M&fpi=b*xP53#uPtRUow_37{G86UF`QA&?dbTr)b>~%{R;$d zE7~efdYN(~!VYz=r8lyX73pNuHxGJ}5U8{Wz@sleqf>pqxHE8sD3eC8*H6gwHEj71 zm_zBoglz$)G9fcJs@8;HwUPfcc#_AMgL&>!ng!eVpws4hE;`^tnPqnpZEEt3h@tnp z!tE$aU7aCp%T8A&BalPL?a{Hv7Wb%&1y#iDw$)ANgg`Yx07?lxZwMVXRld+Jk=wd; z?|Q?&MmbDOj>L4T0Jn$t4Nu8*LY2;M#jSYSgG~Z6yKv>XD0~9k4nHs({nYzTx8`$n zYUZ|iThMK(mfJD$;mH|Hb2dL{%Cjb`?gUQqV10zCZjiR+2g|tI%Ee~l9>bBXjo{V(IpS>=$ClDSmG*v z#;tp;7O%$^Rcr+lal0+fbWR9Vbp*gb9cpN!l}~FfjXyP_m5&;oj0MtGKK#0fqbev% zdSq?lg{LPzHl&3P`}DyVqYvA#58L)J3R5JZg4?ycu<{Y@$dq)|nUNlZ#s0>~pB`!G z0aF<^WvqtXIe58Q*3ENj(lr+|gU6#n_jPaJh1m_zJ8`?E-O;~BtHBe#SZiUr@*F>*=-j((B52fY?gntt`d0F4a2CWVbcfsz8=P{Yap6B~F z_uLw#zN4|CHzn!%@`qZ$4Wm&bXjO4LmKzOdVuW7>YnrN0*2f-S_HYy8c59QP6GEW+ zAOLO;9r?HlM~Lmx3Q|Tr1m%Njte{DWow*h+b5(Pf^kBc#>?gLo6)|W)C%AJFts+6H zNZfpsmP01f@Rr!i=F)3mwuR1s|0f;jldRb6~6V%j{UXJ1np z7?#5p3JPOVN8v zMg}0yY<{Z=3J8bHY!-qJLVysc;s}V`&L$qQaz8Lst{WL!_869uxhU>T&sr`4)uWa! zZR^{%$(G6amYAOtm&VTPsH+V}#L#hoyu~0I(G<@x8^XZzfJVFELGOP??o(}YZ_W9- zm_Np~ss-B{W}l+)Ku?L>U^(gX2ffB7-?XNw`eb#?@ji78*lHV^84}wS)&@l<1S%f_ zAT)@TV39Fx4f7M!tZ;`mI4bt1ne9B-5_?f+trP_?YHi*Sy#C*+iObQ0n4d-V{9;c$ zJ$2Ub<~6+q99l-TqG|%{$y6WsM+_3-gZTP3)U1d<1D9Wpl9hRVeDbYLeZcLoy;rQ0 z0fwxj;kEsm7}rGqD)Ws_qD@JI#i$eh=NFW0SP9HmKlk1a)j>rw0ddGz9jh#5FcO!#QU^ASeH9J_& zRtay;bPFAqu<2b#Ny)zsf4`Aaml+{_tKfDFFc`h_b#+|)=C|a()KSbnso7il3)s6H z{Tiudlr&F@O9)g_1R%ol2A*3#d_pHx%659z^ss<;9H|st2_*ZdY7K3agZ&69R<5Jx2g!%G2qb#-OTJo| zqd;_5&KsZ`j-S!F(agllGC5OqG`PxHo^bw|_0Na(f1sr|+a_AzVT8`S6f?pTwKMp! za{Nl@bI@n0ev$NGSm>7z_%J_aDymr;|G-c`X6%FT8{lG2U}Bmy8;*C_QYzwh71cqH z5CWAA0Ynn2cuA8lx4$_Lnms6YTcLT4X+Smf7mKBhVk@*iYG7j@)S zztDBPnl&&&Q-MXG=$POLm&x%kTU^|;{*uH?JzVzXvMBNV8VEL$;Q3VtOAdYcvf z+l+B}sVu+=Uh{^Lt?FVsxza%h5CT;l0f@{T_DD@y`J5|u)GOjnjJqETLZMk!BcsAS zZ(S{)vi{|fsjk}l$z=F(saYLO1+x+_CoN6!>sYHE`Xsi26U=FtDF0w>T~g?7nMpZ` z*4>mJFswh!>{YiS@NmDzy14NDPTnH()|Sm5*J9HlF!d*PS6w0WAR$m$5Mb*ceFbjm zmVGiQ!fv!jOu4K34u;?hdQ@C;<~m*r1CD2A%)=^IyXlwTMc6uSjrskFnTy7^_5$_6 zwNmf-WWQ@u`q`dA7TqvO~-Rj~%s>1~!`y_!(OSPp2>r67}Dp~CURj^V5RX-!b| zNqq302QY!m!3tFUI6_&~Qfxwi5V%JOFka=jR^Hn1aF@6py85K~!E7c~xxF9q0LdLj zHp{yEtdBpbn!8+l5HqKNN#~Qc?g|?@zGq!S?2u+I?u#MiCk$K4))!p}i1en0n z^2-2865HbSZQ`*a=D3U5aPe`twF!><*|hn!m!?h~oSN-oYIuB3(&c$Q8(GA5s6>>> z?Z8mS>-~EB4pqDQz*>aG@uzz?L>J0dn8~jiib)6%0+kT~4EZ5ycdIMRia%>50d*&< zqyHG(2pV_AyaBl#e$HVi*iffk6UZhFu?y;b6=E=Bx1^AeVRN`3>5A(*8JLx>Ou7^_ z@?mC-#8wS4YeIb{Im49(r{FzZLJw43FbN=cGr1TKIxTfOj!OrF~?62 zGfQYgFs@O~?dbUK(+i0K@41-IRq`a$BelZi-izn zkrR+u*x0f4((bxQV(#|%%HXe?>9ItL*~_Sq+c6TtbZXMl7#CgKFONSvp|v-0d)5A; zsdR*Zgn*UX=f|IMkrF$b^0$v4Xn=*C8g6H*9CQlvd-ormlHtk-E3pyFaS~L1u2mwN%vLOIEg|ytGo_168 zPgW98eGTC_W)T2vkA@K*h}rd|=1{*SURa^7Zw7?w6(u)gb|?(tk>z>qattO?e@c zS2Z#6OCN6il3(a-rJG~H0q!+lu;Js-O2<&ufZ zzY-Yr{rx_mcKCs$gAgDDsyG6o2nRo1-0H0^txJ^{rjw~4{P9U}D5IJ^!0oFBPa2-0 za+eS*(M?Of9<<`+8ZZjc3XP2(oBH)g-12@G*Ywra#8sU5#h)48%FC!~L<2B+jQ|&p zQB&u^4ZDiBOOI>~IoQkt&cfg;j1EG85UAn^fZJi=?!)t8o8EC zuyJ}pv9le($ogMq+@fDMuzq0d@$qW+>0TRnprN!imb$v3rw9Q;pz0xP{o0|MvDOGQA_Awa&2v-QXrGxmV|~nTl4pZ9(E zJ=%L~0>i#j?KCXh?*&gmV?Z~jJ_~BIPR|hngh0h2Aj$0pL5Q3oX z>}SmZYyc-{a5r^1>}ASbH=vgfXH+$ua*!dqOb8GH?ur1DW1*zb7#?fky(ab#=WHqG zE~MXQmxk76Q4W)o8m#HpwXLb! zGJPXRCkY9WejKe|5FOj82AU=B#@r@({LRD)mKjA`DH`#T<3s`%! zbxx#GYgMTFBNipgEx$aJC>9|=2viCLz^TE*I*v@qki${V;|wt6ri>fJ{6X3im1Uv9 zX~wko+!}LiZGx){R1<N21w)bIEw6eKfvO$O11SiP!`{ zF7`-QQ-0j66>t{@LD{A10ITv`9j#}`CYSc4j*IwaSTmg-6ROJd13@2xdrh88T>C%&kI|}jO|kvGnh*g&&}*wLj`?V;e(vLaZo2n-OgF7 z)VtV+E@p8;b^N=&U7AOd}?OE$N|tQGf`6vN&$ua zOiMT^I#jFJca=#*BlWp22Rtp;Korba^5aNX+g0a4$V`mRzVtcpK7t4kfW*j|mOY_4}!1UTB| zxG5cLgh&7A${rc8{UGb3~onI!|lALj-U(O_>N2la}uqcsUUQCA02$B ztH?*umVg90)Yip>>~&@T!N|Z*+IRu!!rVy2E{EIk3|0+vsil2k%Rk%6u)2pk&6tH@ za1n-jC|VTyMFMd-p7ZCbYD=%@A4pDSh3L^Rg z1E&vOnB3B}oJd&>oEwLIG1T-iCGzdX^O5Ub$70p{)M~EgC7d7iKojPa!E(stb}2g6 zVfpZylvPh`Oe)>C+t8G(z@dY6aI3&9I_V$;2!U#e0EY#Wx{kH9(LsA3c41#m&?%NL zC5L}GvZW{HAKB&~g(9i~U=17>KDx~(j5XgzPDq(P7iOZp)MgAT znAQyFiRJ&+G!=0>p2AQlcwx%2#Pg+gvYVrR?B9s_e?Z4=eI1<;0)#-dLO@jbYK^>* zI%7WMy;6C@Nrb+pyvI^A*9>@AC+NT{Dx8Kv^9<$o>~6I}Vt#V+BAK^RLiY54S$SCq z?wCaI@7HW*(lwc{E*TBno;rD|4ytp@p_JQEQ!zu^VguDz_Sq(@^cq%^YEpHzdM#cmng?oV!vpvFC0|d7 zKjEA`oZk)h+W`#*W@xcg2b3rZ@bZfZxm{C7tBqazvh%l;dKdbW(JAT4W5&T&1d0$H zGe;@Zb<59?6cdK&jg7kXp@&O-uagJ?5kGXU$@YF?X70*I6L_R+ZCyzCS597mTiXIY zda#xOHChH;no^i3J|RE|xE}&Abl*09h$|~}B+dy5*wqM2hBzG-*{k4o3?e*vA!y9x zt)YikC!B}keOPLyb2f8y_mR}x@CAw3(Fv>w`Bep-T5Ac4(p(!VEwnQBp z)X1P`i}l$eCPm^hWKD>*8jaq_>AUzEHw<`a$DF0l1bw_R{tT96E>AqCXkq3ixf&vQZz zfyaF4)`4x3{hkhw{2mKV;nvIvx!KYww%Ax0dumWq5IeTmb4`@xu!%M|f8gjrE=)I% zF=YqM4L9)2V_1<@O!ClSfC$>n!yoVHpn_VY-F|A-j(YHePuwmKQi??gR0{++9`?}7 z`aU$rwcW8FH01@38YwV(E*t3)sUWRdI(}elWB6lTU-S!)iTR;}yp>iXQ_}r9_++V&gn&E*nD6z5dPCg$S7Zvtb{Ph{I3-VC=_T1i=9Lbnf}~Z?`|{X-xoo6IB!eLU+b#oEmH3PQdEUV58tD!5x;IUl@Yq|+ zR;-RYZFf;EriK&eM~H&5t4lO_jm}fc1uTA2CJuI^jY!E@(%lOk4JHAUwj-w9;sjq# zyV?J9+r;7I4a<138HfMq$ykPlxdo`#=pY0L0Yab{0iY8M0qgI z#DwhDvD2Ll6KpBh?s<1pUc{(DJlo4vv22apV^=;cZ-`o&HrmDw@|2W}2hs|X0(N$* z4ZBldBhFP6t5o_)2oM6*9s#Hef(Nw^P;2E5xqVgq$?*^Pxad1wW<7w(Fy-pad3f@M zPQLmL{Tpqcw>ds!Uw>21%+z%32OS-GWN1?Z(?Yw(?O0}u@xr3+&88(?waeRbF1AR! z6TdLh$c%2(bTr^?f!D^4Xg|KF%Dq==j{lf39s*lXK-?~~Oda%k=2k+fc= zEq5BT!wNXFIp>ex$pcUV-?wO`~olddX&agz)z+8Vpciotxd#46%{j7a$ zEKrcBU8MI4fSz7K2oM653IQew^Bx-pJQ5uDn~DuP;9U11Q{JX&f!YdLLBli^%!-~7 zJp0SMw7|J7l+HY?76;sC3?DIgevcN=*SpB=BC~RyoHl90n|66y=Eddlr-wAH3vVwf z8U?y811I!ttX&>+TzVY_CR3BHtsFH)&#@_56=~8Vga9E>eGu^ExJDk_>q~>-l|?3H z6^oX*Fv^oHUAp%N)|1x2s#K-~DFf<55~f)jiWOGTPjq}MdbPq_unK5k%?b1PhI(PE z|7X%mF%U>w_k2q)`13^x-2!kG<)TLj0Yabx5P*CuXu%u`ijuW$N+?GP{CIE%ZOTP6mWa+kPahlrZVLtBgModb-;`Owv(yCu7*VyO)>R? zux-X7X-G9A@$wp2Rq|SBWXftmL8%~61VVrisEi0euK~3NJbiiV_?S5%N}am*Fy;3% z<;6xE?%U8PS!^ieu(HGquZFx1N@U8KGCHQTH3lm0@~mAzo3z_&*ZfDv!xBT@e`AM0nEwJ@_8CQj^S+sOTRS zcd3CP0HozI5t!Yl2HN`Y&-uSC69>D|QUX3|=E3GYRTpYmpDtVC|9Cp^?NJ@>Q=JGs zNC*%D)fNHFNN(-lAudj_W(M8CmeJ!S6>t^fc3(JST%Kl^v}Illi2Zf^{aD(ip4eTb_dq! z!PB=&+il2%qF6NSRlRx8AXm7(fnIoWVzV}$+KMqoQrK!JIw3#^xH|%%GSKs=HZ>AL zzW_mvNX?j)EO+J3=8YfJ)bTn26SGx_+eHJ*wf!H2N6KQ1E%PUq&8Efu8Z^_Nm)zT{ z@)`!!db8Thi!!Rm-P;i5j}RaP+z|n0egWq&AwwPti2c2jsbFYoj!Y6;7x~`~zPuJo zn5q!Bql)0MWn>%g$f%e#fR)C#0(1I($v!Po2CmBr>Qm zbFV5$QaK0#Lf~E@ASzRsVi@B4qs=|GuX}!O%5|9wn#QDL_&?HE3;R6gf1Qzg)!=t< zyMY%HmOtsrCMJs$&du&r7Y+p2hJW{}cImx@03lHA5dgRAcwuP|--M7oGN)5Vre9 zUnj&R-P#fKVeh71HQ0uDW_>$&414WK!79vGvJ;Mn^C!d{d(5YVYv^uT|Dg3I8!)-?Zs72 z#s6BbJ2@%#pp%%^TPhwApJk&Dlmiy~9=wn;dn0yta*lwLyNlz`E$&%Mw1KPwqnUf& zDk%em03qNi0+<_xjrZ8rKF@A^xwlj4ePC+t_Q5s1c>zujvE3Vj0qZ)&fD_28P6C`_ zxoz;&@Optu7}6jjR{cI5ZA}GHkB<>|9z>5p2O&TR5CZoY0meieoB;FF+v#3kzrBko ze_8T%Ob(WmQL%;Gy1=hyu6%dpvX@sceGy^9lI?+uQUeyH`7hqK$nOm&VX@yEQkc8^ z?P)9Do9;GY{_;1M`MtJw*^BEpeL5-mM#)mkzp{DR4o@DAWr*AFag(Ok69R;QEdp4U zG_9RiNYIzPQgdY*M#|^C>JT&7|C2^Ki~vX{W819goDd)c?lA&v9*`4ew5#(>;Ja{3 zULDxDY|FSd=C{5Lv3DwQ`#o;S^m;;o5U@o6dw%MeT_iuft^V09Z`_x5drV6D0H+%G zvgO9gp4zPBYbzeT9~PCisM0whKnM^5Zh`?CknqDa zuUcyNu_od4rhY9Y$(?+;yH``D+z{iyFfrxk zv+JLk-l?|aPK`wOBJGHN5CVjN8zR7QaB|+ap)q!T-6}(B>ovBIJcFbKq zpt+vou{jmi6`-X_e;%Lo^UQX@Pn;`+qd@CYS~77aI3~dbrRQ|Hxjx_2oM65 z5CNu-U>nI{XKha3s)lych{;h~KA4?&xwk2=cWM=}rJ0g+Ez z#mNUUb*zLX zr>-2=*2`Pa8acL)k|?WdVgHHkzDc{TxMk1-ga9E>MG*iWw(!(0?fp>9g7Bn}k5(p} z?qgzGvcl}7Jh)nZniEqpC7Z@MN!L=t55_KzU)85}YhUbVO%z^5+aeW<5FiA~6afP- zXnCzcFtqa3`91po+q=6Esj4^t;4}AQXJ==@MW~P=1tV=LHVR)N-2%Z6Frq+A64O2? zu+$W-S!H&&9e3IWU7xC#3PPjT3WA<{=q1)ds)wF>5b-5^+t>bQEY=61O(G(G!)4~o zaPQ2$zYFJ{`QQIJXKiQybZ_$Oz5T1toc(QlVQKxpJ3Z^RbJq{{uk1W~{p8$F?bF|$ zIyirHb8CF8Y-GdLtXAem`T9rCy)Pp`;QuR7q|}m>Vp6L__&OUd^7Zxl-qz6cj_q%} z_SuKW-g|fEn|=MOF+=OhTit(m&6oi;deOc)_w&W$?{^Me=@yDU(Fo;xVNwU_O>n0KREJ0 zBd#y$ViT2ls@3B;GCBV^h@1CwCC6nQ0t5&UxV1o$MKzn}MZL_5(Y$(3z1)8H=z&dZ z+FLiyJ^kzl&mFq3|JB~HPiNa-9-dk}KD~If`{U{E<=O6~sqPQc-S0cImrl+s9+_Hv zrSsjH6JLDv!dn;jJT(906O)fOUw-6{UCqYE;bK)@)UvoST0|p#C|k~TN#k1%7Ipfq z&y7zB5Fl{70#UCMYdr?Y~o&KbaySPk#<;=m9nfBwQAm|l&dO3>xT2zSh?x0 z+U90`qB%0rtZ!+KJhrCs@am!aMzhtm%4lqp+TwAg$Rb~-jB)2vyF5CPR-%yJq=9&s z=R{Js-|k7X9RUIa{zBkJ1sfAQ4Z2cC9Ru+F6lM3&2MZQwSH{5yg%tT{#=$nRU$xu009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF n5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7e?e?#DRqV34G literal 0 HcmV?d00001 diff --git a/edk2-rockchip/Platform/Hinlink/Drivers/LogoDxe/Logo.c b/edk2-rockchip/Platform/Hinlink/Drivers/LogoDxe/Logo.c new file mode 100644 index 000000000..2255b11ea --- /dev/null +++ b/edk2-rockchip/Platform/Hinlink/Drivers/LogoDxe/Logo.c @@ -0,0 +1,144 @@ +/** @file + Logo DXE Driver, install Edkii Platform Logo protocol. + + Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.
+ Copyright (c) 2018, Linaro, Ltd. All rights reserved.
+ Copyright (c) 2022 Rockchip Electronics Co. Ltd. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct { + EFI_IMAGE_ID ImageId; + EDKII_PLATFORM_LOGO_DISPLAY_ATTRIBUTE Attribute; + INTN OffsetX; + INTN OffsetY; +} LOGO_ENTRY; + +STATIC EFI_HII_IMAGE_EX_PROTOCOL *mHiiImageEx; +STATIC EFI_HII_HANDLE mHiiHandle; +STATIC LOGO_ENTRY mLogos[] = { + { + IMAGE_TOKEN (IMG_LOGO), + EdkiiPlatformLogoDisplayAttributeCenter, + 0, + 0 + } +}; + +/** + Load a platform logo image and return its data and attributes. + + @param This The pointer to this protocol instance. + @param Instance The visible image instance is found. + @param Image Points to the image. + @param Attribute The display attributes of the image returned. + @param OffsetX The X offset of the image regarding the Attribute. + @param OffsetY The Y offset of the image regarding the Attribute. + + @retval EFI_SUCCESS The image was fetched successfully. + @retval EFI_NOT_FOUND The specified image could not be found. +**/ +STATIC +EFI_STATUS +EFIAPI +GetImage ( + IN EDKII_PLATFORM_LOGO_PROTOCOL *This, + IN OUT UINT32 *Instance, + OUT EFI_IMAGE_INPUT *Image, + OUT EDKII_PLATFORM_LOGO_DISPLAY_ATTRIBUTE *Attribute, + OUT INTN *OffsetX, + OUT INTN *OffsetY + ) +{ + UINT32 Current; + + if (Instance == NULL || Image == NULL || + Attribute == NULL || OffsetX == NULL || OffsetY == NULL) { + return EFI_INVALID_PARAMETER; + } + + Current = *Instance; + if (Current >= ARRAY_SIZE (mLogos)) { + return EFI_NOT_FOUND; + } + + (*Instance)++; + *Attribute = mLogos[Current].Attribute; + *OffsetX = mLogos[Current].OffsetX; + *OffsetY = mLogos[Current].OffsetY; + + return mHiiImageEx->GetImageEx (mHiiImageEx, mHiiHandle, + mLogos[Current].ImageId, Image); +} + +STATIC EDKII_PLATFORM_LOGO_PROTOCOL mPlatformLogo = { + GetImage +}; + +/** + Entrypoint of this module. + + This function is the entrypoint of this module. It installs the Edkii + Platform Logo protocol. + + @param ImageHandle The firmware allocated handle for the EFI image. + @param SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The entry point is executed successfully. + +**/ +EFI_STATUS +EFIAPI +InitializeLogo ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + EFI_HII_PACKAGE_LIST_HEADER *PackageList; + EFI_HII_DATABASE_PROTOCOL *HiiDatabase; + EFI_HANDLE Handle; + + Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, + (VOID **) &HiiDatabase); + ASSERT_EFI_ERROR (Status); + + Status = gBS->LocateProtocol (&gEfiHiiImageExProtocolGuid, NULL, + (VOID **) &mHiiImageEx); + ASSERT_EFI_ERROR (Status); + + // + // Retrieve HII package list from ImageHandle + // + Status = gBS->OpenProtocol (ImageHandle, &gEfiHiiPackageListProtocolGuid, + (VOID **) &PackageList, ImageHandle, NULL, + EFI_OPEN_PROTOCOL_GET_PROTOCOL); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, + "HII Image Package with logo not found in PE/COFF resource section\n")); + return Status; + } + + // + // Publish HII package list to HII Database. + // + Status = HiiDatabase->NewPackageList (HiiDatabase, PackageList, NULL, + &mHiiHandle); + if (!EFI_ERROR (Status)) { + Handle = NULL; + Status = gBS->InstallMultipleProtocolInterfaces (&Handle, + &gEdkiiPlatformLogoProtocolGuid, &mPlatformLogo, NULL); + } + return Status; +} diff --git a/edk2-rockchip/Platform/Hinlink/Drivers/LogoDxe/Logo.idf b/edk2-rockchip/Platform/Hinlink/Drivers/LogoDxe/Logo.idf new file mode 100644 index 000000000..c2d909624 --- /dev/null +++ b/edk2-rockchip/Platform/Hinlink/Drivers/LogoDxe/Logo.idf @@ -0,0 +1,10 @@ +// @file +// Platform Logo image definition file. +// +// Copyright (c) 2018, Linaro, Ltd. All rights reserved.
+// Copyright (c) 2022 Rockchip Electronics Co. Ltd. +// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// + +#image IMG_LOGO Logo.bmp diff --git a/edk2-rockchip/Platform/Hinlink/Drivers/LogoDxe/LogoDxe.inf b/edk2-rockchip/Platform/Hinlink/Drivers/LogoDxe/LogoDxe.inf new file mode 100644 index 000000000..e7a35de10 --- /dev/null +++ b/edk2-rockchip/Platform/Hinlink/Drivers/LogoDxe/LogoDxe.inf @@ -0,0 +1,48 @@ +## @file +# The default logo bitmap picture shown on setup screen. +# +# Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.
+# Copyright (c) 2018, Linaro, Ltd. All rights reserved.
+# Copyright (c) 2022 Rockchip Electronics Co. Ltd. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION = 0x0001001A + BASE_NAME = LogoDxe + FILE_GUID = 4b55f0bc-8b1a-11ec-bd4b-f42a7dcb925d + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + + ENTRY_POINT = InitializeLogo +# +# This flag specifies whether HII resource section is generated into PE image. +# + UEFI_HII_RESOURCE_SECTION = TRUE + +[Sources] + Logo.bmp + Logo.c + Logo.idf + +[Packages] + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + UefiBootServicesTableLib + UefiDriverEntryPoint + DebugLib + +[Protocols] + gEfiHiiDatabaseProtocolGuid ## CONSUMES + gEfiHiiImageExProtocolGuid ## CONSUMES + gEfiHiiPackageListProtocolGuid ## PRODUCES CONSUMES + gEdkiiPlatformLogoProtocolGuid ## PRODUCES + +[Depex] + gEfiHiiDatabaseProtocolGuid AND + gEfiHiiImageExProtocolGuid diff --git a/edk2-rockchip/Platform/Hinlink/H88K/AcpiTables/AcpiTables.inf b/edk2-rockchip/Platform/Hinlink/H88K/AcpiTables/AcpiTables.inf new file mode 100644 index 000000000..e95eb7e1c --- /dev/null +++ b/edk2-rockchip/Platform/Hinlink/H88K/AcpiTables/AcpiTables.inf @@ -0,0 +1,71 @@ +#/** @file +# +# ACPI table data and ASL sources required to boot the platform. +# +# Copyright (c) 2019-2021, ARM Limited. All rights reserved. +# Copyright (c) Microsoft Corporation. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +#**/ + +[Defines] + INF_VERSION = 0x0001001A + BASE_NAME = AcpiTables + FILE_GUID = 7E374E25-8E01-4FEE-87F2-390C23C606CD + MODULE_TYPE = USER_DEFINED + VERSION_STRING = 1.0 + RK_COMMON_ACPI_DIR = Silicon/Rockchip/RK3588/AcpiTables + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = AARCH64 +# + +[Sources] + Dsdt.asl + $(RK_COMMON_ACPI_DIR)/Madt.aslc + $(RK_COMMON_ACPI_DIR)/Fadt.aslc + $(RK_COMMON_ACPI_DIR)/Gtdt.aslc + $(RK_COMMON_ACPI_DIR)/Spcr.aslc + $(RK_COMMON_ACPI_DIR)/Mcfg.aslc + $(RK_COMMON_ACPI_DIR)/Dbg2.aslc + $(RK_COMMON_ACPI_DIR)/Pcie3x4.asl + $(RK_COMMON_ACPI_DIR)/Pcie3x2.asl + $(RK_COMMON_ACPI_DIR)/Pcie2x1l0.asl + $(RK_COMMON_ACPI_DIR)/Pcie2x1l1.asl + $(RK_COMMON_ACPI_DIR)/Pcie2x1l2.asl + $(RK_COMMON_ACPI_DIR)/Sata0.asl + $(RK_COMMON_ACPI_DIR)/Sata1.asl + $(RK_COMMON_ACPI_DIR)/Sata2.asl + +[Packages] + ArmPkg/ArmPkg.dec + ArmPlatformPkg/ArmPlatformPkg.dec + EmbeddedPkg/EmbeddedPkg.dec + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + Silicon/Rockchip/RockchipPkg.dec + Platform/Rockchip/RK3588/RK3588.dec + +[FixedPcd] + gArmTokenSpaceGuid.PcdArmArchTimerIntrNum + gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum + gArmTokenSpaceGuid.PcdArmArchTimerSecIntrNum + gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum + gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase + gArmTokenSpaceGuid.PcdGicDistributorBase + gArmTokenSpaceGuid.PcdGicRedistributorsBase + gRockchipTokenSpaceGuid.PcdPcieRootPort3x4CfgBaseAddress + gRockchipTokenSpaceGuid.PcdPcieRootPort3x4ApbBaseAddress + gRockchipTokenSpaceGuid.PcdPcieRootPort3x4DbiBaseAddress + gRockchipTokenSpaceGuid.PcdPcieRootPort3x4CfgBaseAddress + gRockchipTokenSpaceGuid.PcdPcieRootPort3x4CfgSize + gRockchipTokenSpaceGuid.PcdPcieRootPort3x4IoBaseAddress + gRockchipTokenSpaceGuid.PcdPcieRootPort3x4IoSize + gRockchipTokenSpaceGuid.PcdPcieRootPort3x4MemBaseAddress + gRockchipTokenSpaceGuid.PcdPcieRootPort3x4MemSize + gRockchipTokenSpaceGuid.PcdPcieRootPort3x4MemBaseAddress64 + gRockchipTokenSpaceGuid.PcdPcieRootPort3x4MemSize64 + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase diff --git a/edk2-rockchip/Platform/Hinlink/H88K/AcpiTables/Dsdt.asl b/edk2-rockchip/Platform/Hinlink/H88K/AcpiTables/Dsdt.asl new file mode 100755 index 000000000..a48463eff --- /dev/null +++ b/edk2-rockchip/Platform/Hinlink/H88K/AcpiTables/Dsdt.asl @@ -0,0 +1,37 @@ +/** @file + * + * Differentiated System Definition Table (DSDT) + * + * Copyright (c) 2020, Pete Batard + * Copyright (c) 2018-2020, Andrey Warkentin + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) 2021, ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-2-Clause-Patent + * + **/ + +#include "AcpiTables.h" + +DefinitionBlock ("Dsdt.aml", "DSDT", 2, "RPIFDN", "RPI", 2) +{ + Scope (\_SB_) + { + include ("Cpu.asl") + + include ("Emmc.asl") + include ("Sdhc.asl") + // include ("Gmac.asl") + // include ("Gpio.asl") + // include ("I2c.asl") + include ("Uart.asl") + // include ("Spi.asl") + + // won't work on Windows, will trigger bugcheck by usbehci + // include ("Usb2.asl") + + include ("Usb3Host0.asl") + include ("Usb3Host1.asl") + include ("Usb3Host2.asl") + } +} diff --git a/edk2-rockchip/Platform/Hinlink/H88K/H88K.Modules.fdf.inc b/edk2-rockchip/Platform/Hinlink/H88K/H88K.Modules.fdf.inc new file mode 100644 index 000000000..c61608d63 --- /dev/null +++ b/edk2-rockchip/Platform/Hinlink/H88K/H88K.Modules.fdf.inc @@ -0,0 +1,13 @@ +## @file +# +# Copyright (c) 2023, Mario Bălănică +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + + # ACPI Support + INF RuleOverride = ACPITABLE $(PLATFORM_DIRECTORY)/AcpiTables/AcpiTables.inf + + # Splash screen logo + INF $(VENDOR_DIRECTORY)/Drivers/LogoDxe/LogoDxe.inf diff --git a/edk2-rockchip/Platform/Hinlink/H88K/H88K.dsc b/edk2-rockchip/Platform/Hinlink/H88K/H88K.dsc new file mode 100644 index 000000000..2d9405c6d --- /dev/null +++ b/edk2-rockchip/Platform/Hinlink/H88K/H88K.dsc @@ -0,0 +1,85 @@ +## @file +# +# Copyright (c) 2014-2018, Linaro Limited. All rights reserved. +# Copyright (c) 2022, Xilin Wu +# Copyright (c) 2023, Jianfeng Liu +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +################################################################################ +# +# Defines Section - statements that will be processed to create a Makefile. +# +################################################################################ +[Defines] + PLATFORM_NAME = H88K + PLATFORM_VENDOR = Hinlink + PLATFORM_GUID = 5ecd3024-77d5-47a2-8293-a963ac878d48 + PLATFORM_VERSION = 0.2 + DSC_SPECIFICATION = 0x00010019 + OUTPUT_DIRECTORY = Build/$(PLATFORM_NAME) + VENDOR_DIRECTORY = Platform/$(PLATFORM_VENDOR) + PLATFORM_DIRECTORY = $(VENDOR_DIRECTORY)/$(PLATFORM_NAME) + SUPPORTED_ARCHITECTURES = AARCH64 + BUILD_TARGETS = DEBUG|RELEASE + SKUID_IDENTIFIER = DEFAULT + FLASH_DEFINITION = Silicon/Rockchip/RK3588/RK3588.fdf + RK_PLATFORM_FVMAIN_MODULES = $(PLATFORM_DIRECTORY)/$(PLATFORM_NAME).Modules.fdf.inc + + # + # RK3588-based platform + # +!include Silicon/Rockchip/RK3588/RK3588Platform.dsc.inc + +################################################################################ +# +# Library Class section - list of all Library Classes needed by this Platform. +# +################################################################################ + +[LibraryClasses.common] + RockchipPlatformLib|$(PLATFORM_DIRECTORY)/Library/RockchipPlatformLib/RockchipPlatformLib.inf + +################################################################################ +# +# Pcd Section - list of all EDK II PCD Entries defined by this Platform. +# +################################################################################ + +[PcdsFixedAtBuild.common] + # SMBIOS platform config + gRockchipTokenSpaceGuid.PcdPlatformName|"H88K" + gRockchipTokenSpaceGuid.PcdPlatformVendorName|"Hinlink" + gRockchipTokenSpaceGuid.PcdFamilyName|"H88K" + gRockchipTokenSpaceGuid.PcdProductUrl|"http://www.hinlink.com/" + + # + # CPU Performance default values + # + gRK3588TokenSpaceGuid.PcdCPULClusterClockPresetDefault|$(CPU_PERF_CLUSTER_CLOCK_PRESET_BOOTDEFAULT) + gRK3588TokenSpaceGuid.PcdCPUB01ClusterClockPresetDefault|$(CPU_PERF_CLUSTER_CLOCK_PRESET_BOOTDEFAULT) + gRK3588TokenSpaceGuid.PcdCPUB23ClusterClockPresetDefault|$(CPU_PERF_CLUSTER_CLOCK_PRESET_BOOTDEFAULT) + + # + # PCIe/SATA/USB Combo PIPE PHY support flags and default values + # + gRK3588TokenSpaceGuid.PcdComboPhy0Switchable|TRUE + gRK3588TokenSpaceGuid.PcdComboPhy1Switchable|FALSE + gRK3588TokenSpaceGuid.PcdComboPhy2Switchable|FALSE + gRK3588TokenSpaceGuid.PcdComboPhy0ModeDefault|$(COMBO_PHY_MODE_PCIE) + gRK3588TokenSpaceGuid.PcdComboPhy1ModeDefault|$(COMBO_PHY_MODE_PCIE) + gRK3588TokenSpaceGuid.PcdComboPhy2ModeDefault|$(COMBO_PHY_MODE_PCIE) + +################################################################################ +# +# Components Section - list of all EDK II Modules needed by this Platform. +# +################################################################################ +[Components.common] + # ACPI Support + $(PLATFORM_DIRECTORY)/AcpiTables/AcpiTables.inf + + # Splash screen logo + $(VENDOR_DIRECTORY)/Drivers/LogoDxe/LogoDxe.inf diff --git a/edk2-rockchip/Platform/Hinlink/H88K/Library/RockchipPlatformLib/RockchipPlatformLib.c b/edk2-rockchip/Platform/Hinlink/H88K/Library/RockchipPlatformLib/RockchipPlatformLib.c new file mode 100644 index 000000000..051450a60 --- /dev/null +++ b/edk2-rockchip/Platform/Hinlink/H88K/Library/RockchipPlatformLib/RockchipPlatformLib.c @@ -0,0 +1,317 @@ +/** @file +* +* Copyright (c) 2021, Rockchip Limited. All rights reserved. +* +* SPDX-License-Identifier: BSD-2-Clause-Patent +* +**/ +#include +#include +#include +#include +#include +#include +#include + +static struct regulator_init_data rk806_init_data[] = { + /* Master PMIC */ + RK8XX_VOLTAGE_INIT(MASTER_BUCK1, 750000), + RK8XX_VOLTAGE_INIT(MASTER_BUCK3, 750000), + RK8XX_VOLTAGE_INIT(MASTER_BUCK4, 750000), + RK8XX_VOLTAGE_INIT(MASTER_BUCK5, 850000), + //RK8XX_VOLTAGE_INIT(MASTER_BUCK6, 750000), + RK8XX_VOLTAGE_INIT(MASTER_BUCK7, 2000000), + RK8XX_VOLTAGE_INIT(MASTER_BUCK8, 3300000), + RK8XX_VOLTAGE_INIT(MASTER_BUCK10, 1800000), + + RK8XX_VOLTAGE_INIT(MASTER_NLDO1, 750000), + RK8XX_VOLTAGE_INIT(MASTER_NLDO2, 850000), + RK8XX_VOLTAGE_INIT(MASTER_NLDO3, 750000), + RK8XX_VOLTAGE_INIT(MASTER_NLDO4, 850000), + RK8XX_VOLTAGE_INIT(MASTER_NLDO5, 750000), + + RK8XX_VOLTAGE_INIT(MASTER_PLDO1, 1800000), + RK8XX_VOLTAGE_INIT(MASTER_PLDO2, 1800000), + RK8XX_VOLTAGE_INIT(MASTER_PLDO3, 1200000), + RK8XX_VOLTAGE_INIT(MASTER_PLDO4, 3300000), + RK8XX_VOLTAGE_INIT(MASTER_PLDO5, 3300000), + RK8XX_VOLTAGE_INIT(MASTER_PLDO6, 1800000), + + /* No dual PMICs on this platform */ +}; + +VOID +EFIAPI +DwEmmcDxeIoMux ( + VOID + ) +{ + /* sdmmc0 iomux (microSD socket) */ + BUS_IOC->GPIO4D_IOMUX_SEL_L = (0xFFFFUL << 16) | (0x1111); //SDMMC_D0,SDMMC_D1,SDMMC_D2,SDMMC_D3 + BUS_IOC->GPIO4D_IOMUX_SEL_H = (0x00FFUL << 16) | (0x0011); //SDMMC_CLK,SDMMC_CMD + PMU1_IOC->GPIO0A_IOMUX_SEL_H = (0x000FUL << 16) | (0x0001); //SDMMC_DET +} + +VOID +EFIAPI +SdhciEmmcDxeIoMux ( + VOID + ) +{ + /* sdhci0 iomux (eMMC socket) */ + BUS_IOC->GPIO2A_IOMUX_SEL_L = (0xFFFFUL << 16) | (0x1111); //EMMC_CMD,EMMC_CLKOUT,EMMC_DATASTROBE,EMMC_RSTN + BUS_IOC->GPIO2D_IOMUX_SEL_L = (0xFFFFUL << 16) | (0x1111); //EMMC_D0,EMMC_D1,EMMC_D2,EMMC_D3 + BUS_IOC->GPIO2D_IOMUX_SEL_H = (0xFFFFUL << 16) | (0x1111); //EMMC_D4,EMMC_D5,EMMC_D6,EMMC_D7 +} + +#define NS_CRU_BASE 0xFD7C0000 +#define CRU_CLKSEL_CON59 0x03EC +#define CRU_CLKSEL_CON78 0x0438 + +VOID +EFIAPI +Rk806SpiIomux ( + VOID + ) +{ + /* io mux */ + //BUS_IOC->GPIO1A_IOMUX_SEL_H = (0xFFFFUL << 16) | 0x8888; + //BUS_IOC->GPIO1B_IOMUX_SEL_L = (0x000FUL << 16) | 0x0008; + PMU1_IOC->GPIO0A_IOMUX_SEL_H = (0x0FF0UL << 16) | 0x0110; + PMU1_IOC->GPIO0B_IOMUX_SEL_L = (0xF0FFUL << 16) | 0x1011; + MmioWrite32(NS_CRU_BASE + CRU_CLKSEL_CON59, (0x00C0UL << 16) | 0x0080); +} + +VOID +EFIAPI +Rk806Configure ( + VOID + ) +{ + UINTN RegCfgIndex; + + RK806Init(); + + for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE(rk806_init_data); RegCfgIndex++) + RK806RegulatorInit(rk806_init_data[RegCfgIndex]); +} + +VOID +EFIAPI +SetCPULittleVoltage ( + IN UINT32 Microvolts + ) +{ + struct regulator_init_data Rk806CpuLittleSupply = + RK8XX_VOLTAGE_INIT(MASTER_BUCK2, Microvolts); + + RK806RegulatorInit(Rk806CpuLittleSupply); +} + +VOID +EFIAPI +NorFspiIomux ( + VOID + ) +{ + /* io mux */ + MmioWrite32(NS_CRU_BASE + CRU_CLKSEL_CON78, + (((0x3 << 12) | (0x3f << 6)) << 16) | (0x0 << 12) | (0x3f << 6)); +#define FSPI_M1 +#if defined(FSPI_M0) + /*FSPI M0*/ + BUS_IOC->GPIO2A_IOMUX_SEL_L = ((0xF << 0) << 16) | (2 << 0); //FSPI_CLK_M0 + BUS_IOC->GPIO2D_IOMUX_SEL_L = (0xFFFFUL << 16) | (0x2222); //FSPI_D0_M0,FSPI_D1_M0,FSPI_D2_M0,FSPI_D3_M0 + BUS_IOC->GPIO2D_IOMUX_SEL_H = ((0xF << 8) << 16) | (0x2 << 8); //FSPI_CS0N_M0 +#elif defined(FSPI_M1) + /*FSPI M1*/ + BUS_IOC->GPIO2A_IOMUX_SEL_H = (0xFF00UL << 16) | (0x3300); //FSPI_D0_M1,FSPI_D1_M1 + BUS_IOC->GPIO2B_IOMUX_SEL_L = (0xF0FFUL << 16) | (0x3033); //FSPI_D2_M1,FSPI_D3_M1,FSPI_CLK_M1 + BUS_IOC->GPIO2B_IOMUX_SEL_H = (0xF << 16) | (0x3); //FSPI_CS0N_M1 +#else + /*FSPI M2*/ + BUS_IOC->GPIO3A_IOMUX_SEL_L = (0xFFFFUL << 16) | (0x5555); //[FSPI_D0_M2-FSPI_D3_M2] + BUS_IOC->GPIO3A_IOMUX_SEL_H = (0xF0UL << 16) | (0x50); //FSPI_CLK_M2 + BUS_IOC->GPIO3C_IOMUX_SEL_H = (0xF << 16) | (0x2); //FSPI_CS0_M2 +#endif +} + +VOID +EFIAPI +GmacIomux ( + UINT32 id + ) +{ + /* No GMAC here */ +} + +VOID +EFIAPI +NorFspiEnableClock ( + UINT32 *CruBase + ) +{ + UINTN BaseAddr = (UINTN) CruBase; + + MmioWrite32(BaseAddr + 0x087C, 0x0E000000); +} + +VOID +EFIAPI +I2cIomux ( + UINT32 id + ) +{ + switch (id) { + case 0: + /* io mux M2 */ + PMU2_IOC->GPIO0D_IOMUX_SEL_L = (0x0F00UL << 16) | 0x0300; + PMU2_IOC->GPIO0D_IOMUX_SEL_L = (0x00F0UL << 16) | 0x0030; + break; + case 1: + /* io mux */ + //BUS_IOC->GPIO0B_IOMUX_SEL_H = (0x0FF0UL << 16) | 0x0990; + //PMU2_IOC->GPIO0B_IOMUX_SEL_H = (0x0FF0UL << 16) | 0x0880; + break; + case 2: + /* io mux */ + BUS_IOC->GPIO0B_IOMUX_SEL_H = (0xF000UL << 16) | 0x9000; + BUS_IOC->GPIO0C_IOMUX_SEL_L = (0x000FUL << 16) | 0x0009; + PMU2_IOC->GPIO0B_IOMUX_SEL_H = (0xF000UL << 16) | 0x8000; + PMU2_IOC->GPIO0C_IOMUX_SEL_L = (0x000FUL << 16) | 0x0008; + break; + case 3: + break; + case 4: + break; + case 5: + break; + default: + break; + } +} + +VOID +EFIAPI +UsbPortPowerEnable ( + VOID + ) +{ + DEBUG((EFI_D_WARN, "UsbPortPowerEnable called\n")); + /* Set GPIO4 PB0 (USB_HOST_PWREN) output high to power USB ports */ + GpioPinSetDirection (4, GPIO_PIN_PB0, GPIO_PIN_OUTPUT); + GpioPinWrite (4, GPIO_PIN_PB0, TRUE); +} + +VOID +EFIAPI +Usb2PhyResume ( + VOID + ) +{ + MmioWrite32(0xfd5d0008, 0x20000000); + MmioWrite32(0xfd5d4008, 0x20000000); + MmioWrite32(0xfd5d8008, 0x20000000); + MmioWrite32(0xfd5dc008, 0x20000000); + MmioWrite32(0xfd7f0a10, 0x07000700); + MmioWrite32(0xfd7f0a10, 0x07000000); +} + +VOID +EFIAPI +UsbDpPhyEnable ( + VOID + ) +{ + /* enable rx_lfps_en & usbdp_low_pwrn */ + MmioWrite32(0xfd5c8004, 0x60006000); + MmioWrite32(0xfd5cc004, 0x60006000); + + /* remove rx-termination, we don't support SS yet */ + MmioWrite32 (0xfd5c800c, 0x00030001); + MmioWrite32 (0xfd5cc00c, 0x00030001); +} + +VOID +EFIAPI +PcieIoInit ( + UINT32 Segment + ) +{ + /* Set reset and power IO to gpio output mode */ + switch(Segment) { + case PCIE_SEGMENT_PCIE30X4: + GpioPinSetDirection (4, GPIO_PIN_PB6, GPIO_PIN_OUTPUT); + GpioPinSetDirection (3, GPIO_PIN_PD5, GPIO_PIN_OUTPUT); + break; + case PCIE_SEGMENT_PCIE20L0: + GpioPinSetDirection (0, GPIO_PIN_PB0, GPIO_PIN_OUTPUT); + break; + case PCIE_SEGMENT_PCIE20L1: + GpioPinSetDirection (4, GPIO_PIN_PA2, GPIO_PIN_OUTPUT); + break; + case PCIE_SEGMENT_PCIE20L2: + GpioPinSetDirection (4, GPIO_PIN_PA5, GPIO_PIN_OUTPUT); + break; + default: + break; + } +} + +VOID +EFIAPI +PciePowerEn ( + UINT32 Segment, + BOOLEAN Enable + ) +{ + /* output high to enable power */ + + switch(Segment) { + case PCIE_SEGMENT_PCIE30X4: + GpioPinWrite (3, GPIO_PIN_PD5, Enable); + break; + case PCIE_SEGMENT_PCIE20L0: + break; + case PCIE_SEGMENT_PCIE20L1: + break; + case PCIE_SEGMENT_PCIE20L2: + break; + default: + break; + } +} + +VOID +EFIAPI +PciePeReset ( + UINT32 Segment, + BOOLEAN Enable + ) +{ + switch(Segment) { + case PCIE_SEGMENT_PCIE30X4: + GpioPinWrite (4, GPIO_PIN_PB6, !Enable); + break; + case PCIE_SEGMENT_PCIE20L0: + GpioPinWrite (0, GPIO_PIN_PB0, !Enable); + break; + case PCIE_SEGMENT_PCIE20L1: + GpioPinWrite (4, GPIO_PIN_PA2, !Enable); + break; + case PCIE_SEGMENT_PCIE20L2: + GpioPinWrite (4, GPIO_PIN_PA5, !Enable); + break; + default: + break; + } +} + +VOID +EFIAPI +PlatformEarlyInit ( + VOID + ) +{ + // Configure various things specific to this platform +} diff --git a/edk2-rockchip/Platform/Hinlink/H88K/Library/RockchipPlatformLib/RockchipPlatformLib.inf b/edk2-rockchip/Platform/Hinlink/H88K/Library/RockchipPlatformLib/RockchipPlatformLib.inf new file mode 100644 index 000000000..57a153f51 --- /dev/null +++ b/edk2-rockchip/Platform/Hinlink/H88K/Library/RockchipPlatformLib/RockchipPlatformLib.inf @@ -0,0 +1,41 @@ +# +# Copyright (c) 2021, Rockchip Limited. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# + +[Defines] + INF_VERSION = 0x00010019 + BASE_NAME = RockchipPlatformLib + FILE_GUID = 5178fa86-2fec-11ec-95b4-f42a7dcb925d + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = RockchipPlatformLib + RKPLATLIB_COMMON_DIR = Silicon/Rockchip/RK3588/Library/RockchipPlatformLibCommon + +[Packages] + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + Platform/Rockchip/RK3588/RK3588.dec + Silicon/Rockchip/RK3588/RK3588.dec + Silicon/Rockchip/RockchipPkg.dec + +[LibraryClasses] + ArmLib + HobLib + IoLib + MemoryAllocationLib + SerialPortLib + CruLib + GpioLib + +[Sources.common] + RockchipPlatformLib.c + $(RKPLATLIB_COMMON_DIR)/RK3588CruLib.c + +[Sources.AARCH64] + +[Pcd] + gRockchipTokenSpaceGuid.PcdI2cBusCount +