]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
s390/zcrypt: enable card/domain autoselect on ep11 cprbs
authorHarald Freudenberger <freude@linux.ibm.com>
Fri, 30 Aug 2019 13:17:27 +0000 (15:17 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Thu, 30 Jan 2020 12:07:55 +0000 (13:07 +0100)
For EP11 CPRBs there was only to choose between specify
one or more ep11 targets or not give a target at all. Without
any target the zcrypt code assumed AUTOSELECT. For EP11 this
ended up in choosing any EP11 APQN with regards to the weight.

However, CCA CPRBs can have a more fine granular target
addressing. The caller can give 0xFFFF as AUTOSELECT for
the card and/or the domain. So it's possible to address
any card but domain given or any domain but card given.

This patch now introduces the very same for EP11 CPRB handling.
An EP11 target entry now may contain 0xFFFF as card and/or
domain value with the meaning of ANY card or domain. So
now the same behavior as with CCA CPRBs becomes possible:
Address any card with given domain or address any domain within
given card.

For convenience the zcrypt.h header file now has two new
defines AUTOSEL_AP and AUTOSEL_DOM covering the 0xFFFF
value to address card any and domain any.

Signed-off-by: Harald Freudenberger <freude@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/include/uapi/asm/zcrypt.h
drivers/s390/crypto/zcrypt_api.c

index f9e5e1f0821d4503fd4fedd137f969267b9abbe0..7f179a30beb19a010d208b8fdd0a12b09a563210 100644 (file)
@@ -237,7 +237,9 @@ struct zcrypt_device_matrix_ext {
        struct zcrypt_device_status_ext device[MAX_ZDEV_ENTRIES_EXT];
 };
 
-#define AUTOSELECT 0xFFFFFFFF
+#define AUTOSELECT  0xFFFFFFFF
+#define AUTOSEL_AP  ((__u16) 0xFFFF)
+#define AUTOSEL_DOM ((__u16) 0xFFFF)
 
 #define ZCRYPT_IOCTL_MAGIC 'z'
 
index 9157e728a362dbd5589e2fe786fbd585b5f3f8f5..6244380ce75230cf43430ba84b84cbe0070e9dd2 100644 (file)
@@ -849,7 +849,7 @@ static long _zcrypt_send_cprb(struct ap_perms *perms,
                        /* check if device is online and eligible */
                        if (!zq->online ||
                            !zq->ops->send_cprb ||
-                           (tdom != (unsigned short) AUTOSELECT &&
+                           (tdom != AUTOSEL_DOM &&
                             tdom != AP_QID_QUEUE(zq->queue->qid)))
                                continue;
                        /* check if device node has admission for this queue */
@@ -874,7 +874,7 @@ static long _zcrypt_send_cprb(struct ap_perms *perms,
 
        /* in case of auto select, provide the correct domain */
        qid = pref_zq->queue->qid;
-       if (*domain == (unsigned short) AUTOSELECT)
+       if (*domain == AUTOSEL_DOM)
                *domain = AP_QID_QUEUE(qid);
 
        rc = pref_zq->ops->send_cprb(pref_zq, xcRB, &ap_msg);
@@ -901,7 +901,7 @@ static bool is_desired_ep11_card(unsigned int dev_id,
                                 struct ep11_target_dev *targets)
 {
        while (target_num-- > 0) {
-               if (dev_id == targets->ap_id)
+               if (targets->ap_id == dev_id || targets->ap_id == AUTOSEL_AP)
                        return true;
                targets++;
        }
@@ -912,8 +912,11 @@ static bool is_desired_ep11_queue(unsigned int dev_qid,
                                  unsigned short target_num,
                                  struct ep11_target_dev *targets)
 {
+       int card = AP_QID_CARD(dev_qid), dom = AP_QID_QUEUE(dev_qid);
+
        while (target_num-- > 0) {
-               if (AP_MKQID(targets->ap_id, targets->dom_id) == dev_qid)
+               if ((targets->ap_id == card || targets->ap_id == AUTOSEL_AP) &&
+                   (targets->dom_id == dom || targets->dom_id == AUTOSEL_DOM))
                        return true;
                targets++;
        }