[rtems commit] bsp/qoriq: 64-bit MMU support

Sebastian Huber sebh at rtems.org
Tue Aug 22 14:55:57 UTC 2017


Module:    rtems
Branch:    master
Commit:    c8aeb76c44ff04d71573c24b6f0ca1a3c2ed33fe
Changeset: http://git.rtems.org/rtems/commit/?id=c8aeb76c44ff04d71573c24b6f0ca1a3c2ed33fe

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Wed Aug  2 14:36:32 2017 +0200

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 2583bec..4cacb1b 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 f3375ee..38026fb 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 e988656..9131260 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 90a4b23..12dcc71 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");




More information about the vc mailing list