s390/chsc: query utility strings via fmt3 channel path descriptor
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Wed, 22 Jun 2016 17:42:40 +0000 (19:42 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 26 Mar 2018 14:13:16 +0000 (16:13 +0200)
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>
arch/s390/include/asm/css_chars.h
drivers/s390/cio/chp.c
drivers/s390/cio/chp.h
drivers/s390/cio/chsc.c
drivers/s390/cio/chsc.h

index fb56fa3..0563fd3 100644 (file)
@@ -32,8 +32,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;
index 34315e6..41ecc08 100644 (file)
@@ -431,6 +431,7 @@ int chp_update_desc(struct channel_path *chp)
         * 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;
index 6d2bfbb..20259f3 100644 (file)
@@ -46,6 +46,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;
index 65290e5..6652a49 100644 (file)
@@ -915,6 +915,8 @@ int chsc_determine_channel_path_desc(struct chp_id chpid, int fmt, int rfmt,
                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;
@@ -963,6 +965,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,
index bdf2cc9..5c9f0dd 100644 (file)
@@ -40,6 +40,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 {
@@ -151,6 +156,8 @@ int chsc_determine_fmt0_channel_path_desc(struct chp_id chpid,
                                          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);