[fuchsia] Add native Fushcia booting for imx8m EVK board
diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c index 7236abe..2258cd9 100644 --- a/arch/arm/lib/bootm.c +++ b/arch/arm/lib/bootm.c
@@ -30,6 +30,19 @@ #include <asm/armv7.h> #endif +#if defined(CONFIG_FUCHSIA_BOOT_IMAGE) +#include <fuchsia/bootdata.h> +#include <fuchsia/driver-config.h> + +static void append_bootdata(bootdata_t* container, uint32_t type, uint32_t extra, + const void* payload, uint32_t length); + +#if defined(CONFIG_IMX8MEVK) +#include <fuchsia/board/imx8mevk/board-config.h> +#endif + +#endif + DECLARE_GLOBAL_DATA_PTR; static struct tag *params; @@ -433,3 +446,61 @@ ((void (*)(void *))images->ep)(images->ft_addr); } #endif + + +#if defined(CONFIG_FUCHSIA_BOOT_IMAGE) + +#define FUCHSIA_KERNEL_ALIGN 65536 + +static void append_bootdata(bootdata_t* container, uint32_t type, uint32_t extra, + const void* payload, uint32_t length) { + bootdata_t* dest = (bootdata_t*)((uintptr_t)container + container->length + sizeof(bootdata_t)); + + dest->type = type; + dest->length = length; + dest->extra = extra; + dest->flags = 0; + dest->reserved0 = 0; + dest->reserved1 = 0; + dest->magic = BOOTITEM_MAGIC; + dest->crc32 = BOOTITEM_NO_CRC32; + + if (length) { + memcpy(dest + 1, payload, length); + } + length = BOOTDATA_ALIGN(length + sizeof(bootdata_t)); + container->length += length; +} + +int do_bootm_fuchsia(int flag, int argc, char * const argv[], + bootm_headers_t *images) +{ + bootdata_t* bootdata = (bootdata_t *)images->ep; + const bootdata_t* kernel_hdr = &bootdata[1]; + const bootdata_kernel_t* kernel = (bootdata_kernel_t *)&bootdata[2]; + + append_board_bootdata(bootdata); + + uint32_t bootdata_len = bootdata->length + sizeof(bootdata_t); + uint32_t kernel_len = kernel_hdr->length + 2 * sizeof(bootdata_t); + + // If bootdata_len is greater than kernel_len, + // then we have bootdata records after the kernel. + // In that case we must relocate the kernel after the bootdata + if (bootdata_len > kernel_len) { + uintptr_t dest = (ulong)bootdata + bootdata_len; + // align to 64K boundary + dest = (dest + FUCHSIA_KERNEL_ALIGN - 1) & ~(FUCHSIA_KERNEL_ALIGN - 1); + memcpy((void *)dest, bootdata, kernel_len); + images->ep = dest + kernel->entry64; + } else { + images->ep = (ulong)bootdata + kernel->entry64; + } + + // this will pass the bootdata pointer to the kernel via x0 + images->ft_addr = (char *)bootdata; + + boot_jump_linux(images, flag); + return 0; +} +#endif
diff --git a/common/Makefile b/common/Makefile index a5e92dc..d0866f2 100644 --- a/common/Makefile +++ b/common/Makefile
@@ -149,6 +149,7 @@ obj-$(CONFIG_CMD_IDE) += ide.o obj-y += image.o obj-$(CONFIG_ANDROID_BOOT_IMAGE) += image-android.o +obj-$(CONFIG_FUCHSIA_BOOT_IMAGE) += image-fuchsia.o obj-$(CONFIG_$(SPL_)OF_LIBFDT) += image-fdt.o obj-$(CONFIG_$(SPL_)FIT) += image-fit.o obj-$(CONFIG_$(SPL_)FIT_SIGNATURE) += image-sig.o
diff --git a/common/bootm.c b/common/bootm.c index b2c0912..38f2e6e 100644 --- a/common/bootm.c +++ b/common/bootm.c
@@ -164,6 +164,20 @@ ep_found = true; break; #endif +#ifdef CONFIG_FUCHSIA_BOOT_IMAGE + case IMAGE_FORMAT_FUCHSIA: + images.os.type = IH_TYPE_KERNEL; + images.os.comp = fuchsia_image_get_comp(os_hdr); + images.os.os = IH_OS_FUCHSIA; + + images.os.end = fuchsia_image_get_end(os_hdr); + images.os.load = fuchsia_image_get_kload(os_hdr); + if (images.os.load == 0x10008000) + images.os.load = 0x1080000; + images.ep = images.os.load; + ep_found = true; + break; +#endif default: puts("ERROR: unknown image format type!\n"); return 1; @@ -877,6 +891,15 @@ images->fit_noffset_os = os_noffset; break; #endif +#ifdef CONFIG_FUCHSIA_BOOT_IMAGE + case IMAGE_FORMAT_FUCHSIA: + printf("## Booting Fuchsia Image at 0x%08lx ...\n", img_addr); + buf = map_sysmem(img_addr, 0); + if (fuchsia_image_get_kernel(buf, images->verify, + os_data, os_len)) + return NULL; + break; +#endif #ifdef CONFIG_ANDROID_BOOT_IMAGE case IMAGE_FORMAT_ANDROID: printf("## Booting Android Image at 0x%08lx ...\n", img_addr);
diff --git a/common/bootm_os.c b/common/bootm_os.c index 6e463c3..4cc9421 100644 --- a/common/bootm_os.c +++ b/common/bootm_os.c
@@ -477,6 +477,9 @@ #ifdef CONFIG_BOOTM_OPENRTOS [IH_OS_OPENRTOS] = do_bootm_openrtos, #endif +#ifdef CONFIG_FUCHSIA_BOOT_IMAGE + [IH_OS_FUCHSIA] = do_bootm_fuchsia, +#endif }; /* Allow for arch specific config before we boot */
diff --git a/common/image-fuchsia.c b/common/image-fuchsia.c new file mode 100644 index 0000000..e5b143f --- /dev/null +++ b/common/image-fuchsia.c
@@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018 The Fuchsia Authors + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <image.h> +#include <fuchsia/bootdata.h> + +int fuchsia_image_check_header(const void *hdr) +{ + const bootdata_t* bootdata = hdr; + + return (bootdata[0].type == BOOTDATA_CONTAINER && + bootdata[0].extra == BOOTDATA_MAGIC && + bootdata[0].magic == BOOTITEM_MAGIC && + bootdata[1].type == BOOTDATA_KERNEL && + bootdata[1].magic == BOOTITEM_MAGIC) ? 0 : -1; +} + +/** + * fuchsia_image_get_kernel() - processes kernel part of Fuchsia bootdata + * @bootdata: Pointer to bootdata. + * @verify: Checksum verification flag. Currently unimplemented. + * @os_data: Pointer to a ulong variable, will hold os data start + * address. + * @os_len: Pointer to a ulong variable, will hold os data length. + * + * This function returns the os image's start address and length. Also, + * it appends the kernel command line to the bootargs env variable. + * + * Return: Zero, os start address and length on success, + * otherwise on failure. + */ +int fuchsia_image_get_kernel(const void* hdr, int verify, + ulong *os_data, ulong *os_len) +{ + if (fuchsia_image_check_header(hdr)) + return -1; + + const bootdata_t* bootdata = hdr; + + *os_data = (ulong)bootdata; + *os_len = (ulong) bootdata->length + sizeof(bootdata_t); + + return 0; +} + +ulong fuchsia_image_get_end(const void *hdr) +{ + const bootdata_t* container_hdr = hdr; + return (ulong)hdr + container_hdr->length + sizeof(bootdata_t); +} + +ulong fuchsia_image_get_kload(const void *hdr) +{ + return 0x40480000; +} + +ulong fuchsia_image_get_comp(const void *hdr) +{ + return IH_COMP_NONE; +} \ No newline at end of file
diff --git a/common/image.c b/common/image.c index 0f88984..1de9017 100644 --- a/common/image.c +++ b/common/image.c
@@ -880,11 +880,14 @@ if (fdt_check_header(img_addr) == 0) return IMAGE_FORMAT_FIT; #endif +#ifdef CONFIG_FUCHSIA_BOOT_IMAGE + if (fuchsia_image_check_header(img_addr) == 0) + return IMAGE_FORMAT_FUCHSIA; +#endif #ifdef CONFIG_ANDROID_BOOT_IMAGE if (android_image_check_header(img_addr) == 0) return IMAGE_FORMAT_ANDROID; #endif - return IMAGE_FORMAT_INVALID; }
diff --git a/configs/mx8mq_evk_android_defconfig b/configs/mx8mq_evk_android_defconfig index 58383c0..14c99f7 100644 --- a/configs/mx8mq_evk_android_defconfig +++ b/configs/mx8mq_evk_android_defconfig
@@ -37,3 +37,5 @@ CONFIG_SPL_FIT=y CONFIG_SPL_LOAD_FIT=y CONFIG_LZ4=y +CONFIG_VIDEO=y +CONFIG_VIDEO_IMX8_HDMI=y \ No newline at end of file
diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c index b4fec87..2b1bb9c 100755 --- a/drivers/usb/gadget/f_fastboot.c +++ b/drivers/usb/gadget/f_fastboot.c
@@ -23,6 +23,9 @@ #include <linux/usb/gadget.h> #include <linux/usb/composite.h> #include <linux/compiler.h> +#ifdef CONFIG_FUCHSIA_BOOT_IMAGE +#include <fuchsia/bootdata.h> +#endif #include <version.h> #include <g_dnl.h> #ifdef CONFIG_FASTBOOT_FLASH_MMC_DEV @@ -1585,7 +1588,25 @@ hdr = (struct andr_img_hdr *)avb_loadpart->data; if (android_image_check_header(hdr)) { printf("boota: bad boot image magic\n"); +#ifdef CONFIG_FUCHSIA_BOOT_IMAGE + if (fuchsia_image_check_header(hdr) == 0) { + printf("Found Fuchsia Image!!!!!\n"); + const bootdata_t* bootdata = (bootdata_t*) hdr; + printf("Load bootdata at 0x%lx\n",fuchsia_image_get_kload(hdr)); + memcpy((void *)(ulong)(fuchsia_image_get_kload(hdr)), + (void *)hdr, + sizeof(*bootdata) + ALIGN(bootdata->length, hdr->page_size)); + char fboot_addr_start[12]; + char *boot_args[] = { NULL,fboot_addr_start, NULL, NULL}; + boot_args[0] = "bootm"; + sprintf(fboot_addr_start, "0x%lx", fuchsia_image_get_kload(hdr)); + do_bootm(NULL, 0, 2, boot_args); + /* This only happens if image is somehow faulty so we start over */ + do_reset(NULL, 0, 0, NULL); + } +#else goto fail; +#endif } if (avb_result == AVB_AB_FLOW_RESULT_OK) printf(" verify OK, boot '%s%s'\n",
diff --git a/include/bootm.h b/include/bootm.h index 4981377..b7fba6f 100644 --- a/include/bootm.h +++ b/include/bootm.h
@@ -36,6 +36,8 @@ bootm_headers_t *images); extern boot_os_fn do_bootm_linux; +extern boot_os_fn do_bootm_fuchsia; + int do_bootelf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); void lynxkdi_boot(image_header_t *hdr);
diff --git a/include/configs/imx8mq_evk.h b/include/configs/imx8mq_evk.h index 315df99..58e4846 100644 --- a/include/configs/imx8mq_evk.h +++ b/include/configs/imx8mq_evk.h
@@ -302,6 +302,7 @@ /* Framebuffer */ #ifdef CONFIG_VIDEO #define CONFIG_VIDEO_IMXDCSS +#define CONFIG_VIDEO_IMXDCSS_1080P #define CONFIG_VIDEO_BMP_RLE8 #define CONFIG_SPLASH_SCREEN #define CONFIG_SPLASH_SCREEN_ALIGN
diff --git a/include/configs/imx8mq_evk_android.h b/include/configs/imx8mq_evk_android.h index ea19029..41da7ec 100644 --- a/include/configs/imx8mq_evk_android.h +++ b/include/configs/imx8mq_evk_android.h
@@ -7,10 +7,15 @@ #ifndef IMX8MQ_EVK_ANDROID_H #define IMX8MQ_EVK_ANDROID_H +#define CONFIG_FUCHSIA_BOOT_IMAGE +#define CONFIG_IMX8MEVK + #define CONFIG_BOOTLOADER_OFFSET_33K #define CONFIG_BCB_SUPPORT #define CONFIG_CMD_READ +#define CONFIG_SYS_BOOTM_LEN 0x1000000 + #define CONFIG_ENABLE_LOCKSTATUS_SUPPORT #define CONFIG_ANDROID_AB_SUPPORT #define CONFIG_AVB_SUPPORT
diff --git a/include/fuchsia/board/imx8mevk/board-config.h b/include/fuchsia/board/imx8mevk/board-config.h new file mode 100644 index 0000000..5c21ebf --- /dev/null +++ b/include/fuchsia/board/imx8mevk/board-config.h
@@ -0,0 +1,87 @@ +// Copyright 2018 The Fuchsia Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#define PDEV_VID_NXP 9 +#define PDEV_PID_IMX8MEVK 1 + +const char* BOOTLOADER_VERSION = "fuchsia-bootloader=0.03"; + +static const bootdata_cpu_config_t cpu_config = { + .cluster_count = 1, + .clusters = { + { + .cpu_count = 4, + }, + }, +}; + +static const bootdata_mem_range_t mem_config[] = { + { + .type = BOOTDATA_MEM_RANGE_RAM, + .paddr = 0x40000000, + .length = 0xc0000000, // 3GB + }, + { + .type = BOOTDATA_MEM_RANGE_PERIPHERAL, + .paddr = 0, + .length = 0x40000000, + }, +}; + +static const dcfg_simple_t uart_driver = { + .mmio_phys = 0x30860000, + .irq = 58, +}; + +static const dcfg_arm_gicv3_driver_t gicv3_driver = { + .mmio_phys = 0x38800000, + .gicd_offset = 0x00000, + .gicr_offset = 0x80000, + .gicr_stride = 0x20000, + .ipi_base = 9, + // Used for Errata e11171 + .mx8_gpr_phys = 0x30340000, +}; + +static const dcfg_arm_psci_driver_t psci_driver = { + .use_hvc = false, +}; + +static const dcfg_arm_generic_timer_driver_t timer_driver = { + .irq_phys = 30, + .irq_virt = 27, + .freq_override = 8333333, +}; + +static const bootdata_platform_id_t platform_id = { + .vid = PDEV_VID_NXP, + .pid = PDEV_PID_IMX8MEVK, + .board_name = "imx8mevk", +}; + +static void append_board_bootdata(bootdata_t* bootdata) { + // add CPU configuration + append_bootdata(bootdata, BOOTDATA_CPU_CONFIG, 0, &cpu_config, + sizeof(bootdata_cpu_config_t) + + sizeof(bootdata_cpu_cluster_t) * cpu_config.cluster_count); + + // add memory configuration + append_bootdata(bootdata, BOOTDATA_MEM_CONFIG, 0, &mem_config, + sizeof(bootdata_mem_range_t) * (sizeof(mem_config)/sizeof(mem_config[0]))); + + // add kernel drivers + append_bootdata(bootdata, BOOTDATA_KERNEL_DRIVER, KDRV_NXP_IMX_UART, &uart_driver, + sizeof(uart_driver)); + append_bootdata(bootdata, BOOTDATA_KERNEL_DRIVER, KDRV_ARM_GIC_V3, &gicv3_driver, + sizeof(gicv3_driver)); + append_bootdata(bootdata, BOOTDATA_KERNEL_DRIVER, KDRV_ARM_PSCI, &psci_driver, + sizeof(psci_driver)); + append_bootdata(bootdata, BOOTDATA_KERNEL_DRIVER, KDRV_ARM_GENERIC_TIMER, &timer_driver, + sizeof(timer_driver)); + + append_bootdata(bootdata, BOOTDATA_CMDLINE, 0, BOOTLOADER_VERSION, strlen(BOOTLOADER_VERSION) + 1); + + // add platform ID + append_bootdata(bootdata, BOOTDATA_PLATFORM_ID, 0, &platform_id, sizeof(platform_id)); +}
diff --git a/include/fuchsia/bootdata.h b/include/fuchsia/bootdata.h new file mode 100644 index 0000000..7aa791a --- /dev/null +++ b/include/fuchsia/bootdata.h
@@ -0,0 +1,298 @@ +/* + * Copyright (c) 2018 The Fuchsia Authors + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _FUCHSIA_BOOTDATA_H_ +#define _FUCHSIA_BOOTDATA_H_ + +// lsw of sha256("bootdata") +#define BOOTDATA_MAGIC (0x868cf7e6) + +// lsw of sha256("bootitem") +#define BOOTITEM_MAGIC (0xb5781729) + +// Round n up to the next 8 byte boundary +#define BOOTDATA_ALIGN(n) (((n) + 7) & (~7)) + +#define BOOTITEM_NO_CRC32 (0x4a87e8d6) + +// This flag is required. +#define BOOTDATA_FLAG_V2 (0x00010000) + +// Bootdata items with the CRC32 flag must have a valid crc32. +// Otherwise their crc32 field must contain BOOTITEM_NO_CRC32 +#define BOOTDATA_FLAG_CRC32 (0x00020000) + +// Containers are used to wrap a set of bootdata items +// written to a file or partition. The "length" is the +// length of the set of following bootdata items. The +// "extra" is the value BOOTDATA_MAGIC and "flags" is +// set to 0. +#define BOOTDATA_CONTAINER (0x544f4f42) // BOOT + +// BOOTFS images. The "extra" field is the decompressed +// size of the image, if compressed, otherwise the same +// as the "length" field. +#define BOOTDATA_BOOTFS_BOOT (0x42534642) // BFSB +#define BOOTDATA_BOOTFS_SYSTEM (0x53534642) // BFSS +#define BOOTDATA_BOOTFS_DISCARD (0x58534642) // BFSX + +#define BOOTDATA_BOOTFS_MASK (0x00FFFFFF) +#define BOOTDATA_BOOTFS_TYPE (0x00534642) // BFS\0 + +// Virtual disk images. The header fields and compression protocol +// are the same as for the BOOTFS types, but the payload before +// compression is a raw disk image rather than BOOTFS format. +#define BOOTDATA_RAMDISK (0x4b534452) // RDSK + +// A Zircon Kernel Image +// Content: bootdata_kernel_t +#define BOOTDATA_KERNEL (0x4c4e524b) // KRNL + +// A Zircon Partition Map +// Content: bootdata_partition_map_t +#define BOOTDATA_PARTITION_MAP (0x54524150) // PART + +// Flag indicating that the bootfs is compressed. +#define BOOTDATA_BOOTFS_FLAG_COMPRESSED (1 << 0) + + +// These items are for passing from bootloader to kernel + +// Kernel Command Line String +// Content: uint8_t[] +#define BOOTDATA_CMDLINE (0x4c444d43) // CMDL + +// ACPI Root Table Pointer +// Content: uint64_t phys addr +#define BOOTDATA_ACPI_RSDP (0x50445352) // RSDP + +// SMBIOS entry point pointer +// Content: uint64_t phys addr +#define BOOTDATA_SMBIOS (0x49424d53) // SMBI + +// Framebuffer Parameters +// Content: bootdata_swfb_t +#define BOOTDATA_FRAMEBUFFER (0x42465753) // SWFB + +// Debug Serial Port +// Content: bootdata_uart_t +#define BOOTDATA_DEBUG_UART (0x54524155) // UART + +// Platform ID Information +// Content: bootdata_platform_id_t +#define BOOTDATA_PLATFORM_ID (0x44494C50) // PLID + +// Memory which will persist across warm boots +// Content bootdata_lastlog_nvram_t +#define BOOTDATA_LASTLOG_NVRAM (0x4c4c564e) // NVLL + +// This reflects a typo we need to support for a while +#define BOOTDATA_LASTLOG_NVRAM2 (0x4c4c5643) // CVLL + +// E820 Memory Table +// Content: e820entry[] +#define BOOTDATA_E820_TABLE (0x30323845) // E820 + +// EFI Memory Map +// Content: a uint64_t entrysz followed by a set of +// efi_memory_descriptor aligned on entrysz +#define BOOTDATA_EFI_MEMORY_MAP (0x4d494645) // EFIM + +// EFI System Table +// Content: a uint64_t physical address of the table +#define BOOTDATA_EFI_SYSTEM_TABLE (0x53494645) // EFIS + +// Last crashlog +// Content: ascii/utf8 log data from previous boot +#define BOOTDATA_LAST_CRASHLOG (0x4d4f4f42) // BOOM + +// CPU configuration +// Content: bootdata_cpu_config_t +#define BOOTDATA_CPU_CONFIG (0x43555043) // CPUC + +// Memory configuration +// Content: one or more of bootdata_mem_range_t (count determined by bootdata_t length) +#define BOOTDATA_MEM_CONFIG (0x434D454D) // MEMC + +// Kernel driver configuration +// Content: driver specific struct, with type determined by bootdata "extra" field +#define BOOTDATA_KERNEL_DRIVER (0x5652444B) // KDRV + +#define BOOTDATA_IGNORE (0x50494b53) // SKIP + +// BootData header, describing the type and size of data +// used to initialize the system. All fields are little-endian. +// +// BootData headers in a stream must be 8-byte-aligned. +// +// The length field specifies the actual payload length +// and does not include the size of padding. +typedef struct { + // Boot data type + uint32_t type; + + // Size of the payload following this header + uint32_t length; + + // type-specific extra data + // For CONTAINER this is MAGIC. + // For BOOTFS this is the decompressed size. + uint32_t extra; + + // Flags for the boot data. See flag descriptions for each type. + uint32_t flags; + + // For future expansion. Set to 0. + uint32_t reserved0; + uint32_t reserved1; + + // Must be BOOTITEM_MAGIC + uint32_t magic; + + // Must be the CRC32 of payload if FLAG_CRC32 is set, + // otherwise must be BOOTITEM_NO_CRC32 + uint32_t crc32; +} bootdata_t; + +typedef struct { + uint64_t base; // physical base addr + uint32_t width; + uint32_t height; + uint32_t stride; + uint32_t format; +} bootdata_swfb_t; + +typedef struct { + uint64_t entry64; + uint64_t reserved; +} bootdata_kernel_t; + +typedef struct { + bootdata_t hdr_file; + bootdata_t hdr_kernel; + bootdata_kernel_t data_kernel; +} zircon_kernel_t; + +#define BOOTDATA_PART_NAME_LEN 32 +#define BOOTDATA_PART_GUID_LEN 16 + +typedef struct { + uint8_t type_guid[BOOTDATA_PART_GUID_LEN]; + uint8_t uniq_guid[BOOTDATA_PART_GUID_LEN]; + uint64_t first_block; + uint64_t last_block; + uint64_t flags; + char name[BOOTDATA_PART_NAME_LEN]; +} bootdata_partition_t; + +typedef struct { + uint64_t block_count; + uint64_t block_size; + // pdev_vid/pid/did are used to match partition map to + // appropriate block device on the platform bus + uint32_t pdev_vid; + uint32_t pdev_pid; + uint32_t pdev_did; + uint32_t partition_count; + char guid[BOOTDATA_PART_GUID_LEN]; + bootdata_partition_t partitions[]; +} bootdata_partition_map_t; + +typedef struct { + uint64_t base; + uint64_t length; +} bootdata_nvram_t; + +#define BOOTDATA_UART_NONE 0 +#define BOOTDATA_UART_PC_PORT 1 +#define BOOTDATA_UART_PC_MMIO 2 +typedef struct { + uint64_t base; + uint32_t type; + uint32_t irq; +} bootdata_uart_t; + +typedef struct { + uint32_t vid; + uint32_t pid; + char board_name[32]; +} bootdata_platform_id_t; + +typedef struct { + uint32_t cpu_count; // number of CPU cores in the cluster + uint32_t type; // for future use + uint32_t flags; // for future use + uint32_t reserved; +} bootdata_cpu_cluster_t; + +typedef struct { + uint32_t cluster_count; + uint32_t reserved[3]; + bootdata_cpu_cluster_t clusters[]; +} bootdata_cpu_config_t; + +#define BOOTDATA_MEM_RANGE_RAM 1 +#define BOOTDATA_MEM_RANGE_PERIPHERAL 2 +#define BOOTDATA_MEM_RANGE_RESERVED 3 +typedef struct { + uint64_t paddr; + uint64_t length; + uint32_t type; + uint32_t reserved; +} bootdata_mem_range_t; + +/* EFI Variable for Crash Log */ +#define ZIRCON_VENDOR_GUID \ + {0x82305eb2, 0xd39e, 0x4575, {0xa0, 0xc8, 0x6c, 0x20, 0x72, 0xd0, 0x84, 0x4c}} +#define ZIRCON_CRASHLOG_EFIVAR \ + { 'c', 'r', 'a', 's', 'h', 'l', 'o', 'g', 0 }; +#define ZIRCON_CRASHLOG_EFIATTR \ + (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS) + + +// BOOTFS is a trivial "filesystem" format +// +// It consists of a bootfs_header_t +// +// Followed by a series of bootfs_entry_t's of: +// name length (32bit le) +// data size (32bit le) +// data offset (32bit le) +// namedata (namelength bytes, includes \0) +// +// - data offsets must be page aligned (multiple of 4096) +// - entries start on uint32 boundaries + +//lsw of sha256("bootfs") +#define BOOTFS_MAGIC (0xa56d3ff9) + +#define BOOTFS_MAX_NAME_LEN 256 + +typedef struct bootfs_header { + // magic value BOOTFS_MAGIC + uint32_t magic; + + // total size of all bootfs_entry_t's + // does not include the size of the bootfs_header_t + uint32_t dirsize; + + // 0, 0 + uint32_t reserved0; + uint32_t reserved1; +} bootfs_header_t; + +typedef struct bootfs_entry { + uint32_t name_len; + uint32_t data_len; + uint32_t data_off; + char name[]; +} bootfs_entry_t; + +#define BOOTFS_ALIGN(nlen) (((nlen) + 3) & (~3)) +#define BOOTFS_RECSIZE(entry) \ + (sizeof(bootfs_entry_t) + BOOTFS_ALIGN(entry->name_len)) + +#endif \ No newline at end of file
diff --git a/include/fuchsia/driver-config.h b/include/fuchsia/driver-config.h new file mode 100644 index 0000000..1a79267 --- /dev/null +++ b/include/fuchsia/driver-config.h
@@ -0,0 +1,76 @@ +// Copyright 2018 The Fuchsia Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#pragma once + +// BOOTDATA_KERNEL_DRIVER bootdata types +#define KDRV_ARM_PSCI 0x49435350 // 'PSCI' +#define KDRV_ARM_GIC_V2 0x32434947 // 'GIC2' +#define KDRV_ARM_GIC_V3 0x33434947 // 'GIC3' +#define KDRV_ARM_GENERIC_TIMER 0x4D495441 // 'ATIM' +#define KDRV_PL011_UART 0x55304C50 // 'PL0U' +#define KDRV_AMLOGIC_UART 0x554C4D41 // 'AMLU' +#define KDRV_NXP_IMX_UART 0x55584D49 // 'IMXU' +#define KDRV_HISILICON_POWER 0x4F505348 // 'HSPO' +#define KDRV_AMLOGIC_HDCP 0x484C4D41 // 'AMLH' + +// kernel driver struct that can be used for simple drivers +// used by KDRV_PL011_UART, KDRV_AMLOGIC_UART and KDRV_NXP_IMX_UART +typedef struct { + uint64_t mmio_phys; + uint32_t irq; +} dcfg_simple_t; + +// for KDRV_ARM_PSCI +typedef struct { + bool use_hvc; + uint64_t shutdown_args[3]; + uint64_t reboot_args[3]; + uint64_t reboot_bootloader_args[3]; +} dcfg_arm_psci_driver_t; + +// for KDRV_ARM_GIC_V2 +typedef struct { + uint64_t mmio_phys; + uint64_t msi_frame_phys; + uint64_t gicd_offset; + uint64_t gicc_offset; + uint64_t gich_offset; + uint64_t gicv_offset; + uint32_t ipi_base; + bool optional; + bool use_msi; +} dcfg_arm_gicv2_driver_t; + +// for KDRV_ARM_GIC_V3 +typedef struct { + uint64_t mmio_phys; + uint64_t gicd_offset; + uint64_t gicr_offset; + uint64_t gicr_stride; + uint64_t mx8_gpr_phys; + uint32_t ipi_base; + bool optional; +} dcfg_arm_gicv3_driver_t; + +// for KDRV_ARM_GENERIC_TIMER +typedef struct { + uint32_t irq_phys; + uint32_t irq_virt; + uint32_t irq_sphys; + uint32_t freq_override; +} dcfg_arm_generic_timer_driver_t; + +// for KDRV_HISILICON_POWER +typedef struct { + uint64_t sctrl_phys; + uint64_t pmu_phys; +} dcfg_hisilicon_power_driver_t; + +// for KDRV_AMLOGIC_HDCP +typedef struct { + uint64_t preset_phys; + uint64_t hiu_phys; + uint64_t hdmitx_phys; +} dcfg_amlogic_hdcp_driver_t; \ No newline at end of file
diff --git a/include/image.h b/include/image.h index 6d60de8..d5d12e1 100644 --- a/include/image.h +++ b/include/image.h
@@ -160,6 +160,7 @@ IH_OS_OSE, /* OSE */ IH_OS_PLAN9, /* Plan 9 */ IH_OS_OPENRTOS, /* OpenRTOS */ + IH_OS_FUCHSIA, /* Fuchsia */ IH_OS_COUNT, }; @@ -558,6 +559,7 @@ #endif #define IMAGE_FORMAT_FIT 0x02 /* new, libfdt based format */ #define IMAGE_FORMAT_ANDROID 0x03 /* Android boot image */ +#define IMAGE_FORMAT_FUCHSIA 0x04 /* Fuchsia boot image */ ulong genimg_get_kernel_addr_fit(char * const img_addr, const char **fit_uname_config, @@ -1329,4 +1331,14 @@ .handler = _handler, \ } +#if defined(CONFIG_FUCHSIA_BOOT_IMAGE) +struct andr_img_hdr; +int fuchsia_image_check_header(const void *hdr); +int fuchsia_image_get_kernel(const void* hdr, int verify, + ulong *os_data, ulong *os_len); +ulong fuchsia_image_get_end(const void *hdr); +ulong fuchsia_image_get_kload(const void *hdr); +ulong fuchsia_image_get_comp(const void *hdr); +#endif /* CONFIG_FUCHSIA_BOOT_IMAGE */ + #endif /* __IMAGE_H__ */
diff --git a/scripts/config_whitelist.txt b/scripts/config_whitelist.txt index ab1df16..07bddd9 100644 --- a/scripts/config_whitelist.txt +++ b/scripts/config_whitelist.txt
@@ -1,3 +1,4 @@ +CONFIG_ CONFIG_16BIT CONFIG_33 CONFIG_400MHZ_MODE @@ -135,6 +136,7 @@ CONFIG_ARMADA100_FEC CONFIG_ARMADA168 CONFIG_ARMADA_39X +CONFIG_ARMADA_XXX CONFIG_ARMCORTEXA9 CONFIG_ARMV7_PSCI_1_0 CONFIG_ARMV7_SECURE_BASE @@ -221,6 +223,7 @@ CONFIG_AUTONEG_TIMEOUT CONFIG_AUTO_COMPLETE CONFIG_AUTO_ZRELADDR +CONFIG_AVB_DEBUG CONFIG_AVB_FUSE CONFIG_AVB_FUSE_BANK_END CONFIG_AVB_FUSE_BANK_SIZEW @@ -375,6 +378,7 @@ CONFIG_BOOT_OS_NET CONFIG_BOOT_PARAMS_ADDR CONFIG_BOOT_PCI +CONFIG_BOOT_QSPI CONFIG_BOOT_RETRY_MIN CONFIG_BOOT_RETRY_TIME CONFIG_BOUNCE_BUFFER @@ -461,6 +465,7 @@ CONFIG_CMD_BLOB CONFIG_CMD_BMODE CONFIG_CMD_BMP +CONFIG_CMD_BOOTAUX CONFIG_CMD_BOOTLDR CONFIG_CMD_BSP CONFIG_CMD_CBFS @@ -679,13 +684,13 @@ CONFIG_DBAU1000 CONFIG_DBAU1X00 CONFIG_DBGU -CONFIG_DBG_MONITOR CONFIG_DB_784MP_GP CONFIG_DCACHE CONFIG_DCACHE_OFF CONFIG_DCACHE_WB CONFIG_DCFG_ADDR CONFIG_DCLK_DIV +CONFIG_DDR3L_MT41K256M16HA CONFIG_DDR_ CONFIG_DDR_2HCLK CONFIG_DDR_2T_TIMING @@ -832,6 +837,7 @@ CONFIG_DTT_PWM_LOOKUPTABLE CONFIG_DTT_SENSORS CONFIG_DTT_TACH_LIMIT +CONFIG_DUALX8_RAM CONFIG_DUOVERO CONFIG_DV_USBPHY_CTL CONFIG_DWC2_DFLT_SPEED_FULL @@ -932,6 +938,7 @@ CONFIG_EMMC_BOOT CONFIG_EMU CONFIG_ENABLE_36BIT_PHYS +CONFIG_ENABLE_DDR_TRAINING_DEBUG CONFIG_ENABLE_LOCKSTATUS_SUPPORT CONFIG_ENABLE_MMU CONFIG_ENABLE_MUST_CHECK @@ -1101,6 +1108,7 @@ CONFIG_FEC2_PHY CONFIG_FEC_10MBIT CONFIG_FEC_AN_TIMEOUT +CONFIG_FEC_ENABLE_MAX7322 CONFIG_FEC_ENET CONFIG_FEC_ENET_DEV CONFIG_FEC_FIXED_SPEED @@ -1112,6 +1120,7 @@ CONFIG_FEROCEON_88FR131 CONFIG_FFUART CONFIG_FILE +CONFIG_FIRMWARE_2ND_BOOT CONFIG_FIRMWARE_OFFSET CONFIG_FIRMWARE_SIZE CONFIG_FIT_DISABLE_SHA256 @@ -1138,6 +1147,7 @@ CONFIG_FMAN_ENET CONFIG_FM_PLAT_CLK_DIV CONFIG_FO300 +CONFIG_FOO CONFIG_FORCE_DDR_DATA_BUS_WIDTH_32 CONFIG_FORMIKE CONFIG_FPGA_COUNT @@ -1271,6 +1281,7 @@ CONFIG_FTUART010_03_BASE CONFIG_FTWDT010_BASE CONFIG_FTWDT010_WATCHDOG +CONFIG_FUCHSIA_BOOT_IMAGE CONFIG_FUNC_ISRAM_ADDR CONFIG_FWUPDATE_DEBUG CONFIG_FZOTG266HD0A_BASE @@ -1457,6 +1468,9 @@ CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRTP CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING4_PWRDOWNEXIT CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING4_SELFRFSHEXIT +CONFIG_HPS_SDR_CTRLCFG_EXTRATIME1_CFG_EXTRA_CTL_CLK_RD_TO_WR +CONFIG_HPS_SDR_CTRLCFG_EXTRATIME1_CFG_EXTRA_CTL_CLK_RD_TO_WR_BC +CONFIG_HPS_SDR_CTRLCFG_EXTRATIME1_CFG_EXTRA_CTL_CLK_RD_TO_WR_DIFF_CHIP CONFIG_HPS_SDR_CTRLCFG_FIFOCFG_INCSYNC CONFIG_HPS_SDR_CTRLCFG_FIFOCFG_SYNCMODE CONFIG_HPS_SDR_CTRLCFG_FPGAPORTRST @@ -1523,6 +1537,7 @@ CONFIG_I2C_REPEATED_START CONFIG_I2C_RTC_ADDR CONFIG_I2C_TIMEOUT +CONFIG_IBE_OBE CONFIG_IBM_EMAC4_V4 CONFIG_ICACHE CONFIG_ICACHE_OFF @@ -1550,6 +1565,8 @@ CONFIG_IMAGE_FORMAT_LEGACY CONFIG_IMX CONFIG_IMX6_PWM_PER_CLK +CONFIG_IMX8MEVK +CONFIG_IMX_FIXED_IVT_OFFSET CONFIG_IMX_HDMI CONFIG_IMX_NAND CONFIG_IMX_OTP @@ -1598,6 +1615,7 @@ CONFIG_IRAM_TOP CONFIG_IRDA_BASE CONFIG_ISP1362_USB +CONFIG_IS_ CONFIG_IS_BUILTIN CONFIG_IS_ENABLED CONFIG_IS_INVALID @@ -1746,6 +1764,7 @@ CONFIG_KW88F6192 CONFIG_KW88F6281 CONFIG_KW88F6702 +CONFIG_KWB_SECURE CONFIG_KYOCERA_KCS057QV1AJ CONFIG_KZM_A9_GT CONFIG_L1_INIT_RAM @@ -1887,6 +1906,8 @@ CONFIG_MARVELL_GPIO CONFIG_MARVELL_MFP CONFIG_MASK_AER_AO +CONFIG_MAX7322_I2C_ADDR +CONFIG_MAX7322_I2C_BUS CONFIG_MAX_DSP_CPUS CONFIG_MAX_FPGA_DEVICES CONFIG_MAX_MEM_MAPPED @@ -1917,6 +1938,7 @@ CONFIG_MENUPROMPT CONFIG_MENU_SHOW CONFIG_MFG_ENV_SETTINGS +CONFIG_MFG_NAND_PARTITION CONFIG_MGCOGE CONFIG_MGCOGE3NE CONFIG_MIGO_R @@ -2051,6 +2073,7 @@ CONFIG_MUNICES CONFIG_MUSB_HOST CONFIG_MV88E61XX_CPU_PORT +CONFIG_MV88E61XX_FIXED_PORTS CONFIG_MV88E61XX_PHY_PORTS CONFIG_MVEBU_MMC CONFIG_MVGBE @@ -2082,8 +2105,6 @@ CONFIG_MX6DL_LPDDR2 CONFIG_MX6DQ_LPDDR2 CONFIG_MX6SX_SABRESD_REVA -CONFIG_MX6UL_14X14_EVK_EMMC_REWORK -CONFIG_MXC_EPDC CONFIG_MXC_GPIO CONFIG_MXC_GPT_HCLK CONFIG_MXC_KEYMAPPING @@ -2237,7 +2258,6 @@ CONFIG_PALMAS_USB_SS_PWR CONFIG_PANIC_HANG CONFIG_PARAVIRT -CONFIG_PARTITION_UUIDS CONFIG_PATA_BFIN CONFIG_PATI CONFIG_PB1000 @@ -2444,6 +2464,7 @@ CONFIG_POWER_TPS65217 CONFIG_POWER_TPS65218 CONFIG_POWER_TPS65910 +CONFIG_PPA_KEY_HASH CONFIG_PPC4XX_RAPIDIO_DEBUG CONFIG_PPC4XX_RAPIDIO_IN_BAR_USE_OCM CONFIG_PPC4XX_RAPIDIO_LOOPBACK @@ -2498,6 +2519,8 @@ CONFIG_QEMU_MIPS CONFIG_QIXIS_I2C_ACCESS CONFIG_QSPI +CONFIG_QSPI_BASE +CONFIG_QSPI_MEMMAP_BASE CONFIG_QSPI_QUAD_SUPPORT CONFIG_QSPI_SEL_GPIO CONFIG_QUOTA @@ -2676,6 +2699,7 @@ CONFIG_SCLK1_DIV CONFIG_SCLK_DIV CONFIG_SCLK_HZ +CONFIG_SCM_EVB CONFIG_SCSI CONFIG_SCSI_AHCI CONFIG_SCSI_AHCI_PLAT @@ -2872,7 +2896,6 @@ CONFIG_SOFT_I2C_I2C9_SDA CONFIG_SOFT_I2C_MULTI_BUS CONFIG_SOFT_I2C_READ_REPEATED_START -CONFIG_SOFT_SPI CONFIG_SOFT_TWS CONFIG_SOURCE CONFIG_SPARSE_RCU_POINTER @@ -2914,6 +2937,7 @@ CONFIG_SPI_DATAFLASH_WRITE_VERIFY CONFIG_SPI_FLASH_ALL CONFIG_SPI_FLASH_ISSI +CONFIG_SPI_FLASH_PROTECTION CONFIG_SPI_FLASH_QUAD CONFIG_SPI_FLASH_SIZE CONFIG_SPI_HALF_DUPLEX @@ -2921,6 +2945,7 @@ CONFIG_SPI_LENGTH CONFIG_SPI_N25Q256A_RESET CONFIG_SPLASHIMAGE_GUARD +CONFIG_SPLASH_IS_IN_MMC CONFIG_SPLASH_SCREEN CONFIG_SPLASH_SCREEN_ALIGN CONFIG_SPLASH_SOURCE @@ -2935,12 +2960,14 @@ CONFIG_SPL_BOOT_DEVICE CONFIG_SPL_BSS_MAX_SIZE CONFIG_SPL_BSS_START_ADDR +CONFIG_SPL_BUILD CONFIG_SPL_CMT CONFIG_SPL_CMT_DEBUG CONFIG_SPL_COMMON_INIT_DDR CONFIG_SPL_CONSOLE CONFIG_SPL_ETH_DEVICE CONFIG_SPL_FLUSH_IMAGE +CONFIG_SPL_FOO CONFIG_SPL_FRAMEWORK CONFIG_SPL_FSL_PBL CONFIG_SPL_FS_LOAD_ARGS_NAME @@ -3223,8 +3250,10 @@ CONFIG_SYS_BOOT_EEPROM_PAGE_WRITE_BITS CONFIG_SYS_BOOT_GET_CMDLINE CONFIG_SYS_BOOT_GET_KBD +CONFIG_SYS_BOOT_NAND +CONFIG_SYS_BOOT_QSPI CONFIG_SYS_BOOT_RAMDISK_HIGH -CONFIG_SYS_BOOT_SPINOR +CONFIG_SYS_BOOT_SATA CONFIG_SYS_BR0_64M CONFIG_SYS_BR0_8M CONFIG_SYS_BR0_PRELIM @@ -4146,7 +4175,6 @@ CONFIG_SYS_FSL_ESDHC_ADDR CONFIG_SYS_FSL_ESDHC_BE CONFIG_SYS_FSL_ESDHC_BROKEN_TIMEOUT -CONFIG_SYS_FSL_ESDHC_FORCE_VSELECT CONFIG_SYS_FSL_ESDHC_HAS_DDR_MODE CONFIG_SYS_FSL_ESDHC_LE CONFIG_SYS_FSL_ESDHC_NUM @@ -4943,6 +4971,7 @@ CONFIG_SYS_LS_MC_DRAM_DPC_OFFSET CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET CONFIG_SYS_LS_MC_FW_IN_DDR +CONFIG_SYS_LS_PPA_ESBC_ADDR CONFIG_SYS_LS_PPA_FW_IN_xxx CONFIG_SYS_M41T11_BASE_YEAR CONFIG_SYS_M41T11_EXT_CENTURY_DATA @@ -6389,6 +6418,7 @@ CONFIG_SYS_USE_NOR CONFIG_SYS_USE_NORFLASH CONFIG_SYS_USE_PPCENV +CONFIG_SYS_USE_QSPI CONFIG_SYS_USE_SERIALFLASH CONFIG_SYS_USE_SPIFLASH CONFIG_SYS_USE_UBI @@ -6446,6 +6476,7 @@ CONFIG_SYS_XLB_PIPELINING CONFIG_SYS_XSVF_DEFAULT_ADDR CONFIG_SYS_XWAY_EBU_BOOTCFG +CONFIG_SYS_XXX CONFIG_SYS_ZYNQ_QSPI_WAIT CONFIG_SYS_ZYNQ_SPI_WAIT CONFIG_SYS_i2C_FSL @@ -6499,6 +6530,7 @@ CONFIG_TMU_CMD_DTT CONFIG_TMU_TIMER CONFIG_TOTAL5200 +CONFIG_TPL_BUILD CONFIG_TPL_DRIVERS_MISC_SUPPORT CONFIG_TPL_PAD_TO CONFIG_TPM_TIS_BASE_ADDRESS @@ -6565,6 +6597,7 @@ CONFIG_TZSW_RESERVED_DRAM_SIZE CONFIG_T_SH7706LSR CONFIG_UART_BASE +CONFIG_UART_BASE_CLOCK CONFIG_UART_BR_PRELIM CONFIG_UART_CONSOLE CONFIG_UART_CONSOLE_IS_JTAG @@ -6684,6 +6717,7 @@ CONFIG_USB_ETH_RNDIS CONFIG_USB_ETH_SUBSET CONFIG_USB_EXT2_BOOT +CONFIG_USB_FASTBOOT_BUF_SIZE CONFIG_USB_FAT_BOOT CONFIG_USB_FREQ CONFIG_USB_FUNCTION_MASS_STORAGE @@ -6750,6 +6784,7 @@ CONFIG_USB_XHCI_KEYSTONE CONFIG_USB_XHCI_OMAP CONFIG_USB_XHCI_PCI +CONFIG_USB_XHCI_UNIPHIER CONFIG_USER_LOWLEVEL_INIT CONFIG_USE_FDT CONFIG_USE_INTERRUPT @@ -6758,6 +6793,7 @@ CONFIG_USE_NETDEV CONFIG_USE_NOR CONFIG_USE_ONENAND_BOARD_INIT +CONFIG_USE_PLUGIN CONFIG_USE_SPIFLASH CONFIG_USE_STDINT CONFIG_USE_TTY @@ -6787,6 +6823,7 @@ CONFIG_VIDEO_DT_SIMPLEFB CONFIG_VIDEO_FONT_4X6 CONFIG_VIDEO_GIS +CONFIG_VIDEO_IMXDCSS_1080P CONFIG_VIDEO_LCD_I2C_BUS CONFIG_VIDEO_LOGO CONFIG_VIDEO_MB862xx @@ -6894,3 +6931,6 @@ CONFIG_ZYNQ_SDHCI_MIN_FREQ CONFIG_ZYNQ_SERIAL CONFIG_eTSEC_MDIO_BUS +CONFIG_n +CONFIG_prefix +CONFIG_xxx