// Copyright 2016 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

#ifndef __ASSEMBLER__
#include <zircon/compiler.h>
#include <stdbool.h>
#include <stdint.h>
#endif

// 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)

// Bootdata types that have least significant byte set to 'm'
// are reserved for driver metadata
#define BOOTDATA_KIND_METADATA   (0x0000006D)
#define BOOTDATA_KIND_MASK       (0x000000FF)

// 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
// The bootdata_t.extra field is used as a board specific index
// to specify which device the partition map applies to.
#define BOOTDATA_PARTITION_MAP    (0x5452506D) // mPRT

// MAC Address for Ethernet, Wifi, Bluetooth, etc.
// Content: uint8_t[] (variable length based on type of MAC address)
// The bootdata_t.extra field is used as a board specific index
// to specify which device the MAC address applies to.
#define BOOTDATA_MAC_ADDRESS      (0x43414D6D) // mMAC

// 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

#ifndef __ASSEMBLER__
__BEGIN_CDECLS;

// 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;

#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;
    uint32_t partition_count;
    uint32_t reserved;
    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)

__END_CDECLS;


// 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_PAGE_SIZE (4096)
#define BOOTFS_PAGE_ALIGN(size) \
    (((size) + BOOTFS_PAGE_SIZE - 1) & -BOOTFS_PAGE_SIZE)

#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))

static inline bool bootdata_is_metadata(uint32_t type) {
    return ((type & BOOTDATA_KIND_MASK) == BOOTDATA_KIND_METADATA);
}

#endif
