From 40c1f3f4b3dd366c16a652fb742fbec63f0931e5 Mon Sep 17 00:00:00 2001 From: Timple Raj M Date: Wed, 7 Sep 2022 13:27:19 +0530 Subject: [PATCH] ipq: support for mibib reload Adding a new command mibib_reload to populate the partition table info from mibib binary Change-Id: I3f08fc07ea55f1bbd90dc28d8f459d108f86bc0e Signed-off-by: Timple Raj M --- arch/arm/cpu/armv7/qca/common/smem.c | 24 ++++++ arch/arm/include/asm/arch-qca-common/smem.h | 3 + common/cmd_flashwrite.c | 90 +++++++++++++++++++++ include/configs/devsoc.h | 5 ++ 4 files changed, 122 insertions(+) diff --git a/arch/arm/cpu/armv7/qca/common/smem.c b/arch/arm/cpu/armv7/qca/common/smem.c index 197a2891e8..11fb96a6e4 100644 --- a/arch/arm/cpu/armv7/qca/common/smem.c +++ b/arch/arm/cpu/armv7/qca/common/smem.c @@ -490,6 +490,30 @@ int smem_ptable_init(void) return 0; } +/** + * mibib_ptable_init - initializes SMEM partition table + * + * Initialize partition table from MIBIB. + */ +#ifdef CONFIG_IPQ_MIBIB_RELOAD +int mibib_ptable_init(unsigned int* addr) +{ + struct smem_ptable* ptable; + + ptable = (struct smem_ptable*) addr; + if (ptable->magic[0] != _SMEM_PTABLE_MAGIC_1 || + ptable->magic[1] != _SMEM_PTABLE_MAGIC_2) + return -ENOMSG; + + debug("smem ptable found: ver: %d len: %d\n", + smem_ptable.version, smem_ptable.len); + + memcpy(&smem_ptable, addr, sizeof(smem_ptable)); + + return 0; +} +#endif + /* * smem_bootconfig_info - retrieve bootconfig flags */ diff --git a/arch/arm/include/asm/arch-qca-common/smem.h b/arch/arm/include/asm/arch-qca-common/smem.h index cd99cc6d3f..404c89ddd5 100644 --- a/arch/arm/include/asm/arch-qca-common/smem.h +++ b/arch/arm/include/asm/arch-qca-common/smem.h @@ -55,6 +55,9 @@ struct version_entry unsigned int smem_get_board_platform_type(void); int smem_ptable_init(void); +#ifdef CONFIG_IPQ_MIBIB_RELOAD +int mibib_ptable_init(unsigned int* load_addr); +#endif int smem_get_boot_flash(uint32_t *flash_type, uint32_t *flash_index, uint32_t *flash_chip_select, diff --git a/common/cmd_flashwrite.c b/common/cmd_flashwrite.c index 6f9c93f5e8..23476a2076 100644 --- a/common/cmd_flashwrite.c +++ b/common/cmd_flashwrite.c @@ -35,6 +35,17 @@ extern struct sdhci_host mmc_host; #define GPT_PART_NAME "0:GPT" #define GPT_BACKUP_PART_NAME "0:GPTBACKUP" +#ifdef CONFIG_IPQ_MIBIB_RELOAD +#define HEADER_MAGIC1 0xFE569FAC +#define HEADER_MAGIC2 0xCD7F127A +#define HEADER_VERSION 4 + +struct header { + unsigned magic[2]; + unsigned version; +} __attribute__ ((__packed__)); +#endif + int write_to_flash(int flash_type, uint32_t address, uint32_t offset, uint32_t part_size, uint32_t file_size, char *layout) { @@ -418,6 +429,77 @@ char * const argv[]) return ret; } +#ifdef CONFIG_IPQ_MIBIB_RELOAD +static int do_mibib_reload(cmd_tbl_t *cmdtp, int flag, int argc, +char * const argv[]) +{ + uint32_t load_addr, file_size; + uint32_t page_size = 256; + uint8_t flash_type = 0; + struct header* mibib_hdr; + qca_smem_flash_info_t *sfi = &qca_smem_flash_info; + int nand_dev = 0; + + nand_dev = nand_dev; + if (argc == 4) { + flash_type = simple_strtoul(argv[1], NULL, 16); + load_addr = simple_strtoul(argv[2], NULL, 16); + file_size = simple_strtoul(argv[3], NULL, 16); + } else + return CMD_RET_USAGE; + + if (flash_type > 1 ) { + printf("Invalid flash type \n"); + return CMD_RET_FAILURE; + } + + if (flash_type == 0) { + /*NAND 2K or 4K*/ + nand_dev = CONFIG_NAND_FLASH_INFO_IDX; +#ifdef CONFIG_QPIC_SERIAL + sfi->flash_type = SMEM_BOOT_QSPI_NAND_FLASH; +#else + sfi->flash_type = SMEM_BOOT_NAND_FLASH; +#endif + } else { + /* NOR*/ + nand_dev = CONFIG_SPI_FLASH_INFO_IDX; + sfi->flash_type = SMEM_BOOT_SPI_FLASH; + } + +#ifdef CONFIG_CMD_NAND + nand_info_t *nand = &nand_info[nand_dev]; + sfi->flash_block_size = nand->erasesize; + sfi->flash_density = nand->size; + page_size = nand->writesize; +#endif + + if (file_size < 2 * page_size) { + printf("Invalid filesize \n"); + return CMD_RET_FAILURE; + } + + mibib_hdr = (struct header*) load_addr; + if (mibib_hdr->magic[0] == HEADER_MAGIC1 && + mibib_hdr->magic[1] == HEADER_MAGIC2 && + mibib_hdr->version == HEADER_VERSION) { + + load_addr += page_size; + } + else { + printf("Header magic/version is invalid\n"); + return CMD_RET_FAILURE; + } + + if (mibib_ptable_init((unsigned int*) load_addr)) { + printf("Table magic is invalid\n"); + return CMD_RET_FAILURE; + } + + return CMD_RET_SUCCESS; +} +#endif + U_BOOT_CMD( flash, 4, 0, do_flash, "flash part_name \n" @@ -430,3 +512,11 @@ U_BOOT_CMD( "flerase part_name \n", "erases on flash the given partition \n" ); + +#ifdef CONFIG_IPQ_MIBIB_RELOAD +U_BOOT_CMD( + mibib_reload, 4, 0, do_mibib_reload, + "mibib_reload flash_type [fileaddr] [filesize]\n", + "reloads the smem partition info from mibib \n" +); +#endif diff --git a/include/configs/devsoc.h b/include/configs/devsoc.h index 0383a856f1..12526f4316 100644 --- a/include/configs/devsoc.h +++ b/include/configs/devsoc.h @@ -48,6 +48,11 @@ #define CONFIG_ENV_SIZE_MAX (256 << 10) /* 256 KB */ +/* + * Enable MIBIB reload + */ +#define CONFIG_IPQ_MIBIB_RELOAD + /* * Enable Flashwrite command */