/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

#if defined(_KERNEL) && defined(HAVE_QAT)
#include <sys/zfs_context.h>
#include "qat.h"

qat_stats_t qat_stats = {
	{ "comp_requests",			KSTAT_DATA_UINT64 },
	{ "comp_total_in_bytes",		KSTAT_DATA_UINT64 },
	{ "comp_total_out_bytes",		KSTAT_DATA_UINT64 },
	{ "decomp_requests",			KSTAT_DATA_UINT64 },
	{ "decomp_total_in_bytes",		KSTAT_DATA_UINT64 },
	{ "decomp_total_out_bytes",		KSTAT_DATA_UINT64 },
	{ "dc_fails",				KSTAT_DATA_UINT64 },
	{ "encrypt_requests",			KSTAT_DATA_UINT64 },
	{ "encrypt_total_in_bytes",		KSTAT_DATA_UINT64 },
	{ "encrypt_total_out_bytes",		KSTAT_DATA_UINT64 },
	{ "decrypt_requests",			KSTAT_DATA_UINT64 },
	{ "decrypt_total_in_bytes",		KSTAT_DATA_UINT64 },
	{ "decrypt_total_out_bytes",		KSTAT_DATA_UINT64 },
	{ "crypt_fails",			KSTAT_DATA_UINT64 },
	{ "cksum_requests",			KSTAT_DATA_UINT64 },
	{ "cksum_total_in_bytes",		KSTAT_DATA_UINT64 },
	{ "cksum_fails",			KSTAT_DATA_UINT64 },
};

static kstat_t *qat_ksp = NULL;

CpaStatus
qat_mem_alloc_contig(void **pp_mem_addr, Cpa32U size_bytes)
{
	*pp_mem_addr = kmalloc(size_bytes, GFP_KERNEL);
	if (*pp_mem_addr == NULL)
		return (CPA_STATUS_RESOURCE);
	return (CPA_STATUS_SUCCESS);
}

void
qat_mem_free_contig(void **pp_mem_addr)
{
	if (*pp_mem_addr != NULL) {
		kfree(*pp_mem_addr);
		*pp_mem_addr = NULL;
	}
}

int
qat_init(void)
{
	qat_ksp = kstat_create("zfs", 0, "qat", "misc",
	    KSTAT_TYPE_NAMED, sizeof (qat_stats) / sizeof (kstat_named_t),
	    KSTAT_FLAG_VIRTUAL);
	if (qat_ksp != NULL) {
		qat_ksp->ks_data = &qat_stats;
		kstat_install(qat_ksp);
	}

	/*
	 * Just set the disable flag when qat init failed, qat can be
	 * turned on again in post-process after zfs module is loaded, e.g.:
	 * echo 0 > /sys/module/zfs/parameters/zfs_qat_compress_disable
	 */
	if (qat_dc_init() != 0)
		zfs_qat_compress_disable = 1;

	if (qat_cy_init() != 0) {
		zfs_qat_checksum_disable = 1;
		zfs_qat_encrypt_disable = 1;
	}

	return (0);
}

void
qat_fini(void)
{
	if (qat_ksp != NULL) {
		kstat_delete(qat_ksp);
		qat_ksp = NULL;
	}

	qat_cy_fini();
	qat_dc_fini();
}

#endif
