[U-Boot] U-boot UBI environment

Heiko Schocher hs at denx.de
Wed May 11 07:51:11 CEST 2016


Hello Joe,

Am 11.05.2016 um 01:15 schrieb Joseph Hershberger:
> Hi Kevin,
>
> Am 09.05.2016 um 23:16 schrieb Kevin Smith:
>> Hello,
>>
>> I would appreciate some UBI help/advice if you are able to provide it.
>> I am trying to use UBI to store my u-boot environment, but when I try
>> to 'saveenv', it is corrupting another volume of my UBI.  I can image
>> the rootfs volume and boot Linux from it without a problem.  However,
>> the first time that I save the u-boot environment, the rootfs becomes
>> unreadable.  When the rootfs is corrupted, I have booted Linux from
>> another source and tried to attach UBI and dd out the data.  It
>> appears as all 0xFF.  Both u-boot and Linux can read the env volume correctly.
>>
>> I do not think that there is a board in U-boot that uses UBI env, so I
>> do not have anything to compare to.  I have included some details of
>> my setup below.  Do you have any suggestion about what might be wrong?
>> I saw the recent patch b1d6590d35, and thought it might fix it, but am
>> still having the problem even with this.  Maybe there is another bug?
>> I am glad to provide more info as needed.
>> Thank you,
>> Kevin
>>
>> DTS:
>> flash at d0000 {
>>        num-cs = <1>;
>>        marvell,nand-keep-config;
>>        marvell,nand-enable-arbiter;
>>        nand-on-flash-bbt;
>>        nand-ecc-strength = <4>;
>>        nand-ecc-step-size = <512>;
>>        status = "okay";
>>
>>        partition at 0 {
>>            label = "mvboot";
>>            reg = <0 0x200000>;
>>        };
>>        partition at 200000 {
>>            label = "ubi";
>>            reg = <0x200000 0x1fe00000>;
>>        };
>> };
>> Config:
>> #define MTDIDS_DEFAULT        "nand0=pxa3xx_nand-0"
>> #define MTDPARTS_DEFAULT "mtdparts=pxa3xx_nand-0:2m(mvboot),-(ubi)"
>> #define CONFIG_CMD_UBI
>> #define CONFIG_CMD_UBIFS
>
>> #define CONFIG_MTD_UBI_FASTMAP
>> #define CONFIG_MTD_UBI_FASTMAP_AUTOCONVERT    1
>
> I don’t define these 2, not sure if it matters.

This should be no problem ... but you (Kevin) may disable
FASTMAP for a test?

>> #define CONFIG_ENV_IS_IN_UBI
>> #define CONFIG_ENV_UBI_PART    "ubi"
>> #define CONFIG_ENV_UBI_VOLUME    "u-boot-env"
>> #define CONFIG_ENV_SIZE        (64 * 1024)
>
> My config looks like this:
>
> #define MTDIDS_DEFAULT "nand0=xilinx_nand"
> #define MTDPARTS_DEFAULT \
> 	"mtdparts=xilinx_nand:" \
> 		"128k(fsbl)ro," \
> 		"11M(u-boot)ro," \
> 		"70M(boot-config)," \
> 		"-(root)"

You have 70MB for Env?

> #define CONFIG_ENV_IS_IN_UBI
> #define CONFIG_ENV_UBI_PART "boot-config"
> #define CONFIG_ENV_UBI_VOLUME "u-boot-env1"
> #define CONFIG_ENV_UBI_VOLUME_REDUND "u-boot-env2"
> #define CONFIG_ENV_SIZE			0x20000
>
> I create volumes like this:
>
> 	"writepartitions=" \
> 		"if ubi part boot-config && " \
> 			"ubi read $verifyaddr u-boot-env1 1 && " \
> 			"ubi read $verifyaddr u-boot-env2 1; " \
> 		"then " \
> 			"ubi remove bootfs && " \
> 			"ubi remove config; " \
> 		"else " \
> 			"nand erase.part boot-config && " \
> 			"ubi part boot-config && " \
> 			"ubi create u-boot-env1 " __stringify(CONFIG_ENV_SIZE) " dynamic && " \
> 			"ubi create u-boot-env2 " __stringify(CONFIG_ENV_SIZE) " dynamic; " \
> 		"fi && " \
> 		"ubi create bootfs " __stringify(CONFIG_BOOTFS_VOLUME_SIZE) " dynamic && " \
> 		"ubi create config - dynamic && " \
> 		"if ubi part root && " \
> 			"ubi read $verifyaddr rootfs 1; " \
> 		"then " \
> 			"ubi remove rootfs; " \
> 		"else " \
> 			"nand erase.part root && " \
> 			"ubi part root; " \
> 		"fi && " \
> 		"ubi create rootfs - dynamic;\0" \
>
>
>> => ubi info
>> UBI: MTD device name:            "mtd=1"
>> UBI: MTD device size:            510 MiB
>> UBI: physical eraseblock size:   131072 bytes (128 KiB)
>> UBI: logical eraseblock size:    126976 bytes
>> UBI: number of good PEBs:        4072
>> UBI: number of bad PEBs:         8
>> UBI: smallest flash I/O unit:    2048
>> UBI: VID header offset:          2048 (aligned 2048)
>> UBI: data offset:                4096
>> UBI: max. allowed volumes:       128
>> UBI: wear-leveling threshold:    4096
>> UBI: number of internal volumes: 1
>> UBI: number of user volumes:     2
>> UBI: available PEBs:             0
>> UBI: total number of reserved PEBs: 4072
>> UBI: number of PEBs reserved for bad PEB handling: 72
>> UBI: max/mean erase counter: 18/4
>>
>> => ubi info l
>> Volume information dump:
>>            vol_id          0
>>            reserved_pebs   1
>>            alignment       1
>>            data_pad        0
>>            vol_type        3
>>            name_len        10
>>            usable_leb_size 126976
>>            used_ebs        1
>>            used_bytes      126976
>>            last_eb_bytes   126976
>>            corrupted       0
>>            upd_marker      0
>>            name            u-boot-env

@Kevin: you have exactly one PEB for this volume ... may this is the problem?
Can you try it with a Volume, which have more space?

>> Volume information dump:
>>            vol_id          1
>>            reserved_pebs   3993
>>            alignment       1
>>            data_pad        0
>>            vol_type        3
>>            name_len        6
>>            usable_leb_size 126976
>>            used_ebs        3993
>>            used_bytes      507015168
>>            last_eb_bytes   126976
>>            corrupted       0
>>            upd_marker      0
>>            name            rootfs
>> Volume information dump:
>>            vol_id          2147479551
>>            reserved_pebs   2
>>            alignment       1
>>            data_pad        0
>>            vol_type        3
>>            name_len        13
>>            usable_leb_size 126976
>>            used_ebs        2
>>            used_bytes      253952
>>            last_eb_bytes   2
>>            corrupted       0
>>            upd_marker      0
>>            name            layout volume
>>
>> => ubifsmount ubi0:rootfs
>> Error reading superblock on volume 'ubi0:rootfs' errno=-30!
>> ubifsmount - mount UBIFS volume
>>
>> Usage:
>> ubifsmount <volume-name>
>>        - mount 'volume-name' volume
>>
>
> I also notice that you are not using a redundant env like I am, so maybe there is a bug when not using a redundant env that I don't run into.

I don;t know.

bye,
Heiko
-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany


More information about the U-Boot mailing list