mirror of
https://github.com/apache/nuttx.git
synced 2026-05-27 11:26:12 +08:00
arch/arm/armv7-a: add mmu_l1_setpgtable
Decrease the direct access of cp15, use mmu interface replace Signed-off-by: buxiasen <buxiasen@xiaomi.com>
This commit is contained in:
@@ -54,7 +54,7 @@
|
|||||||
#ifndef CONFIG_ARCH_ROMPGTABLE
|
#ifndef CONFIG_ARCH_ROMPGTABLE
|
||||||
void mmu_l1_setentry(uint32_t paddr, uint32_t vaddr, uint32_t mmuflags)
|
void mmu_l1_setentry(uint32_t paddr, uint32_t vaddr, uint32_t mmuflags)
|
||||||
{
|
{
|
||||||
uint32_t *l1table = mmu_l1_pgtable();
|
uint32_t *l1table = mmu_l1_getpgtable();
|
||||||
uint32_t index = vaddr >> 20;
|
uint32_t index = vaddr >> 20;
|
||||||
|
|
||||||
/* Save the page table entry */
|
/* Save the page table entry */
|
||||||
@@ -89,7 +89,7 @@ void mmu_l1_setentry(uint32_t paddr, uint32_t vaddr, uint32_t mmuflags)
|
|||||||
#if !defined(CONFIG_ARCH_ROMPGTABLE) && defined(CONFIG_ARCH_ADDRENV)
|
#if !defined(CONFIG_ARCH_ROMPGTABLE) && defined(CONFIG_ARCH_ADDRENV)
|
||||||
void mmu_l1_restore(uintptr_t vaddr, uint32_t l1entry)
|
void mmu_l1_restore(uintptr_t vaddr, uint32_t l1entry)
|
||||||
{
|
{
|
||||||
uint32_t *l1table = mmu_l1_pgtable();
|
uint32_t *l1table = mmu_l1_getpgtable();
|
||||||
uint32_t index = vaddr >> 20;
|
uint32_t index = vaddr >> 20;
|
||||||
|
|
||||||
/* Set the encoded page table entry */
|
/* Set the encoded page table entry */
|
||||||
|
|||||||
@@ -1296,7 +1296,7 @@ static inline void cp15_invalidate_tlb_bymva(uint32_t vaddr)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static inline void cp15_wrdacr(unsigned int dacr)
|
static inline void cp15_wrdacr(uint32_t dacr)
|
||||||
{
|
{
|
||||||
CP15_SET(DACR, dacr);
|
CP15_SET(DACR, dacr);
|
||||||
UP_NOP();
|
UP_NOP();
|
||||||
@@ -1324,7 +1324,7 @@ static inline void cp15_wrdacr(unsigned int dacr)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static inline void cp15_wrttb(unsigned int ttb)
|
static inline void cp15_wrttb(uint32_t ttb)
|
||||||
{
|
{
|
||||||
CP15_SET(TTBR0, ttb);
|
CP15_SET(TTBR0, ttb);
|
||||||
UP_NOP();
|
UP_NOP();
|
||||||
@@ -1339,7 +1339,7 @@ static inline void cp15_wrttb(unsigned int ttb)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: mmu_l1_pgtable
|
* Name: mmu_l1_getpgtable
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Return the value of the L1 page table base address.
|
* Return the value of the L1 page table base address.
|
||||||
@@ -1351,7 +1351,7 @@ static inline void cp15_wrttb(unsigned int ttb)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifndef CONFIG_ARCH_ROMPGTABLE
|
#ifndef CONFIG_ARCH_ROMPGTABLE
|
||||||
static inline uint32_t *mmu_l1_pgtable(void)
|
static inline uint32_t *mmu_l1_getpgtable(void)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_SMP) && defined(CONFIG_ARCH_ADDRENV)
|
#if defined(CONFIG_SMP) && defined(CONFIG_ARCH_ADDRENV)
|
||||||
uint32_t ttbr0;
|
uint32_t ttbr0;
|
||||||
@@ -1366,6 +1366,30 @@ static inline uint32_t *mmu_l1_pgtable(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: mmu_l1_setpgtable
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Update current L1 page table base address.
|
||||||
|
* The TTBR0 register contains the phys address for each cpu.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* ttb - The new value of the TTBR0 register
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef CONFIG_ARCH_ROMPGTABLE
|
||||||
|
# ifdef CONFIG_ARCH_ADDRENV
|
||||||
|
static inline void mmu_l1_setpgtable(uintptr_t *ttb)
|
||||||
|
{
|
||||||
|
cp15_wrttb((uint32_t)ttb | TTBR0_RGN_WBWA | TTBR0_IRGN0);
|
||||||
|
cp15_invalidate_tlbs();
|
||||||
|
}
|
||||||
|
# else
|
||||||
|
# define mmu_l1_setpgtable(ttb)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: mmu_l1_getentry
|
* Name: mmu_l1_getentry
|
||||||
*
|
*
|
||||||
@@ -1379,15 +1403,20 @@ static inline uint32_t *mmu_l1_pgtable(void)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifndef CONFIG_ARCH_ROMPGTABLE
|
#ifndef CONFIG_ARCH_ROMPGTABLE
|
||||||
static inline uint32_t mmu_l1_getentry(uint32_t vaddr)
|
static inline
|
||||||
|
uint32_t mmu_l1table_getentry(uint32_t *l1table, uint32_t vaddr)
|
||||||
{
|
{
|
||||||
uint32_t *l1table = mmu_l1_pgtable();
|
uint32_t index = vaddr >> 20;
|
||||||
uint32_t index = vaddr >> 20;
|
|
||||||
|
|
||||||
/* Return the address of the page table entry */
|
/* Return the address of the page table entry */
|
||||||
|
|
||||||
return l1table[index];
|
return l1table[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline uint32_t mmu_l1_getentry(uint32_t vaddr)
|
||||||
|
{
|
||||||
|
return mmu_l1table_getentry(mmu_l1_getpgtable(), vaddr);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
|||||||
Reference in New Issue
Block a user