Blob Blame History Raw
From: Stefan Raspl <raspl@linux.ibm.com>
Subject: s390/chsc: query utility strings via fmt3 channel path descriptor
Patch-mainline: v4.17-rc1
Git-commit: fcc6dd4b7b4dfc57ba19f988cfa5ac335de885d5
References: FATE#325698, LTC#167867, bsc#1113481

Summary:     net/smc: Add support for SMC-D
Description: Add support for SMC-D to the existing AF_SMC address family.
             Also includes the ISM device driver as required by SMC-D.

Upstream-Description:

             s390/chsc: query utility strings via fmt3 channel path descriptor

             Add support for format 3 channel path descriptors and use them to
             gather utility strings.

             Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
             Reviewed-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
             Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>

Signed-off-by: Stefan Raspl <raspl@linux.ibm.com>
Acked-by: Petr Tesarik <ptesarik@suse.com>
---
 arch/s390/include/asm/css_chars.h |    6 ++++--
 drivers/s390/cio/chp.c            |    1 +
 drivers/s390/cio/chp.h            |    1 +
 drivers/s390/cio/chsc.c           |    3 +++
 drivers/s390/cio/chsc.h           |    7 +++++++
 5 files changed, 16 insertions(+), 2 deletions(-)

--- a/arch/s390/include/asm/css_chars.h
+++ b/arch/s390/include/asm/css_chars.h
@@ -29,8 +29,10 @@ struct css_general_char {
 	u32 fcx : 1;	 /* bit 88 */
 	u32 : 19;
 	u32 alt_ssi : 1; /* bit 108 */
-	u32:1;
-	u32 narf:1;	 /* bit 110 */
+	u32 : 1;
+	u32 narf : 1;	 /* bit 110 */
+	u32 : 12;
+	u32 util_str : 1;/* bit 123 */
 } __packed;
 
 extern struct css_general_char css_general_characteristics;
--- a/drivers/s390/cio/chp.c
+++ b/drivers/s390/cio/chp.c
@@ -430,6 +430,7 @@ int chp_update_desc(struct channel_path
 	 * hypervisors implement the required chsc commands.
 	 */
 	chsc_determine_fmt1_channel_path_desc(chp->chpid, &chp->desc_fmt1);
+	chsc_determine_fmt3_channel_path_desc(chp->chpid, &chp->desc_fmt3);
 	chsc_get_channel_measurement_chars(chp);
 
 	return 0;
--- a/drivers/s390/cio/chp.h
+++ b/drivers/s390/cio/chp.h
@@ -45,6 +45,7 @@ struct channel_path {
 	int state;
 	struct channel_path_desc_fmt0 desc;
 	struct channel_path_desc_fmt1 desc_fmt1;
+	struct channel_path_desc_fmt3 desc_fmt3;
 	/* Channel-measurement related stuff: */
 	int cmg;
 	int shared;
--- a/drivers/s390/cio/chsc.c
+++ b/drivers/s390/cio/chsc.c
@@ -914,6 +914,8 @@ int chsc_determine_channel_path_desc(str
 		return -EINVAL;
 	if ((rfmt == 2) && !css_general_characteristics.cib)
 		return -EINVAL;
+	if ((rfmt == 3) && !css_general_characteristics.util_str)
+		return -EINVAL;
 
 	memset(page, 0, PAGE_SIZE);
 	scpd_area = page;
@@ -962,6 +964,7 @@ out:									\
 
 chsc_det_chp_desc(0, 0)
 chsc_det_chp_desc(1, 1)
+chsc_det_chp_desc(3, 0)
 
 static void
 chsc_initialize_cmg_chars(struct channel_path *chp, u8 cmcv,
--- a/drivers/s390/cio/chsc.h
+++ b/drivers/s390/cio/chsc.h
@@ -39,6 +39,11 @@ struct channel_path_desc_fmt1 {
 	u32 zeros[2];
 } __attribute__ ((packed));
 
+struct channel_path_desc_fmt3 {
+	struct channel_path_desc_fmt1 fmt1_desc;
+	u8 util_str[64];
+};
+
 struct channel_path;
 
 struct css_chsc_char {
@@ -150,6 +155,8 @@ int chsc_determine_fmt0_channel_path_des
 					  struct channel_path_desc_fmt0 *desc);
 int chsc_determine_fmt1_channel_path_desc(struct chp_id chpid,
 					  struct channel_path_desc_fmt1 *desc);
+int chsc_determine_fmt3_channel_path_desc(struct chp_id chpid,
+					  struct channel_path_desc_fmt3 *desc);
 void chsc_chp_online(struct chp_id chpid);
 void chsc_chp_offline(struct chp_id chpid);
 int chsc_get_channel_measurement_chars(struct channel_path *chp);