Message ID | 1614599225-17734-2-git-send-email-pmorel@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | CSS Mesurement Block | expand |
On 3/1/21 12:47 PM, Pierre Morel wrote: > CSS characteristics exposes the features of the Channel SubSystem. > Let's use Store Channel Subsystem Characteristics to retrieve > the features of the CSS. > > Signed-off-by: Pierre Morel <pmorel@linux.ibm.com> > Reviewed-by: Cornelia Huck <cohuck@redhat.com> Acked-by: Janosch Frank <frankja@linux.ibm.com> Small nits below > --- > lib/s390x/css.h | 67 ++++++++++++++++++++++++++++++++ > lib/s390x/css_lib.c | 93 ++++++++++++++++++++++++++++++++++++++++++++- > s390x/css.c | 8 ++++ > 3 files changed, 167 insertions(+), 1 deletion(-) > > diff --git a/lib/s390x/css.h b/lib/s390x/css.h > index 3e57445..4210472 100644 > --- a/lib/s390x/css.h > +++ b/lib/s390x/css.h > @@ -288,4 +288,71 @@ int css_residual_count(unsigned int schid); > void enable_io_isc(uint8_t isc); > int wait_and_check_io_completion(int schid); > > +/* > + * CHSC definitions > + */ > +struct chsc_header { > + uint16_t len; > + uint16_t code; > +}; > + > +/* Store Channel Subsystem Characteristics */ > +struct chsc_scsc { > + struct chsc_header req; > + uint16_t req_fmt; > + uint8_t cssid; > + uint8_t res_03; > + uint32_t res_04[2]; I find the naming a bit weird and it could be one uint8_t field. > + struct chsc_header res; > + uint32_t res_fmt; > + uint64_t general_char[255]; > + uint64_t chsc_char[254]; > +}; > + > +extern struct chsc_scsc *chsc_scsc; > +#define CHSC_SCSC 0x0010 > +#define CHSC_SCSC_LEN 0x0010 > + > +bool get_chsc_scsc(void); > + > +#define CSS_GENERAL_FEAT_BITLEN (255 * 64) > +#define CSS_CHSC_FEAT_BITLEN (254 * 64) > + > +#define CHSC_SCSC 0x0010 > +#define CHSC_SCSC_LEN 0x0010 > + > +#define CHSC_ERROR 0x0000 > +#define CHSC_RSP_OK 0x0001 > +#define CHSC_RSP_INVAL 0x0002 > +#define CHSC_RSP_REQERR 0x0003 > +#define CHSC_RSP_ENOCMD 0x0004 > +#define CHSC_RSP_NODATA 0x0005 > +#define CHSC_RSP_SUP31B 0x0006 > +#define CHSC_RSP_EFRMT 0x0007 > +#define CHSC_RSP_ECSSID 0x0008 > +#define CHSC_RSP_ERFRMT 0x0009 > +#define CHSC_RSP_ESSID 0x000A > +#define CHSC_RSP_EBUSY 0x000B > +#define CHSC_RSP_MAX 0x000B > + > +static inline int _chsc(void *p) > +{ > + int cc; > + > + asm volatile(" .insn rre,0xb25f0000,%2,0\n" > + " ipm %0\n" > + " srl %0,28\n" > + : "=d" (cc), "=m" (p) > + : "d" (p), "m" (p) > + : "cc"); > + > + return cc; > +} > + > +bool chsc(void *p, uint16_t code, uint16_t len); > + > +#include <bitops.h> > +#define css_general_feature(bit) test_bit_inv(bit, chsc_scsc->general_char) > +#define css_chsc_feature(bit) test_bit_inv(bit, chsc_scsc->chsc_char) > + > #endif > diff --git a/lib/s390x/css_lib.c b/lib/s390x/css_lib.c > index 3c24480..f46e871 100644 > --- a/lib/s390x/css_lib.c > +++ b/lib/s390x/css_lib.c > @@ -15,11 +15,102 @@ > #include <asm/arch_def.h> > #include <asm/time.h> > #include <asm/arch_def.h> > - > +#include <alloc_page.h> Did you intend to remove the newline here? > #include <malloc_io.h> > #include <css.h> > > static struct schib schib; > +struct chsc_scsc *chsc_scsc; > + > +static const char * const chsc_rsp_description[] = { > + "CHSC unknown error", > + "Command executed", > + "Invalid command", > + "Request-block error", > + "Command not installed", > + "Data not available", > + "Absolute address of channel-subsystem communication block exceeds 2G - 1.", > + "Invalid command format", > + "Invalid channel-subsystem identification (CSSID)", > + "The command-request block specified an invalid format for the command response block.", > + "Invalid subchannel-set identification (SSID)", > + "A busy condition precludes execution.", > +}; > + > +static bool check_response(void *p) > +{ > + struct chsc_header *h = p; > + > + if (h->code == CHSC_RSP_OK) > + return true; > + > + if (h->code > CHSC_RSP_MAX) > + h->code = 0; > + > + report_abort("Response code %04x: %s", h->code, > + chsc_rsp_description[h->code]); > + return false; > +} > + > +bool chsc(void *p, uint16_t code, uint16_t len) > +{ > + struct chsc_header *h = p; > + > + h->code = code; > + h->len = len; > + > + switch (_chsc(p)) { > + case 3: > + report_abort("Subchannel invalid or not enabled."); > + break; > + case 2: > + report_abort("CHSC subchannel busy."); > + break; > + case 1: > + report_abort("Subchannel invalid or not enabled."); > + break; > + case 0: > + return check_response(p + len); > + } > + return false; > +} > + > +bool get_chsc_scsc(void) > +{ > + int i, n; > + char buffer[510]; > + char *p; > + > + if (chsc_scsc) /* chsc_scsc already initialized */ > + return true; > + > + chsc_scsc = alloc_page(); > + if (!chsc_scsc) { > + report_abort("could not allocate chsc_scsc page!"); > + return false; > + } > + > + if (!chsc(chsc_scsc, CHSC_SCSC, CHSC_SCSC_LEN)) > + return false; > + > + for (i = 0, p = buffer; i < CSS_GENERAL_FEAT_BITLEN; i++) { > + if (css_general_feature(i)) { > + n = snprintf(p, sizeof(buffer), "%d,", i); > + p += n; > + } > + } > + report_info("General features: %s", buffer); > + > + for (i = 0, p = buffer; i < CSS_CHSC_FEAT_BITLEN; i++) { > + if (css_chsc_feature(i)) { > + n = snprintf(p, sizeof(buffer), "%d,", i); > + p += n; > + } > + } > + report_info("CHSC features: %s", buffer); > + > + return true; > +} > > /* > * css_enumerate: > diff --git a/s390x/css.c b/s390x/css.c > index 1a61a5c..09703c1 100644 > --- a/s390x/css.c > +++ b/s390x/css.c > @@ -14,6 +14,7 @@ > #include <string.h> > #include <interrupt.h> > #include <asm/arch_def.h> > +#include <alloc_page.h> > > #include <malloc_io.h> > #include <css.h> > @@ -140,10 +141,17 @@ error_senseid: > unregister_io_int_func(css_irq_io); > } > > +static void css_init(void) > +{ > + report(!!get_chsc_scsc(), "Store Channel Characteristics"); get_chsc_scsc() returns a bool, so you shouldn't need the !! here, no? > +} > + > static struct { > const char *name; > void (*func)(void); > } tests[] = { > + /* The css_init test is needed to initialize the CSS Characteristics */ > + { "initialize CSS (chsc)", css_init }, > { "enumerate (stsch)", test_enumerate }, > { "enable (msch)", test_enable }, > { "sense (ssch/tsch)", test_sense }, >
On 3/1/21 3:45 PM, Janosch Frank wrote: > On 3/1/21 12:47 PM, Pierre Morel wrote: >> CSS characteristics exposes the features of the Channel SubSystem. >> Let's use Store Channel Subsystem Characteristics to retrieve >> the features of the CSS. >> >> Signed-off-by: Pierre Morel <pmorel@linux.ibm.com> >> Reviewed-by: Cornelia Huck <cohuck@redhat.com> > > Acked-by: Janosch Frank <frankja@linux.ibm.com> > > Small nits below > >> --- >> lib/s390x/css.h | 67 ++++++++++++++++++++++++++++++++ >> lib/s390x/css_lib.c | 93 ++++++++++++++++++++++++++++++++++++++++++++- >> s390x/css.c | 8 ++++ >> 3 files changed, 167 insertions(+), 1 deletion(-) >> >> diff --git a/lib/s390x/css.h b/lib/s390x/css.h >> index 3e57445..4210472 100644 >> --- a/lib/s390x/css.h >> +++ b/lib/s390x/css.h >> @@ -288,4 +288,71 @@ int css_residual_count(unsigned int schid); >> void enable_io_isc(uint8_t isc); >> int wait_and_check_io_completion(int schid); >> >> +/* >> + * CHSC definitions >> + */ >> +struct chsc_header { >> + uint16_t len; >> + uint16_t code; >> +}; >> + >> +/* Store Channel Subsystem Characteristics */ >> +struct chsc_scsc { >> + struct chsc_header req; >> + uint16_t req_fmt; >> + uint8_t cssid; >> + uint8_t res_03; >> + uint32_t res_04[2]; > > I find the naming a bit weird and it could be one uint8_t field. OK > >> + struct chsc_header res; >> + uint32_t res_fmt; >> + uint64_t general_char[255]; >> + uint64_t chsc_char[254]; >> +}; ... snip >> diff --git a/lib/s390x/css_lib.c b/lib/s390x/css_lib.c >> index 3c24480..f46e871 100644 >> --- a/lib/s390x/css_lib.c >> +++ b/lib/s390x/css_lib.c >> @@ -15,11 +15,102 @@ >> #include <asm/arch_def.h> >> #include <asm/time.h> >> #include <asm/arch_def.h> >> - >> +#include <alloc_page.h> > > Did you intend to remove the newline here? Yes I do not see why we should have a new line here. But I can keep it if you want. > ... snip... >> #include <asm/arch_def.h> >> +#include <alloc_page.h> >> >> #include <malloc_io.h> >> #include <css.h> >> @@ -140,10 +141,17 @@ error_senseid: >> unregister_io_int_func(css_irq_io); >> } >> >> +static void css_init(void) >> +{ >> + report(!!get_chsc_scsc(), "Store Channel Characteristics"); > > get_chsc_scsc() returns a bool, so you shouldn't need the !! here, no? Yes, forgotten when changed get_chsc_scsc(), remove the !! Thanks, Pierre
On 3/8/21 3:01 PM, Pierre Morel wrote: > > > On 3/1/21 3:45 PM, Janosch Frank wrote: >> On 3/1/21 12:47 PM, Pierre Morel wrote: >>> CSS characteristics exposes the features of the Channel SubSystem. >>> Let's use Store Channel Subsystem Characteristics to retrieve >>> the features of the CSS. >>> >>> Signed-off-by: Pierre Morel <pmorel@linux.ibm.com> >>> Reviewed-by: Cornelia Huck <cohuck@redhat.com> >> >> Acked-by: Janosch Frank <frankja@linux.ibm.com> >> >> Small nits below >> >>> --- >>> lib/s390x/css.h | 67 ++++++++++++++++++++++++++++++++ >>> lib/s390x/css_lib.c | 93 ++++++++++++++++++++++++++++++++++++++++++++- >>> s390x/css.c | 8 ++++ >>> 3 files changed, 167 insertions(+), 1 deletion(-) >>> >>> diff --git a/lib/s390x/css.h b/lib/s390x/css.h >>> index 3e57445..4210472 100644 >>> --- a/lib/s390x/css.h >>> +++ b/lib/s390x/css.h >>> @@ -288,4 +288,71 @@ int css_residual_count(unsigned int schid); >>> void enable_io_isc(uint8_t isc); >>> int wait_and_check_io_completion(int schid); >>> >>> +/* >>> + * CHSC definitions >>> + */ >>> +struct chsc_header { >>> + uint16_t len; >>> + uint16_t code; >>> +}; >>> + >>> +/* Store Channel Subsystem Characteristics */ >>> +struct chsc_scsc { >>> + struct chsc_header req; >>> + uint16_t req_fmt; >>> + uint8_t cssid; >>> + uint8_t res_03; >>> + uint32_t res_04[2]; >> >> I find the naming a bit weird and it could be one uint8_t field. > > OK > >> >>> + struct chsc_header res; >>> + uint32_t res_fmt; >>> + uint64_t general_char[255]; >>> + uint64_t chsc_char[254]; >>> +}; > > ... snip > >>> diff --git a/lib/s390x/css_lib.c b/lib/s390x/css_lib.c >>> index 3c24480..f46e871 100644 >>> --- a/lib/s390x/css_lib.c >>> +++ b/lib/s390x/css_lib.c >>> @@ -15,11 +15,102 @@ >>> #include <asm/arch_def.h> >>> #include <asm/time.h> >>> #include <asm/arch_def.h> >>> - >>> +#include <alloc_page.h> >> >> Did you intend to remove the newline here? > > Yes I do not see why we should have a new line here. Some people like to separate asm includes from other includes. > But I can keep it if you want. I just wanted to know if you removed it by mistake, if you want it that way it's ok for me. > >> > ... snip... > >>> #include <asm/arch_def.h> >>> +#include <alloc_page.h> >>> >>> #include <malloc_io.h> >>> #include <css.h> >>> @@ -140,10 +141,17 @@ error_senseid: >>> unregister_io_int_func(css_irq_io); >>> } >>> >>> +static void css_init(void) >>> +{ >>> + report(!!get_chsc_scsc(), "Store Channel Characteristics"); >> >> get_chsc_scsc() returns a bool, so you shouldn't need the !! here, no? > > Yes, forgotten when changed get_chsc_scsc(), remove the !! > > > Thanks, > Pierre >
diff --git a/lib/s390x/css.h b/lib/s390x/css.h index 3e57445..4210472 100644 --- a/lib/s390x/css.h +++ b/lib/s390x/css.h @@ -288,4 +288,71 @@ int css_residual_count(unsigned int schid); void enable_io_isc(uint8_t isc); int wait_and_check_io_completion(int schid); +/* + * CHSC definitions + */ +struct chsc_header { + uint16_t len; + uint16_t code; +}; + +/* Store Channel Subsystem Characteristics */ +struct chsc_scsc { + struct chsc_header req; + uint16_t req_fmt; + uint8_t cssid; + uint8_t res_03; + uint32_t res_04[2]; + struct chsc_header res; + uint32_t res_fmt; + uint64_t general_char[255]; + uint64_t chsc_char[254]; +}; + +extern struct chsc_scsc *chsc_scsc; +#define CHSC_SCSC 0x0010 +#define CHSC_SCSC_LEN 0x0010 + +bool get_chsc_scsc(void); + +#define CSS_GENERAL_FEAT_BITLEN (255 * 64) +#define CSS_CHSC_FEAT_BITLEN (254 * 64) + +#define CHSC_SCSC 0x0010 +#define CHSC_SCSC_LEN 0x0010 + +#define CHSC_ERROR 0x0000 +#define CHSC_RSP_OK 0x0001 +#define CHSC_RSP_INVAL 0x0002 +#define CHSC_RSP_REQERR 0x0003 +#define CHSC_RSP_ENOCMD 0x0004 +#define CHSC_RSP_NODATA 0x0005 +#define CHSC_RSP_SUP31B 0x0006 +#define CHSC_RSP_EFRMT 0x0007 +#define CHSC_RSP_ECSSID 0x0008 +#define CHSC_RSP_ERFRMT 0x0009 +#define CHSC_RSP_ESSID 0x000A +#define CHSC_RSP_EBUSY 0x000B +#define CHSC_RSP_MAX 0x000B + +static inline int _chsc(void *p) +{ + int cc; + + asm volatile(" .insn rre,0xb25f0000,%2,0\n" + " ipm %0\n" + " srl %0,28\n" + : "=d" (cc), "=m" (p) + : "d" (p), "m" (p) + : "cc"); + + return cc; +} + +bool chsc(void *p, uint16_t code, uint16_t len); + +#include <bitops.h> +#define css_general_feature(bit) test_bit_inv(bit, chsc_scsc->general_char) +#define css_chsc_feature(bit) test_bit_inv(bit, chsc_scsc->chsc_char) + #endif diff --git a/lib/s390x/css_lib.c b/lib/s390x/css_lib.c index 3c24480..f46e871 100644 --- a/lib/s390x/css_lib.c +++ b/lib/s390x/css_lib.c @@ -15,11 +15,102 @@ #include <asm/arch_def.h> #include <asm/time.h> #include <asm/arch_def.h> - +#include <alloc_page.h> #include <malloc_io.h> #include <css.h> static struct schib schib; +struct chsc_scsc *chsc_scsc; + +static const char * const chsc_rsp_description[] = { + "CHSC unknown error", + "Command executed", + "Invalid command", + "Request-block error", + "Command not installed", + "Data not available", + "Absolute address of channel-subsystem communication block exceeds 2G - 1.", + "Invalid command format", + "Invalid channel-subsystem identification (CSSID)", + "The command-request block specified an invalid format for the command response block.", + "Invalid subchannel-set identification (SSID)", + "A busy condition precludes execution.", +}; + +static bool check_response(void *p) +{ + struct chsc_header *h = p; + + if (h->code == CHSC_RSP_OK) + return true; + + if (h->code > CHSC_RSP_MAX) + h->code = 0; + + report_abort("Response code %04x: %s", h->code, + chsc_rsp_description[h->code]); + return false; +} + +bool chsc(void *p, uint16_t code, uint16_t len) +{ + struct chsc_header *h = p; + + h->code = code; + h->len = len; + + switch (_chsc(p)) { + case 3: + report_abort("Subchannel invalid or not enabled."); + break; + case 2: + report_abort("CHSC subchannel busy."); + break; + case 1: + report_abort("Subchannel invalid or not enabled."); + break; + case 0: + return check_response(p + len); + } + return false; +} + +bool get_chsc_scsc(void) +{ + int i, n; + char buffer[510]; + char *p; + + if (chsc_scsc) /* chsc_scsc already initialized */ + return true; + + chsc_scsc = alloc_page(); + if (!chsc_scsc) { + report_abort("could not allocate chsc_scsc page!"); + return false; + } + + if (!chsc(chsc_scsc, CHSC_SCSC, CHSC_SCSC_LEN)) + return false; + + for (i = 0, p = buffer; i < CSS_GENERAL_FEAT_BITLEN; i++) { + if (css_general_feature(i)) { + n = snprintf(p, sizeof(buffer), "%d,", i); + p += n; + } + } + report_info("General features: %s", buffer); + + for (i = 0, p = buffer; i < CSS_CHSC_FEAT_BITLEN; i++) { + if (css_chsc_feature(i)) { + n = snprintf(p, sizeof(buffer), "%d,", i); + p += n; + } + } + report_info("CHSC features: %s", buffer); + + return true; +} /* * css_enumerate: diff --git a/s390x/css.c b/s390x/css.c index 1a61a5c..09703c1 100644 --- a/s390x/css.c +++ b/s390x/css.c @@ -14,6 +14,7 @@ #include <string.h> #include <interrupt.h> #include <asm/arch_def.h> +#include <alloc_page.h> #include <malloc_io.h> #include <css.h> @@ -140,10 +141,17 @@ error_senseid: unregister_io_int_func(css_irq_io); } +static void css_init(void) +{ + report(!!get_chsc_scsc(), "Store Channel Characteristics"); +} + static struct { const char *name; void (*func)(void); } tests[] = { + /* The css_init test is needed to initialize the CSS Characteristics */ + { "initialize CSS (chsc)", css_init }, { "enumerate (stsch)", test_enumerate }, { "enable (msch)", test_enable }, { "sense (ssch/tsch)", test_sense },