Hi, I'm facing a new problem for my Mt7628/vocore2 target. I moved the Linux kernel from a ext4 partition to the "proper" SquashFS partition (I say "proper" because I'm using a dual-system with fallback to avoid updating the currently working rootFS and kernel lies into rootFS).
I am using u-boot v2020.10-rc3 plus the attached patches (one pertains SquashFS). Problem is a real cold boot (target off for more than one minute) leads to a load failure for the kernel. A warm boot ("reboot" from a running Linux) or a not-so-cold boot (turn target off and power it on again after a few seconds) seems to work as expected. I tried to insert delays and/or "mmc rescan", but that does not seem to have any effect. Also error message is not always the same; sometimes I get: Error: too many data blocks to be read. Failed to load '/boot/uImage' other times: ** fs_devread read error - block Failed to mount ext2 filesystem... ** Unrecognized filesystem type ** My full environment is: BOOT_CURRENT=A SYSTEM_R=/dev/mtdblock5 arch=mips baudrate=115200 board=vocore2 board_name=vocore2 boot_a=echo "Loading System A";part=6;run boot_x boot_b=echo "Loading System B";part=7;run boot_x boot_now=if test "${BOOT_CURRENT}" = A; then run boot_a; elif test "${BOOT_CURRENT}" = B; then run boot_b; fi; if env exists BOOT_A_GOOD; then run boot_a; fi; if env exists BOOT_B_GOOD; then run boot_b; fi; run boot_r boot_r=echo "Loading Recovery"; setenv bootargs "${default_bootargs} mtdparts=${mtdparts} root=/dev/mtdblock5"; bootm bc050000 boot_x=load mmc 0:${part} 85000000 /boot/uImage && setenv bootargs "${default_bootargs} mtdparts=${mtdparts} root=/dev/mmcblk0p${part}" && bootm ${fileaddr} bootcmd=run do_boot bootcount=1 bootdelay=2 cpu=mips32 default_bootargs=earlyprintk rootwait console=ttyS2,115200 do_boot=test ${bootcount} -gt 1 && run remove_boot; run boot_now fdtcontroladdr=86f6d340 fileaddr=84000000 filesize=154 fupdate=mmc rescan && load mmc 0:1 84000000 uboot.scr && fatrm mmc 0:1 uboot.scr && source 84000000 && echo Flash updated || Flash update FAILED! mtdids=nor0=spi0.0 mtdparts=spi0.0:312k(u-boot),4k(env),4k(factory),2368k(kernel),-(filesystem) remove_boot=if env exists BOOT_CURRENT; then setenv BOOT_CURRENT; saveenv; elif env exists BOOT_A_GOOD; then setenv BOOT_A_GOOD; saveenv; elif env exists BOOT_B_GOOD; then setenv BOOT_B_GOOD; saveenv; fi soc=mt7628 stderr=uart2@e00 stdin=uart2@e00 stdout=uart2@e00 vendor=vocore ver=U-Boot 2020.10-rc3 (Sep 16 2020 - 19:43:03 +0200) It was suggested (on IRC) it could be a cache problem. unfortunately trying to enable cache control (CONFIG_CMD_CACHE) raises error in compilation: ... LD u-boot /home/valeria/MyProject/VoCore/Buildroot-2/recov/per-package/uboot/host/bin/mipsel-linux-ld.bfd: cmd/built-in.o: in function `do_icache': cmd/cache.c:(.text.do_icache+0x5c): undefined reference to `icache_disable' /home/valeria/MyProject/VoCore/Buildroot-2/recov/per-package/uboot/host/bin/mipsel-linux-ld.bfd: cmd/cache.c:(.text.do_icache+0x6c): undefined reference to `icache_enable' /home/valeria/MyProject/VoCore/Buildroot-2/recov/per-package/uboot/host/bin/mipsel-linux-ld.bfd: cmd/cache.c:(.text.do_icache+0x8c): undefined reference to `icache_status' Makefile:1753: recipe for target 'u-boot' failed make[2]: *** [u-boot] Error 1 package/pkg-generic.mk:266 <http://pkg-generic.mk:266>: recipe for target '/home/valeria/MyProject/VoCore/Buildroot-2/recov/build/uboot-v2020.10-rc3/.stamp_built' failed make[1]: *** [/home/valeria/MyProject/VoCore/Buildroot-2/recov/build/uboot-v2020.10-rc3/.stamp_built] Error 2 Makefile:23: recipe for target '_all' failed make: *** [_all] Error 2 and I have no idea how to fix this. Any hint would be very welcome as this is a real show-stopper for me. Thanks in Advance Mauro
From 4a9d0b3ce9fcfca9fcb987f26c51600fee66b4e3 Mon Sep 17 00:00:00 2001 From: Mauro Condarelli <mc5686@mclink.it> Date: Wed, 2 Sep 2020 16:04:40 +0200 Subject: [PATCH 1/4] Small fixes to reduce size and ensure correct console output. Signed-off-by: Mauro Condarelli <mc5686@mclink.it> --- arch/mips/dts/vocore_vocore2.dts | 2 +- include/configs/vocore2.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/arch/mips/dts/vocore_vocore2.dts b/arch/mips/dts/vocore_vocore2.dts index 3502e4b8b7..9adf39652f 100644 --- a/arch/mips/dts/vocore_vocore2.dts +++ b/arch/mips/dts/vocore_vocore2.dts @@ -59,7 +59,7 @@ #address-cells = <1>; #size-cells = <1>; compatible = "jedec,spi-nor"; - spi-max-frequency = <25000000>; + spi-max-frequency = <40000000>; reg = <0>; }; }; diff --git a/include/configs/vocore2.h b/include/configs/vocore2.h index 40467b737c..29a57ad233 100644 --- a/include/configs/vocore2.h +++ b/include/configs/vocore2.h @@ -25,6 +25,7 @@ #define CONFIG_SPL_BSS_START_ADDR 0x80010000 #define CONFIG_SPL_BSS_MAX_SIZE 0x10000 #define CONFIG_SPL_MAX_SIZE 0x10000 +#define CONFIG_SPL_PAD_TO 0 /* Dummy value */ #define CONFIG_SYS_UBOOT_BASE 0 @@ -34,6 +35,7 @@ #define CONFIG_SYS_NS16550_CLK 40000000 #define CONFIG_SYS_NS16550_REG_SIZE -4 #define CONFIG_SYS_NS16550_COM3 0xb0000e00 +#define CONFIG_CONS_INDEX 3 /* RAM */ -- 2.25.1
From 11d9dd468b34afe6b99ccbc647b5673ee20197cd Mon Sep 17 00:00:00 2001 From: Mauro Condarelli <mc5686@mclink.it> Date: Wed, 2 Sep 2020 16:41:20 +0200 Subject: [PATCH 4/4] Project specific ENV initialization. Signed-off-by: Mauro Condarelli <mc5686@mclink.it> --- include/configs/vocore2.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/include/configs/vocore2.h b/include/configs/vocore2.h index dfdb8fcc04..ea8740720c 100644 --- a/include/configs/vocore2.h +++ b/include/configs/vocore2.h @@ -49,5 +49,19 @@ #define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_TEXT_BASE /* Environment settings */ +#define CONFIG_BOOTCOMMAND \ + "run fupdate; run boot_r" +#define CONFIG_EXTRA_ENV_SETTINGS \ + "default_bootargs=earlyprintk rootwait console=ttyS2,115200\0" \ + "mtdids=nor0=spi0.0\0" \ + "mtdparts=spi0.0:312k(u-boot),4k(env),4k(factory),2368k(kernel),-(filesystem)\0" \ + "fupdate=mmc rescan && load mmc 0:1 84000000 uboot.scr && fatrm mmc 0:1 uboot.scr && source 84000000 && echo Flash updated\0" \ + "boot_a=echo \"Loading System A\";part=6;run boot_x\0" \ + "boot_b=echo \"Loading System B\";part=7;run boot_x\0" \ + "boot_x=load mmc 0:${part} 85000000 /boot/uImage && setenv bootargs \"${default_bootargs} mtdparts=${mtdparts} root=/dev/mmcblk0p${part}\" && bootm ${fileaddr}\0" \ + "boot_r=echo \"Loading Recovery\"; setenv bootargs \"${default_bootargs} mtdparts=${mtdparts} root=/dev/mtdblock5\"; bootm bc050000\0" \ + "remove_boot=if env exists BOOT_CURRENT; then setenv BOOT_CURRENT; saveenv; elif env exists BOOT_A_GOOD; then setenv BOOT_A_GOOD; saveenv; elif env exists BOOT_B_GOOD; then setenv BOOT_B_GOOD; saveenv; fi\0" \ + "boot_now=if test \"${BOOT_CURRENT}\" = A; then run boot_a; elif test \"${BOOT_CURRENT}\" = B; then run boot_b; fi; if env exists BOOT_A_GOOD; then run boot_a; fi; if env exists BOOT_B_GOOD; then run boot_b; fi; run boot_r\0" \ + "do_boot=test ${bootcount} -gt 1 && run remove_boot; run boot_now" #endif //__VOCORE2_CONFIG_H__ -- 2.25.1
From 4ebe2a580e572f79a6ac6c329b448f4bd64ee028 Mon Sep 17 00:00:00 2001 From: Mauro Condarelli <mc5686@mclink.it> Date: Thu, 3 Sep 2020 08:37:58 +0200 Subject: [PATCH 3/4] Fix missing __udivdi3 in SquashFS implementation. Signed-off-by: Mauro Condarelli <mc5686@mclink.it> --- fs/squashfs/sqfs.c | 45 +++++++++++++++++++++++++-------------- fs/squashfs/sqfs_inode.c | 8 +++---- include/configs/vocore2.h | 2 +- 3 files changed, 34 insertions(+), 21 deletions(-) diff --git a/fs/squashfs/sqfs.c b/fs/squashfs/sqfs.c index f67f7c4a40..b8dcc15eb8 100644 --- a/fs/squashfs/sqfs.c +++ b/fs/squashfs/sqfs.c @@ -18,6 +18,8 @@ #include <string.h> #include <squashfs.h> #include <part.h> +#include <div64.h> +#include <stdio.h> #include "sqfs_decompressor.h" #include "sqfs_filesystem.h" @@ -82,13 +84,16 @@ static int sqfs_count_tokens(const char *filename) */ static int sqfs_calc_n_blks(__le64 start, __le64 end, u64 *offset) { - u64 start_, table_size; + u64 start_, table_size, blks; table_size = le64_to_cpu(end) - le64_to_cpu(start); - start_ = le64_to_cpu(start) / ctxt.cur_dev->blksz; + start_ = le64_to_cpu(start); + do_div(start_, ctxt.cur_dev->blksz); *offset = le64_to_cpu(start) - (start_ * ctxt.cur_dev->blksz); - return DIV_ROUND_UP(table_size + *offset, ctxt.cur_dev->blksz); + blks = table_size + *offset; + if (do_div(blks, ctxt.cur_dev->blksz)) blks++; + return blks; } /* @@ -109,8 +114,8 @@ static int sqfs_frag_lookup(u32 inode_fragment_index, if (inode_fragment_index >= get_unaligned_le32(&sblk->fragments)) return -EINVAL; - start = get_unaligned_le64(&sblk->fragment_table_start) / - ctxt.cur_dev->blksz; + start = get_unaligned_le64(&sblk->fragment_table_start); + do_div(start, ctxt.cur_dev->blksz); n_blks = sqfs_calc_n_blks(sblk->fragment_table_start, sblk->export_table_start, &table_offset); @@ -135,7 +140,8 @@ static int sqfs_frag_lookup(u32 inode_fragment_index, start_block = get_unaligned_le64(table + table_offset + block * sizeof(u64)); - start = start_block / ctxt.cur_dev->blksz; + start = start_block; + do_div(start, ctxt.cur_dev->blksz); n_blks = sqfs_calc_n_blks(cpu_to_le64(start_block), sblk->fragment_table_start, &table_offset); @@ -641,8 +647,8 @@ static int sqfs_read_inode_table(unsigned char **inode_table) table_size = get_unaligned_le64(&sblk->directory_table_start) - get_unaligned_le64(&sblk->inode_table_start); - start = get_unaligned_le64(&sblk->inode_table_start) / - ctxt.cur_dev->blksz; + start = get_unaligned_le64(&sblk->inode_table_start); + do_div(start, ctxt.cur_dev->blksz); n_blks = sqfs_calc_n_blks(sblk->inode_table_start, sblk->directory_table_start, &table_offset); @@ -725,8 +731,8 @@ static int sqfs_read_directory_table(unsigned char **dir_table, u32 **pos_list) /* DIRECTORY TABLE */ table_size = get_unaligned_le64(&sblk->fragment_table_start) - get_unaligned_le64(&sblk->directory_table_start); - start = get_unaligned_le64(&sblk->directory_table_start) / - ctxt.cur_dev->blksz; + start = get_unaligned_le64(&sblk->directory_table_start); + do_div(start, ctxt.cur_dev->blksz); n_blks = sqfs_calc_n_blks(sblk->directory_table_start, sblk->fragment_table_start, &table_offset); @@ -1155,6 +1161,7 @@ static int sqfs_get_regfile_info(struct squashfs_reg_inode *reg, fentry); if (ret < 0) return -EINVAL; + finfo->comp = true; if (fentry->size < 1 || fentry->start < 0) return -EINVAL; @@ -1322,17 +1329,19 @@ int sqfs_read(const char *filename, void *buf, loff_t offset, loff_t len, data_offset = finfo.start; datablock = malloc(get_unaligned_le32(&sblk->block_size)); if (!datablock) { + printf("Error: malloc(%u) failed.\n", get_unaligned_le32(&sblk->block_size)); ret = -ENOMEM; goto free_paths; } } for (j = 0; j < datablk_count; j++) { - start = data_offset / ctxt.cur_dev->blksz; + start = data_offset; + do_div(start, ctxt.cur_dev->blksz); table_size = SQFS_BLOCK_SIZE(finfo.blk_sizes[j]); table_offset = data_offset - (start * ctxt.cur_dev->blksz); - n_blks = DIV_ROUND_UP(table_size + table_offset, - ctxt.cur_dev->blksz); + n_blks = table_size + table_offset; + if (do_div(n_blks, ctxt.cur_dev->blksz)) n_blks++; data_buffer = malloc_cache_aligned(n_blks * ctxt.cur_dev->blksz); @@ -1359,8 +1368,10 @@ int sqfs_read(const char *filename, void *buf, loff_t offset, loff_t len, dest_len = get_unaligned_le32(&sblk->block_size); ret = sqfs_decompress(&ctxt, datablock, &dest_len, data, table_size); - if (ret) + if (ret) { + printf("Errrt: block decompress failed.\n"); goto free_buffer; + } memcpy(buf + offset + *actread, datablock, dest_len); *actread += dest_len; @@ -1382,10 +1393,12 @@ int sqfs_read(const char *filename, void *buf, loff_t offset, loff_t len, goto free_buffer; } - start = frag_entry.start / ctxt.cur_dev->blksz; + start = frag_entry.start; + do_div(start, ctxt.cur_dev->blksz); table_size = SQFS_BLOCK_SIZE(frag_entry.size); table_offset = frag_entry.start - (start * ctxt.cur_dev->blksz); - n_blks = DIV_ROUND_UP(table_size + table_offset, ctxt.cur_dev->blksz); + n_blks = table_size + table_offset; + if (do_div(n_blks, ctxt.cur_dev->blksz)) n_blks++; fragment = malloc_cache_aligned(n_blks * ctxt.cur_dev->blksz); diff --git a/fs/squashfs/sqfs_inode.c b/fs/squashfs/sqfs_inode.c index 1387779a85..f0e916e6a3 100644 --- a/fs/squashfs/sqfs_inode.c +++ b/fs/squashfs/sqfs_inode.c @@ -11,6 +11,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <div64.h> #include "sqfs_decompressor.h" #include "sqfs_filesystem.h" @@ -67,10 +68,9 @@ int sqfs_inode_size(struct squashfs_base_inode *inode, u32 blk_size) u64 file_size = get_unaligned_le64(&lreg->file_size); unsigned int blk_list_size; - if (fragment == 0xFFFFFFFF) - blk_list_size = DIV_ROUND_UP(file_size, blk_size); - else - blk_list_size = file_size / blk_size; + if (do_div(file_size, blk_size) && (fragment == 0xFFFFFFFF)) + file_size++; + blk_list_size = file_size; return sizeof(*lreg) + blk_list_size * sizeof(u32); } diff --git a/include/configs/vocore2.h b/include/configs/vocore2.h index 29a57ad233..dfdb8fcc04 100644 --- a/include/configs/vocore2.h +++ b/include/configs/vocore2.h @@ -41,7 +41,7 @@ /* Memory usage */ #define CONFIG_SYS_MAXARGS 64 -#define CONFIG_SYS_MALLOC_LEN (1024 * 1024) +#define CONFIG_SYS_MALLOC_LEN (16 * 1024 * 1024) #define CONFIG_SYS_BOOTPARAMS_LEN (128 * 1024) #define CONFIG_SYS_CBSIZE 512 -- 2.25.1
From 1877771a95e130565d5d9c9fbaadea0673b38a0d Mon Sep 17 00:00:00 2001 From: Mauro Condarelli <mc5686@mclink.it> Date: Wed, 2 Sep 2020 16:08:54 +0200 Subject: [PATCH 2/4] Enlarge SPL malloc area to prevent failure in lzma decompression. Signed-off-by: Mauro Condarelli <mc5686@mclink.it> --- configs/vocore2_defconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/vocore2_defconfig b/configs/vocore2_defconfig index 99a1143e6e..5776aada15 100644 --- a/configs/vocore2_defconfig +++ b/configs/vocore2_defconfig @@ -6,7 +6,7 @@ CONFIG_ENV_SIZE=0x1000 CONFIG_ENV_OFFSET=0x04e000 CONFIG_ENV_SECT_SIZE=0x1000 CONFIG_SYS_BOOTCOUNT_ADDR=0xb000006c -CONFIG_SPL_SYS_MALLOC_F_LEN=0x20000 +CONFIG_SPL_SYS_MALLOC_F_LEN=0x40000 CONFIG_SPL=y CONFIG_SYS_BOOTCOUNT_SINGLEWORD=y CONFIG_ARCH_MTMIPS=y -- 2.25.1