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 224415f1d1SSimon Glass #ifdef CONFIG_SPL_BUILD 234415f1d1SSimon Glass /* TODO(sjg@chromium.org): Figure out why this is needed */ 244415f1d1SSimon Glass # if !defined(CONFIG_TARGET_AM335X_EVM) || defined(CONFIG_SPL_OS_BOOT) 254415f1d1SSimon Glass # define LOADENV 264415f1d1SSimon Glass # endif 274415f1d1SSimon Glass #else 284415f1d1SSimon Glass # define LOADENV 294415f1d1SSimon Glass # if defined(CONFIG_CMD_SAVEENV) 304415f1d1SSimon Glass # define CMD_SAVEENV 314415f1d1SSimon Glass # endif 324415f1d1SSimon Glass #endif 334415f1d1SSimon Glass 340649cd0dSSimon Glass DECLARE_GLOBAL_DATA_PTR; 350649cd0dSSimon Glass 364415f1d1SSimon Glass #ifdef CMD_SAVEENV 37e5bce247SSimon Glass static int env_fat_save(void) 380649cd0dSSimon Glass { 390649cd0dSSimon Glass env_t env_new; 400649cd0dSSimon Glass struct blk_desc *dev_desc = NULL; 410649cd0dSSimon Glass disk_partition_t info; 420649cd0dSSimon Glass int dev, part; 430649cd0dSSimon Glass int err; 440649cd0dSSimon Glass loff_t size; 450649cd0dSSimon Glass 460649cd0dSSimon Glass err = env_export(&env_new); 470649cd0dSSimon Glass if (err) 480649cd0dSSimon Glass return err; 490649cd0dSSimon Glass 500649cd0dSSimon Glass part = blk_get_device_part_str(CONFIG_ENV_FAT_INTERFACE, 510649cd0dSSimon Glass CONFIG_ENV_FAT_DEVICE_AND_PART, 520649cd0dSSimon Glass &dev_desc, &info, 1); 530649cd0dSSimon Glass if (part < 0) 540649cd0dSSimon Glass return 1; 550649cd0dSSimon Glass 560649cd0dSSimon Glass dev = dev_desc->devnum; 570649cd0dSSimon Glass if (fat_set_blk_dev(dev_desc, &info) != 0) { 580649cd0dSSimon Glass printf("\n** Unable to use %s %d:%d for saveenv **\n", 590649cd0dSSimon Glass CONFIG_ENV_FAT_INTERFACE, dev, part); 600649cd0dSSimon Glass return 1; 610649cd0dSSimon Glass } 620649cd0dSSimon Glass 630649cd0dSSimon Glass err = file_fat_write(CONFIG_ENV_FAT_FILE, (void *)&env_new, 0, sizeof(env_t), 640649cd0dSSimon Glass &size); 650649cd0dSSimon Glass if (err == -1) { 660649cd0dSSimon Glass printf("\n** Unable to write \"%s\" from %s%d:%d **\n", 670649cd0dSSimon Glass CONFIG_ENV_FAT_FILE, CONFIG_ENV_FAT_INTERFACE, dev, part); 680649cd0dSSimon Glass return 1; 690649cd0dSSimon Glass } 700649cd0dSSimon Glass 710649cd0dSSimon Glass puts("done\n"); 720649cd0dSSimon Glass return 0; 730649cd0dSSimon Glass } 744415f1d1SSimon Glass #endif /* CMD_SAVEENV */ 750649cd0dSSimon Glass 764415f1d1SSimon Glass #ifdef LOADENV 77*c5951991SSimon Glass static int env_fat_load(void) 780649cd0dSSimon Glass { 790649cd0dSSimon Glass ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE); 800649cd0dSSimon Glass struct blk_desc *dev_desc = NULL; 810649cd0dSSimon Glass disk_partition_t info; 820649cd0dSSimon Glass int dev, part; 830649cd0dSSimon Glass int err; 840649cd0dSSimon Glass 850649cd0dSSimon Glass part = blk_get_device_part_str(CONFIG_ENV_FAT_INTERFACE, 860649cd0dSSimon Glass CONFIG_ENV_FAT_DEVICE_AND_PART, 870649cd0dSSimon Glass &dev_desc, &info, 1); 880649cd0dSSimon Glass if (part < 0) 890649cd0dSSimon Glass goto err_env_relocate; 900649cd0dSSimon Glass 910649cd0dSSimon Glass dev = dev_desc->devnum; 920649cd0dSSimon Glass if (fat_set_blk_dev(dev_desc, &info) != 0) { 930649cd0dSSimon Glass printf("\n** Unable to use %s %d:%d for loading the env **\n", 940649cd0dSSimon Glass CONFIG_ENV_FAT_INTERFACE, dev, part); 950649cd0dSSimon Glass goto err_env_relocate; 960649cd0dSSimon Glass } 970649cd0dSSimon Glass 980649cd0dSSimon Glass err = file_fat_read(CONFIG_ENV_FAT_FILE, buf, CONFIG_ENV_SIZE); 990649cd0dSSimon Glass if (err == -1) { 1000649cd0dSSimon Glass printf("\n** Unable to read \"%s\" from %s%d:%d **\n", 1010649cd0dSSimon Glass CONFIG_ENV_FAT_FILE, CONFIG_ENV_FAT_INTERFACE, dev, part); 1020649cd0dSSimon Glass goto err_env_relocate; 1030649cd0dSSimon Glass } 1040649cd0dSSimon Glass 1050649cd0dSSimon Glass env_import(buf, 1); 106*c5951991SSimon Glass return 0; 1070649cd0dSSimon Glass 1080649cd0dSSimon Glass err_env_relocate: 1090649cd0dSSimon Glass set_default_env(NULL); 110*c5951991SSimon Glass 111*c5951991SSimon Glass return -EIO; 1120649cd0dSSimon Glass } 1134415f1d1SSimon Glass #endif /* LOADENV */ 1144415f1d1SSimon Glass 1154415f1d1SSimon Glass U_BOOT_ENV_LOCATION(fat) = { 1164415f1d1SSimon Glass .location = ENVL_FAT, 117ac358bebSSimon Glass ENV_NAME("FAT") 1184415f1d1SSimon Glass #ifdef LOADENV 119e5bce247SSimon Glass .load = env_fat_load, 1204415f1d1SSimon Glass #endif 1214415f1d1SSimon Glass #ifdef CMD_SAVEENV 122e5bce247SSimon Glass .save = env_save_ptr(env_fat_save), 1234415f1d1SSimon Glass #endif 1244415f1d1SSimon Glass }; 125