From: Pierre Morel <pmorel@linux.ibm.com>
To: kvm@vger.kernel.org
Cc: frankja@linux.ibm.com, david@redhat.com, thuth@redhat.com,
cohuck@redhat.com, imbrenda@linux.ibm.com
Subject: [kvm-unit-tests PATCH v5 1/6] s390x: css: Store CSS Characteristics
Date: Tue, 9 Mar 2021 13:51:12 +0100 [thread overview]
Message-ID: <1615294277-7332-2-git-send-email-pmorel@linux.ibm.com> (raw)
In-Reply-To: <1615294277-7332-1-git-send-email-pmorel@linux.ibm.com>
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>
---
lib/s390x/css.h | 66 ++++++++++++++++++++++++++++++++
lib/s390x/css_lib.c | 93 ++++++++++++++++++++++++++++++++++++++++++++-
s390x/css.c | 8 ++++
3 files changed, 166 insertions(+), 1 deletion(-)
diff --git a/lib/s390x/css.h b/lib/s390x/css.h
index 3e57445..fe68b7d 100644
--- a/lib/s390x/css.h
+++ b/lib/s390x/css.h
@@ -288,4 +288,70 @@ 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 reserved[9];
+ 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..12036b3 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 },
--
2.17.1
next prev parent reply other threads:[~2021-03-09 12:52 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-09 12:51 [kvm-unit-tests PATCH v5 0/6] CSS Mesurement Block Pierre Morel
2021-03-09 12:51 ` Pierre Morel [this message]
2021-03-09 12:51 ` [kvm-unit-tests PATCH v5 2/6] s390x: css: simplifications of the tests Pierre Morel
2021-03-09 12:51 ` [kvm-unit-tests PATCH v5 3/6] s390x: css: extending the subchannel modifying functions Pierre Morel
2021-03-09 12:51 ` [kvm-unit-tests PATCH v5 4/6] s390x: css: implementing Set CHannel Monitor Pierre Morel
2021-03-09 16:56 ` Cornelia Huck
2021-03-11 10:20 ` Pierre Morel
2021-03-09 12:51 ` [kvm-unit-tests PATCH v5 5/6] s390x: css: testing measurement block format 0 Pierre Morel
2021-03-09 17:05 ` Cornelia Huck
2021-03-11 10:26 ` Pierre Morel
2021-03-09 12:51 ` [kvm-unit-tests PATCH v5 6/6] s390x: css: testing measurement block format 1 Pierre Morel
2021-03-09 17:07 ` Cornelia Huck
2021-03-11 10:26 ` Pierre Morel
2021-03-09 16:54 ` [kvm-unit-tests PATCH v5 0/6] CSS Mesurement Block Cornelia Huck
2021-03-09 17:08 ` Cornelia Huck
2021-03-11 10:19 ` Pierre Morel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1615294277-7332-2-git-send-email-pmorel@linux.ibm.com \
--to=pmorel@linux.ibm.com \
--cc=cohuck@redhat.com \
--cc=david@redhat.com \
--cc=frankja@linux.ibm.com \
--cc=imbrenda@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.