Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 324091
b: refs/heads/master
c: caf757c
h: refs/heads/master
i:
  324089: d9aa524
  324087: 0c9baee
v: v3
  • Loading branch information
Heiko Carstens authored and Martin Schwidefsky committed Sep 26, 2012
1 parent 6fa5e97 commit 2428afe
Show file tree
Hide file tree
Showing 7 changed files with 53 additions and 62 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 94f2b9e25dc4d71b12cd16b6786cdef52b34a931
refs/heads/master: caf757c609445b01ad845df160369d8ccfd97d5b
16 changes: 1 addition & 15 deletions trunk/arch/s390/include/asm/sysinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,21 +153,7 @@ struct sysinfo_15_1_x {
union topology_entry tle[0];
};

static inline int stsi(void *sysinfo, int fc, int sel1, int sel2)
{
register int r0 asm("0") = (fc << 28) | sel1;
register int r1 asm("1") = sel2;

asm volatile(
" stsi 0(%2)\n"
"0: jz 2f\n"
"1: lhi %0,%3\n"
"2:\n"
EX_TABLE(0b, 1b)
: "+d" (r0) : "d" (r1), "a" (sysinfo), "K" (-ENOSYS)
: "cc", "memory");
return r0;
}
int stsi(void *sysinfo, int fc, int sel1, int sel2);

/*
* Service level reporting interface.
Expand Down
6 changes: 3 additions & 3 deletions trunk/arch/s390/kernel/early.c
Original file line number Diff line number Diff line change
Expand Up @@ -222,12 +222,12 @@ static noinline __init void detect_machine_type(void)
struct sysinfo_3_2_2 *vmms = (struct sysinfo_3_2_2 *)&sysinfo_page;

/* Check current-configuration-level */
if ((stsi(NULL, 0, 0, 0) >> 28) <= 2) {
if (stsi(NULL, 0, 0, 0) <= 2) {
S390_lowcore.machine_flags |= MACHINE_FLAG_LPAR;
return;
}
/* Get virtual-machine cpu information. */
if (stsi(vmms, 3, 2, 2) == -ENOSYS || !vmms->count)
if (stsi(vmms, 3, 2, 2) || !vmms->count)
return;

/* Running under KVM? If not we assume z/VM */
Expand All @@ -246,7 +246,7 @@ static __init void setup_topology(void)
return;
S390_lowcore.machine_flags |= MACHINE_FLAG_TOPOLOGY;
for (max_mnest = 6; max_mnest > 1; max_mnest--) {
if (stsi(&sysinfo_page, 15, 1, max_mnest) != -ENOSYS)
if (stsi(&sysinfo_page, 15, 1, max_mnest) == 0)
break;
}
topology_max_mnest = max_mnest;
Expand Down
29 changes: 10 additions & 19 deletions trunk/arch/s390/kernel/lgr.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,16 +50,6 @@ static struct lgr_info lgr_info_last;
static struct lgr_info lgr_info_cur;
static struct debug_info *lgr_dbf;

/*
* Return number of valid stsi levels
*/
static inline int stsi_0(void)
{
int rc = stsi(NULL, 0, 0, 0);

return rc == -ENOSYS ? rc : (((unsigned int) rc) >> 28);
}

/*
* Copy buffer and then convert it to ASCII
*/
Expand All @@ -76,7 +66,7 @@ static void lgr_stsi_1_1_1(struct lgr_info *lgr_info)
{
struct sysinfo_1_1_1 *si = (void *) lgr_page;

if (stsi(si, 1, 1, 1) == -ENOSYS)
if (stsi(si, 1, 1, 1))
return;
cpascii(lgr_info->manufacturer, si->manufacturer,
sizeof(si->manufacturer));
Expand All @@ -93,7 +83,7 @@ static void lgr_stsi_2_2_2(struct lgr_info *lgr_info)
{
struct sysinfo_2_2_2 *si = (void *) lgr_page;

if (stsi(si, 2, 2, 2) == -ENOSYS)
if (stsi(si, 2, 2, 2))
return;
cpascii(lgr_info->name, si->name, sizeof(si->name));
memcpy(&lgr_info->lpar_number, &si->lpar_number,
Expand All @@ -108,7 +98,7 @@ static void lgr_stsi_3_2_2(struct lgr_info *lgr_info)
struct sysinfo_3_2_2 *si = (void *) lgr_page;
int i;

if (stsi(si, 3, 2, 2) == -ENOSYS)
if (stsi(si, 3, 2, 2))
return;
for (i = 0; i < min_t(u8, si->count, VM_LEVEL_MAX); i++) {
cpascii(lgr_info->vm[i].name, si->vm[i].name,
Expand All @@ -124,16 +114,17 @@ static void lgr_stsi_3_2_2(struct lgr_info *lgr_info)
*/
static void lgr_info_get(struct lgr_info *lgr_info)
{
int level;

memset(lgr_info, 0, sizeof(*lgr_info));
stfle(lgr_info->stfle_fac_list, ARRAY_SIZE(lgr_info->stfle_fac_list));
lgr_info->level = stsi_0();
if (lgr_info->level == -ENOSYS)
return;
if (lgr_info->level >= 1)
level = stsi(NULL, 0, 0, 0);
lgr_info->level = level;
if (level >= 1)
lgr_stsi_1_1_1(lgr_info);
if (lgr_info->level >= 2)
if (level >= 2)
lgr_stsi_2_2_2(lgr_info);
if (lgr_info->level >= 3)
if (level >= 3)
lgr_stsi_3_2_2(lgr_info);
}

Expand Down
43 changes: 32 additions & 11 deletions trunk/arch/s390/kernel/sysinfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,38 @@

int topology_max_mnest;

static inline int stsi_0(void)
/*
* stsi - store system information
*
* Returns the current configuration level if function code 0 was specified.
* Otherwise returns 0 on success or a negative value on error.
*/
int stsi(void *sysinfo, int fc, int sel1, int sel2)
{
int rc = stsi(NULL, 0, 0, 0);

return rc == -ENOSYS ? rc : (((unsigned int) rc) >> 28);
register int r0 asm("0") = (fc << 28) | sel1;
register int r1 asm("1") = sel2;
int rc = 0;

asm volatile(
" stsi 0(%3)\n"
"0: jz 2f\n"
"1: lhi %1,%4\n"
"2:\n"
EX_TABLE(0b, 1b)
: "+d" (r0), "+d" (rc)
: "d" (r1), "a" (sysinfo), "K" (-EOPNOTSUPP)
: "cc", "memory");
if (rc)
return rc;
return fc ? 0 : ((unsigned int) r0) >> 28;
}
EXPORT_SYMBOL(stsi);

static void stsi_1_1_1(struct seq_file *m, struct sysinfo_1_1_1 *info)
{
int i;

if (stsi(info, 1, 1, 1) == -ENOSYS)
if (stsi(info, 1, 1, 1))
return;
EBCASC(info->manufacturer, sizeof(info->manufacturer));
EBCASC(info->type, sizeof(info->type));
Expand Down Expand Up @@ -97,7 +117,8 @@ static void stsi_15_1_x(struct seq_file *m, struct sysinfo_15_1_x *info)
seq_putc(m, '\n');
if (!MACHINE_HAS_TOPOLOGY)
return;
stsi(info, 15, 1, topology_max_mnest);
if (stsi(info, 15, 1, topology_max_mnest))
return;
seq_printf(m, "CPU Topology HW: ");
for (i = 0; i < TOPOLOGY_NR_MAG; i++)
seq_printf(m, " %d", info->mag[i]);
Expand All @@ -116,7 +137,7 @@ static void stsi_1_2_2(struct seq_file *m, struct sysinfo_1_2_2 *info)
struct sysinfo_1_2_2_extension *ext;
int i;

if (stsi(info, 1, 2, 2) == -ENOSYS)
if (stsi(info, 1, 2, 2))
return;
ext = (struct sysinfo_1_2_2_extension *)
((unsigned long) info + info->acc_offset);
Expand Down Expand Up @@ -152,7 +173,7 @@ static void stsi_1_2_2(struct seq_file *m, struct sysinfo_1_2_2 *info)

static void stsi_2_2_2(struct seq_file *m, struct sysinfo_2_2_2 *info)
{
if (stsi(info, 2, 2, 2) == -ENOSYS)
if (stsi(info, 2, 2, 2))
return;
EBCASC(info->name, sizeof(info->name));
seq_putc(m, '\n');
Expand All @@ -179,7 +200,7 @@ static void stsi_3_2_2(struct seq_file *m, struct sysinfo_3_2_2 *info)
{
int i;

if (stsi(info, 3, 2, 2) == -ENOSYS)
if (stsi(info, 3, 2, 2))
return;
for (i = 0; i < info->count; i++) {
EBCASC(info->vm[i].name, sizeof(info->vm[i].name));
Expand All @@ -202,7 +223,7 @@ static int sysinfo_show(struct seq_file *m, void *v)

if (!info)
return 0;
level = stsi_0();
level = stsi(NULL, 0, 0, 0);
if (level >= 1)
stsi_1_1_1(m, info);
if (level >= 1)
Expand Down Expand Up @@ -365,7 +386,7 @@ void s390_adjust_jiffies(void)
if (!info)
return;

if (stsi(info, 1, 2, 2) != -ENOSYS) {
if (stsi(info, 1, 2, 2) == 0) {
/*
* Major sigh. The cpu capability encoding is "special".
* If the first 9 bits of info->capability are 0 then it
Expand Down
4 changes: 2 additions & 2 deletions trunk/arch/s390/kvm/priv.c
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ static void handle_stsi_3_2_2(struct kvm_vcpu *vcpu, struct sysinfo_3_2_2 *mem)
spin_unlock(&fi->lock);

/* deal with other level 3 hypervisors */
if (stsi(mem, 3, 2, 2) == -ENOSYS)
if (stsi(mem, 3, 2, 2))
mem->count = 0;
if (mem->count < 8)
mem->count++;
Expand Down Expand Up @@ -259,7 +259,7 @@ static int handle_stsi(struct kvm_vcpu *vcpu)
mem = get_zeroed_page(GFP_KERNEL);
if (!mem)
goto out_fail;
if (stsi((void *) mem, fc, sel1, sel2) == -ENOSYS)
if (stsi((void *) mem, fc, sel1, sel2))
goto out_mem;
break;
case 3:
Expand Down
15 changes: 4 additions & 11 deletions trunk/drivers/s390/net/qeth_core_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2993,25 +2993,18 @@ static void qeth_get_trap_id(struct qeth_card *card, struct qeth_trap_id *tid)
struct sysinfo_2_2_2 *info222 = (struct sysinfo_2_2_2 *)info;
struct sysinfo_3_2_2 *info322 = (struct sysinfo_3_2_2 *)info;
struct ccw_dev_id ccwid;
int level, rc;
int level;

tid->chpid = card->info.chpid;
ccw_device_get_id(CARD_RDEV(card), &ccwid);
tid->ssid = ccwid.ssid;
tid->devno = ccwid.devno;
if (!info)
return;

rc = stsi(NULL, 0, 0, 0);
if (rc == -ENOSYS)
level = rc;
else
level = (((unsigned int) rc) >> 28);

if ((level >= 2) && (stsi(info222, 2, 2, 2) != -ENOSYS))
level = stsi(NULL, 0, 0, 0);
if ((level >= 2) && (stsi(info222, 2, 2, 2) == 0))
tid->lparnr = info222->lpar_number;

if ((level >= 3) && (stsi(info322, 3, 2, 2) != -ENOSYS)) {
if ((level >= 3) && (stsi(info322, 3, 2, 2) == 0)) {
EBCASC(info322->vm[0].name, sizeof(info322->vm[0].name));
memcpy(tid->vmname, info322->vm[0].name, sizeof(tid->vmname));
}
Expand Down

0 comments on commit 2428afe

Please sign in to comment.