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 }
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; }
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 env_new->flags = ++env_flags; /* increase the serial */ 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; }
static void mmc_late_init(void) { char cmd[32]; char mmcblk[32]; u32 dev_no = mmc_get_env_dev(); env_set_ulong("mmcdev", dev_no); /* Set mmcblk env */ sprintf(mmcblk, "/dev/mmcblk%dp2 rootwait rw", dev_no); env_set("mmcroot", mmcblk); sprintf(cmd, "mmc dev %d", dev_no); run_command(cmd, 0); }
/* both ok - check serial */ if (tmp_env1->flags == 255 && tmp_env2->flags == 0) gd->env_valid = 2; else if (tmp_env2->flags == 255 && tmp_env1->flags == 0) gd->env_valid = 1; else if (tmp_env1->flags > tmp_env2->flags) gd->env_valid = 1; else if (tmp_env2->flags > tmp_env1->flags) gd->env_valid = 2; else /* flags are equal - almost impossible */ gd->env_valid = 1; } free(env_ptr); if (gd->env_valid == 1) ep = tmp_env1; else ep = tmp_env2; env_flags = ep->flags; env_import((char *)ep, 0); 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; #ifdef CONFIG_SPL_BUILD dev = 0; #endif 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 }
static void mmc_late_init(void) { char cmd[32]; char mmcblk[32]; u32 dev_no = mmc_get_env_dev(); if (!check_mmc_autodetect()) return; setenv_ulong("mmcdev", dev_no); /* Set mmcblk env */ sprintf(mmcblk, "/dev/mmcblk%dp2 rootwait rw", mmc_map_to_kernel_blk(dev_no)); setenv("mmcroot", mmcblk); sprintf(cmd, "mmc dev %d", dev_no); run_command(cmd, 0); }
void env_relocate_spec(void) { #if !defined(ENV_IS_EMBEDDED) struct mmc *mmc; u32 offset1, offset2; int read1_fail = 0, read2_fail = 0; int crc1_ok = 0, crc2_ok = 0; env_t *ep; 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); #ifdef CONFIG_SPL_BUILD dev = 0; #endif 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"); crc1_ok = !read1_fail && (crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc); crc2_ok = !read2_fail && (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) { gd->env_valid = 1; } else if (!crc1_ok && crc2_ok) { gd->env_valid = 2; } else { /* both ok - check serial */ if (tmp_env1->flags == 255 && tmp_env2->flags == 0) gd->env_valid = 2; else if (tmp_env2->flags == 255 && tmp_env1->flags == 0) gd->env_valid = 1; else if (tmp_env1->flags > tmp_env2->flags) gd->env_valid = 1; else if (tmp_env2->flags > tmp_env1->flags) gd->env_valid = 2; else /* flags are equal - almost impossible */ gd->env_valid = 1; } free(env_ptr); if (gd->env_valid == 1) ep = tmp_env1; else ep = tmp_env2; env_flags = ep->flags; env_import((char *)ep, 0); ret = 0; fini: fini_mmc_for_env(mmc); err: if (ret) set_default_env(errmsg); #endif }
static int env_mmc_load(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 = -EIO; goto err; } if (mmc_get_env_addr(mmc, 0, &offset1) || mmc_get_env_addr(mmc, 1, &offset2)) { ret = -EIO; 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 = -EIO; goto fini; } else if (!read1_fail && read2_fail) { gd->env_valid = ENV_VALID; env_import((char *)tmp_env1, 1); } else if (read1_fail && !read2_fail) { gd->env_valid = ENV_REDUND; 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 return ret; }