1*0649cd0dSSimon Glass /* 2*0649cd0dSSimon Glass * (c) Copyright 2011 by Tigris Elektronik GmbH 3*0649cd0dSSimon Glass * 4*0649cd0dSSimon Glass * Author: 5*0649cd0dSSimon Glass * Maximilian Schwerin <mvs@tigris.de> 6*0649cd0dSSimon Glass * 7*0649cd0dSSimon Glass * SPDX-License-Identifier: GPL-2.0+ 8*0649cd0dSSimon Glass */ 9*0649cd0dSSimon Glass 10*0649cd0dSSimon Glass #include <common.h> 11*0649cd0dSSimon Glass 12*0649cd0dSSimon Glass #include <command.h> 13*0649cd0dSSimon Glass #include <environment.h> 14*0649cd0dSSimon Glass #include <linux/stddef.h> 15*0649cd0dSSimon Glass #include <malloc.h> 16*0649cd0dSSimon Glass #include <memalign.h> 17*0649cd0dSSimon Glass #include <search.h> 18*0649cd0dSSimon Glass #include <errno.h> 19*0649cd0dSSimon Glass #include <fat.h> 20*0649cd0dSSimon Glass #include <mmc.h> 21*0649cd0dSSimon Glass 22*0649cd0dSSimon Glass char *env_name_spec = "FAT"; 23*0649cd0dSSimon Glass 24*0649cd0dSSimon Glass env_t *env_ptr; 25*0649cd0dSSimon Glass 26*0649cd0dSSimon Glass DECLARE_GLOBAL_DATA_PTR; 27*0649cd0dSSimon Glass 28*0649cd0dSSimon Glass int env_init(void) 29*0649cd0dSSimon Glass { 30*0649cd0dSSimon Glass /* use default */ 31*0649cd0dSSimon Glass gd->env_addr = (ulong)&default_environment[0]; 32*0649cd0dSSimon Glass gd->env_valid = 1; 33*0649cd0dSSimon Glass 34*0649cd0dSSimon Glass return 0; 35*0649cd0dSSimon Glass } 36*0649cd0dSSimon Glass 37*0649cd0dSSimon Glass #ifdef CONFIG_CMD_SAVEENV 38*0649cd0dSSimon Glass int saveenv(void) 39*0649cd0dSSimon Glass { 40*0649cd0dSSimon Glass env_t env_new; 41*0649cd0dSSimon Glass struct blk_desc *dev_desc = NULL; 42*0649cd0dSSimon Glass disk_partition_t info; 43*0649cd0dSSimon Glass int dev, part; 44*0649cd0dSSimon Glass int err; 45*0649cd0dSSimon Glass loff_t size; 46*0649cd0dSSimon Glass 47*0649cd0dSSimon Glass err = env_export(&env_new); 48*0649cd0dSSimon Glass if (err) 49*0649cd0dSSimon Glass return err; 50*0649cd0dSSimon Glass 51*0649cd0dSSimon Glass part = blk_get_device_part_str(CONFIG_ENV_FAT_INTERFACE, 52*0649cd0dSSimon Glass CONFIG_ENV_FAT_DEVICE_AND_PART, 53*0649cd0dSSimon Glass &dev_desc, &info, 1); 54*0649cd0dSSimon Glass if (part < 0) 55*0649cd0dSSimon Glass return 1; 56*0649cd0dSSimon Glass 57*0649cd0dSSimon Glass dev = dev_desc->devnum; 58*0649cd0dSSimon Glass if (fat_set_blk_dev(dev_desc, &info) != 0) { 59*0649cd0dSSimon Glass printf("\n** Unable to use %s %d:%d for saveenv **\n", 60*0649cd0dSSimon Glass CONFIG_ENV_FAT_INTERFACE, dev, part); 61*0649cd0dSSimon Glass return 1; 62*0649cd0dSSimon Glass } 63*0649cd0dSSimon Glass 64*0649cd0dSSimon Glass err = file_fat_write(CONFIG_ENV_FAT_FILE, (void *)&env_new, 0, sizeof(env_t), 65*0649cd0dSSimon Glass &size); 66*0649cd0dSSimon Glass if (err == -1) { 67*0649cd0dSSimon Glass printf("\n** Unable to write \"%s\" from %s%d:%d **\n", 68*0649cd0dSSimon Glass CONFIG_ENV_FAT_FILE, CONFIG_ENV_FAT_INTERFACE, dev, part); 69*0649cd0dSSimon Glass return 1; 70*0649cd0dSSimon Glass } 71*0649cd0dSSimon Glass 72*0649cd0dSSimon Glass puts("done\n"); 73*0649cd0dSSimon Glass return 0; 74*0649cd0dSSimon Glass } 75*0649cd0dSSimon Glass #endif /* CONFIG_CMD_SAVEENV */ 76*0649cd0dSSimon Glass 77*0649cd0dSSimon Glass void env_relocate_spec(void) 78*0649cd0dSSimon Glass { 79*0649cd0dSSimon Glass ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE); 80*0649cd0dSSimon Glass struct blk_desc *dev_desc = NULL; 81*0649cd0dSSimon Glass disk_partition_t info; 82*0649cd0dSSimon Glass int dev, part; 83*0649cd0dSSimon Glass int err; 84*0649cd0dSSimon Glass 85*0649cd0dSSimon Glass part = blk_get_device_part_str(CONFIG_ENV_FAT_INTERFACE, 86*0649cd0dSSimon Glass CONFIG_ENV_FAT_DEVICE_AND_PART, 87*0649cd0dSSimon Glass &dev_desc, &info, 1); 88*0649cd0dSSimon Glass if (part < 0) 89*0649cd0dSSimon Glass goto err_env_relocate; 90*0649cd0dSSimon Glass 91*0649cd0dSSimon Glass dev = dev_desc->devnum; 92*0649cd0dSSimon Glass if (fat_set_blk_dev(dev_desc, &info) != 0) { 93*0649cd0dSSimon Glass printf("\n** Unable to use %s %d:%d for loading the env **\n", 94*0649cd0dSSimon Glass CONFIG_ENV_FAT_INTERFACE, dev, part); 95*0649cd0dSSimon Glass goto err_env_relocate; 96*0649cd0dSSimon Glass } 97*0649cd0dSSimon Glass 98*0649cd0dSSimon Glass err = file_fat_read(CONFIG_ENV_FAT_FILE, buf, CONFIG_ENV_SIZE); 99*0649cd0dSSimon Glass if (err == -1) { 100*0649cd0dSSimon Glass printf("\n** Unable to read \"%s\" from %s%d:%d **\n", 101*0649cd0dSSimon Glass CONFIG_ENV_FAT_FILE, CONFIG_ENV_FAT_INTERFACE, dev, part); 102*0649cd0dSSimon Glass goto err_env_relocate; 103*0649cd0dSSimon Glass } 104*0649cd0dSSimon Glass 105*0649cd0dSSimon Glass env_import(buf, 1); 106*0649cd0dSSimon Glass return; 107*0649cd0dSSimon Glass 108*0649cd0dSSimon Glass err_env_relocate: 109*0649cd0dSSimon Glass set_default_env(NULL); 110*0649cd0dSSimon Glass } 111