1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * (c) Copyright 2016 by VRT Technology 4 * 5 * Author: 6 * Stuart Longland <stuartl (at) vrt.com.au> 7 * 8 * Based on FAT environment driver 9 * (c) Copyright 2011 by Tigris Elektronik GmbH 10 * 11 * Author: 12 * Maximilian Schwerin <mvs (at) tigris.de> 13 * 14 * and EXT4 filesystem implementation 15 * (C) Copyright 2011 - 2012 Samsung Electronics 16 * EXT4 filesystem implementation in Uboot by 17 * Uma Shankar <uma.shankar (at) samsung.com> 18 * Manjunatha C Achar <a.manjunatha (at) samsung.com> 19 */ 20 21 #include <common.h> 22 23 #include <command.h> 24 #include <environment.h> 25 #include <linux/stddef.h> 26 #include <malloc.h> 27 #include <memalign.h> 28 #include <search.h> 29 #include <errno.h> 30 #include <ext4fs.h> 31 #include <mmc.h> 32 33 #ifdef CONFIG_CMD_SAVEENV 34 static int env_ext4_save(void) 35 { 36 env_t env_new; 37 struct blk_desc *dev_desc = NULL; 38 disk_partition_t info; 39 int dev, part; 40 int err; 41 42 err = env_export(&env_new); 43 if (err) 44 return err; 45 46 part = blk_get_device_part_str(CONFIG_ENV_EXT4_INTERFACE, 47 CONFIG_ENV_EXT4_DEVICE_AND_PART, 48 &dev_desc, &info, 1); 49 if (part < 0) 50 return 1; 51 52 dev = dev_desc->devnum; 53 ext4fs_set_blk_dev(dev_desc, &info); 54 55 if (!ext4fs_mount(info.size)) { 56 printf("\n** Unable to use %s %s for saveenv **\n", 57 CONFIG_ENV_EXT4_INTERFACE, 58 CONFIG_ENV_EXT4_DEVICE_AND_PART); 59 return 1; 60 } 61 62 err = ext4fs_write(CONFIG_ENV_EXT4_FILE, (void *)&env_new, 63 sizeof(env_t)); 64 ext4fs_close(); 65 66 if (err == -1) { 67 printf("\n** Unable to write \"%s\" from %s%d:%d **\n", 68 CONFIG_ENV_EXT4_FILE, CONFIG_ENV_EXT4_INTERFACE, dev, 69 part); 70 return 1; 71 } 72 73 puts("done\n"); 74 return 0; 75 } 76 #endif /* CONFIG_CMD_SAVEENV */ 77 78 static int env_ext4_load(void) 79 { 80 ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE); 81 struct blk_desc *dev_desc = NULL; 82 disk_partition_t info; 83 int dev, part; 84 int err; 85 loff_t off; 86 87 #ifdef CONFIG_MMC 88 if (!strcmp(CONFIG_ENV_EXT4_INTERFACE, "mmc")) 89 mmc_initialize(NULL); 90 #endif 91 92 part = blk_get_device_part_str(CONFIG_ENV_EXT4_INTERFACE, 93 CONFIG_ENV_EXT4_DEVICE_AND_PART, 94 &dev_desc, &info, 1); 95 if (part < 0) 96 goto err_env_relocate; 97 98 dev = dev_desc->devnum; 99 ext4fs_set_blk_dev(dev_desc, &info); 100 101 if (!ext4fs_mount(info.size)) { 102 printf("\n** Unable to use %s %s for loading the env **\n", 103 CONFIG_ENV_EXT4_INTERFACE, 104 CONFIG_ENV_EXT4_DEVICE_AND_PART); 105 goto err_env_relocate; 106 } 107 108 err = ext4_read_file(CONFIG_ENV_EXT4_FILE, buf, 0, CONFIG_ENV_SIZE, 109 &off); 110 ext4fs_close(); 111 112 if (err == -1) { 113 printf("\n** Unable to read \"%s\" from %s%d:%d **\n", 114 CONFIG_ENV_EXT4_FILE, CONFIG_ENV_EXT4_INTERFACE, dev, 115 part); 116 goto err_env_relocate; 117 } 118 119 return env_import(buf, 1); 120 121 err_env_relocate: 122 set_default_env(NULL); 123 124 return -EIO; 125 } 126 127 U_BOOT_ENV_LOCATION(ext4) = { 128 .location = ENVL_EXT4, 129 ENV_NAME("EXT4") 130 .load = env_ext4_load, 131 .save = env_save_ptr(env_ext4_save), 132 }; 133