powerpc: mpc85xx: Add support for generating QorIQ pre-PBL eSDHC boot sector

QorIQ U-Boot binary for SD card booting compiled during build process
(either u-boot.bin or u-boot-with-spl.bin) cannot be directly loaded by
QorIQ pre-PBL BootROM. Compiled U-Boot binary first needs to be processed
by Freescale boot_format tool as described in doc/README.mpc85xx-sd-spi-boot

BootROM requires that image on SD card must contain special boot sector.
Implement support for generating this special boot sector directly in
U-Boot start code. Boot sector needs to be at the beginning of the image,
so when compiling only proper U-Boot without SPL then it needs to be in
proper U-Boot. When compiling SPL with proper U-Boot then it needs to be
only in SPL.

Support can be enabled by a new config option FSL_PREPBL_ESDHC_BOOT_SECTOR.
Via other two additional options FSL_PREPBL_ESDHC_BOOT_SECTOR_START and
FSL_PREPBL_ESDHC_BOOT_SECTOR_DATA it is possible to tune how final U-Boot
image could be stored on the SD card.

Signed-off-by: Pali Rohár <pali@kernel.org>
This commit is contained in:
Pali Rohár 2022-05-11 20:57:31 +02:00 committed by Peng Fan
parent 87069c79e8
commit 786d9f1a82
4 changed files with 163 additions and 0 deletions

View File

@ -12,6 +12,59 @@ config CMD_ERRATA
This enables the 'errata' command which displays a list of errata This enables the 'errata' command which displays a list of errata
work-arounds which are enabled for the current board. work-arounds which are enabled for the current board.
config FSL_PREPBL_ESDHC_BOOT_SECTOR
bool "Generate QorIQ pre-PBL eSDHC boot sector"
depends on MPC85xx
depends on SYS_EXTRA_OPTIONS = SDCARD
help
With this option final image would have prepended QorIQ pre-PBL eSDHC
boot sector suitable for SD card images. This boot sector instruct
BootROM to configure L2 SRAM and eSDHC then load image from SD card
into L2 SRAM and finally jump to image entry point.
This is alternative to Freescale boot_format tool, but works only for
SD card images and only for L2 SRAM booting. U-Boot images generated
with this option should not passed to boot_format tool.
For other configuration like booting from eSPI or configuring SDRAM
please use Freescale boot_format tool without this option. See file
doc/README.mpc85xx-sd-spi-boot
config FSL_PREPBL_ESDHC_BOOT_SECTOR_START
int "QorIQ pre-PBL eSDHC boot sector start offset"
depends on FSL_PREPBL_ESDHC_BOOT_SECTOR
range 0 23
default 0
help
QorIQ pre-PBL eSDHC boot sector may be located on one of the first
24 SD card sectors. Select SD card sector on which final U-Boot
image (with this boot sector) would be installed.
By default first SD card sector (0) is used. But this may be changed
to allow installing U-Boot image on some partition (with fixed start
sector).
Please note that any sector on SD card prior this boot sector must
not contain ASCII "BOOT" bytes at sector offset 0x40.
config FSL_PREPBL_ESDHC_BOOT_SECTOR_DATA
int "Relative data sector for QorIQ pre-PBL eSDHC boot sector"
depends on FSL_PREPBL_ESDHC_BOOT_SECTOR
default 1
range 1 8388607
help
Select data sector from the beginning of QorIQ pre-PBL eSDHC boot
sector on which would be stored raw U-Boot image.
By default is it second sector (1) which is the first available free
sector (on the first sector is stored boot sector). It can be any
sector number which offset in bytes can be expressed by 32-bit number.
In case this final U-Boot image (with this boot sector) is put on
the FAT32 partition into reserved boot area, this data sector needs
to be at least 2 (third sector) because FAT32 use second sector for
its data.
choice choice
prompt "Target select" prompt "Target select"
optional optional

View File

@ -57,6 +57,100 @@
GOT_ENTRY(__bss_start) GOT_ENTRY(__bss_start)
END_GOT END_GOT
#ifdef CONFIG_FSL_PREPBL_ESDHC_BOOT_SECTOR
#if !defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD)
/* Maximal size of the image */
#ifdef CONFIG_SPL_BUILD
#define MAX_IMAGE_SIZE (CONFIG_SPL_MAX_SIZE - (CONFIG_FSL_PREPBL_ESDHC_BOOT_SECTOR_DATA * 512))
#else
#define MAX_IMAGE_SIZE CONFIG_SYS_L2_SIZE
#endif
#if defined(CONFIG_SPL_BUILD) && CONFIG_SPL_MAX_SIZE < CONFIG_FSL_PREPBL_ESDHC_BOOT_SECTOR_DATA * 512
#error "CONFIG_SPL_MAX_SIZE is too small for CONFIG_FSL_PREPBL_ESDHC_BOOT_SECTOR_DATA"
#endif
#if MAX_IMAGE_SIZE > CONFIG_SYS_L2_SIZE
#error "Image is too big"
#endif
#define DIV_ROUND_UP(a, b) (((a) + (b) - 1) / (b))
#define ALIGN(x, a) (DIV_ROUND_UP(x, a) * (a))
/* Definitions from C header file asm/immap_85xx.h */
#define CONFIG_SYS_MPC85xx_L2_OFFSET 0x20000
#define MPC85xx_L2CTL 0x000
#define MPC85xx_L2CTL_L2E 0x80000000
#define MPC85xx_L2CTL_L2SRAM_ENTIRE 0x00010000
#define MPC85xx_L2SRBAR0 0x100
#define MPC85xx_L2ERRDIS 0xe44
#define MPC85xx_L2ERRDIS_MBECC 0x00000008
#define MPC85xx_L2ERRDIS_SBECC 0x00000004
/* Definitions from C header file fsl_esdhc.h */
#define ESDHCCTL 0x0002e40c
#define ESDHCCTL_SNOOP 0x00000040
/*
* QorIQ pre-PBL eSDHC boot sector:
* Instruct BootROM to configure L2 SRAM and eSDHC then load image
* from SD card into L2 SRAM and finally jump to image entry point.
*/
.section .bootsect, "a"
.globl bootsect
bootsect:
.org 0x40 /* BOOT signature */
.ascii "BOOT"
.org 0x48 /* Number of bytes to be copied, must be multiple of block size (512) */
.long ALIGN(MAX_IMAGE_SIZE, 512)
.org 0x50 /* Source address from the beginning of boot sector in byte address format, must be multiple of block size (512) */
.long (CONFIG_FSL_PREPBL_ESDHC_BOOT_SECTOR_START + CONFIG_FSL_PREPBL_ESDHC_BOOT_SECTOR_DATA) * 512
.org 0x58 /* Target address in the system's local memory address space */
.long CONFIG_SYS_MONITOR_BASE
.org 0x60 /* Execution starting address */
.long _start
.org 0x68 /* Number of configuration data pairs */
.long DIV_ROUND_UP(.Lconf_pair_end - .Lconf_pair_start, 8)
.org 0x80 /* Start of configuration */
.Lconf_pair_start:
.long CONFIG_SYS_CCSRBAR_DEFAULT + CONFIG_SYS_MPC85xx_L2_OFFSET + MPC85xx_L2SRBAR0 /* Address: L2 memory-mapped SRAM base addr 0 */
.long CONFIG_SYS_INIT_L2_ADDR
.long CONFIG_SYS_CCSRBAR_DEFAULT + CONFIG_SYS_MPC85xx_L2_OFFSET + MPC85xx_L2ERRDIS /* Address: L2 cache error disable */
.long MPC85xx_L2ERRDIS_MBECC | MPC85xx_L2ERRDIS_SBECC
.long CONFIG_SYS_CCSRBAR_DEFAULT + CONFIG_SYS_MPC85xx_L2_OFFSET + MPC85xx_L2CTL /* Address: L2 configuration 0 */
.long MPC85xx_L2CTL_L2E | MPC85xx_L2CTL_L2SRAM_ENTIRE
.long CONFIG_SYS_CCSRBAR_DEFAULT + ESDHCCTL /* Address: eSDHC DMA control */
.long ESDHCCTL_SNOOP
.long 0x40000001 /* Command: Delay in 8 CCB clocks */
.long 256
.long 0x80000001 /* End of configuration */
.Lconf_pair_end:
.org 0x1b8 /* Reserved for MBR/DBR */
.org 0x200 /* End of boot sector */
#endif
#endif
/* /*
* e500 Startup -- after reset only the last 4KB of the effective * e500 Startup -- after reset only the last 4KB of the effective
* address space is mapped in the MMU L2 TLB1 Entry0. The .bootpg * address space is mapped in the MMU L2 TLB1 Entry0. The .bootpg

View File

@ -12,6 +12,14 @@ OUTPUT_ARCH(powerpc)
SECTIONS SECTIONS
{ {
/* Optional boot sector */
#if defined(CONFIG_FSL_PREPBL_ESDHC_BOOT_SECTOR)
.bootsect IMAGE_TEXT_BASE - CONFIG_FSL_PREPBL_ESDHC_BOOT_SECTOR_DATA * 512 : {
KEEP(*(.bootsect))
. = CONFIG_FSL_PREPBL_ESDHC_BOOT_SECTOR_DATA * 512;
}
#endif
. = IMAGE_TEXT_BASE; . = IMAGE_TEXT_BASE;
.text : { .text : {
/* For ifc, elbc, esdhc, espi, all need the SPL without section .resetvec */ /* For ifc, elbc, esdhc, espi, all need the SPL without section .resetvec */

View File

@ -16,6 +16,14 @@ ENTRY(_start)
SECTIONS SECTIONS
{ {
/* Optional boot sector */
#if defined(CONFIG_FSL_PREPBL_ESDHC_BOOT_SECTOR) && !defined(CONFIG_SPL)
.bootsect CONFIG_SYS_TEXT_BASE - CONFIG_FSL_PREPBL_ESDHC_BOOT_SECTOR_DATA * 512 : {
KEEP(arch/powerpc/cpu/mpc85xx/start.o (.bootsect))
. = CONFIG_FSL_PREPBL_ESDHC_BOOT_SECTOR_DATA * 512;
}
#endif
/* Read-only sections, merged into text segment: */ /* Read-only sections, merged into text segment: */
.text : .text :
{ {