1
0
Fork 0

s390/sclp: unify basic sclp access by exposing "struct sclp"

Let's unify basic access to sclp fields by storing the data in an external
struct in asm/sclp.h.

The values can now directly be accessed by other components, so there is
no need for most accessor functions and external variables anymore.

The mtid, mtid_max and facility part will be cleaned up separately.

Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
hifive-unleashed-5.1
David Hildenbrand 2015-05-06 13:18:59 +02:00 committed by Martin Schwidefsky
parent 9747bc47b3
commit 37c5f6c86c
14 changed files with 79 additions and 143 deletions

View File

@ -128,14 +128,14 @@ static struct hypfs_dbfs_file hypfs_sprp_file = {
int hypfs_sprp_init(void) int hypfs_sprp_init(void)
{ {
if (!sclp_has_sprp()) if (!sclp.has_sprp)
return 0; return 0;
return hypfs_dbfs_create_file(&hypfs_sprp_file); return hypfs_dbfs_create_file(&hypfs_sprp_file);
} }
void hypfs_sprp_exit(void) void hypfs_sprp_exit(void)
{ {
if (!sclp_has_sprp()) if (!sclp.has_sprp)
return; return;
hypfs_dbfs_remove_file(&hypfs_sprp_file); hypfs_dbfs_remove_file(&hypfs_sprp_file);
} }

View File

@ -46,33 +46,40 @@ struct sclp_cpu_info {
struct sclp_cpu_entry cpu[MAX_CPU_ADDRESS + 1]; struct sclp_cpu_entry cpu[MAX_CPU_ADDRESS + 1];
}; };
struct sclp_info {
unsigned char has_linemode : 1;
unsigned char has_vt220 : 1;
unsigned char has_siif : 1;
unsigned char has_sigpif : 1;
unsigned char has_cpu_type : 1;
unsigned char has_sprp : 1;
unsigned int ibc;
unsigned int mtid;
unsigned int mtid_cp;
unsigned int mtid_prev;
unsigned long long rzm;
unsigned long long rnmax;
unsigned long long hamax;
unsigned int max_cpu;
unsigned long hsa_size;
};
extern struct sclp_info sclp;
int sclp_get_cpu_info(struct sclp_cpu_info *info); int sclp_get_cpu_info(struct sclp_cpu_info *info);
int sclp_cpu_configure(u8 cpu); int sclp_cpu_configure(u8 cpu);
int sclp_cpu_deconfigure(u8 cpu); int sclp_cpu_deconfigure(u8 cpu);
unsigned long long sclp_get_rnmax(void);
unsigned long long sclp_get_rzm(void);
unsigned int sclp_get_max_cpu(void);
unsigned int sclp_get_mtid(u8 cpu_type); unsigned int sclp_get_mtid(u8 cpu_type);
unsigned int sclp_get_mtid_max(void); unsigned int sclp_get_mtid_max(void);
unsigned int sclp_get_mtid_prev(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);
int sclp_chp_configure(struct chp_id chpid); int sclp_chp_configure(struct chp_id chpid);
int sclp_chp_deconfigure(struct chp_id chpid); int sclp_chp_deconfigure(struct chp_id chpid);
int sclp_chp_read_info(struct sclp_chp_info *info); int sclp_chp_read_info(struct sclp_chp_info *info);
void sclp_get_ipl_info(struct sclp_ipl_info *info); void sclp_get_ipl_info(struct sclp_ipl_info *info);
bool __init sclp_has_linemode(void);
bool __init sclp_has_vt220(void);
bool sclp_has_sprp(void);
int sclp_pci_configure(u32 fid); int sclp_pci_configure(u32 fid);
int sclp_pci_deconfigure(u32 fid); int sclp_pci_deconfigure(u32 fid);
int memcpy_hsa(void *dest, unsigned long src, size_t count, int mode); int memcpy_hsa(void *dest, unsigned long src, size_t count, int mode);
unsigned long sclp_get_hsa_size(void);
void sclp_early_detect(void); void sclp_early_detect(void);
int sclp_has_siif(void);
int sclp_has_sigpif(void);
unsigned int sclp_get_ibc(void);
long _sclp_print_early(const char *); long _sclp_print_early(const char *);
#endif /* _ASM_S390_SCLP_H */ #endif /* _ASM_S390_SCLP_H */

View File

@ -122,7 +122,7 @@ static ssize_t copy_oldmem_page_zfcpdump(char *buf, size_t csize,
{ {
int rc; int rc;
if (src < sclp_get_hsa_size()) { if (src < sclp.hsa_size) {
rc = memcpy_hsa(buf, src, csize, userbuf); rc = memcpy_hsa(buf, src, csize, userbuf);
} else { } else {
if (userbuf) if (userbuf)
@ -215,7 +215,7 @@ static int remap_oldmem_pfn_range_zfcpdump(struct vm_area_struct *vma,
unsigned long pfn, unsigned long pfn,
unsigned long size, pgprot_t prot) unsigned long size, pgprot_t prot)
{ {
unsigned long hsa_end = sclp_get_hsa_size(); unsigned long hsa_end = sclp.hsa_size;
unsigned long size_hsa; unsigned long size_hsa;
if (pfn < hsa_end >> PAGE_SHIFT) { if (pfn < hsa_end >> PAGE_SHIFT) {
@ -258,7 +258,7 @@ int copy_from_oldmem(void *dest, void *src, size_t count)
return rc; return rc;
} }
} else { } else {
unsigned long hsa_end = sclp_get_hsa_size(); unsigned long hsa_end = sclp.hsa_size;
if ((unsigned long) src < hsa_end) { if ((unsigned long) src < hsa_end) {
copied = min(count, hsa_end - (unsigned long) src); copied = min(count, hsa_end - (unsigned long) src);
rc = memcpy_hsa(dest, (unsigned long) src, copied, 0); rc = memcpy_hsa(dest, (unsigned long) src, copied, 0);
@ -609,7 +609,7 @@ int elfcorehdr_alloc(unsigned long long *addr, unsigned long long *size)
if (elfcorehdr_addr != ELFCORE_ADDR_MAX) if (elfcorehdr_addr != ELFCORE_ADDR_MAX)
return 0; return 0;
/* If we cannot get HSA size for zfcpdump return error */ /* If we cannot get HSA size for zfcpdump return error */
if (ipl_info.type == IPL_TYPE_FCP_DUMP && !sclp_get_hsa_size()) if (ipl_info.type == IPL_TYPE_FCP_DUMP && !sclp.hsa_size)
return -ENODEV; return -ENODEV;
/* For kdump, exclude previous crashkernel memory */ /* For kdump, exclude previous crashkernel memory */

View File

@ -128,9 +128,9 @@ __setup("condev=", condev_setup);
static void __init set_preferred_console(void) static void __init set_preferred_console(void)
{ {
if (MACHINE_IS_KVM) { if (MACHINE_IS_KVM) {
if (sclp_has_vt220()) if (sclp.has_vt220)
add_preferred_console("ttyS", 1, NULL); add_preferred_console("ttyS", 1, NULL);
else if (sclp_has_linemode()) else if (sclp.has_linemode)
add_preferred_console("ttyS", 0, NULL); add_preferred_console("ttyS", 0, NULL);
else else
add_preferred_console("hvc", 0, NULL); add_preferred_console("hvc", 0, NULL);
@ -510,8 +510,8 @@ static void reserve_memory_end(void)
{ {
#ifdef CONFIG_CRASH_DUMP #ifdef CONFIG_CRASH_DUMP
if (ipl_info.type == IPL_TYPE_FCP_DUMP && if (ipl_info.type == IPL_TYPE_FCP_DUMP &&
!OLDMEM_BASE && sclp_get_hsa_size()) { !OLDMEM_BASE && sclp.hsa_size) {
memory_end = sclp_get_hsa_size(); memory_end = sclp.hsa_size;
memory_end &= PAGE_MASK; memory_end &= PAGE_MASK;
memory_end_set = 1; memory_end_set = 1;
} }
@ -576,7 +576,7 @@ static void __init reserve_crashkernel(void)
crash_base = low; crash_base = low;
} else { } else {
/* Find suitable area in free memory */ /* Find suitable area in free memory */
low = max_t(unsigned long, crash_size, sclp_get_hsa_size()); low = max_t(unsigned long, crash_size, sclp.hsa_size);
high = crash_base ? crash_base + crash_size : ULONG_MAX; high = crash_base ? crash_base + crash_size : ULONG_MAX;
if (crash_base && crash_base < low) { if (crash_base && crash_base < low) {

View File

@ -601,7 +601,7 @@ static void __init smp_store_cpu_states(struct sclp_cpu_info *info)
/* No previous system present, normal boot. */ /* No previous system present, normal boot. */
return; return;
/* Set multi-threading state to the previous system. */ /* Set multi-threading state to the previous system. */
pcpu_set_smt(sclp_get_mtid_prev()); pcpu_set_smt(sclp.mtid_prev);
/* Collect CPU states. */ /* Collect CPU states. */
cpu = 0; cpu = 0;
for (i = 0; i < info->configured; i++) { for (i = 0; i < info->configured; i++) {
@ -883,7 +883,7 @@ void __init smp_fill_possible_mask(void)
unsigned int possible, sclp_max, cpu; unsigned int possible, sclp_max, cpu;
sclp_max = min(smp_max_threads, sclp_get_mtid_max() + 1); sclp_max = min(smp_max_threads, sclp_get_mtid_max() + 1);
sclp_max = sclp_get_max_cpu() * sclp_max ?: nr_cpu_ids; sclp_max = sclp.max_cpu * sclp_max ?: nr_cpu_ids;
possible = setup_possible_cpus ?: nr_cpu_ids; possible = setup_possible_cpus ?: nr_cpu_ids;
possible = min(possible, sclp_max); possible = min(possible, sclp_max);
for (cpu = 0; cpu < possible && cpu < nr_cpu_ids; cpu++) for (cpu = 0; cpu < possible && cpu < nr_cpu_ids; cpu++)

View File

@ -799,7 +799,7 @@ int kvm_s390_ext_call_pending(struct kvm_vcpu *vcpu)
struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int;
uint8_t sigp_ctrl = vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sigp_ctrl; uint8_t sigp_ctrl = vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sigp_ctrl;
if (!sclp_has_sigpif()) if (!sclp.has_sigpif)
return test_bit(IRQ_PEND_EXT_EXTERNAL, &li->pending_irqs); return test_bit(IRQ_PEND_EXT_EXTERNAL, &li->pending_irqs);
return (sigp_ctrl & SIGP_CTRL_C) && return (sigp_ctrl & SIGP_CTRL_C) &&
@ -1058,7 +1058,7 @@ static int __inject_extcall(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq)
kvm_get_vcpu(vcpu->kvm, src_id) == NULL) kvm_get_vcpu(vcpu->kvm, src_id) == NULL)
return -EINVAL; return -EINVAL;
if (sclp_has_sigpif()) if (sclp.has_sigpif)
return __inject_extcall_sigpif(vcpu, src_id); return __inject_extcall_sigpif(vcpu, src_id);
if (!test_and_set_bit(IRQ_PEND_EXT_EXTERNAL, &li->pending_irqs)) if (!test_and_set_bit(IRQ_PEND_EXT_EXTERNAL, &li->pending_irqs))

View File

@ -604,7 +604,7 @@ static int kvm_s390_get_machine(struct kvm *kvm, struct kvm_device_attr *attr)
goto out; goto out;
} }
get_cpu_id((struct cpuid *) &mach->cpuid); get_cpu_id((struct cpuid *) &mach->cpuid);
mach->ibc = sclp_get_ibc(); mach->ibc = sclp.ibc;
memcpy(&mach->fac_mask, kvm->arch.model.fac->mask, memcpy(&mach->fac_mask, kvm->arch.model.fac->mask,
S390_ARCH_FAC_LIST_SIZE_BYTE); S390_ARCH_FAC_LIST_SIZE_BYTE);
memcpy((unsigned long *)&mach->fac_list, S390_lowcore.stfle_fac_list, memcpy((unsigned long *)&mach->fac_list, S390_lowcore.stfle_fac_list,
@ -1068,7 +1068,7 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
S390_ARCH_FAC_LIST_SIZE_BYTE); S390_ARCH_FAC_LIST_SIZE_BYTE);
kvm_s390_get_cpu_id(&kvm->arch.model.cpu_id); kvm_s390_get_cpu_id(&kvm->arch.model.cpu_id);
kvm->arch.model.ibc = sclp_get_ibc() & 0x0fff; kvm->arch.model.ibc = sclp.ibc & 0x0fff;
if (kvm_s390_crypto_init(kvm) < 0) if (kvm_s390_crypto_init(kvm) < 0)
goto out_err; goto out_err;
@ -1321,9 +1321,9 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
vcpu->arch.sie_block->ecb2 = 8; vcpu->arch.sie_block->ecb2 = 8;
vcpu->arch.sie_block->eca = 0xC1002000U; vcpu->arch.sie_block->eca = 0xC1002000U;
if (sclp_has_siif()) if (sclp.has_siif)
vcpu->arch.sie_block->eca |= 1; vcpu->arch.sie_block->eca |= 1;
if (sclp_has_sigpif()) if (sclp.has_sigpif)
vcpu->arch.sie_block->eca |= 0x10000000U; vcpu->arch.sie_block->eca |= 0x10000000U;
if (test_kvm_facility(vcpu->kvm, 129)) { if (test_kvm_facility(vcpu->kvm, 129)) {
vcpu->arch.sie_block->eca |= 0x00020000; vcpu->arch.sie_block->eca |= 0x00020000;

View File

@ -213,7 +213,7 @@ unsigned long memory_block_size_bytes(void)
* Make sure the memory block size is always greater * Make sure the memory block size is always greater
* or equal than the memory increment size. * or equal than the memory increment size.
*/ */
return max_t(unsigned long, MIN_MEMORY_BLOCK_SIZE, sclp_get_rzm()); return max_t(unsigned long, MIN_MEMORY_BLOCK_SIZE, sclp.rzm);
} }
#ifdef CONFIG_MEMORY_HOTREMOVE #ifdef CONFIG_MEMORY_HOTREMOVE

View File

@ -31,8 +31,8 @@ void __init detect_memory_memblock(void)
unsigned long addr, size; unsigned long addr, size;
int type; int type;
rzm = sclp_get_rzm(); rzm = sclp.rzm;
rnmax = sclp_get_rnmax(); rnmax = sclp.rnmax;
memsize = rzm * rnmax; memsize = rzm * rnmax;
if (!rzm) if (!rzm)
rzm = 1ULL << 17; rzm = 1ULL << 17;

View File

@ -191,9 +191,6 @@ void sclp_sdias_exit(void);
extern int sclp_console_pages; extern int sclp_console_pages;
extern int sclp_console_drop; extern int sclp_console_drop;
extern unsigned long sclp_console_full; extern unsigned long sclp_console_full;
extern u8 sclp_fac84;
extern unsigned long long sclp_rzm;
extern unsigned long long sclp_rnmax;
/* useful inlines */ /* useful inlines */

View File

@ -101,7 +101,7 @@ static void sclp_fill_cpu_info(struct sclp_cpu_info *info,
info->configured = sccb->nr_configured; info->configured = sccb->nr_configured;
info->standby = sccb->nr_standby; info->standby = sccb->nr_standby;
info->combined = sccb->nr_configured + sccb->nr_standby; info->combined = sccb->nr_configured + sccb->nr_standby;
info->has_cpu_type = sclp_fac84 & 0x1; info->has_cpu_type = sclp.has_cpu_type;
memcpy(&info->cpu, page + sccb->offset_configured, memcpy(&info->cpu, page + sccb->offset_configured,
info->combined * sizeof(struct sclp_cpu_entry)); info->combined * sizeof(struct sclp_cpu_entry));
} }
@ -202,14 +202,14 @@ struct assign_storage_sccb {
int arch_get_memory_phys_device(unsigned long start_pfn) int arch_get_memory_phys_device(unsigned long start_pfn)
{ {
if (!sclp_rzm) if (!sclp.rzm)
return 0; return 0;
return PFN_PHYS(start_pfn) >> ilog2(sclp_rzm); return PFN_PHYS(start_pfn) >> ilog2(sclp.rzm);
} }
static unsigned long long rn2addr(u16 rn) static unsigned long long rn2addr(u16 rn)
{ {
return (unsigned long long) (rn - 1) * sclp_rzm; return (unsigned long long) (rn - 1) * sclp.rzm;
} }
static int do_assign_storage(sclp_cmdw_t cmd, u16 rn) static int do_assign_storage(sclp_cmdw_t cmd, u16 rn)
@ -250,7 +250,7 @@ static int sclp_assign_storage(u16 rn)
if (rc) if (rc)
return rc; return rc;
start = rn2addr(rn); start = rn2addr(rn);
storage_key_init_range(start, start + sclp_rzm); storage_key_init_range(start, start + sclp.rzm);
return 0; return 0;
} }
@ -309,7 +309,7 @@ static int sclp_mem_change_state(unsigned long start, unsigned long size,
istart = rn2addr(incr->rn); istart = rn2addr(incr->rn);
if (start + size - 1 < istart) if (start + size - 1 < istart)
break; break;
if (start > istart + sclp_rzm - 1) if (start > istart + sclp.rzm - 1)
continue; continue;
if (online) if (online)
rc |= sclp_assign_storage(incr->rn); rc |= sclp_assign_storage(incr->rn);
@ -330,7 +330,7 @@ static bool contains_standby_increment(unsigned long start, unsigned long end)
istart = rn2addr(incr->rn); istart = rn2addr(incr->rn);
if (end - 1 < istart) if (end - 1 < istart)
continue; continue;
if (start > istart + sclp_rzm - 1) if (start > istart + sclp.rzm - 1)
continue; continue;
if (incr->standby) if (incr->standby)
return true; return true;
@ -415,7 +415,7 @@ static void __init add_memory_merged(u16 rn)
if (!first_rn) if (!first_rn)
goto skip_add; goto skip_add;
start = rn2addr(first_rn); start = rn2addr(first_rn);
size = (unsigned long long) num * sclp_rzm; size = (unsigned long long) num * sclp.rzm;
if (start >= VMEM_MAX_PHYS) if (start >= VMEM_MAX_PHYS)
goto skip_add; goto skip_add;
if (start + size > VMEM_MAX_PHYS) if (start + size > VMEM_MAX_PHYS)
@ -465,7 +465,7 @@ static void __init insert_increment(u16 rn, int standby, int assigned)
} }
if (!assigned) if (!assigned)
new_incr->rn = last_rn + 1; new_incr->rn = last_rn + 1;
if (new_incr->rn > sclp_rnmax) { if (new_incr->rn > sclp.rnmax) {
kfree(new_incr); kfree(new_incr);
return; return;
} }
@ -550,7 +550,7 @@ static int __init sclp_detect_standby_memory(void)
} }
if (rc || list_empty(&sclp_mem_list)) if (rc || list_empty(&sclp_mem_list))
goto out; goto out;
for (i = 1; i <= sclp_rnmax - assigned; i++) for (i = 1; i <= sclp.rnmax - assigned; i++)
insert_increment(0, 1, 0); insert_increment(0, 1, 0);
rc = register_memory_notifier(&sclp_mem_nb); rc = register_memory_notifier(&sclp_mem_nb);
if (rc) if (rc)
@ -753,8 +753,3 @@ out:
free_page((unsigned long) sccb); free_page((unsigned long) sccb);
return rc; return rc;
} }
bool sclp_has_sprp(void)
{
return !!(sclp_fac84 & 0x2);
}

View File

@ -48,23 +48,12 @@ struct read_info_sccb {
} __packed __aligned(PAGE_SIZE); } __packed __aligned(PAGE_SIZE);
static char sccb_early[PAGE_SIZE] __aligned(PAGE_SIZE) __initdata; static char sccb_early[PAGE_SIZE] __aligned(PAGE_SIZE) __initdata;
static unsigned int sclp_con_has_vt220 __initdata;
static unsigned int sclp_con_has_linemode __initdata;
static unsigned long sclp_hsa_size;
static unsigned int sclp_max_cpu;
static struct sclp_ipl_info sclp_ipl_info; static struct sclp_ipl_info sclp_ipl_info;
static unsigned char sclp_siif;
static unsigned char sclp_sigpif;
static u32 sclp_ibc;
static unsigned int sclp_mtid;
static unsigned int sclp_mtid_cp;
static unsigned int sclp_mtid_max; static unsigned int sclp_mtid_max;
static unsigned int sclp_mtid_prev;
struct sclp_info sclp;
EXPORT_SYMBOL(sclp);
u64 sclp_facilities; u64 sclp_facilities;
u8 sclp_fac84;
unsigned long long sclp_rzm;
unsigned long long sclp_rnmax;
static int __init sclp_cmd_sync_early(sclp_cmdw_t cmd, void *sccb) static int __init sclp_cmd_sync_early(sclp_cmdw_t cmd, void *sccb)
{ {
@ -118,21 +107,22 @@ static void __init sclp_facilities_detect(struct read_info_sccb *sccb)
return; return;
sclp_facilities = sccb->facilities; sclp_facilities = sccb->facilities;
sclp_fac84 = sccb->fac84; sclp.has_sprp = !!(sccb->fac84 & 0x02);
sclp.has_cpu_type = !!(sccb->fac84 & 0x01);
if (sccb->fac85 & 0x02) if (sccb->fac85 & 0x02)
S390_lowcore.machine_flags |= MACHINE_FLAG_ESOP; S390_lowcore.machine_flags |= MACHINE_FLAG_ESOP;
sclp_rnmax = sccb->rnmax ? sccb->rnmax : sccb->rnmax2; sclp.rnmax = sccb->rnmax ? sccb->rnmax : sccb->rnmax2;
sclp_rzm = sccb->rnsize ? sccb->rnsize : sccb->rnsize2; sclp.rzm = sccb->rnsize ? sccb->rnsize : sccb->rnsize2;
sclp_rzm <<= 20; sclp.rzm <<= 20;
sclp_ibc = sccb->ibc; sclp.ibc = sccb->ibc;
if (!sccb->hcpua) { if (!sccb->hcpua) {
if (MACHINE_IS_VM) if (MACHINE_IS_VM)
sclp_max_cpu = 64; sclp.max_cpu = 64;
else else
sclp_max_cpu = sccb->ncpurl; sclp.max_cpu = sccb->ncpurl;
} else { } else {
sclp_max_cpu = sccb->hcpua + 1; sclp.max_cpu = sccb->hcpua + 1;
} }
boot_cpu_address = stap(); boot_cpu_address = stap();
@ -140,8 +130,8 @@ static void __init sclp_facilities_detect(struct read_info_sccb *sccb)
for (cpu = 0; cpu < sccb->ncpurl; cpue++, cpu++) { for (cpu = 0; cpu < sccb->ncpurl; cpue++, cpu++) {
if (boot_cpu_address != cpue->core_id) if (boot_cpu_address != cpue->core_id)
continue; continue;
sclp_siif = cpue->siif; sclp.has_siif = cpue->siif;
sclp_sigpif = cpue->sigpif; sclp.has_sigpif = cpue->sigpif;
break; break;
} }
@ -151,58 +141,15 @@ static void __init sclp_facilities_detect(struct read_info_sccb *sccb)
sclp_ipl_info.has_dump = 1; sclp_ipl_info.has_dump = 1;
memcpy(&sclp_ipl_info.loadparm, &sccb->loadparm, LOADPARM_LEN); memcpy(&sclp_ipl_info.loadparm, &sccb->loadparm, LOADPARM_LEN);
sclp_mtid = (sccb->fac42 & 0x80) ? (sccb->fac42 & 31) : 0; sclp.mtid = (sccb->fac42 & 0x80) ? (sccb->fac42 & 31) : 0;
sclp_mtid_cp = (sccb->fac42 & 0x80) ? (sccb->fac43 & 31) : 0; sclp.mtid_cp = (sccb->fac42 & 0x80) ? (sccb->fac43 & 31) : 0;
sclp_mtid_max = max(sclp_mtid, sclp_mtid_cp); sclp_mtid_max = max(sclp.mtid, sclp.mtid_cp);
sclp_mtid_prev = (sccb->fac42 & 0x80) ? (sccb->fac66 & 31) : 0; sclp.mtid_prev = (sccb->fac42 & 0x80) ? (sccb->fac66 & 31) : 0;
} }
bool __init sclp_has_linemode(void)
{
return !!sclp_con_has_linemode;
}
bool __init sclp_has_vt220(void)
{
return !!sclp_con_has_vt220;
}
unsigned long long sclp_get_rnmax(void)
{
return sclp_rnmax;
}
unsigned long long sclp_get_rzm(void)
{
return sclp_rzm;
}
unsigned int sclp_get_max_cpu(void)
{
return sclp_max_cpu;
}
int sclp_has_siif(void)
{
return sclp_siif;
}
EXPORT_SYMBOL(sclp_has_siif);
int sclp_has_sigpif(void)
{
return sclp_sigpif;
}
EXPORT_SYMBOL(sclp_has_sigpif);
unsigned int sclp_get_ibc(void)
{
return sclp_ibc;
}
EXPORT_SYMBOL(sclp_get_ibc);
unsigned int sclp_get_mtid(u8 cpu_type) unsigned int sclp_get_mtid(u8 cpu_type)
{ {
return cpu_type ? sclp_mtid : sclp_mtid_cp; return cpu_type ? sclp.mtid : sclp.mtid_cp;
} }
unsigned int sclp_get_mtid_max(void) unsigned int sclp_get_mtid_max(void)
@ -210,11 +157,6 @@ unsigned int sclp_get_mtid_max(void)
return sclp_mtid_max; return sclp_mtid_max;
} }
unsigned int sclp_get_mtid_prev(void)
{
return sclp_mtid_prev;
}
/* /*
* This function will be called after sclp_facilities_detect(), which gets * This function will be called after sclp_facilities_detect(), which gets
* called from early.c code. The sclp_facilities_detect() function retrieves * called from early.c code. The sclp_facilities_detect() function retrieves
@ -286,11 +228,6 @@ static long __init sclp_hsa_copy_wait(struct sccb_header *sccb)
return (((struct sdias_sccb *) sccb)->evbuf.blk_cnt - 1) * PAGE_SIZE; return (((struct sdias_sccb *) sccb)->evbuf.blk_cnt - 1) * PAGE_SIZE;
} }
unsigned long sclp_get_hsa_size(void)
{
return sclp_hsa_size;
}
static void __init sclp_hsa_size_detect(void *sccb) static void __init sclp_hsa_size_detect(void *sccb)
{ {
long size; long size;
@ -313,7 +250,7 @@ static void __init sclp_hsa_size_detect(void *sccb)
if (size < 0) if (size < 0)
return; return;
out: out:
sclp_hsa_size = size; sclp.hsa_size = size;
} }
static unsigned int __init sclp_con_check_linemode(struct init_sccb *sccb) static unsigned int __init sclp_con_check_linemode(struct init_sccb *sccb)
@ -331,10 +268,10 @@ static void __init sclp_console_detect(struct init_sccb *sccb)
return; return;
if (sccb->sclp_send_mask & EVTYP_VT220MSG_MASK) if (sccb->sclp_send_mask & EVTYP_VT220MSG_MASK)
sclp_con_has_vt220 = 1; sclp.has_vt220 = 1;
if (sclp_con_check_linemode(sccb)) if (sclp_con_check_linemode(sccb))
sclp_con_has_linemode = 1; sclp.has_linemode = 1;
} }
void __init sclp_early_detect(void) void __init sclp_early_detect(void)

View File

@ -330,9 +330,9 @@ static ssize_t zcore_read(struct file *file, char __user *buf, size_t count,
mem_offs = 0; mem_offs = 0;
/* Copy from HSA data */ /* Copy from HSA data */
if (*ppos < sclp_get_hsa_size() + HEADER_SIZE) { if (*ppos < sclp.hsa_size + HEADER_SIZE) {
size = min((count - hdr_count), size = min((count - hdr_count),
(size_t) (sclp_get_hsa_size() - mem_start)); (size_t) (sclp.hsa_size - mem_start));
rc = memcpy_hsa_user(buf + hdr_count, mem_start, size); rc = memcpy_hsa_user(buf + hdr_count, mem_start, size);
if (rc) if (rc)
goto fail; goto fail;
@ -483,7 +483,7 @@ static ssize_t zcore_hsa_read(struct file *filp, char __user *buf,
static char str[18]; static char str[18];
if (hsa_available) if (hsa_available)
snprintf(str, sizeof(str), "%lx\n", sclp_get_hsa_size()); snprintf(str, sizeof(str), "%lx\n", sclp.hsa_size);
else else
snprintf(str, sizeof(str), "0\n"); snprintf(str, sizeof(str), "0\n");
return simple_read_from_buffer(buf, count, ppos, str, strlen(str)); return simple_read_from_buffer(buf, count, ppos, str, strlen(str));
@ -558,7 +558,7 @@ static int __init sys_info_init(enum arch_id arch, unsigned long mem_end)
static int __init check_sdias(void) static int __init check_sdias(void)
{ {
if (!sclp_get_hsa_size()) { if (!sclp.hsa_size) {
TRACE("Could not determine HSA size\n"); TRACE("Could not determine HSA size\n");
return -ENODEV; return -ENODEV;
} }
@ -619,7 +619,7 @@ static int __init zcore_reipl_init(void)
ipl_block = (void *) __get_free_page(GFP_KERNEL); ipl_block = (void *) __get_free_page(GFP_KERNEL);
if (!ipl_block) if (!ipl_block)
return -ENOMEM; return -ENOMEM;
if (ipib_info.ipib < sclp_get_hsa_size()) if (ipib_info.ipib < sclp.hsa_size)
rc = memcpy_hsa_kernel(ipl_block, ipib_info.ipib, PAGE_SIZE); rc = memcpy_hsa_kernel(ipl_block, ipib_info.ipib, PAGE_SIZE);
else else
rc = memcpy_real(ipl_block, (void *) ipib_info.ipib, PAGE_SIZE); rc = memcpy_real(ipl_block, (void *) ipib_info.ipib, PAGE_SIZE);

View File

@ -450,7 +450,7 @@ static int __init test_devices_support(unsigned long addr)
static int __init kvm_devices_init(void) static int __init kvm_devices_init(void)
{ {
int rc; int rc;
unsigned long total_memory_size = sclp_get_rzm() * sclp_get_rnmax(); unsigned long total_memory_size = sclp.rzm * sclp.rnmax;
if (!MACHINE_IS_KVM) if (!MACHINE_IS_KVM)
return -ENODEV; return -ENODEV;
@ -497,7 +497,7 @@ static __init int early_put_chars(u32 vtermno, const char *buf, int count)
static int __init s390_virtio_console_init(void) static int __init s390_virtio_console_init(void)
{ {
if (sclp_has_vt220() || sclp_has_linemode()) if (sclp.has_vt220 || sclp.has_linemode)
return -ENODEV; return -ENODEV;
return virtio_cons_early_init(early_put_chars); return virtio_cons_early_init(early_put_chars);
} }