Commit 21214b04 authored by Harald Freudenberger's avatar Harald Freudenberger Committed by Martin Schwidefsky

s390/zcrypt: CEX6S exploitation

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: default avatarHarald Freudenberger <freude@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 3037a52f
...@@ -182,9 +182,6 @@ struct ap_card *ap_card_create(int id, int queue_depth, int device_type, ...@@ -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.release = ap_card_device_release;
ac->ap_dev.device.type = &ap_card_type; ac->ap_dev.device.type = &ap_card_type;
ac->ap_dev.device_type = device_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->raw_hwtype = device_type;
ac->queue_depth = queue_depth; ac->queue_depth = queue_depth;
ac->functions = functions; ac->functions = functions;
......
...@@ -626,9 +626,6 @@ struct ap_queue *ap_queue_create(ap_qid_t qid, int device_type) ...@@ -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.release = ap_queue_device_release;
aq->ap_dev.device.type = &ap_queue_type; aq->ap_dev.device.type = &ap_queue_type;
aq->ap_dev.device_type = device_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->qid = qid;
aq->state = AP_STATE_RESET_START; aq->state = AP_STATE_RESET_START;
aq->interrupt = AP_INTR_DISABLED; aq->interrupt = AP_INTR_DISABLED;
......
...@@ -76,6 +76,7 @@ struct ica_z90_status { ...@@ -76,6 +76,7 @@ struct ica_z90_status {
#define ZCRYPT_CEX3A 8 #define ZCRYPT_CEX3A 8
#define ZCRYPT_CEX4 10 #define ZCRYPT_CEX4 10
#define ZCRYPT_CEX5 11 #define ZCRYPT_CEX5 11
#define ZCRYPT_CEX6 12
/** /**
* Large random numbers are pulled in 4096 byte chunks from the crypto cards * Large random numbers are pulled in 4096 byte chunks from the crypto cards
......
...@@ -45,6 +45,8 @@ static struct ap_device_id zcrypt_cex4_card_ids[] = { ...@@ -45,6 +45,8 @@ static struct ap_device_id zcrypt_cex4_card_ids[] = {
.match_flags = AP_DEVICE_ID_MATCH_CARD_TYPE }, .match_flags = AP_DEVICE_ID_MATCH_CARD_TYPE },
{ .dev_type = AP_DEVICE_TYPE_CEX5, { .dev_type = AP_DEVICE_TYPE_CEX5,
.match_flags = AP_DEVICE_ID_MATCH_CARD_TYPE }, .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 */ }, { /* end of list */ },
}; };
...@@ -55,6 +57,8 @@ static struct ap_device_id zcrypt_cex4_queue_ids[] = { ...@@ -55,6 +57,8 @@ static struct ap_device_id zcrypt_cex4_queue_ids[] = {
.match_flags = AP_DEVICE_ID_MATCH_QUEUE_TYPE }, .match_flags = AP_DEVICE_ID_MATCH_QUEUE_TYPE },
{ .dev_type = AP_DEVICE_TYPE_CEX5, { .dev_type = AP_DEVICE_TYPE_CEX5,
.match_flags = AP_DEVICE_ID_MATCH_QUEUE_TYPE }, .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 */ }, { /* end of list */ },
}; };
...@@ -72,17 +76,25 @@ static int zcrypt_cex4_card_probe(struct ap_device *ap_dev) ...@@ -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 * MEX_1k, MEX_2k, MEX_4k, CRT_1k, CRT_2k, CRT_4k, RNG, SECKEY
*/ */
static const int CEX4A_SPEED_IDX[] = { 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[] = { 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[] = { 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[] = { 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[] = { 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[] = { 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 ap_card *ac = to_ap_card(&ap_dev->device);
struct zcrypt_card *zc; struct zcrypt_card *zc;
...@@ -99,11 +111,16 @@ static int zcrypt_cex4_card_probe(struct ap_device *ap_dev) ...@@ -99,11 +111,16 @@ static int zcrypt_cex4_card_probe(struct ap_device *ap_dev)
zc->user_space_type = ZCRYPT_CEX4; zc->user_space_type = ZCRYPT_CEX4;
memcpy(zc->speed_rating, CEX4A_SPEED_IDX, memcpy(zc->speed_rating, CEX4A_SPEED_IDX,
sizeof(CEX4A_SPEED_IDX)); sizeof(CEX4A_SPEED_IDX));
} else { } else if (ac->ap_dev.device_type == AP_DEVICE_TYPE_CEX5) {
zc->type_string = "CEX5A"; zc->type_string = "CEX5A";
zc->user_space_type = ZCRYPT_CEX5; zc->user_space_type = ZCRYPT_CEX5;
memcpy(zc->speed_rating, CEX5A_SPEED_IDX, memcpy(zc->speed_rating, CEX5A_SPEED_IDX,
sizeof(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; zc->min_mod_size = CEX4A_MIN_MOD_SIZE;
if (ap_test_bit(&ac->functions, AP_FUNC_MEX4K) && if (ap_test_bit(&ac->functions, AP_FUNC_MEX4K) &&
...@@ -125,7 +142,7 @@ static int zcrypt_cex4_card_probe(struct ap_device *ap_dev) ...@@ -125,7 +142,7 @@ static int zcrypt_cex4_card_probe(struct ap_device *ap_dev)
zc->user_space_type = ZCRYPT_CEX3C; zc->user_space_type = ZCRYPT_CEX3C;
memcpy(zc->speed_rating, CEX4C_SPEED_IDX, memcpy(zc->speed_rating, CEX4C_SPEED_IDX,
sizeof(CEX4C_SPEED_IDX)); sizeof(CEX4C_SPEED_IDX));
} else { } else if (ac->ap_dev.device_type == AP_DEVICE_TYPE_CEX5) {
zc->type_string = "CEX5C"; zc->type_string = "CEX5C";
/* wrong user space type, must be CEX5 /* wrong user space type, must be CEX5
* just keep it for cca compatibility * just keep it for cca compatibility
...@@ -133,6 +150,14 @@ static int zcrypt_cex4_card_probe(struct ap_device *ap_dev) ...@@ -133,6 +150,14 @@ static int zcrypt_cex4_card_probe(struct ap_device *ap_dev)
zc->user_space_type = ZCRYPT_CEX3C; zc->user_space_type = ZCRYPT_CEX3C;
memcpy(zc->speed_rating, CEX5C_SPEED_IDX, memcpy(zc->speed_rating, CEX5C_SPEED_IDX,
sizeof(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->min_mod_size = CEX4C_MIN_MOD_SIZE;
zc->max_mod_size = CEX4C_MAX_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) ...@@ -143,11 +168,16 @@ static int zcrypt_cex4_card_probe(struct ap_device *ap_dev)
zc->user_space_type = ZCRYPT_CEX4; zc->user_space_type = ZCRYPT_CEX4;
memcpy(zc->speed_rating, CEX4P_SPEED_IDX, memcpy(zc->speed_rating, CEX4P_SPEED_IDX,
sizeof(CEX4P_SPEED_IDX)); sizeof(CEX4P_SPEED_IDX));
} else { } else if (ac->ap_dev.device_type == AP_DEVICE_TYPE_CEX5) {
zc->type_string = "CEX5P"; zc->type_string = "CEX5P";
zc->user_space_type = ZCRYPT_CEX5; zc->user_space_type = ZCRYPT_CEX5;
memcpy(zc->speed_rating, CEX5P_SPEED_IDX, memcpy(zc->speed_rating, CEX5P_SPEED_IDX,
sizeof(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->min_mod_size = CEX4C_MIN_MOD_SIZE;
zc->max_mod_size = CEX4C_MAX_MOD_SIZE; zc->max_mod_size = CEX4C_MAX_MOD_SIZE;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment