| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* |
| * Copyright (C) 2020 Marvell International Ltd. |
| */ |
| |
| /* |
| * Bootloader definitions that are shared with other programs |
| */ |
| |
| #ifndef __CVMX_BOOTLOADER__ |
| #define __CVMX_BOOTLOADER__ |
| |
| /* |
| * The bootloader_header_t structure defines the header that is present |
| * at the start of binary u-boot images. This header is used to locate |
| * the bootloader image in NAND, and also to allow verification of images |
| * for normal NOR booting. This structure is placed at the beginning of a |
| * bootloader binary image, and remains in the executable code. |
| */ |
| #define BOOTLOADER_HEADER_MAGIC 0x424f4f54 /* "BOOT" in ASCII */ |
| |
| #define BOOTLOADER_HEADER_COMMENT_LEN 64 |
| #define BOOTLOADER_HEADER_VERSION_LEN 64 |
| /* limited by the space to the next exception handler */ |
| #define BOOTLOADER_HEADER_MAX_SIZE 0x200 |
| |
| #define BOOTLOADER_HEADER_CURRENT_MAJOR_REV 1 |
| #define BOOTLOADER_HEADER_CURRENT_MINOR_REV 2 |
| /* |
| * Revision history |
| * 1.1 Initial released revision. (SDK 1.9) |
| * 1.2 TLB based relocatable image (SDK 2.0) |
| */ |
| |
| #ifndef __ASSEMBLY__ |
| struct bootloader_header { |
| uint32_t jump_instr; /* |
| * Jump to executable code following the |
| * header. This allows this header to be |
| * (and remain) part of the executable image) |
| */ |
| uint32_t nop_instr; /* Must be 0x0 */ |
| uint32_t magic; /* Magic number to identify header */ |
| uint32_t hcrc; /* CRC of all of header excluding this field */ |
| |
| uint16_t hlen; /* Length of header in bytes */ |
| uint16_t maj_rev; /* Major revision */ |
| uint16_t min_rev; /* Minor revision */ |
| uint16_t board_type; /* Board type that the image is for */ |
| |
| uint32_t dlen; /* Length of data (following header) in bytes */ |
| uint32_t dcrc; /* CRC of data */ |
| uint64_t address; /* Mips virtual address */ |
| uint32_t flags; |
| uint16_t image_type; /* Defined in bootloader_image_t enum */ |
| uint16_t resv0; /* pad */ |
| |
| uint32_t reserved1; |
| uint32_t reserved2; |
| uint32_t reserved3; |
| uint32_t reserved4; |
| |
| /* Optional, for descriptive purposes */ |
| char comment_string[BOOTLOADER_HEADER_COMMENT_LEN]; |
| /* Optional, for descriptive purposes */ |
| char version_string[BOOTLOADER_HEADER_VERSION_LEN]; |
| } __packed; |
| |
| /* Defines for flag field */ |
| #define BL_HEADER_FLAG_FAILSAFE 1 |
| |
| enum bootloader_image { |
| BL_HEADER_IMAGE_UNKNOWN = 0x0, |
| BL_HEADER_IMAGE_STAGE2, /* Binary bootloader stage2 image */ |
| BL_HEADER_IMAGE_STAGE3, /* Binary bootloader stage3 image */ |
| BL_HEADER_IMAGE_NOR, /* Binary bootloader for NOR boot */ |
| BL_HEADER_IMAGE_PCIBOOT, /* Binary bootloader for PCI boot */ |
| BL_HEADER_IMAGE_UBOOT_ENV, /* Environment for u-boot */ |
| /* Bootloader before U-Boot (stage 1/1.5) */ |
| BL_HEADER_IMAGE_PRE_UBOOT, |
| BL_HEADER_IMAGE_STAGE1, /* NOR stage 1 bootloader */ |
| BL_HEADER_IMAGE_MAX, |
| /* Range for customer private use. Will not be used by Cavium Inc. */ |
| BL_HEADER_IMAGE_CUST_RESERVED_MIN = 0x1000, |
| BL_HEADER_IMAGE_CUST_RESERVED_MAX = 0x1fff |
| }; |
| |
| #endif /* __ASSEMBLY__ */ |
| |
| /* |
| * Maximum address searched for NAND boot images and environments. |
| * This is used by stage1 and stage2. |
| */ |
| #define MAX_NAND_SEARCH_ADDR 0x800000 |
| |
| /* Maximum address to look for start of normal bootloader */ |
| #define MAX_NOR_SEARCH_ADDR 0x400000 |
| |
| /* |
| * Defines for RAM based environment set by the host or the previous |
| * bootloader in a chain boot configuration. |
| */ |
| |
| #define U_BOOT_RAM_ENV_ADDR 0x1000 |
| #define U_BOOT_RAM_ENV_SIZE 0x1000 |
| #define U_BOOT_RAM_ENV_CRC_SIZE 0x4 |
| #define U_BOOT_RAM_ENV_ADDR_2 (U_BOOT_RAM_ENV_ADDR + U_BOOT_RAM_ENV_SIZE) |
| /* Address of environment in L2 cache if booted from cache */ |
| #define U_BOOT_CACHE_ENV_ADDR 0x000ff000 |
| /* Size of environment in L2 cache */ |
| #define U_BOOT_CACHE_ENV_SIZE 0x1000 |
| |
| /* Board numbers and names */ |
| |
| /* Type defines for board and chip types */ |
| enum cvmx_board_types_enum { |
| CVMX_BOARD_TYPE_NULL = 0, |
| CVMX_BOARD_TYPE_SIM = 1, |
| /* Special 'generic' board type, supports many boards */ |
| CVMX_BOARD_TYPE_GENERIC = 28, |
| CVMX_BOARD_TYPE_EBB7304 = 76, |
| CVMX_BOARD_TYPE_MAX, |
| /* NOTE: 256-257 are being used by a customer. */ |
| |
| /* |
| * The range from CVMX_BOARD_TYPE_MAX to |
| * CVMX_BOARD_TYPE_CUST_DEFINED_MIN is reserved |
| * for future SDK use. |
| */ |
| |
| /* |
| * Set aside a range for customer boards. These numbers are managed |
| * by Cavium. |
| */ |
| CVMX_BOARD_TYPE_CUST_DEFINED_MIN = 10000, |
| CVMX_BOARD_TYPE_CUST_DEFINED_MAX = 20000, |
| |
| /* |
| * Set aside a range for customer private use. The SDK won't |
| * use any numbers in this range. |
| */ |
| CVMX_BOARD_TYPE_CUST_PRIVATE_MIN = 20001, |
| CVMX_BOARD_TYPE_CUST_PRIVATE_MAX = 30000, |
| }; |
| |
| /* Functions to return string based on type */ |
| /* Skip CVMX_BOARD_TYPE_ */ |
| #define ENUM_BRD_TYPE_CASE(x) case x: return(#x + 16) |
| |
| static inline const char |
| *cvmx_board_type_to_string(enum cvmx_board_types_enum type) |
| { |
| switch (type) { |
| ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_NULL); |
| ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_SIM); |
| ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_GENERIC); |
| ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_EBB7304); |
| ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_MAX); |
| |
| /* Customer boards listed here */ |
| ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_DEFINED_MIN); |
| ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_DEFINED_MAX); |
| |
| /* Customer private range */ |
| ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_PRIVATE_MIN); |
| ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_PRIVATE_MAX); |
| } |
| |
| return "Unsupported Board"; |
| } |
| |
| #endif /* __CVMX_BOOTLOADER__ */ |