s390/zcrypt: CEX6S exploitation
authorHarald Freudenberger <freude@linux.vnet.ibm.com>
Tue, 10 Oct 2017 09:25:06 +0000 (11:25 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 23 Oct 2017 07:07:12 +0000 (09:07 +0200)
This patch adds the full CEX6S card support to the zcrypt device
driver. A CEX6A/C/P is detected and displayed as such, the card
and queue device driver code is updated to recognize it and the
relative weight values for CEX4, CEX5 and CEX6 have been updated.

Signed-off-by: Harald Freudenberger <freude@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/crypto/ap_card.c
drivers/s390/crypto/ap_queue.c
drivers/s390/crypto/zcrypt_api.h
drivers/s390/crypto/zcrypt_cex4.c

index 836efac968137aaa297b82476a96a7ee306c1f6a..e8300630e1978ad25cd98b4e3e1ec89095eca2b2 100644 (file)
@@ -182,9 +182,6 @@ struct ap_card *ap_card_create(int id, int queue_depth, int device_type,
        ac->ap_dev.device.release = ap_card_device_release;
        ac->ap_dev.device.type = &ap_card_type;
        ac->ap_dev.device_type = device_type;
-       /* CEX6 toleration: map to CEX5 */
-       if (device_type == AP_DEVICE_TYPE_CEX6)
-               ac->ap_dev.device_type = AP_DEVICE_TYPE_CEX5;
        ac->raw_hwtype = device_type;
        ac->queue_depth = queue_depth;
        ac->functions = functions;
index 56b96edffd5be897f8773d76944032de74a85e4d..d15903926f461fa72a35bcc039c2501d5ed3f3ae 100644 (file)
@@ -626,9 +626,6 @@ struct ap_queue *ap_queue_create(ap_qid_t qid, int device_type)
        aq->ap_dev.device.release = ap_queue_device_release;
        aq->ap_dev.device.type = &ap_queue_type;
        aq->ap_dev.device_type = device_type;
-       /* CEX6 toleration: map to CEX5 */
-       if (device_type == AP_DEVICE_TYPE_CEX6)
-               aq->ap_dev.device_type = AP_DEVICE_TYPE_CEX5;
        aq->qid = qid;
        aq->state = AP_STATE_RESET_START;
        aq->interrupt = AP_INTR_DISABLED;
index 6c94efd23eacf7c6a20fa3880285485e26341f2c..73541a798db7a4a1c41bd0e555f33bd1a1bbbbde 100644 (file)
@@ -76,6 +76,7 @@ struct ica_z90_status {
 #define ZCRYPT_CEX3A           8
 #define ZCRYPT_CEX4           10
 #define ZCRYPT_CEX5           11
+#define ZCRYPT_CEX6           12
 
 /**
  * Large random numbers are pulled in 4096 byte chunks from the crypto cards
index 4e91163d70a6eb1341bb2306ca9a6b1137aa159a..e2eebc775a37a0e80ced5520cb5446d85e33fb23 100644 (file)
@@ -45,6 +45,8 @@ static struct ap_device_id zcrypt_cex4_card_ids[] = {
          .match_flags = AP_DEVICE_ID_MATCH_CARD_TYPE },
        { .dev_type = AP_DEVICE_TYPE_CEX5,
          .match_flags = AP_DEVICE_ID_MATCH_CARD_TYPE },
+       { .dev_type = AP_DEVICE_TYPE_CEX6,
+         .match_flags = AP_DEVICE_ID_MATCH_CARD_TYPE },
        { /* end of list */ },
 };
 
@@ -55,6 +57,8 @@ static struct ap_device_id zcrypt_cex4_queue_ids[] = {
          .match_flags = AP_DEVICE_ID_MATCH_QUEUE_TYPE },
        { .dev_type = AP_DEVICE_TYPE_CEX5,
          .match_flags = AP_DEVICE_ID_MATCH_QUEUE_TYPE },
+       { .dev_type = AP_DEVICE_TYPE_CEX6,
+         .match_flags = AP_DEVICE_ID_MATCH_QUEUE_TYPE },
        { /* end of list */ },
 };
 
@@ -72,17 +76,25 @@ static int zcrypt_cex4_card_probe(struct ap_device *ap_dev)
         * MEX_1k, MEX_2k, MEX_4k, CRT_1k, CRT_2k, CRT_4k, RNG, SECKEY
         */
        static const int CEX4A_SPEED_IDX[] = {
-               5,  6,    59,  20, 115,  581,  0,  0};
+                14, 19, 249, 42, 228, 1458, 0, 0};
        static const int CEX5A_SPEED_IDX[] = {
-               3,  3,     6,   8,  32,  218,  0,  0};
+                 8,  9,  20, 18,  66,  458, 0, 0};
+       static const int CEX6A_SPEED_IDX[] = {
+                 6,  9,  20, 17,  65,  438, 0, 0};
+
        static const int CEX4C_SPEED_IDX[] = {
-               24,  25,   82,  41, 138, 1111, 79,  8};
+                59,  69, 308, 83, 278, 2204, 209, 40};
        static const int CEX5C_SPEED_IDX[] = {
-               10,  14,   23,  17,  45,  242, 63,  4};
+                24,  31,  50, 37,  90,  479,  27, 10};
+       static const int CEX6C_SPEED_IDX[] = {
+                16,  20,  32, 27,  77,  455,  23,  9};
+
        static const int CEX4P_SPEED_IDX[] = {
-               142, 198, 1852, 203, 331, 1563,  0,  8};
+               224, 313, 3560, 359, 605, 2827, 0, 50};
        static const int CEX5P_SPEED_IDX[] = {
-               49,  67,  131,  52,  85,  287,  0,  4};
+                63,  84,  156,  83, 142,  533, 0, 10};
+       static const int CEX6P_SPEED_IDX[] = {
+                55,  70,  121,  73, 129,  522, 0,  9};
 
        struct ap_card *ac = to_ap_card(&ap_dev->device);
        struct zcrypt_card *zc;
@@ -99,11 +111,16 @@ static int zcrypt_cex4_card_probe(struct ap_device *ap_dev)
                        zc->user_space_type = ZCRYPT_CEX4;
                        memcpy(zc->speed_rating, CEX4A_SPEED_IDX,
                               sizeof(CEX4A_SPEED_IDX));
-               } else {
+               } else if (ac->ap_dev.device_type == AP_DEVICE_TYPE_CEX5) {
                        zc->type_string = "CEX5A";
                        zc->user_space_type = ZCRYPT_CEX5;
                        memcpy(zc->speed_rating, CEX5A_SPEED_IDX,
                               sizeof(CEX5A_SPEED_IDX));
+               } else {
+                       zc->type_string = "CEX6A";
+                       zc->user_space_type = ZCRYPT_CEX6;
+                       memcpy(zc->speed_rating, CEX6A_SPEED_IDX,
+                              sizeof(CEX6A_SPEED_IDX));
                }
                zc->min_mod_size = CEX4A_MIN_MOD_SIZE;
                if (ap_test_bit(&ac->functions, AP_FUNC_MEX4K) &&
@@ -125,7 +142,7 @@ static int zcrypt_cex4_card_probe(struct ap_device *ap_dev)
                        zc->user_space_type = ZCRYPT_CEX3C;
                        memcpy(zc->speed_rating, CEX4C_SPEED_IDX,
                               sizeof(CEX4C_SPEED_IDX));
-               } else {
+               } else if (ac->ap_dev.device_type == AP_DEVICE_TYPE_CEX5) {
                        zc->type_string = "CEX5C";
                        /* wrong user space type, must be CEX5
                         * just keep it for cca compatibility
@@ -133,6 +150,14 @@ static int zcrypt_cex4_card_probe(struct ap_device *ap_dev)
                        zc->user_space_type = ZCRYPT_CEX3C;
                        memcpy(zc->speed_rating, CEX5C_SPEED_IDX,
                               sizeof(CEX5C_SPEED_IDX));
+               } else {
+                       zc->type_string = "CEX6C";
+                       /* wrong user space type, must be CEX6
+                        * just keep it for cca compatibility
+                        */
+                       zc->user_space_type = ZCRYPT_CEX3C;
+                       memcpy(zc->speed_rating, CEX6C_SPEED_IDX,
+                              sizeof(CEX6C_SPEED_IDX));
                }
                zc->min_mod_size = CEX4C_MIN_MOD_SIZE;
                zc->max_mod_size = CEX4C_MAX_MOD_SIZE;
@@ -143,11 +168,16 @@ static int zcrypt_cex4_card_probe(struct ap_device *ap_dev)
                        zc->user_space_type = ZCRYPT_CEX4;
                        memcpy(zc->speed_rating, CEX4P_SPEED_IDX,
                               sizeof(CEX4P_SPEED_IDX));
-               } else {
+               } else if (ac->ap_dev.device_type == AP_DEVICE_TYPE_CEX5) {
                        zc->type_string = "CEX5P";
                        zc->user_space_type = ZCRYPT_CEX5;
                        memcpy(zc->speed_rating, CEX5P_SPEED_IDX,
                               sizeof(CEX5P_SPEED_IDX));
+               } else {
+                       zc->type_string = "CEX6P";
+                       zc->user_space_type = ZCRYPT_CEX6;
+                       memcpy(zc->speed_rating, CEX6P_SPEED_IDX,
+                              sizeof(CEX6P_SPEED_IDX));
                }
                zc->min_mod_size = CEX4C_MIN_MOD_SIZE;
                zc->max_mod_size = CEX4C_MAX_MOD_SIZE;