1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright IBM Corp. 2001, 2018
4 * Author(s): Robert Burroughs
5 * Eric Rossman (edrossma@us.ibm.com)
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>
13 #include <linux/module.h>
14 #include <linux/init.h>
15 #include <linux/err.h>
16 #include <linux/delay.h>
17 #include <linux/slab.h>
18 #include <linux/atomic.h>
19 #include <linux/uaccess.h>
20 #include <linux/mod_devicetable.h>
23 #include "zcrypt_api.h"
24 #include "zcrypt_error.h"
25 #include "zcrypt_msgtype6.h"
26 #include "zcrypt_cex2c.h"
27 #include "zcrypt_cca_key.h"
28 #include "zcrypt_ccamisc.h"
30 #define CEX2C_MIN_MOD_SIZE 16 /* 128 bits */
31 #define CEX2C_MAX_MOD_SIZE 256 /* 2048 bits */
32 #define CEX3C_MIN_MOD_SIZE 16 /* 128 bits */
33 #define CEX3C_MAX_MOD_SIZE 512 /* 4096 bits */
34 #define CEX2C_MAX_XCRB_MESSAGE_SIZE (12*1024)
35 #define CEX2C_CLEANUP_TIME (15*HZ)
37 MODULE_AUTHOR("IBM Corporation");
38 MODULE_DESCRIPTION("CEX2C/CEX3C Cryptographic Coprocessor device driver, " \
39 "Copyright IBM Corp. 2001, 2018");
40 MODULE_LICENSE("GPL");
42 static struct ap_device_id zcrypt_cex2c_card_ids
[] = {
43 { .dev_type
= AP_DEVICE_TYPE_CEX2C
,
44 .match_flags
= AP_DEVICE_ID_MATCH_CARD_TYPE
},
45 { .dev_type
= AP_DEVICE_TYPE_CEX3C
,
46 .match_flags
= AP_DEVICE_ID_MATCH_CARD_TYPE
},
47 { /* end of list */ },
50 MODULE_DEVICE_TABLE(ap
, zcrypt_cex2c_card_ids
);
52 static struct ap_device_id zcrypt_cex2c_queue_ids
[] = {
53 { .dev_type
= AP_DEVICE_TYPE_CEX2C
,
54 .match_flags
= AP_DEVICE_ID_MATCH_QUEUE_TYPE
},
55 { .dev_type
= AP_DEVICE_TYPE_CEX3C
,
56 .match_flags
= AP_DEVICE_ID_MATCH_QUEUE_TYPE
},
57 { /* end of list */ },
60 MODULE_DEVICE_TABLE(ap
, zcrypt_cex2c_queue_ids
);
63 * CCA card additional device attributes
65 static ssize_t
cca_serialnr_show(struct device
*dev
,
66 struct device_attribute
*attr
,
70 struct ap_card
*ac
= to_ap_card(dev
);
71 struct zcrypt_card
*zc
= ac
->private;
73 memset(&ci
, 0, sizeof(ci
));
75 if (ap_domain_index
>= 0)
76 cca_get_info(ac
->id
, ap_domain_index
, &ci
, zc
->online
);
78 return scnprintf(buf
, PAGE_SIZE
, "%s\n", ci
.serial
);
81 static struct device_attribute dev_attr_cca_serialnr
=
82 __ATTR(serialnr
, 0444, cca_serialnr_show
, NULL
);
84 static struct attribute
*cca_card_attrs
[] = {
85 &dev_attr_cca_serialnr
.attr
,
89 static const struct attribute_group cca_card_attr_grp
= {
90 .attrs
= cca_card_attrs
,
94 * CCA queue additional device attributes
96 static ssize_t
cca_mkvps_show(struct device
*dev
,
97 struct device_attribute
*attr
,
102 struct zcrypt_queue
*zq
= to_ap_queue(dev
)->private;
103 static const char * const cao_state
[] = { "invalid", "valid" };
104 static const char * const new_state
[] = { "empty", "partial", "full" };
106 memset(&ci
, 0, sizeof(ci
));
108 cca_get_info(AP_QID_CARD(zq
->queue
->qid
),
109 AP_QID_QUEUE(zq
->queue
->qid
),
112 if (ci
.new_aes_mk_state
>= '1' && ci
.new_aes_mk_state
<= '3')
113 n
= scnprintf(buf
, PAGE_SIZE
, "AES NEW: %s 0x%016llx\n",
114 new_state
[ci
.new_aes_mk_state
- '1'],
117 n
= scnprintf(buf
, PAGE_SIZE
, "AES NEW: - -\n");
119 if (ci
.cur_aes_mk_state
>= '1' && ci
.cur_aes_mk_state
<= '2')
120 n
+= scnprintf(buf
+ n
, PAGE_SIZE
- n
,
121 "AES CUR: %s 0x%016llx\n",
122 cao_state
[ci
.cur_aes_mk_state
- '1'],
125 n
+= scnprintf(buf
+ n
, PAGE_SIZE
- n
, "AES CUR: - -\n");
127 if (ci
.old_aes_mk_state
>= '1' && ci
.old_aes_mk_state
<= '2')
128 n
+= scnprintf(buf
+ n
, PAGE_SIZE
- n
,
129 "AES OLD: %s 0x%016llx\n",
130 cao_state
[ci
.old_aes_mk_state
- '1'],
133 n
+= scnprintf(buf
+ n
, PAGE_SIZE
- n
, "AES OLD: - -\n");
135 if (ci
.new_apka_mk_state
>= '1' && ci
.new_apka_mk_state
<= '3')
136 n
+= scnprintf(buf
+ n
, PAGE_SIZE
- n
,
137 "APKA NEW: %s 0x%016llx\n",
138 new_state
[ci
.new_apka_mk_state
- '1'],
141 n
+= scnprintf(buf
+ n
, PAGE_SIZE
- n
, "APKA NEW: - -\n");
143 if (ci
.cur_apka_mk_state
>= '1' && ci
.cur_apka_mk_state
<= '2')
144 n
+= scnprintf(buf
+ n
, PAGE_SIZE
- n
,
145 "APKA CUR: %s 0x%016llx\n",
146 cao_state
[ci
.cur_apka_mk_state
- '1'],
149 n
+= scnprintf(buf
+ n
, PAGE_SIZE
- n
, "APKA CUR: - -\n");
151 if (ci
.old_apka_mk_state
>= '1' && ci
.old_apka_mk_state
<= '2')
152 n
+= scnprintf(buf
+ n
, PAGE_SIZE
- n
,
153 "APKA OLD: %s 0x%016llx\n",
154 cao_state
[ci
.old_apka_mk_state
- '1'],
157 n
+= scnprintf(buf
+ n
, PAGE_SIZE
- n
, "APKA OLD: - -\n");
162 static struct device_attribute dev_attr_cca_mkvps
=
163 __ATTR(mkvps
, 0444, cca_mkvps_show
, NULL
);
165 static struct attribute
*cca_queue_attrs
[] = {
166 &dev_attr_cca_mkvps
.attr
,
170 static const struct attribute_group cca_queue_attr_grp
= {
171 .attrs
= cca_queue_attrs
,
175 * Large random number detection function. Its sends a message to a CEX2C/CEX3C
176 * card to find out if large random numbers are supported.
177 * @ap_dev: pointer to the AP device.
179 * Returns 1 if large random numbers are supported, 0 if not and < 0 on error.
181 static int zcrypt_cex2c_rng_supported(struct ap_queue
*aq
)
183 struct ap_message ap_msg
;
184 unsigned long long psmid
;
187 struct type86_hdr hdr
;
188 struct type86_fmt2_ext fmt2
;
192 struct type6_hdr hdr
;
194 char function_code
[2];
195 short int rule_length
;
197 short int verb_length
;
198 short int key_length
;
202 ap_init_message(&ap_msg
);
203 ap_msg
.msg
= (void *) get_zeroed_page(GFP_KERNEL
);
207 rng_type6CPRB_msgX(&ap_msg
, 4, &domain
);
210 msg
->cprbx
.domain
= AP_QID_QUEUE(aq
->qid
);
212 rc
= ap_send(aq
->qid
, 0x0102030405060708ULL
, ap_msg
.msg
, ap_msg
.len
);
216 /* Wait for the test message to complete. */
217 for (i
= 0; i
< 2 * HZ
; i
++) {
219 rc
= ap_recv(aq
->qid
, &psmid
, ap_msg
.msg
, 4096);
220 if (rc
== 0 && psmid
== 0x0102030405060708ULL
)
231 if (reply
->cprbx
.ccp_rtcode
== 0 && reply
->cprbx
.ccp_rscode
== 0)
236 free_page((unsigned long) ap_msg
.msg
);
241 * Probe function for CEX2C/CEX3C card devices. It always accepts the
242 * AP device since the bus_match already checked the hardware type.
243 * @ap_dev: pointer to the AP card device.
245 static int zcrypt_cex2c_card_probe(struct ap_device
*ap_dev
)
248 * Normalized speed ratings per crypto adapter
249 * MEX_1k, MEX_2k, MEX_4k, CRT_1k, CRT_2k, CRT_4k, RNG, SECKEY
251 static const int CEX2C_SPEED_IDX
[] = {
252 1000, 1400, 2400, 1100, 1500, 2600, 100, 12};
253 static const int CEX3C_SPEED_IDX
[] = {
254 500, 700, 1400, 550, 800, 1500, 80, 10};
256 struct ap_card
*ac
= to_ap_card(&ap_dev
->device
);
257 struct zcrypt_card
*zc
;
260 zc
= zcrypt_card_alloc();
265 switch (ac
->ap_dev
.device_type
) {
266 case AP_DEVICE_TYPE_CEX2C
:
267 zc
->user_space_type
= ZCRYPT_CEX2C
;
268 zc
->type_string
= "CEX2C";
269 zc
->speed_rating
= CEX2C_SPEED_IDX
;
270 zc
->min_mod_size
= CEX2C_MIN_MOD_SIZE
;
271 zc
->max_mod_size
= CEX2C_MAX_MOD_SIZE
;
272 zc
->max_exp_bit_length
= CEX2C_MAX_MOD_SIZE
;
274 case AP_DEVICE_TYPE_CEX3C
:
275 zc
->user_space_type
= ZCRYPT_CEX3C
;
276 zc
->type_string
= "CEX3C";
277 zc
->speed_rating
= CEX3C_SPEED_IDX
;
278 zc
->min_mod_size
= CEX3C_MIN_MOD_SIZE
;
279 zc
->max_mod_size
= CEX3C_MAX_MOD_SIZE
;
280 zc
->max_exp_bit_length
= CEX3C_MAX_MOD_SIZE
;
283 zcrypt_card_free(zc
);
288 rc
= zcrypt_card_register(zc
);
291 zcrypt_card_free(zc
);
295 if (ap_test_bit(&ac
->functions
, AP_FUNC_COPRO
)) {
296 rc
= sysfs_create_group(&ap_dev
->device
.kobj
,
299 zcrypt_card_unregister(zc
);
301 zcrypt_card_free(zc
);
309 * This is called to remove the CEX2C/CEX3C card driver information
310 * if an AP card device is removed.
312 static void zcrypt_cex2c_card_remove(struct ap_device
*ap_dev
)
314 struct ap_card
*ac
= to_ap_card(&ap_dev
->device
);
315 struct zcrypt_card
*zc
= to_ap_card(&ap_dev
->device
)->private;
317 if (ap_test_bit(&ac
->functions
, AP_FUNC_COPRO
))
318 sysfs_remove_group(&ap_dev
->device
.kobj
, &cca_card_attr_grp
);
320 zcrypt_card_unregister(zc
);
323 static struct ap_driver zcrypt_cex2c_card_driver
= {
324 .probe
= zcrypt_cex2c_card_probe
,
325 .remove
= zcrypt_cex2c_card_remove
,
326 .ids
= zcrypt_cex2c_card_ids
,
327 .flags
= AP_DRIVER_FLAG_DEFAULT
,
331 * Probe function for CEX2C/CEX3C queue devices. It always accepts the
332 * AP device since the bus_match already checked the hardware type.
333 * @ap_dev: pointer to the AP card device.
335 static int zcrypt_cex2c_queue_probe(struct ap_device
*ap_dev
)
337 struct ap_queue
*aq
= to_ap_queue(&ap_dev
->device
);
338 struct zcrypt_queue
*zq
;
341 zq
= zcrypt_queue_alloc(CEX2C_MAX_XCRB_MESSAGE_SIZE
);
346 atomic_set(&zq
->load
, 0);
348 rc
= zcrypt_cex2c_rng_supported(aq
);
350 zcrypt_queue_free(zq
);
354 zq
->ops
= zcrypt_msgtype(MSGTYPE06_NAME
,
355 MSGTYPE06_VARIANT_DEFAULT
);
357 zq
->ops
= zcrypt_msgtype(MSGTYPE06_NAME
,
358 MSGTYPE06_VARIANT_NORNG
);
359 ap_queue_init_state(aq
);
360 ap_queue_init_reply(aq
, &zq
->reply
);
361 aq
->request_timeout
= CEX2C_CLEANUP_TIME
;
363 rc
= zcrypt_queue_register(zq
);
366 zcrypt_queue_free(zq
);
370 if (ap_test_bit(&aq
->card
->functions
, AP_FUNC_COPRO
)) {
371 rc
= sysfs_create_group(&ap_dev
->device
.kobj
,
372 &cca_queue_attr_grp
);
374 zcrypt_queue_unregister(zq
);
376 zcrypt_queue_free(zq
);
384 * This is called to remove the CEX2C/CEX3C queue driver information
385 * if an AP queue device is removed.
387 static void zcrypt_cex2c_queue_remove(struct ap_device
*ap_dev
)
389 struct ap_queue
*aq
= to_ap_queue(&ap_dev
->device
);
390 struct zcrypt_queue
*zq
= aq
->private;
392 if (ap_test_bit(&aq
->card
->functions
, AP_FUNC_COPRO
))
393 sysfs_remove_group(&ap_dev
->device
.kobj
, &cca_queue_attr_grp
);
395 zcrypt_queue_unregister(zq
);
398 static struct ap_driver zcrypt_cex2c_queue_driver
= {
399 .probe
= zcrypt_cex2c_queue_probe
,
400 .remove
= zcrypt_cex2c_queue_remove
,
401 .ids
= zcrypt_cex2c_queue_ids
,
402 .flags
= AP_DRIVER_FLAG_DEFAULT
,
405 int __init
zcrypt_cex2c_init(void)
409 rc
= ap_driver_register(&zcrypt_cex2c_card_driver
,
410 THIS_MODULE
, "cex2card");
414 rc
= ap_driver_register(&zcrypt_cex2c_queue_driver
,
415 THIS_MODULE
, "cex2cqueue");
417 ap_driver_unregister(&zcrypt_cex2c_card_driver
);
422 void zcrypt_cex2c_exit(void)
424 ap_driver_unregister(&zcrypt_cex2c_queue_driver
);
425 ap_driver_unregister(&zcrypt_cex2c_card_driver
);
428 module_init(zcrypt_cex2c_init
);
429 module_exit(zcrypt_cex2c_exit
);