| /* SPDX-License-Identifier: GPL-2.0+ */ |
| /* |
| * Common header file for Chromium OS |
| * |
| * Copyright 2018 Google LLC |
| */ |
| |
| #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 |
| |
| /* |
| * 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 |
| |
| /* |
| * 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 DIRECT_BOOTARGS |
| #define DIRECT_BOOTARGS |
| #endif |
| |
| /* Not currently used */ |
| #define EXTRA_BOOTARGS |
| |
| /******************************************************************************* |
| * 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 REGEN_ALL_SETTINGS \ |
| "common_bootargs=cros_legacy " DIRECT_BOOTARGS "\0" \ |
| \ |
| "dev_extras=\0" \ |
| "extra_bootargs=" 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 EXT2_BOOT_HELPER_SETTINGS \ |
| "rootpart=5\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; " \ |
| "setenv rootpart 5; "\ |
| "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 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. |
| */ |
| #undef CHROMEOS_EXTRA_ENV_SETTINGS |
| |
| #define CHROMEOS_EXTRA_ENV_SETTINGS \ |
| REGEN_ALL_SETTINGS \ |
| EXT2_BOOT_HELPER_SETTINGS \ |
| 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" |
| |
| #define NON_VERIFIED_BOOTCOMMAND "run nvboot" |
| |
| #endif /* __configs_chromeos_h__ */ |