10649cd0dSSimon Glass /* 20649cd0dSSimon Glass * (c) Copyright 2011 by Tigris Elektronik GmbH 30649cd0dSSimon Glass * 40649cd0dSSimon Glass * Author: 50649cd0dSSimon Glass * Maximilian Schwerin <mvs@tigris.de> 60649cd0dSSimon Glass * 70649cd0dSSimon Glass * SPDX-License-Identifier: GPL-2.0+ 80649cd0dSSimon Glass */ 90649cd0dSSimon Glass 100649cd0dSSimon Glass #include <common.h> 110649cd0dSSimon Glass 120649cd0dSSimon Glass #include <command.h> 130649cd0dSSimon Glass #include <environment.h> 140649cd0dSSimon Glass #include <linux/stddef.h> 150649cd0dSSimon Glass #include <malloc.h> 160649cd0dSSimon Glass #include <memalign.h> 170649cd0dSSimon Glass #include <search.h> 180649cd0dSSimon Glass #include <errno.h> 190649cd0dSSimon Glass #include <fat.h> 200649cd0dSSimon Glass #include <mmc.h> 210649cd0dSSimon Glass 22*4415f1d1SSimon Glass #ifdef CONFIG_SPL_BUILD 23*4415f1d1SSimon Glass /* TODO(sjg@chromium.org): Figure out why this is needed */ 24*4415f1d1SSimon Glass # if !defined(CONFIG_TARGET_AM335X_EVM) || defined(CONFIG_SPL_OS_BOOT) 25*4415f1d1SSimon Glass # define LOADENV 26*4415f1d1SSimon Glass # endif 27*4415f1d1SSimon Glass #else 28*4415f1d1SSimon Glass # define LOADENV 29*4415f1d1SSimon Glass # if defined(CONFIG_CMD_SAVEENV) 30*4415f1d1SSimon Glass # define CMD_SAVEENV 31*4415f1d1SSimon Glass # endif 32*4415f1d1SSimon Glass #endif 33*4415f1d1SSimon Glass 340649cd0dSSimon Glass char *env_name_spec = "FAT"; 350649cd0dSSimon Glass 360649cd0dSSimon Glass env_t *env_ptr; 370649cd0dSSimon Glass 380649cd0dSSimon Glass DECLARE_GLOBAL_DATA_PTR; 390649cd0dSSimon Glass 400649cd0dSSimon Glass int env_init(void) 410649cd0dSSimon Glass { 420649cd0dSSimon Glass /* use default */ 430649cd0dSSimon Glass gd->env_addr = (ulong)&default_environment[0]; 44203e94f6SSimon Glass gd->env_valid = ENV_VALID; 450649cd0dSSimon Glass 460649cd0dSSimon Glass return 0; 470649cd0dSSimon Glass } 480649cd0dSSimon Glass 49*4415f1d1SSimon Glass #ifdef CMD_SAVEENV 500649cd0dSSimon Glass int saveenv(void) 510649cd0dSSimon Glass { 520649cd0dSSimon Glass env_t env_new; 530649cd0dSSimon Glass struct blk_desc *dev_desc = NULL; 540649cd0dSSimon Glass disk_partition_t info; 550649cd0dSSimon Glass int dev, part; 560649cd0dSSimon Glass int err; 570649cd0dSSimon Glass loff_t size; 580649cd0dSSimon Glass 590649cd0dSSimon Glass err = env_export(&env_new); 600649cd0dSSimon Glass if (err) 610649cd0dSSimon Glass return err; 620649cd0dSSimon Glass 630649cd0dSSimon Glass part = blk_get_device_part_str(CONFIG_ENV_FAT_INTERFACE, 640649cd0dSSimon Glass CONFIG_ENV_FAT_DEVICE_AND_PART, 650649cd0dSSimon Glass &dev_desc, &info, 1); 660649cd0dSSimon Glass if (part < 0) 670649cd0dSSimon Glass return 1; 680649cd0dSSimon Glass 690649cd0dSSimon Glass dev = dev_desc->devnum; 700649cd0dSSimon Glass if (fat_set_blk_dev(dev_desc, &info) != 0) { 710649cd0dSSimon Glass printf("\n** Unable to use %s %d:%d for saveenv **\n", 720649cd0dSSimon Glass CONFIG_ENV_FAT_INTERFACE, dev, part); 730649cd0dSSimon Glass return 1; 740649cd0dSSimon Glass } 750649cd0dSSimon Glass 760649cd0dSSimon Glass err = file_fat_write(CONFIG_ENV_FAT_FILE, (void *)&env_new, 0, sizeof(env_t), 770649cd0dSSimon Glass &size); 780649cd0dSSimon Glass if (err == -1) { 790649cd0dSSimon Glass printf("\n** Unable to write \"%s\" from %s%d:%d **\n", 800649cd0dSSimon Glass CONFIG_ENV_FAT_FILE, CONFIG_ENV_FAT_INTERFACE, dev, part); 810649cd0dSSimon Glass return 1; 820649cd0dSSimon Glass } 830649cd0dSSimon Glass 840649cd0dSSimon Glass puts("done\n"); 850649cd0dSSimon Glass return 0; 860649cd0dSSimon Glass } 87*4415f1d1SSimon Glass #endif /* CMD_SAVEENV */ 880649cd0dSSimon Glass 89*4415f1d1SSimon Glass #ifdef LOADENV 900649cd0dSSimon Glass void env_relocate_spec(void) 910649cd0dSSimon Glass { 920649cd0dSSimon Glass ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE); 930649cd0dSSimon Glass struct blk_desc *dev_desc = NULL; 940649cd0dSSimon Glass disk_partition_t info; 950649cd0dSSimon Glass int dev, part; 960649cd0dSSimon Glass int err; 970649cd0dSSimon Glass 980649cd0dSSimon Glass part = blk_get_device_part_str(CONFIG_ENV_FAT_INTERFACE, 990649cd0dSSimon Glass CONFIG_ENV_FAT_DEVICE_AND_PART, 1000649cd0dSSimon Glass &dev_desc, &info, 1); 1010649cd0dSSimon Glass if (part < 0) 1020649cd0dSSimon Glass goto err_env_relocate; 1030649cd0dSSimon Glass 1040649cd0dSSimon Glass dev = dev_desc->devnum; 1050649cd0dSSimon Glass if (fat_set_blk_dev(dev_desc, &info) != 0) { 1060649cd0dSSimon Glass printf("\n** Unable to use %s %d:%d for loading the env **\n", 1070649cd0dSSimon Glass CONFIG_ENV_FAT_INTERFACE, dev, part); 1080649cd0dSSimon Glass goto err_env_relocate; 1090649cd0dSSimon Glass } 1100649cd0dSSimon Glass 1110649cd0dSSimon Glass err = file_fat_read(CONFIG_ENV_FAT_FILE, buf, CONFIG_ENV_SIZE); 1120649cd0dSSimon Glass if (err == -1) { 1130649cd0dSSimon Glass printf("\n** Unable to read \"%s\" from %s%d:%d **\n", 1140649cd0dSSimon Glass CONFIG_ENV_FAT_FILE, CONFIG_ENV_FAT_INTERFACE, dev, part); 1150649cd0dSSimon Glass goto err_env_relocate; 1160649cd0dSSimon Glass } 1170649cd0dSSimon Glass 1180649cd0dSSimon Glass env_import(buf, 1); 1190649cd0dSSimon Glass return; 1200649cd0dSSimon Glass 1210649cd0dSSimon Glass err_env_relocate: 1220649cd0dSSimon Glass set_default_env(NULL); 1230649cd0dSSimon Glass } 124*4415f1d1SSimon Glass #endif /* LOADENV */ 125*4415f1d1SSimon Glass 126*4415f1d1SSimon Glass U_BOOT_ENV_LOCATION(fat) = { 127*4415f1d1SSimon Glass .location = ENVL_FAT, 128*4415f1d1SSimon Glass .get_char = env_get_char_spec, 129*4415f1d1SSimon Glass #ifdef LOADENV 130*4415f1d1SSimon Glass .load = env_relocate_spec, 131*4415f1d1SSimon Glass #endif 132*4415f1d1SSimon Glass #ifdef CMD_SAVEENV 133*4415f1d1SSimon Glass .save = env_save_ptr(saveenv), 134*4415f1d1SSimon Glass #endif 135*4415f1d1SSimon Glass .init = env_init, 136*4415f1d1SSimon Glass }; 137