[U-Boot] [PATCH 18/20] Add Chrome OS config header

Simon Glass
2015-02-17T22:29:52Z

From: Doug Anderson <dianders@chromium.org>

This header includes useful scripts which can be used with any board that
can boot Chrome OS.

In particular, 'run nvboot' will boot a board without verified boot enabled.

Signed-off-by: Doug Anderson <dianders@chromium.org>
Signed-off-by: Simon Glass <sjg@chromium.org>
---

include/configs/chromeos.h | 464 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 464 insertions(+)
create mode 100644 include/configs/chromeos.h

diff --git a/include/configs/chromeos.h b/include/configs/chromeos.h
new file mode 100644
index 0000000..554ffba
--- /dev/null
+++ b/include/configs/chromeos.h
@@ -0,0 +1,464 @@
+/*
+ * Copyright (c) 2015 Google, Inc
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#ifndef __configs_chromeos_h__
+#define __configs_chromeos_h__
+
+/*
+ * In anticipation of implementing early firmware selection, these defines
+ * signal the features that are required in U-Boot.
+ *
+ * The defines munging is thus kept to one Chrome OS-specific file. The
+ * upstream boards will define all features as normal for their platform.
+ *
+ * It is possible that these will be too broad for some platforms - e.g. we
+ * may have a platform which wants to use MMC in CONFIG_CROS_RO. However,
+ * we can deal with additional needs as we come to them.
+ *
+ * While it is something of an inconvenience, it may improve boot time on
+ * some platforms also.
+ *
+ * CONFIG_CROS_LARGE
+ * - Full version as now with factory defined, all features enabled
+ * - This will operate as factory build, or verified boot
+ *
+ * CONFIG_CROS_SMALL
+ * - Minimized for use only with verified boot
+ * - No command line, filesystems, LCD console, etc.
+ * - Still has all drivers enabled and can perform verified boot
+ *
+ * CONFIG_CROS_RO
+ * - Requires CONFIG_CROS_SMALL. Will only support running RO firmware
+ * - Set up for running VbLoadFirmware() only
+ * - Minimal RAM, no display, no USB, no mass storage (SPI flash only)
+ * - Intended for running in SPL
+ *
+ * CONFIG_CROS_RW
+ * - Requires CONFIG_CROS_SMALL. Will only support running RW firmware
+ * - Set up for running VbSelectAndLoadKernel() only
+ */
+
+/*
+ * This config file defines platform-independent settings that a verified boot
+ * firmware must have.
+ */
+
+/* Stringify a token */
+#ifndef STRINGIFY
+#define _STRINGIFY(x) #x
+#define STRINGIFY(x) _STRINGIFY(x)
+#endif
+
+#define CONFIG_CROS_FULL
+
+/* Enable verified boot */
+#define CONFIG_CHROMEOS
+
+/* Enable test codes */
+#ifdef CONFIG_CROS_FULL
+#define CONFIG_CHROMEOS_TEST
+#endif /* VBOOT_DEBUG */
+
+/* Support constant vboot flag from fdt */
+#define CONFIG_CHROMEOS_CONST_FLAG
+
+/* Enable vboot twostop with SPI flash */
+#define CONFIG_CHROMEOS_SPI
+
+#define CONFIG_VBOOT_REGION_READ
+
+#ifndef CONFIG_CROS_RO
+#define CONFIG_CHROMEOS_DISPLAY
+
+/* Enable legacy vboot_twostop - crosbug.com/p/21810 */
+#define CONFIG_CROS_LEGACY_VBOOT
+#endif
+
+#ifndef CONFIG_CROS_FULL
+#undef CONFIG_CMDLINE
+#undef CONFIG_SYS_LONGHELP
+#undef CONFIG_SYS_CONSOLE_IS_IN_ENV
+#undef CONFIG_SYS_STDIO_DEREGISTER
+#undef CONFIG_SYS_HUSH_PARSER
+#undef CONFIG_CBMEM_CONSOLE
+#undef CONFIG_CMDLINE_EDITING
+#undef CONFIG_COMMAND_HISTORY
+#undef CONFIG_AUTOCOMPLETE
+#undef CONFIG_CONSOLE_MUX
+#undef CONFIG_SHOW_BOOT_PROGRESS
+
+#undef CONFIG_I8042_KBD
+#define CONFIG_VGA_AS_SINGLE_DEVICE
+#undef CONFIG_VIDEO_SW_CURSOR
+
+#undef CONFIG_SUPPORT_VFAT
+#undef CONFIG_ATAPI
+#undef CONFIG_EFI_PARTITION
+#undef CONFIG_DOS_PARTITION
+#undef CONFIG_MAC_PARTITION
+#undef CONFIG_ISO_PARTITION
+#undef CONFIG_PARTITION_UUIDS
+
+#undef CONFIG_CMD_PART
+#undef CONFIG_CMD_CBFS
+#undef CONFIG_CMD_EXT4
+#undef CONFIG_CMD_EXT4_WRITE
+#undef CONFIG_CMD_NET
+#undef CONFIG_CMD_CRC32
+#undef CONFIG_CMD_CROS_EC
+
+#undef CONFIG_USB_HOST_ETHER
+#undef CONFIG_USB_ETHER_ASIX
+#undef CONFIG_USB_ETHER_SMSC95XX
+
+#undef CONFIG_GENERIC_MMC
+#undef CONFIG_MMC
+
+#define DYNAMIC_CRC_TABLE
+#undef CONFIG_BOOTDELAY
+
+#endif
+
+/* Enable graphics display */
+#ifdef CONFIG_CHROMEOS_DISPLAY
+#define CONFIG_LCD_BMP_RLE8
+#define CONFIG_LZMA
+#define CONFIG_VIDEO_NO_TEXT
+#else
+#undef CONFIG_LCD
+#undef CONFIG_EXYNOS_FB
+#undef CONFIG_EXYNOS_DP
+#undef CONFIG_VIDEO_ANALOGIX
+#undef CONFIG_VIDEO_PARADE
+#undef CONFIG_CMD_BMP
+#endif
+
+#ifdef CONFIG_CROS_RO
+#undef CONFIG_USB_EHCI
+#undef CONFIG_USB_EHCI_PCI
+#undef CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS
+#undef CONFIG_USB_MAX_CONTROLLER_COUNT
+#undef CONFIG_USB_STORAGE
+#undef CONFIG_USB_KEYBOARD
+#undef CONFIG_SYS_USB_EVENT_POLL
+
+#undef CONFIG_CMD_USB
+#undef CONFIG_CMD_SOUND
+#undef CONFIG_SOUND_INTEL_HDA
+#undef CONFIG_CRC32_VERIFY
+#undef CONFIG_TPM
+#undef CONFIG_FIT
+#define CONFIG_CRC32
+#undef CONFIG_LZO
+
+/* Limited memory so use a smaller recorded console */
+#undef CONFIG_RECORDED_CONSOLE_SIZE
+#define CONFIG_RECORDED_CONSOLE_SIZE 3000
+
+#else
+/* USB is used in recovery mode */
+#define CONFIG_CHROMEOS_USB
+#endif
+
+/*
+ * Enable this feature to embed crossystem data into device tree before booting
+ * the kernel. We add quite a few things to the FDT, including a 16KB binary
+ * blob.
+ * #define CONFIG_OF_BOARD_SETUP
+ */
+#define CONFIG_SYS_FDT_PAD 0x8000
+
+/* Make sure that the safe version of printf() is compiled in. */
+#define CONFIG_SYS_VSNPRINTF
+
+/*
+ * This is the default kernel command line to a Chrome OS kernel. An ending
+ * space character helps us concatenate more arguments.
+ */
+#ifndef CONFIG_BOOTARGS
+#define CONFIG_BOOTARGS
+#endif
+#define CHROMEOS_BOOTARGS "cros_secure " CONFIG_BOOTARGS " "
+
+#ifndef CONFIG_DIRECT_BOOTARGS
+#define CONFIG_DIRECT_BOOTARGS
+#endif
+#ifndef CONFIG_EXTRA_BOOTARGS
+#define CONFIG_EXTRA_BOOTARGS
+#endif
+
+/*******************************************************************************
+ * Non-verified boot script *
+ ******************************************************************************/
+
+/*
+ * Defines the regen_all variable, which is used by other commands
+ * defined in this file. Usage is to override one or more of the environment
+ * variables and then run regen_all to regenerate the environment.
+ *
+ * Args from other scipts in this file:
+ * bootdev_bootargs: Filled in by other commands below based on the boot
+ * device.
+ *
+ * Args:
+ * common_bootargs: A copy of the default bootargs so we can run regen_all
+ * more than once.
+ * dev_extras: Placeholder space for developers to put their own boot args.
+ * extra_bootargs: Filled in by update_firmware_vars.py script in some cases.
+ */
+#define CONFIG_REGEN_ALL_SETTINGS \
+ "common_bootargs=cros_legacy " CONFIG_DIRECT_BOOTARGS "\0" \
+ \
+ "dev_extras=\0" \
+ "extra_bootargs=" \
+ CONFIG_EXTRA_BOOTARGS "\0" \
+ "bootdev_bootargs=\0" \
+ \
+ "regen_all=" \
+ "setenv bootargs " \
+ "${common_bootargs} " \
+ "${dev_extras} " \
+ "${extra_bootargs} " \
+ "${bootdev_bootargs}\0"
+
+/*
+ * Defines ext2_boot and run_disk_boot_script.
+ *
+ * The run_disk_boot_script runs a u-boot script on the boot disk. At the
+ * moment this is used to allow the boot disk to choose a partion to boot from,
+ * but could theoretically be used for more complicated things.
+ *
+ * The ext2_boot script boots from an ext2 device.
+ *
+ * Args from other scipts in this file:
+ * devtype: The device type we're booting from, like "usb" or "mmc"
+ * devnum: The device number (depends on devtype). If we're booting from
+ * extranal MMC (for instance), this would be 1
+ * devname: The linux device name that will be assigned, like "sda" or
+ * mmcblk0p
+ *
+ * Args expected to be set by the u-boot script in /u-boot/boot.scr.uimg:
+ * rootpart: The root filesystem partion; we default to 3 in case there are
+ * problems reading the boot script.
+ * cros_bootfile: The name of the kernel in the root partition; we default to
+ * "/boot/vmlinux.uimg"
+ *
+ * Other args:
+ * script_part: The FAT partion we'll look for a boot script in.
+ * script_img: The name of the u-boot script.
+ *
+ * When we boot from an ext2 device, we will look at partion 12 (0x0c) to find
+ * a u-boot script (as /u-boot/boot.scr.uimg). That script is expected to
+ * override "rootpart" and "cros_bootfile" as needed to select which partition
+ * to boot from.
+ *
+ * USB download support:
+ *
+ * Once we have loaded the kernel from the selected device successfully,
+ * we check whether a kernel has in fact been provided through the USB
+ * download feature. In that case the kernaddr environment variable will
+ * be set. It might seem strange that we load the original kernel and
+ * then ignore it, but we try to load the kernel from a number of different
+ * places. If the USB disk fails (because there is no disk inserted or
+ * it is invalid) we don't want to pull in the kernaddr kernel and boot it
+ * with USB as the root disk. So allow the normal boot failover to occur,
+ * and only insert the kernaddr kernel when we actually have decided
+ * what to boot from.
+ */
+#define CONFIG_EXT2_BOOT_HELPER_SETTINGS \
+ "rootpart=3\0" \
+ "cros_bootfile=/boot/vmlinux.uimg\0" \
+ \
+ "script_part=c\0" \
+ "script_img=/u-boot/boot.scr.uimg\0" \
+ \
+ "run_disk_boot_script=" \
+ "if fatload ${devtype} ${devnum}:${script_part} " \
+ "${loadaddr} ${script_img}; then " \
+ "source ${loadaddr}; " \
+ "echo done; " \
+ "fi\0" \
+ \
+ "regen_ext2_bootargs=" \
+ "setenv bootdev_bootargs root=${devname} rootwait ro; " \
+ "run regen_all\0" \
+ \
+ "ext2_boot=" \
+ "run regen_ext2_bootargs; " \
+ "if ext2load ${devtype} ${devnum}:${rootpart} " \
+ "${loadaddr} ${cros_bootfile}; then " \
+ "if test \"${kernaddr}\" != \"\"; then "\
+ "echo \"Using bundled kernel\"; "\
+ "bootm ${kernaddr};" \
+ "fi; "\
+ "bootm ${loadaddr};" \
+ "fi\0"
+
+/*
+ * Network-boot related settings.
+ *
+ * At the moment, we support:
+ * - initramfs factory install (tftp kernel with factory installer initramfs)
+ * - full network root booting (tftp kernel and initial ramdisk)
+ * - nfs booting (tftp kernel and point root to NFS)
+ *
+ * Network booting is enabled if you have an ethernet adapter plugged in at boot
+ * and also have set tftpserverip/nfsserverip to something other than 0.0.0.0.
+ * For full network booting or initramfs factory install you just need
+ * tftpserverip. To choose full network booting over initramfs factory intsall,
+ * you have to set has_initrd=1. For full NFS root you neet to set both
+ * tftpserverip and nfsserverip.
+ */
+#define CONFIG_NETBOOT_SETTINGS \
+ "tftpserverip=0.0.0.0\0" \
+ "nfsserverip=0.0.0.0\0" \
+ "has_initrd=0\0" \
+ \
+ "rootaddr=" STRINGIFY(CONFIG_INITRD_ADDRESS) "\0" \
+ "initrd_high=0xffffffff\0" \
+ \
+ "regen_nfsroot_bootargs=" \
+ "setenv bootdev_bootargs " \
+ "dev=/dev/nfs4 rw nfsroot=${nfsserverip}:${rootpath} " \
+ "ip=dhcp noinitrd; " \
+ "run regen_all\0" \
+ "regen_initrdroot_bootargs=" \
+ "setenv bootdev_bootargs " \
+ "rw root=/dev/ram0 ramdisk_size=512000 cros_netboot; " \
+ "run regen_all\0" \
+ "regen_initramfs_install_bootargs=" \
+ "setenv bootdev_bootargs " \
+ "lsm.module_locking=0 cros_netboot_ramfs " \
+ "cros_factory_install cros_secure; " \
+ "run regen_all\0" \
+ \
+ "tftp_setup=" \
+ "setenv tftpkernelpath " \
+ "/tftpboot/vmlinux.uimg; " \
+ "setenv tftprootpath " \
+ "/tftpboot/initrd.uimg; " \
+ "setenv rootpath " \
+ "/export/nfsroot; " \
+ "setenv autoload n\0" \
+ "initrdroot_boot=" \
+ "run tftp_setup; " \
+ "run regen_initrdroot_bootargs; " \
+ "bootp; " \
+ "if tftpboot ${rootaddr} ${tftpserverip}:${tftprootpath} && " \
+ " tftpboot ${loadaddr} ${tftpserverip}:${tftpkernelpath}; " \
+ "then " \
+ "bootm ${loadaddr} ${rootaddr}; " \
+ "else " \
+ "echo 'ERROR: Could not load root/kernel from TFTP'; " \
+ "exit; " \
+ "fi\0" \
+ "initramfs_boot=" \
+ "run tftp_setup; "\
+ "run regen_initramfs_install_bootargs; "\
+ "bootp; " \
+ "if tftpboot ${loadaddr} ${tftpserverip}:${tftpkernelpath}; " \
+ "then " \
+ "bootm ${loadaddr}; "\
+ "else " \
+ "echo 'ERROR: Could not load kernel from TFTP'; " \
+ "exit; " \
+ "fi\0" \
+ "tftp_ext2_boot=" \
+ "run tftp_setup; " \
+ "run regen_ext2_bootargs; " \
+ "bootp; " \
+ "if tftpboot ${loadaddr} ${tftpserverip}:${tftpkernelpath}; " \
+ "then " \
+ "bootm ${loadaddr}; " \
+ "else " \
+ "echo 'ERROR: Could not load kernel from TFTP'; " \
+ "exit; " \
+ "fi\0" \
+ "nfsroot_boot=" \
+ "run tftp_setup; " \
+ "run regen_nfsroot_bootargs; " \
+ "bootp; " \
+ "if tftpboot ${loadaddr} ${tftpserverip}:${tftpkernelpath}; " \
+ "then " \
+ "bootm ${loadaddr}; " \
+ "else " \
+ "echo 'ERROR: Could not load kernel from TFTP'; " \
+ "exit; " \
+ "fi\0" \
+ \
+ "net_boot=" \
+ "if test ${ethact} != \"\"; then " \
+ "if test ${tftpserverip} != \"0.0.0.0\"; then " \
+ "if test ${nfsserverip} != \"0.0.0.0\"; then " \
+ "run nfsroot_boot; " \
+ "fi; " \
+ "if test ${has_initrd} != \"0\"; then " \
+ "run initrdroot_boot; " \
+ "else " \
+ "run initramfs_boot; " \
+ "fi; " \
+ "fi; " \
+ "fi\0" \
+
+/*
+ * Our full set of extra enviornment variables.
+ *
+ * A few notes:
+ * - Right now, we can only boot from one USB device. Need to fix this once
+ * usb works better.
+ * - We define "non_verified_boot", which is the normal boot command unless
+ * it is overridden in the FDT.
+ * - When we're running securely, the FDT will specify to call vboot_twostop
+ * directly.
+ */
+
+#ifdef CONFIG_CROS_RO
+#define CONFIG_CHROMEOS_EXTRA_ENV_SETTINGS
+#else
+#define CONFIG_CHROMEOS_EXTRA_ENV_SETTINGS \
+ CONFIG_REGEN_ALL_SETTINGS \
+ CONFIG_EXT2_BOOT_HELPER_SETTINGS \
+ CONFIG_NETBOOT_SETTINGS \
+ \
+ "set_devname=" \
+ "part uuid ${devtype} ${devnum}:${rootpart} rootuuid; " \
+ "setenv devname PARTUUID=${rootuuid}\0" \
+ \
+ "usb_boot=setenv devtype usb; " \
+ "setenv devnum 0; " \
+ "run run_disk_boot_script;" \
+ "run set_devname; " \
+ "run ext2_boot\0" \
+ \
+ "mmc_setup=" \
+ "mmc dev ${devnum}; " \
+ "mmc rescan; " \
+ "setenv devtype mmc\0" \
+ "mmc_boot=" \
+ "run mmc_setup; " \
+ "run run_disk_boot_script;" \
+ "run set_devname; " \
+ "run ext2_boot\0" \
+ "mmc0_boot=setenv devnum 0; " \
+ "run mmc_boot\0" \
+ "mmc1_boot=setenv devnum 1; " \
+ "run mmc_boot\0" \
+ "mmc0_tftpboot=setenv devnum 0; " \
+ "run mmc_setup; " \
+ "run tftp_ext2_boot\0" \
+ \
+ "nvboot=" \
+ "usb start; " \
+ "run net_boot; " \
+ "run usb_boot; " \
+ \
+ "run mmc1_boot; " \
+ "run mmc0_boot\0"
+#endif
+
+#define CONFIG_NON_VERIFIED_BOOTCOMMAND "run nvboot"
+
+#endif /* __configs_chromeos_h__ */
--
2.2.0.rc0.207.ga3a616c