@ -87,10 +87,8 @@ static int __init sclp_read_info_early(struct read_info_sccb *sccb)
return - EIO ;
}
static void __init sclp_facilities_detect ( void )
static void __init sclp_facilities_detect ( struct read_info_sccb * sccb )
{
struct read_info_sccb * sccb = ( void * ) & sccb_early ;
if ( sclp_read_info_early ( sccb ) )
return ;
@ -181,11 +179,10 @@ static void __init sccb_init_eq_size(struct sdias_sccb *sccb)
sccb - > evbuf . dbs = 1 ;
}
static int __init sclp_set_event_mask ( unsigned long receive_mask ,
static int __init sclp_set_event_mask ( struct init_sccb * sccb ,
unsigned long receive_mask ,
unsigned long send_mask )
{
struct init_sccb * sccb = ( void * ) & sccb_early ;
memset ( sccb , 0 , sizeof ( * sccb ) ) ;
sccb - > header . length = sizeof ( * sccb ) ;
sccb - > mask_length = sizeof ( sccb_mask_t ) ;
@ -194,10 +191,8 @@ static int __init sclp_set_event_mask(unsigned long receive_mask,
return sclp_cmd_early ( SCLP_CMDW_WRITE_EVENT_MASK , sccb ) ;
}
static long __init sclp_hsa_size_init ( void )
static long __init sclp_hsa_size_init ( struct sdias_sccb * sccb )
{
struct sdias_sccb * sccb = ( void * ) & sccb_early ;
sccb_init_eq_size ( sccb ) ;
if ( sclp_cmd_early ( SCLP_CMDW_WRITE_EVENT_DATA , sccb ) )
return - EIO ;
@ -206,10 +201,8 @@ static long __init sclp_hsa_size_init(void)
return 0 ;
}
static long __init sclp_hsa_copy_wait ( void )
static long __init sclp_hsa_copy_wait ( struct sccb_header * sccb )
{
struct sccb_header * sccb = ( void * ) & sccb_early ;
memset ( sccb , 0 , PAGE_SIZE ) ;
sccb - > length = PAGE_SIZE ;
if ( sclp_cmd_early ( SCLP_CMDW_READ_EVENT_DATA , sccb ) )
@ -222,25 +215,25 @@ unsigned long sclp_get_hsa_size(void)
return sclp_hsa_size ;
}
static void __init sclp_hsa_size_detect ( void )
static void __init sclp_hsa_size_detect ( void * sccb )
{
long size ;
/* First try synchronous interface (LPAR) */
if ( sclp_set_event_mask ( 0 , 0x40000010 ) )
if ( sclp_set_event_mask ( sccb , 0 , 0x40000010 ) )
return ;
size = sclp_hsa_size_init ( ) ;
size = sclp_hsa_size_init ( sccb ) ;
if ( size < 0 )
return ;
if ( size ! = 0 )
goto out ;
/* Then try asynchronous interface (z/VM) */
if ( sclp_set_event_mask ( 0x00000010 , 0x40000010 ) )
if ( sclp_set_event_mask ( sccb , 0x00000010 , 0x40000010 ) )
return ;
size = sclp_hsa_size_init ( ) ;
size = sclp_hsa_size_init ( sccb ) ;
if ( size < 0 )
return ;
size = sclp_hsa_copy_wait ( ) ;
size = sclp_hsa_copy_wait ( sccb ) ;
if ( size < 0 )
return ;
out :
@ -249,7 +242,9 @@ out:
void __init sclp_early_detect ( void )
{
sclp_facilities_detect ( ) ;
sclp_hsa_size_detect ( ) ;
sclp_set_event_mask ( 0 , 0 ) ;
void * sccb = & sccb_early ;
sclp_facilities_detect ( sccb ) ;
sclp_hsa_size_detect ( sccb ) ;
sclp_set_event_mask ( sccb , 0 , 0 ) ;
}