[U-Boot] [PATCH v4] powerpc/p1022ds: Add sdcard and spi boot support to P1022DS

Signed-off-by: Dirk Eibach eibach@gdsys.de Cc: Timur Tabi timur@freescale.com --- Changes in v2: - add Cc - split up original patch series Changes in v3: - use clrsetbits() instead of clrbits()/setbits() - remove dead code - remove unnecessary #undef Changes in v4: - Add some documentation - set pmuxcr depending on bootmode - use 'ifdef' instead of 'if defined' - undo unrelated whitespace change - fix CONFIG_ENV_ADDR
board/freescale/p1022ds/p1022ds.c | 5 +++ board/freescale/p1022ds/tlb.c | 10 +++++++ boards.cfg | 4 +++ doc/README.p1022ds | 52 +++++++++++++++++++++++++++++++++++ include/configs/P1022DS.h | 55 +++++++++++++++++++++++++++++++++--- 5 files changed, 121 insertions(+), 5 deletions(-)
diff --git a/board/freescale/p1022ds/p1022ds.c b/board/freescale/p1022ds/p1022ds.c index 456d9b0..e1e074e 100644 --- a/board/freescale/p1022ds/p1022ds.c +++ b/board/freescale/p1022ds/p1022ds.c @@ -37,6 +37,11 @@ int board_early_init_f(void) { ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
+#if defined(CONFIG_RAMBOOT_SPIFLASH) || defined(CONFIG_RAMBOOT_SDCARD) + /* Reset eLBC_DIU and SPI_eLBC in case we are booting from SD */ + clrsetbits_be32(&gur->pmuxcr, 0x00600000, 0x80000000); +#endif + /* Set pmuxcr to allow both i2c1 and i2c2 */ setbits_be32(&gur->pmuxcr, 0x1000);
diff --git a/board/freescale/p1022ds/tlb.c b/board/freescale/p1022ds/tlb.c index e620112..013e9a7 100644 --- a/board/freescale/p1022ds/tlb.c +++ b/board/freescale/p1022ds/tlb.c @@ -71,6 +71,16 @@ struct fsl_e_tlb_entry tlb_table[] = { SET_TLB_ENTRY(1, PIXIS_BASE, PIXIS_BASE_PHYS, MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, 0, 7, BOOKE_PAGESZ_4K, 1), + +#ifdef CONFIG_SYS_RAMBOOT + SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE, + MAS3_SX|MAS3_SW|MAS3_SR, 0, + 0, 8, BOOKE_PAGESZ_1G, 1), + SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000, + CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000, + MAS3_SX|MAS3_SW|MAS3_SR, 0, + 0, 9, BOOKE_PAGESZ_1G, 1) +#endif };
int num_tlb_entries = ARRAY_SIZE(tlb_table); diff --git a/boards.cfg b/boards.cfg index 24c5879..8de4235 100644 --- a/boards.cfg +++ b/boards.cfg @@ -700,6 +700,10 @@ P1021RDB-PC_SDCARD powerpc mpc85xx p1_p2_rdb_pc freesca P1021RDB-PC_SPIFLASH powerpc mpc85xx p1_p2_rdb_pc freescale - p1_p2_rdb_pc:P1021RDB,SPIFLASH P1022DS powerpc mpc85xx p1022ds freescale P1022DS_36BIT powerpc mpc85xx p1022ds freescale - P1022DS:36BIT +P1022DS_36BIT_SDCARD powerpc mpc85xx p1022ds freescale - P1022DS:36BIT,SDCARD +P1022DS_36BIT_SPIFLASH powerpc mpc85xx p1022ds freescale - P1022DS:36BIT,SPIFLASH +P1022DS_SDCARD powerpc mpc85xx p1022ds freescale - P1022DS:SDCARD +P1022DS_SPIFLASH powerpc mpc85xx p1022ds freescale - P1022DS:SPIFLASH P1023RDS powerpc mpc85xx p1023rds freescale - P1023RDS P1023RDS_NAND powerpc mpc85xx p1023rds freescale - P1023RDS:NAND P1024RDB powerpc mpc85xx p1_p2_rdb_pc freescale - p1_p2_rdb_pc:P1024RDB diff --git a/doc/README.p1022ds b/doc/README.p1022ds index 04d9197..98499f8 100644 --- a/doc/README.p1022ds +++ b/doc/README.p1022ds @@ -21,3 +21,55 @@ and AUDIO codec clock sources only setting as 11MHz or 12MHz ! 'setenv hwconfig 'audclk:12;tdm' --- error ! 'setenv hwconfig 'audclk:11;tdm' --- error ! 'setenv hwconfig 'audclk:10' --- error ! + +Booting from eSPI/eSDHC +----------------------- + +The P1022 is capable of loading initialization code from a memory device that is +connected to the eSPI or eSDHC controller interface. Booting is supported by the +P1022 using an on-chip ROM which contains the basic device driver and the code +to perform block copy to any target memory. + +Freescale offers a tool for building SD or SPI images, which is hosted here: +http://git.freescale.com/git/cgit.cgi/ppc/sdk/boot-format.git + +For eSDHC: + +1. Build u-boot + make P1022DS_SDCARD_config + or + make P1022DS_36BIT_SDCARD_config + then + make + +2. Prepare SD card + boot_format config_ddr3_2gb_p1022ds.dat u-boot.bin -sd /dev/sd... + +3. Change dip-switch + SW4[5-8] = 0111 + +4. Insert SD card and push RESET + +For eSPI: + +1. Build u-boot + make P1022DS_SPIFLASH_config + or + make P1022DS_36BIT_SPIFLASH_config + then + make + +2. Prepare binary image file + boot_format config_ddr3_2gb_p1022ds.dat u-boot.bin -spi spiimage.bin + +3. Program SPI memory device using u-boot + tftpboot $loadaddr spiimage.bin + sf probe + sf erase 0 +$filesize + sf write $fileaddr 0 $filesize + +3. Change dip-switch + SW4[5-8] = 0110 + +4. Push RESET + diff --git a/include/configs/P1022DS.h b/include/configs/P1022DS.h index 70d751d..ec60445 100644 --- a/include/configs/P1022DS.h +++ b/include/configs/P1022DS.h @@ -26,6 +26,18 @@ #define CONFIG_P1022DS #define CONFIG_MP /* support multiple processors */
+#ifdef CONFIG_SDCARD +#define CONFIG_RAMBOOT_SDCARD 1 +#define CONFIG_SYS_TEXT_BASE 0x11000000 +#define CONFIG_RESET_VECTOR_ADDRESS 0x1107fffc +#endif + +#ifdef CONFIG_SPIFLASH +#define CONFIG_RAMBOOT_SPIFLASH 1 +#define CONFIG_SYS_TEXT_BASE 0x11000000 +#define CONFIG_RESET_VECTOR_ADDRESS 0x1107fffc +#endif + #ifndef CONFIG_SYS_TEXT_BASE #define CONFIG_SYS_TEXT_BASE 0xeff80000 #endif @@ -138,6 +150,12 @@
#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_TEXT_BASE /* start of monitor */
+#if defined(CONFIG_RAMBOOT_NAND) || defined(CONFIG_RAMBOOT_SDCARD) || \ + defined(CONFIG_RAMBOOT_SPIFLASH) +#define CONFIG_SYS_RAMBOOT +#define CONFIG_SYS_EXTRA_ENV_RELOC +#endif + #define CONFIG_FLASH_CFI_DRIVER #define CONFIG_SYS_FLASH_CFI #define CONFIG_SYS_FLASH_EMPTY_INFO @@ -403,11 +421,38 @@ /* * Environment */ -#define CONFIG_ENV_IS_IN_FLASH -#define CONFIG_ENV_OVERWRITE -#define CONFIG_ENV_ADDR (CONFIG_SYS_MONITOR_BASE - CONFIG_ENV_SECT_SIZE) -#define CONFIG_ENV_SIZE 0x2000 -#define CONFIG_ENV_SECT_SIZE 0x20000 +#if defined(CONFIG_SYS_RAMBOOT) +#if defined(CONFIG_RAMBOOT_NAND) +#define CONFIG_ENV_IS_IN_NAND 1 +#define CONFIG_ENV_SIZE CONFIG_SYS_NAND_BLOCK_SIZE +#define CONFIG_ENV_OFFSET ((512 * 1024) + CONFIG_SYS_NAND_BLOCK_SIZE) +#define CONFIG_ENV_RANGE (3 * CONFIG_ENV_SIZE) +#elif defined(CONFIG_RAMBOOT_SPIFLASH) +#define CONFIG_ENV_IS_IN_SPI_FLASH +#define CONFIG_ENV_SPI_BUS 0 +#define CONFIG_ENV_SPI_CS 0 +#define CONFIG_ENV_SPI_MAX_HZ 10000000 +#define CONFIG_ENV_SPI_MODE 0 +#define CONFIG_ENV_SIZE 0x2000 /* 8KB */ +#define CONFIG_ENV_OFFSET 0x100000 +#define CONFIG_ENV_SECT_SIZE 0x10000 +#elif defined(CONFIG_RAMBOOT_SDCARD) +#define CONFIG_ENV_IS_IN_MMC +#define CONFIG_FSL_FIXED_MMC_LOCATION +#define CONFIG_ENV_SIZE 0x2000 +#define CONFIG_SYS_MMC_ENV_DEV 0 +#else + #define CONFIG_ENV_IS_NOWHERE 1 /* Store ENV in memory only */ + #define CONFIG_ENV_SIZE 0x2000 + #define CONFIG_ENV_ADDR (CONFIG_SYS_MONITOR_BASE - CONFIG_ENV_SIZE) +#endif +#else + #define CONFIG_ENV_IS_IN_FLASH + #define CONFIG_ENV_OVERWRITE + #define CONFIG_ENV_ADDR (CONFIG_SYS_MONITOR_BASE - CONFIG_ENV_SECT_SIZE) + #define CONFIG_ENV_SIZE 0x2000 + #define CONFIG_ENV_SECT_SIZE 0x20000 +#endif
#define CONFIG_LOADS_ECHO #define CONFIG_SYS_LOADS_BAUD_CHANGE

On Mon, May 7, 2012 at 8:41 AM, Dirk Eibach eibach@gdsys.de wrote:
Signed-off-by: Dirk Eibach eibach@gdsys.de Cc: Timur Tabi timur@freescale.com
Changes in v2:
- add Cc
- split up original patch series
Changes in v3:
- use clrsetbits() instead of clrbits()/setbits()
- remove dead code
- remove unnecessary #undef
Changes in v4:
- Add some documentation
- set pmuxcr depending on bootmode
- use 'ifdef' instead of 'if defined'
- undo unrelated whitespace change
- fix CONFIG_ENV_ADDR
board/freescale/p1022ds/p1022ds.c | 5 +++ board/freescale/p1022ds/tlb.c | 10 +++++++ boards.cfg | 4 +++ doc/README.p1022ds | 52 +++++++++++++++++++++++++++++++++++ include/configs/P1022DS.h | 55 +++++++++++++++++++++++++++++++++--- 5 files changed, 121 insertions(+), 5 deletions(-)
diff --git a/board/freescale/p1022ds/p1022ds.c b/board/freescale/p1022ds/p1022ds.c index 456d9b0..e1e074e 100644 --- a/board/freescale/p1022ds/p1022ds.c +++ b/board/freescale/p1022ds/p1022ds.c @@ -37,6 +37,11 @@ int board_early_init_f(void) { ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
+#if defined(CONFIG_RAMBOOT_SPIFLASH) || defined(CONFIG_RAMBOOT_SDCARD)
/* Reset eLBC_DIU and SPI_eLBC in case we are booting from SD */
clrsetbits_be32(&gur->pmuxcr, 0x00600000, 0x80000000);
+#endif
This is somewhat convoluted, and also uses magic numbers. Please use named constants. Also, if we're going to change multiple bits in the pmuxcr, we might as well craft variables with the correct mask and set values, and set it once.
/* Set pmuxcr to allow both i2c1 and i2c2 */ setbits_be32(&gur->pmuxcr, 0x1000);
While you're at it, please change this to a named constant.
Thanks, Andy
participants (2)
-
Andy Fleming
-
Dirk Eibach