From 402fe20e3e10f0f2aa1329eb60970e56bf92986e Mon Sep 17 00:00:00 2001 From: Felix Singer Date: Tue, 12 Feb 2019 22:22:42 +0100 Subject: [PATCH] mb/up/squared: Add mainboard Works: - bootblock, romstage, ramstage - Serial console UART0, UART1 - SPI flash console - iGPU init with libgfxinit - LAN1, LAN2 - USB2, USB3 - HDMI, DisplayPort - eMMC - flashing with flashrom externally WIP: - Documentation - VGA For some reason Seabios can not find the CBFS region and therefore it can't load seavgabios, but generally it is working as soon as Linux is booted. - ACPI Works not: - Devices needs proper configuration - Seabios can't find CBFS region Untested: - GPIO pin header - 60 pin EXHAT - Camera interface - MIPI-CSI2 2-lane (2MP) - MIPI-CSI2 4-lane (8MP) - SATA3 - USB3 OTG - embedded DisplayPort - M.2 slot - mini PCIe - flashing with flashrom internally using Linux Change-Id: Ia913534ec176fc600fcd4ce3af335ebe682b0ed4 Signed-off-by: Felix Singer Reviewed-on: https://review.coreboot.org/c/coreboot/+/31378 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Rudolph --- Documentation/mainboard/index.md | 4 + Documentation/mainboard/up/squared/bottom.jpg | Bin 0 -> 38689 bytes Documentation/mainboard/up/squared/index.md | 99 +++ Documentation/mainboard/up/squared/top.jpg | Bin 0 -> 33925 bytes src/mainboard/up/Kconfig | 16 + src/mainboard/up/Kconfig.name | 2 + src/mainboard/up/squared/Kconfig | 88 ++ src/mainboard/up/squared/Kconfig.name | 2 + src/mainboard/up/squared/Makefile.inc | 7 + src/mainboard/up/squared/acpi_tables.c | 0 src/mainboard/up/squared/board_info.txt | 7 + src/mainboard/up/squared/bootblock.c | 22 + src/mainboard/up/squared/data.vbt | Bin 0 -> 6154 bytes src/mainboard/up/squared/devicetree.cb | 50 ++ src/mainboard/up/squared/dsdt.asl | 43 + src/mainboard/up/squared/gma-mainboard.ads | 32 + src/mainboard/up/squared/gpio.h | 773 ++++++++++++++++++ src/mainboard/up/squared/ramstage.c | 432 ++++++++++ src/mainboard/up/squared/romstage.c | 96 +++ src/mainboard/up/squared/upsquared.fmd | 21 + src/mainboard/up/squared/vboot-ro.fmd | 35 + src/mainboard/up/squared/vboot-roa.fmd | 40 + src/mainboard/up/squared/vboot-roab.fmd | 45 + 23 files changed, 1814 insertions(+) create mode 100644 Documentation/mainboard/up/squared/bottom.jpg create mode 100644 Documentation/mainboard/up/squared/index.md create mode 100644 Documentation/mainboard/up/squared/top.jpg create mode 100644 src/mainboard/up/Kconfig create mode 100644 src/mainboard/up/Kconfig.name create mode 100644 src/mainboard/up/squared/Kconfig create mode 100644 src/mainboard/up/squared/Kconfig.name create mode 100644 src/mainboard/up/squared/Makefile.inc create mode 100644 src/mainboard/up/squared/acpi_tables.c create mode 100644 src/mainboard/up/squared/board_info.txt create mode 100644 src/mainboard/up/squared/bootblock.c create mode 100644 src/mainboard/up/squared/data.vbt create mode 100644 src/mainboard/up/squared/devicetree.cb create mode 100644 src/mainboard/up/squared/dsdt.asl create mode 100644 src/mainboard/up/squared/gma-mainboard.ads create mode 100644 src/mainboard/up/squared/gpio.h create mode 100644 src/mainboard/up/squared/ramstage.c create mode 100644 src/mainboard/up/squared/romstage.c create mode 100644 src/mainboard/up/squared/upsquared.fmd create mode 100644 src/mainboard/up/squared/vboot-ro.fmd create mode 100644 src/mainboard/up/squared/vboot-roa.fmd create mode 100644 src/mainboard/up/squared/vboot-roab.fmd diff --git a/Documentation/mainboard/index.md b/Documentation/mainboard/index.md index fb637c423b..eced74966e 100644 --- a/Documentation/mainboard/index.md +++ b/Documentation/mainboard/index.md @@ -82,3 +82,7 @@ The boards in this section are not real mainboards, but emulators. ## Supermicro - [X10SLM+-F](supermicro/x10slm-f.md) + +## UP + +- [Squared](up/squared/index.md) diff --git a/Documentation/mainboard/up/squared/bottom.jpg b/Documentation/mainboard/up/squared/bottom.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f9aa85db50a25d26594360c1c0f7ef44c6cc6907 GIT binary patch literal 38689 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" +./util/scripts/config --set-str IFD_BIN_PATH "" +make olddefconfig +``` + +### Flashing + +[overview_top]: top.jpg +[overview_bottom]: bottom.jpg diff --git a/Documentation/mainboard/up/squared/top.jpg b/Documentation/mainboard/up/squared/top.jpg new file mode 100644 index 0000000000000000000000000000000000000000..71adf459b733337d5ff6652ab415ddd2e4efff25 GIT binary patch literal 33925 zcmb5UcRbr)^gsSGYqgC%+mZwkGiGTO5vjzeM9iWUGgj@kXpLGykO*qE_NFz9F4SJN zl~U9wrAu|Gw!e6PKELnp`|s~OFL^!kdc1DVJ@=e*pZC1(zgPcO01y_9K?6)oOn@;1 zz`xgkApqj$Il;pPI&u62A1{bs1STdTBqV}>NS}h~sOg^9Ry(VuZ|q>MkFqh+I&0yJ zv$;a_@btJ~7I4$w^@f9+hs#kXOuT%2B7!2yVq(fJ$g@b7|KIYj8{p+&dcthW!o&+O z^D?pUGX3iT!~lSqg`w>KB}~jLtZeLzdm@Zc91Z0ElB0Y7762X=CV&~l0s;W0K^{-G zVhtz^U`iCwzgnvgfbb$btSacjcmO~EJj{Y1AR5K0Va%ME$;<_2(}yO_y9nr{cR@AS zDYjeG8m6eus~&RJ(WOreMdA@ar@jgx(y!>wDrmdGcqYDzjg?}N4uTt?toXX3#NUn^ zSW%hSqyT`&^{s2xF%{t91aBkM$QXr^WQyX0+9~#|foI`R05IfBj7BjTfC)l;rAUQx z7ImSXczF;HEat9$oyaUnI$eZkg{0nH%IGQzU z!S4;3_a?fCU^vpi0ssd2WrY;Wi@S_uRVe8YVKQ83lDO z2NLC|Kkm4Z-X{>H&&&kyC7IGG zC~|Ickx6VZ9ULMM%%Kk>aJa|{WvG^!;=;g#YST8T+`)GiM2e3Ao-v9<4&y2=DK}1w} z)%M+-_SbH4MuN;tv8FjUiEG#zdlz@U5D%`B~cnkeQY!@NZr!F(BP~KuUHZnxPnJ+m=tiUKp)i5o#yH=ck0C?(0FJB#G_9u6>Z0$^rB;*@^pqH%x< zC?-ZOw+haLPc{qulx2}>MgJHAr@!s@5L;HX8r&}6q-m~QmaYmcPXd^jQM2yB8y0yo z-ey7N;YlEAe(VE6Ar4AlMS?gu%4=-nja}b%@q(o+B?&6fbIcvFAwhKkLrqE*7cY8< zE46BjXG`aQq)m^WQt%FbD6hg-1rY`Jwo!B6acg3sSwYw}_+`b`ArHa#QLN0U!gLU? zXn7P%gt2QEUJ_!5>5Z*!dr8Q$^Q>X@&Y}siCgzoG4G&Eh589bN&3D8axx+cYBC|$i z@o2PXd#q>h9rZ?~*>!YKZ#b&~Ku83TK$%R9zJLZvO&{gO3>wUx?F8fRR%;rOsEi0= zuOdyypzsGg?^jYEJ%aS4I6zhZX`73nZwT)$u&bHUiA+mM}%=-G0pn*8f zatq*%scRInlt9bcLuGb@@qr-_XZS+^Cs54R;z-E-T0h;&^rA6Y%YF7CTDALIbI%B^ zQQEXrY(|r}OdI{J5{YAyb7q6FGTC1R38$8O4c7XQ9bp9ymlYB?E`moo)uOS>>>jg`>yNj_mTF=6fM)F~9{b7D+&Pf_Szp z6YPtIsyW3r1roW*Ahi+#vltVq5@Z3gMt4TDpq^rU1zNy`RFX3}*UpWEMU8KJl_MH_ zXivXRaCm`5X21{WfO;akRLb_SvmIX^06K#uSQ@>jl#RTq7hc`A1*J}+I z-z|%yiGsUwM5gDYU#f;_Ibg<=34L1Uh>zb07&6uvpoc>#I?=mbMh#UlGT+YhcP7D*XVy=;qIUbY9oCrg0 z=OvA4V+qA1r~F3M9G~sY&B6ekwuk-h!jdsV9wru8j79)q^Fdg5q9IUv766V5=&QM5 zSqfWGMpkxsv?E)bEOWkO5nutbKr$owq^|<3wa*;eTgMSuLOGW74Q}70jPh+t3i(-Z z!Cep7n{O$Gf@k#sKt&zkdB`3-`zl%tBL?2{5NhhKo|M1J7|vg>L#KSOm? zMGc#zqZNfs)dUgR99nF2+@V)7*ck*G;P?WR=jEKV#5Tql=I99pF%dFz-` zy`lg~D6^=6K>GBGuiJ6l{0UK)kO*`ucTK z@04%X3$8_M)3$k75e$#%oK)e~GC^dg+9ol`N;F??qq3c#1h=%9c}R+jF6-=_d}otv zPa!IZL7N` zQ;4(`C3JAwjtZBPw7|zC!c;H{CJQxKY-rsNS9Ebdbhqh~xP`8*=Iz zsULs@6d)-Q6FVmlFuPJz1gVvY`phCc>4QR*m)&3Fh`w{2%Y~w<JMU>NTbq zu=k^LqX9Uh1;#4F!5qcn$}DN1l=hm?k8j|!jL*tbss0V;cavcu@Y7I;w zgkH^8)thGS%K1Ao?e;PBQH-27vBt~0_9>_9J-@m~PcG}MEh_$`uViBj1oUQ2;Ygc|A3FI2v{ z8IredY8E_dJ?ie=fCnU*05)cg7X~P=T6V|$H#5Qo6r*Y%ztHA^!SE0Y0#P*CO0xf0 zt3Zd9W+BQ+(xD-3p~H{!>~{B-wIUj>aUg4mU3?a0Sx>c}S&h|(Yro!WZZ%25N!Q%l zM>1J}ViEy4u@!V7+ga{SK{E5^-ox7b)>^zTkO^Iq3%WyCQUNi!j%C#ww?v+Ezb>vp z+&dRgVrLv@Gpt&p;SsL*76GZ!8fkC35EsDRhyU?HWZro!o3tjg@v`;)8nHmWPIZWlT~=x!Sc{0o&G01$?XP_$)0Q zxzJSi>x1=^c6qc`iTKNBA>Qh57}3Po=Wzhj9MgqYRW12*8b4&#c(g4GzSQV#3d`+7 zKFFESU^XKFEKD@Q*k!6>UIE)TcJ%tC3o zaigOiL6odf@Xa}-uSmVubScf6X5pS6F7-grWMXYuDYxNf!QuYWQOC$aX248c9$l<~ zXPs}SD9(C#4M79$eQl}99ce{C=X9>+T4XYk&!m|DC+*7g%jJzbWTn~ZV8rA>V(RUt z+|4X6Gv7IB?~2nMT5CBDq?cHYq>rSh%wPb-l?aPE4%=d?V&j$32}l|}{#GMB{!tT7 zToNg-Q9tvP$jr(Lcr+;vissN_0FBX)1?r+^nn8B&-gt5^#F*%APG93J#muM@tm>0M zvCKdj0Epq@>Om(Gx#v4f%3iwEG*wv5BdrttxpJfvIe4pxnJL~3va}VA)9m=_F!E#K zxu!spRLqdy&3%vMEaP+n7#=GH#?u)Yt61H3wNjv)4OA>rDFFxJ0WQf3fQ_-7@kkaL za=<{tYO^2E8?b{5%C3BofCyN55|OR8)etygQymt-^M1yvy-&Ky|DN?05+l2KWZ2La4X ztW3=8%#7m0f7zX}?P1~N;}-x)u}Xpws`?N$6$2>J@G7I&z`-a%FtIWJ1N!IhHnBTH zIK|eza;n{Pa@{?1irvY%G69aEhoF@N}}JboFwm;A1~6amvWz=>KW83!}BKM&>h=C%w;x+-Yj3{$CQfaUjJL zc@vi>D4Od^q86j$Jv}7GJ=Gydb<`BU>2V8<&Te*uu55#SL7BT9eT{E=7_VsD!Z&@X z`!@gQ>|!_65Vb(fP0jUqgBEI$(l_OD%Gxf=Eyvw13*oNN`^O4b;-cnmI+!E+e?(YG zc9JK-?njzQw(?Z_;>YWX;7J5EWkkk1r=D0Lg*1#!FfTg&VU(Aa5j^UCI;WqPXq)|L ziePC^^di@@cer=B3#7=2OdyKw$zHOndYoa>+oF@2mYVwW{LOSHlQInP5hPFx63{L_ z`c86PB0f-bzyo}d0rW5NQs49nhzzy_^7Z~$_U?o8PX7R>xtP4_vup6I6o@wp5n#U~}4F6yrgcrQW9C*|Li2=yeE z>bO>ZPZ;xm9P6`VQn%X_2wsf)u>W@Z@)zN9H`B44{Nw4GJ+Jv0iiK(AjgBk~nl&0D zy^Cw#BAeYEI^g{?$q2WUbxM=wz!D^w(x^G`8sbAqIhr@6-bp+|-(9C~Ha>3I5zfr_ zU?vkv%lMIxc6SH*(0nR6_3j<<)eJCni!Fi$U#izSwSqLH49W_lTOCD-z2+|kp))yL zSnt%-^X3d37Z?>7Ri_Xr!6_u6a{C+s93#|m4fDp4HPW=pSenbs!SyI5}rff=?_p5VAW zc}q&15|-Evt79#LwS9A1zGOP8aa>J(UQ#AHwXLhsh#s_taKi0By?Tbwc z!w91!1yUwNYc_NG>6@e*Lm(?zzlMWc-XbxgH^a@^#I|#{Meq_Nif!OFu|F8zL_WzE zJLP!(3dtb-R`qX_Y^dR2@)zK#+b)*Zw zC#-KiBfGAB+W+Y4;B+}#T7Lg|25%=mQw!U1|B?u*eCXcPkIyg1)A*H zGQXh+#a@Y9U_xn{GlDO!|Mc%N5@xvGG}MiqW^~g{bv=n|`at!)yPwQ-)_D-!dkakcmDofMCRj33T^u>d_K5D={;g- z`ef&A=6xf$yM^BI^(CEjd=+fSLWI_$StqPeIF$NP`pW%DtIccF4rG4r7&=gmnxTYt zbaUc8lYAzr@>=CT;GUe;iOiZ;KXxvDHz~_;hYs{K>;$EGHQ+x2|EKmw?z`DbPkR^RROJW7 zZiwa_2~00meWf@%>#2{)^3Ow-L%d_jm;0mS`6(LF2|c-$dCui%jY{jg zt!h!YfuCc{sDOV{rhwjUdKufP{V%@Q+TSMIfig$1q?d^gJn7pc_M4?ABX{1y-#+~Z zWOU6^q<$tTDhry!ugM{d3MRP5pm4Ndm4Hc)aA3yw2EW9ML4V>8Yzc5xivU;B5bBAp zF(VrhAp?eIt2) zFaO$;Q#MgxEVFkr1T{zTW7x4Q`+GW&W16!{>WjsXpIZ3#$%x#8zrH{#;U<-nN)6D6 z-LOlTZIQ)9O+uFX0cKuU@Y6d-|3C@1Gt$G^QpaS_HA(BnM_87!rnclKWMbNfXy$p5 zYZGSE$re@Sik+5z_UlW=gE}vt&lDZhCl_yZsG^O>WXajC;T_GlSmm@qMO6!;s+x|;-k4GA>wD|zAJ~OfGt|<{hX*sg#?*WVKL1+t+$u};fA-3GHrx57tm7XOH6dJR`MRs?NX|{+^moLX zCofObF)y9zFTJ&FY^ao69189^e6NI#5140gt2>xVT!W4U)tZaHM7(tFbRO3K+w7eb ztlqgW1O+ju`e4clJWLC;Gr!rriAMX3ruqb!W~xu^;{V)=tk{#<%f<#a{n(QwYVdzW z3=9mk2mav|D8*o`U~Sa-{?ZQ`I}f;W<3bJ9k-jv#sLe>h{XMuPgYn5A)lz)bMDLo; zsS!ri)JNzJ4u$g^quhgzE(FIi-ktDQ(*M2ciciSlYLejA8F4qy{J$a&scJ7Lf zdvMCOxEuo{aZ+AYUZF3!h06whgA!Q1rt$N^-`R7&6v4A0w+n`w+OapfrZv@EG}T-w zG&O2|%DNjwPMDgZM$B=_Tz+Ic86nWeH zj_4$)Dqww0hnAmdY@~Pl*{L%8wW-Ns`@aRryrJe!-a-ntO-Cd+NuhzryS-*}?c^tg zoRk#Tvjf4Kq$8G}AND^ivRc9`L9D2+GN7D+P0zcP1Kmbm=6p?vQ2wo_i)Bhpewpv^UDM620g%r)$3@-^Y({M!W%mE@>I19 zwG4~(X>E-YW`>Llg0`T!k>xGJBZM&EGnyfY0aXtDLX27CC7!B&ygaHmw_iISomhWe zVZ<&r1?o+$M_1*#GZx;XJqcrLLM(z@Mupkf;XW5s52dXC+&eqTK<(S6q%rxk6#{Sb zEt3MMeHTy5o|Z|>Er#P%P&3lzbpK2v^N?@-zP7Oa3d$#OS>xKNK*pFZfG5`T!wVGUx7@a$p4LHX>-xebsrE`rk!Q-pRB00sQ;Ov&&Zaaq1|XFG zaHR9dnuJSAz$gcSXa?&G8r)BMJcAM2W}u2IQ^u?GUbTz>4@~4n(3umLUz}MxvnKqx z&q-wXMRp;Bkdiyd_9~Sc#DYEl%IdiaSg=`{^OOCrPZT~-;RIPB50ZjI~h}M z77;RJwNm?UVr}f29w*aNazYKB()g9%Uw4$lXBsA3tPzy#)HqL<%0k`b-(0M0PO-bA z(PUTKEn7M#C}y2e_gmUr42IUaUtU{6OT`Axi)A($mruKH)`>lIyXm@c7-=6_X9%ra zY*oDzsJDHVnn4!Pu9!X3^gB}K58g42H7qXRclIaYH>dhP1*)%)Lf6iUs>wKJ?}%Qn zgW@acq@l?N=gYVnrpr76tv>0rgrbrLcSvY@owX9=Po({&FAIZ)Pp(uSUmBj#%aj$k zt`ej%nEOU&(QEnXOOnZ}&q+JXFMjB?{q8;gw1C6$JNoC9B|<9So+V|WbTm{zG=YRS zCj1sCBQ^&FWF|l-cU=dps8);rfcvw5pUw{QqTH7HF3Wx`E$*coUl^>r|Ng_&!6$kL z8c%L5>ZrK#fzMCvu}8w65OKPT*`wVX_wUo>N@nGZ12Z=``-ENj1K%n{KA$)5b`+G; znED%e`Cw2a{np2Wz7r^!6{Plwv$f$vtVJ#@pGer*uaTZ ziyid$?P|#-_=Ua)iR~j6Sduzw)%}KN?bBtcC~8|9!Q02{2n3y19Tcm zUF}%wMhS7t_8mplDMi&89xst;i0Cq*5xZvX)f=~%{i2vMaA3l3*3T!;=c{F|EI`Ev zw7@oG7t?k|?=S4*U(0vBV}E?hZOWD=hFRjPqT6Plgr_FyWvYVP$9-X&1i6e>*> zjYgyX0rnrwxHe7yzP=?PmUg&5^reUl*Q!uH4z;(yDwRI&FUcHuVw!VuE*kcBl{6I$ zm9FRe^lie-=-Dh*+Q!3t)b@q8>V?q-)!MI_=%Elr*q|ISw_Ao+1tH;moI(fs+%4LcVN=^ zX>j!~{=46J$OoZMCwV_CmnE7N^95Y69CQ=Pw4b!31(-O?20UAK(r^=$up{08kqo5$ zW(N)0ml%9O+o7GBr>d&tz*xqEATs}35%5W`5Vfp&gQ&hA7nreE^aTG8=t84~8Bh0t zqvc@tl@FzN(Z1j43#x&N-~IuNnh=a}DutPuiG_`Ew1nkc4^z8xhfmm(Hr%pq{XFMz;gFZ-mFdv!LtY~R?cblhRU;VRkkL4!lMkX= zEmozz+=^f?8bkhC`3IOqM$(cpUno6e3y#RWc0=7Gi_In z+4fzDo_EXchuvnWbyEsVSW#%`doj>Nx_vCYt#Y{2E&`4hJ99HKD{aXsW` zy|BSPXo$C}iuQon$MM*>gAne%LGWkx_}E+AF$ymWJ8rP}rxgYIIO-{WAGtVQA?mKn zxY{}paOAQ}yTlX>*)sIcaS2Gf1bFf1s-}3Hz6Z=t*GD4KE)CDMcoDRXa@0=T&pHU5 zy&~b^55P4L_7>(PWc%n4F4_g<^J*UscNp~HQ?&wo%`&@CmA|8gv|>JffiK5a@w zjJ_Rduq&>55hvv8{CXYsJB#tyIZvl@{5*`s7AE$szY21ipjkSwWXdATItJ-gRerLKn|7>I5NO(kvACIN~PbDAA zG=pxnzZx7xIxhbJ1?OIK-SCKHm;+zj9?sAR`xlM~z-2t@8&)vK1#Ih;%n()$Q^LOg z68St(y!FaK$-Cg9A+a~7g=X*4LvYbcM&Q zI;G9dqm1%c*Wp=FTjPjLfYtakL$L8sTv1U`RZ-QEFfNX+7_C|ZT{%6=Un1SuR-=I~ zFR$#MYMAASloq4o<$w5(C8TPfoODl_NS-3@Po5?nUyhNPNHtfuiCF)g#t1ekUVsH) zV*NkWS4O-s@m^&HNm}r!AoTsE{);l^qbNJf1>KdF!{X`fc|ro?O_=e95Z?e)SMKI- z?~f7IFPR+9us!~`dRFOV%+d0wJ; zt)jCxx2=8m+^#%l+o_Lo*URKCK?ce^et4Seo$8U|(7ef6jtpB6mS6BDPF-SIG5>A* zxFAx7mP--2(5z^&cfky<93&jLf11bM<7x8s>eIxTuxk8=+snh}E&c&1jxpcx^k;54UZ&s=EYd+&VV$-bt-@!}T)WpbE1WDOC;GES0qWK|6i>p+YqSgPcMYHQMYSD=XtRN!e&p={>FX;lG z>;H&5;{yZz9K&N8{@xFMn3 zJWBajQ*cRAyv^4qF}j&tdVw5L=>rTt%wX+|A947K&#wC1et`&gkfBy2bz2Ac8Y%fXxeXtRBCqtbfyN z$S}^4b$WWb1f>OC%IDM{P?kwYs$>kU7u#rblgYb3m5CgZF+5J+zC7KnR4P~|(bUvb z{}Wm7fQ%X9>+Q`yiD+0XQYxVJ;JSktBa;(TU;3Wk-kpK)aX@0}KNU!Y%d|o6cVjbk zgYDkmAO1HW>E_Qdi(6MH@{e|6R*B@J(VI`TNPMh$mr&Maey~K5?^3$S$dM@%IaI1s zlXdCv2b^-uR`I0$jFIK(2fF2qxhUpkRrdS4A#u&=%;noplL%qz9cfkL!EgHKZ9=6c zkIla&x_r77-VC$6oq4V~tnh0y!l%^x zP}eht3k4fPu#fM5H1Nc5AmowswhuwpWlev4_jUgPsV^a5tdid4*ChFcnSL%X23k=1 z-Z-q~c#Ukwl*wtj%)5|-4>d#mm93wa?g$SZmhq9%Xv13`W|I3a<{?$amHGv8udiOc znoN?6(Ms*Ltu9`RBw|)w_#RxtU1Do}?wicm*L6t7a0hKqUDzx&3ccO?{aFbFj9I8} z(N*fpn>K1L*$JO4*YUE!7XJ47?FhfMfA0)|LK4xxPle=v$jwUibRO zd4b!b*k_xY>_-CGhf~UsRi{Gv<*aSI5Zk{PHXDT2PhNuGaDe}=g!q~X6EtuoviQW3 z(`9RJ*wm59zt}&ak?DsC>#&xiw=AmHuQfD;yxj4^fzpoM>HBcXbjFdO^4CO1tYgkn z!_rDSmPwBs)M8p%QYhvfcZk@UQ{oygsE16E-pt0Xn6U_$1l7*8*I8(iH}!o1p~ za#84wCVu|OS_3kfERHd&`O-pqZF}TEp|s8VT)~~^UGMMM>|dSxgIQqjKM;KE<;w^n zahr_wKfBbU$s83eQB#|#EYG&IslKy+W!({5IrB#kt5Ij~_5Bu3_KW3DVUHLD8dj&h z9MbzeXzbz_vz8E2<h4s>*Cj&|0O1cy_@Ih z9^XeDxk_$Db`e5!D_3aC;!0ztDQTAN3|C{^|1R{vWi{JD@#B)v-lIyO7#RlnJrbj~W=oHX%$Fub$0{4%BM>SodZIsH_T5(dQo_n`1-Ws>OBkUq zFUN*kD;_~Jo?93Ek=77U`co+x!w6Rnschs#&CgSFuSTrUljYxLN~7)B=9h6fR7S?k z*gfQbItZ^O35!%QOn4+5u}DbVtAh}SZ$BZFmkxgS@9#JCn+P8TzVT6qsgX}>T7EoU z3caz|(|L#g%UzNGmH&t|BdZSg?J*|ce^T^FPKK)M2S>$>7TvhTE{5&@r%7ml^Uw2< zQN=h0!8aZhg&YNUt{U3i2<{axTW8yBQ4#YxtS~l`>=ntpyFGc7twD(>NY~m;Xa$DJ9)s{4E(6!M{frfGYZFTAincqOENTa%Cq5n=-7(|ELuENZ7J2v~{X+cZ-o@sKtAF8Pl(YD+$w@NqKkLj%c80FKf+d$J&h{|^pyHn)b;33tRP3;mSH&cQH>XJ zrDiY8>buQ6o&Rf#&UM2p;xDhCbIdg|Hp0)-?6Rl5{v`cnn}m~8R8$a*Xo*GYw3dH4 z4EU_W-35E!ROE)N$fzjs@Dr5vSX{x=@G-^mfpSf+#WJ_cjyoEKTx=Z{T!{TNy%O1A zWqZ3yCoIjZ@5zU$X7D0u>3|G>X$EtAFmo1xOWrcGuc+UulZ`#{BmI5@+2+*O+oBg= zm@l-}g_h3>VvD(dXo;Q~TYgKq(jZn%!H7k=SHFywmL3$lUc?jspYsWws+Kmt=9M|` z|HRjFpHMCECtbCmm)uU(aPz{*nEHMDSW1gseEbiHU98?P`Uh~`TVqfcx&L0FGd4{B zABkh)l|ta0K?afmR2BW`qR(F%CRV%t-xuh5Qcj2$lApSM8u*2+V%UaGBKg4i-_~ox zz7Y2=Mj-y2xqWKy@SEC=>;|o%-~~;iT;IJJ-YUTZUFPv?=x<{eKfdEf8mGn`tNfPU zzvcA)vHxqWzh*Bpf_~}tC9EWoz(vp1l{vpgG(3P=(Gm)?comene&mflBe}+aM`Q<; zp~bJBoY|G7wxWN@(p>j0CBHMt)RxjT#&_R{w7!q~GXB#55%e(3EV)xhn!E#vuG)wf z6l6NV#Sc#mR=)a`>qms(xasMyi{9?>K0#C6>Kq5ZzPN*=WID@SFXS3~s*4>*7vBan zgwJg}uUqCUwooX!x_G{4?-G>J1~cAev)Tw@@^0_iPdJxF_puciKwO9@vg=Bi+9KNJ zfaRd%z~vx1vJ;fZlS7w0(UfL%x3|ZHOdO`?8lp7h^M44(;q};xDl1&uK)6 zWmt^Ab43?2$SNDg@I~c2!xT;;At~JO1tcRto%^#oe;%iZbH}wj_lXX_yz;>(zT({@ zy>~sRZAP-P9|giqP7kYB!^6R%2U6rNs@p?-Ax38Sq>&W06 zVNA@D=IB(!qUP~6@1)#B{s=RyWSnl|`$Xb+zJ+qtUpF@DXDC)qFkm78;q@v)rl@YE zcwURrpxl=6%E!i4SPFik*huag)TA{K3B$HOEX5gd35G~hYpS_oPBhwzYL3`h-O#*r zXV2+W8U}a>nPnKiZPDj5uMg+be!^nrwW3!Z><2r-M94TdwdG!?&1)#lP=)zWP(FN6rD_UnxlGmPD5(>+?If}Nv z-MizFcrN-+cE$0oD=R3FenNwsV*nRM(q>Oe^Ne04LCi~rh*S2=;u_>Q*8KfO8gq{@ zmhJ<}K1dvEnq}|1({rLYv)7~yyw{dLS%a#dhbi&u-2Hfc-|iBtlz+BCv!8h1M6-{$ zXnP*#I$k=A1KpK78kjBb_1SPx$Lh|7AN|`Wt0HQKLKaOa)Vop+IDyki z)v8{ax)TA#YT3>TNoGBf{gdHub~bdta=deT zIc^4yYxcO;xAm-NJHw%w#%?UXQJJ&lwKw-G9W7oFm>+=o%IAfgR*T8(;ZI-C3hfO} zHBv0HhDED^?>Z_esImn(kEMU=$ykGIEc#VMT%o^@5v0YG(Cie_DGeH{;0UW;^&4yP z*jFtAAJzAgd3_@63I4WMBBXR+&P-YNqgoEn>-mXFY{vkiC`K}pTJ6M1)h4SX_nz*_jW{lS6#lT zdQ#T!#ob)?*bca6`LW#-za&yAI?@XG7KnNO)B5zWwkzn1SCqSsA+NE#@;i?%_lkfo z>g&j_h8be4&&9Ff_&0N$*fqQwFEL*eNpH^^E{0qg_#(1$&xA&nExeCY@jkwUe%kyb ziDL*);fvaxD8eUN3u>~d)+Bd!p_u z^|a9&2CuqbqG;#75y!;iAa-$WPZI{u)A(KE+*nE)FR|67!;i6v-sL}jcYjs7VWFD7 zWMFqSRt}210`V_zT+AB$e81%UP`%JqN`S?AG~N3O#M569>=CdEGGH+}rE{Sg>v+I_ zzDGDN@Hdyv#lGceMt2$Z1`9%PmL_;mju!vM27V z9B)?39dr6Pk1daE=K@Tp5FFAwCA4i`N=ObdT@2RkGI_KRORw0n*7z*u_&8hl%-bt# zIbSOOQeNfo%YEi(vhGhMrJe}QW>4)vtX6SY5sk}l*GkP*cf;g6iG|!oGeQFat}Fe> z%=Gt(s^RDsBFWlQhct9>YTrPXTr@q)Zes9=^SfipLSge2%&lCTYteqH2Cbq+)H|^4 z6ii{ZYaj;VpRX;RwLIhhY1l=C#K~<@XLf&1+}+_y8{@bFI<@s|nHVPqxfLTA5@9}p zfM*zf;o*#Sf{BZ{(GO<7#AItxqHorp4EUg*Md1kEMARnS^DQDbB{r96Wjgo zuKHbkC}q*+iP=lM8@|f-Sju-ucD%j(W1oES)r=N&(R9PC1*J-6&hRRo(C+%@qVCVv zw^c9E8&N9PsLwF2J~Ug*Lz>b*fKQRrpLpoRofV&EFuv1n`aV6+{imFnvP1WabV`xj zxt%#?2SoKkT#so6*ka4i2~~yP+LM0R&fy4BeZKBsisk%Zy=x@*0{li;sLv|&bMDu< z*q14LG&6U>)vRs4(+$rc%LXqS#gVY2Mj1psU&kqNBwu6gpK)QbQQIso(zE?V zQ4SKHOwo4P_BX#q!(TAX{Q zahoC*yPl#-BL-ley=RHOIM{(HiYn_oS-KO)XE~t-%`F^`lTm+#&N&?wZ~LTZ{5~{@ zB=U?k_Oy=lL!D~9EwgVBA~c$fR3T;Jn;LU7+z99`em5_rkeinAQ?zMasux1Em(J|T z93O%aMdBVkGSr;*Njx)UlJ%21duUV4D*H`RM|?3pbu|4>;oB{GBe;KjaSgk6`RrA? zyo3lEIds;-GBcXB+PKP-oP}^AtXpR9^IRyL+`GAH-^+%Vqisu7zTf*YX%?^Jn_8XYQe-tOt{bg@^g6LNTKKVqTqJUZ zttVqp%Fm)vYBPK#m?FiQ+&Mbaz=b|n+SqJsXk-?aJm{MxX|>0*aaCdB%hhXnAwGe6 zgm}cj=6zq0fjy~p^!_#U6sges@vB%1qjQT=18=*-`TV$C?#1;`8su@4uuMGBDQSa; zbGjO_7}{rlLm*E5WIp`w&*u-7KY;D=oP9Rx6 zXiA7Nr?B3bG}Ytyz#vlP@|D`mAe)nn}#{-;1?5Bn)pw6M2s|R za?y;zVKLUWXDrOP4*y;+3jIQ{Z@eO4vE)=TB4!QKTwtM0a;mwNUytA#RDuW74JVF2 zBya7XE@ndq##+IMtqFnLla~}tI5}SEteB)&zH8QuAx0p|1QO6PGMAK!H@kLqb3TSA zJL{%MR)dQ(+N&YB9NLCT#;Nz%PuHmqu+60eKy+}^I*hGxuMXB-ei_DwCxk)cN9nNj4*j~yD=i_#3>yQ!V%=1~&JpP8s z?G!H;yxhn-J=R}Pwp=CS=J7d^-iF6nAhSW0s-`^^OXT*gTs-D-=PMb&*h`8kkr*2Y zNng6@9`EJqhzRAtxa{|d20h?TzjxqwQO=ci<0gmX(~I&ag~>?PS0m1F+VMXsQ=VSO z#sa#Z`Y7U6T?Rh*r@NUox}EO5+W1R;{ckDvb!LGWUOvClhq@?)x|tebX7vi6_PONU z9^+_lFeSjh>C`fO>!ChX-KzX*`0|AR=ZDg9=gQc}e<|*Wu{RWTLedKe^@NynyC#p7 z-=d4sUo$88_}#Enhi+l`4G*tee!wZ6rI2Ex1YJ6*zn_NL(u4%GE%>e~bc;9Gum3Q7 z`woU5pB8FRT7iSb!N{CaBn|2l^MX@KT&9)eKJmm)T;^qG(`~kl&kFbNz#&__)#k?j zG{a^R=d6ss<=<#gmsPa}n~76JXPbX8pPn@oH@ihcan}qq%{8BYadlCXGBV$FIGy?T zryl*wcj8Jxt|oaLii^XrWuYvdD2qw;P~i@DYz%E@q{#23ql;F0#rm2RiS8G8RI=n` z%{T))QwYV$EW=M4l&oPl@-v$8v4liFi7&Tyeq+cNyH$KsvFQUhq+@KQV{T|LHcZc$ zync4CW6r3&E>9$vf+Zm*&qr#}&;G zwmh{sP%CG*2Zpu}Ii)@*JOh3G&b(o#Ik2or_5}}C)?81zu$@~@mbj7enY-a^h84S( zv+;rUe^585Wrbt#SE1R z14x0W?u6P!${VP8)lWXyjdA)QG<$qYuz|Pb%nhaT=I`Ms66YVDa(1ojb;jr?!-{{xI8_Y?jBo`1Lg4*cz0_$6_j{~vJmo{NjDjLAH{n0kp_om>m&f=63q zpDCIc$6l7N#O6ro-_VqgAKGwMjLor|TM$GQktOiSQ5xLBXG*{2QCq|uP`?Vv;B+|R zcD&~XXJH;6r_lYu2YaOB;46l7qqWZALxsPgk=(2IE@e%)5VuY56v1h71igVEL*AM5 zsyl4xBnK?r|GRyutj}Fp#CT8Z#-D;{5eun)SpyeqO%r*}m~3 zalYV6AJWEcBgCvt)jt3g>2vKcJyUOBOmKXL8&bV+I{|sCtx!l^nOddAz1{`gGJG}R z>?b~w{#rI7`$xCwy|;c)=hu=?IORLU!Go~fFsSr|VK$>0WwUjCV0sb{atevyN-nH| z?u(h?ishIV-r}xKGRhcY)oj%Y&2mG&-~R#Sr+?X$%AB(Nem3RgH?#O$t9V^A(5t^~ z;&9dM(P+ik--;=w9|v;oNuMsZh+plp#u`K}AFp7^la1H#5@aW>q!AReX#B~yj~l{n z9;4sPQOM}w$XO>W$;37mZZxQ!(B-Jajo0WdJZ_lcgpoaaTnTiU8@Lmt@x7yx!p330 z-99Ho<+#|)Ur^0G5g1Z9!XNz}p77!1@-FI)7cq>&dC_UjRLmAS^aYJM5nJ+ylUgz8 z{4T8@8T{^5ZZB{6@`+U`v5&EF=%I9>9j>0DHa^*;TNGGI%5JiuhLJI?pw!*7v4$a-p^_&O%X{#1p2{n%*vojMEhMPYN>FU7=dy>O8e z9g7lbXpv;g?fgb1Lz%x4OKP34bN6wO8jM&NZ(~ajqqbhsVx-DRlfjlKt z6=ceCtQnP{&tw=$nV-bVGO0Kl8xL};YFia>d8MGUsFuh*rkd_^9973M$lFo`WJ$NH zc*KHaeJd?>FD2=a`6<3!hKiGr-9GsGXoa8-u?)5j-gD5fs0wCPWmlN*0h{#M@+4HZ zY8R?a;JF~kw%iJzk25S$PI7GbMg$l>{y7xDkT+x)KsqBs($qZmALc`+enMyM&&l6`A_8oQc6yBJ?YW8gYN099YzggsY-WZYt&%U6mQAJo zrmZ2>#Q4*t6d}(gr7Nn$xhixz2{$f){MXzX(Gt4#Y^4ebGpOQ;)+Zi!htH}5I$JakRjg=L~RJl$p_sGC2D^QP@e z?eCNPh8vmVbO>6uw$=oQuq?)~u#eFQ4J9iPJ?-f4Sl7YZig+2yt-HT z{9W&`D%gwTRmxcOB~r0*>8pHLaGXnv90@CHRgQaAK6=EUSLm>tJ<^ZJM;eiG3t2yB zgvJGAY!RcJL`9ZFSG;C3qIPQ1XZ#ihVfWDEH2D+>z&Y@KRf1x4^0kbMc)7gb^z4`MI{nzM^R1!3c6uJbrL{<3*X=e!V=KqqpAaDSL zLDjiOxvBrehXgsz-r{EC>3j)f9nOy&(jp6|yI6hIrrQ_pxu8+2Jf_PVQm!9Dqz2IO4ReCdoi1?7Om|RNr&adPs_pXTbajPbN@W7#=Ig+ zBy2@V>7CZsN|x9V8;qQswQy{$_Oj5bN@l^ zjQO!ix*tHD5~j)*e-qcF^^oweS=gE0asG9`Jlm3|54I%}APwbeZIV3a0NB#GVQwZm z7;RwdYBVA484?D*bK6Xl7h2tfd*$+n{T{|TNihv4eRJSHqz{f2SDgc2lp1hZ65Epo z*$+I%^}fXUeeP71x%tN0*SU%Fpq}Wo^JD8z#pe(Ikfc`P zwo&r})UR3@XpFAWk)KVYo4cNVy=>A*&xsu2eVtYOO}b`USqFW`@DZ2~HZjrq`8*wp zK>R>~;c*FBX-{^L4jtcgqKxy4>W1UTTPdO^dQCbj*4rO#_MV@>Qr0y?XgdQ>^E5BP ztbrRZPru!cF^{q~bz3LhIQ}kMVYFTBu@+u+6=@0YnYU;Ctlx%Sw9aup?wh#o6DxV> zLMS`;+_?(=AsxSb(#4z{{D<_XzU8S6TX;n#(VweTa_?doRFJNzQHy+&WvWFP^4B5s_s1KikE_GEuCljjd9TY%@ zFUZ{jOCGB@6J-Hoc)lKlupb#$EL+C))g3BfPM3zB)A}OS!XW3>|G4H{2tE!hxG6d>1r_VN*C;Yx4GdlvL#jW z6U;pK^fbn#KoYj~eAkMP)i1&Hq;bch{Udv3@Jq1d)8)8GDfgd8nI|yYm}H);=W{PW zl@vVjeS$s5v-hXlx2+Fta>(YzxFp=*(2Pk>7W}L9L_&qyp*@m`MYgdEKR9ACxAsM% z?@BUv9pmRbFCL_!M_F*nIuZi;WBS8BV*D$o{&lkn62m&z#76@ZlQsNH>lSa=&jInJ zbvf}*je}ua=_FDs6`wPUpId7L(trK7HUv^13!Wk1jc3_rRqS3h;Q6%HOIU1=$lrRB z{(N>tYiFF)p3YSowCs>uJLLPP0en0{gUr*Xn5JO!Q>Vzr^eBPFhT7tSS&&ku3iUlOdo?guna$$W0;u z10#YYlhd*G*0w77-(AT6s7=7sl8`ycaGoLUx2Pq5eh2${Ieb7gqs)|sTdy-XQ8%;V zKh~^*m+U76`o02vF37qR@i7)6xdWqQ=i-lN%m*3Y`xP%nj%yMgi(1`7pR@k-Xi?~4 zaaK=;)Ah$v;^ALRF;mUWzu^m=HPhZ|y6_xP0i(}4XjPyG0DZ0G0G`<`iNeUYXec8; zKNiSg_xOKWKm9^Cv&0fOLT?nUz*3MFQxE&Eb?lhR!xAa3Ue=z9 zvL7mmx{En(DFbwk6ar)W_K2T+mKziY3ZcC2$Bup=)_gn0Kg|~zS!ZUI*sdNi5 zR`|2!aBae*uAV;rGxGd^xslqOw0D;cI+l~Q+Ea6og4su$o{QMXJ00_iOWL0y)smkE zG*4uW`b#IiV<>|Xv(ET(yW|}pmOc2Q$wz|hrpW27x*cL;$6ncmkl{zG9##-3q@<*bqfILTYn=z8;n zN{JKg^y`+zKYWfaL=0iQOk#pT_T*LivzaTXM72C=0* z9pwPuUIpj6flthRn2wIlo$^fIypB=Oy}l!1>eTHtS~5RKwvk9`6rJHU6p&<=}di!OYin zdpTA|Hj+IB-3~)oJBI#>se?!oqp6myT}hHJtj$a1gU)^)2y18r6KGj?K1n18lFwOd zTv8}*w@UO+S-hgb$^8gE zBkllIV{~H@BjPGr)zEA+1Z1nW>T$5;T7J-PB+Sk{e zOE|PY6DS8B>eY&P1yD~|FN(e^`;|Q=75gyh?AV57O206aIzy@fP>GaR5FsHp9^lE1 zt~Moo%@z2bbNsha>JWJflam4E%iLf_H3++05^6C?e*8qPgFLU6>MV*JL$htbO<^y)wT6s z$x{m`?}&_lzpHW!pxT-9R!sU_Y5-#7B9Vd)vus~VC9ZEN9pHOL+mzceGt*$p*x=n) zty^6racK}px7Q~-fmmrKdlKf;|FU|B_*Mdbw#>&`Z?MYwfw7`fHix2F(KM9NG8y9a zaT7Fh8-`h_sX+DU}p1-6pOE0(o+(}cpzz4i?jubp4N#%l(hh^l1-qq_WK3f2Z@e%XrgeLy|6Y{PHr7BQf4Mw^rkezHkQ)_- z=Oxqs_V!^kkoH`b3JLp8ick^V{jI`ipmrA9{+3M_rXTPA<*1{d^qW{NHq#P@cNuui z%R~Yixy2doh%rMsu__t@t;?h;oyJZaW1Ge{#ApvX(>>q?$qeCOmqP{0RYqybZa%}k zo+`pzisOCr^C z$CrEJlcW6NT>{#%YsDrKCcY*a->#E~7f@K5-+8jhm)*z^HO>qt+0g$w`Aj`Ahe>gwtW4uqs!{3nF$;6$_k-oj@7PX^}^VswI#qj*GLL&8h4qh`jcdx>t1_^yeR zxHu;#r}+OKyE&u?DYYb7bwJ!9Ml5xZ{Ua+eBX&ZpitADDs=) z#0JLder^1hs_eXPhld?pN5n7qglOkK<)t2hGV-|uIXD;qpt_m1tpkWF>!`ieJvh$6 zE>dxG5?XEVt{7wY_KIsWY`L5H-*ZSP?@Ik59T%y2OGiNW6*-B#!ecy$KjLMU0+3e; zVSTN_3N&Siy3pbUME-$A5irlf#naDq`~8Y`qEN&T%n#9j|*7yO~Wqd|);H z6yGaneeh=^ASlmFNLWB!-AFQheXfB*?d*M!24G4zvzJv&j%!t?o}u;Sl%bc%@6d2Z z!lEmL)uNhf0I)`fKo#}}(&dvsOPGlySSR(q;u|{-QD>FPxTv7lo$sx5pdO{jJIOs{ zbpRAzu{%A!)}w%Y!bLqh&1Wv+8yT)hNv+Le#9-K2-z5fQE=-9WBst3;*EN%J*!l4KX<@xCC_QcD37+s z)jNmg+~|`+t$oCqHFg`kf|p-J~*#yp)Hhzn{)ZI zcj}Dsy}P|;x;cWwnBS$?y#@jiZJd3OMDK$_S&3ikj@pDJHQdP{?5&HfNexLPfVZ(}ny0zl4^g1qA?BEkf zca*dwu4)|I;^9oj>>__ACzXV77)yQ7bS3E2>jrxZT=t7=cu&Ck&+AgBpA!oKnn~a7 z7_s{iPuknJZ_T_&%H9dZ^GvVa_w>k5jlwvMC=N0gZXpI8~rPqIS)ie3JbA$QX8UUc@03=q!8YP z|LDK}?OKqL5cnTry!{d29kEby&@y~;&G7%>KL9}ovUt{No45vXGwQB&1_RwC%7qp2 z6_GjLczEuY`Mz$kOoM%znweM$b$*oOKwf5@UGx36_SPb({AU*nqEQXa3h|vM_1sDP zoP;*Mfw%4QoC3K$un>oUa9dBiV%tp#=%kKuy?Uds1%v)DI~J*Us?b=<_)f*!G7{rq zK{IeKs%fEvD+`{y?t@Pf)R$m1p)PCrKB-lq^GGkdF@V4H<1|_4R!p`BC2Xt5=n5UD zE?L%cQu~p1Xz7B#V*@&Pn#a-Ofk;k31Zxaz{K57#-A>rg-M@P)hyWD>#}v8(-izw32or9Bf=$$u!uA#C|Qicb1hZ4ZPG!Q2K{NC0BGvZ~r?> z{6oUtAE0R2cBae@ds6?zu%cxur)@3*%?OX88qSb(MC}9Oqu011KlM z1lSj|H*c_@v(R69-H^_h{NSj*;Dn=N&Z680PMFyi>}an*94L|PQGwn#Dc8$b=e#UA zTS8w33;B4)yqqnbw2~McbuMU~ea>q(3#aVT>(BO2ydKF-<_hjpoAu|9KQ`huF7vs7 znYu=b9YiYf8YdKtO$%_ioNo8lUrP8=kRc@`<Q*A_*t~cms4+%hm50|j-SwEX zi_OH|tN}4KQsgq(egGawI49)y%)T%Ok4=LnJ)snic%ns6E|>RAqTh-x!99Np4Pn9C zAy@q8wySC_ZkIL=TimO-^%867t6Z00MjL9$Ac$3^QK2BT>@Jqx-_D?PHd4fwHaAo~ zBvjKiDCcpBx1yO_6IJZ!v;zQZ>sthLaK(x14(!ABHo3 zhEBad@qe+GEP~h;K@<#yvMn&+nj$Dx!STrca!^LUp{o;ivh-Ayy_2dxULPty#1O4T z>iq(H!;6lT@A&s`X6KUsAw@`dMz<_YR8WhfZL)E4;1Ohh7q&QyKh%u)p+=c z=)k}6`aqYKuQf)y3pLK-tQT4X(Dn`6S5;|ZlGVpTzXn(GsybHackx%>XDLj!c~Rd- z(J{yI_igLIh};YJcgsf5J(bSPPZDggsvRur`&NO<12p2@MfEWvdc@aXu5h&u>-=|=6PM=lLd`7BXAh^bqe;gL5X)X9$w-%^NV ziq`fPhwnY(7na}}uZUgj4dr5pP?V7Go5}5&H}gfQMGouLLjO>t zmG-xDBs^i5&nSZq*ev=_i~yK~h!r=n0&bBonpe$EQF&NKzTjeN;K4a!G8)wL0Xy(& zm8u2G`kn|kcFuvMiT3pOQ5wQ{3wPjodi~*;)>UdhKmKZwfJ?)sn~~j- z0HVg#oIdk)CcPP%?}pG?C_HLW8ZO}hTdehl`BahA^I)&sXjaAghw3&I5vRPMRk_}v z?(K(vl{PL9t_?PDhM)}hE&KnR;;9$^6X9dRv*3a?t%6e?n{N%H-oWry+yCi}LZgTe zv6CyGXO2YwldNXqZhi5F#p$IAt@v9^jK;C_0wLZSh}VOI^8S?GKfcki2mnY zETes`P6}##6usD;qlBOz`B`87cVANG_dldv@9WH`!)ZWz@_o7V{qYD z^Fj4^ih1I$X-JCx2k$Namf_t4loKwE$kGRlS&fSAW&lZM>)WqEwzYS(8C#>dDR470 zTR!s++Lf+NhBZwl)1E6szJe8{j4R2ph&`unYm@v7{5NW`K~UkyZyqEX?`Cyw(LWxM zK9~OeGxw|Xi5K!xe)i|c(#<2a6`4}PhI~fT`DggyyqpT@j|nG;Q#G1Esfeo47CA+$TPh>8?#%sG+xL_!UX8Kk^hP`h@L1GA9t$CXqVfWl z=}#Hl;dv_E?jN~;Cz>W*PuCMT=hb|J{1}Qj;b+K=^c(;Wb+Ku0xkwA~5P1O(Y)FWr=0t~vXODDPW)sa_DVPtAFn`sjEj`0J~g&V9n(kJ1$UNTK9zkY41s zw(iFH#<#ROSxCVC?HQuz@BAnlT&bd*UN)Vpj$)txq?+yL3iDMrsfHn_ih5&nU@UXt z*n+gpE~=CRfdjt7{&8&yiM9*sxU9!pw26u|t_R|3ebz=c^>Lx*E4od?{svb*3|xYA zu6Oce0(1h&3FcG`RgKCE-8)&C;?So1XeEgeA+l+q!V29a1p{OCa^A^QK5eh-X}u~Z zhC!t>qsOC=o7uETKS_XAs=lMsR;XC;?M zehxc%Q9iZc9OOkDtzg+V!zvhNFKmk#Z?7B&NKQS8zlrh_;;pJsec)x0S(PvUsi|@u zxe>}*gHw)7O#_2cnsj>TMUljG!J1++>0VVoS>q0q^G6Q(oH0d25NS6>gpP{)uzfXn zF73jpuCv*4uH!e=D};$z1?7^rn1d1C*<^p{=ojGkcGvPlft?!xDSn(O52hrWdQZ?n z=U%Qve>zSHeF@3;6KK}sfW6CtV7aDIi?>YX`s>iKoLA1#Y=vPA{M9AcF^h%ieSTxf zEsUUZZj{9$ffS3%(llLkYflO)^Wy4#wbrRv>qg+dzib3jnyQh2!yJr$UX1yv#&M7L z2`;_9^XK?!nwvL|(uYzIOC$1jn#~BpgPOQ4q~Icu7z?mATNt_j&Hd-eb%FVDjRJtT3pM=cy|-J#x%nDfy~t$i{^fiHb57=NL5*; z(dRp~-1S0`dVClsj&&x6tS8hnOnZfksM-v>`Ff1q#WW`?$UV0?-l%SSWLuloY|PBV zqPR>5=2AtdmP%_juuW|n7?eOF9s$SH?>?`WgLp9Q94DA~u%~8RPUVmCl8%+)FnJT_ z;`GK(9)>^j-y_{8gn6G95k1p#jER?`EM2lJC2bO*$jY7A(yH4tBt&>=fF~M``FOA) z5Loq7S$r*bgOqK1lhNo7J|#$D-a~@Ggv8EDzxE4L7T0B!f1#P`wx4<b9 z4>-1a>ro^Z`zY&*)Sz(j3gED~e;57oDASv5{zcpPReZfPh*<|TkIB`~CpPP_Ov_;w zr1KH4GBN3W0Rm8y-px97drMUL7K6i{X$ZYHwk%>_nXPv7OYSxY9;$Z}deUi7(KpRH z%3<@YD}K^j^wz3RUP$S@Wkm5SIMq2Aw)GbRQp{#F(!eI1FQoM@*9T^Oazk5+V%Z}X z$D&7yfdgF!m{iABf^0Tb>aZA#L$hgNQd>lPXX<2Vh z{v}eTI_``qKVdq-0byA)7{ZDSn65>(KVu-EjCY?t;R~aV^%u|adFD;<3ICPSvXI%# zk0dCfW;+vcY!e>aLi`@-F2eI}$m2~wE)AM^QrTNP5EEdm!QVETJgSCfK_OYubgvz% zZz3@3-6gqtz|Y;l()*Om0m_&e|6*@^X0P&%p5a$^P@;p)Kox(E&WtflJvbNd7M0GI z`XMO-U6_l;s`($1O~#0cMTx~8#83wIKB_KF@Bk2(>AsT2=9*CGNMWGoG*qHFkJ~hm zMY|IZeKV!|q*NHf0zIbk#-Fv}EdN3|4eLH%Ln?Iqrhp}hNCHkx>mMyASBg%88pf=E z9H@hsm6Mxox|bgl6+8$jRt^cdi^r=ymwW*5w9)}WvI2Nm={xyOJaHvQNKxvzxEd*G z7sy=yYPMF${X?oPjJFW5;kP$()DE5Sr5z(CwB?0daZ>S19L^ubufX-DX>0c+DDnEuZ+(khpTz z5OoDrkKXbh5*sykG@L_D{pnfq1a3$S zu===r)GJrj8o5dMi)?0t4!j_GL2{OHn2lJ9+t{#4|;q!&KIEB4YIO zrk=TEbca40ihcRpYx+YW%gdwG1Q{)SQXahWcr*)m93`$4EF#oM`;o7*0q`4uDKwHD zNj;?ef>WPq$1j?%%y!!pN)EQ&AgHqem5h=x9b*Ule5Y1F?&(Wh+C&7V>|h&1?(-$A z+yXYl@D$1AT57*^ou zlVw#1d!sD?Fm~;H1?_xOp!`0k$Pjv5&~d}Z4iXN3r^!lgZ~aDl4yLHdyp-=x+UiH8 z5)KmR%y(J;8B`tiUOThLIYZW4+8ctKdDPKR(cxxKqucs!gy@7sGc7ppyRf!5lTSOu zG~4HtSKyoo8`A@#(yL6Prcx1Qh#KCP%F{wY1Dm9vJM(3dW~0 z9G?*YKFOByuD=7Aufc(Ou9y{KoG^vNPBVqls(uhGbS$GWkQUc-*-{#jt{^IFnC$%O zA5zugZEd$1b1=1TZ$upm6}eSVO6mWco*lLT6wiOhTI~0Ic{(F)~5N&Enbjim?SJK*Ocf~igCSB>2E2S$ad?{351D>3^z@5! z#r6(@w))%`SijN|7Tz zFlFdi0f8{6~~5l)Ln3nwbfAlMH!gCP09vR zFL;{4Nq1}*C#5f7x_x7EDq5jm=!JuK!pYZ{b z(~_?}ISKrebQA`jt+*7-w4)S^EMf4}Vz3pGEVxJ!z3%AFdon&i{hd6@F_ooTfZ9A5S-9y8Mr z@SV$nQN89;fxOQzipFP-?Yn~MnGw$lIL00nupK?L-g<+1Y%O>zCjD{YMGvDW_cw9B z2626*wd%W>N7Po&>c`-JNPzd+Fq+?^O?Gy_oU4LTJdUYaf%y`k=?4iVta^sK>XN|f z?z0G63PV`id*>G@XAfF>7>`kLeD>IEh5<*8ot58^_yiwY2(8AiSV}Q<1y&&^wVzY$ zUAh$LX82UeinFN{77I=SQ8pHB_|o0TMx}OJWfE`eTcnv2c8)2a>RmE)hXtCB#J4B! zWVueMvB$A(v5T2HIPPGPKs9Ww1@tB~tu(BENRc1DCMpt*mxK$GBv}>Oq7*Mt=7zK2 zW}(rkC0=qdQfqc6QhH+?rlNdewu;MLoRdG-=g`~zz7|gfUBrnL68P{Hsy3ia$VSMk z{%o5hAFHe3kw3O9ete5u=)ttggkJb#<+5~1KAb!Dm{m?IK`lZxbleZenmKWU>YY;C z460gRcC(6p_FBJdQLz4JRvtmOV_kgrK32n)V=1(p27Y@4#u(#@ou%Ha_awbTDo9Z6%HJ1LuqUpAh&3%Vc#J_E1K`F;c zCN9fBAu@tf!#Pi--oz~-sG9n1Qs3pWaxX`j3^ML_2-OWUxG+WSQNV zzxsPM$6XthV~_w?q>tAk9JSD>MM6T2s72XG0tI!k`%hAR35tD-KMLfS(98|)s%KJ2 z6}Rh2qWc6gV9?8OuwWEl-Uap+iJy~ITiHli#&f2j@xPzlx2=atSIU$*Xr0(jasu_# zdO!UQp1+x*kQY2ZEJuqriF)DZ;h+!BD(g$@uOEugBMd?7MSh0joJd$5P`DA=)(vwe zns(Lm_yxvWX?`T#FN_Sp@=GHr{;OGZ!|i%QQ|^)L*RQ6i5?U6+94jf+tEe-zYj&wy z#EfGZ`#41Y4);%*YQZ~%<7pyh2t$v;D7z8mE`3>GMj|Igerq8p8$2Vp>zuT-q`Oo; zvOIL`rj#Ce2FH9D68a!e>svkH!s)^NAYC5v=`5)D)my@oLR&a~v?2^eQk)f?FV0|z zP)THbjK!G|$E)KCpF#=k^>_8>+=Fu)#T)!dLY-x#pA4QD;`IT|V30H*30m9KxX^ZC;Yc--%h_eXC}t7dJxq?HBX*X1{g&3u zI(vPEvy3_(gUwmXNwbiYGwIrx2@!U|h z9gA{EZODTa-3w3`_TXAKWy{xTn2`ay!2VFMjFG4e;7n3$4Tu~5hVYn&Jxm>zM?(I* zZ~Jjnq&>~3Bg@TfN(GmbPlM@KjvS3_o-R(ZUT5(>S^ilZh(5ptorZD#M(fsoP`&Tm zzDS*Q&_3kX{Ch}f$t=@#EPIB+CK{7`+tJp zJH`I}NZ89f4Xet5m8{}@y?AeLCM#(P8@I&2MDCy}rk_7KAlF-MqbA{rB-S|{QPBCe zy_U0{)qzG)1Z{JL`+EYy%txI1iJpZ{e=|=UqzE6ToqU%cm7r&TK|`eK#J(GTpPMTA z8i=9ln+Vh|46l3>I~D(O3^H%56VzWntB}5~o0)>4Vry8b2c7(-tXssV8t*AId6QI1Vfz_BYTiPx`Zb@R zeMRy9(u@`_477jcI-7_%rP(TK!Dn)0$ADup9-`m*seIMy+(z5aYOiXOKB)WBi*>DW zKYmx9=eZC3;`o;e;fN|s%Y9AAA|Zx?GCVGeVy8%&p!D@s1vk*$c}&40cx6b@Pr;b! zl<3gE<}(|fsVI_@wcYZ1mdG{SCKPD74C((boT0O0|cI+ksZ6}XkI%_REg3( z3W`EzU-PX6!@{JhIBAdVY7^`mtl=u84h?R652~;EVh_u&&aDE#y6Sg26v&HLq(DBQPx#Ek$dhV zesLpQWZAkI$-6JiA_bjNmaw5^vWAb6Lo;mlfeuG}Uu>(*N6g^ImB2=a0nm_ZixQt{nxY$qP{1h=M0%HaMO{^`QNW$ ze~k2=KRsjbM4Ve+e*VUu9Sud{kWyXX`dAQ{Eb)e`+J{biT@EnnKa}j2(g@9>(2t3N zsT%m3NJ$+Dzt#Vq2W|0LlF}pR4H_FX+ddY!@^Vfv&Uv4oLwM}!b@j%Z;x);tOBU?S zi0(pCS8m%woO3z|4#9^Ttd6aMiK@-}&#iV1v+fnO4j}mRB1@+?@S>>|SkD z5}kx;F{0f_LB&N<1SIK#c_o(>Tbj=ZR}Dd%eH~f>T5!ZclCm4l#QKU>2ax}&TihVY*+U(I20e2pI52KBi~!;BbBN{ER+~} zOic?MYSfY9%a(IQGbv|vmN|DK-I;t|fSM`}!IW54-5`Ssli9B^Xq4^@!g%S#?fOB1 zcH}K_5WgClNvCPlJW-a89n54ML0i;%agPToqwyXRuXJR02&O8+0uxKBVnl6>Rm+L) zxkQ;_=FcneI3Z9m>mWt)EA_|H{#v#H!4bqc{X}QSrjCxBV zo};17zilU^&_zi*)==f$Y3?SIO-sO#liNl2VU8Hivww84i7QM;=19iVJZ5|$fUtaE zDMsd~JtVV}nnUc3V`A;QerDHfqQD*4DDtHjJgiI_H2far+VO^Ad2RfQtwN~H(5e+S zPZ^iQpYLsYo87K>@NIISAZz`D)NAT+WLLEGRn`%DwFU1|CZuA#;UwY3-`O1ajJ>JV z>-#nq6o>8aKEhB|#$j?w7gSzCdEdT4Mhto_JY=Ta(#nKS^^%eh(BM&-PGzly{Q_zA zDhKP0=oKkV+qa~Nf`XdgDNc(K3}C)Dgs*k_6&^m5a4axp6_l&zjGgY^Yz5 z`b$jTz|;__fos^x%;#G{qVQiOm>8)QY@=V}-Ah@72Y0|UxeO661N+)6tii3oKOE;M zb#ZkGtJsH^w;SI$h7nrl;EivCYxLbaMW27RgU7-KUY6jidj!i%+WLn?=;Y~>>c}tc zz!@Bm0it|hN(A*@R)U1~Mbrc?xkr(vt}(IX!Ac$&b4SR_3!&;BIM$A1(|pF0b%I#w zq&#K{TD29e^n5Do;P6`A2s0@LhT{|mBBkXy2jASJRr2k+%WUj~EBY=7%wW3Ec4M@> zd&6YiFLgt*ryHeV^C;5e{sRDhw9U7rZbVMA2Ln(b!z#Sii26Cz1g=jF#Jm)|%08!z zbJ`oMeSaV$62EYN_s7RTkta*$Xk zhQuQ4&BRiXlDYCc^icPTwd#Es-=XdZ{Q|XGhu9=_wk)xONyJ0XC)3pC8uOLFtHcWM zG;Aw_yheVSG`wrwhIdftJ|Ye^PAVPYAn+mEYLhQcWt*7?a0HZ9 z^rdD-c636seO z$?&Bs8o#V4zMgP{C9*}~Wc;)#Bw;FZj{TM?j@~LHd zlr24BRkI%6Hi5)aq8oB+>b9X7={^mmB!M4|46m1>(IW;p$m6t+vXbD87>w8!YQ;6P zpj7Ud46`h;*IP<`U=;pztKOXL9cQ1W>>~k*F{|O|2v&Pj?m#e|c_|WrP924|H(4T% zN9tpZTD=X%!>@$m9TAUBH@ro2L2oER{RItqNg#uNDKGQ>Lc+ay?PLE{=RkgZgg$$(!}ul{UfC5XQ1UJ zC9VFK6%o#vtAX(l#}zpj0iAKCa9+xD>e3iIg zc?I3vo-kBRg}w~nuNCs>bBhyxtf|Obc+nt`O;w+q~RIq#%^|VKjhii#A9o* zYp_B5bxg10`)IO^LtIJ^5w(yX67hKX{A?frso^cgN$WtMwv7%?J+|}pA4VKLv~M|W zKrCjj@8y*zCco^{mJ2E9u^=${B|7HV!;?Nl&8gH|5h%xN;@fyzVXpLc?CuZ{Fm8W1 zudTewK2(j6v_ESFvn*+#(#h8v$Wr^Zs_1t-a;3?QxX22Jt6b4jyCG~X>HdPwGupQ| zJd!DD*Aa}g#ZSBK5UNJ`%|_FeM@tCfq!J)7$>o`cwYy+RnDPKFrlLD62q{C z3>6vpun`%qSjc3E#^q7z_U ztJY#2zXikfn;A+L;0Amrw5b`RiovBh>*tlmDvtEQnYBy$5R|Fr18J)|;C=LvdnSjK(}wrTUd(c%%3v0Q?vo*-%6_27-b%o8rzB{!aK1cjrfLa-@mZvJI93 z!#kG=8WI@2zoMUEp>G?fSp)9iZ`84FurOhZVpy?<-G>VhTONZjLCTxc(xXG^$S874 zG!4J%sp6>+f~gk%13yY2*6>)-wo`r$sXg{bumQ;^?6=UBev zTJ=ub-)A?p)i^n3+ZPbpK=ffc#Q{@th_qj$)&w|BM<_D# z#jC~4A-LjfBMTfuEYlp5h_#5|^aWHmFK`v5+5uRPBrmZmF$NgEBaK_3h*~pFY6Spl c1|gO+anupnFvq3DR_bkw7g56>Rz9Eq*^j#EH~;_u literal 0 HcmV?d00001 diff --git a/src/mainboard/up/Kconfig b/src/mainboard/up/Kconfig new file mode 100644 index 0000000000..04e290c0ae --- /dev/null +++ b/src/mainboard/up/Kconfig @@ -0,0 +1,16 @@ +if VENDOR_UP + +choice + prompt "Mainboard model" + +source "src/mainboard/up/*/Kconfig.name" + +endchoice + +source "src/mainboard/up/*/Kconfig" + +config MAINBOARD_VENDOR + string + default "UP" + +endif diff --git a/src/mainboard/up/Kconfig.name b/src/mainboard/up/Kconfig.name new file mode 100644 index 0000000000..ef694d30f9 --- /dev/null +++ b/src/mainboard/up/Kconfig.name @@ -0,0 +1,2 @@ +config VENDOR_UP + bool "UP" diff --git a/src/mainboard/up/squared/Kconfig b/src/mainboard/up/squared/Kconfig new file mode 100644 index 0000000000..fd03b7a2ae --- /dev/null +++ b/src/mainboard/up/squared/Kconfig @@ -0,0 +1,88 @@ +if BOARD_UP_SQUARED + +config BOARD_SPECIFIC_OPTIONS + def_bool y + select USE_BLOBS + select ADD_FSP_BINARIES + select FSP_USE_REPO + select HAVE_ACPI_TABLES + select HAVE_ACPI_RESUME + select INTEL_GMA_HAVE_VBT + select INTEL_LPSS_UART_FOR_CONSOLE + select SOC_INTEL_APOLLOLAKE + select BOARD_ROMSIZE_KB_16384 + select ONBOARD_VGA_IS_PRIMARY + select MAINBOARD_HAS_LIBGFXINIT + +config VBOOT + select VBOOT_NO_BOARD_SUPPORT + select GBB_FLAG_DISABLE_LID_SHUTDOWN + select GBB_FLAG_DISABLE_EC_SOFTWARE_SYNC + select GBB_FLAG_DISABLE_PD_SOFTWARE_SYNC + select GBB_FLAG_DISABLE_FWMP + +config GBB_HWID + string + depends on VBOOT + default "UPSQUARED" + +config MAINBOARD_DIR + string + default "up/squared" + +config MAINBOARD_VENDOR + string + default "Up" + +config MAINBOARD_PART_NUMBER + string + default "Squared" + +config FMDFILE + string + default "src/mainboard/$(CONFIG_MAINBOARD_DIR)/upsquared.fmd" if !VBOOT + default "src/mainboard/$(CONFIG_MAINBOARD_DIR)/vboot-ro.fmd" if !VBOOT_SLOTS_RW_A + default "src/mainboard/$(CONFIG_MAINBOARD_DIR)/vboot-roa.fmd" if VBOOT_SLOTS_RW_A && !VBOOT_SLOTS_RW_AB + default "src/mainboard/$(CONFIG_MAINBOARD_DIR)/vboot-roab.fmd" if VBOOT_SLOTS_RW_AB + +config SUBSYSTEM_VENDOR_ID + hex + default 0x8086 + +config SUBSYSTEM_DEVICE_ID + hex + default 0x7270 + +config VGA_BIOS_ID + string + default "8086,5a85" + +config PXE_ROM_ID + string + default "10ec,8168" + +config MAX_CPUS + int + default 2 + +config UART_FOR_CONSOLE + int + default 0 + +config IFWI_FMAP_NAME + string + default "IFWI" + +config POST_IO + bool + default n + +config POST_DEVICE + bool + default n + +config CONSOLE_POST + bool + default y + +endif diff --git a/src/mainboard/up/squared/Kconfig.name b/src/mainboard/up/squared/Kconfig.name new file mode 100644 index 0000000000..4d6a59bb7c --- /dev/null +++ b/src/mainboard/up/squared/Kconfig.name @@ -0,0 +1,2 @@ +config BOARD_UP_SQUARED + bool "Squared" diff --git a/src/mainboard/up/squared/Makefile.inc b/src/mainboard/up/squared/Makefile.inc new file mode 100644 index 0000000000..af2508e8cf --- /dev/null +++ b/src/mainboard/up/squared/Makefile.inc @@ -0,0 +1,7 @@ +bootblock-y += bootblock.c + +romstage-y += romstage.c + +ramstage-y += ramstage.c + +ramstage-$(CONFIG_MAINBOARD_USE_LIBGFXINIT) += gma-mainboard.ads diff --git a/src/mainboard/up/squared/acpi_tables.c b/src/mainboard/up/squared/acpi_tables.c new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/mainboard/up/squared/board_info.txt b/src/mainboard/up/squared/board_info.txt new file mode 100644 index 0000000000..851af32a78 --- /dev/null +++ b/src/mainboard/up/squared/board_info.txt @@ -0,0 +1,7 @@ +Vendor name: Up +Board name: Squared +Category: mini +ROM protocol: SPI +ROM socketed: n +Flashrom support: n +Release year: 2017 diff --git a/src/mainboard/up/squared/bootblock.c b/src/mainboard/up/squared/bootblock.c new file mode 100644 index 0000000000..e35e8b8e7f --- /dev/null +++ b/src/mainboard/up/squared/bootblock.c @@ -0,0 +1,22 @@ +/* + * This file is part of the coreboot project. + * + * Copyright 2016 Google Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include + +void bootblock_mainboard_init(void) +{ + lpc_configure_pads(); +} diff --git a/src/mainboard/up/squared/data.vbt b/src/mainboard/up/squared/data.vbt new file mode 100644 index 0000000000000000000000000000000000000000..a8b5550108122e4967cbade00c0bd227e15a1328 GIT binary patch literal 6154 zcmeHLZ)_Ar6o0$h`!~CLy>3y;QOoehaxKtq3mm0ZyVonF2Q9s8ORdqQ*K&t67Fyb( zMZ~VLBuxzFKBz%Mw8j_>erck9GDiHMk`SdeQNt%o&;*GjBx3XfaK72y_S$0810jm^ zUEa={nYX`r^XARW+gsIA)l91z8(Nzic2J9ApaRMH37sHZw68zjcgSBKywHUZ)l{|p{77n)0X8p6Et45j2zK`z?CpGVPe1hq z3uq~hv(CUZOs2u^-ku^F=<1@4Os9`F#{1&EPsd|LGGRa`!I{AUa5l(12^?H21#AGP z1{oS?C;(&tXgHu%%oy6Jc!1x?@z|a31bfb8KScrI1uQ)HKC4=k0blL`j|VOyHpMoF z+3o=kN6`|CH25}(TF$GM78X2qdC*i-%TT43w%cW5Sye2iW2IVWYfbN&F4O6iIpu$< zCEy&cK8x_yv^n4y0k}C8cDwRmtKfrvfrsaXGFXvu3Y;zqYg`_91UZ6y+D70zx@zm!dAT*OXjOq ztDa1{qFCjP(701ia+(FQNy+5hE=k$24fnF(tQg8Q=CTuG@GV(@0U%kp$t+T&$)GeE z7QG2}ui53OnADkF{+m5sb~r5kl^=5u7;{|VhO_^h(rlm2T~8*nESg(qq32%qKyEF3 z@6r==;sK8{y2A8C-mSGPdjfA(o&y(N_&nI~fROOgu7+9&O!F}Iaj+blYEjKpF`8;o zGYYG~2Nd5jnpozbVbz6=HlP$T`Ds9ZBl^5JaNmrM6BYp!yaK{QgtilRx;gWiJMls zm57@>?v@LAo6b*gdY0Qrbez2so;|I+WRzDp507zXVpn2ipO5t%nKSFE?XaUGqbB6sULXLk>F!D1*z!hf*6_~EgJqxuE zjzvJ#)Sm1q8(63yNdq=-S_lI);`L~rX$V}xb`uEi7Y|HCy!l$|v6Ky5!fqgF_R%zK zsIAo0j?q$0JDEbTn;DSQVoS%9yO+0|h(MlNld#r;c`{+#ooGrret51ZF%tFWX)3kW z0#`F5fjKOCQg@^?3txpk(lfde5enH`0El2q7%LeAbZR3gOI@e zXn3;BhzAzrb4N8_uIKD8Tc@?IORa?fnFazLV)ps>MS%uU9kQbyPZoR2w1Iu8pbd33 z;kI!5zIfM;_Pz1{L4{3fCark^?AuOZPJZIfJwKX7{482~9~`YgvqG4u?}RYKU@i9= zTo8&z0fwjOt`OH7r-13=4StN=1O}3^r)IhxZ +DefinitionBlock( + "dsdt.aml", + "DSDT", + 0x02, // DSDT revision: ACPI v2.0 and up + OEM_ID, + ACPI_TABLE_CREATOR, + 0x20110725 // OEM revision +) +{ + /* global NVS and variables */ + #include + + /* CPU */ + #include + + Scope (\_SB) { + Device (PCI0) + { + #include + #include + #include + } + } + + /* Chipset specific sleep states */ + #include +} diff --git a/src/mainboard/up/squared/gma-mainboard.ads b/src/mainboard/up/squared/gma-mainboard.ads new file mode 100644 index 0000000000..6865970e16 --- /dev/null +++ b/src/mainboard/up/squared/gma-mainboard.ads @@ -0,0 +1,32 @@ +-- +-- This file is part of the coreboot project. +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 2 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- + +with HW.GFX.GMA; +with HW.GFX.GMA.Display_Probing; + +use HW.GFX.GMA; +use HW.GFX.GMA.Display_Probing; + +private package GMA.Mainboard is + + ports : constant Port_List := + (DP1, + DP2, + DP3, + HDMI1, + HDMI2, + HDMI3, + others => Disabled); + +end GMA.Mainboard; diff --git a/src/mainboard/up/squared/gpio.h b/src/mainboard/up/squared/gpio.h new file mode 100644 index 0000000000..b4ac4e9b6d --- /dev/null +++ b/src/mainboard/up/squared/gpio.h @@ -0,0 +1,773 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2019 Felix Singer + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the + * GNU General Public License for more details. + */ + +#include + +#ifndef GPIO_H +#define GPIO_H + +static const struct pad_config gpio_table[] = { + // ******************************** + // ******* GPIO Group North ******* + // ******************************** + // *GPIO + _PAD_CFG_STRUCT(GPIO_0, 0x04000102, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_1, 0x04000102, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_2, 0x04000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_3, 0x04000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_4, 0x04000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_5, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_6, 0x44000201, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_7, 0x44000201, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_8, 0x44000201, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_9, 0x44000201, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_10, 0x44000201, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_11, 0x44000201, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_12, 0x44000201, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_13, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_14, 0x44000102, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_15, 0x44000102, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_16, 0x40880102, 0x00024000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_17, 0x44000201, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_18, 0x44000201, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_19, 0x44000201, 0x00003000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_20, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_21, 0x44000201, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_22, 0x44000102, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_23, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_24, 0x44000102, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_25, 0x44000102, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_26, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_27, 0x44000201, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_28, 0x44000102, 0x00003000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_29, 0x44000102, 0x00003000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_30, 0x44000102, 0x00003000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_31, 0x44000102, 0x00003000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_32, 0x44000102, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_33, 0x44000102, 0x00000000), + + // PWM0 + _PAD_CFG_STRUCT(GPIO_34, 0x44000400, 0x00001000), + + // PWM1 + _PAD_CFG_STRUCT(GPIO_35, 0x44000400, 0x00001000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_36, 0x44000201, 0x00000000), + + // PWM3 + _PAD_CFG_STRUCT(GPIO_37, 0x04000400, 0x00001000), + + // LPSS_UART0_RXD + _PAD_CFG_STRUCT(GPIO_38, 0x44000402, 0x00023100), + + // LPSS_UART0_TXD + _PAD_CFG_STRUCT(GPIO_39, 0x44000400, 0x00003100), + + // LPSS_UART0_RTS_N + _PAD_CFG_STRUCT(GPIO_40, 0x44000400, 0x00003100), + + // LPSS_UART0_CTS_N + _PAD_CFG_STRUCT(GPIO_41, 0x44000402, 0x00023100), + + // LPSS_UART1_RXD + _PAD_CFG_STRUCT(GPIO_42, 0x44000402, 0x00023100), + + // LPSS_UART1_TXD + _PAD_CFG_STRUCT(GPIO_43, 0x44000400, 0x0001f100), + + // LPSS_UART1_RTS_N + _PAD_CFG_STRUCT(GPIO_44, 0x44000400, 0x00003100), + + // LPSS_UART1_CTS_N + _PAD_CFG_STRUCT(GPIO_45, 0x44000402, 0x0001c100), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_46, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_47, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_48, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_49, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_62, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_63, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_64, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_65, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_66, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_67, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_68, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_69, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_70, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_71, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_72, 0x44000200, 0x00001000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_73, 0x44000200, 0x00001000), + + // *JTAG_TCK + _PAD_CFG_STRUCT(TCK, 0x44000400, 0x00c3d000), + + // *JTAG_TRST_N + _PAD_CFG_STRUCT(TRST_B, 0x44000400, 0x00c3d000), + + // *JTAG_TMS + _PAD_CFG_STRUCT(TMS, 0x44000400, 0x00c3f000), + + // *JTAG_TDI + _PAD_CFG_STRUCT(TDI, 0x44000400, 0x00c3f000), + + // *JTAG_PMODE + _PAD_CFG_STRUCT(CX_PMODE, 0x44000400, 0x00c3c000), + + // *JTAG_PREQ_N + _PAD_CFG_STRUCT(CX_PREQ_B, 0x44000402, 0x00c3f000), + + // *JTAGX + _PAD_CFG_STRUCT(JTAGX, 0x44000402, 0x00c3f000), + + // *JTAG_PRDY_N + _PAD_CFG_STRUCT(CX_PRDY_B, 0x44000402, 0x0043f000), + + // *JTAG_TDO + _PAD_CFG_STRUCT(TDO, 0x44000400, 0x0043f000), + + // GPIO + _PAD_CFG_STRUCT(CNV_BRI_DT, 0x44000201, 0x0003d000), + + // GPIO + _PAD_CFG_STRUCT(CNV_BRI_RSP, 0x44000201, 0x00002400), + + // GPIO + _PAD_CFG_STRUCT(CNV_RGI_DT, 0x44000201, 0x00000000), + + // RESERVED +// _PAD_CFG_STRUCT(CNV_RGI_RSP, 0xffffffff, 0xffffffff), + + // GPIO + _PAD_CFG_STRUCT(SVID0_ALERT_B, 0x44000100, 0x00000000), + + // GPIO + _PAD_CFG_STRUCT(SVID0_DATA, 0x44000100, 0x00000000), + + // GPIO + _PAD_CFG_STRUCT(SVID0_CLK, 0x44000100, 0x00000000), + + + // ************************************ + // ******* GPIO Group NorthWest ******* + // ************************************ + // *DDI0_DDC_SDA + _PAD_CFG_STRUCT(GPIO_187, 0x44000400, 0x0001f000), + + // *DDI0_DDC_SCL + _PAD_CFG_STRUCT(GPIO_188, 0x44000400, 0x0001f000), + + // *DDI1_DDC_SDA + _PAD_CFG_STRUCT(GPIO_189, 0x44000400, 0x00002c00), + + // *DDI1_DDC_SCL + _PAD_CFG_STRUCT(GPIO_190, 0x44000400, 0x00002c00), + + // GPIO + _PAD_CFG_STRUCT(GPIO_191, 0x44000100, 0x00000000), + + // GPIO + _PAD_CFG_STRUCT(GPIO_192, 0x44000100, 0x00000000), + + // *PNL0_VDDEN + _PAD_CFG_STRUCT(GPIO_193, 0x44000400, 0x00005000), + + // *PNL0_BKLTEN + _PAD_CFG_STRUCT(GPIO_194, 0x44000400, 0x00005000), + + // *PNL0_BKLTCTL + _PAD_CFG_STRUCT(GPIO_195, 0x44000400, 0x00005000), + + // GPIO + _PAD_CFG_STRUCT(GPIO_196, 0x44000100, 0x00000000), + + // GPIO + _PAD_CFG_STRUCT(GPIO_197, 0x44000100, 0x00000000), + + // GPIO + _PAD_CFG_STRUCT(GPIO_198, 0x44000100, 0x00000000), + + // DDI1_HPD + _PAD_CFG_STRUCT(GPIO_199, 0x44000800, 0x00003000), + + // DDI0_HPD + _PAD_CFG_STRUCT(GPIO_200, 0x44000802, 0x00003000), + + // GPIO + _PAD_CFG_STRUCT(GPIO_201, 0x44000100, 0x00000000), + + // GPIO + _PAD_CFG_STRUCT(GPIO_202, 0x44000100, 0x00000000), + + // GPIO + _PAD_CFG_STRUCT(GPIO_203, 0x44000102, 0x00000000), + + // GPIO + _PAD_CFG_STRUCT(GPIO_204, 0x44000102, 0x00000000), + + // GPIO + _PAD_CFG_STRUCT(PMC_SPI_FS0, 0x44000102, 0x00000000), + + // DDI2_HPD + _PAD_CFG_STRUCT(PMC_SPI_FS1, 0x44000802, 0x00003000), + + // GPIO + _PAD_CFG_STRUCT(PMC_SPI_FS2, 0x44000102, 0x00000000), + + // GPIO + _PAD_CFG_STRUCT(PMC_SPI_RXD, 0x44000100, 0x00000000), + + // GPIO + _PAD_CFG_STRUCT(PMC_SPI_TXD, 0x44000100, 0x00000000), + + // GPIO + _PAD_CFG_STRUCT(PMC_SPI_CLK, 0x44000100, 0x00000000), + + // GPIO + _PAD_CFG_STRUCT(PMIC_PWRGOOD, 0x44000203, 0x00002400), + + // GPIO + _PAD_CFG_STRUCT(PMIC_RESET_B, 0x44000102, 0x0003c000), + + // GPIO + _PAD_CFG_STRUCT(GPIO_213, 0x44000201, 0x00003000), + + // GPIO + _PAD_CFG_STRUCT(GPIO_214, 0x44000102, 0x00000000), + + // GPIO + _PAD_CFG_STRUCT(GPIO_215, 0x44000100, 0x00000000), + + // *THERMTRIP_N + _PAD_CFG_STRUCT(PMIC_THERMTRIP_B, 0x44000400, 0x00003000), + + // GPIO + _PAD_CFG_STRUCT(PMIC_STDBY, 0x44000201, 0x00001000), + + // *PROCHOT_N + _PAD_CFG_STRUCT(PROCHOT_B, 0x44000402, 0x00023000), + + // RESERVED +// _PAD_CFG_STRUCT(PMIC_I2C_SCL, 0xffffffff, 0xffffffff), + + // RESERVED +// _PAD_CFG_STRUCT(PMIC_I2C_SDA, 0xffffffff, 0xffffffff), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_74, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_75, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_76, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_77, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_78, 0x44000100, 0x00000000), + + // AVS_DMIC_CLK_A1 + _PAD_CFG_STRUCT(GPIO_79, 0x44000400, 0x0003d000), + + // AVS_DMIC_CLK_B1 + _PAD_CFG_STRUCT(GPIO_80, 0x44000400, 0x0003d000), + + // AVS_DMIC_DATA_1 + _PAD_CFG_STRUCT(GPIO_81, 0x44000400, 0x00025200), + + // AVS_DMIC_CLK_AB2 + _PAD_CFG_STRUCT(GPIO_82, 0x44000400, 0x0003d000), + + // AVS_DMIC_DATA_2 + _PAD_CFG_STRUCT(GPIO_83, 0x44000400, 0x00025200), + + // AVS_I2S2_MCLK + _PAD_CFG_STRUCT(GPIO_84, 0x44000400, 0x00001000), + + // AVS_I2S2_BCLK + _PAD_CFG_STRUCT(GPIO_85, 0x44000400, 0x0001d200), + + // AVS_I2S2_WS_SYNC + _PAD_CFG_STRUCT(GPIO_86, 0x44000402, 0x0001d200), + + // AVS_I2S2_SDI + _PAD_CFG_STRUCT(GPIO_87, 0x44000402, 0x0001f200), + + // AVS_I2S2_SDO + _PAD_CFG_STRUCT(GPIO_88, 0x44000400, 0x0001c200), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_89, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_90, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_91, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_92, 0x44000100, 0x00000000), + + // *FST_SPI_CS0_N + _PAD_CFG_STRUCT(GPIO_97, 0x44000402, 0x0003fc00), + + // GPIO + _PAD_CFG_STRUCT(GPIO_98, 0x44000100, 0x00000000), + + // *FST_SPI_MOSI_IO0 + _PAD_CFG_STRUCT(GPIO_99, 0x44000400, 0x0003fc00), + + // *FST_SPI_MISO_IO1 + _PAD_CFG_STRUCT(GPIO_100, 0x44000402, 0x0003fc00), + + // GPIO + _PAD_CFG_STRUCT(GPIO_101, 0x44000100, 0x00000000), + + // GPIO + _PAD_CFG_STRUCT(GPIO_102, 0x44000100, 0x00000000), + + // *FST_SPI_CLK + _PAD_CFG_STRUCT(GPIO_103, 0x44000400, 0x0003fc00), + + // *n/a + _PAD_CFG_STRUCT(FST_SPI_CLK_FB, 0x44000400, 0x0003c000), + + // SIO_SPI_0_CLK + _PAD_CFG_STRUCT(GPIO_104, 0x44000400, 0x0001d200), + + // SIO_SPI_0_FS0 + _PAD_CFG_STRUCT(GPIO_105, 0x44000400, 0x0001f200), + + // SIO_SPI_0_FS1 + _PAD_CFG_STRUCT(GPIO_106, 0x44000400, 0x0001f200), + + // SIO_SPI_0_RXD + _PAD_CFG_STRUCT(GPIO_109, 0x44000402, 0x0001f200), + + // SIO_SPI_0_TXD + _PAD_CFG_STRUCT(GPIO_110, 0x44000400, 0x0001f200), + + // SIO_SPI_1_CLK + _PAD_CFG_STRUCT(GPIO_111, 0x44000400, 0x00001000), + + // SIO_SPI_1_FS0 + _PAD_CFG_STRUCT(GPIO_112, 0x44000400, 0x00001000), + + // SIO_SPI_1_FS1 + _PAD_CFG_STRUCT(GPIO_113, 0x44000400, 0x00001000), + + // SIO_SPI_1_RXD + _PAD_CFG_STRUCT(GPIO_116, 0x44000402, 0x0001d000), + + // SIO_SPI_1_TXD + _PAD_CFG_STRUCT(GPIO_117, 0x44000400, 0x00001000), + + // SIO_SPI_2_CLK + _PAD_CFG_STRUCT(GPIO_118, 0x44000400, 0x00001000), + + // SIO_SPI_2_FS0 + _PAD_CFG_STRUCT(GPIO_119, 0x44000400, 0x00001000), + + // SIO_SPI_2_FS1 + _PAD_CFG_STRUCT(GPIO_120, 0x44000400, 0x00001000), + + // SIO_SPI_2_FS2 + _PAD_CFG_STRUCT(GPIO_121, 0x44000400, 0x00001000), + + // SIO_SPI_2_RXD + _PAD_CFG_STRUCT(GPIO_122, 0x44000400, 0x00001000), + + // SIO_SPI_2_TXD + _PAD_CFG_STRUCT(GPIO_123, 0x44000400, 0x00001000), + + + // ******************************* + // ******* GPIO Group West ******* + // ******************************* + // LPSS_I2C0_SDA + _PAD_CFG_STRUCT(GPIO_124, 0x44000402, 0x00012700), + + // LPSS_I2C0_SCL + _PAD_CFG_STRUCT(GPIO_125, 0x44000402, 0x00012700), + + // LPSS_I2C1_SDA + _PAD_CFG_STRUCT(GPIO_126, 0x44000402, 0x00012700), + + // LPSS_I2C1_SCL + _PAD_CFG_STRUCT(GPIO_127, 0x44000402, 0x00012700), + + // LPSS_I2C2_SDA + _PAD_CFG_STRUCT(GPIO_128, 0x44000402, 0x00012700), + + // LPSS_I2C2_SCL + _PAD_CFG_STRUCT(GPIO_129, 0x44000402, 0x00012700), + + // LPSS_I2C3_SDA + _PAD_CFG_STRUCT(GPIO_130, 0x44000402, 0x00012700), + + // LPSS_I2C3_SCL + _PAD_CFG_STRUCT(GPIO_131, 0x44000402, 0x00012700), + + // LPSS_I2C4_SDA + _PAD_CFG_STRUCT(GPIO_132, 0x44000402, 0x00012700), + + // LPSS_I2C4_SCL + _PAD_CFG_STRUCT(GPIO_133, 0x44000402, 0x00012700), + + // LPSS_I2C5_SDA + _PAD_CFG_STRUCT(GPIO_134, 0x44000402, 0x0001f200), + + // LPSS_I2C5_SCL + _PAD_CFG_STRUCT(GPIO_135, 0x44000402, 0x0001f200), + + // LPSS_I2C6_SDA + _PAD_CFG_STRUCT(GPIO_136, 0x44000402, 0x0001f200), + + // LPSS_I2C6_SCL + _PAD_CFG_STRUCT(GPIO_137, 0x44000402, 0x0001f200), + + // LPSS_I2C7_SDA + _PAD_CFG_STRUCT(GPIO_138, 0x44000402, 0x00006700), + + // LPSS_I2C7_SCL + _PAD_CFG_STRUCT(GPIO_139, 0x44000402, 0x00006700), + + // AVS_I2S6_BCLK + _PAD_CFG_STRUCT(GPIO_146, 0x44000800, 0x0003d000), + + // AVS_I2S6_WS_SYNC + _PAD_CFG_STRUCT(GPIO_147, 0x44000800, 0x0003d000), + + // AVS_I2S6_SDI + _PAD_CFG_STRUCT(GPIO_148, 0x44000802, 0x0003d000), + + // AVS_I2S6_SDO + _PAD_CFG_STRUCT(GPIO_149, 0x44000800, 0x0003d000), + + // AVS_I2S5_BCLK + _PAD_CFG_STRUCT(GPIO_150, 0x44000800, 0x0001d200), + + // AVS_I2S5_WS_SYNC + _PAD_CFG_STRUCT(GPIO_151, 0x44000800, 0x0001d200), + + // AVS_I2S5_SDI + _PAD_CFG_STRUCT(GPIO_152, 0x44000802, 0x0001d200), + + // AVS_I2S5_SDO + _PAD_CFG_STRUCT(GPIO_153, 0x44000800, 0x0001c200), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_154, 0x44000102, 0x00000000), + + // SPKR + _PAD_CFG_STRUCT(GPIO_155, 0x44000800, 0x0003d000), + + // *PCIE_CLKREQ0_N + _PAD_CFG_STRUCT(GPIO_209, 0x44000400, 0x00001000), + + // *PCIE_CLKREQ1_N + _PAD_CFG_STRUCT(GPIO_210, 0x44000400, 0x00001000), + + // *PCIE_CLKREQ2_N + _PAD_CFG_STRUCT(GPIO_211, 0x44000400, 0x00001000), + + // *PCIE_CLKREQ3_N + _PAD_CFG_STRUCT(GPIO_212, 0x44000400, 0x00001000), + + // *OSC_CLK_OUT_0 + _PAD_CFG_STRUCT(OSC_CLK_OUT_0, 0x44000400, 0x00001000), + + // *OSC_CLK_OUT_1 + _PAD_CFG_STRUCT(OSC_CLK_OUT_1, 0x44000400, 0x00001000), + + // *OSC_CLK_OUT_2 + _PAD_CFG_STRUCT(OSC_CLK_OUT_2, 0x44000400, 0x00001000), + + // *OSC_CLK_OUT_3 + _PAD_CFG_STRUCT(OSC_CLK_OUT_3, 0x44000400, 0x00001000), + + // GPIO + _PAD_CFG_STRUCT(OSC_CLK_OUT_4, 0x44000100, 0x00000000), + + // *GPIO + _PAD_CFG_STRUCT(PMU_AC_PRESENT, 0x44000102, 0x00000000), + + // GPIO + _PAD_CFG_STRUCT(PMU_BATLOW_B, 0x44000102, 0x00000000), + + // *PMU_PLTRST_N + _PAD_CFG_STRUCT(PMU_PLTRST_B, 0x44000400, 0x0003c000), + + // *PMU_PWRBTN_N + _PAD_CFG_STRUCT(PMU_PWRBTN_B, 0x44000402, 0x0003f000), + + // *PMU_RSTBTN_N + _PAD_CFG_STRUCT(PMU_RESETBUTTON_B, 0x44000402, 0x0003c000), + + // *PMU_SLP_S0_N + _PAD_CFG_STRUCT(PMU_SLP_S0_B, 0x44000400, 0x0003c000), + + // *PMU_SLP_S3_N + _PAD_CFG_STRUCT(PMU_SLP_S3_B, 0x44000400, 0x0003c000), + + // *PMU_SLP_S4_N + _PAD_CFG_STRUCT(PMU_SLP_S4_B, 0x44000400, 0x0003c000), + + // *PMU_SUSCLK + _PAD_CFG_STRUCT(PMU_SUSCLK, 0x44000400, 0x0003c000), + + // *GPIO + _PAD_CFG_STRUCT(PMU_WAKE_B, 0x44000201, 0x0003f000), + + // *SUS_STAT_B + _PAD_CFG_STRUCT(SUS_STAT_B, 0x44000400, 0x0003c000), + + // GPIO + _PAD_CFG_STRUCT(SUSPWRDNACK, 0x44000102, 0x00000000), + + + // ************************************ + // ******* GPIO Group SouthWest ******* + // ************************************ + // PCIE_WAKE0_N + _PAD_CFG_STRUCT(GPIO_205, 0x44000402, 0x00000000), + + // PCIE_WAKE1_N + _PAD_CFG_STRUCT(GPIO_206, 0x44000402, 0x00000000), + + // PCIE_WAKE2_N + _PAD_CFG_STRUCT(GPIO_207, 0x44000402, 0x00000000), + + // PCIE_WAKE3_N + _PAD_CFG_STRUCT(GPIO_208, 0x44000402, 0x00000000), + + // *EMMC_CLK + _PAD_CFG_STRUCT(GPIO_156, 0x44000402, 0x00005000), + + // *EMMC_D0 + _PAD_CFG_STRUCT(GPIO_157, 0x44000402, 0x00023000), + + // *EMMC_D1 + _PAD_CFG_STRUCT(GPIO_158, 0x44000402, 0x00023000), + + // *EMMC_D2 + _PAD_CFG_STRUCT(GPIO_159, 0x44000402, 0x00023000), + + // *EMMC_D3 + _PAD_CFG_STRUCT(GPIO_160, 0x44000402, 0x00023000), + + // *EMMC_D4 + _PAD_CFG_STRUCT(GPIO_161, 0x44000402, 0x00023000), + + // *EMMC_D5 + _PAD_CFG_STRUCT(GPIO_162, 0x44000402, 0x00023000), + + // *EMMC_D6 + _PAD_CFG_STRUCT(GPIO_163, 0x44000402, 0x00023000), + + // *EMMC_D7 + _PAD_CFG_STRUCT(GPIO_164, 0x44000402, 0x00023000), + + // *EMMC_CMD + _PAD_CFG_STRUCT(GPIO_165, 0x44000402, 0x00023000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_166, 0x44000300, 0x00001000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_167, 0x44000102, 0x00023000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_168, 0x44000100, 0x00023000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_169, 0x44000200, 0x00003000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_170, 0x44000201, 0x00003000), + + // *GPIO + _PAD_CFG_STRUCT(GPIO_171, 0x44000201, 0x00003000), + + // SDCARD_CLK + _PAD_CFG_STRUCT(GPIO_172, 0x44000400, 0x00021100), + + // n/a + _PAD_CFG_STRUCT(GPIO_179, 0x44000400, 0x00001000), + + // SDCARD_D0 + _PAD_CFG_STRUCT(GPIO_173, 0x44000402, 0x00023100), + + // SDCARD_D1 + _PAD_CFG_STRUCT(GPIO_174, 0x44000402, 0x00023000), + + // SDCARD_D2 + _PAD_CFG_STRUCT(GPIO_175, 0x44000402, 0x00023000), + + // SDCARD_D3 + _PAD_CFG_STRUCT(GPIO_176, 0x44000402, 0x00023000), + + // SDCARD_CD_B + _PAD_CFG_STRUCT(GPIO_177, 0x44000402, 0x00003000), + + // SDCARD_CMD + _PAD_CFG_STRUCT(GPIO_178, 0x44000402, 0x00023100), + + // SDCARD_LVL_WP + _PAD_CFG_STRUCT(GPIO_186, 0x44000402, 0x00003000), + + // *EMMC_RCLK + _PAD_CFG_STRUCT(GPIO_182, 0x44000400, 0x0001d000), + + // GPIO + _PAD_CFG_STRUCT(GPIO_183, 0x44000200, 0x00001000), + + // SMB_ALERT_N + _PAD_CFG_STRUCT(SMB_ALERTB, 0x44000402, 0x0003f000), + + // SMB_CLK + _PAD_CFG_STRUCT(SMB_CLK, 0x44000402, 0x0003f000), + + // SMB_DATA + _PAD_CFG_STRUCT(SMB_DATA, 0x44000402, 0x0003f000), + + // LPC_ILB_SERIRQ + _PAD_CFG_STRUCT(LPC_ILB_SERIRQ, 0x44000402, 0x0003f000), + + // LPC_CLKOUT0 + _PAD_CFG_STRUCT(LPC_CLKOUT0, 0x44000400, 0x00020100), + + // LPC_CLKOUT1 + _PAD_CFG_STRUCT(LPC_CLKOUT1, 0x44000400, 0x00020100), + + // LPC_AD0 + _PAD_CFG_STRUCT(LPC_AD0, 0x44000402, 0x00023100), + + // LPC_AD1 + _PAD_CFG_STRUCT(LPC_AD1, 0x44000402, 0x00023100), + + // LPC_AD2 + _PAD_CFG_STRUCT(LPC_AD2, 0x44000402, 0x00023100), + + // LPC_AD3 + _PAD_CFG_STRUCT(LPC_AD3, 0x44000402, 0x00023100), + + // LPC_CLKRUNB + _PAD_CFG_STRUCT(LPC_CLKRUNB, 0x44000400, 0x00023100), + + // LPC_FRAMEB + _PAD_CFG_STRUCT(LPC_FRAMEB, 0x44000400, 0x00023100), +}; + +#endif diff --git a/src/mainboard/up/squared/ramstage.c b/src/mainboard/up/squared/ramstage.c new file mode 100644 index 0000000000..e9fcfb2da3 --- /dev/null +++ b/src/mainboard/up/squared/ramstage.c @@ -0,0 +1,432 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2019 Felix Singer + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include + +void mainboard_silicon_init_params(FSP_S_CONFIG *silconfig) +{ + printk(BIOS_DEBUG, "MAINBOARD: %s/%s called\n", __FILE__, __func__); + + silconfig->C1e = 0x1; // 0x0 + silconfig->PkgCStateLimit = 0xFE; // 0x2 + silconfig->CStateAutoDemotion = 0x3; // 0x0 + silconfig->CStateUnDemotion = 0x3; // 0x0 + silconfig->PkgCStateDemotion = 0x1; // 0x0 + silconfig->PkgCStateUnDemotion = 0x1; // 0x0 + silconfig->IpuEn = 0x0; // 0x1 + silconfig->Pme = 0x1; // 0x0 + silconfig->HdAudioIoBufferOwnership = 0x3; // 0x0 + silconfig->DspEndpointDmic = 0x0; // 0x1 + silconfig->DspEndpointBluetooth = 0x0; // 0x1 + silconfig->DspEndpointI2sSkp = 0x1; // 0x0 + silconfig->DspEndpointI2sHp = 0x1; // 0x0 + silconfig->HDAudioPwrGate = 0x1; // 0x0 + silconfig->HDAudioClkGate = 0x1; // 0x0 + silconfig->DspFeatureMask = 0x2A; // 0x0 + silconfig->HpetBdfValid = 0x1; // 0x0 + silconfig->HpetDeviceNumber = 0xF; // 0x1f + silconfig->IoApicBdfValid = 0x1; // 0x0 + silconfig->IoApicDeviceNumber = 0x1F; // 0xf + silconfig->IshEnable = 0x0; // 0x1 + silconfig->SpiEiss = 0x0; // 0x1 + silconfig->LPSS_S0ixEnable = 0x1; // 0x0 + silconfig->SdcardEnabled = 0x0; // 0x1 + silconfig->eMMCHostMaxSpeed = 0x2; // 0x0 + silconfig->Usb30Mode = 0x1; // 0x0 + silconfig->VtdEnable = 0x1; // 0x0 + silconfig->MonitorMwaitEnable = 0x0; // 0x1 + silconfig->HdAudioDspUaaCompliance = 0x1; // 0x0 + silconfig->InitS3Cpu = 0x1; // 0x0 + + silconfig->PortUsb20PerPortTxPeHalf[0] = 0x0; + silconfig->PortUsb20PerPortPeTxiSet[0] = 0x7; + silconfig->PortUsb20PerPortTxiSet[0] = 0x0; + silconfig->PortUsb20HsSkewSel[0] = 0x0; + silconfig->PortUsb20IUsbTxEmphasisEn[0] = 0x3; + silconfig->PortUsb20PerPortRXISet[0] = 0x0; + silconfig->PortUsb20HsNpreDrvSel[0] = 0x0; + + silconfig->PortUsb20PerPortTxPeHalf[1] = 0x0; + silconfig->PortUsb20PerPortPeTxiSet[1] = 0x6; + silconfig->PortUsb20PerPortTxiSet[1] = 0x0; + silconfig->PortUsb20HsSkewSel[1] = 0x0; + silconfig->PortUsb20IUsbTxEmphasisEn[1] = 0x3; + silconfig->PortUsb20PerPortRXISet[1] = 0x0; + silconfig->PortUsb20HsNpreDrvSel[1] = 0x0; + + silconfig->PortUsb20PerPortTxPeHalf[2] = 0x0; + silconfig->PortUsb20PerPortPeTxiSet[2] = 0x6; + silconfig->PortUsb20PerPortTxiSet[2] = 0x0; + silconfig->PortUsb20HsSkewSel[2] = 0x0; + silconfig->PortUsb20IUsbTxEmphasisEn[2] = 0x3; + silconfig->PortUsb20PerPortRXISet[2] = 0x0; + silconfig->PortUsb20HsNpreDrvSel[2] = 0x0; + + silconfig->PortUsb20PerPortTxPeHalf[3] = 0x0; + silconfig->PortUsb20PerPortPeTxiSet[3] = 0x6; + silconfig->PortUsb20PerPortTxiSet[3] = 0x0; + silconfig->PortUsb20HsSkewSel[3] = 0x0; + silconfig->PortUsb20IUsbTxEmphasisEn[3] = 0x3; + silconfig->PortUsb20PerPortRXISet[3] = 0x0; + silconfig->PortUsb20HsNpreDrvSel[3] = 0x0; + + silconfig->PortUsb20PerPortTxPeHalf[4] = 0x0; + silconfig->PortUsb20PerPortPeTxiSet[4] = 0x7; + silconfig->PortUsb20PerPortTxiSet[4] = 0x0; + silconfig->PortUsb20HsSkewSel[4] = 0x0; + silconfig->PortUsb20IUsbTxEmphasisEn[4] = 0x3; + silconfig->PortUsb20PerPortRXISet[4] = 0x0; + silconfig->PortUsb20HsNpreDrvSel[4] = 0x0; + + silconfig->PortUsb20PerPortTxPeHalf[5] = 0x0; + silconfig->PortUsb20PerPortPeTxiSet[5] = 0x7; + silconfig->PortUsb20PerPortTxiSet[5] = 0x0; + silconfig->PortUsb20HsSkewSel[5] = 0x0; + silconfig->PortUsb20IUsbTxEmphasisEn[5] = 0x3; + silconfig->PortUsb20PerPortRXISet[5] = 0x0; + silconfig->PortUsb20HsNpreDrvSel[5] = 0x0; + + silconfig->PortUsb20PerPortTxPeHalf[6] = 0x0; + silconfig->PortUsb20PerPortPeTxiSet[6] = 0x7; + silconfig->PortUsb20PerPortTxiSet[6] = 0x0; + silconfig->PortUsb20HsSkewSel[6] = 0x0; + silconfig->PortUsb20IUsbTxEmphasisEn[6] = 0x3; + silconfig->PortUsb20PerPortRXISet[6] = 0x0; + silconfig->PortUsb20HsNpreDrvSel[6] = 0x0; + + silconfig->PortUsb20PerPortTxPeHalf[7] = 0x0; + silconfig->PortUsb20PerPortPeTxiSet[7] = 0x1; + silconfig->PortUsb20PerPortTxiSet[7] = 0x3; + silconfig->PortUsb20HsSkewSel[7] = 0x1; + silconfig->PortUsb20IUsbTxEmphasisEn[7] = 0x1; + silconfig->PortUsb20PerPortRXISet[7] = 0x0; + silconfig->PortUsb20HsNpreDrvSel[7] = 0x3; + + + silconfig->WriteProtectionEnable[0] = 0x1; + silconfig->ReadProtectionEnable[0] = 0x1; + silconfig->ProtectedRangeLimit[0] = 0xFFF; + silconfig->ProtectedRangeBase[0] = 0x0; + + silconfig->IPC[0] = 0xFFFFEEF8; + silconfig->IPC[1] = 0xFFFFFFFF; + silconfig->IPC[2] = 0xFFFFFFFF; + silconfig->IPC[3] = 0xFFFFFFFF; + + silconfig->SataPortsDisableDynamicPg[0] = 0x0; + silconfig->SataPortsEnable[0] = 0x1; + silconfig->SataPortsDevSlp[0] = 0x0; + silconfig->SataPortsHotPlug[0] = 0x0; + silconfig->SataPortsInterlockSw[0] = 0x1; + silconfig->SataPortsExternal[0] = 0x0; + silconfig->SataPortsSpinUp[0] = 0x0; + silconfig->SataPortsSolidStateDrive[0] = 0x0; + silconfig->SataPortsEnableDitoConfig[0] = 0x0; + silconfig->SataPortsDmVal[0] = 0xF; + silconfig->SataPortsDitoVal[0] = 0x271; + + silconfig->SataPortsDisableDynamicPg[1] = 0x0; + silconfig->SataPortsEnable[1] = 0x1; + silconfig->SataPortsDevSlp[1] = 0x0; + silconfig->SataPortsHotPlug[1] = 0x0; + silconfig->SataPortsInterlockSw[1] = 0x1; + silconfig->SataPortsExternal[1] = 0x0; + silconfig->SataPortsSpinUp[1] = 0x0; + silconfig->SataPortsSolidStateDrive[1] = 0x0; + silconfig->SataPortsEnableDitoConfig[1] = 0x0; + silconfig->SataPortsDmVal[1] = 0xF; + silconfig->SataPortsDitoVal[1] = 0x271; + + + silconfig->PcieRootPortEn[0] = 0x1; + silconfig->PcieRpHide[0] = 0x0; + silconfig->PcieRpSlotImplemented[0] = 0x1; + silconfig->PcieRpHotPlug[0] = 0x0; + silconfig->PcieRpPmSci[0] = 0x1; + silconfig->PcieRpExtSync[0] = 0x1; + silconfig->PcieRpTransmitterHalfSwing[0] = 0x0; + silconfig->PcieRpAcsEnabled[0] = 0x1; + silconfig->PcieRpClkReqSupported[0] = 0x1; + silconfig->PcieRpClkReqNumber[0] = 0x2; + silconfig->PcieRpClkReqDetect[0] = 0x0; + silconfig->AdvancedErrorReporting[0] = 0x0; + silconfig->PmeInterrupt[0] = 0x0; + silconfig->UnsupportedRequestReport[0] = 0x0; + silconfig->FatalErrorReport[0] = 0x0; + silconfig->NoFatalErrorReport[0] = 0x0; + silconfig->CorrectableErrorReport[0] = 0x0; + silconfig->SystemErrorOnFatalError[0] = 0x0; + silconfig->SystemErrorOnNonFatalError[0] = 0x0; + silconfig->SystemErrorOnCorrectableError[0] = 0x0; + silconfig->PcieRpSpeed[0] = 0x0; + silconfig->PhysicalSlotNumber[0] = 0x0; + silconfig->PcieRpCompletionTimeout[0] = 0x0; + silconfig->PtmEnable[0] = 0x0; + silconfig->PcieRpAspm[0] = 0x4; + silconfig->PcieRpL1Substates[0] = 0x3; + silconfig->PcieRpLtrEnable[0] = 0x1; + silconfig->PcieRpLtrConfigLock[0] = 0x0; + silconfig->PcieRpSelectableDeemphasis[0] = 0x1; + silconfig->PcieRpNonSnoopLatencyOverrideValue[0] = 0x3C; + silconfig->PcieRpNonSnoopLatencyOverrideMultiplier[0] = 0x2; + silconfig->PcieRpSlotPowerLimitScale[0] = 0x0; + silconfig->PcieRpSlotPowerLimitValue[0] = 0x0; + silconfig->PcieRpLtrMaxNonSnoopLatency[0] = 0x1003; + silconfig->PcieRpNonSnoopLatencyOverrideMode[0] = 0x2; + silconfig->PcieRpLtrMaxSnoopLatency[0] = 0x1003; + silconfig->PcieRpSnoopLatencyOverrideMode[0] = 0x2; + silconfig->PcieRpSnoopLatencyOverrideValue[0] = 0x3C; + silconfig->PcieRpSnoopLatencyOverrideMultiplier[0] = 0x2; + + silconfig->PcieRootPortEn[1] = 0x1; + silconfig->PcieRpHide[1] = 0x0; + silconfig->PcieRpSlotImplemented[1] = 0x1; + silconfig->PcieRpHotPlug[1] = 0x0; + silconfig->PcieRpPmSci[1] = 0x1; + silconfig->PcieRpExtSync[1] = 0x1; + silconfig->PcieRpTransmitterHalfSwing[1] = 0x0; + silconfig->PcieRpAcsEnabled[1] = 0x1; + silconfig->PcieRpClkReqSupported[1] = 0x1; + silconfig->PcieRpClkReqNumber[1] = 0x3; + silconfig->PcieRpClkReqDetect[1] = 0x0; + silconfig->AdvancedErrorReporting[1] = 0x0; + silconfig->PmeInterrupt[1] = 0x0; + silconfig->UnsupportedRequestReport[1] = 0x0; + silconfig->FatalErrorReport[1] = 0x0; + silconfig->NoFatalErrorReport[1] = 0x0; + silconfig->CorrectableErrorReport[1] = 0x0; + silconfig->SystemErrorOnFatalError[1] = 0x0; + silconfig->SystemErrorOnNonFatalError[1] = 0x0; + silconfig->SystemErrorOnCorrectableError[1] = 0x0; + silconfig->PcieRpSpeed[1] = 0x0; + silconfig->PhysicalSlotNumber[1] = 0x1; + silconfig->PcieRpCompletionTimeout[1] = 0x0; + silconfig->PtmEnable[1] = 0x0; + silconfig->PcieRpAspm[1] = 0x4; + silconfig->PcieRpL1Substates[1] = 0x3; + silconfig->PcieRpLtrEnable[1] = 0x1; + silconfig->PcieRpLtrConfigLock[1] = 0x0; + silconfig->PcieRpSelectableDeemphasis[1] = 0x1; + silconfig->PcieRpNonSnoopLatencyOverrideValue[1] = 0x3C; + silconfig->PcieRpNonSnoopLatencyOverrideMultiplier[1] = 0x2; + silconfig->PcieRpSlotPowerLimitScale[1] = 0x0; + silconfig->PcieRpSlotPowerLimitValue[1] = 0x0; + silconfig->PcieRpLtrMaxNonSnoopLatency[1] = 0x1003; + silconfig->PcieRpNonSnoopLatencyOverrideMode[1] = 0x2; + silconfig->PcieRpLtrMaxSnoopLatency[1] = 0x1003; + silconfig->PcieRpSnoopLatencyOverrideMode[1] = 0x2; + silconfig->PcieRpSnoopLatencyOverrideValue[1] = 0x3C; + silconfig->PcieRpSnoopLatencyOverrideMultiplier[1] = 0x2; + + silconfig->PcieRootPortEn[2] = 0x1; + silconfig->PcieRpHide[2] = 0x0; + silconfig->PcieRpSlotImplemented[2] = 0x1; + silconfig->PcieRpHotPlug[2] = 0x0; + silconfig->PcieRpPmSci[2] = 0x1; + silconfig->PcieRpExtSync[2] = 0x1; + silconfig->PcieRpTransmitterHalfSwing[2] = 0x0; + silconfig->PcieRpAcsEnabled[2] = 0x1; + silconfig->PcieRpClkReqSupported[2] = 0x1; + silconfig->PcieRpClkReqNumber[2] = 0x0; + silconfig->PcieRpClkReqDetect[2] = 0x0; + silconfig->AdvancedErrorReporting[2] = 0x0; + silconfig->PmeInterrupt[2] = 0x0; + silconfig->UnsupportedRequestReport[2] = 0x0; + silconfig->FatalErrorReport[2] = 0x0; + silconfig->NoFatalErrorReport[2] = 0x0; + silconfig->CorrectableErrorReport[2] = 0x0; + silconfig->SystemErrorOnFatalError[2] = 0x0; + silconfig->SystemErrorOnNonFatalError[2] = 0x0; + silconfig->SystemErrorOnCorrectableError[2] = 0x0; + silconfig->PcieRpSpeed[2] = 0x0; + silconfig->PhysicalSlotNumber[2] = 0x2; + silconfig->PcieRpCompletionTimeout[2] = 0x0; + silconfig->PtmEnable[2] = 0x0; + silconfig->PcieRpAspm[2] = 0x4; + silconfig->PcieRpL1Substates[2] = 0x3; + silconfig->PcieRpLtrEnable[2] = 0x1; + silconfig->PcieRpLtrConfigLock[2] = 0x0; + silconfig->PcieRpSelectableDeemphasis[2] = 0x1; + silconfig->PcieRpNonSnoopLatencyOverrideValue[2] = 0x3C; + silconfig->PcieRpNonSnoopLatencyOverrideMultiplier[2] = 0x2; + silconfig->PcieRpSlotPowerLimitScale[2] = 0x0; + silconfig->PcieRpSlotPowerLimitValue[2] = 0x0; + silconfig->PcieRpLtrMaxNonSnoopLatency[2] = 0x1003; + silconfig->PcieRpNonSnoopLatencyOverrideMode[2] = 0x2; + silconfig->PcieRpLtrMaxSnoopLatency[2] = 0x1003; + silconfig->PcieRpSnoopLatencyOverrideMode[2] = 0x2; + silconfig->PcieRpSnoopLatencyOverrideValue[2] = 0x0; + silconfig->PcieRpSnoopLatencyOverrideMultiplier[2] = 0x2; + + silconfig->PcieRootPortEn[3] = 0x1; + silconfig->PcieRpHide[3] = 0x0; + silconfig->PcieRpSlotImplemented[3] = 0x1; + silconfig->PcieRpHotPlug[3] = 0x0; + silconfig->PcieRpPmSci[3] = 0x1; + silconfig->PcieRpExtSync[3] = 0x1; + silconfig->PcieRpTransmitterHalfSwing[3] = 0x0; + silconfig->PcieRpAcsEnabled[3] = 0x1; + silconfig->PcieRpClkReqSupported[3] = 0x1; + silconfig->PcieRpClkReqNumber[3] = 0x1; + silconfig->PcieRpClkReqDetect[3] = 0x0; + silconfig->AdvancedErrorReporting[3] = 0x0; + silconfig->PmeInterrupt[3] = 0x0; + silconfig->UnsupportedRequestReport[3] = 0x0; + silconfig->FatalErrorReport[3] = 0x0; + silconfig->NoFatalErrorReport[3] = 0x0; + silconfig->CorrectableErrorReport[3] = 0x0; + silconfig->SystemErrorOnFatalError[3] = 0x0; + silconfig->SystemErrorOnNonFatalError[3] = 0x0; + silconfig->SystemErrorOnCorrectableError[3] = 0x0; + silconfig->PcieRpSpeed[3] = 0x0; + silconfig->PhysicalSlotNumber[3] = 0x3; + silconfig->PcieRpCompletionTimeout[3] = 0x0; + silconfig->PtmEnable[3] = 0x0; + silconfig->PcieRpAspm[3] = 0x4; + silconfig->PcieRpL1Substates[3] = 0x3; + silconfig->PcieRpLtrEnable[3] = 0x1; + silconfig->PcieRpLtrConfigLock[3] = 0x0; + silconfig->PcieRpSelectableDeemphasis[3] = 0x1; + silconfig->PcieRpNonSnoopLatencyOverrideValue[3] = 0x3C; + silconfig->PcieRpNonSnoopLatencyOverrideMultiplier[3] = 0x2; + silconfig->PcieRpSlotPowerLimitScale[3] = 0x0; + silconfig->PcieRpSlotPowerLimitValue[3] = 0x0; + silconfig->PcieRpLtrMaxNonSnoopLatency[3] = 0x1003; + silconfig->PcieRpNonSnoopLatencyOverrideMode[3] = 0x2; + silconfig->PcieRpLtrMaxSnoopLatency[3] = 0x1003; + silconfig->PcieRpSnoopLatencyOverrideMode[3] = 0x2; + silconfig->PcieRpSnoopLatencyOverrideValue[3] = 0x3C; + silconfig->PcieRpSnoopLatencyOverrideMultiplier[3] = 0x2; + + silconfig->PcieRootPortEn[4] = 0x1; + silconfig->PcieRpHide[4] = 0x0; + silconfig->PcieRpSlotImplemented[4] = 0x1; + silconfig->PcieRpHotPlug[4] = 0x0; + silconfig->PcieRpPmSci[4] = 0x1; + silconfig->PcieRpExtSync[4] = 0x1; + silconfig->PcieRpTransmitterHalfSwing[4] = 0x0; + silconfig->PcieRpAcsEnabled[4] = 0x1; + silconfig->PcieRpClkReqSupported[4] = 0x1; + silconfig->PcieRpClkReqNumber[4] = 0x2; + silconfig->PcieRpClkReqDetect[4] = 0x0; + silconfig->AdvancedErrorReporting[4] = 0x0; + silconfig->PmeInterrupt[4] = 0x0; + silconfig->UnsupportedRequestReport[4] = 0x0; + silconfig->FatalErrorReport[4] = 0x0; + silconfig->NoFatalErrorReport[4] = 0x0; + silconfig->CorrectableErrorReport[4] = 0x0; + silconfig->SystemErrorOnFatalError[4] = 0x0; + silconfig->SystemErrorOnNonFatalError[4] = 0x0; + silconfig->SystemErrorOnCorrectableError[4] = 0x0; + silconfig->PcieRpSpeed[4] = 0x0; + silconfig->PhysicalSlotNumber[4] = 0x4; + silconfig->PcieRpCompletionTimeout[4] = 0x0; + silconfig->PtmEnable[4] = 0x0; + silconfig->PcieRpAspm[4] = 0x4; + silconfig->PcieRpL1Substates[4] = 0x3; + silconfig->PcieRpLtrEnable[4] = 0x1; + silconfig->PcieRpLtrConfigLock[4] = 0x0; + silconfig->PcieRpSelectableDeemphasis[4] = 0x1; + silconfig->PcieRpNonSnoopLatencyOverrideValue[4] = 0x3C; + silconfig->PcieRpNonSnoopLatencyOverrideMultiplier[4] = 0x2; + silconfig->PcieRpSlotPowerLimitScale[4] = 0x0; + silconfig->PcieRpSlotPowerLimitValue[4] = 0x0; + silconfig->PcieRpLtrMaxNonSnoopLatency[4] = 0x1003; + silconfig->PcieRpNonSnoopLatencyOverrideMode[4] = 0x2; + silconfig->PcieRpLtrMaxSnoopLatency[4] = 0x1003; + silconfig->PcieRpSnoopLatencyOverrideMode[4] = 0x2; + silconfig->PcieRpSnoopLatencyOverrideValue[4] = 0x3C; + silconfig->PcieRpSnoopLatencyOverrideMultiplier[4] = 0x2; + + silconfig->PcieRootPortEn[5] = 0x1; + silconfig->PcieRpHide[5] = 0x0; + silconfig->PcieRpSlotImplemented[5] = 0x1; + silconfig->PcieRpHotPlug[5] = 0x0; + silconfig->PcieRpPmSci[5] = 0x1; + silconfig->PcieRpExtSync[5] = 0x1; + silconfig->PcieRpTransmitterHalfSwing[5] = 0x0; + silconfig->PcieRpAcsEnabled[5] = 0x1; + silconfig->PcieRpClkReqSupported[5] = 0x1; + silconfig->PcieRpClkReqNumber[5] = 0x3; + silconfig->PcieRpClkReqDetect[5] = 0x0; + silconfig->AdvancedErrorReporting[5] = 0x0; + silconfig->PmeInterrupt[5] = 0x0; + silconfig->UnsupportedRequestReport[5] = 0x0; + silconfig->FatalErrorReport[5] = 0x0; + silconfig->NoFatalErrorReport[5] = 0x0; + silconfig->CorrectableErrorReport[5] = 0x0; + silconfig->SystemErrorOnFatalError[5] = 0x0; + silconfig->SystemErrorOnNonFatalError[5] = 0x0; + silconfig->SystemErrorOnCorrectableError[5] = 0x0; + silconfig->PcieRpSpeed[5] = 0x0; + silconfig->PhysicalSlotNumber[5] = 0x5; + silconfig->PcieRpCompletionTimeout[5] = 0x0; + silconfig->PtmEnable[5] = 0x0; + silconfig->PcieRpAspm[5] = 0x4; + silconfig->PcieRpL1Substates[5] = 0x3; + silconfig->PcieRpLtrEnable[5] = 0x1; + silconfig->PcieRpLtrConfigLock[5] = 0x0; + silconfig->PcieRpSelectableDeemphasis[5] = 0x1; + silconfig->PcieRpNonSnoopLatencyOverrideValue[5] = 0x3C; + silconfig->PcieRpNonSnoopLatencyOverrideMultiplier[5] = 0x2; + silconfig->PcieRpSlotPowerLimitScale[5] = 0x0; + silconfig->PcieRpSlotPowerLimitValue[5] = 0x0; + silconfig->PcieRpLtrMaxNonSnoopLatency[5] = 0x1003; + silconfig->PcieRpNonSnoopLatencyOverrideMode[5] = 0x2; + silconfig->PcieRpLtrMaxSnoopLatency[5] = 0x1003; + silconfig->PcieRpSnoopLatencyOverrideMode[5] = 0x2; + silconfig->PcieRpSnoopLatencyOverrideValue[5] = 0x3C; + silconfig->PcieRpSnoopLatencyOverrideMultiplier[5] = 0x2; + + + silconfig->SsicRate[0] = 0x1; + silconfig->SsicPortEnable[0] = 0x0; + silconfig->SsicRate[1] = 0x1; + silconfig->SsicPortEnable[1] = 0x0; + + silconfig->PortUsb30Enable[0] = 0x1; + silconfig->PortUs30bOverCurrentPin[0] = 0x0; + silconfig->PortUsb30Enable[1] = 0x1; + silconfig->PortUs30bOverCurrentPin[1] = 0x1; + silconfig->PortUsb30Enable[2] = 0x1; + silconfig->PortUs30bOverCurrentPin[2] = 0x1; + silconfig->PortUsb30Enable[3] = 0x1; + silconfig->PortUs30bOverCurrentPin[3] = 0x1; + silconfig->PortUsb30Enable[4] = 0x1; + silconfig->PortUs30bOverCurrentPin[4] = 0x1; + silconfig->PortUsb30Enable[5] = 0x1; + silconfig->PortUs30bOverCurrentPin[5] = 0x1; + + silconfig->PortUsb20Enable[0] = 0x1; + silconfig->PortUs20bOverCurrentPin[0] = 0x0; + silconfig->PortUsb20Enable[1] = 0x1; + silconfig->PortUs20bOverCurrentPin[1] = 0x1; + silconfig->PortUsb20Enable[2] = 0x1; + silconfig->PortUs20bOverCurrentPin[2] = 0x1; + silconfig->PortUsb20Enable[3] = 0x1; + silconfig->PortUs20bOverCurrentPin[3] = 0x1; + silconfig->PortUsb20Enable[4] = 0x1; + silconfig->PortUs20bOverCurrentPin[4] = 0x1; + silconfig->PortUsb20Enable[5] = 0x1; + silconfig->PortUs20bOverCurrentPin[5] = 0x1; + silconfig->PortUsb20Enable[6] = 0x1; + silconfig->PortUs20bOverCurrentPin[6] = 0x2; + silconfig->PortUsb20Enable[7] = 0x1; + silconfig->PortUs20bOverCurrentPin[7] = 0x2; +} diff --git a/src/mainboard/up/squared/romstage.c b/src/mainboard/up/squared/romstage.c new file mode 100644 index 0000000000..2cfaa0064a --- /dev/null +++ b/src/mainboard/up/squared/romstage.c @@ -0,0 +1,96 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2019 Felix Singer + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include "gpio.h" + +static const uint8_t ch0_bit_swizzling[] = { + 0x0D, 0x0A, 0x08, 0x0B, 0x0C, 0x0F, 0x0E, 0x09, + 0x06, 0x00, 0x03, 0x04, 0x07, 0x01, 0x05, 0x02, + 0x1C, 0x1A, 0x19, 0x1B, 0x1D, 0x1F, 0x1E, 0x18, + 0x10, 0x17, 0x15, 0x16, 0x14, 0x12, 0x13, 0x11 +}; + +static const uint8_t ch1_bit_swizzling[] = { + 0x00, 0x07, 0x04, 0x05, 0x06, 0x02, 0x03, 0x01, + 0x08, 0x0F, 0x0D, 0x0B, 0x0A, 0x09, 0x0E, 0x0C, + 0x17, 0x11, 0x13, 0x12, 0x14, 0x15, 0x16, 0x10, + 0x1C, 0x1A, 0x1D, 0x1F, 0x18, 0x19, 0x1E, 0x1B +}; + +static const uint8_t ch2_bit_swizzling[] = { + 0x0D, 0x08, 0x0B, 0x0E, 0x0C, 0x0F, 0x09, 0x0A, + 0x04, 0x07, 0x01, 0x06, 0x02, 0x03, 0x00, 0x05, + 0x18, 0x19, 0x1C, 0x1A, 0x1D, 0x1E, 0x1F, 0x1B, + 0x11, 0x13, 0x15, 0x10, 0x16, 0x12, 0x17, 0x14 +}; + +static const uint8_t ch3_bit_swizzling[] = { + 0x00, 0x05, 0x04, 0x07, 0x03, 0x02, 0x06, 0x01, + 0x0A, 0x0B, 0x08, 0x09, 0x0C, 0x0E, 0x0D, 0x0F, + 0x12, 0x16, 0x14, 0x13, 0x17, 0x11, 0x15, 0x10, + 0x19, 0x1F, 0x1D, 0x1B, 0x1E, 0x18, 0x1C, 0x1A +}; + + +void mainboard_memory_init_params(FSPM_UPD *memupd) +{ + printk(BIOS_DEBUG, "MAINBOARD: %s/%s called\n", __FILE__, __func__); + + gpio_configure_pads(gpio_table, ARRAY_SIZE(gpio_table)); + + memupd->FspmConfig.Package = 0x1; // 0x0 + memupd->FspmConfig.Profile = 0xB; // 0x19 + memupd->FspmConfig.MemoryDown = 0x1; // 0x0 + memupd->FspmConfig.DDR3LPageSize = 0x0; // 0x1 + memupd->FspmConfig.DIMM0SPDAddress = 0x0; // 0xa0 + memupd->FspmConfig.DIMM1SPDAddress = 0x0; // 0xa4 + memupd->FspmConfig.RmtCheckRun = 0x3; // 0x0 + memupd->FspmConfig.RmtMarginCheckScaleHighThreshold = 0xC8; // 0x0 + memupd->FspmConfig.EnhancePort8xhDecoding = 0x0; // 0x1 + memupd->FspmConfig.NpkEn = 0x0; // 0x3 + memupd->FspmConfig.PrimaryVideoAdaptor = 0x2; // 0x0 + + memupd->FspmConfig.Ch0_RankEnable = 0x1; // 0x0 + memupd->FspmConfig.Ch0_DeviceWidth = 0x1; // 0x0 + memupd->FspmConfig.Ch0_DramDensity = 0x2; // 0x0 + memupd->FspmConfig.Ch0_Option = 0x3; // 0x0 + memupd->FspmConfig.Ch1_RankEnable = 0x1; // 0x0 + memupd->FspmConfig.Ch1_DeviceWidth = 0x1; // 0x0 + memupd->FspmConfig.Ch1_DramDensity = 0x2; // 0x0 + memupd->FspmConfig.Ch1_Option = 0x3; // 0x0 + memupd->FspmConfig.Ch2_RankEnable = 0x1; // 0x0 + memupd->FspmConfig.Ch2_DeviceWidth = 0x1; // 0x0 + memupd->FspmConfig.Ch2_DramDensity = 0x2; // 0x0 + memupd->FspmConfig.Ch2_Option = 0x3; // 0x0 + memupd->FspmConfig.Ch3_RankEnable = 0x1; // 0x0 + memupd->FspmConfig.Ch3_DeviceWidth = 0x1; // 0x0 + memupd->FspmConfig.Ch3_DramDensity = 0x2; // 0x0 + memupd->FspmConfig.Ch3_Option = 0x3; // 0x0 + memupd->FspmConfig.StartTimerTickerOfPfetAssert = 0x4E20; // 0x0 + + memcpy(memupd->FspmConfig.Ch0_Bit_swizzling, &ch0_bit_swizzling, + sizeof(ch0_bit_swizzling)); + memcpy(memupd->FspmConfig.Ch1_Bit_swizzling, &ch1_bit_swizzling, + sizeof(ch1_bit_swizzling)); + memcpy(memupd->FspmConfig.Ch2_Bit_swizzling, &ch2_bit_swizzling, + sizeof(ch2_bit_swizzling)); + memcpy(memupd->FspmConfig.Ch3_Bit_swizzling, &ch3_bit_swizzling, + sizeof(ch3_bit_swizzling)); +} diff --git a/src/mainboard/up/squared/upsquared.fmd b/src/mainboard/up/squared/upsquared.fmd new file mode 100644 index 0000000000..4ea1375e10 --- /dev/null +++ b/src/mainboard/up/squared/upsquared.fmd @@ -0,0 +1,21 @@ +FLASH 16M { + SI_DESC@0x0 0x1000 + SI_BIOS@0x1000 0xefe000 { + IFWI@0x0 0x2ff000 + OBB@0x2ff000 0xbff000 { + FMAP@0x0 0x800 + UNIFIED_MRC_CACHE@0x800 0x21000 { + RECOVERY_MRC_CACHE@0x0 0x10000 + RW_MRC_CACHE@0x10000 0x10000 + RW_VAR_MRC_CACHE@0x20000 0x1000 + } + CONSOLE@0x21800 0x20000 + COREBOOT(CBFS)@0x41800 0xb7d800 + BIOS_UNUSABLE@0xbbf000 0x40000 + } + } + SI_DEVICEEXT@0xeff000 0x101000 { + DEVICE_EXTENSION@0x0 0x100000 + UNUSED_HOLE@0x100000 0x1000 + } +} diff --git a/src/mainboard/up/squared/vboot-ro.fmd b/src/mainboard/up/squared/vboot-ro.fmd new file mode 100644 index 0000000000..72f92fe964 --- /dev/null +++ b/src/mainboard/up/squared/vboot-ro.fmd @@ -0,0 +1,35 @@ +FLASH 16M { + SI_DESC@0x0 0x1000 + SI_BIOS@0x1000 0xefe000 { + WP_RO@0x0 0xe91000 { + IFWI@0x0 0x2ff000 + FMAP@0x2ff000 0x800 + RO_VPD(PRESERVE)@0x2ff800 0x4000 + RO_SECTION@0x303800 0xb8d800 { + RO_FRID@0x0 0x40 + RO_FRID_PAD@0x40 0x7c0 + GBB@0x800 0x40000 + COREBOOT(CBFS)@0x40800 0xb4d000 + } + } + MISC_RW@0xe91000 0x2d000 { + UNIFIED_MRC_CACHE@0x0 0x21000 { + RECOVERY_MRC_CACHE@0x0 0x10000 + RW_MRC_CACHE@0x10000 0x10000 + RW_VAR_MRC_CACHE@0x20000 0x1000 + } + RW_SHARED@0x21000 0x4000 { + SHARED_DATA@0x0 0x2000 + VBLOCK_DEV@0x2000 0x2000 + } + RW_VPD(PRESERVE)@0x25000 0x2000 + RW_NVRAM(PRESERVE)@0x27000 0x5000 + FPF_STATUS@0x2c000 0x1000 + } + BIOS_UNUSABLE@0xebe000 0x40000 + } + SI_DEVICEEXT@0xeff000 0x101000 { + DEVICE_EXTENSION@0x0 0x100000 + UNUSED_HOLE@0x100000 0x1000 + } +} diff --git a/src/mainboard/up/squared/vboot-roa.fmd b/src/mainboard/up/squared/vboot-roa.fmd new file mode 100644 index 0000000000..330ce03757 --- /dev/null +++ b/src/mainboard/up/squared/vboot-roa.fmd @@ -0,0 +1,40 @@ +FLASH 16M { + SI_DESC@0x0 0x1000 + SI_BIOS@0x1000 0xefe000 { + WP_RO@0x0 0x502000 { + IFWI@0x0 0x2ff000 + FMAP@0x2ff000 0x800 + RO_VPD(PRESERVE)@0x2ff800 0x4000 + RO_SECTION@0x303800 0x1fe800 { + RO_FRID@0x0 0x40 + RO_FRID_PAD@0x40 0x7c0 + GBB@0x800 0x40000 + COREBOOT(CBFS)@0x40800 0x1be000 + } + } + MISC_RW@0x502000 0x2d000 { + UNIFIED_MRC_CACHE@0x0 0x21000 { + RECOVERY_MRC_CACHE@0x0 0x10000 + RW_MRC_CACHE@0x10000 0x10000 + RW_VAR_MRC_CACHE@0x20000 0x1000 + } + RW_SHARED@0x21000 0x4000 { + SHARED_DATA@0x0 0x2000 + VBLOCK_DEV@0x2000 0x2000 + } + RW_VPD(PRESERVE)@0x25000 0x2000 + RW_NVRAM(PRESERVE)@0x27000 0x5000 + FPF_STATUS@0x2c000 0x1000 + } + RW_SECTION_A@0x52f000 0x98f000 { + VBLOCK_A@0x0 0x10000 + FW_MAIN_A(CBFS)@0x10000 0x97efc0 + RW_FWID_A@0x98efc0 0x40 + } + BIOS_UNUSABLE@0xebe000 0x40000 + } + SI_DEVICEEXT@0xeff000 0x101000 { + DEVICE_EXTENSION@0x0 0x100000 + UNUSED_HOLE@0x100000 0x1000 + } +} diff --git a/src/mainboard/up/squared/vboot-roab.fmd b/src/mainboard/up/squared/vboot-roab.fmd new file mode 100644 index 0000000000..4ddcbc0c2e --- /dev/null +++ b/src/mainboard/up/squared/vboot-roab.fmd @@ -0,0 +1,45 @@ +FLASH 16M { + SI_DESC@0x0 0x1000 + SI_BIOS@0x1000 0xefe000 { + WP_RO@0x0 0x503000 { + IFWI@0x0 0x2ff000 + FMAP@0x2ff000 0x800 + RO_VPD(PRESERVE)@0x2ff800 0x4000 + RO_SECTION@0x303800 0x1ff800 { + RO_FRID@0x0 0x40 + RO_FRID_PAD@0x40 0x7c0 + GBB@0x800 0x40000 + COREBOOT(CBFS)@0x40800 0x1bf000 + } + } + MISC_RW@0x503000 0x2d000 { + UNIFIED_MRC_CACHE@0x0 0x21000 { + RECOVERY_MRC_CACHE@0x0 0x10000 + RW_MRC_CACHE@0x10000 0x10000 + RW_VAR_MRC_CACHE@0x20000 0x1000 + } + RW_SHARED@0x21000 0x4000 { + SHARED_DATA@0x0 0x2000 + VBLOCK_DEV@0x2000 0x2000 + } + RW_VPD(PRESERVE)@0x25000 0x2000 + RW_NVRAM(PRESERVE)@0x27000 0x5000 + FPF_STATUS@0x2c000 0x1000 + } + RW_SECTION_A@0x530000 0x4c7000 { + VBLOCK_A@0x0 0x10000 + FW_MAIN_A(CBFS)@0x10000 0x4b6fc0 + RW_FWID_A@0x4c6fc0 0x40 + } + RW_SECTION_B@0x9f7000 0x4c7000 { + VBLOCK_B@0x0 0x10000 + FW_MAIN_B(CBFS)@0x10000 0x4b6fc0 + RW_FWID_B@0x4c6fc0 0x40 + } + BIOS_UNUSABLE@0xebe000 0x40000 + } + SI_DEVICEEXT@0xeff000 0x101000 { + DEVICE_EXTENSION@0x0 0x100000 + UNUSED_HOLE@0x100000 0x1000 + } +}