projects
/
oweals
/
u-boot.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ARM: OMAP4+: Add support for dynamically selecting OPPs
[oweals/u-boot.git]
/
common
/
env_mmc.c
diff --git
a/common/env_mmc.c
b/common/env_mmc.c
index d42168b7737852db3bda78ea83bf9bd4b0d6e3f1..16f6a175141346d971de0b7dbd176f0e6cf6744f 100644
(file)
--- a/
common/env_mmc.c
+++ b/
common/env_mmc.c
@@
-12,6
+12,7
@@
#include <environment.h>
#include <linux/stddef.h>
#include <malloc.h>
#include <environment.h>
#include <linux/stddef.h>
#include <malloc.h>
+#include <memalign.h>
#include <mmc.h>
#include <search.h>
#include <errno.h>
#include <mmc.h>
#include <search.h>
#include <errno.h>
@@
-53,6
+54,11
@@
__weak int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr)
return 0;
}
return 0;
}
+__weak int mmc_get_env_dev(void)
+{
+ return CONFIG_SYS_MMC_ENV_DEV;
+}
+
int env_init(void)
{
/* use default */
int env_init(void)
{
/* use default */
@@
-62,48
+68,58
@@
int env_init(void)
return 0;
}
return 0;
}
-static int init_mmc_for_env(struct mmc *mmc)
-{
#ifdef CONFIG_SYS_MMC_ENV_PART
#ifdef CONFIG_SYS_MMC_ENV_PART
- int dev = CONFIG_SYS_MMC_ENV_DEV;
+__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;
#ifdef CONFIG_SPL_BUILD
dev = 0;
#endif
#ifdef CONFIG_SPL_BUILD
dev = 0;
#endif
+
+ 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
#endif
- if (!mmc) {
- puts("No MMC card found\n");
- return -1;
- }
+static const char *init_mmc_for_env(struct mmc *mmc)
+{
+ if (!mmc)
+ return "!No MMC card found";
- if (mmc_init(mmc)) {
- puts("MMC init failed\n");
- return -1;
- }
+ if (mmc_init(mmc))
+ return "!MMC init failed";
-#ifdef CONFIG_SYS_MMC_ENV_PART
- if (CONFIG_SYS_MMC_ENV_PART != mmc->part_num) {
- if (mmc_switch_part(dev, CONFIG_SYS_MMC_ENV_PART)) {
- puts("MMC partition switch failed\n");
- return -1;
- }
- }
-#endif
+ if (mmc_set_env_part(mmc))
+ return "!MMC partition switch failed";
- return
0
;
+ return
NULL
;
}
static void fini_mmc_for_env(struct mmc *mmc)
{
#ifdef CONFIG_SYS_MMC_ENV_PART
}
static void fini_mmc_for_env(struct mmc *mmc)
{
#ifdef CONFIG_SYS_MMC_ENV_PART
- int dev =
CONFIG_SYS_MMC_ENV_DEV
;
+ int dev =
mmc_get_env_dev()
;
#ifdef CONFIG_SPL_BUILD
dev = 0;
#endif
#ifdef CONFIG_SPL_BUILD
dev = 0;
#endif
- if (CONFIG_SYS_MMC_ENV_PART != mmc->part_num)
- mmc_switch_part(dev, mmc->part_num);
+ blk_select_hwpart_devnum(IF_TYPE_MMC, dev, env_mmc_orig_hwpart);
#endif
}
#endif
}
@@
-112,12
+128,12
@@
static inline int write_env(struct mmc *mmc, unsigned long size,
unsigned long offset, const void *buffer)
{
uint blk_start, blk_cnt, n;
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;
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 = mmc->block_dev.block_write(CONFIG_SYS_MMC_ENV_DEV, blk_start,
- blk_cnt, (u_char *)buffer);
+ n = blk_dwrite(desc, blk_start, blk_cnt, (u_char *)buffer);
return (n == blk_cnt) ? 0 : -1;
}
return (n == blk_cnt) ? 0 : -1;
}
@@
-129,24
+145,21
@@
static unsigned char env_flags;
int saveenv(void)
{
ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
int saveenv(void)
{
ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
- ssize_t len;
- char *res;
- struct mmc *mmc = find_mmc_device(CONFIG_SYS_MMC_ENV_DEV);
+ int dev = mmc_get_env_dev();
+ struct mmc *mmc = find_mmc_device(dev);
u32 offset;
int ret, copy = 0;
u32 offset;
int ret, copy = 0;
+ const char *errmsg;
- if (init_mmc_for_env(mmc))
+ errmsg = init_mmc_for_env(mmc);
+ if (errmsg) {
+ printf("%s\n", errmsg);
return 1;
return 1;
-
- res = (char *)&env_new->data;
- len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
- if (len < 0) {
- error("Cannot export environment: errno = %d\n", errno);
- ret = 1;
- goto fini;
}
}
- env_new->crc = crc32(0, &env_new->data[0], ENV_SIZE);
+ ret = env_export(env_new);
+ if (ret)
+ goto fini;
#ifdef CONFIG_ENV_OFFSET_REDUND
env_new->flags = ++env_flags; /* increase the serial */
#ifdef CONFIG_ENV_OFFSET_REDUND
env_new->flags = ++env_flags; /* increase the serial */
@@
-160,8
+173,7
@@
int saveenv(void)
goto fini;
}
goto fini;
}
- printf("Writing to %sMMC(%d)... ", copy ? "redundant " : "",
- CONFIG_SYS_MMC_ENV_DEV);
+ 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;
if (write_env(mmc, CONFIG_ENV_SIZE, offset, (u_char *)env_new)) {
puts("failed\n");
ret = 1;
@@
-185,16
+197,12
@@
static inline int read_env(struct mmc *mmc, unsigned long size,
unsigned long offset, const void *buffer)
{
uint blk_start, blk_cnt, n;
unsigned long offset, const void *buffer)
{
uint blk_start, blk_cnt, n;
- int dev = CONFIG_SYS_MMC_ENV_DEV;
-
-#ifdef CONFIG_SPL_BUILD
- dev = 0;
-#endif
+ 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;
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 =
mmc->block_dev.block_read(dev
, blk_start, blk_cnt, (uchar *)buffer);
+ n =
blk_dread(desc
, blk_start, blk_cnt, (uchar *)buffer);
return (n == blk_cnt) ? 0 : -1;
}
return (n == blk_cnt) ? 0 : -1;
}
@@
-209,7
+217,8
@@
void env_relocate_spec(void)
int crc1_ok = 0, crc2_ok = 0;
env_t *ep;
int ret;
int crc1_ok = 0, crc2_ok = 0;
env_t *ep;
int ret;
- int dev = CONFIG_SYS_MMC_ENV_DEV;
+ 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);
ALLOC_CACHE_ALIGN_BUFFER(env_t, tmp_env1, 1);
ALLOC_CACHE_ALIGN_BUFFER(env_t, tmp_env2, 1);
@@
-220,13
+229,8
@@
void env_relocate_spec(void)
mmc = find_mmc_device(dev);
mmc = find_mmc_device(dev);
- if (tmp_env1 == NULL || tmp_env2 == NULL) {
- puts("Can't allocate buffers for environment\n");
- ret = 1;
- goto err;
- }
-
- if (init_mmc_for_env(mmc)) {
+ errmsg = init_mmc_for_env(mmc);
+ if (errmsg) {
ret = 1;
goto err;
}
ret = 1;
goto err;
}
@@
-252,6
+256,7
@@
void env_relocate_spec(void)
(crc32(0, tmp_env2->data, ENV_SIZE) == tmp_env2->crc);
if (!crc1_ok && !crc2_ok) {
(crc32(0, tmp_env2->data, ENV_SIZE) == tmp_env2->crc);
if (!crc1_ok && !crc2_ok) {
+ errmsg = "!bad CRC";
ret = 1;
goto fini;
} else if (crc1_ok && !crc2_ok) {
ret = 1;
goto fini;
} else if (crc1_ok && !crc2_ok) {
@@
-287,8
+292,7
@@
fini:
fini_mmc_for_env(mmc);
err:
if (ret)
fini_mmc_for_env(mmc);
err:
if (ret)
- set_default_env(NULL);
-
+ set_default_env(errmsg);
#endif
}
#else /* ! CONFIG_ENV_OFFSET_REDUND */
#endif
}
#else /* ! CONFIG_ENV_OFFSET_REDUND */
@@
-299,7
+303,8
@@
void env_relocate_spec(void)
struct mmc *mmc;
u32 offset;
int ret;
struct mmc *mmc;
u32 offset;
int ret;
- int dev = CONFIG_SYS_MMC_ENV_DEV;
+ int dev = mmc_get_env_dev();
+ const char *errmsg;
#ifdef CONFIG_SPL_BUILD
dev = 0;
#ifdef CONFIG_SPL_BUILD
dev = 0;
@@
-307,7
+312,8
@@
void env_relocate_spec(void)
mmc = find_mmc_device(dev);
mmc = find_mmc_device(dev);
- if (init_mmc_for_env(mmc)) {
+ errmsg = init_mmc_for_env(mmc);
+ if (errmsg) {
ret = 1;
goto err;
}
ret = 1;
goto err;
}
@@
-318,6
+324,7
@@
void env_relocate_spec(void)
}
if (read_env(mmc, CONFIG_ENV_SIZE, offset, buf)) {
}
if (read_env(mmc, CONFIG_ENV_SIZE, offset, buf)) {
+ errmsg = "!read failed";
ret = 1;
goto fini;
}
ret = 1;
goto fini;
}
@@
-329,7
+336,7
@@
fini:
fini_mmc_for_env(mmc);
err:
if (ret)
fini_mmc_for_env(mmc);
err:
if (ret)
- set_default_env(
NULL
);
+ set_default_env(
errmsg
);
#endif
}
#endif /* CONFIG_ENV_OFFSET_REDUND */
#endif
}
#endif /* CONFIG_ENV_OFFSET_REDUND */