chromebook_coral.rst 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. .. SPDX-License-Identifier: GPL-2.0+
  2. .. sectionauthor:: Simon Glass <sjg@chromium.org>
  3. Chromebook Coral
  4. ================
  5. Coral is a Chromebook (or really about 20 different Chromebooks) which use the
  6. Intel Apollo Lake platform (APL). The 'reef' Chromebooks use the same APL SoC so
  7. should also work. Some later ones based on Glacier Lake (GLK) need various
  8. changes in GPIOs, etc. but are very similar.
  9. It is hoped that this port can enable ports to embedded APL boards which are
  10. starting to appear.
  11. Note that booting U-Boot on APL is already supported by coreboot and
  12. Slim Bootloader. This documentation refers to a 'bare metal' port.
  13. Building
  14. --------
  15. First, you need the following binary blobs:
  16. * descriptor.bin - Intel flash descriptor
  17. * fitimage.bin - Base flash image structure
  18. * fsp_m.bin - FSP-M, for setting up SDRAM
  19. * fsp_s.bin - FSP-S, for setting up Silicon
  20. * vbt.bin - for setting up display
  21. These binaries do not seem to be available publicly. If you have a ROM image,
  22. such as santa.bin then you can do this::
  23. cbfstool santa.bin extract -n fspm.bin -f fsp-m.bin
  24. cbfstool santa.bin extract -n fsps.bin -f fsp-s.bin
  25. cbfstool santa.bin extract -n vbt-santa.bin -f vbt.bin
  26. mkdir tmp
  27. cd tmp
  28. dump_fmap -x ../santa.bin
  29. mv SI_DESC ../descriptor.bin
  30. mv IFWI ../fitimage.bin
  31. Put all of these files in `board/google/chromebook_coral` so they can be found
  32. by the build.
  33. To build::
  34. make O=/tmp/b/chromebook_coral chromebook_coral_defconfig
  35. make O=/tmp/b/chromebook_coral -s -j30 all
  36. That should produce `/tmp/b/chrombook_coral/u-boot.rom` which you can use with
  37. a Dediprog em100::
  38. em100 -s -c w25q128fw -d /tmp/b/chromebook_coral/u-boot.rom -r
  39. or you can use flashrom to write it to the board. If you do that, make sure you
  40. have a way to restore the old ROM without booting the board. Otherwise you may
  41. brick it. Having said that, you may find these instructions useful if you want
  42. to unbrick your device:
  43. https://chromium.googlesource.com/chromiumos/platform/ec/+/cr50_stab/docs/case_closed_debugging.md
  44. You can buy Suzy-Q from Sparkfun:
  45. https://chromium.googlesource.com/chromiumos/third_party/hdctools/+/main/docs/ccd.md#suzyq-suzyqable
  46. Note that it will hang at the SPL prompt for 21 seconds. When booting into
  47. Chrome OS it will always select developer mode, so will wipe anything you have
  48. on the device if you let it proceed. You have two seconds in U-Boot to stop the
  49. auto-boot prompt and several seconds at the 'developer wipe' screen to stop it
  50. wiping the disk.
  51. Here is the console output::
  52. U-Boot TPL 2021.04-rc1-00128-g344eefcdfec-dirty (Feb 11 2021 - 20:13:08 -0700)
  53. Trying to boot from Mapped SPI
  54. U-Boot SPL 2021.04-rc1-00128-g344eefcdfec-dirty (Feb 11 2021 - 20:13:08 -0700)
  55. Trying to boot from Mapped SPI
  56. U-Boot 2021.04-rc1-00128-g344eefcdfec-dirty (Feb 11 2021 - 20:13:08 -0700)
  57. CPU: Intel(R) Celeron(R) CPU N3450 @ 1.10GHz
  58. DRAM: 3.9 GiB
  59. MMC: sdmmc@1b,0: 1, emmc@1c,0: 2
  60. Video: 1024x768x32 @ b0000000
  61. Model: Google Coral
  62. Net: No ethernet found.
  63. SF: Detected w25q128fw with page size 256 Bytes, erase size 4 KiB, total 16 MiB
  64. Hit any key to stop autoboot: 0
  65. cmdline=console= loglevel=7 init=/sbin/init cros_secure oops=panic panic=-1 root=PARTUUID=${uuid}/PARTNROFF=1 rootwait rw dm_verity.error_behavior=3 dm_verity.max_bios=-1 dm_verity.dev_wait=0 dm="1 vroot none rw 1,0 3788800 verity payload=ROOT_DEV hashtree=HASH_DEV hashstart=3788800 alg=sha1 root_hexdigest=55052b629d3ac889f25a9583ea12cdcd3ea15ff8 salt=a2d4d9e574069f4fed5e3961b99054b7a4905414b60a25d89974a7334021165c" noinitrd vt.global_cursor_default=0 kern_guid=${uuid} add_efi_memmap noresume i915.modeset=1 Kernel command line: "console= loglevel=7 init=/sbin/init cros_secure oops=panic panic=-1 root=PARTUUID=35c775e7-3735-d745-93e5-d9e0238f7ed0/PARTNROFF=1 rootwait rw dm_verity.error_behavior=3 dm_verity.max_bios=-1 dm_verity.dev_wait=0 dm="1 vroot none rw 1,0 3788800 verity payload=ROOT_DEV hashtree=HASH_DEV hashstart=3788800 alg=sha1 root_hexdigest=55052b629d3ac889f25a9583ea12cdcd3ea15ff8 salt=a2d4d9e574069f4fed5e3961b99054b7a4905414b60a25d89974a7334021165c" noinitrd vt.global_
  66. Setup located at 00090000:
  67. ACPI RSDP addr : 7991f000
  68. E820: 14 entries
  69. Addr Size Type
  70. d0000000 1000000 <NULL>
  71. 0 a0000 RAM
  72. a0000 60000 Reserved
  73. 7b000000 800000 Reserved
  74. 7b800000 4800000 Reserved
  75. 7ac00000 400000 Reserved
  76. 100000 ff00000 RAM
  77. 10000000 2151000 Reserved
  78. 12151000 68aaf000 RAM
  79. 100000000 80000000 RAM
  80. e0000000 10000000 Reserved
  81. 7991bfd0 12e4030 Reserved
  82. d0000000 10000000 Reserved
  83. fed10000 8000 Reserved
  84. Setup sectors : 1e
  85. Root flags : 1
  86. Sys size : 63420
  87. RAM size : 0
  88. Video mode : ffff
  89. Root dev : 0
  90. Boot flag : 0
  91. Jump : 66eb
  92. Header : 53726448
  93. Kernel V2
  94. Version : 20d
  95. Real mode switch : 0
  96. Start sys : 1000
  97. Kernel version : 38cc
  98. @00003acc:
  99. Type of loader : 80
  100. U-Boot, version 0
  101. Load flags : 81
  102. : loaded-high can-use-heap
  103. Setup move size : 8000
  104. Code32 start : 100000
  105. Ramdisk image : 0
  106. Ramdisk size : 0
  107. Bootsect kludge : 0
  108. Heap end ptr : 8e00
  109. Ext loader ver : 0
  110. Ext loader type : 0
  111. Command line ptr : 99000
  112. console= loglevel=7 init=/sbin/init cros_secure oops=panic panic=-1 root=PARTUUID=35c775e7-3735-d745-93e5-d9e0238f7ed0/PARTNROFF=1 rootwait rw dm_verity.error_behavior=3 dm_verity.max_bios=-1 dm_verity.dev_wait=0 dm="1 vroot none rw 1,0 3788800 verity payload=ROOT_DEV hashtree=HASH_DEV hashstart=3788800 alg=sha1 root_hexdigest=55052b629d3ac889f25a9583ea12cdcd3ea15ff8 salt=a2d4d9e574069f4fed5e3961b99054b7a4905414b60a25d89974a7334021165c" noinitrd vt.global_cursor_default=0 kern_guid=35c775e7-3735-d745-93e5-d9e0238f7ed0 add_efi_memmap noresume i915.modeset=1 tpm_tis.force=1 tpm_tis.interrupts=0 nmi_watchdog=panic,lapic disablevmx=off
  113. Initrd addr max : 7fffffff
  114. Kernel alignment : 200000
  115. Relocatable kernel : 1
  116. Min alignment : 15
  117. : 200000
  118. Xload flags : 3
  119. : 64-bit-entry can-load-above-4gb
  120. Cmdline size : 7ff
  121. Hardware subarch : 0
  122. HW subarch data : 0
  123. Payload offset : 26e
  124. Payload length : 612045
  125. Setup data : 0
  126. Pref address : 1000000
  127. Init size : 1383000
  128. Handover offset : 0
  129. Starting kernel ...
  130. Timer summary in microseconds (17 records):
  131. Mark Elapsed Stage
  132. 0 0 reset
  133. 155,279 155,279 TPL
  134. 237,088 81,809 end phase
  135. 237,533 445 SPL
  136. 816,456 578,923 end phase
  137. 817,357 901 board_init_f
  138. 1,061,751 244,394 board_init_r
  139. 1,402,435 340,684 id=64
  140. 1,430,071 27,636 main_loop
  141. 5,532,057 4,101,986 start_kernel
  142. Accumulated time:
  143. 685 dm_r
  144. 2,817 fast_spi
  145. 33,095 dm_spl
  146. 52,468 dm_f
  147. 208,242 fsp-m
  148. 242,221 fsp-s
  149. 332,710 mmap_spi
  150. Boot flow - TPL
  151. ---------------
  152. Apollo Lake boots via an IFWI (Integrated Firmware Image). TPL is placed in
  153. this, in the IBBL entry.
  154. On boot, an on-chip microcontroller called the CSE (Converged Security Engine)
  155. sets up some SDRAM at ffff8000 and loads the TPL image to that address. The
  156. SRAM extends up to the top of 32-bit address space, but the last 2KB is the
  157. start16 region, so the TPL image must be 30KB at most, and CONFIG_TPL_TEXT_BASE
  158. must be ffff8000. Actually the start16 region is small and it could probably
  159. move from f800 to fe00, providing another 1.5KB, but TPL is only about 19KB so
  160. there is no need to change it at present. The size limit is enforced by
  161. CONFIG_TPL_SIZE_LIMIT to avoid producing images that won't boot.
  162. TPL (running from start.S) first sets up CAR (Cache-as-RAM) which provides
  163. larger area of RAM for use while booting. CAR is mapped at CONFIG_SYS_CAR_ADDR
  164. (fef00000) and is 768KB in size. It then sets up the stack in the botttom 64KB
  165. of this space (i.e. below fef10000). This means that the stack and early
  166. malloc() region in TPL can be 64KB at most.
  167. TPL operates without CONFIG_TPL_PCI enabled so PCI config access must use the
  168. x86-specific functions pci_x86_write_config(), etc. SPL creates a simple-bus
  169. device so that PCI devices are bound by driver model. Then arch_cpu_init_tpl()
  170. is called to early init on various devices. This includes placing PCI devices
  171. at hard-coded addresses in the memory map. PCI auto-config is not used.
  172. Most of the 16KB ROM is mapped into the very top of memory, except for the
  173. Intel descriptor (first 4KB) and the space for SRAM as above.
  174. TPL does not set up a bloblist since at present it does not have anything to
  175. pass to SPL.
  176. Once TPL is done it loads SPL from ROM using either the memory-mapped SPI or by
  177. using the Intel fast SPI driver. SPL is loaded into CAR, at the address given
  178. by CONFIG_SPL_TEXT_BASE, which is normally fef10000.
  179. Note that booting using the SPI driver results in an TPL image that is about
  180. 26KB in size instead of 19KB. Also boot speed is worse by about 340ms. If you
  181. really want to use the driver, enable CONFIG_APL_SPI_FLASH_BOOT and set
  182. BOOT_FROM_FAST_SPI_FLASH to true[2].
  183. Boot flow - SPL
  184. ---------------
  185. SPL (running from start_from_tpl.S) continues to use the same stack as TPL.
  186. It calls arch_cpu_init_spl() to set up a few devices, then init_dram() loads
  187. the FSP-M binary into CAR and runs to, to set up SDRAM. The address of the
  188. output 'HOB' list (Hand-off-block) is stored into gd->arch.hob_list for parsing.
  189. There is a 2GB chunk of SDRAM starting at 0 and the rest is at 4GB.
  190. PCI auto-config is not used in SPL either, but CONFIG_SPL_PCI is defined, so
  191. proper PCI access is available and normal dm_pci_read_config() calls can be
  192. used. However PCI auto-config is not used so the same static memory mapping set
  193. up by TPL is still active.
  194. SPL on x86 always runs with CONFIG_SPL_SEPARATE_BSS=y and BSS is at 120000
  195. (see u-boot-spl.lds). This works because SPL doesn't access BSS until after
  196. board_init_r(), as per the rules, and DRAM is available then.
  197. SPL sets up a bloblist and passes the SPL hand-off information to U-Boot proper.
  198. This includes a pointer to the HOB list as well as DRAM information. See
  199. struct arch_spl_handoff. The bloblist address is set by CONFIG_BLOBLIST_ADDR,
  200. normally 100000.
  201. SPL uses SPI flash to update the MRC caches in ROM. This speeds up subsequent
  202. boots. Be warned that SPL can take 30 seconds without this cache! This is a
  203. known issue with Intel SoCs with modern DRAM and apparently cannot be improved.
  204. The MRC caches are used to work around this.
  205. Once SPL is finished it loads U-Boot into SDRAM at CONFIG_TEXT_BASE, which
  206. is normally 1110000. Note that CAR is still active.
  207. Boot flow - U-Boot pre-relocation
  208. ---------------------------------
  209. U-Boot (running from start_from_spl.S) starts running in RAM and uses the same
  210. stack as SPL. It does various init activities before relocation. Notably
  211. fsp_setup_pinctrl() sets up the pin muxing for the chip using a very large table
  212. in the device tree.
  213. PCI auto-config is not used before relocation, but CONFIG_PCI of course is
  214. defined, so proper PCI access is available. The same static memory mapping set
  215. up by TPL is still active until relocation.
  216. As per usual, U-Boot allocates memory at the top of available RAM (a bit below
  217. 2GB in this case) and copies things there ready to relocate itself. Notably
  218. reserve_arch() does not reserve space for the HOB list returned by FSP-M since
  219. this is already located in RAM.
  220. U-Boot then shuts down CAR and jumps to its relocated version.
  221. Boot flow - U-Boot post-relocation
  222. ----------------------------------
  223. U-Boot starts up normally, running near the top of RAM. After driver model is
  224. running, arch_fsp_init_r() is called which loads and runs the FSP-S binary.
  225. This updates the HOB list to include graphics information, used by the fsp_video
  226. driver.
  227. PCI autoconfig is done and a few devices are probed to complete init. Most
  228. others are started only when they are used.
  229. Note that FSP-S is supposed to run after CAR has been shut down, which happens
  230. immediately before U-Boot starts up in its relocated position. Therefore we
  231. cannot run FSP-S before relocation. On the other hand we must run it before
  232. PCI auto-config is done, since FSP-S may show or hide devices. The first device
  233. that probes PCI after relocation is the serial port, in initr_serial(), so FSP-S
  234. must run before that. A corollary is that loading FSP-S must be done without
  235. using the SPI driver, to avoid probing PCI and causing an autoconfig, so
  236. memory-mapped reading is always used for FSP-S.
  237. It would be possible to tear down CAR in SPL instead of U-Boot. The SPL handoff
  238. information could make sure it does not include any pointers into CAR (in fact
  239. it doesn't). But tearing down CAR in U-Boot allows the initial state used by TPL
  240. and SPL to be read by U-Boot, which seems useful. It also matches how older
  241. platforms start up (those that don't use SPL).
  242. Performance
  243. -----------
  244. Bootstage is used through all phases of U-Boot to keep accurate timimgs for
  245. boot. Use 'bootstage report' in U-Boot to see the report, e.g.::
  246. Timer summary in microseconds (16 records):
  247. Mark Elapsed Stage
  248. 0 0 reset
  249. 155,325 155,325 TPL
  250. 204,014 48,689 end TPL
  251. 204,385 371 SPL
  252. 738,633 534,248 end SPL
  253. 739,161 528 board_init_f
  254. 842,764 103,603 board_init_r
  255. 1,166,233 323,469 main_loop
  256. 1,166,283 50 id=175
  257. Accumulated time:
  258. 62 fast_spi
  259. 202 dm_r
  260. 7,779 dm_spl
  261. 15,555 dm_f
  262. 208,357 fsp-m
  263. 239,847 fsp-s
  264. 292,143 mmap_spi
  265. CPU performance is about 3500 DMIPS::
  266. => dhry
  267. 1000000 iterations in 161 ms: 6211180/s, 3535 DMIPS
  268. Partial memory map
  269. ------------------
  270. ::
  271. ffffffff Top of ROM (and last byte of 32-bit address space)
  272. ffff8000 TPL loaded here (from IFWI)
  273. ff000000 Bottom of ROM
  274. fefc0000 Top of CAR region
  275. fef96000 Stack for FSP-M
  276. fef40000 59000 FSP-M (also VPL loads here)
  277. fef11000 SPL loaded here
  278. fef10000 CONFIG_BLOBLIST_ADDR
  279. fef10000 Stack top in TPL, SPL and U-Boot before relocation
  280. fef00000 1000 CONFIG_BOOTSTAGE_STASH_ADDR
  281. fef00000 Base of CAR region
  282. 30000 AP_DEFAULT_BASE (used to start up additional CPUs)
  283. f0000 CONFIG_ROM_TABLE_ADDR
  284. 120000 BSS (defined in u-boot-spl.lds)
  285. 200000 FSP-S (which is run after U-Boot is relocated)
  286. 1110000 CONFIG_TEXT_BASE
  287. Speeding up SPL for development
  288. -------------------------------
  289. The 21-second wait for memory training is annoying during development, since
  290. every new image incurs this cost when booting. There is no cache to fall back on
  291. since that area of the image is empty on start-up.
  292. You can add suitable cache contents to the image to fix this, for development
  293. purposes only, like this::
  294. # Read the image back after booting through SPL
  295. em100 -s -c w25q128fw -u image.bin
  296. # Extract the two cache regions
  297. binman extract -i image.bin extra *cache
  298. # Move them into the source directory
  299. mv *cache board/google/chromebook_coral
  300. Then add something like this to the devicetree::
  301. #if IS_ENABLED(CONFIG_HAVE_MRC) || IS_ENABLED(CONFIG_FSP_VERSION2)
  302. /* Provide initial contents of the MRC data for faster development */
  303. rw-mrc-cache {
  304. type = "blob";
  305. /* Mirror the offset in spi-flash@0 */
  306. offset = <0xff8e0000>;
  307. size = <0x10000>;
  308. filename = "board/google/chromebook_coral/rw-mrc-cache";
  309. };
  310. rw-var-mrc-cache {
  311. type = "blob";
  312. size = <0x1000>;
  313. filename = "board/google/chromebook_coral/rw-var-mrc-cache";
  314. };
  315. #endif
  316. This tells binman to put the cache contents in the same place as the
  317. `rw-mrc-cache` and `rw-var-mrc-cache` regions defined by the SPI-flash driver.
  318. Supported peripherals
  319. ---------------------
  320. The following have U-Boot drivers:
  321. - UART
  322. - SPI flash
  323. - Video
  324. - MMC (dev 0) and micro-SD (dev 1)
  325. - Chrome OS EC
  326. - Cr50 (security chip)
  327. - Keyboard
  328. - USB
  329. To do
  330. -----
  331. - Finish peripherals
  332. - Sound (Intel I2S support exists, but need da7219 driver)
  333. - Use FSP-T binary instead of our own CAR implementation
  334. - Use the official FSP package instead of the coreboot one
  335. - Suspend / resume
  336. - Fix MMC which seems to try to read even though the card is empty
  337. - Fix USB3 crash "WARN halted endpoint, queueing URB anyway."
  338. Credits
  339. -------
  340. This is a spare-time project conducted slowly over a long period of time.
  341. Much of the code for this port came from Coreboot, an open-source firmware
  342. project similar to U-Boot's SPL in terms of features.
  343. Also see [2] for information about the boot flow used by coreboot. It is
  344. similar, but has an extra postcar stage. U-Boot doesn't need this since it
  345. supports relocating itself in memory.
  346. [2] Intel PDF https://www.coreboot.org/images/2/23/Apollolake_SoC.pdf