18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/** 38c2ecf20Sopenharmony_ci * Copyright (C) ST-Ericsson SA 2010 48c2ecf20Sopenharmony_ci * Author: Shujuan Chen <shujuan.chen@stericsson.com> for ST-Ericsson. 58c2ecf20Sopenharmony_ci * Author: Jonas Linde <jonas.linde@stericsson.com> for ST-Ericsson. 68c2ecf20Sopenharmony_ci * Author: Joakim Bech <joakim.xx.bech@stericsson.com> for ST-Ericsson. 78c2ecf20Sopenharmony_ci * Author: Berne Hebark <berne.herbark@stericsson.com> for ST-Ericsson. 88c2ecf20Sopenharmony_ci * Author: Niklas Hernaeus <niklas.hernaeus@stericsson.com> for ST-Ericsson. 98c2ecf20Sopenharmony_ci */ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#ifndef _CRYP_H_ 128c2ecf20Sopenharmony_ci#define _CRYP_H_ 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include <linux/completion.h> 158c2ecf20Sopenharmony_ci#include <linux/dmaengine.h> 168c2ecf20Sopenharmony_ci#include <linux/klist.h> 178c2ecf20Sopenharmony_ci#include <linux/mutex.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#define DEV_DBG_NAME "crypX crypX:" 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci/* CRYP enable/disable */ 228c2ecf20Sopenharmony_cienum cryp_crypen { 238c2ecf20Sopenharmony_ci CRYP_CRYPEN_DISABLE = 0, 248c2ecf20Sopenharmony_ci CRYP_CRYPEN_ENABLE = 1 258c2ecf20Sopenharmony_ci}; 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci/* CRYP Start Computation enable/disable */ 288c2ecf20Sopenharmony_cienum cryp_start { 298c2ecf20Sopenharmony_ci CRYP_START_DISABLE = 0, 308c2ecf20Sopenharmony_ci CRYP_START_ENABLE = 1 318c2ecf20Sopenharmony_ci}; 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci/* CRYP Init Signal enable/disable */ 348c2ecf20Sopenharmony_cienum cryp_init { 358c2ecf20Sopenharmony_ci CRYP_INIT_DISABLE = 0, 368c2ecf20Sopenharmony_ci CRYP_INIT_ENABLE = 1 378c2ecf20Sopenharmony_ci}; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci/* Cryp State enable/disable */ 408c2ecf20Sopenharmony_cienum cryp_state { 418c2ecf20Sopenharmony_ci CRYP_STATE_DISABLE = 0, 428c2ecf20Sopenharmony_ci CRYP_STATE_ENABLE = 1 438c2ecf20Sopenharmony_ci}; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci/* Key preparation bit enable */ 468c2ecf20Sopenharmony_cienum cryp_key_prep { 478c2ecf20Sopenharmony_ci KSE_DISABLED = 0, 488c2ecf20Sopenharmony_ci KSE_ENABLED = 1 498c2ecf20Sopenharmony_ci}; 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci/* Key size for AES */ 528c2ecf20Sopenharmony_ci#define CRYP_KEY_SIZE_128 (0) 538c2ecf20Sopenharmony_ci#define CRYP_KEY_SIZE_192 (1) 548c2ecf20Sopenharmony_ci#define CRYP_KEY_SIZE_256 (2) 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci/* AES modes */ 578c2ecf20Sopenharmony_cienum cryp_algo_mode { 588c2ecf20Sopenharmony_ci CRYP_ALGO_TDES_ECB, 598c2ecf20Sopenharmony_ci CRYP_ALGO_TDES_CBC, 608c2ecf20Sopenharmony_ci CRYP_ALGO_DES_ECB, 618c2ecf20Sopenharmony_ci CRYP_ALGO_DES_CBC, 628c2ecf20Sopenharmony_ci CRYP_ALGO_AES_ECB, 638c2ecf20Sopenharmony_ci CRYP_ALGO_AES_CBC, 648c2ecf20Sopenharmony_ci CRYP_ALGO_AES_CTR, 658c2ecf20Sopenharmony_ci CRYP_ALGO_AES_XTS 668c2ecf20Sopenharmony_ci}; 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci/* Cryp Encryption or Decryption */ 698c2ecf20Sopenharmony_cienum cryp_algorithm_dir { 708c2ecf20Sopenharmony_ci CRYP_ALGORITHM_ENCRYPT, 718c2ecf20Sopenharmony_ci CRYP_ALGORITHM_DECRYPT 728c2ecf20Sopenharmony_ci}; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci/* Hardware access method */ 758c2ecf20Sopenharmony_cienum cryp_mode { 768c2ecf20Sopenharmony_ci CRYP_MODE_POLLING, 778c2ecf20Sopenharmony_ci CRYP_MODE_INTERRUPT, 788c2ecf20Sopenharmony_ci CRYP_MODE_DMA 798c2ecf20Sopenharmony_ci}; 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci/** 828c2ecf20Sopenharmony_ci * struct cryp_config - 838c2ecf20Sopenharmony_ci * @keysize: Key size for AES 848c2ecf20Sopenharmony_ci * @algomode: AES modes 858c2ecf20Sopenharmony_ci * @algodir: Cryp Encryption or Decryption 868c2ecf20Sopenharmony_ci * 878c2ecf20Sopenharmony_ci * CRYP configuration structure to be passed to set configuration 888c2ecf20Sopenharmony_ci */ 898c2ecf20Sopenharmony_cistruct cryp_config { 908c2ecf20Sopenharmony_ci int keysize; 918c2ecf20Sopenharmony_ci enum cryp_algo_mode algomode; 928c2ecf20Sopenharmony_ci enum cryp_algorithm_dir algodir; 938c2ecf20Sopenharmony_ci}; 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci/** 968c2ecf20Sopenharmony_ci * struct cryp_protection_config - 978c2ecf20Sopenharmony_ci * @privilege_access: Privileged cryp state enable/disable 988c2ecf20Sopenharmony_ci * @secure_access: Secure cryp state enable/disable 998c2ecf20Sopenharmony_ci * 1008c2ecf20Sopenharmony_ci * Protection configuration structure for setting privilage access 1018c2ecf20Sopenharmony_ci */ 1028c2ecf20Sopenharmony_cistruct cryp_protection_config { 1038c2ecf20Sopenharmony_ci enum cryp_state privilege_access; 1048c2ecf20Sopenharmony_ci enum cryp_state secure_access; 1058c2ecf20Sopenharmony_ci}; 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci/* Cryp status */ 1088c2ecf20Sopenharmony_cienum cryp_status_id { 1098c2ecf20Sopenharmony_ci CRYP_STATUS_BUSY = 0x10, 1108c2ecf20Sopenharmony_ci CRYP_STATUS_OUTPUT_FIFO_FULL = 0x08, 1118c2ecf20Sopenharmony_ci CRYP_STATUS_OUTPUT_FIFO_NOT_EMPTY = 0x04, 1128c2ecf20Sopenharmony_ci CRYP_STATUS_INPUT_FIFO_NOT_FULL = 0x02, 1138c2ecf20Sopenharmony_ci CRYP_STATUS_INPUT_FIFO_EMPTY = 0x01 1148c2ecf20Sopenharmony_ci}; 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_ci/* Cryp DMA interface */ 1178c2ecf20Sopenharmony_ci#define CRYP_DMA_TX_FIFO 0x08 1188c2ecf20Sopenharmony_ci#define CRYP_DMA_RX_FIFO 0x10 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_cienum cryp_dma_req_type { 1218c2ecf20Sopenharmony_ci CRYP_DMA_DISABLE_BOTH, 1228c2ecf20Sopenharmony_ci CRYP_DMA_ENABLE_IN_DATA, 1238c2ecf20Sopenharmony_ci CRYP_DMA_ENABLE_OUT_DATA, 1248c2ecf20Sopenharmony_ci CRYP_DMA_ENABLE_BOTH_DIRECTIONS 1258c2ecf20Sopenharmony_ci}; 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_cienum cryp_dma_channel { 1288c2ecf20Sopenharmony_ci CRYP_DMA_RX = 0, 1298c2ecf20Sopenharmony_ci CRYP_DMA_TX 1308c2ecf20Sopenharmony_ci}; 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci/* Key registers */ 1338c2ecf20Sopenharmony_cienum cryp_key_reg_index { 1348c2ecf20Sopenharmony_ci CRYP_KEY_REG_1, 1358c2ecf20Sopenharmony_ci CRYP_KEY_REG_2, 1368c2ecf20Sopenharmony_ci CRYP_KEY_REG_3, 1378c2ecf20Sopenharmony_ci CRYP_KEY_REG_4 1388c2ecf20Sopenharmony_ci}; 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci/* Key register left and right */ 1418c2ecf20Sopenharmony_cistruct cryp_key_value { 1428c2ecf20Sopenharmony_ci u32 key_value_left; 1438c2ecf20Sopenharmony_ci u32 key_value_right; 1448c2ecf20Sopenharmony_ci}; 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci/* Cryp Initialization structure */ 1478c2ecf20Sopenharmony_cienum cryp_init_vector_index { 1488c2ecf20Sopenharmony_ci CRYP_INIT_VECTOR_INDEX_0, 1498c2ecf20Sopenharmony_ci CRYP_INIT_VECTOR_INDEX_1 1508c2ecf20Sopenharmony_ci}; 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci/* struct cryp_init_vector_value - 1538c2ecf20Sopenharmony_ci * @init_value_left 1548c2ecf20Sopenharmony_ci * @init_value_right 1558c2ecf20Sopenharmony_ci * */ 1568c2ecf20Sopenharmony_cistruct cryp_init_vector_value { 1578c2ecf20Sopenharmony_ci u32 init_value_left; 1588c2ecf20Sopenharmony_ci u32 init_value_right; 1598c2ecf20Sopenharmony_ci}; 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_ci/** 1628c2ecf20Sopenharmony_ci * struct cryp_device_context - structure for a cryp context. 1638c2ecf20Sopenharmony_ci * @cr: control register 1648c2ecf20Sopenharmony_ci * @dmacr: DMA control register 1658c2ecf20Sopenharmony_ci * @imsc: Interrupt mask set/clear register 1668c2ecf20Sopenharmony_ci * @key_1_l: Key 1l register 1678c2ecf20Sopenharmony_ci * @key_1_r: Key 1r register 1688c2ecf20Sopenharmony_ci * @key_2_l: Key 2l register 1698c2ecf20Sopenharmony_ci * @key_2_r: Key 2r register 1708c2ecf20Sopenharmony_ci * @key_3_l: Key 3l register 1718c2ecf20Sopenharmony_ci * @key_3_r: Key 3r register 1728c2ecf20Sopenharmony_ci * @key_4_l: Key 4l register 1738c2ecf20Sopenharmony_ci * @key_4_r: Key 4r register 1748c2ecf20Sopenharmony_ci * @init_vect_0_l: Initialization vector 0l register 1758c2ecf20Sopenharmony_ci * @init_vect_0_r: Initialization vector 0r register 1768c2ecf20Sopenharmony_ci * @init_vect_1_l: Initialization vector 1l register 1778c2ecf20Sopenharmony_ci * @init_vect_1_r: Initialization vector 0r register 1788c2ecf20Sopenharmony_ci * @din: Data in register 1798c2ecf20Sopenharmony_ci * @dout: Data out register 1808c2ecf20Sopenharmony_ci * 1818c2ecf20Sopenharmony_ci * CRYP power management specifc structure. 1828c2ecf20Sopenharmony_ci */ 1838c2ecf20Sopenharmony_cistruct cryp_device_context { 1848c2ecf20Sopenharmony_ci u32 cr; 1858c2ecf20Sopenharmony_ci u32 dmacr; 1868c2ecf20Sopenharmony_ci u32 imsc; 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_ci u32 key_1_l; 1898c2ecf20Sopenharmony_ci u32 key_1_r; 1908c2ecf20Sopenharmony_ci u32 key_2_l; 1918c2ecf20Sopenharmony_ci u32 key_2_r; 1928c2ecf20Sopenharmony_ci u32 key_3_l; 1938c2ecf20Sopenharmony_ci u32 key_3_r; 1948c2ecf20Sopenharmony_ci u32 key_4_l; 1958c2ecf20Sopenharmony_ci u32 key_4_r; 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_ci u32 init_vect_0_l; 1988c2ecf20Sopenharmony_ci u32 init_vect_0_r; 1998c2ecf20Sopenharmony_ci u32 init_vect_1_l; 2008c2ecf20Sopenharmony_ci u32 init_vect_1_r; 2018c2ecf20Sopenharmony_ci 2028c2ecf20Sopenharmony_ci u32 din; 2038c2ecf20Sopenharmony_ci u32 dout; 2048c2ecf20Sopenharmony_ci}; 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_cistruct cryp_dma { 2078c2ecf20Sopenharmony_ci dma_cap_mask_t mask; 2088c2ecf20Sopenharmony_ci struct completion cryp_dma_complete; 2098c2ecf20Sopenharmony_ci struct dma_chan *chan_cryp2mem; 2108c2ecf20Sopenharmony_ci struct dma_chan *chan_mem2cryp; 2118c2ecf20Sopenharmony_ci struct stedma40_chan_cfg *cfg_cryp2mem; 2128c2ecf20Sopenharmony_ci struct stedma40_chan_cfg *cfg_mem2cryp; 2138c2ecf20Sopenharmony_ci int sg_src_len; 2148c2ecf20Sopenharmony_ci int sg_dst_len; 2158c2ecf20Sopenharmony_ci struct scatterlist *sg_src; 2168c2ecf20Sopenharmony_ci struct scatterlist *sg_dst; 2178c2ecf20Sopenharmony_ci int nents_src; 2188c2ecf20Sopenharmony_ci int nents_dst; 2198c2ecf20Sopenharmony_ci}; 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_ci/** 2228c2ecf20Sopenharmony_ci * struct cryp_device_data - structure for a cryp device. 2238c2ecf20Sopenharmony_ci * @base: Pointer to virtual base address of the cryp device. 2248c2ecf20Sopenharmony_ci * @phybase: Pointer to physical memory location of the cryp device. 2258c2ecf20Sopenharmony_ci * @dev: Pointer to the devices dev structure. 2268c2ecf20Sopenharmony_ci * @clk: Pointer to the device's clock control. 2278c2ecf20Sopenharmony_ci * @pwr_regulator: Pointer to the device's power control. 2288c2ecf20Sopenharmony_ci * @power_status: Current status of the power. 2298c2ecf20Sopenharmony_ci * @ctx_lock: Lock for current_ctx. 2308c2ecf20Sopenharmony_ci * @current_ctx: Pointer to the currently allocated context. 2318c2ecf20Sopenharmony_ci * @list_node: For inclusion into a klist. 2328c2ecf20Sopenharmony_ci * @dma: The dma structure holding channel configuration. 2338c2ecf20Sopenharmony_ci * @power_state: TRUE = power state on, FALSE = power state off. 2348c2ecf20Sopenharmony_ci * @power_state_spinlock: Spinlock for power_state. 2358c2ecf20Sopenharmony_ci * @restore_dev_ctx: TRUE = saved ctx, FALSE = no saved ctx. 2368c2ecf20Sopenharmony_ci */ 2378c2ecf20Sopenharmony_cistruct cryp_device_data { 2388c2ecf20Sopenharmony_ci struct cryp_register __iomem *base; 2398c2ecf20Sopenharmony_ci phys_addr_t phybase; 2408c2ecf20Sopenharmony_ci struct device *dev; 2418c2ecf20Sopenharmony_ci struct clk *clk; 2428c2ecf20Sopenharmony_ci struct regulator *pwr_regulator; 2438c2ecf20Sopenharmony_ci int power_status; 2448c2ecf20Sopenharmony_ci spinlock_t ctx_lock; 2458c2ecf20Sopenharmony_ci struct cryp_ctx *current_ctx; 2468c2ecf20Sopenharmony_ci struct klist_node list_node; 2478c2ecf20Sopenharmony_ci struct cryp_dma dma; 2488c2ecf20Sopenharmony_ci bool power_state; 2498c2ecf20Sopenharmony_ci spinlock_t power_state_spinlock; 2508c2ecf20Sopenharmony_ci bool restore_dev_ctx; 2518c2ecf20Sopenharmony_ci}; 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_civoid cryp_wait_until_done(struct cryp_device_data *device_data); 2548c2ecf20Sopenharmony_ci 2558c2ecf20Sopenharmony_ci/* Initialization functions */ 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ciint cryp_check(struct cryp_device_data *device_data); 2588c2ecf20Sopenharmony_ci 2598c2ecf20Sopenharmony_civoid cryp_activity(struct cryp_device_data *device_data, 2608c2ecf20Sopenharmony_ci enum cryp_crypen cryp_crypen); 2618c2ecf20Sopenharmony_ci 2628c2ecf20Sopenharmony_civoid cryp_flush_inoutfifo(struct cryp_device_data *device_data); 2638c2ecf20Sopenharmony_ci 2648c2ecf20Sopenharmony_ciint cryp_set_configuration(struct cryp_device_data *device_data, 2658c2ecf20Sopenharmony_ci struct cryp_config *cryp_config, 2668c2ecf20Sopenharmony_ci u32 *control_register); 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_civoid cryp_configure_for_dma(struct cryp_device_data *device_data, 2698c2ecf20Sopenharmony_ci enum cryp_dma_req_type dma_req); 2708c2ecf20Sopenharmony_ci 2718c2ecf20Sopenharmony_ciint cryp_configure_key_values(struct cryp_device_data *device_data, 2728c2ecf20Sopenharmony_ci enum cryp_key_reg_index key_reg_index, 2738c2ecf20Sopenharmony_ci struct cryp_key_value key_value); 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_ciint cryp_configure_init_vector(struct cryp_device_data *device_data, 2768c2ecf20Sopenharmony_ci enum cryp_init_vector_index 2778c2ecf20Sopenharmony_ci init_vector_index, 2788c2ecf20Sopenharmony_ci struct cryp_init_vector_value 2798c2ecf20Sopenharmony_ci init_vector_value); 2808c2ecf20Sopenharmony_ci 2818c2ecf20Sopenharmony_ciint cryp_configure_protection(struct cryp_device_data *device_data, 2828c2ecf20Sopenharmony_ci struct cryp_protection_config *p_protect_config); 2838c2ecf20Sopenharmony_ci 2848c2ecf20Sopenharmony_ci/* Power management funtions */ 2858c2ecf20Sopenharmony_civoid cryp_save_device_context(struct cryp_device_data *device_data, 2868c2ecf20Sopenharmony_ci struct cryp_device_context *ctx, 2878c2ecf20Sopenharmony_ci int cryp_mode); 2888c2ecf20Sopenharmony_ci 2898c2ecf20Sopenharmony_civoid cryp_restore_device_context(struct cryp_device_data *device_data, 2908c2ecf20Sopenharmony_ci struct cryp_device_context *ctx); 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_ci/* Data transfer and status bits. */ 2938c2ecf20Sopenharmony_ciint cryp_is_logic_busy(struct cryp_device_data *device_data); 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_ciint cryp_get_status(struct cryp_device_data *device_data); 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci/** 2988c2ecf20Sopenharmony_ci * cryp_write_indata - This routine writes 32 bit data into the data input 2998c2ecf20Sopenharmony_ci * register of the cryptography IP. 3008c2ecf20Sopenharmony_ci * @device_data: Pointer to the device data struct for base address. 3018c2ecf20Sopenharmony_ci * @write_data: Data to write. 3028c2ecf20Sopenharmony_ci */ 3038c2ecf20Sopenharmony_ciint cryp_write_indata(struct cryp_device_data *device_data, u32 write_data); 3048c2ecf20Sopenharmony_ci 3058c2ecf20Sopenharmony_ci/** 3068c2ecf20Sopenharmony_ci * cryp_read_outdata - This routine reads the data from the data output 3078c2ecf20Sopenharmony_ci * register of the CRYP logic 3088c2ecf20Sopenharmony_ci * @device_data: Pointer to the device data struct for base address. 3098c2ecf20Sopenharmony_ci * @read_data: Read the data from the output FIFO. 3108c2ecf20Sopenharmony_ci */ 3118c2ecf20Sopenharmony_ciint cryp_read_outdata(struct cryp_device_data *device_data, u32 *read_data); 3128c2ecf20Sopenharmony_ci 3138c2ecf20Sopenharmony_ci#endif /* _CRYP_H_ */ 314