diff options
Diffstat (limited to 'drivers/s390/crypto/zcrypt_cex2a.c')
-rw-r--r-- | drivers/s390/crypto/zcrypt_cex2a.c | 76 |
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 | ||
50 | static struct ap_device_id zcrypt_cex2a_ids[] = { | 58 | static 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 | */ |
374 | static int zcrypt_cex2a_probe(struct ap_device *ap_dev) | 384 | static 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; | |
398 | out_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 | ||