Newer
Older
barebox / arch / arm / mach-imx / include / mach / imx-flash-header.h
@Marc Kleine-Budde Marc Kleine-Budde on 29 Jul 2011 3 KB ARM: add support for the i.MX53
#ifndef __MACH_FLASH_HEADER_H
#define __MACH_FLASH_HEADER_H

#define __flash_header_start		__section(.flash_header_start)

#if defined(CONFIG_ARCH_IMX_INTERNAL_BOOT_NOR)
	#define __flash_header_section		__section(.flash_header_0x1000)
	#define __dcd_entry_section		__section(.dcd_entry_0x1000)
	#define __image_len_section		__section(.image_len_0x1000)
	#define FLASH_HEADER_OFFSET 0x1000
#elif defined(CONFIG_ARCH_IMX_INTERNAL_BOOT_ONENAND)
	#define __flash_header_section		__section(.flash_header_0x0100)
	#define __dcd_entry_section		__section(.dcd_entry_0x0100)
	#define __image_len_section		__section(.image_len_0x0100)
	#define FLASH_HEADER_OFFSET 0x0100
#else
	#define __flash_header_section		__section(.flash_header_0x0400)
	#define __dcd_entry_section		__section(.dcd_entry_0x0400)
	#define __image_len_section		__section(.image_len_0x0400)
	#define FLASH_HEADER_OFFSET 0x0400
#endif

#define __flash_header_0x1000	__section(.flash_header_0x1000)
#define __dcd_entry_0x1000	__section(.dcd_entry_0x1000)
#define __image_len_0x1000	__section(.image_len_0x1000)

#define __flash_header_0x0100	__section(.flash_header_0x0100)
#define __dcd_entry_0x0100	__section(.dcd_entry_0x0100)
#define __image_len_0x0100	__section(.image_len_0x0100)

#define __flash_header_0x0400	__section(.flash_header_0x0400)
#define __dcd_entry_0x0400	__section(.dcd_entry_0x0400)
#define __image_len_0x0400	__section(.image_len_0x0400)

/*
 * NOR is not automatically copied anywhere by the boot ROM
 */
#if defined (CONFIG_ARCH_IMX_INTERNAL_BOOT_NOR)
	#define DEST_BASE	IMX_CS0_BASE
#else
	#define DEST_BASE	TEXT_BASE
#endif

#define FLASH_HEADER_BASE	(DEST_BASE + FLASH_HEADER_OFFSET)

struct imx_dcd_entry {
	unsigned long ptr_type;
	unsigned long addr;
	unsigned long val;
};

struct imx_dcd_v2_entry {
	__be32 addr;
	__be32 val;
};

#define DCD_BARKER	0xb17219e9

struct imx_rsa_public_key {
	unsigned char	rsa_exponent[4];
	unsigned char	*rsa_modululs;
	unsigned short	*exponent_size;
	unsigned short	modulus_size;
	unsigned char	init_flag;
};

#define APP_CODE_BARKER	0x000000b1

struct imx_flash_header {
	unsigned long			app_code_jump_vector;
	unsigned long			app_code_barker;
	unsigned long			app_code_csf;
	unsigned long			dcd_ptr_ptr;
	unsigned long			super_root_key;
	unsigned long			dcd;
	unsigned long			app_dest;
	unsigned long			dcd_barker;
	unsigned long			dcd_block_len;
};

#define IVT_HEADER_TAG		0xd1
#define IVT_VERSION		0x40

#define DCD_HEADER_TAG		0xd2
#define DCD_VERSION		0x40

#define DCD_COMMAND_WRITE_TAG	0xcc
#define DCD_COMMAND_WRITE_PARAM	0x04

struct imx_ivt_header {
	uint8_t tag;
	__be16 length;
	uint8_t version;
} __attribute__((packed));

struct imx_dcd_command {
	uint8_t tag;
	__be16 length;
	uint8_t param;
} __attribute__((packed));

struct imx_dcd {
	struct imx_ivt_header header;
	struct imx_dcd_command command;
};

struct imx_boot_data {
	uint32_t start;
	uint32_t size;
	uint32_t plugin;
};

struct imx_flash_header_v2 {
	struct imx_ivt_header header;

	uint32_t entry;
	uint32_t reserved1;
	uint32_t dcd_ptr;
	uint32_t boot_data_ptr;
	uint32_t self;
	uint32_t csf;
	uint32_t reserved2;

	struct imx_boot_data boot_data;
	struct imx_dcd dcd;
};

#endif /* __MACH_FLASH_HEADER_H */