blob: bdddbcedd24731c9a4dd8fd40ce3fc1bd2c6bc35 [file] [log] [blame]
/*
* 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_ */