// SPDX-License-Identifier: GPL-2.0-only
/**
 * Routines supporting VMX instructions on the Power 8
 *
 * Copyright (C) 2015 International Business Machines Inc.
 *
 * Author: Marcelo Henrique Cerri <mhcerri@br.ibm.com>
 */

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/types.h>
#include <linux/err.h>
#include <linux/cpufeature.h>
#include <linux/crypto.h>
#include <asm/cputable.h>
#include <crypto/internal/hash.h>
#include <crypto/internal/skcipher.h>

#include "aesp8-ppc.h"

static int __init p8_init(void)
{
	int ret;

	ret = crypto_register_shash(&p8_ghash_alg);
	if (ret)
		goto err;

	ret = crypto_register_alg(&p8_aes_alg);
	if (ret)
		goto err_unregister_ghash;

	ret = crypto_register_skcipher(&p8_aes_cbc_alg);
	if (ret)
		goto err_unregister_aes;

	ret = crypto_register_skcipher(&p8_aes_ctr_alg);
	if (ret)
		goto err_unregister_aes_cbc;

	ret = crypto_register_skcipher(&p8_aes_xts_alg);
	if (ret)
		goto err_unregister_aes_ctr;

	return 0;

err_unregister_aes_ctr:
	crypto_unregister_skcipher(&p8_aes_ctr_alg);
err_unregister_aes_cbc:
	crypto_unregister_skcipher(&p8_aes_cbc_alg);
err_unregister_aes:
	crypto_unregister_alg(&p8_aes_alg);
err_unregister_ghash:
	crypto_unregister_shash(&p8_ghash_alg);
err:
	return ret;
}

static void __exit p8_exit(void)
{
	crypto_unregister_skcipher(&p8_aes_xts_alg);
	crypto_unregister_skcipher(&p8_aes_ctr_alg);
	crypto_unregister_skcipher(&p8_aes_cbc_alg);
	crypto_unregister_alg(&p8_aes_alg);
	crypto_unregister_shash(&p8_ghash_alg);
}

module_cpu_feature_match(PPC_MODULE_FEATURE_VEC_CRYPTO, p8_init);
module_exit(p8_exit);

MODULE_AUTHOR("Marcelo Cerri<mhcerri@br.ibm.com>");
MODULE_DESCRIPTION("IBM VMX cryptographic acceleration instructions "
		   "support on Power 8");
MODULE_LICENSE("GPL");
MODULE_VERSION("1.0.0");
MODULE_IMPORT_NS(CRYPTO_INTERNAL);
