From 30dcce9817023cba420b72dc4af42d7651700197 Mon Sep 17 00:00:00 2001 From: Esteban Aguililla Klein Date: Sat, 28 Dec 2024 14:45:37 +0100 Subject: [PATCH] soc: rockchip: added the rk35 series and moved relevant soc added the rk35 series and moved the rk3568 under it Signed-off-by: Esteban Aguililla Klein --- boards/khadas/edge2/Kconfig.khadas_edge2 | 5 + boards/khadas/edge2/board.yml | 6 ++ boards/khadas/edge2/doc/index.rst | 92 +++++++++++++++++ boards/khadas/edge2/doc/khadas_edge2.jpg | Bin 0 -> 46399 bytes boards/khadas/edge2/khadas_edge2.dts | 33 ++++++ boards/khadas/edge2/khadas_edge2.yaml | 9 ++ boards/khadas/edge2/khadas_edge2_defconfig | 17 ++++ dts/arm64/rockchip/rk3588s.dtsi | 96 ++++++++++++++++++ soc/rockchip/rk35/CMakeLists.txt | 2 + soc/rockchip/rk35/rk3588s/CMakeLists.txt | 6 ++ soc/rockchip/rk35/rk3588s/Kconfig | 10 ++ soc/rockchip/rk35/rk3588s/Kconfig.defconfig | 8 ++ .../rk35/rk3588s/Kconfig.defconfig.rk3588s | 19 ++++ soc/rockchip/rk35/rk3588s/Kconfig.soc | 9 ++ soc/rockchip/rk35/rk3588s/mmu_regions.c | 26 +++++ soc/rockchip/soc.yml | 1 + 16 files changed, 339 insertions(+) create mode 100644 boards/khadas/edge2/Kconfig.khadas_edge2 create mode 100644 boards/khadas/edge2/board.yml create mode 100644 boards/khadas/edge2/doc/index.rst create mode 100644 boards/khadas/edge2/doc/khadas_edge2.jpg create mode 100644 boards/khadas/edge2/khadas_edge2.dts create mode 100644 boards/khadas/edge2/khadas_edge2.yaml create mode 100644 boards/khadas/edge2/khadas_edge2_defconfig create mode 100644 dts/arm64/rockchip/rk3588s.dtsi create mode 100644 soc/rockchip/rk35/rk3588s/CMakeLists.txt create mode 100644 soc/rockchip/rk35/rk3588s/Kconfig create mode 100644 soc/rockchip/rk35/rk3588s/Kconfig.defconfig create mode 100644 soc/rockchip/rk35/rk3588s/Kconfig.defconfig.rk3588s create mode 100644 soc/rockchip/rk35/rk3588s/Kconfig.soc create mode 100644 soc/rockchip/rk35/rk3588s/mmu_regions.c diff --git a/boards/khadas/edge2/Kconfig.khadas_edge2 b/boards/khadas/edge2/Kconfig.khadas_edge2 new file mode 100644 index 000000000000..58dd61dfe79d --- /dev/null +++ b/boards/khadas/edge2/Kconfig.khadas_edge2 @@ -0,0 +1,5 @@ +# Copyright 2024 Université Gustave Eiffel +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_KHADAS_EDGE2 + select SOC_RK3588S diff --git a/boards/khadas/edge2/board.yml b/boards/khadas/edge2/board.yml new file mode 100644 index 000000000000..93138f3a2bbb --- /dev/null +++ b/boards/khadas/edge2/board.yml @@ -0,0 +1,6 @@ +board: + name: khadas_edge2 + full_name: Edge2 + vendor: khadas + socs: + - name: rk3588s diff --git a/boards/khadas/edge2/doc/index.rst b/boards/khadas/edge2/doc/index.rst new file mode 100644 index 000000000000..dae0e126344f --- /dev/null +++ b/boards/khadas/edge2/doc/index.rst @@ -0,0 +1,92 @@ +.. zephyr:board:: khadas_edge2 + +Overview +******** + +See + + +Hardware +******** + +See + +Supported Features +================== + +The ``khadas_edge2`` board target supports the following +hardware features: + ++-----------+------------+--------------------------------------+ +| Interface | Controller | Driver/Component | ++===========+============+======================================+ +| GIC-600 | on-chip | GICv3 interrupt controller | ++-----------+------------+--------------------------------------+ +| ARM TIMER | on-chip | System Clock | ++-----------+------------+--------------------------------------+ +| UART | on-chip | Synopsys DesignWare 8250 serial port | ++-----------+------------+--------------------------------------+ + +Other hardware features have not been enabled yet for this board. + +The default configuration can be found in (NON-SMP) +:zephyr_file:`boards/khadas/edge2/khadas_edge2_defconfig` + +There are multiple serial ports on the board: Zephyr is using +uart2 as serial console. + +Programming and Debugging +************************* + +Use the following configuration to run basic Zephyr applications and +kernel tests on Khadas Edge2 board. For example, with the :zephyr:code-sample:`hello_world`: + +1. Non-SMP mode + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :host-os: unix + :board: khadas_edge2 + :goals: build + +This will build an image with the hello world sample app. + +Build the zephyr image: + +.. code-block:: console + + mkimage -C none -A arm64 -O linux -a 0x10000000 -e 0x10000000 -d build/zephyr/zephyr.bin build/zephyr/zephyr.img + +Burn the image on the board (we choose to use Rockchip burning tool `rkdeveloptool `_, you will need a `SPL `_ which is provided by khadas: + +.. code-block:: console + + rkdeveloptool db rk3588_spl_loader_*; rkdeveloptool wl 0x100000 zephyr.img; rkdeveloptool rd + +The sector 0x100000 was chosen arbitrarily (far away from U-Boot image) + +Use U-Boot to load and run Zephyr: + +.. code-block:: console + + mmc read ${pxefile_addr_r} 0x100000 0x1000; bootm start ${pxefile_addr_r}; bootm loados; bootm go + +0x1000 is the size (in number of sectors) or your image. Increase it if needed. + +It will display the following console output: + +.. code-block:: console + + *** Booting Zephyr OS build XXXXXXXXXXXX *** + Hello World! khadas_edge2 + +Flashing +======== + +Zephyr image can be loaded in DDR memory at address 0x10000000 from SD Card, +EMMC, QSPI Flash or downloaded from network in uboot. + +References +========== + +`Documentation: `_ diff --git a/boards/khadas/edge2/doc/khadas_edge2.jpg b/boards/khadas/edge2/doc/khadas_edge2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..68278e72a98f5aa95b08ccab59f59825da4e08bf GIT binary patch literal 46399 zcmb@sbx<6^*EYJiy9Af81Pku&9&8~HG$BCng~i?7Sr!Oxi@Q4sZb5OTEUpPs4do^#I2ua|WIp_-Da5&-F+yhVBo0K9Afx)i-^zW@NL zs_Xzv004jvAVxv~ApJxCxu}rP{;SsihpGQ3Hv5NJ|ECV}KTLxBfAno5QU6Q-AK`z= z+kYhg;rU-RIslM_0YLrN!o$bQgOvO~Fw#E;K>q)1=jGu+%KsmXFE0Q9a{m8dl=(Ll z<-g(o(7zx6@&GgxR8&+Hw0{K}8X7tVE+)o5A;7`G!X+XgCMF^vA|fHDc|}4>MMgwK z!ALp;jDiY4 zBSI%;#NZ`)EvrLnj!DME2MJD=D_%yw<=V!?ElA2`JX5JPyY9P|IOqdIoiK2exiTP$VjM2$Y{vu$p2aSe_ce3 zD8#(7B&a&C`OG0_!9V3d$p!VjXiTK%{4N_W%K+SeRv;6h5CNnCH>OB3+N5azKNskV zNHSl7^7&YCV^EmZg7R6hQC z)hHc7fB*1zOOMf4qf02g0Mhang7AfWIa$sGkWCzwu^_;k^=Suu8*Ds31*fHM@%n7* zY;B~4DQm(&6xp27XYKq+8*|2JCAhS&JZ}d2oS33Z)r?mu%z{*Mj+ ztLW9H9ifj$b>FZjFzyGlF}low60CcOa8{U==-6G7l!@uQoIB~+{lW-aCi_7}(^)EzJ5}dLN8UWGg;j=qi!C{sTZXf{Lor&o zSaBJPhzf@2`g3GVwl9&9botY})M~0(u}uCJ&o2Z1e`5698Nyq_xluXV#8pm{Aa|ex zn`nRj>g%_w?iL}t1#O(^rA^Uz>!{@{o|HE)0Ka+K-^wcrIoxy(8PxUN9PWdOOFEP+ z7x_Mw6UEX#dzb-yL{DxM!s9%Y!Zs)`fN16GX&Do+#?*qolH;P%s#U}0nu0fyssU`B z6}Yv_4>FDN*L9n7K80q5JOAo+Jwk96d;s9yQrcCC=|5 zvTbudz29rGU1izCUC;J`+mJilhiU0ZpSfoyH4l4xRee$^8W;YAzdq+OyQgJ{=Ib{L z1BcMpG66v7Mu3XEtSTaIdrR_MBbH}@O8aJRLH-3W-24K_4322)lGBGNd~M8dk9IM# zYBlsCt#vsM%6Imqnji}(7J=JUsw2&N*+(V8_mIr2Jgf0-=Zsw!!99{zpY6{TN+~pN zR<)NRkQ+q59~U*eOT5#77J&yX2y|An70TW zVcIiZ+qCss)U0lAFvM>|d?BgeELH#}E!TPd$SVzOxD$l&>Ad-2&0)vamV{kQSTNz1;&J98bvaVNffI4d6f z@^G{~K0~8dJ9BWUbj2!m;EE(0iP0h@8|kqko{)RwGHaq&UX=ANoW?KcW~&+f4^_B| ze8O)oHdWfL&j7@;-{a%7)_%Xc-N{ruB<<3Y5H7L-(xTZ8_#7hiv)XMf=YYH@x{P}P zp=N6LdMjG1xR&tP?6`dh5}b*{ee-^Q_yy1-@B(-Nm?R#Sl=U98Y7F~BN?!mEbAhI& zZyg)a}moe2vTEgXFyG*^j62YZ6^{i+A! zDY|K&qU*Dr%$aahq}-hIK}Ev_TE%>eUzPRR)j`zGr(UhumLzeIsgtUT)aquFEX4%Z zb1ShQX%^KJJAS}0sC0n1Pkr^nNL%aQt=i#rc*5A_zZ{4oaU&pn8P`3EM9-!zM= zyv;dt)t4ZXonH0h6|fa(i+P)TJGqXt8{u`m_bq@!uoOJ|Fr{gm_1R?3vu&FA$i}=` z#SPkE0nf(Q`uEO5aimfgeU$aaUAS_;^|eXONGP_jG?@!LDo;4Io-DPqN3|14M?%}ejCgGg`QhfaK2q^j^Bb|nNP0kc zg?x+w%I_Gc{rAo*Dv6;E=BlbcNlhzng>hnWYXRl8T-(8St}&{Wdbb}|f7=w95> z&;RHgZGEG{!hF>hh9NuEwwjkwH9pL7Jjy97x@cDVE5`Z_J9Kbxo2-pwvTp_;RZ3l- z@OPnV%a)u{|9(O8W6=rthumg!pm}MC=_K)m{?gPY)^2e&$Xk2{wWuOZq!U|vqPJws z>x9(ne(U#&ezMww>PPEJO`Ag|J~}&`nD(AaBunODU7mclk7M5_B^&HE2*6S^I!!y2 z|JGS2r^!FLi`nsbssl2p@n)_0fmJRXJnN$f$x<_EtNUA;tp;iD+d>52myYFqH+b8; zYLrVWuP61ZOM|Q>NZjZB$i6eSme0p#ptE9r@jba6|JsP6kt6HUquDAu?MA72Wqa6R`H=LnTLw$(36H4o4vF2o5IA91x&*$U!KlwWJxfi-r{ zg6t!S=J;vzP&BmySv}r|5HEhGfmKT2V}R%XWL}N?Q!@S%OOB4S9*mnyPXeLKCDRTf zONs~C`Vp-N+~nu66ssjd<~$bN#nY5`oW@$)n>pB=fx!qHif7weX}7jpANwoUiB}$N zzXfl#xNg0%1N_R8Q`SIejPe zNw9`u3S%k;@p5c58qNr{3xD`0_yg7c>f0~MEk0(uf&nE7*>@UJ-!RvMh_-wZ*`0|Bm|~SJfJ7 z%|nx)eXz#gem#UO8yQ8+Rfv=K^<|k6STxJfc-F*aj>xcW00{ar4NaZ?JaWFZ z={BGp>Mwu4yFjfdVly)54;M+clizQXsvdaUB+Yej8)419|}{5KA|hiL72b#H~Z( zk3Uz_byS7?_Y)zjM8Q?^v`>nWJJhC5kfM;RQ2c@}sUZ!aX@bJcke%%ekc>X!03Ez0 z`4dX4QCr~|YuVJiRbS7=87ZNkzPn!F1xN@`@QE3^^(32euhCz;JmBRO@X1y2&> z_=?<~>M0sJojcqvH0g?YOv7XoKG+VYtsD2?SU8L5V<%u8p}q4%6T@H-uj;6`dt01V zdiRPPAuFyNGXt%%&g)`#I_EBar9PCwq~g{)n!HA!;C)Kdh7XF0O7izbCQJzUT)fcy zP^IWrqDwydDo5oCbCFrD)p(ZLsd&s}I@Q!ExV4oip5x;>6Q_z`z5vv3=W@|ls*D2m%gtt5 z5MshV_)c*n^~1@(s^+S2Fwh_)*NM*$OF*(SYy4}kJmC9Jj|UoRQ5BGp7r-kjJu7;= zo6Goq2BN99k*DiLn$C=cH2ez9)CxGBqR+f`ZaneWn1$*Ws+rkwIZb0qeK}a6-}a}f zXFu?po#&Yw9o`|WMUrTFwq(fwsXE*J$YYZ*kdK9$Y^ zctd-@p|4jSxjIIf4rK!9s-UQ&Y~1aeW5f3zgHl%COSHcKNTlf~=}&0UhJvaqw4{pS zLPHTVAx4{je`%XS=e%90tynz!8}vcB-dodjsz+$(ZvIb)VI?R!V5IyrtpQP56^BYJ z{gnsSVwu0a6KLxDp)Tz*9>Z_uMV+_Vq8%cW@_6K(&o-9B9onr1 z0Dss9OI+CP2x9Flb`*qG9HG+vBnf@ytAx-XDlAJYJHkIbA@rc6zJUkxXMs}JwP)~) zi3GLfxt0=jTZ}uJO>E^=G@Ugw9_il?eiwoJ)u-p8KR)9}|BS(r53{`?EXVZmj}g1jf1@fse4FZlwJ`-@Qhl&2#H4L6<}H1p0%`bV6{g=Y#J;(46}M z_rcGWP6|pSGw-^vh=`#eFL5gs`lFiP9;Wt&B29-M5*d9x_%<-;ukEg?V$zL>L#^7! z&@hc%3Q0SRRCPZMv#%#7VPXCKUS;)AC3TpL?*8}jdTRPEja@)DTGJrL5KL%65z zpTo|SV-V5I9HNXsI!KWB5i4nQ5&tsSKoh!J#LZs8krQd;{PL z!0}ci;0gs-LGzs^oKw_{81fq`bAtlh46%@*UP>Wy z+vBQ2Y{jbXV#SdHX(*Ca_WPu$rmBI@q@>2$68T1Xi;wK=lD}$}hps_e3&OpiWRYzL z$T`S4fuL3a0%?Fy)ve$JuQkIThAH6Kf)4MpqvYoBcKyRp2-E7(#g@7cdlvDM)gT78 zB$kSq$|Mig1Z12I=0sU>H5XR)i?L0Geh^dih);YWc_$tzuzml~>fzGy3r!?A{hrb4 z*Qi(Z+dCT-O<9q##W>IW26wSjMygYp)x0|^YR6}xMdO$>EXR|_pnIg=;|Y|Lie{?S zdCh`%-tU0i8uiSK3YKg*5Y)Jb`$#8Vi5}uOruZaq`Lnt`MKOBUO7R=3Zx zXcfsg^*QRvZfEmrWp!AQu9-FGy+&JUo?ajpXIK?<{ZURWc~e?E$kqE*MOILDPcf|Qd8&WFk>&*ucM!oodRM;BG{;Z11z)stwP3|IZzRhJyn8ctpyW-zitqLJuvRr|V~8s=^XTvJ zc2|~9wvTXs8Kx~37TYfstxpZP!UUI>1}*qYS6q!Ng?4$>IdTEDUmugV#9ob8SYhMe z`-X)ymF~)xr!tkxE9lP zs`=P^?1H7S4|=LW7;*5_Evzkwn(FBG7VRIP(II+L<4Udm?3>LWl>#zP1Af>yEkA$p zhwk4*ZLhn^?9v;$g)Ir;7;9>B+tJqasqgK3+vsTp|?o=YFa} zyx#AdMM@znWNeaS3NAA+lDl#>z~4@qg)j7x>OCGc1+txjxxZ)~Pb)u_(8nan>B}ut zf2WhV+{*Q;$@;JP{Kms$oc$DP^=?=4(i{W3dn-Fg~5JZ#zi)( z3U|Rsx>QMHH^MxCZ02SU9q~35@vhRiIBhZeGS7Xez${;ff4R=}+P27L85+-sb164# zBIEbf-S5k?`3?z{AGd5rJ%eYSOlf#U6nOiU2lPSjHyu?*mD9m8Ln@SeNzF#r%_rcl zl+rhU#*e$p>iY|~n2n1%+ZckvEq-YJb@nGfK@SajV%~V?YdYT1GGl;MTu(Mw_OwVk zvk)A*Lb&__knmlo>)Izpzoxxk;AU?sz04AvZp@?`^&VC@2%NV~^m90%ga=u`o>@Qb(7Dp~$B*Zx`3 z8q1|qrZWpGqUh|{i4l4Jkhn(nM(Gg0fJw1JQWbK=>xp-KR<%)$C zbpn9+HKUz$g$7ITpOfr~Sp1oh09~EAZH~{x=_YEb{ql_BQIkklRaRaf%z&k92R)hU z@deaX{CXah(&rOMQyWIZePW8*|7|-UMZ?JGIG^i`)a;nx9a(4rL%>2_6Qc=RJ#_1- z60+F6z1z1mq5Jw4d{Na;6wRgx(Dj#nF^dbzsK+v6@-5NDrNj{$C&}|%8QSv?$HyJ- zZ_Ddvy%ryQuC~)rjC{7+1F)Q&y~4^FMW& z>;q-wq6zAdzSz)x;|(mV=e;=cxdup=rtL-X*?3SFb9HWzoPbT5%jd8l>KD&o4^iMO1jPj)?0?wg5Ec__XTgo zWK9L8-**d^--0$srPEsdkF3kr)ZXv1LzmQ1e}Fc+PF!eweAxqRagTx>TX%%SsZd$?QH zKkYL!2P9oW0eB)pNlBK$l{)3q>E5#D6YSi!ywl9ZRNX*$sQ@c0uEV6fVWPMt>+*YD zmXuR5sY-!L|8cBBY*?Yg(Q?6qZIPoX!+Z$th3Oc6gxJ9z6%m~bbpL`N2R_u#bc+_d zS;kJZ?~nPnX3Bvs3sn13L&W{|SvS`$7U}-#|CF4~c-Ob+Vd(Nv{w*)tzsN;4GZtVw z~G+A)LN}8?229bn&OZJ7--*1sE{+N*zh8(UIy;E&l6;OG9 zK7Kf4d|sjqNet1Ujh-ZTQR(yQlbvuK#uv1{Hcn?RsXP#{zgV`h_aeV3Vpim(irFmc z+D!VnmLF(CCLY?^s64kwnW$?rwRfrEL=qtuY!{aol0G+VCa;;anH^J1Tf7%}p@oEH z8MeJOc-mXik!Q8`=9V^)7U4@$bd45~u$kHvHHq5w4Xr`D3gBgwqauB+Ecso?BIhb= zpu4fgQ<5*Odf`5~*%GzwAkEBis9&ZQQ{Fccig+aC~O>@2v1g?V%2%)PWn9lzxW{Fmw{j zq9&22gbS@-65VB!OnCgcK0BNgsoDwe)tS{@n|t~a?%P%zHqmCf)%K9(z|62Ef%FSv zG_KoA*L9$yuu4z-V>3rxm-A7-Wez#yJuKUL&XUfn5`#M`iafF6>JnKk%oqgiHB@D8 z@dzolxEVE+z;(U*;$Tp_9MS7J3!?BqJ9yu+LDn|ItYigHJP%RBZlxm^2Hr5`UcodZ zt1#kzP}upmGK`8Gy`#f)8F1|DHOr_-B~!;St9BwIxvcXK>gCTj zHn5~xwFdR>!qF>_1%oGxg*PX!?ip{NE0dOm;EZ_1>`r5_gnnS2t5Jh$pK@6x`~Qh& z{zIWd^crqk73Zl4p`pMTpXMm@D}q9#w>e$7 zUXkBUp8~P*AZN!#{lhESEV_Gju>kcQI%q z6!&0h_4YRGYyHxAAnw@9J;?u8**R_TTm|p!F}o+*>Qk{r*ySjhzn4NNA=vTbR`L24 zE-&LPRDG0J?tLd6NuU?^4?Zn=-xa-N-89thzf!Zgd<`2Ne48;K{3Gyso&&+uMKx2D zJ1vq?g;A2XNh_38nYtnG1t7@Nk!p6if07mad3Iq{62M$Gy#@3Z+Oc~oCRt%q1Lh6& zXlc=O+%M%^PSsv{j@?WQM!5G#cvZRw8FS`rd!p|BdRPo-o!y%0+ne1S;+aHLoDI)( zj1y?O>wC8p;3?-3bw=A33Kh?%GJ6eEuq&MoWZpc{8TyHh-MJhDfC-ZwGTkEKl5`Ml zC2BP;Jb3X3P5$<8JX6s_%4kygDQgJI>|Dc>(|B8phGJ=I%2>;`>8!5^5D9HFYc>NZ zz8oaPMV69+LZvZ)BoQcZJnEcMkkrPLLr=+hRj$2kcHyGp>ij4Ri$n96A{Ak_Zuvmt z{A4*0?xk5Zg7;1yX+@;YW2b>+=NI6r_XHn#xelST(nFxGSg+{wDZ)B(W(LkYz-(1W zS`-$#LM%Fj&!aM7Xy>dc6tlqhFLdaOnyTP#r>@|r9M#=pna>*1>`1wsotZPE^J)em zF1%KR;7s`(4UuA&66ZiAE%E`aOXXX9YkpTM{^8gs(=CF_)0jIHNqZT39P?H=+Mw(rDzSXV$FzeO1JhL~S zu3DG$hmOJgTKF5?oy6Qsz0jdsW_%-;t`!4K(&gcYCoF;KFUk@(w{W?7OK~c7m#>EM z)iee2*>r(slI#_l^JUh?OJE6+g`r<+7io&^IqfWYTxHL7cjMb60O05j^?S8 z(c`>EnE0Jtm%&3vfrhtLS0}ek6`YHTcH^9>v4b;{E!DN1>xJszg5CbS5gl3a_s6-< zsk0qED(U-gb1;al7Vq4xJ$7gsiYPe;j1lCz&GgRkJr;)t%FV6^KWcYO+;>Y)Q##bd z9DT@hq_%|TVSXHAVFyAez2YzxI)?zsZu@j4cjmturuN}T9-=>vrNoPmA0*$cC#kYfc@4 zn1+H$+&jb&oaGJ8sBgnOWiQGsW+AsVAB|md-a=aMsrFS{EAkaTDJX4+ms>zMwzr=J zrSgg*OhsL?T2HJ~*9x=dvjnIULg$2**s#sDX^lKBkBmV2P{}BeY%O#D#-TmV!1d$3 zdwM6G8OOc=OC-pFt2`AwC-$sIIm`v9{g@kHs4 zmhp@OT1oU<--zvnCI2W$uB~JF4jNh;{LXrO3XLVid*oF6J&R5GiE)9_MDuk$S>hJK zsQWj7U=tw>?r8MBS%FQyqkfn)MQ+v;Ctwf#*ujGm5&>`dO)o;cHwbNOcf=I zU4ZJgGLPE~L6g_pwm@{o<~wlluADsANZs$padg|T6@4(dD6~3x!Ad4OYzWths|qu$ zT!EC-WfwUJDR2b!RuCwZ+=Fs$vBPJQ1no=Wk

XG}y@2FC=}Ct9zufc&BE}l}2fW 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 + +/ { + model = "Khadas Edge2"; + compatible = "khadas,edge2"; + + chosen { + zephyr,sram = &sram0; + zephyr,console = &uart2; + zephyr,shell-uart = &uart2; + }; + + cpus { + /delete-node/ cpu@1; + /delete-node/ cpu@2; + /delete-node/ cpu@3; + /delete-node/ cpu@4; + /delete-node/ cpu@5; + /delete-node/ cpu@6; + /delete-node/ cpu@7; + }; +}; + +&uart2 { + status = "okay"; +}; diff --git a/boards/khadas/edge2/khadas_edge2.yaml b/boards/khadas/edge2/khadas_edge2.yaml new file mode 100644 index 000000000000..c9ed4ad11b23 --- /dev/null +++ b/boards/khadas/edge2/khadas_edge2.yaml @@ -0,0 +1,9 @@ +identifier: khadas_edge2 +name: Khadas Edge2 (single core, non SMP) +type: mcu +arch: arm64 +toolchain: + - zephyr + - cross-compile +ram: 8192 +vendor: khadas diff --git a/boards/khadas/edge2/khadas_edge2_defconfig b/boards/khadas/edge2/khadas_edge2_defconfig new file mode 100644 index 000000000000..38b7f52812f9 --- /dev/null +++ b/boards/khadas/edge2/khadas_edge2_defconfig @@ -0,0 +1,17 @@ +# Copyright 2024 Université Gustave Eiffel +# SPDX-License-Identifier: Apache-2.0 + +# Platform Configuration +CONFIG_ARM64_VA_BITS_40=y +CONFIG_ARM64_PA_BITS_40=y +CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=24000000 +CONFIG_CACHE_MANAGEMENT=y +CONFIG_ARMV8_A_NS=y + +# Serial Drivers +CONFIG_SERIAL=y +CONFIG_UART_INTERRUPT_DRIVEN=y + +# Enable Console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y diff --git a/dts/arm64/rockchip/rk3588s.dtsi b/dts/arm64/rockchip/rk3588s.dtsi new file mode 100644 index 000000000000..49a90d61c723 --- /dev/null +++ b/dts/arm64/rockchip/rk3588s.dtsi @@ -0,0 +1,96 @@ +/* + * Copyright 2024 Université Gustave Eiffel + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +/ { + #address-cells = <1>; + #size-cells = <1>; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + cpu@0 { + device_type = "cpu"; + compatible = "arm,cortex-a55"; + reg = <0x0>; + }; + cpu@1 { + device_type = "cpu"; + compatible = "arm,cortex-a55"; + reg = <0x100>; + }; + cpu@2 { + device_type = "cpu"; + compatible = "arm,cortex-a55"; + reg = <0x200>; + }; + cpu@3 { + device_type = "cpu"; + compatible = "arm,cortex-a55"; + reg = <0x300>; + }; + cpu@4 { + device_type = "cpu"; + compatible = "arm,cortex-a76"; + reg = <0x400>; + }; + cpu@5 { + device_type = "cpu"; + compatible = "arm,cortex-a76"; + reg = <0x500>; + }; + cpu@6 { + device_type = "cpu"; + compatible = "arm,cortex-a76"; + reg = <0x600>; + }; + cpu@7 { + device_type = "cpu"; + compatible = "arm,cortex-a76"; + reg = <0x700>; + }; + }; + + gic: interrupt-controller@fe600000 { + #address-cells = <1>; + compatible = "arm,gic-v3", "arm,gic"; + reg = <0xfe600000 0x10000>, /* GICD */ + <0xfe680000 0x100000>; /* GICR */ + interrupt-controller; + #interrupt-cells = <4>; + status = "okay"; + }; + + sram0: memory@10000000 { + reg = <0x10000000 DT_SIZE_M(128)>; + }; + + timer { + compatible = "arm,armv8-timer"; + interrupt-parent = <&gic>; + interrupts = , + , + , + ; + }; + + uart2: serial@feb50000 { + compatible = "rockchip,rk3588s-uart", "ns16550"; + reg = <0xfeb50000 0x1000>; + interrupt-parent = <&gic>; + interrupts = ; + status = "disabled"; + reg-shift = <2>; + clock-frequency = <350000000>; + }; +}; diff --git a/soc/rockchip/rk35/CMakeLists.txt b/soc/rockchip/rk35/CMakeLists.txt index 23c2d5fea6e5..b45e8592a61d 100644 --- a/soc/rockchip/rk35/CMakeLists.txt +++ b/soc/rockchip/rk35/CMakeLists.txt @@ -3,4 +3,6 @@ if(CONFIG_SOC_RK3568) add_subdirectory(rk3568) +elseif(CONFIG_SOC_RK3588S) + add_subdirectory(rk3588s) endif() diff --git a/soc/rockchip/rk35/rk3588s/CMakeLists.txt b/soc/rockchip/rk35/rk3588s/CMakeLists.txt new file mode 100644 index 000000000000..667a960e91b7 --- /dev/null +++ b/soc/rockchip/rk35/rk3588s/CMakeLists.txt @@ -0,0 +1,6 @@ +# Copyright 2024 Université Gustave Eiffel +# SPDX-License-Identifier: Apache-2.0 + +zephyr_sources_ifdef(CONFIG_ARM_MMU mmu_regions.c) + +set(SOC_LINKER_SCRIPT ${ZEPHYR_BASE}/include/zephyr/arch/arm64/scripts/linker.ld CACHE INTERNAL "") diff --git a/soc/rockchip/rk35/rk3588s/Kconfig b/soc/rockchip/rk35/rk3588s/Kconfig new file mode 100644 index 000000000000..edd700a9a9e4 --- /dev/null +++ b/soc/rockchip/rk35/rk3588s/Kconfig @@ -0,0 +1,10 @@ +# Copyright 2024 Université Gustave Eiffel +# SPDX-License-Identifier: Apache-2.0 + +config SOC_RK3588S + select ARM64 + select CPU_CORTEX_A55 + select ARM_ARCH_TIMER if SYS_CLOCK_EXISTS + +config SOC_PART_NUMBER + default "RK3588S" if SOC_RK3588S diff --git a/soc/rockchip/rk35/rk3588s/Kconfig.defconfig b/soc/rockchip/rk35/rk3588s/Kconfig.defconfig new file mode 100644 index 000000000000..f056f362aac1 --- /dev/null +++ b/soc/rockchip/rk35/rk3588s/Kconfig.defconfig @@ -0,0 +1,8 @@ +# Copyright 2024 Université Gustave Eiffel +# SPDX-License-Identifier: Apache-2.0 + +if SOC_RK3588S + +rsource "Kconfig.defconfig.rk3588s" + +endif # SOC_RK3588S diff --git a/soc/rockchip/rk35/rk3588s/Kconfig.defconfig.rk3588s b/soc/rockchip/rk35/rk3588s/Kconfig.defconfig.rk3588s new file mode 100644 index 000000000000..fe40d7884687 --- /dev/null +++ b/soc/rockchip/rk35/rk3588s/Kconfig.defconfig.rk3588s @@ -0,0 +1,19 @@ +# Copyright 2024 Université Gustave Eiffel +# SPDX-License-Identifier: Apache-2.0 + +if SOC_RK3588S + +config NUM_IRQS + default 544 + +config FLASH_SIZE + default 0 + +config FLASH_BASE_ADDRESS + default 0 + +config UART_NS16550_ACCESS_WORD_ONLY + default y + depends on UART_NS16550 + +endif diff --git a/soc/rockchip/rk35/rk3588s/Kconfig.soc b/soc/rockchip/rk35/rk3588s/Kconfig.soc new file mode 100644 index 000000000000..3dcf0bc6e814 --- /dev/null +++ b/soc/rockchip/rk35/rk3588s/Kconfig.soc @@ -0,0 +1,9 @@ +# Copyright 2024 Université Gustave Eiffel +# SPDX-License-Identifier: Apache-2.0 + +config SOC_RK3588S + bool + select SOC_SERIES_RK35 + +config SOC + default "rk3588s" if SOC_RK3588S diff --git a/soc/rockchip/rk35/rk3588s/mmu_regions.c b/soc/rockchip/rk35/rk3588s/mmu_regions.c new file mode 100644 index 000000000000..f33dce56c639 --- /dev/null +++ b/soc/rockchip/rk35/rk3588s/mmu_regions.c @@ -0,0 +1,26 @@ +/* + * Copyright 2024 Université Gustave Eiffel + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +static const struct arm_mmu_region mmu_regions[] = { + + MMU_REGION_FLAT_ENTRY("GIC", + DT_REG_ADDR_BY_IDX(DT_INST(0, arm_gic), 0), + DT_REG_SIZE_BY_IDX(DT_INST(0, arm_gic), 0), + MT_DEVICE_nGnRnE | MT_P_RW_U_NA | MT_DEFAULT_SECURE_STATE), + + MMU_REGION_FLAT_ENTRY("GIC", + DT_REG_ADDR_BY_IDX(DT_INST(0, arm_gic), 1), + DT_REG_SIZE_BY_IDX(DT_INST(0, arm_gic), 1), + MT_DEVICE_nGnRnE | MT_P_RW_U_NA | MT_DEFAULT_SECURE_STATE), +}; + +const struct arm_mmu_config mmu_config = { + .num_regions = ARRAY_SIZE(mmu_regions), + .mmu_regions = mmu_regions, +}; diff --git a/soc/rockchip/soc.yml b/soc/rockchip/soc.yml index 1c13067004a4..777bd05a9d3c 100644 --- a/soc/rockchip/soc.yml +++ b/soc/rockchip/soc.yml @@ -6,4 +6,5 @@ family: - name: rk3399 - name: rk35 socs: + - name: rk3588s - name: rk3568