162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Intel Keem Bay OCS AES Crypto Driver. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2018-2020 Intel Corporation 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef _CRYPTO_OCS_AES_H 962306a36Sopenharmony_ci#define _CRYPTO_OCS_AES_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/dma-mapping.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_cienum ocs_cipher { 1462306a36Sopenharmony_ci OCS_AES = 0, 1562306a36Sopenharmony_ci OCS_SM4 = 1, 1662306a36Sopenharmony_ci}; 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cienum ocs_mode { 1962306a36Sopenharmony_ci OCS_MODE_ECB = 0, 2062306a36Sopenharmony_ci OCS_MODE_CBC = 1, 2162306a36Sopenharmony_ci OCS_MODE_CTR = 2, 2262306a36Sopenharmony_ci OCS_MODE_CCM = 6, 2362306a36Sopenharmony_ci OCS_MODE_GCM = 7, 2462306a36Sopenharmony_ci OCS_MODE_CTS = 9, 2562306a36Sopenharmony_ci}; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cienum ocs_instruction { 2862306a36Sopenharmony_ci OCS_ENCRYPT = 0, 2962306a36Sopenharmony_ci OCS_DECRYPT = 1, 3062306a36Sopenharmony_ci OCS_EXPAND = 2, 3162306a36Sopenharmony_ci OCS_BYPASS = 3, 3262306a36Sopenharmony_ci}; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci/** 3562306a36Sopenharmony_ci * struct ocs_aes_dev - AES device context. 3662306a36Sopenharmony_ci * @list: List head for insertion into device list hold 3762306a36Sopenharmony_ci * by driver. 3862306a36Sopenharmony_ci * @dev: OCS AES device. 3962306a36Sopenharmony_ci * @irq: IRQ number. 4062306a36Sopenharmony_ci * @base_reg: IO base address of OCS AES. 4162306a36Sopenharmony_ci * @irq_copy_completion: Completion to indicate IRQ has been triggered. 4262306a36Sopenharmony_ci * @dma_err_mask: Error reported by OCS DMA interrupts. 4362306a36Sopenharmony_ci * @engine: Crypto engine for the device. 4462306a36Sopenharmony_ci */ 4562306a36Sopenharmony_cistruct ocs_aes_dev { 4662306a36Sopenharmony_ci struct list_head list; 4762306a36Sopenharmony_ci struct device *dev; 4862306a36Sopenharmony_ci int irq; 4962306a36Sopenharmony_ci void __iomem *base_reg; 5062306a36Sopenharmony_ci struct completion irq_completion; 5162306a36Sopenharmony_ci u32 dma_err_mask; 5262306a36Sopenharmony_ci struct crypto_engine *engine; 5362306a36Sopenharmony_ci}; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci/** 5662306a36Sopenharmony_ci * struct ocs_dll_desc - Descriptor of an OCS DMA Linked List. 5762306a36Sopenharmony_ci * @vaddr: Virtual address of the linked list head. 5862306a36Sopenharmony_ci * @dma_addr: DMA address of the linked list head. 5962306a36Sopenharmony_ci * @size: Size (in bytes) of the linked list. 6062306a36Sopenharmony_ci */ 6162306a36Sopenharmony_cistruct ocs_dll_desc { 6262306a36Sopenharmony_ci void *vaddr; 6362306a36Sopenharmony_ci dma_addr_t dma_addr; 6462306a36Sopenharmony_ci size_t size; 6562306a36Sopenharmony_ci}; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ciint ocs_aes_set_key(struct ocs_aes_dev *aes_dev, const u32 key_size, 6862306a36Sopenharmony_ci const u8 *key, const enum ocs_cipher cipher); 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ciint ocs_aes_op(struct ocs_aes_dev *aes_dev, 7162306a36Sopenharmony_ci enum ocs_mode mode, 7262306a36Sopenharmony_ci enum ocs_cipher cipher, 7362306a36Sopenharmony_ci enum ocs_instruction instruction, 7462306a36Sopenharmony_ci dma_addr_t dst_dma_list, 7562306a36Sopenharmony_ci dma_addr_t src_dma_list, 7662306a36Sopenharmony_ci u32 src_size, 7762306a36Sopenharmony_ci u8 *iv, 7862306a36Sopenharmony_ci u32 iv_size); 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci/** 8162306a36Sopenharmony_ci * ocs_aes_bypass_op() - Use OCS DMA to copy data. 8262306a36Sopenharmony_ci * @aes_dev: The OCS AES device to use. 8362306a36Sopenharmony_ci * @dst_dma_list: The OCS DMA list mapping the memory where input data 8462306a36Sopenharmony_ci * will be copied to. 8562306a36Sopenharmony_ci * @src_dma_list: The OCS DMA list mapping input data. 8662306a36Sopenharmony_ci * @src_size: The amount of data to copy. 8762306a36Sopenharmony_ci */ 8862306a36Sopenharmony_cistatic inline int ocs_aes_bypass_op(struct ocs_aes_dev *aes_dev, 8962306a36Sopenharmony_ci dma_addr_t dst_dma_list, 9062306a36Sopenharmony_ci dma_addr_t src_dma_list, u32 src_size) 9162306a36Sopenharmony_ci{ 9262306a36Sopenharmony_ci return ocs_aes_op(aes_dev, OCS_MODE_ECB, OCS_AES, OCS_BYPASS, 9362306a36Sopenharmony_ci dst_dma_list, src_dma_list, src_size, NULL, 0); 9462306a36Sopenharmony_ci} 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ciint ocs_aes_gcm_op(struct ocs_aes_dev *aes_dev, 9762306a36Sopenharmony_ci enum ocs_cipher cipher, 9862306a36Sopenharmony_ci enum ocs_instruction instruction, 9962306a36Sopenharmony_ci dma_addr_t dst_dma_list, 10062306a36Sopenharmony_ci dma_addr_t src_dma_list, 10162306a36Sopenharmony_ci u32 src_size, 10262306a36Sopenharmony_ci const u8 *iv, 10362306a36Sopenharmony_ci dma_addr_t aad_dma_list, 10462306a36Sopenharmony_ci u32 aad_size, 10562306a36Sopenharmony_ci u8 *out_tag, 10662306a36Sopenharmony_ci u32 tag_size); 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ciint ocs_aes_ccm_op(struct ocs_aes_dev *aes_dev, 10962306a36Sopenharmony_ci enum ocs_cipher cipher, 11062306a36Sopenharmony_ci enum ocs_instruction instruction, 11162306a36Sopenharmony_ci dma_addr_t dst_dma_list, 11262306a36Sopenharmony_ci dma_addr_t src_dma_list, 11362306a36Sopenharmony_ci u32 src_size, 11462306a36Sopenharmony_ci u8 *iv, 11562306a36Sopenharmony_ci dma_addr_t adata_dma_list, 11662306a36Sopenharmony_ci u32 adata_size, 11762306a36Sopenharmony_ci u8 *in_tag, 11862306a36Sopenharmony_ci u32 tag_size); 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ciint ocs_create_linked_list_from_sg(const struct ocs_aes_dev *aes_dev, 12162306a36Sopenharmony_ci struct scatterlist *sg, 12262306a36Sopenharmony_ci int sg_dma_count, 12362306a36Sopenharmony_ci struct ocs_dll_desc *dll_desc, 12462306a36Sopenharmony_ci size_t data_size, 12562306a36Sopenharmony_ci size_t data_offset); 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ciirqreturn_t ocs_aes_irq_handler(int irq, void *dev_id); 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci#endif 130