root/drivers/s390/crypto/zcrypt_cex2a.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. zcrypt_cex2a_card_probe
  2. zcrypt_cex2a_card_remove
  3. zcrypt_cex2a_queue_probe
  4. zcrypt_cex2a_queue_remove
  5. zcrypt_cex2a_init
  6. zcrypt_cex2a_exit

   1 // SPDX-License-Identifier: GPL-2.0+
   2 /*
   3  *  Copyright IBM Corp. 2001, 2012
   4  *  Author(s): Robert Burroughs
   5  *             Eric Rossman (edrossma@us.ibm.com)
   6  *
   7  *  Hotplug & misc device support: Jochen Roehrig (roehrig@de.ibm.com)
   8  *  Major cleanup & driver split: Martin Schwidefsky <schwidefsky@de.ibm.com>
   9  *                                Ralph Wuerthner <rwuerthn@de.ibm.com>
  10  *  MSGTYPE restruct:             Holger Dengler <hd@linux.vnet.ibm.com>
  11  */
  12 
  13 #include <linux/module.h>
  14 #include <linux/slab.h>
  15 #include <linux/init.h>
  16 #include <linux/err.h>
  17 #include <linux/atomic.h>
  18 #include <linux/uaccess.h>
  19 #include <linux/mod_devicetable.h>
  20 
  21 #include "ap_bus.h"
  22 #include "zcrypt_api.h"
  23 #include "zcrypt_error.h"
  24 #include "zcrypt_cex2a.h"
  25 #include "zcrypt_msgtype50.h"
  26 
  27 #define CEX2A_MIN_MOD_SIZE        1     /*    8 bits    */
  28 #define CEX2A_MAX_MOD_SIZE      256     /* 2048 bits    */
  29 #define CEX3A_MIN_MOD_SIZE      CEX2A_MIN_MOD_SIZE
  30 #define CEX3A_MAX_MOD_SIZE      512     /* 4096 bits    */
  31 
  32 #define CEX2A_MAX_MESSAGE_SIZE  0x390   /* sizeof(struct type50_crb2_msg)    */
  33 #define CEX2A_MAX_RESPONSE_SIZE 0x110   /* max outputdatalength + type80_hdr */
  34 
  35 #define CEX3A_MAX_RESPONSE_SIZE 0x210   /* 512 bit modulus
  36                                          * (max outputdatalength) +
  37                                          * type80_hdr*/
  38 #define CEX3A_MAX_MESSAGE_SIZE  sizeof(struct type50_crb3_msg)
  39 
  40 #define CEX2A_CLEANUP_TIME      (15*HZ)
  41 #define CEX3A_CLEANUP_TIME      CEX2A_CLEANUP_TIME
  42 
  43 MODULE_AUTHOR("IBM Corporation");
  44 MODULE_DESCRIPTION("CEX2A/CEX3A Cryptographic Coprocessor device driver, " \
  45                    "Copyright IBM Corp. 2001, 2018");
  46 MODULE_LICENSE("GPL");
  47 
  48 static struct ap_device_id zcrypt_cex2a_card_ids[] = {
  49         { .dev_type = AP_DEVICE_TYPE_CEX2A,
  50           .match_flags = AP_DEVICE_ID_MATCH_CARD_TYPE },
  51         { .dev_type = AP_DEVICE_TYPE_CEX3A,
  52           .match_flags = AP_DEVICE_ID_MATCH_CARD_TYPE },
  53         { /* end of list */ },
  54 };
  55 
  56 MODULE_DEVICE_TABLE(ap, zcrypt_cex2a_card_ids);
  57 
  58 static struct ap_device_id zcrypt_cex2a_queue_ids[] = {
  59         { .dev_type = AP_DEVICE_TYPE_CEX2A,
  60           .match_flags = AP_DEVICE_ID_MATCH_QUEUE_TYPE },
  61         { .dev_type = AP_DEVICE_TYPE_CEX3A,
  62           .match_flags = AP_DEVICE_ID_MATCH_QUEUE_TYPE },
  63         { /* end of list */ },
  64 };
  65 
  66 MODULE_DEVICE_TABLE(ap, zcrypt_cex2a_queue_ids);
  67 
  68 /**
  69  * Probe function for CEX2A card devices. It always accepts the AP device
  70  * since the bus_match already checked the card type.
  71  * @ap_dev: pointer to the AP device.
  72  */
  73 static int zcrypt_cex2a_card_probe(struct ap_device *ap_dev)
  74 {
  75         /*
  76          * Normalized speed ratings per crypto adapter
  77          * MEX_1k, MEX_2k, MEX_4k, CRT_1k, CRT_2k, CRT_4k, RNG, SECKEY
  78          */
  79         static const int CEX2A_SPEED_IDX[] = {
  80                 800, 1000, 2000,  900, 1200, 2400, 0, 0};
  81         static const int CEX3A_SPEED_IDX[] = {
  82                 400,  500, 1000,  450,  550, 1200, 0, 0};
  83 
  84         struct ap_card *ac = to_ap_card(&ap_dev->device);
  85         struct zcrypt_card *zc;
  86         int rc = 0;
  87 
  88         zc = zcrypt_card_alloc();
  89         if (!zc)
  90                 return -ENOMEM;
  91         zc->card = ac;
  92         ac->private = zc;
  93 
  94         if (ac->ap_dev.device_type == AP_DEVICE_TYPE_CEX2A) {
  95                 zc->min_mod_size = CEX2A_MIN_MOD_SIZE;
  96                 zc->max_mod_size = CEX2A_MAX_MOD_SIZE;
  97                 memcpy(zc->speed_rating, CEX2A_SPEED_IDX,
  98                        sizeof(CEX2A_SPEED_IDX));
  99                 zc->max_exp_bit_length = CEX2A_MAX_MOD_SIZE;
 100                 zc->type_string = "CEX2A";
 101                 zc->user_space_type = ZCRYPT_CEX2A;
 102         } else if (ac->ap_dev.device_type == AP_DEVICE_TYPE_CEX3A) {
 103                 zc->min_mod_size = CEX2A_MIN_MOD_SIZE;
 104                 zc->max_mod_size = CEX2A_MAX_MOD_SIZE;
 105                 zc->max_exp_bit_length = CEX2A_MAX_MOD_SIZE;
 106                 if (ap_test_bit(&ac->functions, AP_FUNC_MEX4K) &&
 107                     ap_test_bit(&ac->functions, AP_FUNC_CRT4K)) {
 108                         zc->max_mod_size = CEX3A_MAX_MOD_SIZE;
 109                         zc->max_exp_bit_length = CEX3A_MAX_MOD_SIZE;
 110                 }
 111                 memcpy(zc->speed_rating, CEX3A_SPEED_IDX,
 112                        sizeof(CEX3A_SPEED_IDX));
 113                 zc->type_string = "CEX3A";
 114                 zc->user_space_type = ZCRYPT_CEX3A;
 115         } else {
 116                 zcrypt_card_free(zc);
 117                 return -ENODEV;
 118         }
 119         zc->online = 1;
 120 
 121         rc = zcrypt_card_register(zc);
 122         if (rc) {
 123                 ac->private = NULL;
 124                 zcrypt_card_free(zc);
 125         }
 126 
 127         return rc;
 128 }
 129 
 130 /**
 131  * This is called to remove the CEX2A card driver information
 132  * if an AP card device is removed.
 133  */
 134 static void zcrypt_cex2a_card_remove(struct ap_device *ap_dev)
 135 {
 136         struct zcrypt_card *zc = to_ap_card(&ap_dev->device)->private;
 137 
 138         if (zc)
 139                 zcrypt_card_unregister(zc);
 140 }
 141 
 142 static struct ap_driver zcrypt_cex2a_card_driver = {
 143         .probe = zcrypt_cex2a_card_probe,
 144         .remove = zcrypt_cex2a_card_remove,
 145         .ids = zcrypt_cex2a_card_ids,
 146         .flags = AP_DRIVER_FLAG_DEFAULT,
 147 };
 148 
 149 /**
 150  * Probe function for CEX2A queue devices. It always accepts the AP device
 151  * since the bus_match already checked the queue type.
 152  * @ap_dev: pointer to the AP device.
 153  */
 154 static int zcrypt_cex2a_queue_probe(struct ap_device *ap_dev)
 155 {
 156         struct ap_queue *aq = to_ap_queue(&ap_dev->device);
 157         struct zcrypt_queue *zq = NULL;
 158         int rc;
 159 
 160         switch (ap_dev->device_type) {
 161         case AP_DEVICE_TYPE_CEX2A:
 162                 zq = zcrypt_queue_alloc(CEX2A_MAX_RESPONSE_SIZE);
 163                 if (!zq)
 164                         return -ENOMEM;
 165                 break;
 166         case AP_DEVICE_TYPE_CEX3A:
 167                 zq = zcrypt_queue_alloc(CEX3A_MAX_RESPONSE_SIZE);
 168                 if (!zq)
 169                         return -ENOMEM;
 170                 break;
 171         }
 172         if (!zq)
 173                 return -ENODEV;
 174         zq->ops = zcrypt_msgtype(MSGTYPE50_NAME, MSGTYPE50_VARIANT_DEFAULT);
 175         zq->queue = aq;
 176         zq->online = 1;
 177         atomic_set(&zq->load, 0);
 178         ap_queue_init_state(aq);
 179         ap_queue_init_reply(aq, &zq->reply);
 180         aq->request_timeout = CEX2A_CLEANUP_TIME,
 181         aq->private = zq;
 182         rc = zcrypt_queue_register(zq);
 183         if (rc) {
 184                 aq->private = NULL;
 185                 zcrypt_queue_free(zq);
 186         }
 187 
 188         return rc;
 189 }
 190 
 191 /**
 192  * This is called to remove the CEX2A queue driver information
 193  * if an AP queue device is removed.
 194  */
 195 static void zcrypt_cex2a_queue_remove(struct ap_device *ap_dev)
 196 {
 197         struct ap_queue *aq = to_ap_queue(&ap_dev->device);
 198         struct zcrypt_queue *zq = aq->private;
 199 
 200         if (zq)
 201                 zcrypt_queue_unregister(zq);
 202 }
 203 
 204 static struct ap_driver zcrypt_cex2a_queue_driver = {
 205         .probe = zcrypt_cex2a_queue_probe,
 206         .remove = zcrypt_cex2a_queue_remove,
 207         .suspend = ap_queue_suspend,
 208         .resume = ap_queue_resume,
 209         .ids = zcrypt_cex2a_queue_ids,
 210         .flags = AP_DRIVER_FLAG_DEFAULT,
 211 };
 212 
 213 int __init zcrypt_cex2a_init(void)
 214 {
 215         int rc;
 216 
 217         rc = ap_driver_register(&zcrypt_cex2a_card_driver,
 218                                 THIS_MODULE, "cex2acard");
 219         if (rc)
 220                 return rc;
 221 
 222         rc = ap_driver_register(&zcrypt_cex2a_queue_driver,
 223                                 THIS_MODULE, "cex2aqueue");
 224         if (rc)
 225                 ap_driver_unregister(&zcrypt_cex2a_card_driver);
 226 
 227         return rc;
 228 }
 229 
 230 void __exit zcrypt_cex2a_exit(void)
 231 {
 232         ap_driver_unregister(&zcrypt_cex2a_queue_driver);
 233         ap_driver_unregister(&zcrypt_cex2a_card_driver);
 234 }
 235 
 236 module_init(zcrypt_cex2a_init);
 237 module_exit(zcrypt_cex2a_exit);

/* [<][>][^][v][top][bottom][index][help] */