Message ID | 20210519082648.46803-3-frankja@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | s390x: cpumodel: Add sclp checks | expand |
On 19.05.21 10:26, Janosch Frank wrote: > Lets grab more of the feature bits from SCLP read info so we can use > them in the cpumodel tests. > > Signed-off-by: Janosch Frank <frankja@linux.ibm.com> > Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com> > --- > lib/s390x/sclp.c | 20 ++++++++++++++++++++ > lib/s390x/sclp.h | 38 +++++++++++++++++++++++++++++++++++--- > 2 files changed, 55 insertions(+), 3 deletions(-) > > diff --git a/lib/s390x/sclp.c b/lib/s390x/sclp.c > index f11c2035..291924b0 100644 > --- a/lib/s390x/sclp.c > +++ b/lib/s390x/sclp.c > @@ -129,6 +129,13 @@ CPUEntry *sclp_get_cpu_entries(void) > return (CPUEntry *)(_read_info + read_info->offset_cpu); > } > > +static bool sclp_feat_check(int byte, int bit) > +{ > + uint8_t *rib = (uint8_t *)read_info; > + > + return !!(rib[byte] & (0x80 >> bit)); > +} > + > void sclp_facilities_setup(void) > { > unsigned short cpu0_addr = stap(); > @@ -140,6 +147,14 @@ void sclp_facilities_setup(void) > cpu = sclp_get_cpu_entries(); > if (read_info->offset_cpu > 134) > sclp_facilities.has_diag318 = read_info->byte_134_diag318; > + sclp_facilities.has_gsls = sclp_feat_check(85, SCLP_FEAT_85_BIT_GSLS); > + sclp_facilities.has_kss = sclp_feat_check(98, SCLP_FEAT_98_BIT_KSS); > + sclp_facilities.has_cmma = sclp_feat_check(116, SCLP_FEAT_116_BIT_CMMA); > + sclp_facilities.has_64bscao = sclp_feat_check(116, SCLP_FEAT_116_BIT_64BSCAO); > + sclp_facilities.has_esca = sclp_feat_check(116, SCLP_FEAT_116_BIT_ESCA); > + sclp_facilities.has_ibs = sclp_feat_check(117, SCLP_FEAT_117_BIT_IBS); > + sclp_facilities.has_pfmfi = sclp_feat_check(117, SCLP_FEAT_117_BIT_PFMFI); > + > for (i = 0; i < read_info->entries_cpu; i++, cpu++) { > /* > * The logic for only reading the facilities from the > @@ -150,6 +165,11 @@ void sclp_facilities_setup(void) > */ > if (cpu->address == cpu0_addr) { > sclp_facilities.has_sief2 = cpu->feat_sief2; > + sclp_facilities.has_skeyi = cpu->feat_skeyi; > + sclp_facilities.has_siif = cpu->feat_siif; > + sclp_facilities.has_sigpif = cpu->feat_sigpif; > + sclp_facilities.has_ib = cpu->feat_ib; > + sclp_facilities.has_cei = cpu->feat_cei; > break; > } > } > diff --git a/lib/s390x/sclp.h b/lib/s390x/sclp.h > index 85231333..115bd2fa 100644 > --- a/lib/s390x/sclp.h > +++ b/lib/s390x/sclp.h > @@ -94,9 +94,19 @@ typedef struct CPUEntry { > uint8_t reserved0; > uint8_t : 4; > uint8_t feat_sief2 : 1; > + uint8_t feat_skeyi : 1; > + uint8_t : 2; > + uint8_t : 2; > + uint8_t feat_gpere : 1; > + uint8_t feat_siif : 1; > + uint8_t feat_sigpif : 1; > uint8_t : 3; > - uint8_t features_res2 [SCCB_CPU_FEATURE_LEN - 1]; > - uint8_t reserved2[6]; > + uint8_t reserved2[3]; > + uint8_t : 2; > + uint8_t feat_ib : 1; > + uint8_t feat_cei : 1; > + uint8_t : 4; > + uint8_t reserved3[6]; > uint8_t type; > uint8_t reserved1; > } __attribute__((packed)) CPUEntry; > @@ -105,10 +115,32 @@ extern struct sclp_facilities sclp_facilities; > > struct sclp_facilities { > uint64_t has_sief2 : 1; > + uint64_t has_skeyi : 1; > + uint64_t has_gpere : 1; > + uint64_t has_siif : 1; > + uint64_t has_sigpif : 1; > + uint64_t has_ib : 1; > + uint64_t has_cei : 1; > + > uint64_t has_diag318 : 1; > - uint64_t : 62; > + uint64_t has_gsls : 1; > + uint64_t has_cmma : 1; > + uint64_t has_64bscao : 1; > + uint64_t has_esca : 1; > + uint64_t has_kss : 1; > + uint64_t has_pfmfi : 1; > + uint64_t has_ibs : 1; > + uint64_t : 64 - 15; > }; > > +#define SCLP_FEAT_85_BIT_GSLS 7 > +#define SCLP_FEAT_98_BIT_KSS 0 > +#define SCLP_FEAT_116_BIT_64BSCAO 7 > +#define SCLP_FEAT_116_BIT_CMMA 6 > +#define SCLP_FEAT_116_BIT_ESCA 3 > +#define SCLP_FEAT_117_BIT_PFMFI 6 > +#define SCLP_FEAT_117_BIT_IBS 5 > + > typedef struct ReadInfo { > SCCBHeader h; > uint16_t rnmax; > Acked-by: David Hildenbrand <david@redhat.com>
On Wed, 19 May 2021 08:26:47 +0000 Janosch Frank <frankja@linux.ibm.com> wrote: > Lets grab more of the feature bits from SCLP read info so we can use s/Lets/Let's/ :) > them in the cpumodel tests. > > Signed-off-by: Janosch Frank <frankja@linux.ibm.com> > Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com> > --- > lib/s390x/sclp.c | 20 ++++++++++++++++++++ > lib/s390x/sclp.h | 38 +++++++++++++++++++++++++++++++++++--- > 2 files changed, 55 insertions(+), 3 deletions(-) (...) Maybe add /* bit number within a certain byte */ > +#define SCLP_FEAT_85_BIT_GSLS 7 > +#define SCLP_FEAT_98_BIT_KSS 0 > +#define SCLP_FEAT_116_BIT_64BSCAO 7 > +#define SCLP_FEAT_116_BIT_CMMA 6 > +#define SCLP_FEAT_116_BIT_ESCA 3 > +#define SCLP_FEAT_117_BIT_PFMFI 6 > +#define SCLP_FEAT_117_BIT_IBS 5 > + > typedef struct ReadInfo { > SCCBHeader h; > uint16_t rnmax; Acked-by: Cornelia Huck <cohuck@redhat.com>
On 5/19/21 12:17 PM, Cornelia Huck wrote: > On Wed, 19 May 2021 08:26:47 +0000 > Janosch Frank <frankja@linux.ibm.com> wrote: > >> Lets grab more of the feature bits from SCLP read info so we can use > > s/Lets/Let's/ :) Sigh > >> them in the cpumodel tests. >> >> Signed-off-by: Janosch Frank <frankja@linux.ibm.com> >> Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com> >> --- >> lib/s390x/sclp.c | 20 ++++++++++++++++++++ >> lib/s390x/sclp.h | 38 +++++++++++++++++++++++++++++++++++--- >> 2 files changed, 55 insertions(+), 3 deletions(-) > > (...) > > Maybe add > > /* bit number within a certain byte */ Sure > >> +#define SCLP_FEAT_85_BIT_GSLS 7 >> +#define SCLP_FEAT_98_BIT_KSS 0 >> +#define SCLP_FEAT_116_BIT_64BSCAO 7 >> +#define SCLP_FEAT_116_BIT_CMMA 6 >> +#define SCLP_FEAT_116_BIT_ESCA 3 >> +#define SCLP_FEAT_117_BIT_PFMFI 6 >> +#define SCLP_FEAT_117_BIT_IBS 5 >> + >> typedef struct ReadInfo { >> SCCBHeader h; >> uint16_t rnmax; > > Acked-by: Cornelia Huck <cohuck@redhat.com> > Thanks!
diff --git a/lib/s390x/sclp.c b/lib/s390x/sclp.c index f11c2035..291924b0 100644 --- a/lib/s390x/sclp.c +++ b/lib/s390x/sclp.c @@ -129,6 +129,13 @@ CPUEntry *sclp_get_cpu_entries(void) return (CPUEntry *)(_read_info + read_info->offset_cpu); } +static bool sclp_feat_check(int byte, int bit) +{ + uint8_t *rib = (uint8_t *)read_info; + + return !!(rib[byte] & (0x80 >> bit)); +} + void sclp_facilities_setup(void) { unsigned short cpu0_addr = stap(); @@ -140,6 +147,14 @@ void sclp_facilities_setup(void) cpu = sclp_get_cpu_entries(); if (read_info->offset_cpu > 134) sclp_facilities.has_diag318 = read_info->byte_134_diag318; + sclp_facilities.has_gsls = sclp_feat_check(85, SCLP_FEAT_85_BIT_GSLS); + sclp_facilities.has_kss = sclp_feat_check(98, SCLP_FEAT_98_BIT_KSS); + sclp_facilities.has_cmma = sclp_feat_check(116, SCLP_FEAT_116_BIT_CMMA); + sclp_facilities.has_64bscao = sclp_feat_check(116, SCLP_FEAT_116_BIT_64BSCAO); + sclp_facilities.has_esca = sclp_feat_check(116, SCLP_FEAT_116_BIT_ESCA); + sclp_facilities.has_ibs = sclp_feat_check(117, SCLP_FEAT_117_BIT_IBS); + sclp_facilities.has_pfmfi = sclp_feat_check(117, SCLP_FEAT_117_BIT_PFMFI); + for (i = 0; i < read_info->entries_cpu; i++, cpu++) { /* * The logic for only reading the facilities from the @@ -150,6 +165,11 @@ void sclp_facilities_setup(void) */ if (cpu->address == cpu0_addr) { sclp_facilities.has_sief2 = cpu->feat_sief2; + sclp_facilities.has_skeyi = cpu->feat_skeyi; + sclp_facilities.has_siif = cpu->feat_siif; + sclp_facilities.has_sigpif = cpu->feat_sigpif; + sclp_facilities.has_ib = cpu->feat_ib; + sclp_facilities.has_cei = cpu->feat_cei; break; } } diff --git a/lib/s390x/sclp.h b/lib/s390x/sclp.h index 85231333..115bd2fa 100644 --- a/lib/s390x/sclp.h +++ b/lib/s390x/sclp.h @@ -94,9 +94,19 @@ typedef struct CPUEntry { uint8_t reserved0; uint8_t : 4; uint8_t feat_sief2 : 1; + uint8_t feat_skeyi : 1; + uint8_t : 2; + uint8_t : 2; + uint8_t feat_gpere : 1; + uint8_t feat_siif : 1; + uint8_t feat_sigpif : 1; uint8_t : 3; - uint8_t features_res2 [SCCB_CPU_FEATURE_LEN - 1]; - uint8_t reserved2[6]; + uint8_t reserved2[3]; + uint8_t : 2; + uint8_t feat_ib : 1; + uint8_t feat_cei : 1; + uint8_t : 4; + uint8_t reserved3[6]; uint8_t type; uint8_t reserved1; } __attribute__((packed)) CPUEntry; @@ -105,10 +115,32 @@ extern struct sclp_facilities sclp_facilities; struct sclp_facilities { uint64_t has_sief2 : 1; + uint64_t has_skeyi : 1; + uint64_t has_gpere : 1; + uint64_t has_siif : 1; + uint64_t has_sigpif : 1; + uint64_t has_ib : 1; + uint64_t has_cei : 1; + uint64_t has_diag318 : 1; - uint64_t : 62; + uint64_t has_gsls : 1; + uint64_t has_cmma : 1; + uint64_t has_64bscao : 1; + uint64_t has_esca : 1; + uint64_t has_kss : 1; + uint64_t has_pfmfi : 1; + uint64_t has_ibs : 1; + uint64_t : 64 - 15; }; +#define SCLP_FEAT_85_BIT_GSLS 7 +#define SCLP_FEAT_98_BIT_KSS 0 +#define SCLP_FEAT_116_BIT_64BSCAO 7 +#define SCLP_FEAT_116_BIT_CMMA 6 +#define SCLP_FEAT_116_BIT_ESCA 3 +#define SCLP_FEAT_117_BIT_PFMFI 6 +#define SCLP_FEAT_117_BIT_IBS 5 + typedef struct ReadInfo { SCCBHeader h; uint16_t rnmax;