mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
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 <[email protected]> Signed-off-by: David Hildenbrand <[email protected]> Signed-off-by: Martin Schwidefsky <[email protected]>
This commit is contained in:
parent
9747bc47b3
commit
37c5f6c86c
14 changed files with 79 additions and 143 deletions
|
|
@ -191,9 +191,6 @@ void sclp_sdias_exit(void);
|
|||
extern int sclp_console_pages;
|
||||
extern int sclp_console_drop;
|
||||
extern unsigned long sclp_console_full;
|
||||
extern u8 sclp_fac84;
|
||||
extern unsigned long long sclp_rzm;
|
||||
extern unsigned long long sclp_rnmax;
|
||||
|
||||
/* useful inlines */
|
||||
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ static void sclp_fill_cpu_info(struct sclp_cpu_info *info,
|
|||
info->configured = sccb->nr_configured;
|
||||
info->standby = 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,
|
||||
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)
|
||||
{
|
||||
if (!sclp_rzm)
|
||||
if (!sclp.rzm)
|
||||
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)
|
||||
{
|
||||
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)
|
||||
|
|
@ -250,7 +250,7 @@ static int sclp_assign_storage(u16 rn)
|
|||
if (rc)
|
||||
return rc;
|
||||
start = rn2addr(rn);
|
||||
storage_key_init_range(start, start + sclp_rzm);
|
||||
storage_key_init_range(start, start + sclp.rzm);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -309,7 +309,7 @@ static int sclp_mem_change_state(unsigned long start, unsigned long size,
|
|||
istart = rn2addr(incr->rn);
|
||||
if (start + size - 1 < istart)
|
||||
break;
|
||||
if (start > istart + sclp_rzm - 1)
|
||||
if (start > istart + sclp.rzm - 1)
|
||||
continue;
|
||||
if (online)
|
||||
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);
|
||||
if (end - 1 < istart)
|
||||
continue;
|
||||
if (start > istart + sclp_rzm - 1)
|
||||
if (start > istart + sclp.rzm - 1)
|
||||
continue;
|
||||
if (incr->standby)
|
||||
return true;
|
||||
|
|
@ -415,7 +415,7 @@ static void __init add_memory_merged(u16 rn)
|
|||
if (!first_rn)
|
||||
goto skip_add;
|
||||
start = rn2addr(first_rn);
|
||||
size = (unsigned long long) num * sclp_rzm;
|
||||
size = (unsigned long long) num * sclp.rzm;
|
||||
if (start >= VMEM_MAX_PHYS)
|
||||
goto skip_add;
|
||||
if (start + size > VMEM_MAX_PHYS)
|
||||
|
|
@ -465,7 +465,7 @@ static void __init insert_increment(u16 rn, int standby, int assigned)
|
|||
}
|
||||
if (!assigned)
|
||||
new_incr->rn = last_rn + 1;
|
||||
if (new_incr->rn > sclp_rnmax) {
|
||||
if (new_incr->rn > sclp.rnmax) {
|
||||
kfree(new_incr);
|
||||
return;
|
||||
}
|
||||
|
|
@ -550,7 +550,7 @@ static int __init sclp_detect_standby_memory(void)
|
|||
}
|
||||
if (rc || list_empty(&sclp_mem_list))
|
||||
goto out;
|
||||
for (i = 1; i <= sclp_rnmax - assigned; i++)
|
||||
for (i = 1; i <= sclp.rnmax - assigned; i++)
|
||||
insert_increment(0, 1, 0);
|
||||
rc = register_memory_notifier(&sclp_mem_nb);
|
||||
if (rc)
|
||||
|
|
@ -753,8 +753,3 @@ out:
|
|||
free_page((unsigned long) sccb);
|
||||
return rc;
|
||||
}
|
||||
|
||||
bool sclp_has_sprp(void)
|
||||
{
|
||||
return !!(sclp_fac84 & 0x2);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -48,23 +48,12 @@ struct read_info_sccb {
|
|||
} __packed __aligned(PAGE_SIZE);
|
||||
|
||||
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 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_prev;
|
||||
|
||||
struct sclp_info sclp;
|
||||
EXPORT_SYMBOL(sclp);
|
||||
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)
|
||||
{
|
||||
|
|
@ -118,21 +107,22 @@ static void __init sclp_facilities_detect(struct read_info_sccb *sccb)
|
|||
return;
|
||||
|
||||
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)
|
||||
S390_lowcore.machine_flags |= MACHINE_FLAG_ESOP;
|
||||
sclp_rnmax = sccb->rnmax ? sccb->rnmax : sccb->rnmax2;
|
||||
sclp_rzm = sccb->rnsize ? sccb->rnsize : sccb->rnsize2;
|
||||
sclp_rzm <<= 20;
|
||||
sclp_ibc = sccb->ibc;
|
||||
sclp.rnmax = sccb->rnmax ? sccb->rnmax : sccb->rnmax2;
|
||||
sclp.rzm = sccb->rnsize ? sccb->rnsize : sccb->rnsize2;
|
||||
sclp.rzm <<= 20;
|
||||
sclp.ibc = sccb->ibc;
|
||||
|
||||
if (!sccb->hcpua) {
|
||||
if (MACHINE_IS_VM)
|
||||
sclp_max_cpu = 64;
|
||||
sclp.max_cpu = 64;
|
||||
else
|
||||
sclp_max_cpu = sccb->ncpurl;
|
||||
sclp.max_cpu = sccb->ncpurl;
|
||||
} else {
|
||||
sclp_max_cpu = sccb->hcpua + 1;
|
||||
sclp.max_cpu = sccb->hcpua + 1;
|
||||
}
|
||||
|
||||
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++) {
|
||||
if (boot_cpu_address != cpue->core_id)
|
||||
continue;
|
||||
sclp_siif = cpue->siif;
|
||||
sclp_sigpif = cpue->sigpif;
|
||||
sclp.has_siif = cpue->siif;
|
||||
sclp.has_sigpif = cpue->sigpif;
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -151,58 +141,15 @@ static void __init sclp_facilities_detect(struct read_info_sccb *sccb)
|
|||
sclp_ipl_info.has_dump = 1;
|
||||
memcpy(&sclp_ipl_info.loadparm, &sccb->loadparm, LOADPARM_LEN);
|
||||
|
||||
sclp_mtid = (sccb->fac42 & 0x80) ? (sccb->fac42 & 31) : 0;
|
||||
sclp_mtid_cp = (sccb->fac42 & 0x80) ? (sccb->fac43 & 31) : 0;
|
||||
sclp_mtid_max = max(sclp_mtid, sclp_mtid_cp);
|
||||
sclp_mtid_prev = (sccb->fac42 & 0x80) ? (sccb->fac66 & 31) : 0;
|
||||
sclp.mtid = (sccb->fac42 & 0x80) ? (sccb->fac42 & 31) : 0;
|
||||
sclp.mtid_cp = (sccb->fac42 & 0x80) ? (sccb->fac43 & 31) : 0;
|
||||
sclp_mtid_max = max(sclp.mtid, sclp.mtid_cp);
|
||||
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)
|
||||
{
|
||||
return cpu_type ? sclp_mtid : sclp_mtid_cp;
|
||||
return cpu_type ? sclp.mtid : sclp.mtid_cp;
|
||||
}
|
||||
|
||||
unsigned int sclp_get_mtid_max(void)
|
||||
|
|
@ -210,11 +157,6 @@ unsigned int sclp_get_mtid_max(void)
|
|||
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
|
||||
* 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;
|
||||
}
|
||||
|
||||
unsigned long sclp_get_hsa_size(void)
|
||||
{
|
||||
return sclp_hsa_size;
|
||||
}
|
||||
|
||||
static void __init sclp_hsa_size_detect(void *sccb)
|
||||
{
|
||||
long size;
|
||||
|
|
@ -313,7 +250,7 @@ static void __init sclp_hsa_size_detect(void *sccb)
|
|||
if (size < 0)
|
||||
return;
|
||||
out:
|
||||
sclp_hsa_size = size;
|
||||
sclp.hsa_size = size;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
if (sccb->sclp_send_mask & EVTYP_VT220MSG_MASK)
|
||||
sclp_con_has_vt220 = 1;
|
||||
sclp.has_vt220 = 1;
|
||||
|
||||
if (sclp_con_check_linemode(sccb))
|
||||
sclp_con_has_linemode = 1;
|
||||
sclp.has_linemode = 1;
|
||||
}
|
||||
|
||||
void __init sclp_early_detect(void)
|
||||
|
|
|
|||
|
|
@ -330,9 +330,9 @@ static ssize_t zcore_read(struct file *file, char __user *buf, size_t count,
|
|||
mem_offs = 0;
|
||||
|
||||
/* 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_t) (sclp_get_hsa_size() - mem_start));
|
||||
(size_t) (sclp.hsa_size - mem_start));
|
||||
rc = memcpy_hsa_user(buf + hdr_count, mem_start, size);
|
||||
if (rc)
|
||||
goto fail;
|
||||
|
|
@ -483,7 +483,7 @@ static ssize_t zcore_hsa_read(struct file *filp, char __user *buf,
|
|||
static char str[18];
|
||||
|
||||
if (hsa_available)
|
||||
snprintf(str, sizeof(str), "%lx\n", sclp_get_hsa_size());
|
||||
snprintf(str, sizeof(str), "%lx\n", sclp.hsa_size);
|
||||
else
|
||||
snprintf(str, sizeof(str), "0\n");
|
||||
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)
|
||||
{
|
||||
if (!sclp_get_hsa_size()) {
|
||||
if (!sclp.hsa_size) {
|
||||
TRACE("Could not determine HSA size\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
|
@ -619,7 +619,7 @@ static int __init zcore_reipl_init(void)
|
|||
ipl_block = (void *) __get_free_page(GFP_KERNEL);
|
||||
if (!ipl_block)
|
||||
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);
|
||||
else
|
||||
rc = memcpy_real(ipl_block, (void *) ipib_info.ipib, PAGE_SIZE);
|
||||
|
|
|
|||
|
|
@ -450,7 +450,7 @@ static int __init test_devices_support(unsigned long addr)
|
|||
static int __init kvm_devices_init(void)
|
||||
{
|
||||
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)
|
||||
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)
|
||||
{
|
||||
if (sclp_has_vt220() || sclp_has_linemode())
|
||||
if (sclp.has_vt220 || sclp.has_linemode)
|
||||
return -ENODEV;
|
||||
return virtio_cons_early_init(early_put_chars);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue