diff options
author | Simon Glass <sjg@chromium.org> | 2017-08-03 12:21:49 -0600 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2017-08-15 08:18:45 -0400 |
commit | 0649cd0d4908d9b983a0361b8665938ef25701be (patch) | |
tree | 5ba3f7ad481aefa2ff5b71bc11dc8b1660245755 /common/env_mmc.c | |
parent | ec74f5f9c38ce8e21f4aa413427cfec6fe6fb8da (diff) | |
download | u-boot-0649cd0d4908d9b983a0361b8665938ef25701be.tar.gz |
Move environment files from common/ to env/
About a quarter of the files in common/ relate to the environment. It
seems better to put these into their own subdirectory and remove the
prefix.
Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Tom Rini <trini@konsulko.com>
Diffstat (limited to 'common/env_mmc.c')
-rw-r--r-- | common/env_mmc.c | 326 |
1 files changed, 0 insertions, 326 deletions
diff --git a/common/env_mmc.c b/common/env_mmc.c deleted file mode 100644 index bb760a00ed..0000000000 --- a/common/env_mmc.c +++ /dev/null @@ -1,326 +0,0 @@ -/* - * (C) Copyright 2008-2011 Freescale Semiconductor, Inc. - * - * SPDX-License-Identifier: GPL-2.0+ - */ - -/* #define DEBUG */ - -#include <common.h> - -#include <command.h> -#include <environment.h> -#include <fdtdec.h> -#include <linux/stddef.h> -#include <malloc.h> -#include <memalign.h> -#include <mmc.h> -#include <search.h> -#include <errno.h> - -#if defined(CONFIG_ENV_SIZE_REDUND) && \ - (CONFIG_ENV_SIZE_REDUND != CONFIG_ENV_SIZE) -#error CONFIG_ENV_SIZE_REDUND should be the same as CONFIG_ENV_SIZE -#endif - -char *env_name_spec = "MMC"; - -#ifdef ENV_IS_EMBEDDED -env_t *env_ptr = &environment; -#else /* ! ENV_IS_EMBEDDED */ -env_t *env_ptr; -#endif /* ENV_IS_EMBEDDED */ - -DECLARE_GLOBAL_DATA_PTR; - -#if !defined(CONFIG_ENV_OFFSET) -#define CONFIG_ENV_OFFSET 0 -#endif - -#if CONFIG_IS_ENABLED(OF_CONTROL) -static inline s64 mmc_offset(int copy) -{ - const char *propname = "u-boot,mmc-env-offset"; - s64 defvalue = CONFIG_ENV_OFFSET; - -#if defined(CONFIG_ENV_OFFSET_REDUND) - if (copy) { - propname = "u-boot,mmc-env-offset-redundant"; - defvalue = CONFIG_ENV_OFFSET_REDUND; - } -#endif - - return fdtdec_get_config_int(gd->fdt_blob, propname, defvalue); -} -#else -static inline s64 mmc_offset(int copy) -{ - s64 offset = CONFIG_ENV_OFFSET; - -#if defined(CONFIG_ENV_OFFSET_REDUND) - if (copy) - offset = CONFIG_ENV_OFFSET_REDUND; -#endif - return offset; -} -#endif - -__weak int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr) -{ - s64 offset = mmc_offset(copy); - - if (offset < 0) - offset += mmc->capacity; - - *env_addr = offset; - - return 0; -} - -__weak int mmc_get_env_dev(void) -{ - return CONFIG_SYS_MMC_ENV_DEV; -} - -int env_init(void) -{ - /* use default */ - gd->env_addr = (ulong)&default_environment[0]; - gd->env_valid = 1; - - return 0; -} - -#ifdef CONFIG_SYS_MMC_ENV_PART -__weak uint mmc_get_env_part(struct mmc *mmc) -{ - return CONFIG_SYS_MMC_ENV_PART; -} - -static unsigned char env_mmc_orig_hwpart; - -static int mmc_set_env_part(struct mmc *mmc) -{ - uint part = mmc_get_env_part(mmc); - int dev = mmc_get_env_dev(); - int ret = 0; - - env_mmc_orig_hwpart = mmc_get_blk_desc(mmc)->hwpart; - ret = blk_select_hwpart_devnum(IF_TYPE_MMC, dev, part); - if (ret) - puts("MMC partition switch failed\n"); - - return ret; -} -#else -static inline int mmc_set_env_part(struct mmc *mmc) {return 0; }; -#endif - -static const char *init_mmc_for_env(struct mmc *mmc) -{ - if (!mmc) - return "!No MMC card found"; - -#ifdef CONFIG_BLK - struct udevice *dev; - - if (blk_get_from_parent(mmc->dev, &dev)) - return "!No block device"; -#else - if (mmc_init(mmc)) - return "!MMC init failed"; -#endif - if (mmc_set_env_part(mmc)) - return "!MMC partition switch failed"; - - return NULL; -} - -static void fini_mmc_for_env(struct mmc *mmc) -{ -#ifdef CONFIG_SYS_MMC_ENV_PART - int dev = mmc_get_env_dev(); - - blk_select_hwpart_devnum(IF_TYPE_MMC, dev, env_mmc_orig_hwpart); -#endif -} - -#ifdef CONFIG_CMD_SAVEENV -static inline int write_env(struct mmc *mmc, unsigned long size, - unsigned long offset, const void *buffer) -{ - uint blk_start, blk_cnt, n; - struct blk_desc *desc = mmc_get_blk_desc(mmc); - - blk_start = ALIGN(offset, mmc->write_bl_len) / mmc->write_bl_len; - blk_cnt = ALIGN(size, mmc->write_bl_len) / mmc->write_bl_len; - - n = blk_dwrite(desc, blk_start, blk_cnt, (u_char *)buffer); - - return (n == blk_cnt) ? 0 : -1; -} - -int saveenv(void) -{ - ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1); - int dev = mmc_get_env_dev(); - struct mmc *mmc = find_mmc_device(dev); - u32 offset; - int ret, copy = 0; - const char *errmsg; - - errmsg = init_mmc_for_env(mmc); - if (errmsg) { - printf("%s\n", errmsg); - return 1; - } - - ret = env_export(env_new); - if (ret) - goto fini; - -#ifdef CONFIG_ENV_OFFSET_REDUND - if (gd->env_valid == 1) - copy = 1; -#endif - - if (mmc_get_env_addr(mmc, copy, &offset)) { - ret = 1; - goto fini; - } - - printf("Writing to %sMMC(%d)... ", copy ? "redundant " : "", dev); - if (write_env(mmc, CONFIG_ENV_SIZE, offset, (u_char *)env_new)) { - puts("failed\n"); - ret = 1; - goto fini; - } - - puts("done\n"); - ret = 0; - -#ifdef CONFIG_ENV_OFFSET_REDUND - gd->env_valid = gd->env_valid == 2 ? 1 : 2; -#endif - -fini: - fini_mmc_for_env(mmc); - return ret; -} -#endif /* CONFIG_CMD_SAVEENV */ - -static inline int read_env(struct mmc *mmc, unsigned long size, - unsigned long offset, const void *buffer) -{ - uint blk_start, blk_cnt, n; - struct blk_desc *desc = mmc_get_blk_desc(mmc); - - blk_start = ALIGN(offset, mmc->read_bl_len) / mmc->read_bl_len; - blk_cnt = ALIGN(size, mmc->read_bl_len) / mmc->read_bl_len; - - n = blk_dread(desc, blk_start, blk_cnt, (uchar *)buffer); - - return (n == blk_cnt) ? 0 : -1; -} - -#ifdef CONFIG_ENV_OFFSET_REDUND -void env_relocate_spec(void) -{ -#if !defined(ENV_IS_EMBEDDED) - struct mmc *mmc; - u32 offset1, offset2; - int read1_fail = 0, read2_fail = 0; - int ret; - int dev = mmc_get_env_dev(); - const char *errmsg = NULL; - - ALLOC_CACHE_ALIGN_BUFFER(env_t, tmp_env1, 1); - ALLOC_CACHE_ALIGN_BUFFER(env_t, tmp_env2, 1); - - mmc = find_mmc_device(dev); - - errmsg = init_mmc_for_env(mmc); - if (errmsg) { - ret = 1; - goto err; - } - - if (mmc_get_env_addr(mmc, 0, &offset1) || - mmc_get_env_addr(mmc, 1, &offset2)) { - ret = 1; - goto fini; - } - - read1_fail = read_env(mmc, CONFIG_ENV_SIZE, offset1, tmp_env1); - read2_fail = read_env(mmc, CONFIG_ENV_SIZE, offset2, tmp_env2); - - if (read1_fail && read2_fail) - puts("*** Error - No Valid Environment Area found\n"); - else if (read1_fail || read2_fail) - puts("*** Warning - some problems detected " - "reading environment; recovered successfully\n"); - - if (read1_fail && read2_fail) { - errmsg = "!bad CRC"; - ret = 1; - goto fini; - } else if (!read1_fail && read2_fail) { - gd->env_valid = 1; - env_import((char *)tmp_env1, 1); - } else if (read1_fail && !read2_fail) { - gd->env_valid = 2; - env_import((char *)tmp_env2, 1); - } else { - env_import_redund((char *)tmp_env1, (char *)tmp_env2); - } - - ret = 0; - -fini: - fini_mmc_for_env(mmc); -err: - if (ret) - set_default_env(errmsg); -#endif -} -#else /* ! CONFIG_ENV_OFFSET_REDUND */ -void env_relocate_spec(void) -{ -#if !defined(ENV_IS_EMBEDDED) - ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE); - struct mmc *mmc; - u32 offset; - int ret; - int dev = mmc_get_env_dev(); - const char *errmsg; - - mmc = find_mmc_device(dev); - - errmsg = init_mmc_for_env(mmc); - if (errmsg) { - ret = 1; - goto err; - } - - if (mmc_get_env_addr(mmc, 0, &offset)) { - ret = 1; - goto fini; - } - - if (read_env(mmc, CONFIG_ENV_SIZE, offset, buf)) { - errmsg = "!read failed"; - ret = 1; - goto fini; - } - - env_import(buf, 1); - ret = 0; - -fini: - fini_mmc_for_env(mmc); -err: - if (ret) - set_default_env(errmsg); -#endif -} -#endif /* CONFIG_ENV_OFFSET_REDUND */ |