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