~funderscore blog cgit wiki get in touch
aboutsummaryrefslogtreecommitdiff
blob: 9abe02145236721e0fe593e0e5fab4de688861c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/* 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__ */