@ -7,6 +7,8 @@
# include <common.h>
# include <errno.h>
# include <fdtdec.h>
# include <malloc.h>
# include <asm/mrccache.h>
# include <asm/mtrr.h>
# include <asm/post.h>
# include <asm/arch/mrc.h>
@ -15,6 +17,29 @@
DECLARE_GLOBAL_DATA_PTR ;
static __maybe_unused int prepare_mrc_cache ( struct mrc_params * mrc_params )
{
struct mrc_data_container * cache ;
struct mrc_region entry ;
int ret ;
ret = mrccache_get_region ( NULL , & entry ) ;
if ( ret )
return ret ;
cache = mrccache_find_current ( & entry ) ;
if ( ! cache )
return - ENOENT ;
debug ( " %s: mrc cache at %p, size %x checksum %04x \n " , __func__ ,
cache - > data , cache - > data_size , cache - > checksum ) ;
/* copy mrc cache to the mrc_params */
memcpy ( & mrc_params - > timings , cache - > data , cache - > data_size ) ;
return 0 ;
}
static int mrc_configure_params ( struct mrc_params * mrc_params )
{
const void * blob = gd - > fdt_blob ;
@ -27,14 +52,15 @@ static int mrc_configure_params(struct mrc_params *mrc_params)
return - EINVAL ;
}
/*
* TODO :
*
* We need support fast boot ( MRC cache ) in the future .
*
* Set boot mode to cold boot for now
*/
# ifdef CONFIG_ENABLE_MRC_CACHE
mrc_params - > boot_mode = prepare_mrc_cache ( mrc_params ) ;
if ( mrc_params - > boot_mode )
mrc_params - > boot_mode = BM_COLD ;
else
mrc_params - > boot_mode = BM_FAST ;
# else
mrc_params - > boot_mode = BM_COLD ;
# endif
/*
* TODO :
@ -98,6 +124,9 @@ static int mrc_configure_params(struct mrc_params *mrc_params)
int dram_init ( void )
{
struct mrc_params mrc_params ;
# ifdef CONFIG_ENABLE_MRC_CACHE
char * cache ;
# endif
int ret ;
memset ( & mrc_params , 0 , sizeof ( struct mrc_params ) ) ;
@ -121,6 +150,15 @@ int dram_init(void)
( ~ ( gd - > ram_size - 1 ) ) | MTRR_PHYS_MASK_VALID ) ;
enable_caches ( ) ;
# ifdef CONFIG_ENABLE_MRC_CACHE
cache = malloc ( sizeof ( struct mrc_timings ) ) ;
if ( cache ) {
memcpy ( cache , & mrc_params . timings , sizeof ( struct mrc_timings ) ) ;
gd - > arch . mrc_output = cache ;
gd - > arch . mrc_output_len = sizeof ( struct mrc_timings ) ;
}
# endif
return 0 ;
}