162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Routines supporting VMX instructions on the Power 8
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2015 International Business Machines Inc.
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Author: Marcelo Henrique Cerri <mhcerri@br.ibm.com>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/module.h>
1162306a36Sopenharmony_ci#include <linux/moduleparam.h>
1262306a36Sopenharmony_ci#include <linux/types.h>
1362306a36Sopenharmony_ci#include <linux/err.h>
1462306a36Sopenharmony_ci#include <linux/cpufeature.h>
1562306a36Sopenharmony_ci#include <linux/crypto.h>
1662306a36Sopenharmony_ci#include <asm/cputable.h>
1762306a36Sopenharmony_ci#include <crypto/internal/hash.h>
1862306a36Sopenharmony_ci#include <crypto/internal/skcipher.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include "aesp8-ppc.h"
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistatic int __init p8_init(void)
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	int ret;
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	ret = crypto_register_shash(&p8_ghash_alg);
2762306a36Sopenharmony_ci	if (ret)
2862306a36Sopenharmony_ci		goto err;
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci	ret = crypto_register_alg(&p8_aes_alg);
3162306a36Sopenharmony_ci	if (ret)
3262306a36Sopenharmony_ci		goto err_unregister_ghash;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	ret = crypto_register_skcipher(&p8_aes_cbc_alg);
3562306a36Sopenharmony_ci	if (ret)
3662306a36Sopenharmony_ci		goto err_unregister_aes;
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	ret = crypto_register_skcipher(&p8_aes_ctr_alg);
3962306a36Sopenharmony_ci	if (ret)
4062306a36Sopenharmony_ci		goto err_unregister_aes_cbc;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	ret = crypto_register_skcipher(&p8_aes_xts_alg);
4362306a36Sopenharmony_ci	if (ret)
4462306a36Sopenharmony_ci		goto err_unregister_aes_ctr;
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	return 0;
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cierr_unregister_aes_ctr:
4962306a36Sopenharmony_ci	crypto_unregister_skcipher(&p8_aes_ctr_alg);
5062306a36Sopenharmony_cierr_unregister_aes_cbc:
5162306a36Sopenharmony_ci	crypto_unregister_skcipher(&p8_aes_cbc_alg);
5262306a36Sopenharmony_cierr_unregister_aes:
5362306a36Sopenharmony_ci	crypto_unregister_alg(&p8_aes_alg);
5462306a36Sopenharmony_cierr_unregister_ghash:
5562306a36Sopenharmony_ci	crypto_unregister_shash(&p8_ghash_alg);
5662306a36Sopenharmony_cierr:
5762306a36Sopenharmony_ci	return ret;
5862306a36Sopenharmony_ci}
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistatic void __exit p8_exit(void)
6162306a36Sopenharmony_ci{
6262306a36Sopenharmony_ci	crypto_unregister_skcipher(&p8_aes_xts_alg);
6362306a36Sopenharmony_ci	crypto_unregister_skcipher(&p8_aes_ctr_alg);
6462306a36Sopenharmony_ci	crypto_unregister_skcipher(&p8_aes_cbc_alg);
6562306a36Sopenharmony_ci	crypto_unregister_alg(&p8_aes_alg);
6662306a36Sopenharmony_ci	crypto_unregister_shash(&p8_ghash_alg);
6762306a36Sopenharmony_ci}
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_cimodule_cpu_feature_match(PPC_MODULE_FEATURE_VEC_CRYPTO, p8_init);
7062306a36Sopenharmony_cimodule_exit(p8_exit);
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ciMODULE_AUTHOR("Marcelo Cerri<mhcerri@br.ibm.com>");
7362306a36Sopenharmony_ciMODULE_DESCRIPTION("IBM VMX cryptographic acceleration instructions "
7462306a36Sopenharmony_ci		   "support on Power 8");
7562306a36Sopenharmony_ciMODULE_LICENSE("GPL");
7662306a36Sopenharmony_ciMODULE_VERSION("1.0.0");
7762306a36Sopenharmony_ciMODULE_IMPORT_NS(CRYPTO_INTERNAL);
78