From a60121fe0a1a7665d3d463998f360f044705067c Mon Sep 17 00:00:00 2001 From: Sham Muthayyan Date: Wed, 13 Dec 2017 12:23:49 +0530 Subject: [PATCH] ipq807x: Add SF env support Change-Id: I4ddf96b965e22c980a4c4ea02307afb361d639ec Signed-off-by: Sham Muthayyan --- board/qca/arm/common/board_init.c | 16 ++++++---- board/qca/arm/common/env.c | 18 ++++++++---- common/env_sf.c | 49 +++++++++++++++---------------- include/configs/ipq807x.h | 3 +- 4 files changed, 48 insertions(+), 38 deletions(-) diff --git a/board/qca/arm/common/board_init.c b/board/qca/arm/common/board_init.c index 8b31bcdcc6..9991ca62dd 100644 --- a/board/qca/arm/common/board_init.c +++ b/board/qca/arm/common/board_init.c @@ -23,7 +23,9 @@ DECLARE_GLOBAL_DATA_PTR; extern int nand_env_device; extern env_t *nand_env_ptr; extern char *nand_env_name_spec; +extern char *sf_env_name_spec; extern int nand_saveenv(void); +extern int sf_saveenv(void); #ifdef CONFIG_QCA_MMC extern env_t *mmc_env_ptr; @@ -134,18 +136,20 @@ int board_init(void) BUG(); } - if (sfi->flash_type != SMEM_BOOT_MMC_FLASH) { - saveenv = nand_saveenv; - env_ptr = nand_env_ptr; - env_name_spec = nand_env_name_spec; + if (sfi->flash_type == SMEM_BOOT_SPI_FLASH) { + saveenv = sf_saveenv; + env_name_spec = sf_env_name_spec; #ifdef CONFIG_QCA_MMC - } else { + } else if (sfi->flash_type == SMEM_BOOT_MMC_FLASH) { saveenv = mmc_saveenv; env_ptr = mmc_env_ptr; env_name_spec = mmc_env_name_spec; #endif + } else { + saveenv = nand_saveenv; + env_ptr = nand_env_ptr; + env_name_spec = nand_env_name_spec; } - #endif ret = ipq_board_usb_init(); if (ret < 0) { diff --git a/board/qca/arm/common/env.c b/board/qca/arm/common/env.c index 68dab66feb..7509ca5b2a 100644 --- a/board/qca/arm/common/env.c +++ b/board/qca/arm/common/env.c @@ -16,7 +16,9 @@ #include extern void nand_env_relocate_spec(void); +extern void sf_env_relocate_spec(void); extern int nand_env_init(void); +extern int sf_env_init(void); #ifdef CONFIG_QCA_MMC extern int mmc_env_init(void); @@ -39,12 +41,14 @@ int env_init(void) &sfi.flash_block_size, &sfi.flash_density); - if (sfi.flash_type != SMEM_BOOT_MMC_FLASH) { - ret = nand_env_init(); + if (sfi.flash_type == SMEM_BOOT_SPI_FLASH) { + ret = sf_env_init(); #ifdef CONFIG_QCA_MMC - } else { + } else if (sfi.flash_type == SMEM_BOOT_MMC_FLASH) { ret = mmc_env_init(); #endif + } else { + ret = nand_env_init(); } return ret; @@ -62,12 +66,14 @@ void env_relocate_spec(void) if (sfi.flash_type == SMEM_BOOT_NO_FLASH) { set_default_env("!flashless boot"); - } else if (sfi.flash_type != SMEM_BOOT_MMC_FLASH) { - nand_env_relocate_spec(); + } else if (sfi.flash_type == SMEM_BOOT_SPI_FLASH) { + sf_env_relocate_spec(); #ifdef CONFIG_QCA_MMC - } else { + } else if (sfi.flash_type == SMEM_BOOT_MMC_FLASH) { mmc_env_relocate_spec(); #endif + } else { + nand_env_relocate_spec(); } }; diff --git a/common/env_sf.c b/common/env_sf.c index 940983124f..8463f261b8 100644 --- a/common/env_sf.c +++ b/common/env_sf.c @@ -40,12 +40,12 @@ static ulong env_new_offset = CONFIG_ENV_OFFSET_REDUND; DECLARE_GLOBAL_DATA_PTR; -char *env_name_spec = "SPI Flash"; +char *sf_env_name_spec = "SPI Flash"; static struct spi_flash *env_flash; #if defined(CONFIG_ENV_OFFSET_REDUND) -int saveenv(void) +int sf_saveenv(void) { env_t env_new; char *saved_buffer = NULL, flag = OBSOLETE_FLAG; @@ -53,9 +53,9 @@ int saveenv(void) int ret; if (!env_flash) { - env_flash = spi_flash_probe(CONFIG_ENV_SPI_BUS, - CONFIG_ENV_SPI_CS, - CONFIG_ENV_SPI_MAX_HZ, CONFIG_ENV_SPI_MODE); + env_flash = spi_flash_probe(CONFIG_SF_DEFAULT_BUS, + CONFIG_SF_DEFAULT_CS, + CONFIG_SF_DEFAULT_SPEED, CONFIG_SF_DEFAULT_MODE); if (!env_flash) { set_default_env("!spi_flash_probe() failed"); return 1; @@ -134,7 +134,7 @@ int saveenv(void) return ret; } -void env_relocate_spec(void) +void sf_env_relocate_spec(void) { int ret; int crc1_ok = 0, crc2_ok = 0; @@ -151,8 +151,8 @@ void env_relocate_spec(void) goto out; } - env_flash = spi_flash_probe(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS, - CONFIG_ENV_SPI_MAX_HZ, CONFIG_ENV_SPI_MODE); + env_flash = spi_flash_probe(CONFIG_SF_DEFAULT_BUS, CONFIG_SF_DEFAULT_CS, + CONFIG_SF_DEFAULT_SPEED, CONFIG_SF_DEFAULT_MODE); if (!env_flash) { set_default_env("!spi_flash_probe() failed"); goto out; @@ -221,7 +221,7 @@ out: free(tmp_env2); } #else -int saveenv(void) +int sf_saveenv(void) { u32 saved_size, saved_offset, sector = 1; char *saved_buffer = NULL; @@ -229,9 +229,9 @@ int saveenv(void) env_t env_new; if (!env_flash) { - env_flash = spi_flash_probe(CONFIG_ENV_SPI_BUS, - CONFIG_ENV_SPI_CS, - CONFIG_ENV_SPI_MAX_HZ, CONFIG_ENV_SPI_MODE); + env_flash = spi_flash_probe(CONFIG_SF_DEFAULT_BUS, + CONFIG_SF_DEFAULT_CS, + CONFIG_SF_DEFAULT_SPEED, CONFIG_SF_DEFAULT_MODE); if (!env_flash) { set_default_env("!spi_flash_probe() failed"); return 1; @@ -239,9 +239,9 @@ int saveenv(void) } /* Is the sector larger than the env (i.e. embedded) */ - if (CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE) { - saved_size = CONFIG_ENV_SECT_SIZE - CONFIG_ENV_SIZE; - saved_offset = CONFIG_ENV_OFFSET + CONFIG_ENV_SIZE; + if (CONFIG_ENV_SECT_SIZE > CONFIG_ENV_RANGE) { + saved_size = CONFIG_ENV_SECT_SIZE - CONFIG_ENV_RANGE; + saved_offset = CONFIG_ENV_OFFSET + CONFIG_ENV_RANGE; saved_buffer = malloc(saved_size); if (!saved_buffer) goto done; @@ -252,29 +252,28 @@ int saveenv(void) goto done; } - if (CONFIG_ENV_SIZE > CONFIG_ENV_SECT_SIZE) { + if (CONFIG_ENV_RANGE > CONFIG_ENV_SECT_SIZE) { sector = CONFIG_ENV_SIZE / CONFIG_ENV_SECT_SIZE; if (CONFIG_ENV_SIZE % CONFIG_ENV_SECT_SIZE) sector++; } - ret = env_export(&env_new); if (ret) goto done; puts("Erasing SPI flash..."); ret = spi_flash_erase(env_flash, CONFIG_ENV_OFFSET, - sector * CONFIG_ENV_SECT_SIZE); + CONFIG_ENV_RANGE); if (ret) goto done; puts("Writing to SPI flash..."); ret = spi_flash_write(env_flash, CONFIG_ENV_OFFSET, - CONFIG_ENV_SIZE, &env_new); + CONFIG_ENV_RANGE, &env_new); if (ret) goto done; - if (CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE) { + if (CONFIG_ENV_SECT_SIZE > CONFIG_ENV_RANGE) { ret = spi_flash_write(env_flash, saved_offset, saved_size, saved_buffer); if (ret) @@ -291,14 +290,14 @@ int saveenv(void) return ret; } -void env_relocate_spec(void) +void sf_env_relocate_spec(void) { int ret; char *buf = NULL; buf = (char *)memalign(ARCH_DMA_MINALIGN, CONFIG_ENV_SIZE); - env_flash = spi_flash_probe(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS, - CONFIG_ENV_SPI_MAX_HZ, CONFIG_ENV_SPI_MODE); + env_flash = spi_flash_probe(CONFIG_SF_DEFAULT_BUS, CONFIG_SF_DEFAULT_CS, + CONFIG_SF_DEFAULT_SPEED, CONFIG_SF_DEFAULT_MODE); if (!env_flash) { set_default_env("!spi_flash_probe() failed"); if (buf) @@ -307,7 +306,7 @@ void env_relocate_spec(void) } ret = spi_flash_read(env_flash, - CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE, buf); + CONFIG_ENV_OFFSET, CONFIG_ENV_RANGE, buf); if (ret) { set_default_env("!spi_flash_read() failed"); goto out; @@ -324,7 +323,7 @@ out: } #endif -int env_init(void) +int sf_env_init(void) { /* SPI flash isn't usable before relocation */ gd->env_addr = (ulong)&default_environment[0]; diff --git a/include/configs/ipq807x.h b/include/configs/ipq807x.h index c5c46c0a90..d922bce1f6 100644 --- a/include/configs/ipq807x.h +++ b/include/configs/ipq807x.h @@ -104,7 +104,8 @@ #define CONFIG_IPQ_FDT_HIGH 0x4A600000 #define CONFIG_IPQ_NO_MACS 6 - +#define CONFIG_ENV_IS_IN_SPI_FLASH 1 +#define CONFIG_ENV_SECT_SIZE (64 * 1024) /* * IPQ_TFTP_MIN_ADDR: Starting address of Linux HLOS region. * CONFIG_TZ_END_ADDR: Ending address of Trust Zone and starting