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