summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2014-06-30 11:04:34 -0600
committerGregory Nutt <gnutt@nuttx.org>2014-06-30 11:04:34 -0600
commit9cac2c93ce2a22dc9b6df08ca0993fb2a9b01254 (patch)
tree82d9d852618279ca451af5f9aa630d0a86c1afcf
parenta3d37c277c2c23d0d6a1f5b00dcf8ee52041bf3f (diff)
downloadnuttx-9cac2c93ce2a22dc9b6df08ca0993fb2a9b01254.tar.gz
nuttx-9cac2c93ce2a22dc9b6df08ca0993fb2a9b01254.tar.bz2
nuttx-9cac2c93ce2a22dc9b6df08ca0993fb2a9b01254.zip
SAMA5D3/4: Fix some logic in conversion of physical and virtal DRAM addresses when running out of DRAM
-rw-r--r--nuttx/arch/arm/src/sama5/sam_memories.c60
1 files changed, 55 insertions, 5 deletions
diff --git a/nuttx/arch/arm/src/sama5/sam_memories.c b/nuttx/arch/arm/src/sama5/sam_memories.c
index 0c4aeaafc..0c215bed0 100644
--- a/nuttx/arch/arm/src/sama5/sam_memories.c
+++ b/nuttx/arch/arm/src/sama5/sam_memories.c
@@ -217,7 +217,8 @@ static inline uintptr_t isram_physramaddr(uintptr_t virtramaddr)
*
****************************************************************************/
-#ifdef CONFIG_SAMA5_DDRCS
+#if defined(CONFIG_SAMA5_DDRCS) || defined(CONFIG_SAMA5_BOOT_SDRAM) || \
+ defined(CONFIG_BOOT_SDRAM_DATA)
static inline uintptr_t sdram_physramaddr(uintptr_t virtramaddr)
{
#if SAM_DDRCS_PSECTION != SAM_DDRCS_VSECTION
@@ -472,7 +473,8 @@ static inline uintptr_t isram_virtramaddr(uintptr_t physramaddr)
*
****************************************************************************/
-#ifdef CONFIG_SAMA5_DDRCS
+#if defined(CONFIG_SAMA5_DDRCS) || defined(CONFIG_SAMA5_BOOT_SDRAM) || \
+ defined(CONFIG_BOOT_SDRAM_DATA)
static inline uintptr_t sdram_virtramaddr(uintptr_t physramaddr)
{
#if SAM_DDRCS_PSECTION != SAM_DDRCS_VSECTION
@@ -787,14 +789,52 @@ uintptr_t sam_physramaddr(uintptr_t virtramaddr)
return isram_physramaddr(virtramaddr);
}
-#ifdef CONFIG_SAMA5_DDRCS
- /* Check for external SDRAM */
+#if defined(CONFIG_SAMA5_DDRCS)
+ /* Check for external SDRAM. We may have external DRAM if, as examples,
+ * we are running from NOR FLASH or ISRAM with data in DRAM
+ * (SAMA5_BOOT_ISRAM or SAMA5_BOOT_CS0FLASH with CONFIG_SAMA5_DDRCS). In
+ * this case, the DRAM configuration settings, SAM_DDRCS_VSECTION and
+ * SAMA5_DDRCS_SIZE give us the correct size of the installed DRAM.
+ *
+ * SAM_DDRCS_VSECTION -- Virtual start of the DRAM memory region
+ * SAMA5_DDRCS_SIZE -- The installed DRAM size.
+ *
+ * REVISIT: However, not all of it may be mapped? Only the "primary"
+ * RAM region will be mapped by default. See below.
+ */
else if (virtramaddr >= SAM_DDRCS_VSECTION &&
virtramaddr < (SAM_DDRCS_VSECTION + SAMA5_DDRCS_SIZE))
{
return sdram_physramaddr(virtramaddr);
}
+
+#elif defined(CONFIG_SAMA5_BOOT_SDRAM) || defined(CONFIG_BOOT_SDRAM_DATA)
+ /* The DDRCS values may be highly couple to the CONFIG_RAM_START,
+ * CONFIG_RAM_VSTART, and CONFIG_RAM_SIZE when CONFIG_SAMA5_BOOT_SDRAM or
+ * CONFIG_BOOT_SDRAM_DATA is selected.
+ *
+ * CONFIG_SAMA5_BOOT_SDRAM -- We were booted into DRAM by some bootloader.
+ * DRAM support is not enabled, SAMA5_DDRCS_SIZE is not valid.
+ * CONFIG_BOOT_SDRAM_DATA -- We are running from NOR or ISRAM, but our
+ * .bss, .data, and primary heap are in DRAM (In this case, I would
+ * expect CONFIG_SAMA5_DDRCS to also be set, however).
+ *
+ * In all cases, CONFIG_RAM_START, RAM_VSTART, and RAM_SIZE describe the
+ * "primary" RAM region that is mapped at boot time. This "primary" RAM
+ * region is the one that holds .bss, .data, and primary head. And this
+ * is the only DRAM memory region that is mapped at boot time.
+ *
+ * REVISIT: How does this work if we want to set aside a block of DRAM
+ * outside of .bss, .data, and .heap for, as an example, for a framebuffer.
+ * In that case, we will to revisit this.
+ */
+
+ else if (virtramaddr >= CONFIG_RAM_VSTART &&
+ virtramaddr < (CONFIG_RAM_VSTART + CONFIG_RAM_SIZE))
+ {
+ return sdram_physramaddr(virtramaddr);
+ }
#endif
/* Check for NFCS SRAM. If NFC SRAM is not being used by the NAND logic,
@@ -896,13 +936,23 @@ uintptr_t sam_virtramaddr(uintptr_t physramaddr)
}
#ifdef CONFIG_SAMA5_DDRCS
- /* Check for external SDRAM */
+ /* Check for external SDRAM. NOTE: See comments in sam_physramaddr */
else if (physramaddr >= SAM_DDRCS_PSECTION &&
physramaddr < (SAM_DDRCS_PSECTION + SAMA5_DDRCS_SIZE))
{
return sdram_virtramaddr(physramaddr);
}
+
+#elif defined(CONFIG_SAMA5_BOOT_SDRAM) || defined(CONFIG_BOOT_SDRAM_DATA)
+ /* See comments in sam_physramaddr */
+
+ else if (physramaddr >= CONFIG_RAM_START &&
+ physramaddr < (CONFIG_RAM_START + CONFIG_RAM_SIZE))
+ {
+ return sdram_physramaddr(physramaddr);
+ }
+
#endif
/* Check for NFCS SRAM. If NFC SRAM is not being used by the NAND logic,