/*
 * Copyright (C) 2012-2017 ARM Limited or its affiliates.
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
 */

/* \file ssi_cipher.h
   ARM CryptoCell Cipher Crypto API
 */

#ifndef __SSI_CIPHER_H__
#define __SSI_CIPHER_H__

#include <linux/kernel.h>
#include <crypto/algapi.h>
#include "ssi_driver.h"
#include "ssi_buffer_mgr.h"


/* Crypto cipher flags */
#define CC_CRYPTO_CIPHER_KEY_KFDE0    (1 << 0)
#define CC_CRYPTO_CIPHER_KEY_KFDE1    (1 << 1)
#define CC_CRYPTO_CIPHER_KEY_KFDE2    (1 << 2)
#define CC_CRYPTO_CIPHER_KEY_KFDE3    (1 << 3)
#define CC_CRYPTO_CIPHER_DU_SIZE_512B (1 << 4)

#define CC_CRYPTO_CIPHER_KEY_KFDE_MASK (CC_CRYPTO_CIPHER_KEY_KFDE0 | CC_CRYPTO_CIPHER_KEY_KFDE1 | CC_CRYPTO_CIPHER_KEY_KFDE2 | CC_CRYPTO_CIPHER_KEY_KFDE3)


struct blkcipher_req_ctx {
	struct async_gen_req_ctx gen_ctx;
	enum ssi_req_dma_buf_type dma_buf_type;
	uint32_t in_nents;
	uint32_t in_mlli_nents;
	uint32_t out_nents;
	uint32_t out_mlli_nents;
	uint8_t *backup_info; /*store iv for generated IV flow*/
	bool is_giv;
	struct mlli_params mlli_params;
};



int ssi_ablkcipher_alloc(struct ssi_drvdata *drvdata);

int ssi_ablkcipher_free(struct ssi_drvdata *drvdata);

#ifndef CRYPTO_ALG_BULK_MASK

#define CRYPTO_ALG_BULK_DU_512	0x00002000
#define CRYPTO_ALG_BULK_DU_4096	0x00004000
#define CRYPTO_ALG_BULK_MASK	(CRYPTO_ALG_BULK_DU_512 |\
				CRYPTO_ALG_BULK_DU_4096)
#endif /* CRYPTO_ALG_BULK_MASK */


#ifdef CRYPTO_TFM_REQ_HW_KEY

static inline bool ssi_is_hw_key(struct crypto_tfm *tfm)
{
	return (crypto_tfm_get_flags(tfm) & CRYPTO_TFM_REQ_HW_KEY);
}

#else 

struct arm_hw_key_info {
	int hw_key1;
	int hw_key2;
};

static inline bool ssi_is_hw_key(struct crypto_tfm *tfm)
{
	return 0;
}

#endif /* CRYPTO_TFM_REQ_HW_KEY */


#endif /*__SSI_CIPHER_H__*/
