Commit 83119ad4 authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky

[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: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 05dd2530
...@@ -275,6 +275,7 @@ void __init startup_init(void) ...@@ -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 { ...@@ -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) ...@@ -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) ...@@ -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 { ...@@ -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) ...@@ -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 { ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment