[S390] sclp: introduce some new interfaces.
Introduce some new interfaces so that random subsystems don't have to mess around with sclp internal structures. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
committed by
Martin Schwidefsky
parent
bccdbdc9bd
commit
05dd25307c
@ -171,37 +171,6 @@ static inline int memory_fast_detect(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
#define ADDR2G (1UL << 31)
|
||||
|
||||
static noinline __init unsigned long sclp_memory_detect(void)
|
||||
{
|
||||
struct sclp_readinfo_sccb *sccb;
|
||||
unsigned long long memsize;
|
||||
|
||||
sccb = &s390_readinfo_sccb;
|
||||
|
||||
if (sccb->header.response_code != 0x10)
|
||||
return 0;
|
||||
|
||||
if (sccb->rnsize)
|
||||
memsize = sccb->rnsize << 20;
|
||||
else
|
||||
memsize = sccb->rnsize2 << 20;
|
||||
if (sccb->rnmax)
|
||||
memsize *= sccb->rnmax;
|
||||
else
|
||||
memsize *= sccb->rnmax2;
|
||||
#ifndef CONFIG_64BIT
|
||||
/*
|
||||
* Can't deal with more than 2G in 31 bit addressing mode, so
|
||||
* limit the value in order to avoid strange side effects.
|
||||
*/
|
||||
if (memsize > ADDR2G)
|
||||
memsize = ADDR2G;
|
||||
#endif
|
||||
return (unsigned long) memsize;
|
||||
}
|
||||
|
||||
static inline __init unsigned long __tprot(unsigned long addr)
|
||||
{
|
||||
int cc = -1;
|
||||
@ -218,6 +187,7 @@ static inline __init unsigned long __tprot(unsigned long addr)
|
||||
|
||||
/* Checking memory in 128KB increments. */
|
||||
#define CHUNK_INCR (1UL << 17)
|
||||
#define ADDR2G (1UL << 31)
|
||||
|
||||
static noinline __init void find_memory_chunks(unsigned long memsize)
|
||||
{
|
||||
@ -293,7 +263,7 @@ static noinline __init void setup_lowcore_early(void)
|
||||
*/
|
||||
void __init startup_init(void)
|
||||
{
|
||||
unsigned long memsize;
|
||||
unsigned long long memsize;
|
||||
|
||||
ipl_save_parameters();
|
||||
clear_bss_section();
|
||||
@ -306,7 +276,15 @@ void __init startup_init(void)
|
||||
setup_lowcore_early();
|
||||
sclp_readinfo_early();
|
||||
memsize = sclp_memory_detect();
|
||||
#ifndef CONFIG_64BIT
|
||||
/*
|
||||
* Can't deal with more than 2G in 31 bit addressing mode, so
|
||||
* limit the value in order to avoid strange side effects.
|
||||
*/
|
||||
if (memsize > ADDR2G)
|
||||
memsize = ADDR2G;
|
||||
#endif
|
||||
if (memory_fast_detect() < 0)
|
||||
find_memory_chunks(memsize);
|
||||
find_memory_chunks((unsigned long) memsize);
|
||||
lockdep_on();
|
||||
}
|
||||
|
@ -25,10 +25,6 @@
|
||||
|
||||
#define IPL_PARM_BLOCK_VERSION 0
|
||||
|
||||
#define SCCB_VALID (s390_readinfo_sccb.header.response_code == 0x10)
|
||||
#define SCCB_LOADPARM (&s390_readinfo_sccb.loadparm)
|
||||
#define SCCB_FLAG (s390_readinfo_sccb.flags)
|
||||
|
||||
#define IPL_UNKNOWN_STR "unknown"
|
||||
#define IPL_CCW_STR "ccw"
|
||||
#define IPL_FCP_STR "fcp"
|
||||
@ -146,6 +142,8 @@ static struct ipl_parameter_block *dump_block_ccw;
|
||||
|
||||
static enum shutdown_action on_panic_action = SHUTDOWN_STOP;
|
||||
|
||||
static struct sclp_ipl_info sclp_ipl_info;
|
||||
|
||||
int diag308(unsigned long subcode, void *addr)
|
||||
{
|
||||
register unsigned long _addr asm("0") = (unsigned long) addr;
|
||||
@ -375,9 +373,9 @@ static ssize_t ipl_ccw_loadparm_show(struct kset *kset, char *page)
|
||||
{
|
||||
char loadparm[LOADPARM_LEN + 1] = {};
|
||||
|
||||
if (!SCCB_VALID)
|
||||
if (!sclp_ipl_info.is_valid)
|
||||
return sprintf(page, "#unknown#\n");
|
||||
memcpy(loadparm, SCCB_LOADPARM, LOADPARM_LEN);
|
||||
memcpy(loadparm, &sclp_ipl_info.loadparm, LOADPARM_LEN);
|
||||
EBCASC(loadparm, LOADPARM_LEN);
|
||||
strstrip(loadparm);
|
||||
return sprintf(page, "%s\n", loadparm);
|
||||
@ -910,9 +908,9 @@ static int __init reipl_ccw_init(void)
|
||||
reipl_block_ccw->hdr.blk0_len = IPL_PARM_BLK0_CCW_LEN;
|
||||
reipl_block_ccw->hdr.pbt = DIAG308_IPL_TYPE_CCW;
|
||||
/* check if read scp info worked and set loadparm */
|
||||
if (SCCB_VALID)
|
||||
if (sclp_ipl_info.is_valid)
|
||||
memcpy(reipl_block_ccw->ipl_info.ccw.load_param,
|
||||
SCCB_LOADPARM, LOADPARM_LEN);
|
||||
&sclp_ipl_info.loadparm, LOADPARM_LEN);
|
||||
else
|
||||
/* read scp info failed: set empty loadparm (EBCDIC blanks) */
|
||||
memset(reipl_block_ccw->ipl_info.ccw.load_param, 0x40,
|
||||
@ -1007,7 +1005,7 @@ static int __init dump_fcp_init(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if(!(SCCB_FLAG & 0x2) || !SCCB_VALID)
|
||||
if (!sclp_ipl_info.has_dump)
|
||||
return 0; /* LDIPL DUMP is not installed */
|
||||
if (!diag308_set_works)
|
||||
return 0;
|
||||
@ -1088,6 +1086,7 @@ static int __init s390_ipl_init(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
sclp_get_ipl_info(&sclp_ipl_info);
|
||||
reipl_probe();
|
||||
rc = ipl_init();
|
||||
if (rc)
|
||||
|
Reference in New Issue
Block a user