s390/ap: make tapq gr2 response a struct
authorHarald Freudenberger <freude@linux.ibm.com>
Mon, 12 Sep 2022 16:02:44 +0000 (18:02 +0200)
committerHeiko Carstens <hca@linux.ibm.com>
Mon, 20 Mar 2023 10:12:48 +0000 (11:12 +0100)
This patch introduces a new struct ap_tapq_gr2 which covers
the response in GR2 on TAPQ invocation. This makes it much
easier and less error-prone for the calling functions to
access the right field without shifting and masking.

Signed-off-by: Harald Freudenberger <freude@linux.ibm.com>
Reviewed-by: Tony Krowiak <akrowiak@linux.ibm.com>
Reviewed-by: Holger Dengler <dengler@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
arch/s390/include/asm/ap.h
drivers/s390/crypto/ap_bus.c
drivers/s390/crypto/vfio_ap_ops.c

index 5e4a88460a5702e12b2977c72e74a712030a448c..ba8da3f02f358245a93fe4303a512c269737b16f 100644 (file)
@@ -86,6 +86,34 @@ static inline bool ap_instructions_available(void)
        return reg1 != 0;
 }
 
+/* TAPQ register GR2 response struct */
+struct ap_tapq_gr2 {
+       union {
+               unsigned long value;
+               struct {
+                       unsigned int fac    : 32; /* facility bits */
+                       unsigned int apinfo : 32; /* ap type, ... */
+               };
+               struct {
+                       unsigned int s     :  1; /* APSC */
+                       unsigned int m     :  1; /* AP4KM */
+                       unsigned int c     :  1; /* AP4KC */
+                       unsigned int mode  :  3;
+                       unsigned int n     :  1; /* APXA */
+                       unsigned int       :  1;
+                       unsigned int class :  8;
+                       unsigned int bs    :  2; /* SE bind/assoc */
+                       unsigned int       : 14;
+                       unsigned int at    :  8; /* ap type */
+                       unsigned int nd    :  8; /* nr of domains */
+                       unsigned int       :  4;
+                       unsigned int ml    :  4; /* apxl ml */
+                       unsigned int       :  4;
+                       unsigned int qd    :  4; /* queue depth */
+               };
+       };
+};
+
 /**
  * ap_tapq(): Test adjunct processor queue.
  * @qid: The AP queue number
@@ -93,7 +121,7 @@ static inline bool ap_instructions_available(void)
  *
  * Returns AP queue status structure.
  */
-static inline struct ap_queue_status ap_tapq(ap_qid_t qid, unsigned long *info)
+static inline struct ap_queue_status ap_tapq(ap_qid_t qid, struct ap_tapq_gr2 *info)
 {
        union ap_queue_status_reg reg1;
        unsigned long reg2;
@@ -108,7 +136,7 @@ static inline struct ap_queue_status ap_tapq(ap_qid_t qid, unsigned long *info)
                : [qid] "d" (qid)
                : "cc", "0", "1", "2");
        if (info)
-               *info = reg2;
+               info->value = reg2;
        return reg1.status;
 }
 
@@ -116,13 +144,12 @@ static inline struct ap_queue_status ap_tapq(ap_qid_t qid, unsigned long *info)
  * ap_test_queue(): Test adjunct processor queue.
  * @qid: The AP queue number
  * @tbit: Test facilities bit
- * @info: Pointer to queue descriptor
+ * @info: Ptr to tapq gr2 struct
  *
  * Returns AP queue status structure.
  */
-static inline struct ap_queue_status ap_test_queue(ap_qid_t qid,
-                                                  int tbit,
-                                                  unsigned long *info)
+static inline struct ap_queue_status ap_test_queue(ap_qid_t qid, int tbit,
+                                                  struct ap_tapq_gr2 *info)
 {
        if (tbit)
                qid |= 1UL << 23; /* set T bit*/
index 4e1926cf7a3d33483fab29e46fa0622d7bb59317..ab37818faeabdee8c4000cb4feeeed466fdb8240 100644 (file)
@@ -343,18 +343,7 @@ static bool ap_queue_info(ap_qid_t qid, int *q_type, unsigned int *q_fac,
                          int *q_depth, int *q_ml, bool *q_decfg, bool *q_cstop)
 {
        struct ap_queue_status status;
-       union {
-               unsigned long value;
-               struct {
-                       unsigned int fac   : 32; /* facility bits */
-                       unsigned int at    :  8; /* ap type */
-                       unsigned int _res1 :  8;
-                       unsigned int _res2 :  4;
-                       unsigned int ml    :  4; /* apxl ml */
-                       unsigned int _res3 :  4;
-                       unsigned int qd    :  4; /* queue depth */
-               } tapq_gr2;
-       } tapq_info;
+       struct ap_tapq_gr2 tapq_info;
 
        tapq_info.value = 0;
 
@@ -364,7 +353,7 @@ static bool ap_queue_info(ap_qid_t qid, int *q_type, unsigned int *q_fac,
                return false;
 
        /* call TAPQ on this APQN */
-       status = ap_test_queue(qid, ap_apft_available(), &tapq_info.value);
+       status = ap_test_queue(qid, ap_apft_available(), &tapq_info);
        switch (status.response_code) {
        case AP_RESPONSE_NORMAL:
        case AP_RESPONSE_RESET_IN_PROGRESS:
@@ -378,10 +367,10 @@ static bool ap_queue_info(ap_qid_t qid, int *q_type, unsigned int *q_fac,
                 */
                if (WARN_ON_ONCE(!tapq_info.value))
                        return false;
-               *q_type = tapq_info.tapq_gr2.at;
-               *q_fac = tapq_info.tapq_gr2.fac;
-               *q_depth = tapq_info.tapq_gr2.qd;
-               *q_ml = tapq_info.tapq_gr2.ml;
+               *q_type = tapq_info.at;
+               *q_fac = tapq_info.fac;
+               *q_depth = tapq_info.qd;
+               *q_ml = tapq_info.ml;
                *q_decfg = status.response_code == AP_RESPONSE_DECONFIGURED;
                *q_cstop = status.response_code == AP_RESPONSE_CHECKSTOPPED;
                switch (*q_type) {
index bfe995116a6a47bc9c3710bda5339dad1aac11e1..31de464e4bb2e20b5674dacdab4b7bcc3707c2d0 100644 (file)
@@ -2115,8 +2115,8 @@ static void vfio_ap_filter_apid_by_qtype(unsigned long *apm, unsigned long *aqm)
 {
        bool apid_cleared;
        struct ap_queue_status status;
-       unsigned long apid, apqi, info;
-       int qtype, qtype_mask = 0xff000000;
+       unsigned long apid, apqi;
+       struct ap_tapq_gr2 info;
 
        for_each_set_bit_inv(apid, apm, AP_DEVICES) {
                apid_cleared = false;
@@ -2133,15 +2133,13 @@ static void vfio_ap_filter_apid_by_qtype(unsigned long *apm, unsigned long *aqm)
                        case AP_RESPONSE_DECONFIGURED:
                        case AP_RESPONSE_CHECKSTOPPED:
                        case AP_RESPONSE_BUSY:
-                               qtype = info & qtype_mask;
-
                                /*
                                 * The vfio_ap device driver only
                                 * supports CEX4 and newer adapters, so
                                 * remove the APID if the adapter is
                                 * older than a CEX4.
                                 */
-                               if (qtype < AP_DEVICE_TYPE_CEX4) {
+                               if (info.at < AP_DEVICE_TYPE_CEX4) {
                                        clear_bit_inv(apid, apm);
                                        apid_cleared = true;
                                }