root/drivers/crypto/hisilicon/sec/sec_drv.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /* Copyright (c) 2016-2017 Hisilicon Limited. */
   3 
   4 #ifndef _SEC_DRV_H_
   5 #define _SEC_DRV_H_
   6 
   7 #include <crypto/algapi.h>
   8 #include <linux/kfifo.h>
   9 
  10 #define SEC_MAX_SGE_NUM                 64
  11 #define SEC_HW_RING_NUM                 3
  12 
  13 #define SEC_CMD_RING                    0
  14 #define SEC_OUTORDER_RING               1
  15 #define SEC_DBG_RING                    2
  16 
  17 /* A reasonable length to balance memory use against flexibility */
  18 #define SEC_QUEUE_LEN                   512
  19 
  20 #define SEC_MAX_SGE_NUM   64
  21 
  22 struct sec_bd_info {
  23 #define SEC_BD_W0_T_LEN_M                       GENMASK(4, 0)
  24 #define SEC_BD_W0_T_LEN_S                       0
  25 
  26 #define SEC_BD_W0_C_WIDTH_M                     GENMASK(6, 5)
  27 #define SEC_BD_W0_C_WIDTH_S                     5
  28 #define   SEC_C_WIDTH_AES_128BIT                0
  29 #define   SEC_C_WIDTH_AES_8BIT          1
  30 #define   SEC_C_WIDTH_AES_1BIT          2
  31 #define   SEC_C_WIDTH_DES_64BIT         0
  32 #define   SEC_C_WIDTH_DES_8BIT          1
  33 #define   SEC_C_WIDTH_DES_1BIT          2
  34 
  35 #define SEC_BD_W0_C_MODE_M                      GENMASK(9, 7)
  36 #define SEC_BD_W0_C_MODE_S                      7
  37 #define   SEC_C_MODE_ECB                        0
  38 #define   SEC_C_MODE_CBC                        1
  39 #define   SEC_C_MODE_CTR                        4
  40 #define   SEC_C_MODE_CCM                        5
  41 #define   SEC_C_MODE_GCM                        6
  42 #define   SEC_C_MODE_XTS                        7
  43 
  44 #define SEC_BD_W0_SEQ                           BIT(10)
  45 #define SEC_BD_W0_DE                            BIT(11)
  46 #define SEC_BD_W0_DAT_SKIP_M                    GENMASK(13, 12)
  47 #define SEC_BD_W0_DAT_SKIP_S                    12
  48 #define SEC_BD_W0_C_GRAN_SIZE_19_16_M           GENMASK(17, 14)
  49 #define SEC_BD_W0_C_GRAN_SIZE_19_16_S           14
  50 
  51 #define SEC_BD_W0_CIPHER_M                      GENMASK(19, 18)
  52 #define SEC_BD_W0_CIPHER_S                      18
  53 #define   SEC_CIPHER_NULL                       0
  54 #define   SEC_CIPHER_ENCRYPT                    1
  55 #define   SEC_CIPHER_DECRYPT                    2
  56 
  57 #define SEC_BD_W0_AUTH_M                        GENMASK(21, 20)
  58 #define SEC_BD_W0_AUTH_S                        20
  59 #define   SEC_AUTH_NULL                         0
  60 #define   SEC_AUTH_MAC                          1
  61 #define   SEC_AUTH_VERIF                        2
  62 
  63 #define SEC_BD_W0_AI_GEN                        BIT(22)
  64 #define SEC_BD_W0_CI_GEN                        BIT(23)
  65 #define SEC_BD_W0_NO_HPAD                       BIT(24)
  66 #define SEC_BD_W0_HM_M                          GENMASK(26, 25)
  67 #define SEC_BD_W0_HM_S                          25
  68 #define SEC_BD_W0_ICV_OR_SKEY_EN_M              GENMASK(28, 27)
  69 #define SEC_BD_W0_ICV_OR_SKEY_EN_S              27
  70 
  71 /* Multi purpose field - gran size bits for send, flag for recv */
  72 #define SEC_BD_W0_FLAG_M                        GENMASK(30, 29)
  73 #define SEC_BD_W0_C_GRAN_SIZE_21_20_M           GENMASK(30, 29)
  74 #define SEC_BD_W0_FLAG_S                        29
  75 #define SEC_BD_W0_C_GRAN_SIZE_21_20_S           29
  76 
  77 #define SEC_BD_W0_DONE                          BIT(31)
  78         u32 w0;
  79 
  80 #define SEC_BD_W1_AUTH_GRAN_SIZE_M              GENMASK(21, 0)
  81 #define SEC_BD_W1_AUTH_GRAN_SIZE_S              0
  82 #define SEC_BD_W1_M_KEY_EN                      BIT(22)
  83 #define SEC_BD_W1_BD_INVALID                    BIT(23)
  84 #define SEC_BD_W1_ADDR_TYPE                     BIT(24)
  85 
  86 #define SEC_BD_W1_A_ALG_M                       GENMASK(28, 25)
  87 #define SEC_BD_W1_A_ALG_S                       25
  88 #define   SEC_A_ALG_SHA1                        0
  89 #define   SEC_A_ALG_SHA256                      1
  90 #define   SEC_A_ALG_MD5                         2
  91 #define   SEC_A_ALG_SHA224                      3
  92 #define   SEC_A_ALG_HMAC_SHA1                   8
  93 #define   SEC_A_ALG_HMAC_SHA224                 10
  94 #define   SEC_A_ALG_HMAC_SHA256                 11
  95 #define   SEC_A_ALG_HMAC_MD5                    12
  96 #define   SEC_A_ALG_AES_XCBC                    13
  97 #define   SEC_A_ALG_AES_CMAC                    14
  98 
  99 #define SEC_BD_W1_C_ALG_M                       GENMASK(31, 29)
 100 #define SEC_BD_W1_C_ALG_S                       29
 101 #define   SEC_C_ALG_DES                         0
 102 #define   SEC_C_ALG_3DES                        1
 103 #define   SEC_C_ALG_AES                         2
 104 
 105         u32 w1;
 106 
 107 #define SEC_BD_W2_C_GRAN_SIZE_15_0_M            GENMASK(15, 0)
 108 #define SEC_BD_W2_C_GRAN_SIZE_15_0_S            0
 109 #define SEC_BD_W2_GRAN_NUM_M                    GENMASK(31, 16)
 110 #define SEC_BD_W2_GRAN_NUM_S                    16
 111         u32 w2;
 112 
 113 #define SEC_BD_W3_AUTH_LEN_OFFSET_M             GENMASK(9, 0)
 114 #define SEC_BD_W3_AUTH_LEN_OFFSET_S             0
 115 #define SEC_BD_W3_CIPHER_LEN_OFFSET_M           GENMASK(19, 10)
 116 #define SEC_BD_W3_CIPHER_LEN_OFFSET_S           10
 117 #define SEC_BD_W3_MAC_LEN_M                     GENMASK(24, 20)
 118 #define SEC_BD_W3_MAC_LEN_S                     20
 119 #define SEC_BD_W3_A_KEY_LEN_M                   GENMASK(29, 25)
 120 #define SEC_BD_W3_A_KEY_LEN_S                   25
 121 #define SEC_BD_W3_C_KEY_LEN_M                   GENMASK(31, 30)
 122 #define SEC_BD_W3_C_KEY_LEN_S                   30
 123 #define   SEC_KEY_LEN_AES_128                   0
 124 #define   SEC_KEY_LEN_AES_192                   1
 125 #define   SEC_KEY_LEN_AES_256                   2
 126 #define   SEC_KEY_LEN_DES                       1
 127 #define   SEC_KEY_LEN_3DES_3_KEY                1
 128 #define   SEC_KEY_LEN_3DES_2_KEY                3
 129         u32 w3;
 130 
 131         /* W4,5 */
 132         union {
 133                 u32 authkey_addr_lo;
 134                 u32 authiv_addr_lo;
 135         };
 136         union {
 137                 u32 authkey_addr_hi;
 138                 u32 authiv_addr_hi;
 139         };
 140 
 141         /* W6,7 */
 142         u32 cipher_key_addr_lo;
 143         u32 cipher_key_addr_hi;
 144 
 145         /* W8,9 */
 146         u32 cipher_iv_addr_lo;
 147         u32 cipher_iv_addr_hi;
 148 
 149         /* W10,11 */
 150         u32 data_addr_lo;
 151         u32 data_addr_hi;
 152 
 153         /* W12,13 */
 154         u32 mac_addr_lo;
 155         u32 mac_addr_hi;
 156 
 157         /* W14,15 */
 158         u32 cipher_destin_addr_lo;
 159         u32 cipher_destin_addr_hi;
 160 };
 161 
 162 enum sec_mem_region {
 163         SEC_COMMON = 0,
 164         SEC_SAA,
 165         SEC_NUM_ADDR_REGIONS
 166 };
 167 
 168 #define SEC_NAME_SIZE                           64
 169 #define SEC_Q_NUM                               16
 170 
 171 
 172 /**
 173  * struct sec_queue_ring_cmd - store information about a SEC HW cmd ring
 174  * @used: Local counter used to cheaply establish if the ring is empty.
 175  * @lock: Protect against simultaneous adjusting of the read and write pointers.
 176  * @vaddr: Virtual address for the ram pages used for the ring.
 177  * @paddr: Physical address of the dma mapped region of ram used for the ring.
 178  * @callback: Callback function called on a ring element completing.
 179  */
 180 struct sec_queue_ring_cmd {
 181         atomic_t used;
 182         struct mutex lock;
 183         struct sec_bd_info *vaddr;
 184         dma_addr_t paddr;
 185         void (*callback)(struct sec_bd_info *resp, void *ctx);
 186 };
 187 
 188 struct sec_debug_bd_info;
 189 struct sec_queue_ring_db {
 190         struct sec_debug_bd_info *vaddr;
 191         dma_addr_t paddr;
 192 };
 193 
 194 struct sec_out_bd_info;
 195 struct sec_queue_ring_cq {
 196         struct sec_out_bd_info *vaddr;
 197         dma_addr_t paddr;
 198 };
 199 
 200 struct sec_dev_info;
 201 
 202 enum sec_cipher_alg {
 203         SEC_C_DES_ECB_64,
 204         SEC_C_DES_CBC_64,
 205 
 206         SEC_C_3DES_ECB_192_3KEY,
 207         SEC_C_3DES_ECB_192_2KEY,
 208 
 209         SEC_C_3DES_CBC_192_3KEY,
 210         SEC_C_3DES_CBC_192_2KEY,
 211 
 212         SEC_C_AES_ECB_128,
 213         SEC_C_AES_ECB_192,
 214         SEC_C_AES_ECB_256,
 215 
 216         SEC_C_AES_CBC_128,
 217         SEC_C_AES_CBC_192,
 218         SEC_C_AES_CBC_256,
 219 
 220         SEC_C_AES_CTR_128,
 221         SEC_C_AES_CTR_192,
 222         SEC_C_AES_CTR_256,
 223 
 224         SEC_C_AES_XTS_128,
 225         SEC_C_AES_XTS_256,
 226 
 227         SEC_C_NULL,
 228 };
 229 
 230 /**
 231  * struct sec_alg_tfm_ctx - hardware specific tranformation context
 232  * @cipher_alg: Cipher algorithm enabled include encryption mode.
 233  * @key: Key storage if required.
 234  * @pkey: DMA address for the key storage.
 235  * @req_template: Request template to save time on setup.
 236  * @queue: The hardware queue associated with this tfm context.
 237  * @lock: Protect key and pkey to ensure they are consistent
 238  * @auth_buf: Current context buffer for auth operations.
 239  * @backlog: The backlog queue used for cases where our buffers aren't
 240  * large enough.
 241  */
 242 struct sec_alg_tfm_ctx {
 243         enum sec_cipher_alg cipher_alg;
 244         u8 *key;
 245         dma_addr_t pkey;
 246         struct sec_bd_info req_template;
 247         struct sec_queue *queue;
 248         struct mutex lock;
 249         u8 *auth_buf;
 250         struct list_head backlog;
 251 };
 252 
 253 /**
 254  * struct sec_request - data associate with a single crypto request
 255  * @elements: List of subparts of this request (hardware size restriction)
 256  * @num_elements: The number of subparts (used as an optimization)
 257  * @lock: Protect elements of this structure against concurrent change.
 258  * @tfm_ctx: hardware specific context.
 259  * @len_in: length of in sgl from upper layers
 260  * @len_out: length of out sgl from upper layers
 261  * @dma_iv: initialization vector - phsyical address
 262  * @err: store used to track errors across subelements of this request.
 263  * @req_base: pointer to base element of associate crypto context.
 264  * This is needed to allow shared handling skcipher, ahash etc.
 265  * @cb: completion callback.
 266  * @backlog_head: list head to allow backlog maintenance.
 267  *
 268  * The hardware is limited in the maximum size of data that it can
 269  * process from a single BD.  Typically this is fairly large (32MB)
 270  * but still requires the complexity of splitting the incoming
 271  * skreq up into a number of elements complete with appropriate
 272  * iv chaining.
 273  */
 274 struct sec_request {
 275         struct list_head elements;
 276         int num_elements;
 277         struct mutex lock;
 278         struct sec_alg_tfm_ctx *tfm_ctx;
 279         int len_in;
 280         int len_out;
 281         dma_addr_t dma_iv;
 282         int err;
 283         struct crypto_async_request *req_base;
 284         void (*cb)(struct sec_bd_info *resp, struct crypto_async_request *req);
 285         struct list_head backlog_head;
 286 };
 287 
 288 /**
 289  * struct sec_request_el - A subpart of a request.
 290  * @head: allow us to attach this to the list in the sec_request
 291  * @req: hardware block descriptor corresponding to this request subpart
 292  * @in: hardware sgl for input - virtual address
 293  * @dma_in: hardware sgl for input - physical address
 294  * @sgl_in: scatterlist for this request subpart
 295  * @out: hardware sgl for output - virtual address
 296  * @dma_out: hardware sgl for output - physical address
 297  * @sgl_out: scatterlist for this request subpart
 298  * @sec_req: The request which this subpart forms a part of
 299  * @el_length: Number of bytes in this subpart. Needed to locate
 300  * last ivsize chunk for iv chaining.
 301  */
 302 struct sec_request_el {
 303         struct list_head head;
 304         struct sec_bd_info req;
 305         struct sec_hw_sgl *in;
 306         dma_addr_t dma_in;
 307         struct scatterlist *sgl_in;
 308         struct sec_hw_sgl *out;
 309         dma_addr_t dma_out;
 310         struct scatterlist *sgl_out;
 311         struct sec_request *sec_req;
 312         size_t el_length;
 313 };
 314 
 315 /**
 316  * struct sec_queue - All the information about a HW queue
 317  * @dev_info: The parent SEC device to which this queue belongs.
 318  * @task_irq: Completion interrupt for the queue.
 319  * @name: Human readable queue description also used as irq name.
 320  * @ring: The several HW rings associated with one queue.
 321  * @regs: The iomapped device registers
 322  * @queue_id: Index of the queue used for naming and resource selection.
 323  * @in_use: Flag to say if the queue is in use.
 324  * @expected: The next expected element to finish assuming we were in order.
 325  * @uprocessed: A bitmap to track which OoO elements are done but not handled.
 326  * @softqueue: A software queue used when chaining requirements prevent direct
 327  *   use of the hardware queues.
 328  * @havesoftqueue: A flag to say we have a queues - as we may need one for the
 329  *   current mode.
 330  * @queuelock: Protect the soft queue from concurrent changes to avoid some
 331  *   potential loss of data races.
 332  * @shadow: Pointers back to the shadow copy of the hardware ring element
 333  *   need because we can't store any context reference in the bd element.
 334  */
 335 struct sec_queue {
 336         struct sec_dev_info *dev_info;
 337         int task_irq;
 338         char name[SEC_NAME_SIZE];
 339         struct sec_queue_ring_cmd ring_cmd;
 340         struct sec_queue_ring_cq ring_cq;
 341         struct sec_queue_ring_db ring_db;
 342         void __iomem *regs;
 343         u32 queue_id;
 344         bool in_use;
 345         int expected;
 346 
 347         DECLARE_BITMAP(unprocessed, SEC_QUEUE_LEN);
 348         DECLARE_KFIFO_PTR(softqueue, typeof(struct sec_request_el *));
 349         bool havesoftqueue;
 350         struct mutex queuelock;
 351         void *shadow[SEC_QUEUE_LEN];
 352 };
 353 
 354 /**
 355  * struct sec_hw_sge: Track each of the 64 element SEC HW SGL entries
 356  * @buf: The IOV dma address for this entry.
 357  * @len: Length of this IOV.
 358  * @pad: Reserved space.
 359  */
 360 struct sec_hw_sge {
 361         dma_addr_t buf;
 362         unsigned int len;
 363         unsigned int pad;
 364 };
 365 
 366 /**
 367  * struct sec_hw_sgl: One hardware SGL entry.
 368  * @next_sgl: The next entry if we need to chain dma address. Null if last.
 369  * @entry_sum_in_chain: The full count of SGEs - only matters for first SGL.
 370  * @entry_sum_in_sgl: The number of SGEs in this SGL element.
 371  * @flag: Unused in skciphers.
 372  * @serial_num: Unsued in skciphers.
 373  * @cpuid: Currently unused.
 374  * @data_bytes_in_sgl: Count of bytes from all SGEs in this SGL.
 375  * @next: Virtual address used to stash the next sgl - useful in completion.
 376  * @reserved: A reserved field not currently used.
 377  * @sge_entries: The (up to) 64 Scatter Gather Entries, representing IOVs.
 378  * @node: Currently unused.
 379  */
 380 struct sec_hw_sgl {
 381         dma_addr_t next_sgl;
 382         u16 entry_sum_in_chain;
 383         u16 entry_sum_in_sgl;
 384         u32 flag;
 385         u64 serial_num;
 386         u32 cpuid;
 387         u32 data_bytes_in_sgl;
 388         struct sec_hw_sgl *next;
 389         u64 reserved;
 390         struct sec_hw_sge  sge_entries[SEC_MAX_SGE_NUM];
 391         u8 node[16];
 392 };
 393 
 394 struct dma_pool;
 395 
 396 /**
 397  * struct sec_dev_info: The full SEC unit comprising queues and processors.
 398  * @sec_id: Index used to track which SEC this is when more than one is present.
 399  * @num_saas: The number of backed processors enabled.
 400  * @regs: iomapped register regions shared by whole SEC unit.
 401  * @dev_lock: Protects concurrent queue allocation / freeing for the SEC.
 402  * @queues: The 16 queues that this SEC instance provides.
 403  * @dev: Device pointer.
 404  * @hw_sgl_pool: DMA pool used to mimise mapping for the scatter gather lists.
 405  */
 406 struct sec_dev_info {
 407         int sec_id;
 408         int num_saas;
 409         void __iomem *regs[SEC_NUM_ADDR_REGIONS];
 410         struct mutex dev_lock;
 411         int queues_in_use;
 412         struct sec_queue queues[SEC_Q_NUM];
 413         struct device *dev;
 414         struct dma_pool *hw_sgl_pool;
 415 };
 416 
 417 int sec_queue_send(struct sec_queue *queue, struct sec_bd_info *msg, void *ctx);
 418 bool sec_queue_can_enqueue(struct sec_queue *queue, int num);
 419 int sec_queue_stop_release(struct sec_queue *queue);
 420 struct sec_queue *sec_queue_alloc_start_safe(void);
 421 bool sec_queue_empty(struct sec_queue *queue);
 422 
 423 /* Algorithm specific elements from sec_algs.c */
 424 void sec_alg_callback(struct sec_bd_info *resp, void *ctx);
 425 int sec_algs_register(void);
 426 void sec_algs_unregister(void);
 427 
 428 #endif /* _SEC_DRV_H_ */

/* [<][>][^][v][top][bottom][index][help] */