[rtems commit] bsps/powerpc: Support more than 256MiB of RAM
Sebastian Huber
sebh at rtems.org
Wed Mar 21 05:59:31 UTC 2018
Module: rtems
Branch: master
Commit: 5cf06565149c8cab4c9437e44f1acfda93bdaa55
Changeset: http://git.rtems.org/rtems/commit/?id=5cf06565149c8cab4c9437e44f1acfda93bdaa55
Author: Ãric Tremblay <e.tremblay at axis-canada.com>
Date: Tue Mar 20 14:14:39 2018 +0100
bsps/powerpc: Support more than 256MiB of RAM
Close #3322.
---
c/src/lib/libbsp/powerpc/shared/start/start.S | 17 +++++++++++++++++
c/src/lib/libbsp/powerpc/shared/startup/bspstart.c | 18 ++++++++++++++++++
2 files changed, 35 insertions(+)
diff --git a/c/src/lib/libbsp/powerpc/shared/start/start.S b/c/src/lib/libbsp/powerpc/shared/start/start.S
index 729c89c..354b9a9 100644
--- a/c/src/lib/libbsp/powerpc/shared/start/start.S
+++ b/c/src/lib/libbsp/powerpc/shared/start/start.S
@@ -93,6 +93,23 @@ __rtems_entry_point:
mtspr IBAT0L,r8
mtspr IBAT0U,r11
isync
+/* Map section where residual is located if outside
+ * the first 256Mb of RAM. This is to support cases
+ * where the available system memory is larger than
+ * 256Mb of RAM.
+ */
+ mr r9, r1 /* Get where residual was mapped */
+ lis r12,0xf0000000 at h
+ and r9,r9,r12
+ cmpi 0,1,r9, 0
+ beq enter_C_code
+ isync
+ ori r11,r9,0x1ffe
+ mtspr DBAT1L,r8 /* N.B. 6xx (not 601) have valid */
+ mtspr DBAT1U,r11 /* bit in upper BAT register */
+ mtspr IBAT1L,r8
+ mtspr IBAT1U,r11
+ isync
/*
* we now have the 1st 256M of ram mapped with the bats. We are still
diff --git a/c/src/lib/libbsp/powerpc/shared/startup/bspstart.c b/c/src/lib/libbsp/powerpc/shared/startup/bspstart.c
index 5a97cc8..dac4b24 100644
--- a/c/src/lib/libbsp/powerpc/shared/startup/bspstart.c
+++ b/c/src/lib/libbsp/powerpc/shared/startup/bspstart.c
@@ -300,6 +300,24 @@ void bsp_start( void )
*/
_BSP_clear_hostbridge_errors(0 /* enableMCP */, 0/*quiet*/);
+ if (BSP_mem_size > 0x10000000)
+ {
+ /* Support cases of system memory size larger than 256Mb.
+ *
+ * We use BAT3 in order to obtain access to the top section of the RAM.
+ * We also need to do this just before setting up the page table because
+ * this is where the page table will be located.
+ */
+ const unsigned int mem256Count = (BSP_mem_size / 0x10000000);
+ const unsigned int BAT3Addr = ((BSP_mem_size % 0x10000000) ?
+ (mem256Count * 0x10000000) :
+ ((mem256Count-1) * 0x10000000));
+ setdbat(3, BAT3Addr, BAT3Addr, 0x10000000, IO_PAGE);
+#ifdef SHOW_MORE_INIT_SETTINGS
+ printk("Setting up BAT3 for large memory support. (BAT3 --> 0x%x)\n", BAT3Addr);
+#endif
+ }
+
/* Allocate and set up the page table mappings
* This is only available on >604 CPUs.
*
More information about the vc
mailing list