blob: c63f3864aaf27720f854a010d8678c9bbc68d342 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001#ifndef _ASR_BCM_H_
2#define _ASR_BCM_H_
3
4#include <linux/crypto.h>
5#include <crypto/algapi.h>
6#include <linux/interrupt.h>
7#include <linux/mutex.h>
8#include <linux/miscdevice.h>
9
10#include "asr-sha.h"
11#include "asr-cipher.h"
12
13#define BIU_OFFSET (0x00000000L)
14#define ADEC_OFFSET (0x00000400L)
15#define DMA_OFFSET (0x00000800L)
16#define ABUS_OFFSET (0x00000C00L)
17#define CRYPTO_OFFSET (0x00001000L)
18#define HASH_OFFSET (0x00001800L)
19#define SCRATCH_TBL_OFFSET (0x00001C00L)
20
21/* biu registers */
22#define BIU_HST_INTERRUPT_MASK (BIU_OFFSET + 0x00CC)
23#define BIU_SP_INTERRUPT_MASK (BIU_OFFSET + 0x021C)
24#define BIU_SP_CONTROL (BIU_OFFSET + 0x0220)
25
26/* adec registers */
27#define ADEC_CTRL (ADEC_OFFSET + 0x0000)
28#define ADEC_CTRL2 (ADEC_OFFSET + 0x0004)
29#define AXI_SL_CTRL (ADEC_OFFSET + 0x0008)
30#define ADEC_INT (ADEC_OFFSET + 0x000C)
31#define ADEC_INT_MSK (ADEC_OFFSET + 0x0010)
32#define ADEC_ACC_ERR_ADR (ADEC_OFFSET + 0x0014)
33#define ADEC_MP_FIFO_ERR_ADR (ADEC_OFFSET + 0x0018)
34
35/* dma registers */
36#define DMA_IN_CTRL (DMA_OFFSET + 0x0000)
37#define DMA_IN_STATUS (DMA_OFFSET + 0x0004)
38#define DMA_IN_SRC_ADR (DMA_OFFSET + 0x0008)
39#define DMA_IN_XFER_CNTR (DMA_OFFSET + 0x000C)
40#define DMA_IN_NX_LL_ADR (DMA_OFFSET + 0x0010)
41#define DMA_IN_INT (DMA_OFFSET + 0x0014)
42#define DMA_IN_INT_MSK (DMA_OFFSET + 0x0018)
43#define DMA_OUT_CTRL (DMA_OFFSET + 0x001C)
44#define DMA_OUT_STATUS (DMA_OFFSET + 0x0020)
45#define DMA_OUT_DEST_ADR (DMA_OFFSET + 0x0024)
46#define DMA_OUT_XFER_CNTR (DMA_OFFSET + 0x0028)
47#define DMA_OUT_NX_LL_ADR (DMA_OFFSET + 0x002C)
48#define DMA_OUT_INT (DMA_OFFSET + 0x0030)
49#define DMA_OUT_INT_MSK (DMA_OFFSET + 0x0034)
50
51/* accel bus registers */
52#define ABUS_BUS_CTRL (ABUS_OFFSET + 0x0000)
53
54/* hash bus registers */
55#define HASH_CONFIG (HASH_OFFSET + 0x0000)
56#define HASH_CONTROL (HASH_OFFSET + 0x0004)
57#define HASH_COMMAND (HASH_OFFSET + 0x0008)
58#define HASH_STATUS (HASH_OFFSET + 0x000C)
59#define HASH_INCOME_SEG_SZ (HASH_OFFSET + 0x0010)
60#define HASH_TOTAL_MSG_SZ_L (HASH_OFFSET + 0x0018)
61#define HASH_TOTAL_MSG_SZ_H (HASH_OFFSET + 0x001C)
62#define HASH_DIGEST_BASE (HASH_OFFSET + 0x0020)
63#define HASH_DIGEST(a) (HASH_DIGEST_BASE + ((a) << 2))
64#define HASH_DIGEST_H_BASE (HASH_OFFSET + 0x0040)
65#define HASH_DIGEST_H(a) (HASH_DIGEST_H_BASE + ((a) << 2))
66
67/* crypto bus registers */
68#define CRYPTO_AES_CONFIG_REG (CRYPTO_OFFSET + 0x0000)
69#define CRYPTO_AES_CONTROL_REG (CRYPTO_OFFSET + 0x0004)
70#define CRYPTO_AES_COMMAND_REG (CRYPTO_OFFSET + 0x0008)
71#define CRYPTO_AES_STATUS_REG (CRYPTO_OFFSET + 0x000C)
72#define CRYPTO_AES_INTRPT_SRC_REG (CRYPTO_OFFSET + 0x0010)
73#define CRYPTO_AES_INTRPT_SRC_EN_REG (CRYPTO_OFFSET + 0x0014)
74#define CRYPTO_AES_STREAM_SIZE_REG (CRYPTO_OFFSET + 0x0018)
75#define CRYPTO_ENGINE_SEL_REG (CRYPTO_OFFSET + 0x00A8)
76
77#define CRYPTO_K2_BASE (CRYPTO_OFFSET + 0x0058)
78#define CRYPTO_K2_W_REG(a) (CRYPTO_K2_BASE + a*0x04)
79#define CRYPTO_K1_BASE (CRYPTO_OFFSET + 0x0078)
80#define CRYPTO_K1_W_REG(a) (CRYPTO_K1_BASE + a*0x04)
81#define CRYPTO_IV_BASE (CRYPTO_OFFSET + 0x0098)
82#define CRYPTO_IV_REG(a) (CRYPTO_IV_BASE + a*0x04)
83
84typedef enum {
85 ABUS_GRP_A_HASH = 0x0,
86 ABUS_GRP_A_RC4 = 0x4,
87 ABUS_GRP_A_ECP = 0x5,
88 ABUS_GRP_A_ZMODP = 0x6,
89} ABUS_GRP_A_T;
90
91typedef enum {
92 ABUS_GRP_B_AES = 0x0,
93 ABUS_GRP_B_DES = 0x1,
94 ABUS_GRP_B_BYPASS = 0x2,
95 ABUS_GRP_B_RC4 = 0x4,
96} ABUS_GRP_B_T;
97
98typedef enum {
99 ABUS_STRAIGHT = 0,
100 ABUS_CROSS,
101} ABUS_CROSS_BAR_T;
102
103typedef enum {
104 /* reset bit */
105 ACC_ENG_DMA = 1,
106 ACC_ENG_HASH = 5,
107 ACC_ENG_CRYPTO = 3,
108 ACC_ENG_EBG = 10,
109 ACC_ENG_MCT = 8,
110 ACC_ENG_SCRATCH_PAD = 6,
111 ACC_ENG_ZMOP = 7,
112 ACC_ENG_ALL,
113} ADEC_ACC_ENG_T;
114
115struct asr_te200_sha;
116
117struct asr_bcm_dev {
118 unsigned long phys_base;
119 void __iomem *io_base;
120 struct mutex bcm_lock;
121 struct device *dev;
122
123 struct clk *bcm_clk;
124 int clk_synced;
125 refcount_t refcount;
126
127 int irq;
128
129 struct asr_bcm_sha asr_sha;
130 struct asr_bcm_cipher asr_cipher;
131
132 struct asr_bcm_ops *bcm_ops;
133};
134
135struct asr_bcm_ops {
136 int (*dev_get)(struct asr_bcm_dev *);
137 int (*dev_put)(struct asr_bcm_dev *);
138};
139
140void dma_input_start(struct asr_bcm_dev *dd);
141void dma_input_stop(struct asr_bcm_dev *dd);
142int dma_input_config(struct asr_bcm_dev *dd, int rid_ext, int rid);
143int dma_input_address(struct asr_bcm_dev *dd, uint32_t src_addr, uint32_t src_size, int chained);
144void dma_output_start(struct asr_bcm_dev *dd);
145void dma_output_stop(struct asr_bcm_dev *dd);
146int dma_output_config(struct asr_bcm_dev *dd, int wid_ext, int wid);
147int dma_output_address(struct asr_bcm_dev *dd, uint32_t dst_addr, uint32_t dst_size, int chained);
148int dma_wait_input_finish(struct asr_bcm_dev *dd);
149int dma_wait_output_finish(struct asr_bcm_dev *dd);
150int adec_engine_hw_reset(struct asr_bcm_dev *dd, ADEC_ACC_ENG_T engine);
151int abus_set_mode(struct asr_bcm_dev *dd, ABUS_GRP_A_T grp_a_mode,
152 ABUS_GRP_B_T grp_b_mode, ABUS_CROSS_BAR_T input_bar, ABUS_CROSS_BAR_T output_bar);
153
154int asr_bcm_sha_register(struct asr_bcm_dev *bcm_dd);
155int asr_bcm_sha_unregister(struct asr_bcm_dev *bcm_dd);
156
157int asr_bcm_cipher_register(struct asr_bcm_dev *bcm_dd);
158int asr_bcm_cipher_unregister(struct asr_bcm_dev *bcm_dd);
159
160#endif