linux/drivers/crypto/nx/nx.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2
   3#ifndef __NX_H__
   4#define __NX_H__
   5
   6#include <crypto/ctr.h>
   7
   8#define NX_NAME         "nx-crypto"
   9#define NX_STRING       "IBM Power7+ Nest Accelerator Crypto Driver"
  10#define NX_VERSION      "1.0"
  11
  12/* a scatterlist in the format PHYP is expecting */
  13struct nx_sg {
  14        u64 addr;
  15        u32 rsvd;
  16        u32 len;
  17} __attribute((packed));
  18
  19#define NX_PAGE_SIZE            (4096)
  20#define NX_MAX_SG_ENTRIES       (NX_PAGE_SIZE/(sizeof(struct nx_sg)))
  21
  22enum nx_status {
  23        NX_DISABLED,
  24        NX_WAITING,
  25        NX_OKAY
  26};
  27
  28/* msc_triplet and max_sync_cop are used only to assist in parsing the
  29 * openFirmware property */
  30struct msc_triplet {
  31        u32 keybitlen;
  32        u32 databytelen;
  33        u32 sglen;
  34} __packed;
  35
  36struct max_sync_cop {
  37        u32 fc;
  38        u32 mode;
  39        u32 triplets;
  40        struct msc_triplet trip[];
  41} __packed;
  42
  43struct alg_props {
  44        u32 databytelen;
  45        u32 sglen;
  46};
  47
  48#define NX_OF_FLAG_MAXSGLEN_SET         (1)
  49#define NX_OF_FLAG_STATUS_SET           (2)
  50#define NX_OF_FLAG_MAXSYNCCOP_SET       (4)
  51#define NX_OF_FLAG_MASK_READY           (NX_OF_FLAG_MAXSGLEN_SET | \
  52                                         NX_OF_FLAG_STATUS_SET |   \
  53                                         NX_OF_FLAG_MAXSYNCCOP_SET)
  54struct nx_of {
  55        u32 flags;
  56        u32 max_sg_len;
  57        enum nx_status status;
  58        struct alg_props ap[NX_MAX_FC][NX_MAX_MODE][3];
  59};
  60
  61struct nx_stats {
  62        atomic_t aes_ops;
  63        atomic64_t aes_bytes;
  64        atomic_t sha256_ops;
  65        atomic64_t sha256_bytes;
  66        atomic_t sha512_ops;
  67        atomic64_t sha512_bytes;
  68
  69        atomic_t sync_ops;
  70
  71        atomic_t errors;
  72        atomic_t last_error;
  73        atomic_t last_error_pid;
  74};
  75
  76struct nx_crypto_driver {
  77        struct nx_stats    stats;
  78        struct nx_of       of;
  79        struct vio_dev    *viodev;
  80        struct vio_driver  viodriver;
  81        struct dentry     *dfs_root;
  82};
  83
  84#define NX_GCM4106_NONCE_LEN            (4)
  85#define NX_GCM_CTR_OFFSET               (12)
  86struct nx_gcm_rctx {
  87        u8 iv[16];
  88};
  89
  90struct nx_gcm_priv {
  91        u8 iauth_tag[16];
  92        u8 nonce[NX_GCM4106_NONCE_LEN];
  93};
  94
  95#define NX_CCM_AES_KEY_LEN              (16)
  96#define NX_CCM4309_AES_KEY_LEN          (19)
  97#define NX_CCM4309_NONCE_LEN            (3)
  98struct nx_ccm_rctx {
  99        u8 iv[16];
 100};
 101
 102struct nx_ccm_priv {
 103        u8 b0[16];
 104        u8 iauth_tag[16];
 105        u8 oauth_tag[16];
 106        u8 nonce[NX_CCM4309_NONCE_LEN];
 107};
 108
 109struct nx_xcbc_priv {
 110        u8 key[16];
 111};
 112
 113struct nx_ctr_priv {
 114        u8 nonce[CTR_RFC3686_NONCE_SIZE];
 115};
 116
 117struct nx_crypto_ctx {
 118        spinlock_t lock;          /* synchronize access to the context */
 119        void *kmem;               /* unaligned, kmalloc'd buffer */
 120        size_t kmem_len;          /* length of kmem */
 121        struct nx_csbcpb *csbcpb; /* aligned page given to phyp @ hcall time */
 122        struct vio_pfo_op op;     /* operation struct with hcall parameters */
 123        struct nx_csbcpb *csbcpb_aead; /* secondary csbcpb used by AEAD algs */
 124        struct vio_pfo_op op_aead;/* operation struct for csbcpb_aead */
 125
 126        struct nx_sg *in_sg;      /* aligned pointer into kmem to an sg list */
 127        struct nx_sg *out_sg;     /* aligned pointer into kmem to an sg list */
 128
 129        struct alg_props *ap;     /* pointer into props based on our key size */
 130        struct alg_props props[3];/* openFirmware properties for requests */
 131        struct nx_stats *stats;   /* pointer into an nx_crypto_driver for stats
 132                                     reporting */
 133
 134        union {
 135                struct nx_gcm_priv gcm;
 136                struct nx_ccm_priv ccm;
 137                struct nx_xcbc_priv xcbc;
 138                struct nx_ctr_priv ctr;
 139        } priv;
 140};
 141
 142struct crypto_aead;
 143
 144/* prototypes */
 145int nx_crypto_ctx_aes_ccm_init(struct crypto_aead *tfm);
 146int nx_crypto_ctx_aes_gcm_init(struct crypto_aead *tfm);
 147int nx_crypto_ctx_aes_xcbc_init(struct crypto_tfm *tfm);
 148int nx_crypto_ctx_aes_ctr_init(struct crypto_skcipher *tfm);
 149int nx_crypto_ctx_aes_cbc_init(struct crypto_skcipher *tfm);
 150int nx_crypto_ctx_aes_ecb_init(struct crypto_skcipher *tfm);
 151int nx_crypto_ctx_sha_init(struct crypto_tfm *tfm);
 152void nx_crypto_ctx_exit(struct crypto_tfm *tfm);
 153void nx_crypto_ctx_skcipher_exit(struct crypto_skcipher *tfm);
 154void nx_crypto_ctx_aead_exit(struct crypto_aead *tfm);
 155void nx_ctx_init(struct nx_crypto_ctx *nx_ctx, unsigned int function);
 156int nx_hcall_sync(struct nx_crypto_ctx *ctx, struct vio_pfo_op *op,
 157                  u32 may_sleep);
 158struct nx_sg *nx_build_sg_list(struct nx_sg *, u8 *, unsigned int *, u32);
 159int nx_build_sg_lists(struct nx_crypto_ctx *nx_ctx, const u8 *iv,
 160                      struct scatterlist *dst, struct scatterlist *src,
 161                      unsigned int *nbytes, unsigned int offset, u8 *oiv);
 162struct nx_sg *nx_walk_and_build(struct nx_sg *, unsigned int,
 163                                struct scatterlist *, unsigned int,
 164                                unsigned int *);
 165
 166#ifdef CONFIG_DEBUG_FS
 167#define NX_DEBUGFS_INIT(drv)    nx_debugfs_init(drv)
 168#define NX_DEBUGFS_FINI(drv)    nx_debugfs_fini(drv)
 169
 170void nx_debugfs_init(struct nx_crypto_driver *);
 171void nx_debugfs_fini(struct nx_crypto_driver *);
 172#else
 173#define NX_DEBUGFS_INIT(drv)    (0)
 174#define NX_DEBUGFS_FINI(drv)    (0)
 175#endif
 176
 177#define NX_PAGE_NUM(x)          ((u64)(x) & 0xfffffffffffff000ULL)
 178
 179extern struct skcipher_alg nx_cbc_aes_alg;
 180extern struct skcipher_alg nx_ecb_aes_alg;
 181extern struct aead_alg nx_gcm_aes_alg;
 182extern struct aead_alg nx_gcm4106_aes_alg;
 183extern struct skcipher_alg nx_ctr3686_aes_alg;
 184extern struct aead_alg nx_ccm_aes_alg;
 185extern struct aead_alg nx_ccm4309_aes_alg;
 186extern struct shash_alg nx_shash_aes_xcbc_alg;
 187extern struct shash_alg nx_shash_sha512_alg;
 188extern struct shash_alg nx_shash_sha256_alg;
 189
 190extern struct nx_crypto_driver nx_driver;
 191
 192#define SCATTERWALK_TO_SG       1
 193#define SCATTERWALK_FROM_SG     0
 194
 195#endif
 196