env_mmc: Allow board code to override the environment address
On some boards the environment may not be located at a fixed address in the MMC/SDHC card. This allows those boards to implement their own means to report what address the environment is located at. Signed-off-by: Mingkai Hu <Mingkai.hu@freescale.com> Signed-off-by: Jerry Huang <Chang-Ming.Huang@freescale.com> Signed-off-by: Zhao Chenhui <b35336@freescale.com> Acked-by: Andy Fleming <afleming@freescale.com> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
This commit is contained in:
		
							parent
							
								
									c2a63f48fb
								
							
						
					
					
						commit
						97039ab98c
					
				| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * (C) Copyright 2008-2010 Freescale Semiconductor, Inc.
 | 
			
		||||
 * (C) Copyright 2008-2011 Freescale Semiconductor, Inc.
 | 
			
		||||
 *
 | 
			
		||||
 * See file CREDITS for list of people who contributed to this
 | 
			
		||||
 * project.
 | 
			
		||||
| 
						 | 
				
			
			@ -51,6 +51,19 @@ static void use_default(void);
 | 
			
		|||
 | 
			
		||||
DECLARE_GLOBAL_DATA_PTR;
 | 
			
		||||
 | 
			
		||||
#if !defined(CONFIG_ENV_OFFSET)
 | 
			
		||||
#define CONFIG_ENV_OFFSET 0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static int __mmc_get_env_addr(struct mmc *mmc, u32 *env_addr)
 | 
			
		||||
{
 | 
			
		||||
	*env_addr = CONFIG_ENV_OFFSET;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
__attribute__((weak, alias("__mmc_get_env_addr")))
 | 
			
		||||
int mmc_get_env_addr(struct mmc *mmc, u32 *env_addr);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
uchar env_get_char_spec(int index)
 | 
			
		||||
{
 | 
			
		||||
	return *((uchar *)(gd->env_addr + index));
 | 
			
		||||
| 
						 | 
				
			
			@ -102,10 +115,14 @@ int saveenv(void)
 | 
			
		|||
	ssize_t	len;
 | 
			
		||||
	char	*res;
 | 
			
		||||
	struct mmc *mmc = find_mmc_device(CONFIG_SYS_MMC_ENV_DEV);
 | 
			
		||||
	u32 offset;
 | 
			
		||||
 | 
			
		||||
	if (init_mmc_for_env(mmc))
 | 
			
		||||
		return 1;
 | 
			
		||||
 | 
			
		||||
	if(mmc_get_env_addr(mmc, &offset))
 | 
			
		||||
		return 1;
 | 
			
		||||
 | 
			
		||||
	res = (char *)&env_new.data;
 | 
			
		||||
	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE);
 | 
			
		||||
	if (len < 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -114,7 +131,7 @@ int saveenv(void)
 | 
			
		|||
	}
 | 
			
		||||
	env_new.crc   = crc32(0, env_new.data, ENV_SIZE);
 | 
			
		||||
	printf("Writing to MMC(%d)... ", CONFIG_SYS_MMC_ENV_DEV);
 | 
			
		||||
	if (write_env(mmc, CONFIG_ENV_SIZE, CONFIG_ENV_OFFSET, (u_char *)&env_new)) {
 | 
			
		||||
	if (write_env(mmc, CONFIG_ENV_SIZE, offset, (u_char *)&env_new)) {
 | 
			
		||||
		puts("failed\n");
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -144,13 +161,19 @@ void env_relocate_spec(void)
 | 
			
		|||
	char buf[CONFIG_ENV_SIZE];
 | 
			
		||||
 | 
			
		||||
	struct mmc *mmc = find_mmc_device(CONFIG_SYS_MMC_ENV_DEV);
 | 
			
		||||
	u32 offset;
 | 
			
		||||
 | 
			
		||||
	if (init_mmc_for_env(mmc)) {
 | 
			
		||||
		use_default();
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (read_env(mmc, CONFIG_ENV_SIZE, CONFIG_ENV_OFFSET, buf)) {
 | 
			
		||||
	if(mmc_get_env_addr(mmc, &offset)) {
 | 
			
		||||
		use_default();
 | 
			
		||||
		return ;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (read_env(mmc, CONFIG_ENV_SIZE, offset, buf)) {
 | 
			
		||||
		use_default();
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue