blob: ef5119fcb99ba2dba34751e6ab82ed7d6e5f6304 [file] [log] [blame]
/*
* Copyright (c) 2009 Mindspeed Technologies, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*
*/
/*****************************************************************************************
* scc.h
*
* ARM System Control Coprocessor Interface
*
******************************************************************************************/
#ifndef SCC_HEADER
#define SCC_HEADER
/************************************************************************
* Register Bit Fields Definitions
************************************************************************/
/*
* Main ID Register Bit Fields
*/
#define ID_VENDOR(x) (((x) >> 24) & 0x000000FF)
#define ID_VENDOR_ARM 0x00000041
#define ID_VENDOR_DEC 0x00000044
#define ID_VENDOR_INTEL 0x00000069
#define ID_VAR_NUM(x) (((x) >> 20) & 0x0000000F)
#define ID_ARCH(x) (((x) >> 16) & 0x0000000F)
#define ID_ARCH_4 0x00000001
#define ID_ARCH_4T 0x00000002
#define ID_ARCH_5 0x00000003
#define ID_ARCH_5T 0x00000004
#define ID_ARCH_5TE 0x00000005
#define ID_ARCH_6 0x00000007
#define ID_PART_NUM(x) (((x) >> 4) & 0x00000FFF)
#define ID_PART_ARM920T 0x00000920
#define ID_PART_ARM1136JS 0x00000B36
#define ID_REVISION(x) (((x) >> 0) & 0x0000000F)
/*
* Cache Type Register Bit Fields
*/
#define CT_CTYPE(x) (((x) >> 25) & 0x0000000F)
#define CT_CTYPE_WT 0x00000000
#define CT_CTYPE_WB 0x00000001
#define CT_CTYPE_WB_1 0x00000002
#define CT_CTYPE_FMT_A 0x00000006
#define CT_CTYPE_FMT_B 0x00000007
#define CT_CTYPE_FMT_C 0x0000000E
#define CT_S 0x01000000
#define CT_DSIZE(x) (((x) >> 12) & 0x00000FFF)
#define CT_ISIZE(x) (((x) >> 0) & 0x00000FFF)
#define CT_CACHE_LINE(s) (1 << (3 + ((x) & 0x3)))
#define CT_CACHE_M(x) (2 + ((x) >> 2) & 0x1))
#define CT_CACHE_ASSOC(x) (CT_CACHE_M(x) << ((((x) >> 3) & 0x7)-1)))
#define CT_CACHE_SIZE(x) (CT_CACHE_M(x) << ((((x) >> 6) & 0x7)+8)))
/*
* Translation Table Base Register Bit Fields
*/
#define TTB_BASE_MASK 0xFFFFC000
#define TTB_BASE_SHIFT 14
#define TTB_RGN_MASK 0x00000018
#define TTB_RGN_NO_CACHE (0 << 3)
#define TTB_RGN_CACHE_WB_WA (1 << 3)
#define TTB_RGN_CACHE_WT (2 << 3)
#define TTB_RGN_CACHE_WB (3 << 3)
#define TTB_P 0x00000004
#define TTB_S 0x00000002
#define TTB_C 0x00000001
/*
* Translation Table Base Control Register Bit Fields
*/
#define TTBCR_TTB0_16K 0x00000000
#define TTBCR_TTB0_8K 0x00000001
#define TTBCR_TTB0_4K 0x00000002
#define TTBCR_TTB0_2K 0x00000003
#define TTBCR_TTB0_1K 0x00000004
#define TTBCR_TTB0_512 0x00000005
#define TTBCR_TTB0_256 0x00000006
#define TTBCR_TTB0_128 0x00000007
/*
* Domain Access Control Register Bit Fields
*/
#define DACR_Dx_SHIFT(x) ((x) << 1)
#define DACR_Dx_MASK(x) (0x3 << DACR_Dx_SHIFT(x))
#define DACR_NO_ACCESS 0x00000000
#define DACR_CLIENT 0x00000001
#define DACR_MANAGER 0x00000003
/*
* TLB Type Register
*/
#define TLBTYPE_ILSIZE(x) (((x) >> 16) & 0x000000FF)
#define TLBTYPE_DLSIZE(x) (((x) >> 8) & 0x000000FF)
#define TLBTYPE_U 0x00000001
/*
* Control Register Bit Fields
*/
#define CR_ASYNC 0xC0000000
#define CR_SYNC 0x40000000
#define CR_AFE 0x20000000
#define CR_TRE 0x10000000
#define CR_EE 0x02000000
#define CR_VE 0x01000000
#define CR_XP 0x00800000
#define CR_U 0x00400000
#define CR_FI 0x00200000
#define CR_IT 0x00040000
#define CR_DT 0x00010000
#define CR_L4 0x00008000
#define CR_RR 0x00004000
#define CR_V 0x00002000
#define CR_I 0x00001000
#define CR_Z 0x00000800
#define CR_F 0x00000400
#define CR_R 0x00000200
#define CR_S 0x00000100
#define CR_B 0x00000080
#define CR_D 0x00000020
#define CR_P 0x00000010
#define CR_W 0x00000008
#define CR_C 0x00000004
#define CR_A 0x00000002
#define CR_M 0x00000001
/*
* Auxiliary Control Register Bit fields
*/
#define ACR_CZ 0x00000040
#define ACR_RV 0x00000020
#define ACR_RA 0x00000010
#define ACR_TR 0x00000008
#define ACR_SB 0x00000004
#define ACR_DB 0x00000002
#define ACR_RS 0x00000001
/*
* Coprocessor Access Control Register Bit Fields
*/
#define CACR_CPx_SHIFT(x) ((x) << 1)
#define CACR_CPx_MASK(x) (0x3 << CACR_CPx_SHIFT(x))
#define CACR_NO_ACCESS 0x00000000
#define CACR_SUPERVISOR 0x00000001
#define CACR_ALL_ACCESS 0x00000003
/*
* TCM Status Register Bit Fields
*/
#define TCMS_ITCM(x) (((x) >> 0) & 0x3)
#define TCMS_DTCM(x) (((x) >> 16) & 0x3)
/*
* Data TCM Region Register Bit Fields
*/
#define DTCM_BASE_MASK 0xFFFFF000
#define DTCM_BASE_SHIFT 12
#define DTCM_SIZE(x) (((x) >> 2) & 0x1F)
#define DTCM_SIZE_4K 0x00000003
#define DTCM_SIZE_8K 0x00000004
#define DTCM_SIZE_16K 0x00000005
#define DTCM_SIZE_32K 0x00000006
#define DTCM_SIZE_64K 0x00000007
#define DTCM_SC 0x00000002
#define DTCM_En 0x00000001
/*
* Instruction TCM Region Register Bit Fields
*/
#define ITCM_BASE_MASK 0xFFFFF000
#define ITCM_BASE_SHIFT 12
#define ITCM_SIZE(x) (((x) >> 2) & 0x1F)
#define ITCM_SIZE_4K 0x00000003
#define ITCM_SIZE_8K 0x00000004
#define ITCM_SIZE_16K 0x00000005
#define ITCM_SIZE_32K 0x00000006
#define ITCM_SIZE_64K 0x00000007
#define ITCM_SC 0x00000002
#define ITCM_En 0x00000001
/*
* TLB Lockdown Register Bit Fields
*/
#define TLBLOCK_P 0x00000001
/*
* Cache Dirty Status Register Bit Fields
*/
#define CDSR_C 0x00000001
/*
* Data Fault Status Register Bit Fields
*/
#define DFSR_RW 0x00000800
#define DFSR_DOMAIN(x) (((x) >> 4) & 0x0F)
#define DFSR_DOMAIN_SHIFT 4
#define DFSR_STATUS(x) (((x) & 0x0F) | (((x) >> 6) & 0x10))
/*
* Instruction Fault Status Register Bit Fields
*/
#define IFSR_STATUS ((x) & 0x0F)
/*
* Block Transfer Status Register Bit Fields
*/
#define BTSR_R 0x00000001
/*
* Performance Monitor Control Register Bit Fields
*/
#define PMNC_EVT_COUNT0(x) (((x) >> 20) & 0xFF)
#define PMNC_EVT_COUNT1(x) (((x) >> 12) & 0xFF)
#define PMNC_X 0x00000400
#define PMNC_CCR 0x00000200
#define PMNC_CR1 0x00000100
#define PMNC_CR0 0x00000080
#define PMNC_EC1 0x00000020
#define PMNC_EC0 0x00000010
#define PMNC_D 0x00000008
#define PMNC_C 0x00000004
#define PMNC_P 0x00000002
#define PMNC_E 0x00000001
/************************************************************************
* Internal API support macro definitions
************************************************************************/
typedef unsigned long _u32;
#define CP15_RD_API static __inline unsigned long
#define CP15_WR_API static __inline void
#define CP15_GET(Opcode_1, CRn, CRm, Opcode_2) \
register unsigned long value; \
__asm {mrc p15,##Opcode_1,value,##CRn, ##CRm, ##Opcode_2} \
return value;
#define CP15_PUT(Opcode_1, value, CRn, CRm, Opcode_2) \
__asm {mcr p15,##Opcode_1,value,##CRn, ##CRm, ##Opcode_2}
#define CP15_PUT2(Opcode_1, end_addr, start_addr, CRn) \
__asm {mcrr p15, ##Opcode_1, ##end_addr, ##start_addr, ##CRn}
#define CP15_SBZ(Opcode_1, CRn, CRm, Opcode_2) \
register unsigned long SBZ = 0; \
__asm {mcr p15,##Opcode_1,SBZ,##CRn, ##CRm, ##Opcode_2}
#if !defined(COMCERTO_2000)
/************************************************************************
* System control and configuraion
************************************************************************/
CP15_RD_API sys_read_cpuid() {CP15_GET(0,c0,c0,0)}
CP15_RD_API sys_read_cachetype() {CP15_GET(0,c0,c0,1)}
CP15_WR_API sys_write_control(_u32 val) {CP15_PUT(0,val,c1,c0,0)}
CP15_RD_API sys_read_control() {CP15_GET(0,c1,c0,0)}
CP15_WR_API sys_write_aux_control(_u32 val) {CP15_PUT(0,val,c1,c0,1)}
CP15_RD_API sys_read_aux_control() {CP15_GET(0,c1,c0,1)}
CP15_WR_API sys_write_access_control(_u32 val) {CP15_PUT(0,val,c1,c0,2)}
CP15_RD_API sys_read_access_control() {CP15_GET(0,c1,c0,2)}
/************************************************************************
* MMU control and configuration
************************************************************************/
CP15_RD_API mmu_read_tlb_type() {CP15_GET(0,c0,c0,3)}
CP15_WR_API mmu_write_ttb0(_u32 val) {CP15_PUT(0,val,c2,c0,0)}
CP15_RD_API mmu_read_ttb0() {CP15_GET(0,c2,c0,0)}
CP15_WR_API mmu_write_ttb1(_u32 val) {CP15_PUT(0,val,c2,c0,1)}
CP15_RD_API mmu_read_ttb1() {CP15_GET(0,c2,c0,1)}
CP15_WR_API mmu_write_tt_control(_u32 val) {CP15_PUT(0,val,c2,c0,2)}
CP15_RD_API mmu_read_tt_control() {CP15_GET(0,c2,c0,2)}
CP15_WR_API mmu_write_domain_access(_u32 val) {CP15_PUT(0,val,c3,c0,0)}
CP15_RD_API mmu_read_domain_access() {CP15_GET(0,c3,c0,0)}
CP15_WR_API mmu_write_DFS(_u32 val) {CP15_PUT(0,val,c5,c0,0)}
CP15_RD_API mmu_read_DFS() {CP15_GET(0,c5,c0,0)}
CP15_WR_API mmu_write_IFS(_u32 val) {CP15_PUT(0,val,c5,c0,1)}
CP15_RD_API mmu_read_IFS() {CP15_GET(0,c5,c0,1)}
CP15_WR_API mmu_write_fault_address(_u32 val) {CP15_PUT(0,val,c6,c0,0)}
CP15_RD_API mmu_read_fault_address() {CP15_GET(0,c6,c0,0)}
CP15_WR_API mmu_tlb_ic_invalidate() {CP15_SBZ(0,c8,c5,0)}
CP15_WR_API mmu_tlb_ic_invalidate_entry(_u32 val){CP15_PUT(0,val,c8,c5,1)}
CP15_WR_API mmu_tlb_dc_invalidate() {CP15_SBZ(0,c8,c6,0)}
CP15_WR_API mmu_tlb_dc_invalidate_entry(_u32 val){CP15_PUT(0,val,c8,c6,1)}
CP15_WR_API mmu_tlb_invalidate() {CP15_SBZ(0,c8,c7,0)}
CP15_WR_API mmu_tlb_invalidate_entry(_u32 val) {CP15_PUT(0,val,c8,c7,1)}
CP15_WR_API mmu_tlb_lockdown(_u32 val) {CP15_PUT(0,val,c10,c0,0)}
CP15_WR_API mmu_tlb_dc_lockdown(_u32 val) {CP15_PUT(0,val,c10,c0,0)}
CP15_WR_API mmu_tlb_ic_lockdown(_u32 val) {CP15_PUT(0,val,c10,c0,1)}
/************************************************************************
* Cache Operations
************************************************************************/
CP15_WR_API cache_ic_invalidate() {CP15_SBZ(0,c7,c5,0)}
CP15_WR_API cache_invalidate() {CP15_SBZ(0,c7,c7,0)}
CP15_WR_API cache_ic_invalidate_line(_u32 val) {CP15_PUT(0,val,c7,c5,1)}
CP15_WR_API cache_dc_invalidate() {CP15_SBZ(0,c7,c6,0)}
CP15_WR_API cache_dc_clean() {CP15_SBZ(0,c7,c10,0)}
CP15_WR_API cache_dc_clean_invalidate() {CP15_SBZ(0,c7,c14,0)}
CP15_WR_API cache_dc_invalidate_line(_u32 val) {CP15_PUT(0,val,c7,c6,1)}
CP15_WR_API cache_dc_clean_line(_u32 val) {CP15_PUT(0,val,c7,c10,1)}
CP15_WR_API cache_dc_clean_invalidate_line(_u32 val) {CP15_PUT(0,val,c7,c14,1)}
CP15_WR_API drain_write_buffer() {CP15_SBZ(0,c7,c10,4)}
CP15_WR_API cache_dc_memory_barrier() {CP15_SBZ(0,c7,c10,5)}
CP15_WR_API wait_for_interrupt() {CP15_SBZ(0,c7,c0,4)}
CP15_WR_API flush_prefetch_buffer() {CP15_SBZ(0,c7,c5,4)}
CP15_WR_API flush_branch_target() {CP15_SBZ(0,c7,c5,6)}
CP15_WR_API flush_branch_target_entry(_u32 val) {CP15_PUT(0,val,c7,c5,6)}
CP15_RD_API cache_dirty_status() {CP15_GET(0,c7,c10,6)}
CP15_RD_API cache_block_status() {CP15_GET(0,c7,c12,4)}
#if defined (M829_BUILD) || defined (M821_BUILD)
CP15_WR_API cache_ic_invalidate_range(_u32 sa, _u32 ea) {CP15_PUT2(0,ea,sa,c5)}
CP15_WR_API cache_dc_invalidate_range(_u32 sa, _u32 ea) {CP15_PUT2(0,ea,sa,c6)}
CP15_WR_API cache_dc_clean_range(_u32 sa, _u32 ea) {CP15_PUT2(0,ea,sa,c12)}
CP15_WR_API cache_dc_clean_invalidate_range(_u32 sa, _u32 ea) {CP15_PUT2(0,ea,sa,c14)}
#endif
/************************************************************************
* TCM control and configuration (ARM1136)
************************************************************************/
CP15_RD_API tcm_read_status() {CP15_GET(0,c0,c0,2)}
CP15_RD_API tcm_read_data_region() {CP15_GET(0,c9,c1,0)}
CP15_WR_API tcm_write_data_region(_u32 val) {CP15_PUT(0,val,c9,c1,0)}
CP15_RD_API tcm_read_code_region() {CP15_GET(0,c9,c1,1)}
CP15_WR_API tcm_write_code_region(_u32 val) {CP15_PUT(0,val,c9,c1,1)}
/************************************************************************
* DMA control (ARM1136)
************************************************************************/
CP15_RD_API dma_read_present() {CP15_GET(0,c11,c0,0)}
CP15_RD_API dma_read_queued() {CP15_GET(0,c11,c0,1)}
CP15_RD_API dma_read_running() {CP15_GET(0,c11,c0,2)}
CP15_RD_API dma_read_interrupting() {CP15_GET(0,c11,c0,3)}
CP15_RD_API dma_read_user_access() {CP15_GET(0,c11,c1,0)}
CP15_WR_API dma_write_user_access(_u32 val) {CP15_PUT(0,val,c11,c1,0)}
CP15_RD_API dma_read_channel_num() {CP15_GET(0,c11,c2,0)}
CP15_WR_API dma_write_channel_num(_u32 val) {CP15_PUT(0,val,c11,c2,0)}
CP15_WR_API dma_stop(_u32 val) {CP15_PUT(0,val,c11,c3,0)}
CP15_WR_API dma_start(_u32 val) {CP15_PUT(0,val,c11,c3,1)}
CP15_WR_API dma_clear(_u32 val) {CP15_PUT(0,val,c11,c3,2)}
CP15_RD_API dma_read_control() {CP15_GET(0,c11,c4,0)}
CP15_RD_API dma_read_int_start_addr() {CP15_GET(0,c11,c5,0)}
CP15_RD_API dma_read_ext_base_addr() {CP15_GET(0,c11,c6,0)}
CP15_RD_API dma_read_int_end_addr() {CP15_GET(0,c11,c7,0)}
CP15_RD_API dma_read_chan_status() {CP15_GET(0,c11,c8,0)}
CP15_WR_API dma_write_control(_u32 val) {CP15_PUT(0,val,c11,c4,0)}
CP15_WR_API dma_write_int_start_addr(_u32 val) {CP15_PUT(0,val,c11,c5,0)}
CP15_WR_API dma_write_ext_base_addr(_u32 val) {CP15_PUT(0,val,c11,c6,0)}
CP15_WR_API dma_write_int_end_addr(_u32 val) {CP15_PUT(0,val,c11,c7,0)}
CP15_WR_API dma_write_chan_status(_u32 val) {CP15_PUT(0,val,c11,c8,0)}
/************************************************************************
* System performance monitoring (ARM1136)
************************************************************************/
CP15_RD_API sysmon_read_control() {CP15_GET(0,c15,c12,0)}
CP15_WR_API sysmon_write_control(_u32 val) {CP15_PUT(0,val,c15,c12,0)}
CP15_RD_API sysmon_read_cycle_counter() {CP15_GET(0,c15,c12,1)}
CP15_WR_API sysmon_write_cycle_counter(_u32 val) {CP15_PUT(0,val,c15,c12,1)}
CP15_RD_API sysmon_read_counter0() {CP15_GET(0,c15,c12,2)}
CP15_WR_API sysmon_write_counter0(_u32 val) {CP15_PUT(0,val,c15,c12,2)}
CP15_RD_API sysmon_read_counter1() {CP15_GET(0,c15,c12,3)}
CP15_WR_API sysmon_write_counter1(_u32 val) {CP15_PUT(0,val,c15,c12,3)}
#endif
#endif /* SCC_HEADER */