blob: baa0224ee9a6b5222458419509f83b14a60702d9 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001#include <asm/arch/cpu.h>
2#include <asm/io.h>
3#include "asr_bcm.h"
4#include "asr_hash.h"
5
6void bcm_enable(int enable)
7{
8 uint32_t val;
9 /* it will no longer enable clk if the clk has been enabled */
10 static int enabled = 0;
11
12 if (enable) {
13 /* enable clock */
14 val = bcm_read32((AES_CLK_RES_CTRL));
15 if ((val & (1 << 4 | 1 << 5)) == (1 << 4 | 1 << 5)) {
16 enabled = 1;
17 return;
18 }
19 val |= (1 << 4 | 1 << 5);
20 bcm_write32(AES_CLK_RES_CTRL, val);
21
22 /* init */
23 bcm_write32(BIU_SP_CONTROL, 0x6);
24 bcm_write32(BIU_SP_INTERRUPT_MASK, 0xFFFFFFFF);
25 bcm_write32(BIU_HST_INTERRUPT_MASK, 0xFFFFFFFF);
26 bcm_write32(ADEC_INT_MSK, 0xFFFFFFFF);
27 } else {
28 /* disable clock */
29 if (enabled) {
30 return;
31 }
32 val = bcm_read32(AES_CLK_RES_CTRL);
33 val &= ~(1 << 4);
34 bcm_write32(AES_CLK_RES_CTRL, val);
35 }
36}
37
38int dma_input_config(int rid_ext, int rid)
39{
40 uint32_t val;
41
42 val = bcm_read32(DMA_IN_CTRL);
43 val &= 0x0f0f0000;
44 val |= (0x7 << 28) | /* dis error check */
45 ((rid_ext & 0xF) << 20) | /* rid ext */
46 (0x1 << 18) | /* dis out-of-order */
47 (0x1 << 17) | /* data 64 byte aligned */
48 (0x1 << 15) | /* FIFO bus size 64bit */
49 (0x1 << 13) | /* brust type: Inc */
50 (0x8 << 8) | /* brust len */
51 ((rid & 0xF) << 4);
52
53 bcm_write32(DMA_IN_CTRL, val);
54
55 return 0;
56}
57
58int dma_input_address(uint32_t src_addr, uint32_t src_size, int chained)
59{
60 if (chained) {
61 bcm_write32(DMA_IN_NX_LL_ADR, src_addr);
62 bcm_write32(DMA_IN_SRC_ADR, 0x0);
63 bcm_write32(DMA_IN_XFER_CNTR, 0x0);
64 } else {
65 bcm_write32(DMA_IN_NX_LL_ADR, 0x0);
66 bcm_write32(DMA_IN_SRC_ADR, src_addr);
67 bcm_write32(DMA_IN_XFER_CNTR, src_size);
68 }
69
70 return 0;
71}
72
73void dma_input_start(void)
74{
75 uint32_t val;
76
77 val = bcm_read32(DMA_IN_INT);
78 bcm_write32(DMA_IN_INT, val);
79
80 val = bcm_read32(DMA_IN_CTRL);
81 val |= 0x1;
82 bcm_write32(DMA_IN_CTRL, val);
83
84 return;
85}
86
87void dma_input_stop(void)
88{
89 uint32_t val;
90
91 val = bcm_read32(DMA_IN_CTRL);
92 val &= ~0x1;
93 bcm_write32(DMA_IN_CTRL, val);
94
95 return;
96}
97
98int dma_wait_input_finish(void)
99{
100 uint32_t val, val_ori;
101 int loop;
102 int ret = 0;
103
104 loop = 10000;
105 while (loop > 0) {
106 val_ori = bcm_read32(DMA_IN_INT);
107 val = (val_ori & 0x1);
108 if (val !=0)
109 break;
110 loop--;
111 udelay(1);
112 }
113
114 if (loop == 0) {
115 ret = -1;
116 } else {
117 ret = 0;
118 }
119
120 dma_input_stop();
121
122 val = bcm_read32(DMA_IN_INT);
123 bcm_write32(DMA_IN_INT, val);
124
125 return ret;
126}
127
128int adec_engine_hw_reset(ADEC_ACC_ENG_T engine)
129{
130 uint32_t val;
131 int tmp;
132
133 if (engine == ACC_ENG_ALL)
134 tmp = 0xffff;
135 else
136 tmp = 1 << engine;
137
138 val = bcm_read32(ADEC_CTRL);
139 val |= tmp;
140 bcm_write32(ADEC_CTRL, val);
141 val &= ~tmp;
142 bcm_write32(ADEC_CTRL, val);
143
144 return 0;
145}
146
147int abus_set_mode(ABUS_GRP_A_T grp_a_mode,
148 ABUS_GRP_B_T grp_b_mode,
149 ABUS_CROSS_BAR_T input_bar,
150 ABUS_CROSS_BAR_T output_bar)
151{
152 uint32_t val;
153
154 val = bcm_read32(ABUS_BUS_CTRL);
155
156 val &= ~(0x77 << 0x4);
157 val |= (grp_a_mode << 0x4) | (grp_b_mode << 0x8);
158
159 if (input_bar == ABUS_STRAIGHT) {
160 val &= ~(0x1 << 0x0);
161 } else if (input_bar == ABUS_CROSS) {
162 val |= (0x1 << 0x0);
163 } else {
164 return -1;
165 }
166
167 if (output_bar == ABUS_STRAIGHT) {
168 val &= ~(0x1 << 0x2);
169 } else if (input_bar == ABUS_CROSS) {
170 val |= (0x1 << 0x2);
171 } else {
172 return -1;
173 }
174
175 bcm_write32(ABUS_BUS_CTRL, val);
176
177 return 0;
178}
179
180int dma_output_config(int wid_ext, int wid)
181{
182 uint32_t val;
183
184 val = bcm_read32(DMA_OUT_CTRL);
185 val &= 0x0f0f0000;
186 val |= (0x7 << 28) | /* dis error check */
187 ((wid_ext & 0xF) << 20) | /* rid ext */
188 (0x1 << 18) | /* dis out-of-order */
189 (0x1 << 17) | /* data 64 byte aligned */
190 (0x1 << 15) | /* FIFO bus size 64bit */
191 (0x1 << 13) | /* brust type: Inc */
192 (0x8 << 8) | /* brust len */
193 ((wid & 0xF) << 4);
194
195 bcm_write32(DMA_OUT_CTRL, val);
196
197 return 0;
198}
199
200void dma_output_start(void)
201{
202 uint32_t val;
203
204 val = bcm_read32(DMA_OUT_INT);
205 bcm_write32(DMA_OUT_INT, val);
206
207 val = bcm_read32(DMA_OUT_CTRL);
208 val |= 0x1;
209 bcm_write32(DMA_OUT_CTRL, val);
210
211 return;
212}
213
214void dma_output_stop(void)
215{
216 uint32_t val;
217
218 val = bcm_read32(DMA_OUT_CTRL);
219 val &= ~0x1;
220 bcm_write32(DMA_OUT_CTRL, val);
221
222 return;
223}
224
225int dma_output_address(uint32_t dst_addr, uint32_t dst_size, int chained)
226{
227 if (chained) {
228 bcm_write32(DMA_OUT_NX_LL_ADR, dst_addr);
229 bcm_write32(DMA_OUT_DEST_ADR, 0x0);
230 bcm_write32(DMA_OUT_XFER_CNTR, 0x0);
231 } else {
232 bcm_write32(DMA_OUT_NX_LL_ADR, 0x0);
233 bcm_write32(DMA_OUT_DEST_ADR, dst_addr);
234 bcm_write32(DMA_OUT_XFER_CNTR, dst_size);
235 }
236
237 return 0;
238}
239
240int dma_wait_output_finish(void)
241{
242 uint32_t val, val_ori;
243 int loop;
244 int ret = 0;
245
246 loop = 10000;
247 while (loop > 0) {
248 val_ori = bcm_read32(DMA_OUT_INT);
249 val = (val_ori & 0x1);
250 if (val !=0)
251 break;
252 loop--;
253 udelay(1);
254 }
255
256 if (loop == 0) {
257 ret = -1;
258 } else {
259 ret = 0;
260 }
261
262 dma_output_stop();
263
264 val = bcm_read32(DMA_OUT_INT);
265 bcm_write32(DMA_OUT_INT, val);
266
267 return ret;
268}