415 lines
12 KiB
C
Executable File
415 lines
12 KiB
C
Executable File
/*
|
|
* Broadcom SiliconBackplane ARM definitions
|
|
*
|
|
* Copyright (C) 2022, 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_ */
|