forked from Imagelibrary/rtems
Documentation. Fixed mask defines.
This commit is contained in:
@@ -1,3 +1,7 @@
|
||||
2010-04-08 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
||||
|
||||
* shared/include/arm-cp15.h: Documentation. Fixed mask defines.
|
||||
|
||||
2010-03-03 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
||||
|
||||
* shared/include/cache.h: Fixed _CPU_cache_disable_data().
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* @ingroup arm
|
||||
* @ingroup ScoreCPUARMCP15
|
||||
*
|
||||
* @brief ARM co-processor 15 (CP15) API.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2009
|
||||
* Copyright (c) 2009, 2010
|
||||
* embedded brains GmbH
|
||||
* Obere Lagerstr. 30
|
||||
* D-82178 Puchheim
|
||||
@@ -28,14 +28,36 @@
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#define ARM_CP15_CACHE_PREPARE_MVA(mva) \
|
||||
((const void *) (((uint32_t) (mva)) & ~0x1fU))
|
||||
|
||||
#define ARM_CP15_TLB_PREPARE_MVA(mva) \
|
||||
((const void *) (((uint32_t) (mva)) & ~0x3fU))
|
||||
|
||||
/**
|
||||
* @defgroup ScoreCPUARMCP15 ARM Co-Processor 15 Support
|
||||
*
|
||||
* @ingroup ScoreCPUARM
|
||||
*
|
||||
* @brief ARM co-processor 15 (CP15) support.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @name MMU Defines
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
#define ARM_MMU_SECT_BASE_SHIFT 20
|
||||
#define ARM_MMU_SECT_BASE_MASK 0xfffU
|
||||
#define ARM_MMU_SECT_BASE_MASK (0xfffU << ARM_MMU_SECT_BASE_SHIFT)
|
||||
#define ARM_MMU_SECT_DOMAIN_SHIFT 5
|
||||
#define ARM_MMU_SECT_DOMAIN_MASK 0xfU
|
||||
#define ARM_MMU_SECT_DOMAIN_MASK (0xfU << ARM_MMU_SECT_DOMAIN_SHIFT)
|
||||
#define ARM_MMU_SECT_AP_1 (1U << 11)
|
||||
#define ARM_MMU_SECT_AP_0 (1U << 10)
|
||||
#define ARM_MMU_SECT_AP_SHIFT 10
|
||||
#define ARM_MMU_SECT_AP_MASK 0x3U
|
||||
#define ARM_MMU_SECT_AP_MASK (0x3U << ARM_MMU_SECT_AP_SHIFT)
|
||||
#define ARM_MMU_SECT_C (1U << 3)
|
||||
#define ARM_MMU_SECT_B (1U << 2)
|
||||
#define ARM_MMU_SECT_DEFAULT 0x12U
|
||||
@@ -48,6 +70,40 @@ extern "C" {
|
||||
#define ARM_MMU_TRANSLATION_TABLE_ENTRY_SIZE 4U
|
||||
#define ARM_MMU_TRANSLATION_TABLE_ENTRY_COUNT 4096U
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @name Control Register Defines
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
#define ARM_CP15_CTRL_L4 (1U << 15)
|
||||
#define ARM_CP15_CTRL_RR (1U << 14)
|
||||
#define ARM_CP15_CTRL_V (1U << 13)
|
||||
#define ARM_CP15_CTRL_I (1U << 12)
|
||||
#define ARM_CP15_CTRL_R (1U << 9)
|
||||
#define ARM_CP15_CTRL_S (1U << 8)
|
||||
#define ARM_CP15_CTRL_B (1U << 7)
|
||||
#define ARM_CP15_CTRL_C (1U << 2)
|
||||
#define ARM_CP15_CTRL_A (1U << 1)
|
||||
#define ARM_CP15_CTRL_M (1U << 0)
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @name Domain Access Control Defines
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
#define ARM_CP15_DAC_NO_ACCESS 0x0U
|
||||
#define ARM_CP15_DAC_CLIENT 0x1U
|
||||
#define ARM_CP15_DAC_MANAGER 0x3U
|
||||
#define ARM_CP15_DAC_DOMAIN(index, val) ((val) << (2 * index))
|
||||
|
||||
/** @} */
|
||||
|
||||
static inline uint32_t arm_cp15_get_id_code(void)
|
||||
{
|
||||
ARM_SWITCH_REGISTERS;
|
||||
@@ -63,21 +119,6 @@ static inline uint32_t arm_cp15_get_id_code(void)
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline uint32_t arm_cp15_get_cache_type(void)
|
||||
{
|
||||
ARM_SWITCH_REGISTERS;
|
||||
uint32_t val;
|
||||
|
||||
asm volatile (
|
||||
ARM_SWITCH_TO_ARM
|
||||
"mrc p15, 0, %[val], c0, c0, 1\n"
|
||||
ARM_SWITCH_BACK
|
||||
: [val] "=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
|
||||
);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline uint32_t arm_cp15_get_tcm_status(void)
|
||||
{
|
||||
ARM_SWITCH_REGISTERS;
|
||||
@@ -93,17 +134,6 @@ static inline uint32_t arm_cp15_get_tcm_status(void)
|
||||
return val;
|
||||
}
|
||||
|
||||
#define ARM_CP15_CTRL_L4 (1U << 15)
|
||||
#define ARM_CP15_CTRL_RR (1U << 14)
|
||||
#define ARM_CP15_CTRL_V (1U << 13)
|
||||
#define ARM_CP15_CTRL_I (1U << 12)
|
||||
#define ARM_CP15_CTRL_R (1U << 9)
|
||||
#define ARM_CP15_CTRL_S (1U << 8)
|
||||
#define ARM_CP15_CTRL_B (1U << 7)
|
||||
#define ARM_CP15_CTRL_C (1U << 2)
|
||||
#define ARM_CP15_CTRL_A (1U << 1)
|
||||
#define ARM_CP15_CTRL_M (1U << 0)
|
||||
|
||||
static inline uint32_t arm_cp15_get_control(void)
|
||||
{
|
||||
ARM_SWITCH_REGISTERS;
|
||||
@@ -135,6 +165,12 @@ static inline void arm_cp15_set_control(uint32_t val)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @name MMU Functions
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
static inline uint32_t *arm_cp15_get_translation_table_base(void)
|
||||
{
|
||||
ARM_SWITCH_REGISTERS;
|
||||
@@ -163,11 +199,6 @@ static inline void arm_cp15_set_translation_table_base(uint32_t *base)
|
||||
);
|
||||
}
|
||||
|
||||
#define ARM_CP15_DAC_NO_ACCESS 0x0U
|
||||
#define ARM_CP15_DAC_CLIENT 0x1U
|
||||
#define ARM_CP15_DAC_MANAGER 0x3U
|
||||
#define ARM_CP15_DAC_DOMAIN(index, val) ((val) << (2 * index))
|
||||
|
||||
static inline uint32_t arm_cp15_get_domain_access_control(void)
|
||||
{
|
||||
ARM_SWITCH_REGISTERS;
|
||||
@@ -280,8 +311,137 @@ static inline void arm_cp15_set_fault_address(const void *mva)
|
||||
);
|
||||
}
|
||||
|
||||
#define ARM_CP15_CACHE_PREPARE_MVA(mva) \
|
||||
((const void *) (((uint32_t) (mva)) & ~0x1fU))
|
||||
static inline void arm_cp15_tlb_invalidate(void)
|
||||
{
|
||||
ARM_SWITCH_REGISTERS;
|
||||
uint32_t sbz = 0;
|
||||
|
||||
asm volatile (
|
||||
ARM_SWITCH_TO_ARM
|
||||
"mcr p15, 0, %[sbz], c8, c7, 0\n"
|
||||
ARM_SWITCH_BACK
|
||||
: ARM_SWITCH_OUTPUT
|
||||
: [sbz] "r" (sbz)
|
||||
);
|
||||
}
|
||||
|
||||
static inline void arm_cp15_tlb_invalidate_entry(const void *mva)
|
||||
{
|
||||
ARM_SWITCH_REGISTERS;
|
||||
|
||||
mva = ARM_CP15_TLB_PREPARE_MVA(mva);
|
||||
|
||||
asm volatile (
|
||||
ARM_SWITCH_TO_ARM
|
||||
"mcr p15, 0, %[mva], c8, c7, 1\n"
|
||||
ARM_SWITCH_BACK
|
||||
: ARM_SWITCH_OUTPUT
|
||||
: [mva] "r" (mva)
|
||||
);
|
||||
}
|
||||
|
||||
static inline void arm_cp15_tlb_instruction_invalidate(void)
|
||||
{
|
||||
ARM_SWITCH_REGISTERS;
|
||||
uint32_t sbz = 0;
|
||||
|
||||
asm volatile (
|
||||
ARM_SWITCH_TO_ARM
|
||||
"mcr p15, 0, %[sbz], c8, c5, 0\n"
|
||||
ARM_SWITCH_BACK
|
||||
: ARM_SWITCH_OUTPUT
|
||||
: [sbz] "r" (sbz)
|
||||
);
|
||||
}
|
||||
|
||||
static inline void arm_cp15_tlb_instruction_invalidate_entry(const void *mva)
|
||||
{
|
||||
ARM_SWITCH_REGISTERS;
|
||||
|
||||
mva = ARM_CP15_TLB_PREPARE_MVA(mva);
|
||||
|
||||
asm volatile (
|
||||
ARM_SWITCH_TO_ARM
|
||||
"mcr p15, 0, %[mva], c8, c5, 1\n"
|
||||
ARM_SWITCH_BACK
|
||||
: ARM_SWITCH_OUTPUT
|
||||
: [mva] "r" (mva)
|
||||
);
|
||||
}
|
||||
|
||||
static inline void arm_cp15_tlb_data_invalidate(void)
|
||||
{
|
||||
ARM_SWITCH_REGISTERS;
|
||||
uint32_t sbz = 0;
|
||||
|
||||
asm volatile (
|
||||
ARM_SWITCH_TO_ARM
|
||||
"mcr p15, 0, %[sbz], c8, c6, 0\n"
|
||||
ARM_SWITCH_BACK
|
||||
: ARM_SWITCH_OUTPUT
|
||||
: [sbz] "r" (sbz)
|
||||
);
|
||||
}
|
||||
|
||||
static inline void arm_cp15_tlb_data_invalidate_entry(const void *mva)
|
||||
{
|
||||
ARM_SWITCH_REGISTERS;
|
||||
|
||||
mva = ARM_CP15_TLB_PREPARE_MVA(mva);
|
||||
|
||||
asm volatile (
|
||||
ARM_SWITCH_TO_ARM
|
||||
"mcr p15, 0, %[mva], c8, c6, 1\n"
|
||||
ARM_SWITCH_BACK
|
||||
: ARM_SWITCH_OUTPUT
|
||||
: [mva] "r" (mva)
|
||||
);
|
||||
}
|
||||
|
||||
static inline void arm_cp15_tlb_lockdown_entry(const void *mva)
|
||||
{
|
||||
uint32_t arm_switch_reg;
|
||||
|
||||
asm volatile (
|
||||
ARM_SWITCH_TO_ARM
|
||||
"add %[arm_switch_reg], pc, #16\n"
|
||||
"mcr p15, 0, %[arm_switch_reg], c7, c13, 1\n"
|
||||
"mcr p15, 0, %[mva], c8, c7, 1\n"
|
||||
"mrc p15, 0, %[arm_switch_reg], c10, c0, 0\n"
|
||||
"orr %[arm_switch_reg], #0x1\n"
|
||||
"mcr p15, 0, %[arm_switch_reg], c10, c0, 0\n"
|
||||
"ldr %[mva], [%[mva]]\n"
|
||||
"mrc p15, 0, %[arm_switch_reg], c10, c0, 0\n"
|
||||
"bic %[arm_switch_reg], #0x1\n"
|
||||
"mcr p15, 0, %[arm_switch_reg], c10, c0, 0\n"
|
||||
ARM_SWITCH_BACK
|
||||
: [mva] "=r" (mva), [arm_switch_reg] "=&r" (arm_switch_reg)
|
||||
: "[mva]" (mva)
|
||||
);
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @name Cache Functions
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
static inline uint32_t arm_cp15_get_cache_type(void)
|
||||
{
|
||||
ARM_SWITCH_REGISTERS;
|
||||
uint32_t val;
|
||||
|
||||
asm volatile (
|
||||
ARM_SWITCH_TO_ARM
|
||||
"mrc p15, 0, %[val], c0, c0, 1\n"
|
||||
ARM_SWITCH_BACK
|
||||
: [val] "=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
|
||||
);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline void arm_cp15_cache_invalidate(void)
|
||||
{
|
||||
@@ -495,6 +655,8 @@ static inline void arm_cp15_data_cache_test_and_clean_and_invalidate(void)
|
||||
);
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
static inline void arm_cp15_drain_write_buffer(void)
|
||||
{
|
||||
ARM_SWITCH_REGISTERS;
|
||||
@@ -525,117 +687,7 @@ static inline void arm_cp15_wait_for_interrupt(void)
|
||||
);
|
||||
}
|
||||
|
||||
#define ARM_CP15_TLB_PREPARE_MVA(mva) \
|
||||
((const void *) (((uint32_t) (mva)) & ~0x3fU))
|
||||
|
||||
static inline void arm_cp15_tlb_invalidate(void)
|
||||
{
|
||||
ARM_SWITCH_REGISTERS;
|
||||
uint32_t sbz = 0;
|
||||
|
||||
asm volatile (
|
||||
ARM_SWITCH_TO_ARM
|
||||
"mcr p15, 0, %[sbz], c8, c7, 0\n"
|
||||
ARM_SWITCH_BACK
|
||||
: ARM_SWITCH_OUTPUT
|
||||
: [sbz] "r" (sbz)
|
||||
);
|
||||
}
|
||||
|
||||
static inline void arm_cp15_tlb_invalidate_entry(const void *mva)
|
||||
{
|
||||
ARM_SWITCH_REGISTERS;
|
||||
|
||||
mva = ARM_CP15_TLB_PREPARE_MVA(mva);
|
||||
|
||||
asm volatile (
|
||||
ARM_SWITCH_TO_ARM
|
||||
"mcr p15, 0, %[mva], c8, c7, 1\n"
|
||||
ARM_SWITCH_BACK
|
||||
: ARM_SWITCH_OUTPUT
|
||||
: [mva] "r" (mva)
|
||||
);
|
||||
}
|
||||
|
||||
static inline void arm_cp15_tlb_instruction_invalidate(void)
|
||||
{
|
||||
ARM_SWITCH_REGISTERS;
|
||||
uint32_t sbz = 0;
|
||||
|
||||
asm volatile (
|
||||
ARM_SWITCH_TO_ARM
|
||||
"mcr p15, 0, %[sbz], c8, c5, 0\n"
|
||||
ARM_SWITCH_BACK
|
||||
: ARM_SWITCH_OUTPUT
|
||||
: [sbz] "r" (sbz)
|
||||
);
|
||||
}
|
||||
|
||||
static inline void arm_cp15_tlb_instruction_invalidate_entry(const void *mva)
|
||||
{
|
||||
ARM_SWITCH_REGISTERS;
|
||||
|
||||
mva = ARM_CP15_TLB_PREPARE_MVA(mva);
|
||||
|
||||
asm volatile (
|
||||
ARM_SWITCH_TO_ARM
|
||||
"mcr p15, 0, %[mva], c8, c5, 1\n"
|
||||
ARM_SWITCH_BACK
|
||||
: ARM_SWITCH_OUTPUT
|
||||
: [mva] "r" (mva)
|
||||
);
|
||||
}
|
||||
|
||||
static inline void arm_cp15_tlb_data_invalidate(void)
|
||||
{
|
||||
ARM_SWITCH_REGISTERS;
|
||||
uint32_t sbz = 0;
|
||||
|
||||
asm volatile (
|
||||
ARM_SWITCH_TO_ARM
|
||||
"mcr p15, 0, %[sbz], c8, c6, 0\n"
|
||||
ARM_SWITCH_BACK
|
||||
: ARM_SWITCH_OUTPUT
|
||||
: [sbz] "r" (sbz)
|
||||
);
|
||||
}
|
||||
|
||||
static inline void arm_cp15_tlb_data_invalidate_entry(const void *mva)
|
||||
{
|
||||
ARM_SWITCH_REGISTERS;
|
||||
|
||||
mva = ARM_CP15_TLB_PREPARE_MVA(mva);
|
||||
|
||||
asm volatile (
|
||||
ARM_SWITCH_TO_ARM
|
||||
"mcr p15, 0, %[mva], c8, c6, 1\n"
|
||||
ARM_SWITCH_BACK
|
||||
: ARM_SWITCH_OUTPUT
|
||||
: [mva] "r" (mva)
|
||||
);
|
||||
}
|
||||
|
||||
static inline void arm_cp15_tlb_lockdown_entry(const void *mva)
|
||||
{
|
||||
uint32_t arm_switch_reg;
|
||||
|
||||
asm volatile (
|
||||
ARM_SWITCH_TO_ARM
|
||||
"add %[arm_switch_reg], pc, #16\n"
|
||||
"mcr p15, 0, %[arm_switch_reg], c7, c13, 1\n"
|
||||
"mcr p15, 0, %[mva], c8, c7, 1\n"
|
||||
"mrc p15, 0, %[arm_switch_reg], c10, c0, 0\n"
|
||||
"orr %[arm_switch_reg], #0x1\n"
|
||||
"mcr p15, 0, %[arm_switch_reg], c10, c0, 0\n"
|
||||
"ldr %[mva], [%[mva]]\n"
|
||||
"mrc p15, 0, %[arm_switch_reg], c10, c0, 0\n"
|
||||
"bic %[arm_switch_reg], #0x1\n"
|
||||
"mcr p15, 0, %[arm_switch_reg], c10, c0, 0\n"
|
||||
ARM_SWITCH_BACK
|
||||
: [mva] "=r" (mva), [arm_switch_reg] "=&r" (arm_switch_reg)
|
||||
: "[mva]" (mva)
|
||||
);
|
||||
}
|
||||
/** @} */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user