linux/drivers/crypto/hisilicon/sec2/sec.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/* Copyright (c) 2019 HiSilicon Limited. */
   3
   4#ifndef __HISI_SEC_V2_H
   5#define __HISI_SEC_V2_H
   6
   7#include <linux/list.h>
   8
   9#include "../qm.h"
  10#include "sec_crypto.h"
  11
  12/* Algorithm resource per hardware SEC queue */
  13struct sec_alg_res {
  14        u8 *pbuf;
  15        dma_addr_t pbuf_dma;
  16        u8 *c_ivin;
  17        dma_addr_t c_ivin_dma;
  18        u8 *out_mac;
  19        dma_addr_t out_mac_dma;
  20};
  21
  22/* Cipher request of SEC private */
  23struct sec_cipher_req {
  24        struct hisi_acc_hw_sgl *c_in;
  25        dma_addr_t c_in_dma;
  26        struct hisi_acc_hw_sgl *c_out;
  27        dma_addr_t c_out_dma;
  28        u8 *c_ivin;
  29        dma_addr_t c_ivin_dma;
  30        struct skcipher_request *sk_req;
  31        u32 c_len;
  32        bool encrypt;
  33};
  34
  35struct sec_aead_req {
  36        u8 *out_mac;
  37        dma_addr_t out_mac_dma;
  38        struct aead_request *aead_req;
  39};
  40
  41/* SEC request of Crypto */
  42struct sec_req {
  43        struct sec_sqe sec_sqe;
  44        struct sec_ctx *ctx;
  45        struct sec_qp_ctx *qp_ctx;
  46
  47        struct sec_cipher_req c_req;
  48        struct sec_aead_req aead_req;
  49
  50        int err_type;
  51        int req_id;
  52
  53        /* Status of the SEC request */
  54        bool fake_busy;
  55        bool use_pbuf;
  56};
  57
  58/**
  59 * struct sec_req_op - Operations for SEC request
  60 * @buf_map: DMA map the SGL buffers of the request
  61 * @buf_unmap: DMA unmap the SGL buffers of the request
  62 * @bd_fill: Fill the SEC queue BD
  63 * @bd_send: Send the SEC BD into the hardware queue
  64 * @callback: Call back for the request
  65 * @process: Main processing logic of Skcipher
  66 */
  67struct sec_req_op {
  68        int (*buf_map)(struct sec_ctx *ctx, struct sec_req *req);
  69        void (*buf_unmap)(struct sec_ctx *ctx, struct sec_req *req);
  70        void (*do_transfer)(struct sec_ctx *ctx, struct sec_req *req);
  71        int (*bd_fill)(struct sec_ctx *ctx, struct sec_req *req);
  72        int (*bd_send)(struct sec_ctx *ctx, struct sec_req *req);
  73        void (*callback)(struct sec_ctx *ctx, struct sec_req *req, int err);
  74        int (*process)(struct sec_ctx *ctx, struct sec_req *req);
  75};
  76
  77/* SEC auth context */
  78struct sec_auth_ctx {
  79        dma_addr_t a_key_dma;
  80        u8 *a_key;
  81        u8 a_key_len;
  82        u8 mac_len;
  83        u8 a_alg;
  84        struct crypto_shash *hash_tfm;
  85};
  86
  87/* SEC cipher context which cipher's relatives */
  88struct sec_cipher_ctx {
  89        u8 *c_key;
  90        dma_addr_t c_key_dma;
  91        sector_t iv_offset;
  92        u32 c_gran_size;
  93        u32 ivsize;
  94        u8 c_mode;
  95        u8 c_alg;
  96        u8 c_key_len;
  97};
  98
  99/* SEC queue context which defines queue's relatives */
 100struct sec_qp_ctx {
 101        struct hisi_qp *qp;
 102        struct sec_req *req_list[QM_Q_DEPTH];
 103        struct idr req_idr;
 104        struct sec_alg_res res[QM_Q_DEPTH];
 105        struct sec_ctx *ctx;
 106        struct mutex req_lock;
 107        struct hisi_acc_sgl_pool *c_in_pool;
 108        struct hisi_acc_sgl_pool *c_out_pool;
 109        atomic_t pending_reqs;
 110};
 111
 112enum sec_alg_type {
 113        SEC_SKCIPHER,
 114        SEC_AEAD
 115};
 116
 117/* SEC Crypto TFM context which defines queue and cipher .etc relatives */
 118struct sec_ctx {
 119        struct sec_qp_ctx *qp_ctx;
 120        struct sec_dev *sec;
 121        const struct sec_req_op *req_op;
 122        struct hisi_qp **qps;
 123
 124        /* Half queues for encipher, and half for decipher */
 125        u32 hlf_q_num;
 126
 127        /* Threshold for fake busy, trigger to return -EBUSY to user */
 128        u32 fake_req_limit;
 129
 130        /* Currrent cyclic index to select a queue for encipher */
 131        atomic_t enc_qcyclic;
 132
 133         /* Currrent cyclic index to select a queue for decipher */
 134        atomic_t dec_qcyclic;
 135
 136        enum sec_alg_type alg_type;
 137        bool pbuf_supported;
 138        struct sec_cipher_ctx c_ctx;
 139        struct sec_auth_ctx a_ctx;
 140};
 141
 142enum sec_endian {
 143        SEC_LE = 0,
 144        SEC_32BE,
 145        SEC_64BE
 146};
 147
 148enum sec_debug_file_index {
 149        SEC_CURRENT_QM,
 150        SEC_CLEAR_ENABLE,
 151        SEC_DEBUG_FILE_NUM,
 152};
 153
 154struct sec_debug_file {
 155        enum sec_debug_file_index index;
 156        spinlock_t lock;
 157        struct hisi_qm *qm;
 158};
 159
 160struct sec_dfx {
 161        atomic64_t send_cnt;
 162        atomic64_t recv_cnt;
 163};
 164
 165struct sec_debug {
 166        struct sec_dfx dfx;
 167        struct sec_debug_file files[SEC_DEBUG_FILE_NUM];
 168};
 169
 170struct sec_dev {
 171        struct hisi_qm qm;
 172        struct sec_debug debug;
 173        u32 ctx_q_num;
 174        bool iommu_used;
 175        u32 num_vfs;
 176        unsigned long status;
 177};
 178
 179void sec_destroy_qps(struct hisi_qp **qps, int qp_num);
 180struct hisi_qp **sec_create_qps(void);
 181int sec_register_to_crypto(void);
 182void sec_unregister_from_crypto(void);
 183#endif
 184