hc
2023-02-13 e440ec23c5a540cdd3f7464e8779219be6fd3d95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
/*
 * Broadcom SiliconBackplane ARM definitions
 *
 * Copyright (C) 2020, Broadcom.
 *
 *      Unless you and Broadcom execute a separate written software license
 * agreement governing use of this software, this software is licensed to you
 * under the terms of the GNU General Public License version 2 (the "GPL"),
 * available at http://www.broadcom.com/licenses/GPLv2.php, with the
 * following added to such license:
 *
 *      As a special exception, the copyright holders of this software give you
 * permission to link this software with independent modules, and to copy and
 * distribute the resulting executable under terms of your choice, provided that
 * you also meet, for each linked independent module, the terms and conditions of
 * the license of that module.  An independent module is a module which is not
 * derived from this software.  The special exception does not apply to any
 * modifications of the software.
 *
 *
 * <<Broadcom-WL-IPTag/Dual:>>
 */
 
#ifndef    _sbhndarm_h_
#define    _sbhndarm_h_
 
#ifdef DONGLEBUILD
 
#include <arminc.h>
#include <sbconfig.h>
 
/* register offsets */
#define    ARM7_CORECTL        0
 
/* bits in corecontrol */
#define    ACC_FORCED_RST        0x1
#define    ACC_SERRINT        0x2
#define    ACC_WFICLKSTOP        0x4
 
#if !defined(__ARM_ARCH_7A__)
#define ACC_NOTSLEEPINGCLKREQ_SHIFT    24
#endif /* !__ARM_ARCH_7A__ */
 
#if defined(__ARM_ARCH_7A__)
 
#define ACC_FORCECLOCKRATIO        (0x1u << 8)
#define ACC_CLOCKRATIO_SHIFT        (9u)
#define ACC_CLOCKRATIO_MASK        (0xFu << ACC_CLOCKRATIO_SHIFT)
 
#define ACC_CLOCKRATIO_1_TO_1        (0u)
#define ACC_CLOCKRATIO_2_TO_1        (1u)
#define ACC_CLOCKRATIO_3_TO_1        (2u)
#define ACC_CLOCKRATIO_4_TO_1        (3u)
 
#define ACC_FASTCLOCKCHANNEL_SHIFT    (24u)
#define ACC_FASTCLOCKCHANNEL_MASK    (0x3u << ACC_FASTCLOCKCHANNEL_SHIFT)
#define ACC_NUM_FASTCLOCKS_SHIFT    (2u)
#define ACC_NUM_FASTCLOCKS_MASK        (0x3u << ACC_NUM_FASTCLOCKS_SHIFT)
 
#define ACC_NOTSLEEPINGCLKREQ_SHIFT    (4u)
#define ACC_NOTSLEEPINGCLKREQ_MASK    (0x3u << ACC_NOT_SLEEPING_CLKREQ_SHIFT)
#define ACC_NOTSLEEPING_ALP        (0u)
#define ACC_NOTSLEEPING_HT        (1u)
#define ACC_NOTSLEEPING_ALP_HT_AVAIL    (2u)
#define ACC_NOTSLEEPING_HT_AVAIL    (3u)
 
#elif defined(__ARM_ARCH_7R__) /* CR4 */
 
#define ACC_FORCECLOCKRATIO    (1u << 7u)
#define ACC_CLOCKRATIO_SHIFT    8u
#define ACC_CLOCKRATIO_MASK    (0xFu << ACC_CLOCKRATIO_SHIFT)
#define ACC_CLOCKMODE_SHIFT    12u
#define ACC_CLOCKMODE_MASK    (7u << ACC_CLOCKMODE_SHIFT)
#define ACC_NOTSLEEPCLKREQ0    3u
#define ACC_NOTSLEEPCLKREQ1    18u
#define ACC_FLOPSPROTECT    (1u << 20u)
 
#define ACC_CLOCKRATIO_1_TO_1    (0u)
#define ACC_CLOCKRATIO_2_TO_1    (4u)
 
#endif /* __ARM_ARCH_7A__ */
 
#define ACC_CLOCKMODE_SAME    (0)    /**< BP and CPU clock are the same */
#define ACC_CLOCKMODE_ASYNC    (1)    /**< BP and CPU clock are asynchronous */
#define ACC_CLOCKMODE_SYNCH    (2)    /**< BP and CPU clock are synch, ratio 1:1 or 1:2 */
 
/* Request ALP on backplane bit 3 and 18 */
#define ACC_REQALP            ((1<<ACC_NOTSLEEPCLKREQ0) | (1<<ACC_NOTSLEEPCLKREQ1))
 
#define ACC_MPU_SHIFT        25u
#define ACC_MPU_MASK        (0x1u << ACC_MPU_SHIFT)
 
#define ACC_MPU_REGION_CNT_MASK        0x7u
#define ACC_MPU_REGION_CNT_SHIFT    3u
 
#define ACC_MPU_SECURE_SHIFT    27u
#define ACC_MPU_SECURE_MASK    (0x1u << ACC_MPU_SECURE_SHIFT)
#define ACC_MPU_READ_SHIFT    30u
#define ACC_MPU_READ_MASK    (0x1u << ACC_MPU_READ_SHIFT)
#define ACC_MPU_WRITE_SHIFT    29u
#define ACC_MPU_WRITE_MASK    (0x1u << ACC_MPU_WRITE_SHIFT)
#define ACC_MPU_VALID_SHIFT    31u
#define ACC_MPU_VALID_MASK    (0x1u << ACC_MPU_VALID_SHIFT)
 
/* arm resetlog */
#define SBRESETLOG        0x1
#define SERRORLOG        0x2
 
/* arm core-specific control flags */
#define    SICF_REMAP_MSK        0x001c
#define    SICF_REMAP_NONE        0
#define    SICF_REMAP_ROM        0x0004
#define    SIFC_REMAP_FLASH    0x0008
 
/* misc core-specific defines */
#if defined(__ARM_ARCH_7M__)
/* cortex-m3 */
/* backplane related stuff */
#define ARM_CORE_ID        ARMCM3_CORE_ID    /**< arm coreid */
#define SI_ARM_ROM        SI_ARMCM3_ROM    /**< ROM backplane/system address */
#define SI_ARM_SRAM2        SI_ARMCM3_SRAM2    /**< RAM backplane address when remap is 1 or 2 */
/* core registers offsets */
#define ARMCM3_CYCLECNT        0x90        /**< Cortex-M3 core registers offsets */
#define ARMCM3_INTTIMER        0x94
#define ARMCM3_INTMASK        0x98
#define ARMCM3_INTSTATUS    0x9c
/* interrupt/exception */
#define ARMCM3_NUMINTS        16        /**< # of external interrupts */
#define ARMCM3_INTALL        ((1 << ARMCM3_NUMINTS) - 1)    /**< Interrupt mask */
#define ARMCM3_SHARED_INT    0        /**< Interrupt shared by multiple cores */
#define ARMCM3_INT(i)        (1 << (i))    /**< Individual interrupt enable/disable */
/* intmask/intstatus bits */
#define ARMCM3_INTMASK_TIMER    0x1
#define ARMCM3_INTMASK_SYSRESET    0x4
#define ARMCM3_INTMASK_LOCKUP    0x8
 
/*
 * Overlay Support in Rev 5
 */
#define ARMCM3_OVL_VALID_SHIFT        0
#define ARMCM3_OVL_VALID        1
#define ARMCM3_OVL_SZ_SHIFT        1
#define ARMCM3_OVL_SZ_MASK        0x0000000e
#define ARMCM3_OVL_SZ_512B        0    /* 512B */
#define ARMCM3_OVL_SZ_1KB        1    /* 1KB */
#define ARMCM3_OVL_SZ_2KB        2    /* 2KB */
#define ARMCM3_OVL_SZ_4KB        3    /* 4KB */
#define ARMCM3_OVL_SZ_8KB        4    /* 8KB */
#define ARMCM3_OVL_SZ_16KB        5    /* 16KB */
#define ARMCM3_OVL_SZ_32KB        6    /* 32KB */
#define ARMCM3_OVL_SZ_64KB        7    /* 64KB */
#define ARMCM3_OVL_ADDR_SHIFT        9
#define ARMCM3_OVL_ADDR_MASK        0x003FFE00
#define ARMCM3_OVL_MAX            16
 
#elif defined(__ARM_ARCH_7R__)
/* cortex-r4 */
/* backplane related stuff */
#define ARM_CORE_ID        ARMCR4_CORE_ID    /**< arm coreid */
#define SI_ARM_ROM        SI_ARMCR4_ROM    /**< ROM backplane/system address */
#define SI_ARM_SRAM2        0x0    /**< In the cr4 the RAM is just not available
                    * when remap is 1
                    */
 
/* core registers offsets */
#define ARMCR4_CORECTL        0
#define ARMCR4_CORECAP        4
#define ARMCR4_COREST        8
 
#define ARMCR4_FIQRSTATUS    0x10
#define ARMCR4_FIQMASK        0x14
#define ARMCR4_IRQMASK        0x18
 
#define ARMCR4_INTSTATUS    0x20
#define ARMCR4_INTMASK        0x24
#define ARMCR4_CYCLECNT        0x28
#define ARMCR4_INTTIMER        0x2c
 
#define ARMCR4_GPIOSEL        0x30
#define ARMCR4_GPIOEN        0x34
 
#define ARMCR4_BANKIDX        0x40
#define ARMCR4_BANKINFO        0x44
#define ARMCR4_BANKSTBY        0x48
#define ARMCR4_BANKPDA        0x4c
 
#define ARMCR4_TCAMPATCHCTRL        0x68
#define ARMCR4_TCAMPATCHTBLBASEADDR    0x6C
#define ARMCR4_TCAMCMDREG        0x70
#define ARMCR4_TCAMDATAREG        0x74
#define ARMCR4_TCAMBANKXMASKREG        0x78
 
#define    ARMCR4_ROMNB_MASK    0xf00
#define    ARMCR4_ROMNB_SHIFT    8
#define    ARMCR4_MSB_ROMNB_MASK    0x1E00000
/* adjusted shift to fit 4-LSB (21 - 4 = 17) */
#define    ARMCR4_MSB_ROMNB_SHIFT    17
#define    ARMCR4_TCBBNB_MASK    0xf0
#define    ARMCR4_TCBBNB_SHIFT    4
#define    ARMCR4_TCBANB_MASK    0xf
#define    ARMCR4_TCBANB_SHIFT    0
 
#define    ARMCR4_MT_MASK        0x300
#define    ARMCR4_MT_SHIFT        8
#define    ARMCR4_MT_ROM        0x100
#define    ARMCR4_MT_RAM        0
 
#define    ARMCR4_BSZ_MASK        0x7f
#define    ARMCR4_BUNITSZ_MASK    0x200
#define    ARMCR4_BSZ_8K        8192
#define    ARMCR4_BSZ_1K        1024
 
#define    ARMCR4_STBY_SUPPORTED        0x400
#define    ARMCR4_STBY_TIMER_PRESENT    0x800
 
#define ARMCR4_TIMER_VAL_MASK        0xfffff
#define ARMCR4_STBY_TIMER_ENABLE    (1 << 24)
#define ARMCR4_STBY_OVERRIDE        (1 << 31)
 
#define ARMCR4_TCAM_ENABLE        (1u << 31u)
#define ARMCR4_TCAM_CLKENAB        (1u << 30u)
#define ARMCR4_TCAM_WRITEPROT        (1u << 29u)
#define ARMCR4_TCAM_PATCHCNT_MASK    0xfu
 
#define ARMCR4_TCAM_CMD_DONE    (1u << 31)
#define ARMCR4_TCAM_MATCH    (1u << 24)
#define ARMCR4_TCAM_OPCODE_MASK    (3 << 16)
#define ARMCR4_TCAM_OPCODE_SHIFT 16
#define ARMCR4_TCAM_ADDR_MASK    0xffff
#define ARMCR4_TCAM_NONE    (0 << ARMCR4_TCAM_OPCODE_SHIFT)
#define ARMCR4_TCAM_READ    (1 << ARMCR4_TCAM_OPCODE_SHIFT)
#define ARMCR4_TCAM_WRITE    (2 << ARMCR4_TCAM_OPCODE_SHIFT)
#define ARMCR4_TCAM_COMPARE    (3 << ARMCR4_TCAM_OPCODE_SHIFT)
#define ARMCR4_TCAM_CMD_DONE_DLY    1000
 
#define ARMCR4_DATA_MASK    (~0x7)
#define ARMCR4_DATA_VALID    (1u << 0)
 
/* intmask/intstatus bits */
#define ARMCR4_INTMASK_TIMER        (0x1)
#define ARMCR4_INTMASK_CLOCKSTABLE    (0x20000000)
 
#define CHIP_SDRENABLE(sih)    (sih->boardflags2 & BFL2_SDR_EN)
#define CHIP_TCMPROTENAB(sih)    (si_arm_sflags(sih) & SISF_TCMPROT)
 
/* Power Control */
#define ARM_ENAB_MEM_CLK_GATE_SHIFT    5
 
#define ROM_STBY_TIMER_4378    0xb0
#define RAM_STBY_TIMER_4378    0x64
 
#define ROM_STBY_TIMER_4387    0x10
#define RAM_STBY_TIMER_4387    0x100
 
#define RAM_STBY_DEFAULT_WAIT_TIME    (3u)
#define ROM_STBY_DEFAULT_WAIT_TIME    (4u)
#define DEFAULT_FORCE_STBY_IN_WFI    (1u)
#define    ARMCR4_DYN_STBY_CTRL_RAM_STBY_WAIT_TIMER_SHIFT    (0u)
#define ARMCR4_DYN_STBY_CTRL_RAM_STBY_WAIT_TIMER_MASK    (0xF << \
       ARMCR4_DYN_STBY_CTRL_RAM_STBY_WAIT_TIMER_SHIFT)
#define    ARMCR4_DYN_STBY_CTRL_ROM_STBY_WAIT_TIMER_SHIFT    (8u)
#define    ARMCR4_DYN_STBY_CTRL_ROM_STBY_WAIT_TIMER_MASK    (0x3F << \
       ARMCR4_DYN_STBY_CTRL_ROM_STBY_WAIT_TIMER_SHIFT)
#define    ARMCR4_DYN_STBY_CTRL_FORCE_STBY_IN_WFI_SHIFT    (16u)
#define    ARMCR4_DYN_STBY_CTRL_FORCE_STBY_IN_WFI_MASK    (0x1 << \
       ARMCR4_DYN_STBY_CTRL_FORCE_STBY_IN_WFI_SHIFT)
 
/* using CHIPID because no capabilities bit */
#define ARM_CLKGATING_CAP(sih)        ((void)(sih), (BCM4378_CHIP(sih->chip) ||\
                    BCM4387_CHIP(sih->chip)))
 
#define ARM_CLKGATING_ENAB(sih)    (ARM_CLKGATING_CAP(sih) && 1)
 
#elif defined(__ARM_ARCH_7A__)
 
#if defined(CA7)
/* backplane related stuff */
#define ARM_CORE_ID        ARMCA7_CORE_ID
#define SI_ARM_ROM        SI_ARMCA7_ROM    /**< ROM backplane/system address */
 
#else
/* backplane related stuff */
#define ARM_CORE_ID        ARMCA9_CORE_ID    /* arm coreid */
#endif /* __ARM_ARCH_7A__ */
#else    /* !__ARM_ARCH_7M__ && !__ARM_ARCH_7R__ */
#error Unrecognized ARM Architecture
#endif    /* !__ARM_ARCH_7M__ && !__ARM_ARCH_7R__ */
 
#endif /* DONGLEBUILD */
 
#ifndef _LANGUAGE_ASSEMBLY
 
/* cpp contortions to concatenate w/arg prescan */
#ifndef PAD
#define    _PADLINE(line)    pad ## line
#define    _XSTR(line)    _PADLINE(line)
#define    PAD        _XSTR(__LINE__)
#endif    /* PAD */
 
/* cortex-m3 */
typedef volatile struct {
   uint32    corecontrol;    /* 0x0 */
   uint32    corestatus;    /* 0x4 */
   uint32    PAD[1];
   uint32    biststatus;    /* 0xc */
   uint32    nmiisrst;    /* 0x10 */
   uint32    nmimask;    /* 0x14 */
   uint32    isrmask;    /* 0x18 */
   uint32    PAD[1];
   uint32    resetlog;    /* 0x20 */
   uint32    gpioselect;    /* 0x24 */
   uint32    gpioenable;    /* 0x28 */
   uint32    PAD[1];
   uint32    bpaddrlo;    /* 0x30 */
   uint32    bpaddrhi;    /* 0x34 */
   uint32    bpdata;        /* 0x38 */
   uint32    bpindaccess;    /* 0x3c */
   uint32    ovlidx;        /* 0x40 */
   uint32    ovlmatch;    /* 0x44 */
   uint32    ovladdr;    /* 0x48 */
   uint32    PAD[13];
   uint32    bwalloc;    /* 0x80 */
   uint32    PAD[3];
   uint32    cyclecnt;    /* 0x90 */
   uint32    inttimer;    /* 0x94 */
   uint32    intmask;    /* 0x98 */
   uint32    intstatus;    /* 0x9c */
   uint32    PAD[80];
   uint32    clk_ctl_st;    /* 0x1e0 */
   uint32  PAD[1];
   uint32  powerctl;    /* 0x1e8 */
} cm3regs_t;
#define ARM_CM3_REG(regs, reg)    (&((cm3regs_t *)regs)->reg)
 
/* cortex-R4 */
typedef volatile struct {
   uint32    corecontrol;        /* 0x0 */
   uint32    corecapabilities;    /* 0x4 */
   uint32    corestatus;        /* 0x8 */
   uint32    biststatus;        /* 0xc */
   uint32    nmiisrst;        /* 0x10 */
   uint32    nmimask;        /* 0x14 */
   uint32    isrmask;        /* 0x18 */
   uint32    swintreg;        /* 0x1C */
   uint32    intstatus;        /* 0x20 */
   uint32    intmask;        /* 0x24 */
   uint32    cyclecnt;        /* 0x28 */
   uint32    inttimer;        /* 0x2c */
   uint32    gpioselect;        /* 0x30 */
   uint32    gpioenable;        /* 0x34 */
   uint32    PAD[2];
   uint32    bankidx;        /* 0x40 */
   uint32    bankinfo;        /* 0x44 */
   uint32    bankstbyctl;        /* 0x48 */
   uint32    bankpda;        /* 0x4c */
   uint32    dyn_stby_control;    /* 0x50 */
   uint32    PAD[5];
   uint32    tcampatchctrl;        /* 0x68 */
   uint32    tcampatchtblbaseaddr;    /* 0x6c */
   uint32    tcamcmdreg;        /* 0x70 */
   uint32    tcamdatareg;        /* 0x74 */
   uint32    tcambankxmaskreg;    /* 0x78 */
   uint32    PAD[5];
   uint32  mpucontrol;        /* 0x90 */
   uint32  mpucapabilities;    /* 0x94 */
   uint32    rom_reloc_addr;        /* 0x98 */
   uint32    PAD[1];
   uint32  region_n_regs[16];    /* 0xa0 - 0xdc */
   uint32  PAD[16];
   uint32  initiat_n_masks[16];    /* 0x120 - 0x15c */
   uint32  PAD[32];
   uint32    clk_ctl_st;        /* 0x1e0 */
   uint32    hw_war;            /* 0x1e4 */
   uint32    powerctl;        /* 0x1e8 */
   uint32  powerctl2;        /* 0x1ec */
} cr4regs_t;
#define ARM_CR4_REG(regs, reg)    (&((cr4regs_t *)regs)->reg)
 
#define SBRESETLOG_CR4        0x4
 
/* cortex-A7 */
typedef volatile struct {
   uint32    corecontrol;        /* 0x0 */
   uint32    corecapabilities;    /* 0x4 */
   uint32    corestatus;        /* 0x8 */
   uint32    tracecontrol;        /* 0xc */
   uint32    gpioselect;        /* 0x10 */
   uint32    gpioenable;        /* 0x14 */
   uint32    PAD[114];
   uint32    clk_ctl_st;        /* 0x1e0 */
   uint32    workaround;        /* 0x1e4 */
   uint32  powerctl;        /* 0x1e8 */
   uint32  powerctl2;        /* 0x1ec */
} ca7regs_t;
#define ARM_CA7_REG(regs, reg)    (&((ca7regs_t *)regs)->reg)
 
#if defined(__ARM_ARCH_7M__)
#define ARMREG(regs, reg)    ARM_CM3_REG(regs, reg)
#endif    /* __ARM_ARCH_7M__ */
 
#if defined(__ARM_ARCH_7R__)
#define ARMREG(regs, reg)    ARM_CR4_REG(regs, reg)
#endif    /* __ARM_ARCH_7R__ */
 
#if defined(__ARM_ARCH_7A__)
#define ARMREG(regs, reg)    ARM_CA7_REG(regs, reg)
#endif    /* __ARM_ARCH_7A__ */
 
/* MPU is present mask of ca7regs_t->corecapabilities */
#define CAP_MPU_MASK        2000000u
 
#endif    /* _LANGUAGE_ASSEMBLY */
 
#endif    /* _sbhndarm_h_ */