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