[S390] sclp: Test facility list before executing a service call.
Check if a command is available before executing. Saves some superfluous service calls that won't succeed anyway. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
05dd25307c
commit
83119ad4a1
5 changed files with 20 additions and 0 deletions
|
@ -275,6 +275,7 @@ void __init startup_init(void)
|
||||||
sort_main_extable();
|
sort_main_extable();
|
||||||
setup_lowcore_early();
|
setup_lowcore_early();
|
||||||
sclp_readinfo_early();
|
sclp_readinfo_early();
|
||||||
|
sclp_facilities_detect();
|
||||||
memsize = sclp_memory_detect();
|
memsize = sclp_memory_detect();
|
||||||
#ifndef CONFIG_64BIT
|
#ifndef CONFIG_64BIT
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -79,6 +79,11 @@ struct sccb_header {
|
||||||
u16 response_code;
|
u16 response_code;
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
extern u64 sclp_facilities;
|
||||||
|
|
||||||
|
#define SCLP_HAS_CHP_INFO (sclp_facilities & 0x8000000000000000ULL)
|
||||||
|
#define SCLP_HAS_CHP_RECONFIG (sclp_facilities & 0x2000000000000000ULL)
|
||||||
|
|
||||||
struct gds_subvector {
|
struct gds_subvector {
|
||||||
u8 length;
|
u8 length;
|
||||||
u8 key;
|
u8 key;
|
||||||
|
|
|
@ -55,6 +55,8 @@ static int do_configure(sclp_cmdw_t cmd)
|
||||||
struct chp_cfg_data *data;
|
struct chp_cfg_data *data;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
if (!SCLP_HAS_CHP_RECONFIG)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
/* Prepare sccb. */
|
/* Prepare sccb. */
|
||||||
data = (struct chp_cfg_data *) get_zeroed_page(GFP_KERNEL | GFP_DMA);
|
data = (struct chp_cfg_data *) get_zeroed_page(GFP_KERNEL | GFP_DMA);
|
||||||
if (!data)
|
if (!data)
|
||||||
|
@ -152,6 +154,8 @@ int sclp_chp_read_info(struct sclp_chp_info *info)
|
||||||
struct chp_info_data *data;
|
struct chp_info_data *data;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
if (!SCLP_HAS_CHP_INFO)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
/* Prepare sccb. */
|
/* Prepare sccb. */
|
||||||
data = (struct chp_info_data *) get_zeroed_page(GFP_KERNEL | GFP_DMA);
|
data = (struct chp_info_data *) get_zeroed_page(GFP_KERNEL | GFP_DMA);
|
||||||
if (!data)
|
if (!data)
|
||||||
|
|
|
@ -30,6 +30,8 @@ struct sclp_readinfo_sccb {
|
||||||
static struct sclp_readinfo_sccb __initdata early_readinfo_sccb;
|
static struct sclp_readinfo_sccb __initdata early_readinfo_sccb;
|
||||||
static int __initdata early_readinfo_sccb_valid;
|
static int __initdata early_readinfo_sccb_valid;
|
||||||
|
|
||||||
|
u64 sclp_facilities;
|
||||||
|
|
||||||
void __init sclp_readinfo_early(void)
|
void __init sclp_readinfo_early(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -70,6 +72,13 @@ void __init sclp_readinfo_early(void)
|
||||||
__ctl_clear_bit(0, 9);
|
__ctl_clear_bit(0, 9);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __init sclp_facilities_detect(void)
|
||||||
|
{
|
||||||
|
if (!early_readinfo_sccb_valid)
|
||||||
|
return;
|
||||||
|
sclp_facilities = early_readinfo_sccb.facilities;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned long long __init sclp_memory_detect(void)
|
unsigned long long __init sclp_memory_detect(void)
|
||||||
{
|
{
|
||||||
unsigned long long memsize;
|
unsigned long long memsize;
|
||||||
|
|
|
@ -28,6 +28,7 @@ struct sclp_ipl_info {
|
||||||
};
|
};
|
||||||
|
|
||||||
void sclp_readinfo_early(void);
|
void sclp_readinfo_early(void);
|
||||||
|
void sclp_facilities_detect(void);
|
||||||
unsigned long long sclp_memory_detect(void);
|
unsigned long long sclp_memory_detect(void);
|
||||||
int sclp_sdias_blk_count(void);
|
int sclp_sdias_blk_count(void);
|
||||||
int sclp_sdias_copy(void *dest, int blk_num, int nr_blks);
|
int sclp_sdias_copy(void *dest, int blk_num, int nr_blks);
|
||||||
|
|
Loading…
Reference in a new issue