[1/1] board: Add support for nautilus chromebook
diff mbox series

Message ID 20191119213121.165863-1-swboyd@chromium.org
State Changes Requested
Headers show
Series
  • [1/1] board: Add support for nautilus chromebook
Related show

Commit Message

Stephen Boyd Nov. 19, 2019, 9:31 p.m. UTC
This adds support for the "Nautilus" chromebook, similar to how "Snow"
is supported. We drop the cgpt requirement in favor of using 'sgdisk'
and support a genimage config file instead of a custom partitioning
script. I also included a kernel configuration file based on a minimized
version pulled from a chromeos kernel running on the device.

Cc: Alex Suykov <alex.suykov@gmail.com>
Signed-off-by: Stephen Boyd <swboyd@chromium.org>
---
 board/chromebook/nautilus/config            | 635 ++++++++++++++++++++
 board/chromebook/nautilus/genimage.cfg      |  17 +
 board/chromebook/nautilus/kernel.args       |   1 +
 board/chromebook/nautilus/mark_boot_once.sh |  16 +
 board/chromebook/nautilus/readme.txt        |  83 +++
 board/chromebook/nautilus/sign.sh           |  31 +
 configs/chromebook_nautilus_defconfig       |  15 +
 7 files changed, 798 insertions(+)
 create mode 100644 board/chromebook/nautilus/config
 create mode 100644 board/chromebook/nautilus/genimage.cfg
 create mode 100644 board/chromebook/nautilus/kernel.args
 create mode 100755 board/chromebook/nautilus/mark_boot_once.sh
 create mode 100644 board/chromebook/nautilus/readme.txt
 create mode 100755 board/chromebook/nautilus/sign.sh
 create mode 100644 configs/chromebook_nautilus_defconfig

Comments

Thomas Petazzoni Nov. 20, 2019, 10:19 p.m. UTC | #1
Hello Stephen,

Nice to see you here ! :-)

On Tue, 19 Nov 2019 13:31:21 -0800
Stephen Boyd <swboyd@chromium.org> wrote:

> This adds support for the "Nautilus" chromebook, similar to how "Snow"
> is supported. We drop the cgpt requirement in favor of using 'sgdisk'
> and support a genimage config file instead of a custom partitioning
> script. I also included a kernel configuration file based on a minimized
> version pulled from a chromeos kernel running on the device.
> 
> Cc: Alex Suykov <alex.suykov@gmail.com>
> Signed-off-by: Stephen Boyd <swboyd@chromium.org>

Thanks for this submission. Overall it looks pretty good, there are
just a few minor details, see below.

First, the commit title should be:

	configs/chromebook_nautilus: new defconfig

>  board/chromebook/nautilus/config            | 635 ++++++++++++++++++++
>  board/chromebook/nautilus/genimage.cfg      |  17 +
>  board/chromebook/nautilus/kernel.args       |   1 +
>  board/chromebook/nautilus/mark_boot_once.sh |  16 +
>  board/chromebook/nautilus/readme.txt        |  83 +++
>  board/chromebook/nautilus/sign.sh           |  31 +
>  configs/chromebook_nautilus_defconfig       |  15 +
>  7 files changed, 798 insertions(+)

Could you add an entry in the DEVELOPERS file to associate your
name/email to the files being added (i.e both the defconfig and the
board/ directory).

> diff --git a/board/chromebook/nautilus/config b/board/chromebook/nautilus/config

Can we name this linux.config instead ?

This defconfig also seems pretty long, with lots of drivers enabled,
many as modules. Do we need all of them? Looking at the list of
modules, it seems unlikely all of these are needed/useful. So could you
do a pass of cleanup ?

> diff --git a/board/chromebook/nautilus/genimage.cfg b/board/chromebook/nautilus/genimage.cfg
> new file mode 100644
> index 000000000000..c4873e8b3670
> --- /dev/null
> +++ b/board/chromebook/nautilus/genimage.cfg
> @@ -0,0 +1,17 @@
> +image sdcard.img {
> +	exec-post = "board/chromebook/nautilus/mark_boot_once.sh"

Learned about this feature :) Could have been a post-image script, but
OK, this exec-post mechanism also works.

> +	hdimage {
> +		gpt = "true"
> +	}
> +
> +	partition kernel {
> +		image = "Image.kpart"
> +		bootable = "true"
> +		partition-type-uuid = FE3A2A5D-4F32-41A7-B725-ACCC3285A309

Just curious, the UUID needs to be exactly that one for the
bootloader/firmware to pick up the kernel image from there ?


> diff --git a/board/chromebook/nautilus/mark_boot_once.sh b/board/chromebook/nautilus/mark_boot_once.sh
> new file mode 100755
> index 000000000000..ea06a5b7cc73
> --- /dev/null
> +++ b/board/chromebook/nautilus/mark_boot_once.sh
> @@ -0,0 +1,16 @@
> +#!/bin/sh
> +
> +# This script marks the kernel partition as 'boot once'
> +# so that depthcharge will pick it.
> +
> +img=$BINARIES_DIR/sdcard.img
> +sgdisk=$HOST_DIR/sbin/sgdisk
> +
> +run() { echo "$@"; "$@"; }
> +die() { echo "$@" >&2; exit 1; }
> +
> +test -x $sgdisk || die "sgdisk not found (host-gptfdisk has not been built?)"

We generally don't do such checks, we assume that the configuration is
correct, and therefore the necessary tools will be available.

> +# Set succesful, priority, tries flags on kernel partition
> +# cgpt args are '-S 0 -T 1 -P 15'
> +run $sgdisk -A 1:=:0xe1f000000000004 $img

While I understand the idea of your "run" wrapper, we don't have this
anywhere in our other scripts, so I'd rather avoid it.

> +The signing part is done by sign.sh script in this directory.
> +

by *the* sign.sh

> +It does not really matter where rootfs is as long as the kernel is able

where *the* rootfs is

> +to find it, but this particular configuration assumes the kernel is on
> +partition n and rootfs is on partition n+1.
> +Make sure to check kernel.args if you change this.
> +
> +Making the boot media
> +---------------------
> +Start by configuring and building the images.
> +
> +	make chromebook_nautilus_defconfig
> +	make menuconfig # if necessary
> +	make
> +
> +The important files are:
> +
> +	Image.kpart (kernel partition, signed)
> +	rootfs.tar
> +	sdcard.img (SD card/USB image containing both kernel and rootfs)
> +
> +Write the image directly to some SD card or USB stick.
> +WARNING: make sure there is nothing important on that device,
> +and double-check the device name!
> +
> +	SD=/dev/mmcblk1		# may be /dev/sdX on some hosts
> +	dd if=output/images/sdcard.img of=$SD

Drop the SD variable here.


> diff --git a/board/chromebook/nautilus/sign.sh b/board/chromebook/nautilus/sign.sh
> new file mode 100755
> index 000000000000..3b8c9c577b20
> --- /dev/null
> +++ b/board/chromebook/nautilus/sign.sh
> @@ -0,0 +1,31 @@
> +#!/bin/sh
> +
> +# This script creates a kernel partition containing the kernel bzImage
> +# then signs it using futility from vboot-utils.
> +# The resulting file is called Image.kpart.
> +
> +BOARD_DIR=$(dirname $0)
> +futility=$HOST_DIR/bin/futility
> +devkeys=$HOST_DIR/share/vboot/devkeys
> +vmlinuz=$BINARIES_DIR/bzImage
> +
> +run() { echo "$@"; "$@"; }
> +die() { echo "$@" >&2; exit 1; }
> +test -f $vmlinuz || \
> +	die "No kernel image found"
> +test -x $futility || \
> +	die "No futility found (host-vboot-utils has not been built?)"

As said above, we probably don't need those checks. Just assume things
have been built as they should be.


> diff --git a/configs/chromebook_nautilus_defconfig b/configs/chromebook_nautilus_defconfig
> new file mode 100644
> index 000000000000..536e1fc96ad1
> --- /dev/null
> +++ b/configs/chromebook_nautilus_defconfig
> @@ -0,0 +1,15 @@
> +BR2_x86_64=y
> +BR2_x86_core2=y
> +BR2_TARGET_GENERIC_GETTY_PORT="ttyS0"
> +BR2_TARGET_GENERIC_GETTY_TERM="linux"
> +BR2_ROOTFS_POST_BUILD_SCRIPT="board/chromebook/nautilus/sign.sh"
> +BR2_ROOTFS_POST_IMAGE_SCRIPT="support/scripts/genimage.sh"
> +BR2_ROOTFS_POST_SCRIPT_ARGS="-c board/chromebook/nautilus/genimage.cfg"
> +BR2_LINUX_KERNEL=y
> +BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
> +BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/chromebook/nautilus/config"

We want to use a specific kernel version that is know to have been
tested, and not just "the latest kernel".

Besides those small details, it really looks good. Could you send a v2
with those details fixed?

Thanks a lot!

Thomas
Arnout Vandecappelle Dec. 3, 2019, 9:44 p.m. UTC | #2
On 20/11/2019 23:19, Thomas Petazzoni wrote:
>> +	partition kernel {
>> +		image = "Image.kpart"
>> +		bootable = "true"
>> +		partition-type-uuid = FE3A2A5D-4F32-41A7-B725-ACCC3285A309
> Just curious, the UUID needs to be exactly that one for the
> bootloader/firmware to pick up the kernel image from there ?

 Since nobody else responded to this: in GPT, the partition type UUID is the
equivalent of the 1-byte partition type in good old MBR. In [1] you can find
that this GUID is for Chrome OS kernel. So yes, I guess the bootloader searches
for a partition with that GUID.

 Regards,
 Arnout

[1] https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs

Patch
diff mbox series

diff --git a/board/chromebook/nautilus/config b/board/chromebook/nautilus/config
new file mode 100644
index 000000000000..21840d29ec79
--- /dev/null
+++ b/board/chromebook/nautilus/config
@@ -0,0 +1,635 @@ 
+CONFIG_DEFAULT_HOSTNAME="localhost"
+CONFIG_SYSVIPC=y
+# CONFIG_USELIB is not set
+CONFIG_AUDIT=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_PREEMPT=y
+CONFIG_TASK_XACCT=y
+CONFIG_TASK_IO_ACCOUNTING=y
+CONFIG_IKCONFIG=m
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=18
+CONFIG_CGROUPS=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_CFS_BANDWIDTH=y
+CONFIG_RT_GROUP_SCHED=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CPUSETS=y
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_NAMESPACES=y
+CONFIG_USER_NS=y
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_RD_BZIP2 is not set
+# CONFIG_RD_LZMA is not set
+# CONFIG_RD_LZO is not set
+# CONFIG_RD_LZ4 is not set
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+# CONFIG_PCSPKR_PLATFORM is not set
+CONFIG_EMBEDDED=y
+# CONFIG_COMPAT_BRK is not set
+CONFIG_PROFILING=y
+CONFIG_SMP=y
+CONFIG_X86_INTEL_LPSS=y
+CONFIG_X86_AMD_PLATFORM_DEVICE=y
+CONFIG_GART_IOMMU=y
+CONFIG_NR_CPUS=8
+CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
+# CONFIG_X86_MCE_AMD is not set
+CONFIG_MICROCODE_AMD=y
+CONFIG_MICROCODE_OLD_INTERFACE=y
+CONFIG_X86_MSR=y
+CONFIG_X86_CPUID=y
+CONFIG_X86_CHECK_BIOS_CORRUPTION=y
+# CONFIG_MTRR_SANITIZER is not set
+CONFIG_EFI=y
+CONFIG_HZ_1000=y
+CONFIG_LEGACY_VSYSCALL_EMULATE=y
+CONFIG_PM_WAKELOCKS=y
+CONFIG_PM_DEBUG=y
+CONFIG_PM_ADVANCED_DEBUG=y
+CONFIG_PM_TRACE_RTC=y
+# CONFIG_ACPI_AC is not set
+CONFIG_ACPI_DOCK=y
+CONFIG_TPS68470_PMIC_OPREGION=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
+CONFIG_X86_ACPI_CPUFREQ=y
+CONFIG_CPU_IDLE_GOV_LADDER=y
+CONFIG_INTEL_IDLE=y
+CONFIG_IA32_EMULATION=y
+CONFIG_GOOGLE_FIRMWARE=y
+CONFIG_GOOGLE_SMI=y
+CONFIG_GOOGLE_COREBOOT_TABLE=y
+CONFIG_GOOGLE_MEMCONSOLE_COREBOOT=y
+CONFIG_GOOGLE_VPD=y
+CONFIG_EFI_VARS=y
+CONFIG_KVM=y
+CONFIG_KVM_INTEL=y
+CONFIG_KVM_AMD=y
+CONFIG_VHOST_VSOCK=m
+CONFIG_ARCH_MMAP_RND_BITS=31
+CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+CONFIG_BLK_DEV_INTEGRITY=y
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_MAC_PARTITION=y
+CONFIG_BINFMT_MISC=y
+CONFIG_DEFAULT_MMAP_MIN_ADDR=32768
+CONFIG_TRANSPARENT_HUGEPAGE=y
+CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
+CONFIG_ZSMALLOC=y
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=y
+CONFIG_NET_KEY=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_ROUTE_MULTIPATH=y
+CONFIG_IP_ROUTE_VERBOSE=y
+CONFIG_IP_MROUTE=y
+CONFIG_IP_PIMSM_V1=y
+CONFIG_IP_PIMSM_V2=y
+CONFIG_SYN_COOKIES=y
+CONFIG_INET_AH=y
+CONFIG_INET_ESP=y
+CONFIG_INET_IPCOMP=y
+CONFIG_INET_UDP_DIAG=y
+CONFIG_INET_DIAG_DESTROY=y
+CONFIG_TCP_CONG_ADVANCED=y
+# CONFIG_TCP_CONG_BIC is not set
+# CONFIG_TCP_CONG_WESTWOOD is not set
+# CONFIG_TCP_CONG_HTCP is not set
+CONFIG_TCP_CONG_LP=m
+CONFIG_TCP_MD5SIG=y
+CONFIG_IPV6_ROUTER_PREF=y
+CONFIG_IPV6_ROUTE_INFO=y
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_IPV6_SIT=m
+CONFIG_IPV6_MULTIPLE_TABLES=y
+CONFIG_NETFILTER=y
+# CONFIG_BRIDGE_NETFILTER is not set
+CONFIG_NF_CONNTRACK=y
+CONFIG_NF_CONNTRACK_SECMARK=y
+CONFIG_NF_CONNTRACK_EVENTS=y
+CONFIG_NF_CONNTRACK_TIMEOUT=y
+# CONFIG_NF_CT_PROTO_DCCP is not set
+# CONFIG_NF_CT_PROTO_SCTP is not set
+# CONFIG_NF_CT_PROTO_UDPLITE is not set
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_PPTP=y
+CONFIG_NF_CONNTRACK_TFTP=m
+CONFIG_NF_CT_NETLINK=y
+CONFIG_NF_CT_NETLINK_TIMEOUT=y
+CONFIG_NF_CT_NETLINK_HELPER=y
+CONFIG_NETFILTER_NETLINK_GLUE_CT=y
+CONFIG_NETFILTER_XT_MARK=m
+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y
+CONFIG_NETFILTER_XT_TARGET_CONNMARK=y
+CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y
+CONFIG_NETFILTER_XT_TARGET_CT=y
+CONFIG_NETFILTER_XT_TARGET_DSCP=y
+CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y
+CONFIG_NETFILTER_XT_TARGET_NFLOG=y
+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y
+CONFIG_NETFILTER_XT_TARGET_SECMARK=y
+CONFIG_NETFILTER_XT_TARGET_TCPMSS=y
+CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y
+CONFIG_NETFILTER_XT_MATCH_CONNMARK=y
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
+CONFIG_NETFILTER_XT_MATCH_DSCP=y
+CONFIG_NETFILTER_XT_MATCH_POLICY=y
+CONFIG_NETFILTER_XT_MATCH_QUOTA=y
+CONFIG_NETFILTER_XT_MATCH_SOCKET=y
+CONFIG_NETFILTER_XT_MATCH_STATE=y
+CONFIG_NETFILTER_XT_MATCH_U32=y
+CONFIG_IP_NF_IPTABLES=y
+CONFIG_IP_NF_FILTER=y
+CONFIG_IP_NF_TARGET_REJECT=y
+CONFIG_IP_NF_NAT=y
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_MANGLE=y
+CONFIG_IP_NF_RAW=y
+CONFIG_IP_NF_SECURITY=y
+CONFIG_IP6_NF_IPTABLES=y
+CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+CONFIG_IP6_NF_MATCH_RPFILTER=y
+CONFIG_IP6_NF_FILTER=m
+CONFIG_IP6_NF_TARGET_REJECT=m
+CONFIG_IP6_NF_MANGLE=y
+CONFIG_IP6_NF_RAW=y
+CONFIG_IP6_NF_NAT=m
+CONFIG_IP6_NF_TARGET_MASQUERADE=m
+CONFIG_BRIDGE=m
+CONFIG_VLAN_8021Q=m
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_HTB=m
+CONFIG_NET_SCH_CODEL=m
+CONFIG_NET_SCH_FQ_CODEL=m
+CONFIG_NET_SCH_INGRESS=m
+CONFIG_NET_CLS_U32=m
+CONFIG_CLS_U32_MARK=y
+CONFIG_NET_CLS_ACT=y
+CONFIG_NET_ACT_POLICE=y
+CONFIG_NET_ACT_GACT=y
+CONFIG_VSOCKETS=m
+CONFIG_BT=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_HIDP=m
+CONFIG_BT_HCIBTUSB=m
+CONFIG_BT_HCIBCM203X=m
+CONFIG_BT_HCIBFUSB=m
+CONFIG_BT_HCIVHCI=m
+CONFIG_BT_ATH3K=m
+CONFIG_CFG80211=m
+CONFIG_NL80211_TESTMODE=y
+CONFIG_CFG80211_DEBUGFS=y
+CONFIG_CFG80211_WEXT=y
+CONFIG_MAC80211=m
+CONFIG_MAC80211_DEBUG_MENU=y
+CONFIG_MAC80211_VERBOSE_DEBUG=y
+CONFIG_RFKILL=y
+CONFIG_PCI=y
+CONFIG_PCIEPORTBUS=y
+CONFIG_HOTPLUG_PCI_PCIE=y
+CONFIG_PCI_MSI=y
+CONFIG_HOTPLUG_PCI=y
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_DEBUG_DEVRES=y
+CONFIG_TEST_ASYNC_DRIVER_PROBE=m
+CONFIG_CONNECTOR=y
+CONFIG_OF=y
+CONFIG_PARPORT=y
+CONFIG_PARPORT_PC=y
+CONFIG_PARPORT_SERIAL=y
+CONFIG_ZRAM=m
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_VIRTIO_BLK=m
+CONFIG_BLK_DEV_NVME=y
+CONFIG_EEPROM_AT24=m
+CONFIG_BLK_DEV_SD=y
+CONFIG_BLK_DEV_SR=m
+CONFIG_SCSI_CONSTANTS=y
+CONFIG_SCSI_SPI_ATTRS=y
+CONFIG_SCSI_VIRTIO=y
+CONFIG_ATA=y
+# CONFIG_SATA_PMP is not set
+CONFIG_SATA_AHCI=y
+CONFIG_ATA_PIIX=y
+CONFIG_ATA_GENERIC=y
+CONFIG_MD=y
+CONFIG_BLK_DEV_DM=y
+CONFIG_DM_CRYPT=y
+CONFIG_DM_THIN_PROVISIONING=y
+CONFIG_DM_FLAKEY=m
+CONFIG_DM_VERITY=y
+CONFIG_NETDEVICES=y
+CONFIG_TUN=m
+CONFIG_VETH=m
+CONFIG_VIRTIO_NET=m
+CONFIG_ALX=m
+CONFIG_TIGON3=m
+CONFIG_E100=m
+CONFIG_E1000=m
+CONFIG_E1000E=m
+CONFIG_IGBVF=m
+CONFIG_JME=m
+CONFIG_R8169=m
+CONFIG_PHYLIB=y
+CONFIG_PPP=y
+CONFIG_PPP_MPPE=y
+CONFIG_PPP_ASYNC=y
+CONFIG_USB_PEGASUS=m
+CONFIG_USB_RTL8150=m
+CONFIG_USB_RTL8152=m
+CONFIG_USB_NET_CDC_MBIM=m
+CONFIG_USB_NET_DM9601=m
+CONFIG_USB_NET_SMSC75XX=m
+CONFIG_USB_NET_SMSC95XX=m
+CONFIG_USB_NET_MCS7830=m
+# CONFIG_USB_NET_CDC_SUBSET is not set
+# CONFIG_USB_NET_ZAURUS is not set
+CONFIG_ATH_DEBUG=y
+CONFIG_ATH5K=m
+CONFIG_ATH9K=m
+CONFIG_ATH9K_DEBUGFS=y
+# CONFIG_ATH9K_RFKILL is not set
+CONFIG_BRCMFMAC=m
+CONFIG_BRCMFMAC_USB=y
+CONFIG_BRCMFMAC_PCIE=y
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_FIRMWARE=y
+CONFIG_HOSTAP_FIRMWARE_NVRAM=y
+CONFIG_HOSTAP_PLX=m
+CONFIG_HOSTAP_PCI=m
+CONFIG_LIBERTAS_THINFIRM=m
+CONFIG_LIBERTAS_THINFIRM_USB=m
+CONFIG_MWIFIEX=m
+CONFIG_MWIFIEX_PCIE=m
+CONFIG_RT2X00=m
+CONFIG_RT2800PCI=m
+# CONFIG_RT2800PCI_RT33XX is not set
+# CONFIG_RT2800PCI_RT35XX is not set
+# CONFIG_RT2800PCI_RT53XX is not set
+CONFIG_RT2800USB=m
+CONFIG_RT2800USB_RT3573=y
+CONFIG_RT2800USB_RT53XX=y
+CONFIG_RT2800USB_RT55XX=y
+CONFIG_RT2800USB_UNKNOWN=y
+CONFIG_RTL8192CE=m
+# CONFIG_RTLWIFI_DEBUG is not set
+CONFIG_MAC80211_HWSIM=m
+CONFIG_USB_NET_RNDIS_WLAN=m
+CONFIG_INPUT_FF_MEMLESS=y
+CONFIG_INPUT_JOYDEV=m
+CONFIG_INPUT_EVDEV=y
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_KEYBOARD_CROS_EC=y
+# CONFIG_MOUSE_PS2_ALPS is not set
+# CONFIG_MOUSE_PS2_LOGIPS2PP is not set
+# CONFIG_MOUSE_PS2_SYNAPTICS is not set
+# CONFIG_MOUSE_PS2_CYPRESS is not set
+# CONFIG_MOUSE_PS2_LIFEBOOK is not set
+# CONFIG_MOUSE_PS2_TRACKPOINT is not set
+# CONFIG_MOUSE_PS2_FOCALTECH is not set
+CONFIG_MOUSE_APPLETOUCH=m
+CONFIG_MOUSE_CYAPA=y
+CONFIG_MOUSE_ELAN_I2C=y
+CONFIG_INPUT_JOYSTICK=y
+CONFIG_JOYSTICK_IFORCE=m
+CONFIG_JOYSTICK_IFORCE_USB=m
+CONFIG_JOYSTICK_XPAD=m
+CONFIG_JOYSTICK_XPAD_FF=y
+CONFIG_JOYSTICK_XPAD_LEDS=y
+CONFIG_INPUT_TABLET=y
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_ATMEL_MXT=y
+CONFIG_TOUCHSCREEN_ELAN=y
+CONFIG_TOUCHSCREEN_MELFAS_MIP4=y
+CONFIG_TOUCHSCREEN_WDT87XX_I2C=y
+CONFIG_TOUCHSCREEN_USB_COMPOSITE=m
+CONFIG_TOUCHSCREEN_RM_TS=y
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_VT is not set
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_DW=y
+# CONFIG_SERIAL_8250_MID is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_HW_RANDOM_AMD is not set
+# CONFIG_HW_RANDOM_VIA is not set
+CONFIG_NVRAM=y
+CONFIG_HPET=y
+# CONFIG_HPET_MMAP is not set
+CONFIG_TCG_TPM=y
+CONFIG_TCG_TIS=y
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_MUX=y
+CONFIG_I2C_I801=y
+CONFIG_I2C_PIIX4=m
+CONFIG_I2C_DESIGNWARE_PLATFORM=y
+CONFIG_I2C_DESIGNWARE_PCI=y
+CONFIG_I2C_STUB=m
+CONFIG_SPI=y
+CONFIG_SPI_BITBANG=m
+CONFIG_SPI_PXA2XX=y
+CONFIG_SPI_SPIDEV=y
+CONFIG_PINCTRL_AMD=y
+CONFIG_PINCTRL_BAYTRAIL=y
+CONFIG_PINCTRL_CHERRYVIEW=y
+CONFIG_PINCTRL_BROXTON=y
+CONFIG_PINCTRL_SUNRISEPOINT=y
+CONFIG_DEBUG_GPIO=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_GPIO_LYNXPOINT=y
+CONFIG_GPIO_TPS68470=y
+CONFIG_SENSORS_CORETEMP=y
+CONFIG_X86_PKG_TEMP_THERMAL=y
+CONFIG_INTEL_SOC_DTS_THERMAL=y
+CONFIG_INT340X_THERMAL=y
+CONFIG_WATCHDOG=y
+CONFIG_SOFT_WATCHDOG=m
+CONFIG_ITCO_WDT=y
+CONFIG_ITCO_VENDOR_SUPPORT=y
+CONFIG_MFD_CROS_EC=y
+CONFIG_LPC_ICH=y
+CONFIG_LPC_SCH=y
+CONFIG_MFD_INTEL_LPSS_ACPI=y
+CONFIG_MFD_INTEL_LPSS_PCI=y
+CONFIG_MFD_TPS68470=y
+CONFIG_MEDIA_SUPPORT=y
+CONFIG_MEDIA_CAMERA_SUPPORT=y
+CONFIG_MEDIA_CEC_SUPPORT=y
+CONFIG_MEDIA_CONTROLLER=y
+CONFIG_VIDEO_V4L2_SUBDEV_API=y
+CONFIG_MEDIA_USB_SUPPORT=y
+CONFIG_USB_VIDEO_CLASS=m
+# CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set
+# CONFIG_USB_GSPCA is not set
+CONFIG_MEDIA_PCI_SUPPORT=y
+CONFIG_VIDEO_IPU3_CIO2=m
+CONFIG_V4L_TEST_DRIVERS=y
+CONFIG_CEC_PLATFORM_DRIVERS=y
+CONFIG_VIDEO_CROS_EC_CEC=m
+# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set
+CONFIG_VIDEO_IMX258=m
+CONFIG_VIDEO_IMX319=m
+CONFIG_VIDEO_IMX355=m
+CONFIG_VIDEO_OV5670=m
+CONFIG_VIDEO_OV13858=m
+CONFIG_VIDEO_AK7375=m
+CONFIG_VIDEO_DW9714=m
+CONFIG_AGP=y
+CONFIG_AGP_INTEL=y
+# CONFIG_VGA_ARB is not set
+CONFIG_DRM=y
+CONFIG_DRM_DP_AUX_CHARDEV=y
+# CONFIG_DRM_FBDEV_EMULATION is not set
+CONFIG_DRM_I915=y
+CONFIG_DRM_VGEM=y
+CONFIG_DRM_UDL=y
+CONFIG_DRM_CIRRUS_QEMU=m
+CONFIG_DRM_VIRTIO_GPU=m
+CONFIG_FB=y
+CONFIG_FB_MODE_HELPERS=y
+# CONFIG_LCD_CLASS_DEVICE is not set
+CONFIG_SOUND=y
+CONFIG_SND=y
+CONFIG_SND_HRTIMER=m
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_SEQ_DUMMY=m
+CONFIG_SND_HDA_INTEL=m
+CONFIG_SND_HDA_HWDEP=y
+CONFIG_SND_HDA_PATCH_LOADER=y
+CONFIG_SND_HDA_CODEC_REALTEK=m
+CONFIG_SND_HDA_CODEC_ANALOG=m
+CONFIG_SND_HDA_CODEC_SIGMATEL=m
+CONFIG_SND_HDA_CODEC_VIA=m
+CONFIG_SND_HDA_CODEC_HDMI=m
+CONFIG_SND_HDA_CODEC_CIRRUS=m
+CONFIG_SND_HDA_CODEC_CONEXANT=m
+CONFIG_SND_HDA_CODEC_CA0110=m
+CONFIG_SND_HDA_CODEC_CA0132=m
+CONFIG_SND_HDA_CODEC_CA0132_DSP=y
+CONFIG_SND_HDA_CODEC_CMEDIA=m
+CONFIG_SND_HDA_CODEC_SI3054=m
+CONFIG_SND_HDA_POWER_SAVE_DEFAULT=15
+# CONFIG_SND_SPI is not set
+CONFIG_SND_USB_AUDIO=m
+CONFIG_SND_SOC=y
+CONFIG_SND_SOC_INTEL_SKYLAKE=m
+CONFIG_SND_SOC_INTEL_CHT_BSW_RT5645_MACH=m
+CONFIG_SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH=m
+CONFIG_SND_SOC_INTEL_SKL_RT286_MACH=m
+CONFIG_SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH=m
+CONFIG_SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH=m
+CONFIG_SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH=m
+CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH=m
+CONFIG_SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH=m
+CONFIG_SND_SOC_INTEL_KBL_DA7219_MAX98357A_MACH=m
+CONFIG_SND_SOC_INTEL_KBL_DA7219_MAX98927_MACH=m
+CONFIG_SND_SOC_TS3A227E=y
+CONFIG_HID_BATTERY_STRENGTH=y
+CONFIG_HIDRAW=y
+CONFIG_UHID=y
+CONFIG_HID_APPLE=m
+CONFIG_HID_CHERRY=m
+CONFIG_HID_CHICONY=y
+CONFIG_HID_HOLTEK=y
+CONFIG_HID_GOOGLE_HAMMER=m
+CONFIG_HID_KENSINGTON=y
+CONFIG_HID_LOGITECH=m
+CONFIG_HID_LOGITECH_DJ=m
+CONFIG_HID_MAGICMOUSE=m
+CONFIG_HID_MICROSOFT=m
+CONFIG_HID_MULTITOUCH=y
+CONFIG_HID_PLANTRONICS=m
+CONFIG_HID_PRIMAX=m
+CONFIG_HID_SONY=m
+CONFIG_HID_RMI=m
+CONFIG_HID_THINGM=m
+CONFIG_HID_WACOM=m
+CONFIG_HID_WIIMOTE=m
+CONFIG_HID_PID=y
+CONFIG_USB_HIDDEV=y
+CONFIG_I2C_HID=y
+CONFIG_INTEL_ISH_HID=m
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+# CONFIG_USB_DEFAULT_PERSIST is not set
+CONFIG_USB_MON=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_ROOT_HUB_TT=y
+CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_UHCI_HCD=y
+CONFIG_USB_ACM=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_STORAGE_REALTEK=y
+CONFIG_USB_UAS=y
+CONFIG_USB_DWC3=m
+CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_SERIAL=y
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_SIMPLE=m
+CONFIG_USB_SERIAL_CH341=m
+CONFIG_USB_SERIAL_CP210X=m
+CONFIG_USB_SERIAL_FTDI_SIO=m
+CONFIG_USB_SERIAL_KEYSPAN=m
+CONFIG_USB_SERIAL_PL2303=m
+CONFIG_USB_SERIAL_OTI6858=m
+CONFIG_USB_SERIAL_QUALCOMM=m
+CONFIG_USB_SERIAL_SIERRAWIRELESS=m
+CONFIG_USB_SERIAL_OPTION=m
+CONFIG_USB_GADGET=m
+CONFIG_USB_CONFIGFS=m
+CONFIG_USB_CONFIGFS_F_FS=y
+CONFIG_MMC=y
+CONFIG_MMC_BLOCK_MINORS=16
+CONFIG_MMC_TEST=m
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_PCI=y
+# CONFIG_MMC_RICOH_MMC is not set
+CONFIG_MMC_SDHCI_ACPI=y
+CONFIG_LEDS_CLASS=y
+CONFIG_RTC_CLASS=y
+# CONFIG_RTC_HCTOSYS is not set
+CONFIG_DMADEVICES=y
+CONFIG_INTEL_IDMA64=y
+CONFIG_DW_DMAC=y
+CONFIG_SW_SYNC=y
+CONFIG_VIRTIO_PCI=y
+CONFIG_STAGING=y
+CONFIG_ASHMEM=y
+CONFIG_HP_WMI=m
+CONFIG_INTEL_MENLOW=m
+CONFIG_ACPI_WMI=m
+CONFIG_INTEL_VBTN=m
+CONFIG_INTEL_PMC_CORE=y
+CONFIG_INTEL_PMC_IPC=y
+CONFIG_INTEL_PUNIT_IPC=y
+CONFIG_INTEL_TELEMETRY=y
+CONFIG_CHROMEOS_LAPTOP=y
+CONFIG_CHROMEOS_PSTORE=y
+CONFIG_CHROMEOS_TBMC=y
+CONFIG_CROS_EC_LPC=y
+CONFIG_CROS_KBD_LED_BACKLIGHT=y
+CONFIG_IIO=m
+CONFIG_IIO_CROS_EC_ACCEL_LEGACY=m
+CONFIG_IIO_CROS_EC_SENSORS_CORE=m
+CONFIG_IIO_CROS_EC_SENSORS=m
+CONFIG_ACPI_ALS=m
+CONFIG_IIO_CROS_EC_LIGHT_PROX=m
+CONFIG_SENSORS_ISL29018=m
+CONFIG_SENSORS_TSL2563=m
+CONFIG_TSL2583=m
+CONFIG_IIO_SYSFS_TRIGGER=m
+CONFIG_IIO_CROS_EC_BARO=m
+CONFIG_POWERCAP=y
+CONFIG_INTEL_RAPL=y
+CONFIG_ANDROID=y
+CONFIG_ANDROID_BINDER_IPC=y
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_EXT4_FS_SECURITY=y
+# CONFIG_DNOTIFY is not set
+CONFIG_FANOTIFY=y
+CONFIG_QUOTA=y
+CONFIG_QFMT_V2=y
+CONFIG_FUSE_FS=m
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_UDF_FS=m
+CONFIG_VFAT_FS=m
+CONFIG_PROC_KCORE=y
+CONFIG_PROC_CHILDREN=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_CONFIGFS_FS=y
+# CONFIG_EFIVAR_FS is not set
+CONFIG_ECRYPT_FS=y
+CONFIG_HFSPLUS_FS=m
+CONFIG_SQUASHFS=y
+CONFIG_SQUASHFS_FILE_DIRECT=y
+CONFIG_SQUASHFS_XATTR=y
+CONFIG_SQUASHFS_LZO=y
+CONFIG_SQUASHFS_4K_DEVBLK_SIZE=y
+CONFIG_PSTORE=y
+CONFIG_PSTORE_CONSOLE=y
+CONFIG_PSTORE_RAM=y
+CONFIG_NFS_FS=m
+CONFIG_NFS_V4=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=m
+CONFIG_ENCRYPTED_KEYS=y
+CONFIG_SECURITY=y
+CONFIG_SECURITY_NETWORK=y
+CONFIG_SECURITY_PATH=y
+CONFIG_LSM_MMAP_MIN_ADDR=32768
+CONFIG_HARDENED_USERCOPY=y
+CONFIG_FORTIFY_SOURCE=y
+CONFIG_STATIC_USERMODEHELPER=y
+CONFIG_SECURITY_SELINUX=y
+CONFIG_SECURITY_SELINUX_BOOTPARAM=y
+CONFIG_SECURITY_YAMA=y
+CONFIG_CRYPTO_GCM=y
+CONFIG_CRYPTO_CTS=y
+CONFIG_CRYPTO_LRW=y
+CONFIG_CRYPTO_XTS=y
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_AES_NI_INTEL=y
+CONFIG_CRYPTO_ARC4=y
+CONFIG_CRYPTO_USER_API_HASH=m
+CONFIG_CRYPTO_USER_API_SKCIPHER=m
+CONFIG_CRC7=m
+# CONFIG_XZ_DEC_POWERPC is not set
+# CONFIG_XZ_DEC_IA64 is not set
+# CONFIG_XZ_DEC_ARM is not set
+# CONFIG_XZ_DEC_ARMTHUMB is not set
+# CONFIG_XZ_DEC_SPARC is not set
+CONFIG_PRINTK_TIME=y
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_OPTIMIZE_INLINING=y
+# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0
+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y
+CONFIG_HARDLOCKUP_DETECTOR=y
+CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y
+CONFIG_PANIC_ON_OOPS=y
+CONFIG_PANIC_TIMEOUT=-1
+CONFIG_SCHEDSTATS=y
+# CONFIG_DEBUG_PREEMPT is not set
+CONFIG_DEBUG_SPINLOCK=y
+CONFIG_DEBUG_ATOMIC_SLEEP=y
+CONFIG_DEBUG_CREDENTIALS=y
+CONFIG_RCU_CPU_STALL_TIMEOUT=60
+CONFIG_FUNCTION_TRACER=y
+CONFIG_FTRACE_SYSCALLS=y
+CONFIG_BLK_DEV_IO_TRACE=y
+CONFIG_PROVIDE_OHCI1394_DMA_INIT=y
+CONFIG_LKDTM=y
+CONFIG_TEST_LKM=m
+CONFIG_TEST_FIRMWARE=m
+CONFIG_TEST_UDELAY=m
+CONFIG_EARLY_PRINTK_DBGP=y
+CONFIG_IO_DELAY_0XED=y
+CONFIG_DEBUG_BOOT_PARAMS=y
+CONFIG_PUNIT_ATOM_DEBUG=y
diff --git a/board/chromebook/nautilus/genimage.cfg b/board/chromebook/nautilus/genimage.cfg
new file mode 100644
index 000000000000..c4873e8b3670
--- /dev/null
+++ b/board/chromebook/nautilus/genimage.cfg
@@ -0,0 +1,17 @@ 
+image sdcard.img {
+	exec-post = "board/chromebook/nautilus/mark_boot_once.sh"
+	hdimage {
+		gpt = "true"
+	}
+
+	partition kernel {
+		image = "Image.kpart"
+		bootable = "true"
+		partition-type-uuid = FE3A2A5D-4F32-41A7-B725-ACCC3285A309
+	}
+
+	partition rootfs {
+		image = "rootfs.ext2"
+		partition-type = 0x7
+	}
+}
diff --git a/board/chromebook/nautilus/kernel.args b/board/chromebook/nautilus/kernel.args
new file mode 100644
index 000000000000..8492bca268d5
--- /dev/null
+++ b/board/chromebook/nautilus/kernel.args
@@ -0,0 +1 @@ 
+console=ttyS0,115200n8 root=PARTUUID=%U/PARTNROFF=1
diff --git a/board/chromebook/nautilus/mark_boot_once.sh b/board/chromebook/nautilus/mark_boot_once.sh
new file mode 100755
index 000000000000..ea06a5b7cc73
--- /dev/null
+++ b/board/chromebook/nautilus/mark_boot_once.sh
@@ -0,0 +1,16 @@ 
+#!/bin/sh
+
+# This script marks the kernel partition as 'boot once'
+# so that depthcharge will pick it.
+
+img=$BINARIES_DIR/sdcard.img
+sgdisk=$HOST_DIR/sbin/sgdisk
+
+run() { echo "$@"; "$@"; }
+die() { echo "$@" >&2; exit 1; }
+
+test -x $sgdisk || die "sgdisk not found (host-gptfdisk has not been built?)"
+
+# Set succesful, priority, tries flags on kernel partition
+# cgpt args are '-S 0 -T 1 -P 15'
+run $sgdisk -A 1:=:0xe1f000000000004 $img
diff --git a/board/chromebook/nautilus/readme.txt b/board/chromebook/nautilus/readme.txt
new file mode 100644
index 000000000000..88e5969bb398
--- /dev/null
+++ b/board/chromebook/nautilus/readme.txt
@@ -0,0 +1,83 @@ 
+Samsung Chromebook Plus AKA Chromebook Nautilus
+===============================================
+
+This file describes booting the Chromebook from a USB stick containing
+Buildroot kernel and rootfs, using the original bootloader. This is
+the least invasive way to get Buildroot onto the devices and a good
+starting point.
+
+The bootloader will only boot a kernel from a GPT partition marked
+bootable with certain flags set in the partition.
+The kernel image must be signed using futility from the vboot-utils package.
+The signing part is done by sign.sh script in this directory.
+
+It does not really matter where rootfs is as long as the kernel is able
+to find it, but this particular configuration assumes the kernel is on
+partition n and rootfs is on partition n+1.
+Make sure to check kernel.args if you change this.
+
+Making the boot media
+---------------------
+Start by configuring and building the images.
+
+	make chromebook_nautilus_defconfig
+	make menuconfig # if necessary
+	make
+
+The important files are:
+
+	Image.kpart (kernel partition, signed)
+	rootfs.tar
+	sdcard.img (SD card/USB image containing both kernel and rootfs)
+
+Write the image directly to some SD card or USB stick.
+WARNING: make sure there is nothing important on that device,
+and double-check the device name!
+
+	SD=/dev/mmcblk1		# may be /dev/sdX on some hosts
+	dd if=output/images/sdcard.img of=$SD
+
+Switching to developer mode and booting from SD
+-----------------------------------------------
+Power Chromebook down, then power it up while holding Esc+F3.
+BEWARE: switching to developer mode deletes all user data.
+Create backups if you need them.
+
+While in developer mode, Chromebook will boot into a white screen saying
+"OS verification is off".
+
+Press Ctrl-D at this screen to boot Chromium OS from eMMC.
+Press Ctrl-U at this screen to boot from SD (or USB)
+Press Power to power it off.
+Do NOT press Space unless you mean it.
+This will switch it back to normal mode.
+
+The is no way to get rid of the white screen without re-flashing the bootloader.
+
+Troubleshooting
+---------------
+Loud *BEEP* after pressing Ctrl-U means there's no valid partition to boot from.
+Which in turn means either bad GPT or improperly signed kernel.
+
+Return to the OS verification screen without any sounds means the code managed
+to reboot the board. May indicate properly signed but invalid image.
+
+Blank screen means the image is valid and properly signed but cannot boot
+for some reason, like missing or incorrect DT.
+
+In case the board becomes unresponsive:
+
+* Press Esc+F3+Power. The board should reboot instantly.
+  Remove SD card to prevent it from attempting a system recovery.
+
+* Hold Power button for around 10s. The board should shut down into
+  its soft-off mode. Press Power button again or open the lid to turn in on.
+
+Kernel command line
+-------------------
+The command line is taken from board/chromebook/nautilus/kernel.args and stored
+in the vboot header (which also holds the signature).
+
+Booting with console= suppresses all kernel output.
+As a side effect, it makes /dev/console unusable, which the init in use must
+be able to handle.
diff --git a/board/chromebook/nautilus/sign.sh b/board/chromebook/nautilus/sign.sh
new file mode 100755
index 000000000000..3b8c9c577b20
--- /dev/null
+++ b/board/chromebook/nautilus/sign.sh
@@ -0,0 +1,31 @@ 
+#!/bin/sh
+
+# This script creates a kernel partition containing the kernel bzImage
+# then signs it using futility from vboot-utils.
+# The resulting file is called Image.kpart.
+
+BOARD_DIR=$(dirname $0)
+futility=$HOST_DIR/bin/futility
+devkeys=$HOST_DIR/share/vboot/devkeys
+vmlinuz=$BINARIES_DIR/bzImage
+
+run() { echo "$@"; "$@"; }
+die() { echo "$@" >&2; exit 1; }
+test -f $vmlinuz || \
+	die "No kernel image found"
+test -x $futility || \
+	die "No futility found (host-vboot-utils has not been built?)"
+
+# futility requires non-empty file to be supplied with --bootloader
+# even if it does not make sense for the target platform.
+echo > $BINARIES_DIR/dummy.txt
+
+run $futility vbutil_kernel \
+	--keyblock $devkeys/kernel.keyblock \
+	--signprivate $devkeys/kernel_data_key.vbprivk \
+	--arch x86 \
+	--version 1 \
+	--config $BOARD_DIR/kernel.args \
+	--vmlinuz $vmlinuz \
+	--bootloader $BINARIES_DIR/dummy.txt \
+	--pack $BINARIES_DIR/Image.kpart || exit 1
diff --git a/configs/chromebook_nautilus_defconfig b/configs/chromebook_nautilus_defconfig
new file mode 100644
index 000000000000..536e1fc96ad1
--- /dev/null
+++ b/configs/chromebook_nautilus_defconfig
@@ -0,0 +1,15 @@ 
+BR2_x86_64=y
+BR2_x86_core2=y
+BR2_TARGET_GENERIC_GETTY_PORT="ttyS0"
+BR2_TARGET_GENERIC_GETTY_TERM="linux"
+BR2_ROOTFS_POST_BUILD_SCRIPT="board/chromebook/nautilus/sign.sh"
+BR2_ROOTFS_POST_IMAGE_SCRIPT="support/scripts/genimage.sh"
+BR2_ROOTFS_POST_SCRIPT_ARGS="-c board/chromebook/nautilus/genimage.cfg"
+BR2_LINUX_KERNEL=y
+BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
+BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/chromebook/nautilus/config"
+BR2_TARGET_ROOTFS_EXT2=y
+BR2_TARGET_ROOTFS_EXT2_4=y
+BR2_PACKAGE_HOST_GENIMAGE=y
+BR2_PACKAGE_HOST_GPTFDISK=y
+BR2_PACKAGE_HOST_VBOOT_UTILS=y