1 /* 2 * AMD Cryptographic Coprocessor (CCP) driver 3 * 4 * Copyright (C) 2013,2017 Advanced Micro Devices, Inc. 5 * 6 * Author: Tom Lendacky <thomas.lendacky@amd.com> 7 * Author: Gary R Hook <gary.hook@amd.com> 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License version 2 as 11 * published by the Free Software Foundation. 12 */ 13 14 #ifndef __CCP_H__ 15 #define __CCP_H__ 16 17 #include <linux/scatterlist.h> 18 #include <linux/workqueue.h> 19 #include <linux/list.h> 20 #include <crypto/aes.h> 21 #include <crypto/sha.h> 22 23 struct ccp_device; 24 struct ccp_cmd; 25 26 #if defined(CONFIG_CRYPTO_DEV_SP_CCP) 27 28 /** 29 * ccp_present - check if a CCP device is present 30 * 31 * Returns zero if a CCP device is present, -ENODEV otherwise. 32 */ 33 int ccp_present(void); 34 35 #define CCP_VSIZE 16 36 #define CCP_VMASK ((unsigned int)((1 << CCP_VSIZE) - 1)) 37 #define CCP_VERSION(v, r) ((unsigned int)((v << CCP_VSIZE) \ 38 | (r & CCP_VMASK))) 39 40 /** 41 * ccp_version - get the version of the CCP 42 * 43 * Returns a positive version number, or zero if no CCP 44 */ 45 unsigned int ccp_version(void); 46 47 /** 48 * ccp_enqueue_cmd - queue an operation for processing by the CCP 49 * 50 * @cmd: ccp_cmd struct to be processed 51 * 52 * Refer to the ccp_cmd struct below for required fields. 53 * 54 * Queue a cmd to be processed by the CCP. If queueing the cmd 55 * would exceed the defined length of the cmd queue the cmd will 56 * only be queued if the CCP_CMD_MAY_BACKLOG flag is set and will 57 * result in a return code of -EBUSY. 58 * 59 * The callback routine specified in the ccp_cmd struct will be 60 * called to notify the caller of completion (if the cmd was not 61 * backlogged) or advancement out of the backlog. If the cmd has 62 * advanced out of the backlog the "err" value of the callback 63 * will be -EINPROGRESS. Any other "err" value during callback is 64 * the result of the operation. 65 * 66 * The cmd has been successfully queued if: 67 * the return code is -EINPROGRESS or 68 * the return code is -EBUSY and CCP_CMD_MAY_BACKLOG flag is set 69 */ 70 int ccp_enqueue_cmd(struct ccp_cmd *cmd); 71 72 #else /* CONFIG_CRYPTO_DEV_CCP_SP_DEV is not enabled */ 73 74 static inline int ccp_present(void) 75 { 76 return -ENODEV; 77 } 78 79 static inline unsigned int ccp_version(void) 80 { 81 return 0; 82 } 83 84 static inline int ccp_enqueue_cmd(struct ccp_cmd *cmd) 85 { 86 return -ENODEV; 87 } 88 89 #endif /* CONFIG_CRYPTO_DEV_SP_CCP */ 90 91 92 /***** AES engine *****/ 93 /** 94 * ccp_aes_type - AES key size 95 * 96 * @CCP_AES_TYPE_128: 128-bit key 97 * @CCP_AES_TYPE_192: 192-bit key 98 * @CCP_AES_TYPE_256: 256-bit key 99 */ 100 enum ccp_aes_type { 101 CCP_AES_TYPE_128 = 0, 102 CCP_AES_TYPE_192, 103 CCP_AES_TYPE_256, 104 CCP_AES_TYPE__LAST, 105 }; 106 107 /** 108 * ccp_aes_mode - AES operation mode 109 * 110 * @CCP_AES_MODE_ECB: ECB mode 111 * @CCP_AES_MODE_CBC: CBC mode 112 * @CCP_AES_MODE_OFB: OFB mode 113 * @CCP_AES_MODE_CFB: CFB mode 114 * @CCP_AES_MODE_CTR: CTR mode 115 * @CCP_AES_MODE_CMAC: CMAC mode 116 */ 117 enum ccp_aes_mode { 118 CCP_AES_MODE_ECB = 0, 119 CCP_AES_MODE_CBC, 120 CCP_AES_MODE_OFB, 121 CCP_AES_MODE_CFB, 122 CCP_AES_MODE_CTR, 123 CCP_AES_MODE_CMAC, 124 CCP_AES_MODE_GHASH, 125 CCP_AES_MODE_GCTR, 126 CCP_AES_MODE_GCM, 127 CCP_AES_MODE_GMAC, 128 CCP_AES_MODE__LAST, 129 }; 130 131 /** 132 * ccp_aes_mode - AES operation mode 133 * 134 * @CCP_AES_ACTION_DECRYPT: AES decrypt operation 135 * @CCP_AES_ACTION_ENCRYPT: AES encrypt operation 136 */ 137 enum ccp_aes_action { 138 CCP_AES_ACTION_DECRYPT = 0, 139 CCP_AES_ACTION_ENCRYPT, 140 CCP_AES_ACTION__LAST, 141 }; 142 /* Overloaded field */ 143 #define CCP_AES_GHASHAAD CCP_AES_ACTION_DECRYPT 144 #define CCP_AES_GHASHFINAL CCP_AES_ACTION_ENCRYPT 145 146 /** 147 * struct ccp_aes_engine - CCP AES operation 148 * @type: AES operation key size 149 * @mode: AES operation mode 150 * @action: AES operation (decrypt/encrypt) 151 * @key: key to be used for this AES operation 152 * @key_len: length in bytes of key 153 * @iv: IV to be used for this AES operation 154 * @iv_len: length in bytes of iv 155 * @src: data to be used for this operation 156 * @dst: data produced by this operation 157 * @src_len: length in bytes of data used for this operation 158 * @cmac_final: indicates final operation when running in CMAC mode 159 * @cmac_key: K1/K2 key used in final CMAC operation 160 * @cmac_key_len: length in bytes of cmac_key 161 * 162 * Variables required to be set when calling ccp_enqueue_cmd(): 163 * - type, mode, action, key, key_len, src, dst, src_len 164 * - iv, iv_len for any mode other than ECB 165 * - cmac_final for CMAC mode 166 * - cmac_key, cmac_key_len for CMAC mode if cmac_final is non-zero 167 * 168 * The iv variable is used as both input and output. On completion of the 169 * AES operation the new IV overwrites the old IV. 170 */ 171 struct ccp_aes_engine { 172 enum ccp_aes_type type; 173 enum ccp_aes_mode mode; 174 enum ccp_aes_action action; 175 176 struct scatterlist *key; 177 u32 key_len; /* In bytes */ 178 179 struct scatterlist *iv; 180 u32 iv_len; /* In bytes */ 181 182 struct scatterlist *src, *dst; 183 u64 src_len; /* In bytes */ 184 185 u32 cmac_final; /* Indicates final cmac cmd */ 186 struct scatterlist *cmac_key; /* K1/K2 cmac key required for 187 * final cmac cmd */ 188 u32 cmac_key_len; /* In bytes */ 189 190 u32 aad_len; /* In bytes */ 191 }; 192 193 /***** XTS-AES engine *****/ 194 /** 195 * ccp_xts_aes_unit_size - XTS unit size 196 * 197 * @CCP_XTS_AES_UNIT_SIZE_16: Unit size of 16 bytes 198 * @CCP_XTS_AES_UNIT_SIZE_512: Unit size of 512 bytes 199 * @CCP_XTS_AES_UNIT_SIZE_1024: Unit size of 1024 bytes 200 * @CCP_XTS_AES_UNIT_SIZE_2048: Unit size of 2048 bytes 201 * @CCP_XTS_AES_UNIT_SIZE_4096: Unit size of 4096 bytes 202 */ 203 enum ccp_xts_aes_unit_size { 204 CCP_XTS_AES_UNIT_SIZE_16 = 0, 205 CCP_XTS_AES_UNIT_SIZE_512, 206 CCP_XTS_AES_UNIT_SIZE_1024, 207 CCP_XTS_AES_UNIT_SIZE_2048, 208 CCP_XTS_AES_UNIT_SIZE_4096, 209 CCP_XTS_AES_UNIT_SIZE__LAST, 210 }; 211 212 /** 213 * struct ccp_xts_aes_engine - CCP XTS AES operation 214 * @action: AES operation (decrypt/encrypt) 215 * @unit_size: unit size of the XTS operation 216 * @key: key to be used for this XTS AES operation 217 * @key_len: length in bytes of key 218 * @iv: IV to be used for this XTS AES operation 219 * @iv_len: length in bytes of iv 220 * @src: data to be used for this operation 221 * @dst: data produced by this operation 222 * @src_len: length in bytes of data used for this operation 223 * @final: indicates final XTS operation 224 * 225 * Variables required to be set when calling ccp_enqueue_cmd(): 226 * - action, unit_size, key, key_len, iv, iv_len, src, dst, src_len, final 227 * 228 * The iv variable is used as both input and output. On completion of the 229 * AES operation the new IV overwrites the old IV. 230 */ 231 struct ccp_xts_aes_engine { 232 enum ccp_aes_type type; 233 enum ccp_aes_action action; 234 enum ccp_xts_aes_unit_size unit_size; 235 236 struct scatterlist *key; 237 u32 key_len; /* In bytes */ 238 239 struct scatterlist *iv; 240 u32 iv_len; /* In bytes */ 241 242 struct scatterlist *src, *dst; 243 u64 src_len; /* In bytes */ 244 245 u32 final; 246 }; 247 248 /***** SHA engine *****/ 249 /** 250 * ccp_sha_type - type of SHA operation 251 * 252 * @CCP_SHA_TYPE_1: SHA-1 operation 253 * @CCP_SHA_TYPE_224: SHA-224 operation 254 * @CCP_SHA_TYPE_256: SHA-256 operation 255 */ 256 enum ccp_sha_type { 257 CCP_SHA_TYPE_1 = 1, 258 CCP_SHA_TYPE_224, 259 CCP_SHA_TYPE_256, 260 CCP_SHA_TYPE_384, 261 CCP_SHA_TYPE_512, 262 CCP_SHA_TYPE__LAST, 263 }; 264 265 /** 266 * struct ccp_sha_engine - CCP SHA operation 267 * @type: Type of SHA operation 268 * @ctx: current hash value 269 * @ctx_len: length in bytes of hash value 270 * @src: data to be used for this operation 271 * @src_len: length in bytes of data used for this operation 272 * @opad: data to be used for final HMAC operation 273 * @opad_len: length in bytes of data used for final HMAC operation 274 * @first: indicates first SHA operation 275 * @final: indicates final SHA operation 276 * @msg_bits: total length of the message in bits used in final SHA operation 277 * 278 * Variables required to be set when calling ccp_enqueue_cmd(): 279 * - type, ctx, ctx_len, src, src_len, final 280 * - msg_bits if final is non-zero 281 * 282 * The ctx variable is used as both input and output. On completion of the 283 * SHA operation the new hash value overwrites the old hash value. 284 */ 285 struct ccp_sha_engine { 286 enum ccp_sha_type type; 287 288 struct scatterlist *ctx; 289 u32 ctx_len; /* In bytes */ 290 291 struct scatterlist *src; 292 u64 src_len; /* In bytes */ 293 294 struct scatterlist *opad; 295 u32 opad_len; /* In bytes */ 296 297 u32 first; /* Indicates first sha cmd */ 298 u32 final; /* Indicates final sha cmd */ 299 u64 msg_bits; /* Message length in bits required for 300 * final sha cmd */ 301 }; 302 303 /***** 3DES engine *****/ 304 enum ccp_des3_mode { 305 CCP_DES3_MODE_ECB = 0, 306 CCP_DES3_MODE_CBC, 307 CCP_DES3_MODE_CFB, 308 CCP_DES3_MODE__LAST, 309 }; 310 311 enum ccp_des3_type { 312 CCP_DES3_TYPE_168 = 1, 313 CCP_DES3_TYPE__LAST, 314 }; 315 316 enum ccp_des3_action { 317 CCP_DES3_ACTION_DECRYPT = 0, 318 CCP_DES3_ACTION_ENCRYPT, 319 CCP_DES3_ACTION__LAST, 320 }; 321 322 /** 323 * struct ccp_des3_engine - CCP SHA operation 324 * @type: Type of 3DES operation 325 * @mode: cipher mode 326 * @action: 3DES operation (decrypt/encrypt) 327 * @key: key to be used for this 3DES operation 328 * @key_len: length of key (in bytes) 329 * @iv: IV to be used for this AES operation 330 * @iv_len: length in bytes of iv 331 * @src: input data to be used for this operation 332 * @src_len: length of input data used for this operation (in bytes) 333 * @dst: output data produced by this operation 334 * 335 * Variables required to be set when calling ccp_enqueue_cmd(): 336 * - type, mode, action, key, key_len, src, dst, src_len 337 * - iv, iv_len for any mode other than ECB 338 * 339 * The iv variable is used as both input and output. On completion of the 340 * 3DES operation the new IV overwrites the old IV. 341 */ 342 struct ccp_des3_engine { 343 enum ccp_des3_type type; 344 enum ccp_des3_mode mode; 345 enum ccp_des3_action action; 346 347 struct scatterlist *key; 348 u32 key_len; /* In bytes */ 349 350 struct scatterlist *iv; 351 u32 iv_len; /* In bytes */ 352 353 struct scatterlist *src, *dst; 354 u64 src_len; /* In bytes */ 355 }; 356 357 /***** RSA engine *****/ 358 /** 359 * struct ccp_rsa_engine - CCP RSA operation 360 * @key_size: length in bits of RSA key 361 * @exp: RSA exponent 362 * @exp_len: length in bytes of exponent 363 * @mod: RSA modulus 364 * @mod_len: length in bytes of modulus 365 * @src: data to be used for this operation 366 * @dst: data produced by this operation 367 * @src_len: length in bytes of data used for this operation 368 * 369 * Variables required to be set when calling ccp_enqueue_cmd(): 370 * - key_size, exp, exp_len, mod, mod_len, src, dst, src_len 371 */ 372 struct ccp_rsa_engine { 373 u32 key_size; /* In bits */ 374 375 struct scatterlist *exp; 376 u32 exp_len; /* In bytes */ 377 378 struct scatterlist *mod; 379 u32 mod_len; /* In bytes */ 380 381 struct scatterlist *src, *dst; 382 u32 src_len; /* In bytes */ 383 }; 384 385 /***** Passthru engine *****/ 386 /** 387 * ccp_passthru_bitwise - type of bitwise passthru operation 388 * 389 * @CCP_PASSTHRU_BITWISE_NOOP: no bitwise operation performed 390 * @CCP_PASSTHRU_BITWISE_AND: perform bitwise AND of src with mask 391 * @CCP_PASSTHRU_BITWISE_OR: perform bitwise OR of src with mask 392 * @CCP_PASSTHRU_BITWISE_XOR: perform bitwise XOR of src with mask 393 * @CCP_PASSTHRU_BITWISE_MASK: overwrite with mask 394 */ 395 enum ccp_passthru_bitwise { 396 CCP_PASSTHRU_BITWISE_NOOP = 0, 397 CCP_PASSTHRU_BITWISE_AND, 398 CCP_PASSTHRU_BITWISE_OR, 399 CCP_PASSTHRU_BITWISE_XOR, 400 CCP_PASSTHRU_BITWISE_MASK, 401 CCP_PASSTHRU_BITWISE__LAST, 402 }; 403 404 /** 405 * ccp_passthru_byteswap - type of byteswap passthru operation 406 * 407 * @CCP_PASSTHRU_BYTESWAP_NOOP: no byte swapping performed 408 * @CCP_PASSTHRU_BYTESWAP_32BIT: swap bytes within 32-bit words 409 * @CCP_PASSTHRU_BYTESWAP_256BIT: swap bytes within 256-bit words 410 */ 411 enum ccp_passthru_byteswap { 412 CCP_PASSTHRU_BYTESWAP_NOOP = 0, 413 CCP_PASSTHRU_BYTESWAP_32BIT, 414 CCP_PASSTHRU_BYTESWAP_256BIT, 415 CCP_PASSTHRU_BYTESWAP__LAST, 416 }; 417 418 /** 419 * struct ccp_passthru_engine - CCP pass-through operation 420 * @bit_mod: bitwise operation to perform 421 * @byte_swap: byteswap operation to perform 422 * @mask: mask to be applied to data 423 * @mask_len: length in bytes of mask 424 * @src: data to be used for this operation 425 * @dst: data produced by this operation 426 * @src_len: length in bytes of data used for this operation 427 * @final: indicate final pass-through operation 428 * 429 * Variables required to be set when calling ccp_enqueue_cmd(): 430 * - bit_mod, byte_swap, src, dst, src_len 431 * - mask, mask_len if bit_mod is not CCP_PASSTHRU_BITWISE_NOOP 432 */ 433 struct ccp_passthru_engine { 434 enum ccp_passthru_bitwise bit_mod; 435 enum ccp_passthru_byteswap byte_swap; 436 437 struct scatterlist *mask; 438 u32 mask_len; /* In bytes */ 439 440 struct scatterlist *src, *dst; 441 u64 src_len; /* In bytes */ 442 443 u32 final; 444 }; 445 446 /** 447 * struct ccp_passthru_nomap_engine - CCP pass-through operation 448 * without performing DMA mapping 449 * @bit_mod: bitwise operation to perform 450 * @byte_swap: byteswap operation to perform 451 * @mask: mask to be applied to data 452 * @mask_len: length in bytes of mask 453 * @src: data to be used for this operation 454 * @dst: data produced by this operation 455 * @src_len: length in bytes of data used for this operation 456 * @final: indicate final pass-through operation 457 * 458 * Variables required to be set when calling ccp_enqueue_cmd(): 459 * - bit_mod, byte_swap, src, dst, src_len 460 * - mask, mask_len if bit_mod is not CCP_PASSTHRU_BITWISE_NOOP 461 */ 462 struct ccp_passthru_nomap_engine { 463 enum ccp_passthru_bitwise bit_mod; 464 enum ccp_passthru_byteswap byte_swap; 465 466 dma_addr_t mask; 467 u32 mask_len; /* In bytes */ 468 469 dma_addr_t src_dma, dst_dma; 470 u64 src_len; /* In bytes */ 471 472 u32 final; 473 }; 474 475 /***** ECC engine *****/ 476 #define CCP_ECC_MODULUS_BYTES 48 /* 384-bits */ 477 #define CCP_ECC_MAX_OPERANDS 6 478 #define CCP_ECC_MAX_OUTPUTS 3 479 480 /** 481 * ccp_ecc_function - type of ECC function 482 * 483 * @CCP_ECC_FUNCTION_MMUL_384BIT: 384-bit modular multiplication 484 * @CCP_ECC_FUNCTION_MADD_384BIT: 384-bit modular addition 485 * @CCP_ECC_FUNCTION_MINV_384BIT: 384-bit multiplicative inverse 486 * @CCP_ECC_FUNCTION_PADD_384BIT: 384-bit point addition 487 * @CCP_ECC_FUNCTION_PMUL_384BIT: 384-bit point multiplication 488 * @CCP_ECC_FUNCTION_PDBL_384BIT: 384-bit point doubling 489 */ 490 enum ccp_ecc_function { 491 CCP_ECC_FUNCTION_MMUL_384BIT = 0, 492 CCP_ECC_FUNCTION_MADD_384BIT, 493 CCP_ECC_FUNCTION_MINV_384BIT, 494 CCP_ECC_FUNCTION_PADD_384BIT, 495 CCP_ECC_FUNCTION_PMUL_384BIT, 496 CCP_ECC_FUNCTION_PDBL_384BIT, 497 }; 498 499 /** 500 * struct ccp_ecc_modular_math - CCP ECC modular math parameters 501 * @operand_1: first operand for the modular math operation 502 * @operand_1_len: length of the first operand 503 * @operand_2: second operand for the modular math operation 504 * (not used for CCP_ECC_FUNCTION_MINV_384BIT) 505 * @operand_2_len: length of the second operand 506 * (not used for CCP_ECC_FUNCTION_MINV_384BIT) 507 * @result: result of the modular math operation 508 * @result_len: length of the supplied result buffer 509 */ 510 struct ccp_ecc_modular_math { 511 struct scatterlist *operand_1; 512 unsigned int operand_1_len; /* In bytes */ 513 514 struct scatterlist *operand_2; 515 unsigned int operand_2_len; /* In bytes */ 516 517 struct scatterlist *result; 518 unsigned int result_len; /* In bytes */ 519 }; 520 521 /** 522 * struct ccp_ecc_point - CCP ECC point definition 523 * @x: the x coordinate of the ECC point 524 * @x_len: the length of the x coordinate 525 * @y: the y coordinate of the ECC point 526 * @y_len: the length of the y coordinate 527 */ 528 struct ccp_ecc_point { 529 struct scatterlist *x; 530 unsigned int x_len; /* In bytes */ 531 532 struct scatterlist *y; 533 unsigned int y_len; /* In bytes */ 534 }; 535 536 /** 537 * struct ccp_ecc_point_math - CCP ECC point math parameters 538 * @point_1: the first point of the ECC point math operation 539 * @point_2: the second point of the ECC point math operation 540 * (only used for CCP_ECC_FUNCTION_PADD_384BIT) 541 * @domain_a: the a parameter of the ECC curve 542 * @domain_a_len: the length of the a parameter 543 * @scalar: the scalar parameter for the point match operation 544 * (only used for CCP_ECC_FUNCTION_PMUL_384BIT) 545 * @scalar_len: the length of the scalar parameter 546 * (only used for CCP_ECC_FUNCTION_PMUL_384BIT) 547 * @result: the point resulting from the point math operation 548 */ 549 struct ccp_ecc_point_math { 550 struct ccp_ecc_point point_1; 551 struct ccp_ecc_point point_2; 552 553 struct scatterlist *domain_a; 554 unsigned int domain_a_len; /* In bytes */ 555 556 struct scatterlist *scalar; 557 unsigned int scalar_len; /* In bytes */ 558 559 struct ccp_ecc_point result; 560 }; 561 562 /** 563 * struct ccp_ecc_engine - CCP ECC operation 564 * @function: ECC function to perform 565 * @mod: ECC modulus 566 * @mod_len: length in bytes of modulus 567 * @mm: module math parameters 568 * @pm: point math parameters 569 * @ecc_result: result of the ECC operation 570 * 571 * Variables required to be set when calling ccp_enqueue_cmd(): 572 * - function, mod, mod_len 573 * - operand, operand_len, operand_count, output, output_len, output_count 574 * - ecc_result 575 */ 576 struct ccp_ecc_engine { 577 enum ccp_ecc_function function; 578 579 struct scatterlist *mod; 580 u32 mod_len; /* In bytes */ 581 582 union { 583 struct ccp_ecc_modular_math mm; 584 struct ccp_ecc_point_math pm; 585 } u; 586 587 u16 ecc_result; 588 }; 589 590 591 /** 592 * ccp_engine - CCP operation identifiers 593 * 594 * @CCP_ENGINE_AES: AES operation 595 * @CCP_ENGINE_XTS_AES: 128-bit XTS AES operation 596 * @CCP_ENGINE_RSVD1: unused 597 * @CCP_ENGINE_SHA: SHA operation 598 * @CCP_ENGINE_RSA: RSA operation 599 * @CCP_ENGINE_PASSTHRU: pass-through operation 600 * @CCP_ENGINE_ZLIB_DECOMPRESS: unused 601 * @CCP_ENGINE_ECC: ECC operation 602 */ 603 enum ccp_engine { 604 CCP_ENGINE_AES = 0, 605 CCP_ENGINE_XTS_AES_128, 606 CCP_ENGINE_DES3, 607 CCP_ENGINE_SHA, 608 CCP_ENGINE_RSA, 609 CCP_ENGINE_PASSTHRU, 610 CCP_ENGINE_ZLIB_DECOMPRESS, 611 CCP_ENGINE_ECC, 612 CCP_ENGINE__LAST, 613 }; 614 615 /* Flag values for flags member of ccp_cmd */ 616 #define CCP_CMD_MAY_BACKLOG 0x00000001 617 #define CCP_CMD_PASSTHRU_NO_DMA_MAP 0x00000002 618 619 /** 620 * struct ccp_cmd - CCP operation request 621 * @entry: list element (ccp driver use only) 622 * @work: work element used for callbacks (ccp driver use only) 623 * @ccp: CCP device to be run on 624 * @ret: operation return code (ccp driver use only) 625 * @flags: cmd processing flags 626 * @engine: CCP operation to perform 627 * @engine_error: CCP engine return code 628 * @u: engine specific structures, refer to specific engine struct below 629 * @callback: operation completion callback function 630 * @data: parameter value to be supplied to the callback function 631 * 632 * Variables required to be set when calling ccp_enqueue_cmd(): 633 * - engine, callback 634 * - See the operation structures below for what is required for each 635 * operation. 636 */ 637 struct ccp_cmd { 638 /* The list_head, work_struct, ccp and ret variables are for use 639 * by the CCP driver only. 640 */ 641 struct list_head entry; 642 struct work_struct work; 643 struct ccp_device *ccp; 644 int ret; 645 646 u32 flags; 647 648 enum ccp_engine engine; 649 u32 engine_error; 650 651 union { 652 struct ccp_aes_engine aes; 653 struct ccp_xts_aes_engine xts; 654 struct ccp_des3_engine des3; 655 struct ccp_sha_engine sha; 656 struct ccp_rsa_engine rsa; 657 struct ccp_passthru_engine passthru; 658 struct ccp_passthru_nomap_engine passthru_nomap; 659 struct ccp_ecc_engine ecc; 660 } u; 661 662 /* Completion callback support */ 663 void (*callback)(void *data, int err); 664 void *data; 665 }; 666 667 #endif 668