/* SPDX-License-Identifier: BSD-3-Clause
 * Copyright (C) 2020 Marvell International Ltd.
 */

#ifndef _OTX2_CRYPTODEV_OPS_HELPER_H_
#define _OTX2_CRYPTODEV_OPS_HELPER_H_

#include "cpt_pmd_logs.h"

static void
sym_session_clear(int driver_id, struct rte_cryptodev_sym_session *sess)
{
	void *priv = get_sym_session_private_data(sess, driver_id);
	struct cpt_sess_misc *misc;
	struct rte_mempool *pool;
	struct cpt_ctx *ctx;

	if (priv == NULL)
		return;

	misc = priv;
	ctx = SESS_PRIV(misc);

	if (ctx->auth_key != NULL)
		rte_free(ctx->auth_key);

	memset(priv, 0, cpt_get_session_size());

	pool = rte_mempool_from_obj(priv);

	set_sym_session_private_data(sess, driver_id, NULL);

	rte_mempool_put(pool, priv);
}

static __rte_always_inline uint8_t
otx2_cpt_compcode_get(struct cpt_request_info *req)
{
	volatile struct cpt_res_s_9s *res;
	uint8_t ret;

	res = (volatile struct cpt_res_s_9s *)req->completion_addr;

	if (unlikely(res->compcode == CPT_9X_COMP_E_NOTDONE)) {
		if (rte_get_timer_cycles() < req->time_out)
			return ERR_REQ_PENDING;

		CPT_LOG_DP_ERR("Request timed out");
		return ERR_REQ_TIMEOUT;
	}

	if (likely(res->compcode == CPT_9X_COMP_E_GOOD)) {
		ret = NO_ERR;
		if (unlikely(res->uc_compcode)) {
			ret = res->uc_compcode;
			CPT_LOG_DP_DEBUG("Request failed with microcode error");
			CPT_LOG_DP_DEBUG("MC completion code 0x%x",
					 res->uc_compcode);
		}
	} else {
		CPT_LOG_DP_DEBUG("HW completion code 0x%x", res->compcode);

		ret = res->compcode;
		switch (res->compcode) {
		case CPT_9X_COMP_E_INSTERR:
			CPT_LOG_DP_ERR("Request failed with instruction error");
			break;
		case CPT_9X_COMP_E_FAULT:
			CPT_LOG_DP_ERR("Request failed with DMA fault");
			break;
		case CPT_9X_COMP_E_HWERR:
			CPT_LOG_DP_ERR("Request failed with hardware error");
			break;
		default:
			CPT_LOG_DP_ERR("Request failed with unknown completion code");
		}
	}

	return ret;
}

#endif /* _OTX2_CRYPTODEV_OPS_HELPER_H_ */