@ -28,6 +28,7 @@
* SUCH DAMAGE .
*/
# include <common.h>
# include <asm/arch-coreboot/ipchecksum.h>
# include <asm/arch-coreboot/sysinfo.h>
# include <asm/arch-coreboot/tables.h>
@ -80,22 +81,45 @@ static void cb_parse_memory(unsigned char *ptr, struct sysinfo_t *info)
static void cb_parse_serial ( unsigned char * ptr , struct sysinfo_t * info )
{
struct cb_serial * ser = ( struct cb_serial * ) ptr ;
if ( ser - > type ! = CB_SERIAL_TYPE_IO_MAPPED )
return ;
info - > ser_ioport = ser - > baseaddr ;
info - > serial = ser ;
}
static void cb_parse_optiontable ( unsigned char * ptr , struct sysinfo_t * info )
static void cb_parse_vbnv ( unsigned char * ptr , struct sysinfo_t * info )
{
info - > option_table = ( struct cb_cmos_option_table * ) ptr ;
struct cb_vbnv * vbnv = ( struct cb_vbnv * ) ptr ;
info - > vbnv_start = vbnv - > vbnv_start ;
info - > vbnv_size = vbnv - > vbnv_size ;
}
static void cb_parse_checksum ( unsigned char * ptr , struct sysinfo_t * info )
static void cb_parse_gpios ( unsigned char * ptr , struct sysinfo_t * info )
{
struct cb_cmos_checksum * cmos_cksum = ( struct cb_cmos_checksum * ) ptr ;
info - > cmos_range_start = cmos_cksum - > range_start ;
info - > cmos_range_end = cmos_cksum - > range_end ;
info - > cmos_checksum_location = cmos_cksum - > location ;
int i ;
struct cb_gpios * gpios = ( struct cb_gpios * ) ptr ;
info - > num_gpios = ( gpios - > count < SYSINFO_MAX_GPIOS ) ?
( gpios - > count ) : SYSINFO_MAX_GPIOS ;
for ( i = 0 ; i < info - > num_gpios ; i + + )
info - > gpios [ i ] = gpios - > gpios [ i ] ;
}
static void cb_parse_vdat ( unsigned char * ptr , struct sysinfo_t * info )
{
struct cb_vdat * vdat = ( struct cb_vdat * ) ptr ;
info - > vdat_addr = vdat - > vdat_addr ;
info - > vdat_size = vdat - > vdat_size ;
}
static void cb_parse_tstamp ( unsigned char * ptr , struct sysinfo_t * info )
{
info - > tstamp_table = ( ( struct cb_cbmem_tab * ) ptr ) - > cbmem_tab ;
}
static void cb_parse_cbmem_cons ( unsigned char * ptr , struct sysinfo_t * info )
{
info - > cbmem_cons = ( ( struct cb_cbmem_tab * ) ptr ) - > cbmem_tab ;
}
static void cb_parse_framebuffer ( unsigned char * ptr , struct sysinfo_t * info )
@ -103,6 +127,11 @@ static void cb_parse_framebuffer(unsigned char *ptr, struct sysinfo_t *info)
info - > framebuffer = ( struct cb_framebuffer * ) ptr ;
}
static void cb_parse_string ( unsigned char * ptr , char * * info )
{
* info = ( char * ) ( ( struct cb_string * ) ptr ) - > string ;
}
static int cb_parse_header ( void * addr , int len , struct sysinfo_t * info )
{
struct cb_header * header ;
@ -133,6 +162,9 @@ static int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
/* Now, walk the tables. */
ptr + = header - > header_bytes ;
/* Inintialize some fields to sentinel values. */
info - > vbnv_start = info - > vbnv_size = ( uint32_t ) ( - 1 ) ;
for ( i = 0 ; i < header - > table_entries ; i + + ) {
struct cb_record * rec = ( struct cb_record * ) ptr ;
@ -150,11 +182,35 @@ static int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
case CB_TAG_SERIAL :
cb_parse_serial ( ptr , info ) ;
break ;
case CB_TAG_CMOS_OPTION_TABLE :
cb_parse_optiontable ( ptr , info ) ;
case CB_TAG_VERSION :
cb_parse_string ( ptr , & info - > version ) ;
break ;
case CB_TAG_EXTRA_VERSION :
cb_parse_string ( ptr , & info - > extra_version ) ;
break ;
case CB_TAG_BUILD :
cb_parse_string ( ptr , & info - > build ) ;
break ;
case CB_TAG_COMPILE_TIME :
cb_parse_string ( ptr , & info - > compile_time ) ;
break ;
case CB_TAG_COMPILE_BY :
cb_parse_string ( ptr , & info - > compile_by ) ;
break ;
case CB_TAG_COMPILE_HOST :
cb_parse_string ( ptr , & info - > compile_host ) ;
break ;
case CB_TAG_COMPILE_DOMAIN :
cb_parse_string ( ptr , & info - > compile_domain ) ;
break ;
case CB_TAG_COMPILER :
cb_parse_string ( ptr , & info - > compiler ) ;
break ;
case CB_TAG_LINKER :
cb_parse_string ( ptr , & info - > linker ) ;
break ;
case CB_TAG_OPTION_CHECKSUM :
cb_parse_checksum ( ptr , info ) ;
case CB_TAG_ASSEMBLER :
cb_parse_string ( ptr , & info - > assembler ) ;
break ;
/*
* FIXME we should warn on serial if coreboot set up a
@ -163,6 +219,21 @@ static int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
case CB_TAG_FRAMEBUFFER :
cb_parse_framebuffer ( ptr , info ) ;
break ;
case CB_TAG_GPIO :
cb_parse_gpios ( ptr , info ) ;
break ;
case CB_TAG_VDAT :
cb_parse_vdat ( ptr , info ) ;
break ;
case CB_TAG_TIMESTAMPS :
cb_parse_tstamp ( ptr , info ) ;
break ;
case CB_TAG_CBMEM_CONSOLE :
cb_parse_cbmem_cons ( ptr , info ) ;
break ;
case CB_TAG_VBNV :
cb_parse_vbnv ( ptr , info ) ;
break ;
}
ptr + = rec - > size ;
@ -174,18 +245,12 @@ static int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
/* == Architecture specific == */
/* This is the x86 specific stuff. */
/* Assume no translation or that memory is identity mapped. */
static void * phys_to_virt ( unsigned long virt )
{
return ( void * ) ( uintptr_t ) virt ;
}
int get_coreboot_info ( struct sysinfo_t * info )
{
int ret = cb_parse_header ( phys_to_virt ( 0x00000000 ) , 0x1000 , info ) ;
int ret = cb_parse_header ( ( void * ) 0x00000000 , 0x1000 , info ) ;
if ( ret ! = 1 )
ret = cb_parse_header ( phys_to_virt ( 0x000f0000 ) , 0x1000 , info ) ;
ret = cb_parse_header ( ( void * ) 0x000f0000 , 0x1000 , info ) ;
return ( ret = = 1 ) ? 0 : - 1 ;
}