@ -9,10 +9,15 @@
# include <ram.h>
# include <ram.h>
# include <dm/pinctrl.h>
# include <dm/pinctrl.h>
# include <dm/uclass-internal.h>
# include <dm/uclass-internal.h>
# include <misc.h>
# include <asm/setup.h>
# include <asm/arch/periph.h>
# include <asm/arch/periph.h>
# include <power/regulator.h>
# include <power/regulator.h>
# include <u-boot/sha256.h>
# include <u-boot/sha256.h>
# define RK3399_CPUID_OFF 0x7
# define RK3399_CPUID_LEN 0x10
DECLARE_GLOBAL_DATA_PTR ;
DECLARE_GLOBAL_DATA_PTR ;
# define RK3399_CPUID_OFF 0x7
# define RK3399_CPUID_OFF 0x7
@ -63,6 +68,81 @@ out:
return 0 ;
return 0 ;
}
}
static void setup_serial ( void )
{
# if CONFIG_IS_ENABLED(ROCKCHIP_EFUSE)
struct udevice * dev ;
int ret , i ;
u8 cpuid [ RK3399_CPUID_LEN ] ;
u8 low [ RK3399_CPUID_LEN / 2 ] , high [ RK3399_CPUID_LEN / 2 ] ;
char cpuid_str [ RK3399_CPUID_LEN * 2 + 1 ] ;
u64 serialno ;
char serialno_str [ 16 ] ;
/* the first misc device will be used */
ret = uclass_get_device ( UCLASS_MISC , 0 , & dev ) ;
if ( ret ) {
debug ( " %s: could not find efuse device \n " , __func__ ) ;
return ;
}
/* read the cpu_id range from the efuses */
ret = misc_read ( dev , RK3399_CPUID_OFF , & cpuid , sizeof ( cpuid ) ) ;
if ( ret ) {
debug ( " %s: reading cpuid from the efuses failed \n " ,
__func__ ) ;
return ;
}
memset ( cpuid_str , 0 , sizeof ( cpuid_str ) ) ;
for ( i = 0 ; i < 16 ; i + + )
sprintf ( & cpuid_str [ i * 2 ] , " %02x " , cpuid [ i ] ) ;
debug ( " cpuid: %s \n " , cpuid_str ) ;
/*
* Mix the cpuid bytes using the same rules as in
* $ { linux } / drivers / soc / rockchip / rockchip - cpuinfo . c
*/
for ( i = 0 ; i < 8 ; i + + ) {
low [ i ] = cpuid [ 1 + ( i < < 1 ) ] ;
high [ i ] = cpuid [ i < < 1 ] ;
}
serialno = crc32_no_comp ( 0 , low , 8 ) ;
serialno | = ( u64 ) crc32_no_comp ( serialno , high , 8 ) < < 32 ;
snprintf ( serialno_str , sizeof ( serialno_str ) , " %llx " , serialno ) ;
setenv ( " cpuid# " , cpuid_str ) ;
setenv ( " serial# " , serialno_str ) ;
# endif
return ;
}
int misc_init_r ( void )
{
setup_serial ( ) ;
return 0 ;
}
# ifdef CONFIG_SERIAL_TAG
void get_board_serial ( struct tag_serialnr * serialnr )
{
char * serial_string ;
u64 serial = 0 ;
serial_string = getenv ( " serial# " ) ;
if ( serial_string )
serial = simple_strtoull ( serial_string , NULL , 16 ) ;
serialnr - > high = ( u32 ) ( serial > > 32 ) ;
serialnr - > low = ( u32 ) ( serial & 0xffffffff ) ;
}
# endif
int dram_init ( void )
int dram_init ( void )
{
{
struct ram_info ram ;
struct ram_info ram ;