[U-Boot] [PATCH] env_fat: use get_device_and_partition() during env save and load

Use get_device_and_partition() is better since: 1. It will call the device initialize function internally. So we can remove the mmc intialization code to save many lines. 2. It is used by fatls/fatload/fatwrite. So saveenv & load env should use it too. 3. It can parse the "D:P", "D", "D:", "D:auto" string to get correct device and partition information by run-time.
Also we remove the FAT_ENV_DEVICE and FAT_ENV_PART. We use a string: FAT_ENV_DEVICE_AND_PART. For at91sam9m10g45ek, it is "0". That means use device 0 and if: a)device 0 has no partition table, use the whole device as a FAT file system. b)device 0 has partittion table, use the partition #1.
Refer to the commit: 10a37fd7a4 for details of device & partition string.
Signed-off-by: Josh Wu josh.wu@atmel.com --- common/env_fat.c | 86 ++++++++++++------------------------ include/configs/at91sam9m10g45ek.h | 8 +++- 2 files changed, 34 insertions(+), 60 deletions(-)
diff --git a/common/env_fat.c b/common/env_fat.c index aad0487..328c09d 100644 --- a/common/env_fat.c +++ b/common/env_fat.c @@ -38,39 +38,24 @@ int saveenv(void) { env_t env_new; block_dev_desc_t *dev_desc = NULL; - int dev = FAT_ENV_DEVICE; - int part = FAT_ENV_PART; + disk_partition_t info; + int dev, part; int err;
err = env_export(&env_new); if (err) return err;
-#ifdef CONFIG_MMC - if (strcmp(FAT_ENV_INTERFACE, "mmc") == 0) { - struct mmc *mmc = find_mmc_device(dev); - - if (!mmc) { - printf("no mmc device at slot %x\n", dev); - return 1; - } - - mmc->has_init = 0; - mmc_init(mmc); - } -#endif /* CONFIG_MMC */ - - dev_desc = get_dev(FAT_ENV_INTERFACE, dev); - if (dev_desc == NULL) { - printf("Failed to find %s%d\n", - FAT_ENV_INTERFACE, dev); + part = get_device_and_partition(FAT_ENV_INTERFACE, + FAT_ENV_DEVICE_AND_PART, + &dev_desc, &info, 1); + if (part < 0) return 1; - }
- err = fat_register_device(dev_desc, part); - if (err) { - printf("Failed to register %s%d:%d\n", - FAT_ENV_INTERFACE, dev, part); + dev = dev_desc->dev; + if (fat_set_blk_dev(dev_desc, &info) != 0) { + printf("\n** Unable to use %s %d:%d for saveenv **\n", + FAT_ENV_INTERFACE, dev, part); return 1; }
@@ -90,48 +75,33 @@ void env_relocate_spec(void) { char buf[CONFIG_ENV_SIZE]; block_dev_desc_t *dev_desc = NULL; - int dev = FAT_ENV_DEVICE; - int part = FAT_ENV_PART; + disk_partition_t info; + int dev, part; int err;
-#ifdef CONFIG_MMC - if (strcmp(FAT_ENV_INTERFACE, "mmc") == 0) { - struct mmc *mmc = find_mmc_device(dev); - - if (!mmc) { - printf("no mmc device at slot %x\n", dev); - set_default_env(NULL); - return; - } - - mmc->has_init = 0; - mmc_init(mmc); - } -#endif /* CONFIG_MMC */ - - dev_desc = get_dev(FAT_ENV_INTERFACE, dev); - if (dev_desc == NULL) { - printf("Failed to find %s%d\n", - FAT_ENV_INTERFACE, dev); - set_default_env(NULL); - return; - } - - err = fat_register_device(dev_desc, part); - if (err) { - printf("Failed to register %s%d:%d\n", - FAT_ENV_INTERFACE, dev, part); - set_default_env(NULL); - return; + part = get_device_and_partition(FAT_ENV_INTERFACE, + FAT_ENV_DEVICE_AND_PART, + &dev_desc, &info, 1); + if (part < 0) + goto err_env_relocate; + + dev = dev_desc->dev; + if (fat_set_blk_dev(dev_desc, &info) != 0) { + printf("\n** Unable to use %s %d:%d for loading the env **\n", + FAT_ENV_INTERFACE, dev, part); + goto err_env_relocate; }
err = file_fat_read(FAT_ENV_FILE, (uchar *)&buf, CONFIG_ENV_SIZE); if (err == -1) { printf("\n** Unable to read "%s" from %s%d:%d **\n", FAT_ENV_FILE, FAT_ENV_INTERFACE, dev, part); - set_default_env(NULL); - return; + goto err_env_relocate; }
env_import(buf, 1); + return; + +err_env_relocate: + set_default_env(NULL); } diff --git a/include/configs/at91sam9m10g45ek.h b/include/configs/at91sam9m10g45ek.h index 341b21d..db5d5ea 100644 --- a/include/configs/at91sam9m10g45ek.h +++ b/include/configs/at91sam9m10g45ek.h @@ -167,8 +167,12 @@ #elif CONFIG_SYS_USE_MMC /* bootstrap + u-boot + env + linux in mmc */ #define FAT_ENV_INTERFACE "mmc" -#define FAT_ENV_DEVICE 0 -#define FAT_ENV_PART 1 +/* + * We don't specify the part number, if device 0 has partition table, it means + * the first partition; it no partition table, then take whole device as a + * FAT file system. + */ +#define FAT_ENV_DEVICE_AND_PART "0" #define FAT_ENV_FILE "uboot.env" #define CONFIG_ENV_IS_IN_FAT #define CONFIG_FAT_WRITE

On 06/16/2014 02:14 AM, Josh Wu wrote:
Use get_device_and_partition() is better since:
- It will call the device initialize function internally. So we can
remove the mmc intialization code to save many lines. 2. It is used by fatls/fatload/fatwrite. So saveenv & load env should use it too. 3. It can parse the "D:P", "D", "D:", "D:auto" string to get correct device and partition information by run-time.
Also we remove the FAT_ENV_DEVICE and FAT_ENV_PART. We use a string: FAT_ENV_DEVICE_AND_PART. For at91sam9m10g45ek, it is "0". That means use device 0 and if: a)device 0 has no partition table, use the whole device as a FAT file system. b)device 0 has partittion table, use the partition #1.
Refer to the commit: 10a37fd7a4 for details of device & partition string.
(briefly) Reviewed-by: Stephen Warren swarren@nvidia.com
Questions though:
* Can we delete the implementation of fat_register_device() now it's not used? If it is used, shouldn't the other uses be converted in a similar fashion?
* Should the new config variable FAT_ENV_DEVICE_AND_PART be documented in README?

Hi, Stephen
On 6/17/2014 3:51 AM, Stephen Warren wrote:
On 06/16/2014 02:14 AM, Josh Wu wrote:
Use get_device_and_partition() is better since:
- It will call the device initialize function internally. So we can
remove the mmc intialization code to save many lines. 2. It is used by fatls/fatload/fatwrite. So saveenv & load env should use it too. 3. It can parse the "D:P", "D", "D:", "D:auto" string to get correct device and partition information by run-time.
Also we remove the FAT_ENV_DEVICE and FAT_ENV_PART. We use a string: FAT_ENV_DEVICE_AND_PART. For at91sam9m10g45ek, it is "0". That means use device 0 and if: a)device 0 has no partition table, use the whole device as a FAT file system. b)device 0 has partittion table, use the partition #1.
Refer to the commit: 10a37fd7a4 for details of device & partition string.
(briefly) Reviewed-by: Stephen Warren swarren@nvidia.com
Questions though:
- Can we delete the implementation of fat_register_device() now it's not
used? If it is used, shouldn't the other uses be converted in a similar fashion?
currently It still be used by SPL (common/spl/spl_fat.c) and three board's firmware auto_update.
For SPL, I think they need use simpler fat functions. My first thought is: to split the get_device_and_partition() into smaller parts(dev:part string parser, get_device, and register partition ). Then the SPL can use the the register partition code.
For board's auto_update case, I think it is same as above.
But above two changes (not do yet) will not included in this patch series.
- Should the new config variable FAT_ENV_DEVICE_AND_PART be documented
in README?
It seems all CONFIG_ENV_IS_IN_FAT related variables are not documented. I will send a v2 version of this patch and add this. The CONFIG_ENV_IS_IN_FAT will be put below of CONFIG_ENV_IS_IN_UBI in README file.
Best Regards, Josh Wu
participants (2)
-
Josh Wu
-
Stephen Warren