xref: /openbmc/linux/drivers/crypto/vmx/vmx.c (revision f66501dc)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /**
3  * Routines supporting VMX instructions on the Power 8
4  *
5  * Copyright (C) 2015 International Business Machines Inc.
6  *
7  * Author: Marcelo Henrique Cerri <mhcerri@br.ibm.com>
8  */
9 
10 #include <linux/module.h>
11 #include <linux/moduleparam.h>
12 #include <linux/types.h>
13 #include <linux/err.h>
14 #include <linux/cpufeature.h>
15 #include <linux/crypto.h>
16 #include <asm/cputable.h>
17 #include <crypto/internal/hash.h>
18 
19 extern struct shash_alg p8_ghash_alg;
20 extern struct crypto_alg p8_aes_alg;
21 extern struct crypto_alg p8_aes_cbc_alg;
22 extern struct crypto_alg p8_aes_ctr_alg;
23 extern struct crypto_alg p8_aes_xts_alg;
24 static struct crypto_alg *algs[] = {
25 	&p8_aes_alg,
26 	&p8_aes_cbc_alg,
27 	&p8_aes_ctr_alg,
28 	&p8_aes_xts_alg,
29 	NULL,
30 };
31 
32 static int __init p8_init(void)
33 {
34 	int ret = 0;
35 	struct crypto_alg **alg_it;
36 
37 	for (alg_it = algs; *alg_it; alg_it++) {
38 		ret = crypto_register_alg(*alg_it);
39 		printk(KERN_INFO "crypto_register_alg '%s' = %d\n",
40 		       (*alg_it)->cra_name, ret);
41 		if (ret) {
42 			for (alg_it--; alg_it >= algs; alg_it--)
43 				crypto_unregister_alg(*alg_it);
44 			break;
45 		}
46 	}
47 	if (ret)
48 		return ret;
49 
50 	ret = crypto_register_shash(&p8_ghash_alg);
51 	if (ret) {
52 		for (alg_it = algs; *alg_it; alg_it++)
53 			crypto_unregister_alg(*alg_it);
54 	}
55 	return ret;
56 }
57 
58 static void __exit p8_exit(void)
59 {
60 	struct crypto_alg **alg_it;
61 
62 	for (alg_it = algs; *alg_it; alg_it++) {
63 		printk(KERN_INFO "Removing '%s'\n", (*alg_it)->cra_name);
64 		crypto_unregister_alg(*alg_it);
65 	}
66 	crypto_unregister_shash(&p8_ghash_alg);
67 }
68 
69 module_cpu_feature_match(PPC_MODULE_FEATURE_VEC_CRYPTO, p8_init);
70 module_exit(p8_exit);
71 
72 MODULE_AUTHOR("Marcelo Cerri<mhcerri@br.ibm.com>");
73 MODULE_DESCRIPTION("IBM VMX cryptographic acceleration instructions "
74 		   "support on Power 8");
75 MODULE_LICENSE("GPL");
76 MODULE_VERSION("1.0.0");
77