From c8aeb76c44ff04d71573c24b6f0ca1a3c2ed33fe Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 2 Aug 2017 14:36:32 +0200 Subject: bsp/qoriq: 64-bit MMU support Update #3082. --- c/src/lib/libbsp/powerpc/qoriq/include/mmu.h | 12 ++--- .../lib/libbsp/powerpc/qoriq/startup/mmu-config.c | 28 +++++------ c/src/lib/libbsp/powerpc/qoriq/startup/mmu-tlb1.S | 9 ++++ c/src/lib/libbsp/powerpc/qoriq/startup/mmu.c | 54 +++++++++++----------- 4 files changed, 56 insertions(+), 47 deletions(-) diff --git a/c/src/lib/libbsp/powerpc/qoriq/include/mmu.h b/c/src/lib/libbsp/powerpc/qoriq/include/mmu.h index 2583bec761..4cacb1b375 100644 --- a/c/src/lib/libbsp/powerpc/qoriq/include/mmu.h +++ b/c/src/lib/libbsp/powerpc/qoriq/include/mmu.h @@ -47,8 +47,8 @@ extern "C" { #define QORIQ_MMU_POWER_STEP 2 typedef struct { - uint32_t begin; - uint32_t last; + uintptr_t begin; + uintptr_t last; uint32_t mas1; uint32_t mas2; uint32_t mas3; @@ -64,8 +64,8 @@ void qoriq_mmu_context_init(qoriq_mmu_context *self); bool qoriq_mmu_add( qoriq_mmu_context *self, - uint32_t begin, - uint32_t last, + uintptr_t begin, + uintptr_t last, uint32_t mas1, uint32_t mas2, uint32_t mas3, @@ -86,8 +86,8 @@ void qoriq_tlb1_write( uint32_t mas2, uint32_t mas3, uint32_t mas7, - uint32_t ea, - uint32_t tsize + uintptr_t ea, + int tsize ); void qoriq_tlb1_invalidate(int esel); diff --git a/c/src/lib/libbsp/powerpc/qoriq/startup/mmu-config.c b/c/src/lib/libbsp/powerpc/qoriq/startup/mmu-config.c index f3375ee824..38026fb17b 100644 --- a/c/src/lib/libbsp/powerpc/qoriq/startup/mmu-config.c +++ b/c/src/lib/libbsp/powerpc/qoriq/startup/mmu-config.c @@ -37,23 +37,23 @@ #define DATA __attribute__((section(".bsp_start_data"))) typedef struct { - uint32_t begin; - uint32_t size; + uintptr_t begin; + uintptr_t size; uint32_t mas2; uint32_t mas3; uint32_t mas7; } entry; #define ENTRY_X(b, s) { \ - .begin = (uint32_t) b, \ - .size = (uint32_t) s, \ + .begin = (uintptr_t) b, \ + .size = (uintptr_t) s, \ .mas2 = 0, \ .mas3 = FSL_EIS_MAS3_SX \ } #define ENTRY_R(b, s) { \ - .begin = (uint32_t) b, \ - .size = (uint32_t) s, \ + .begin = (uintptr_t) b, \ + .size = (uintptr_t) s, \ .mas2 = 0, \ .mas3 = FSL_EIS_MAS3_SR \ } @@ -65,22 +65,22 @@ typedef struct { #endif #define ENTRY_RW(b, s) { \ - .begin = (uint32_t) b, \ - .size = (uint32_t) s, \ + .begin = (uintptr_t) b, \ + .size = (uintptr_t) s, \ .mas2 = ENTRY_RW_MAS2, \ .mas3 = FSL_EIS_MAS3_SR | FSL_EIS_MAS3_SW \ } #define ENTRY_IO(b, s) { \ - .begin = (uint32_t) b, \ - .size = (uint32_t) s, \ + .begin = (uintptr_t) b, \ + .size = (uintptr_t) s, \ .mas2 = FSL_EIS_MAS2_I | FSL_EIS_MAS2_G, \ .mas3 = FSL_EIS_MAS3_SR | FSL_EIS_MAS3_SW \ } #define ENTRY_DEV(b, s) { \ - .begin = (uint32_t) b, \ - .size = (uint32_t) s, \ + .begin = (uintptr_t) b, \ + .size = (uintptr_t) s, \ .mas2 = FSL_EIS_MAS2_I | FSL_EIS_MAS2_G, \ .mas3 = FSL_EIS_MAS3_SR | FSL_EIS_MAS3_SW, \ .mas7 = QORIQ_MMU_DEVICE_MAS7 \ @@ -96,8 +96,8 @@ typedef struct { * will occur. No documentation reference for this is available. */ #define ENTRY_DEV_CACHED(b, s) { \ - .begin = (uint32_t) b, \ - .size = (uint32_t) s, \ + .begin = (uintptr_t) b, \ + .size = (uintptr_t) s, \ .mas2 = FSL_EIS_MAS2_M | FSL_EIS_MAS2_G, \ .mas3 = FSL_EIS_MAS3_SR | FSL_EIS_MAS3_SW, \ .mas7 = QORIQ_MMU_DEVICE_MAS7 \ diff --git a/c/src/lib/libbsp/powerpc/qoriq/startup/mmu-tlb1.S b/c/src/lib/libbsp/powerpc/qoriq/startup/mmu-tlb1.S index e988656760..9131260341 100644 --- a/c/src/lib/libbsp/powerpc/qoriq/startup/mmu-tlb1.S +++ b/c/src/lib/libbsp/powerpc/qoriq/startup/mmu-tlb1.S @@ -32,7 +32,11 @@ qoriq_tlb1_write: rlwinm r3, r3, 16, 10, 15 +#ifdef __powerpc64__ + rldicr r8, r8, 0, 51 +#else rlwinm r8, r8, 0, 0, 19 +#endif oris r3, r3, 0x1000 mtspr FSL_EIS_MAS0, r3 oris r4, r4, 0xc000 @@ -43,6 +47,11 @@ qoriq_tlb1_write: mtspr FSL_EIS_MAS2, r5 or r6, r8, r6 mtspr FSL_EIS_MAS3, r6 +#ifdef __powerpc64__ + srdi r8, r8, 32 + or r7, r7, r8 + mtspr FSL_EIS_MAS7, r7 +#endif mtspr FSL_EIS_MAS7, r7 #ifdef QORIQ_HAS_HYPERVISOR_MODE li r0, 0 diff --git a/c/src/lib/libbsp/powerpc/qoriq/startup/mmu.c b/c/src/lib/libbsp/powerpc/qoriq/startup/mmu.c index 90a4b23162..12dcc71f50 100644 --- a/c/src/lib/libbsp/powerpc/qoriq/startup/mmu.c +++ b/c/src/lib/libbsp/powerpc/qoriq/startup/mmu.c @@ -25,11 +25,11 @@ #define TEXT __attribute__((section(".bsp_start_text"))) -static uint32_t TEXT power_of_two(uint32_t val) +static uintptr_t TEXT power_of_two(uintptr_t val) { - uint32_t test_power = QORIQ_MMU_MIN_POWER; - uint32_t power = test_power; - uint32_t alignment = 1U << test_power; + uintptr_t test_power = QORIQ_MMU_MIN_POWER; + uintptr_t power = test_power; + uintptr_t alignment = 1U << test_power; while (test_power <= QORIQ_MMU_MAX_POWER && (val & (alignment - 1)) == 0) { power = test_power; @@ -40,11 +40,11 @@ static uint32_t TEXT power_of_two(uint32_t val) return power; } -static uint32_t TEXT max_power_of_two(uint32_t val) +static uintptr_t TEXT max_power_of_two(uintptr_t val) { - uint32_t test_power = QORIQ_MMU_MIN_POWER; - uint32_t power = test_power; - uint32_t max = 1U << test_power; + uintptr_t test_power = QORIQ_MMU_MIN_POWER; + uintptr_t power = test_power; + uintptr_t max = 1U << test_power; do { power = test_power; @@ -150,7 +150,7 @@ static void TEXT compact(qoriq_mmu_context *self) merge(self); } -static void TEXT align(qoriq_mmu_context *self, uint32_t alignment) +static void TEXT align(qoriq_mmu_context *self, uintptr_t alignment) { qoriq_mmu_entry *entries = self->entries; int n = self->count; @@ -176,8 +176,8 @@ static void TEXT append(qoriq_mmu_context *self, const qoriq_mmu_entry *new_entr bool TEXT qoriq_mmu_add( qoriq_mmu_context *self, - uint32_t begin, - uint32_t last, + uintptr_t begin, + uintptr_t last, uint32_t mas1, uint32_t mas2, uint32_t mas3, @@ -211,7 +211,7 @@ bool TEXT qoriq_mmu_add( return ok; } -static uint32_t TEXT min(uint32_t a, uint32_t b) +static uintptr_t TEXT min(uintptr_t a, uintptr_t b) { return a < b ? a : b; } @@ -219,14 +219,14 @@ static uint32_t TEXT min(uint32_t a, uint32_t b) static bool TEXT split(qoriq_mmu_context *self, qoriq_mmu_entry *cur) { bool again = false; - uint32_t begin = cur->begin; - uint32_t end = cur->last + 1; - uint32_t size = end - begin; - uint32_t begin_power = power_of_two(begin); - uint32_t size_power = max_power_of_two(size); - uint32_t power = min(begin_power, size_power); - uint32_t split_size = power < 32 ? (1U << power) : 0; - uint32_t split_pos = begin + split_size; + uintptr_t begin = cur->begin; + uintptr_t end = cur->last + 1; + uintptr_t size = end - begin; + uintptr_t begin_power = power_of_two(begin); + uintptr_t size_power = max_power_of_two(size); + uintptr_t power = min(begin_power, size_power); + uintptr_t split_size = power < 32 ? (1U << power) : 0; + uintptr_t split_pos = begin + split_size; if (split_pos != end && !is_full(self)) { qoriq_mmu_entry new_entry = *cur; @@ -263,7 +263,7 @@ static TEXT void partition(qoriq_mmu_context *self) void TEXT qoriq_mmu_partition(qoriq_mmu_context *self, int max_count) { - uint32_t alignment = 4096; + uintptr_t alignment = 4096; do { align(self, alignment); @@ -280,9 +280,9 @@ void TEXT qoriq_mmu_write_to_tlb1(qoriq_mmu_context *self, int first_tlb) for (i = 0; i < n; ++i) { qoriq_mmu_entry *cur = &entries [i]; - uint32_t ea = cur->begin; - uint32_t size = cur->last - ea + 1; - uint32_t tsize = (power_of_two(size) - 10) / 2; + uintptr_t ea = cur->begin; + uintptr_t size = cur->last - ea + 1; + uintptr_t tsize = (power_of_two(size) - 10) / 2; int tlb = first_tlb + i; qoriq_tlb1_write( @@ -292,7 +292,7 @@ void TEXT qoriq_mmu_write_to_tlb1(qoriq_mmu_context *self, int first_tlb) cur->mas3, cur->mas7, ea, - tsize + (int) tsize ); } } @@ -302,8 +302,8 @@ void qoriq_mmu_change_perm(uint32_t test, uint32_t set, uint32_t clear) int i = 0; for (i = 0; i < 16; ++i) { - int mas0 = FSL_EIS_MAS0_TLBSEL | FSL_EIS_MAS0_ESEL(i); - int mas1 = 0; + uint32_t mas0 = FSL_EIS_MAS0_TLBSEL | FSL_EIS_MAS0_ESEL(i); + uint32_t mas1 = 0; PPC_SET_SPECIAL_PURPOSE_REGISTER(FSL_EIS_MAS0, mas0); asm volatile ("tlbre"); -- cgit v1.2.3