This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 3a4560ed40 esp32s3: make textheap return i-bus address consistently
3a4560ed40 is described below

commit 3a4560ed40356a14fa6f3ed26774083f79fdf423
Author: YAMAMOTO Takashi <[email protected]>
AuthorDate: Mon May 13 20:42:14 2024 +0900

    esp32s3: make textheap return i-bus address consistently
    
    Perform I-D translation for extram as well.
    
    Also, use macros from soc.h.
---
 arch/xtensa/src/esp32s3/esp32s3_textheap.c | 44 +++++++++++++++++++++++++++---
 1 file changed, 40 insertions(+), 4 deletions(-)

diff --git a/arch/xtensa/src/esp32s3/esp32s3_textheap.c 
b/arch/xtensa/src/esp32s3/esp32s3_textheap.c
index e7a0967f6e..728749ee14 100644
--- a/arch/xtensa/src/esp32s3/esp32s3_textheap.c
+++ b/arch/xtensa/src/esp32s3/esp32s3_textheap.c
@@ -45,7 +45,7 @@
 #error "No suitable heap available. Enable ESP32S3_RTC_HEAP."
 #endif
 
-#define D_I_BUS_OFFSET  0x6f0000
+#define EXTRAM_D_I_BUS_OFFSET  0x6000000
 
 /****************************************************************************
  * Public Functions
@@ -92,7 +92,19 @@ void *up_textheap_memalign(size_t align, size_t size)
            * can access it from the Instruction bus.
            */
 
-          ret += D_I_BUS_OFFSET;
+          uintptr_t addr = (uintptr_t)ret;
+          if (SOC_DIRAM_DRAM_LOW <= addr && addr <= SOC_DIRAM_DRAM_HIGH)
+            {
+              addr = MAP_DRAM_TO_IRAM(addr);
+            }
+          else
+            {
+              /* extram */
+
+              addr += EXTRAM_D_I_BUS_OFFSET;
+            }
+
+          ret = (void *)addr;
         }
     }
 
@@ -122,7 +134,19 @@ void up_textheap_free(void *p)
       else
 #endif
         {
-          p -= D_I_BUS_OFFSET;
+          uintptr_t addr = (uintptr_t)p;
+          if (SOC_DIRAM_IRAM_LOW <= addr && addr <= SOC_DIRAM_IRAM_HIGH)
+            {
+              addr = MAP_IRAM_TO_DRAM(addr);
+            }
+          else
+            {
+              /* extram */
+
+              addr -= EXTRAM_D_I_BUS_OFFSET;
+            }
+
+          p = (void *)addr;
           kmm_free(p);
         }
     }
@@ -156,6 +180,18 @@ bool up_textheap_heapmember(void *p)
     }
 #endif
 
-  p -= D_I_BUS_OFFSET;
+  uintptr_t addr = (uintptr_t)p;
+  if (SOC_DIRAM_IRAM_LOW <= addr && addr <= SOC_DIRAM_IRAM_HIGH)
+    {
+      addr = MAP_IRAM_TO_DRAM(addr);
+    }
+  else
+    {
+      /* extram */
+
+      addr -= EXTRAM_D_I_BUS_OFFSET;
+    }
+
+  p = (void *)addr;
   return kmm_heapmember(p);
 }

Reply via email to