Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[platform/kernel/linux-starfive.git] / drivers / crypto / vmx / vmx.c
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");