aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/crypto/zcrypt_cex2a.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/s390/crypto/zcrypt_cex2a.c')
-rw-r--r--drivers/s390/crypto/zcrypt_cex2a.c76
1 files changed, 50 insertions, 26 deletions
diff --git a/drivers/s390/crypto/zcrypt_cex2a.c b/drivers/s390/crypto/zcrypt_cex2a.c
index 326ea08f67c9..9c409efa1ecf 100644
--- a/drivers/s390/crypto/zcrypt_cex2a.c
+++ b/drivers/s390/crypto/zcrypt_cex2a.c
@@ -27,6 +27,7 @@
27 */ 27 */
28 28
29#include <linux/module.h> 29#include <linux/module.h>
30#include <linux/slab.h>
30#include <linux/init.h> 31#include <linux/init.h>
31#include <linux/err.h> 32#include <linux/err.h>
32#include <asm/atomic.h> 33#include <asm/atomic.h>
@@ -39,17 +40,24 @@
39 40
40#define CEX2A_MIN_MOD_SIZE 1 /* 8 bits */ 41#define CEX2A_MIN_MOD_SIZE 1 /* 8 bits */
41#define CEX2A_MAX_MOD_SIZE 256 /* 2048 bits */ 42#define CEX2A_MAX_MOD_SIZE 256 /* 2048 bits */
43#define CEX3A_MIN_MOD_SIZE CEX2A_MIN_MOD_SIZE
44#define CEX3A_MAX_MOD_SIZE CEX2A_MAX_MOD_SIZE
42 45
43#define CEX2A_SPEED_RATING 970 46#define CEX2A_SPEED_RATING 970
47#define CEX3A_SPEED_RATING 900 /* Fixme: Needs finetuning */
44 48
45#define CEX2A_MAX_MESSAGE_SIZE 0x390 /* sizeof(struct type50_crb2_msg) */ 49#define CEX2A_MAX_MESSAGE_SIZE 0x390 /* sizeof(struct type50_crb2_msg) */
46#define CEX2A_MAX_RESPONSE_SIZE 0x110 /* max outputdatalength + type80_hdr */ 50#define CEX2A_MAX_RESPONSE_SIZE 0x110 /* max outputdatalength + type80_hdr */
47 51
52#define CEX3A_MAX_MESSAGE_SIZE CEX2A_MAX_MESSAGE_SIZE
53#define CEX3A_MAX_RESPONSE_SIZE CEX2A_MAX_RESPONSE_SIZE
54
48#define CEX2A_CLEANUP_TIME (15*HZ) 55#define CEX2A_CLEANUP_TIME (15*HZ)
56#define CEX3A_CLEANUP_TIME CEX2A_CLEANUP_TIME
49 57
50static struct ap_device_id zcrypt_cex2a_ids[] = { 58static struct ap_device_id zcrypt_cex2a_ids[] = {
51 { AP_DEVICE(AP_DEVICE_TYPE_CEX2A) }, 59 { AP_DEVICE(AP_DEVICE_TYPE_CEX2A) },
52 { AP_DEVICE(AP_DEVICE_TYPE_CEX2A2) }, 60 { AP_DEVICE(AP_DEVICE_TYPE_CEX3A) },
53 { /* end of list */ }, 61 { /* end of list */ },
54}; 62};
55 63
@@ -298,6 +306,7 @@ static long zcrypt_cex2a_modexpo(struct zcrypt_device *zdev,
298 struct completion work; 306 struct completion work;
299 int rc; 307 int rc;
300 308
309 ap_init_message(&ap_msg);
301 ap_msg.message = kmalloc(CEX2A_MAX_MESSAGE_SIZE, GFP_KERNEL); 310 ap_msg.message = kmalloc(CEX2A_MAX_MESSAGE_SIZE, GFP_KERNEL);
302 if (!ap_msg.message) 311 if (!ap_msg.message)
303 return -ENOMEM; 312 return -ENOMEM;
@@ -335,6 +344,7 @@ static long zcrypt_cex2a_modexpo_crt(struct zcrypt_device *zdev,
335 struct completion work; 344 struct completion work;
336 int rc; 345 int rc;
337 346
347 ap_init_message(&ap_msg);
338 ap_msg.message = kmalloc(CEX2A_MAX_MESSAGE_SIZE, GFP_KERNEL); 348 ap_msg.message = kmalloc(CEX2A_MAX_MESSAGE_SIZE, GFP_KERNEL);
339 if (!ap_msg.message) 349 if (!ap_msg.message)
340 return -ENOMEM; 350 return -ENOMEM;
@@ -373,31 +383,45 @@ static struct zcrypt_ops zcrypt_cex2a_ops = {
373 */ 383 */
374static int zcrypt_cex2a_probe(struct ap_device *ap_dev) 384static int zcrypt_cex2a_probe(struct ap_device *ap_dev)
375{ 385{
376 struct zcrypt_device *zdev; 386 struct zcrypt_device *zdev = NULL;
377 int rc; 387 int rc = 0;
378 388
379 zdev = zcrypt_device_alloc(CEX2A_MAX_RESPONSE_SIZE); 389 switch (ap_dev->device_type) {
380 if (!zdev) 390 case AP_DEVICE_TYPE_CEX2A:
381 return -ENOMEM; 391 zdev = zcrypt_device_alloc(CEX2A_MAX_RESPONSE_SIZE);
382 zdev->ap_dev = ap_dev; 392 if (!zdev)
383 zdev->ops = &zcrypt_cex2a_ops; 393 return -ENOMEM;
384 zdev->online = 1; 394 zdev->user_space_type = ZCRYPT_CEX2A;
385 zdev->user_space_type = ZCRYPT_CEX2A; 395 zdev->type_string = "CEX2A";
386 zdev->type_string = "CEX2A"; 396 zdev->min_mod_size = CEX2A_MIN_MOD_SIZE;
387 zdev->min_mod_size = CEX2A_MIN_MOD_SIZE; 397 zdev->max_mod_size = CEX2A_MAX_MOD_SIZE;
388 zdev->max_mod_size = CEX2A_MAX_MOD_SIZE; 398 zdev->short_crt = 1;
389 zdev->short_crt = 1; 399 zdev->speed_rating = CEX2A_SPEED_RATING;
390 zdev->speed_rating = CEX2A_SPEED_RATING; 400 break;
391 ap_dev->reply = &zdev->reply; 401 case AP_DEVICE_TYPE_CEX3A:
392 ap_dev->private = zdev; 402 zdev = zcrypt_device_alloc(CEX3A_MAX_RESPONSE_SIZE);
393 rc = zcrypt_device_register(zdev); 403 if (!zdev)
394 if (rc) 404 return -ENOMEM;
395 goto out_free; 405 zdev->user_space_type = ZCRYPT_CEX3A;
396 return 0; 406 zdev->type_string = "CEX3A";
397 407 zdev->min_mod_size = CEX3A_MIN_MOD_SIZE;
398out_free: 408 zdev->max_mod_size = CEX3A_MAX_MOD_SIZE;
399 ap_dev->private = NULL; 409 zdev->short_crt = 1;
400 zcrypt_device_free(zdev); 410 zdev->speed_rating = CEX3A_SPEED_RATING;
411 break;
412 }
413 if (zdev != NULL) {
414 zdev->ap_dev = ap_dev;
415 zdev->ops = &zcrypt_cex2a_ops;
416 zdev->online = 1;
417 ap_dev->reply = &zdev->reply;
418 ap_dev->private = zdev;
419 rc = zcrypt_device_register(zdev);
420 }
421 if (rc) {
422 ap_dev->private = NULL;
423 zcrypt_device_free(zdev);
424 }
401 return rc; 425 return rc;
402} 426}
403 427