From a7d6ef3ae2fc7faa15d328e5e8ff4f88e3fc2df6 Mon Sep 17 00:00:00 2001
From: Angus Gratton <angus@redyak.com.au>
Date: Fri, 28 Jul 2023 12:16:05 +1000
Subject: [PATCH] esp32: Allow malloc() to allocate from SPIRAM.

Also shrinks the "prefer internal" threshold to 8KB, any allocation larger
than this will try PSRAM first.

Change the mbedTLS config to use regular malloc() as well, instead of
internal only.  The default is set to internal-only due to to potential
physical security issue of readout via PSRAM on the original ESP32.
However, as MicroPython runs from plaintext flash and all other context is
in the MP heap of PSRAM then it's hard to see how worsens physical security
for MP.

This work was funded through GitHub Sponsors.

Signed-off-by: Angus Gratton <angus@redyak.com.au>
---
 .../micropython/vendor/ports/esp32/boards/sdkconfig.base | 9 +++++++++
 .../vendor/ports/esp32/boards/sdkconfig.spiram           | 6 +++++-
 .../vendor/ports/esp32/boards/sdkconfig.spiram_sx        | 6 +++++-
 3 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/components/micropython/vendor/ports/esp32/boards/sdkconfig.base b/components/micropython/vendor/ports/esp32/boards/sdkconfig.base
index a9e4454427..e5e57e6f84 100644
--- a/components/micropython/vendor/ports/esp32/boards/sdkconfig.base
+++ b/components/micropython/vendor/ports/esp32/boards/sdkconfig.base
@@ -49,6 +49,15 @@ CONFIG_LWIP_PPP_CHAP_SUPPORT=y
 # Use 4kiB output buffer instead of default 16kiB (because IDF heap is fragmented in 4.0)
 CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y
 
+# Allow mbedTLS to allocate from PSRAM or internal memory
+#
+# (The ESP-IDF default is internal-only, partly for physical security to prevent
+# possible information leakage from unencrypted PSRAM contents on the original
+# ESP32 - no PSRAM encryption on that chip. MicroPython doesn't support flash
+# encryption and is already storing the Python heap in PSRAM so this isn't a
+# significant factor in overall physical security.)
+CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC=y
+
 # ULP coprocessor support
 CONFIG_ESP32_ULP_COPROC_ENABLED=y
 CONFIG_ESP32_ULP_COPROC_RESERVE_MEM=2040
diff --git a/components/micropython/vendor/ports/esp32/boards/sdkconfig.spiram b/components/micropython/vendor/ports/esp32/boards/sdkconfig.spiram
index 74d35f7b4a..4dfc63624b 100644
--- a/components/micropython/vendor/ports/esp32/boards/sdkconfig.spiram
+++ b/components/micropython/vendor/ports/esp32/boards/sdkconfig.spiram
@@ -3,7 +3,11 @@
 CONFIG_SPIRAM=y
 CONFIG_SPIRAM_CACHE_WORKAROUND=y
 CONFIG_SPIRAM_IGNORE_NOTFOUND=y
-CONFIG_SPIRAM_USE_CAPS_ALLOC=y
+CONFIG_SPIRAM_USE_MALLOC=y
+
+# This is the threshold for preferring small allocations from internal memory
+# first, before failing over to PSRAM.
+CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=8192
 
 # SPIRAM increases the size of the firmware and overflows iram0_0_seg, due
 # to PSRAM bug workarounds.  Apply some options to reduce the firmware size.
diff --git a/components/micropython/vendor/ports/esp32/boards/sdkconfig.spiram_sx b/components/micropython/vendor/ports/esp32/boards/sdkconfig.spiram_sx
index fe38846780..05212b7568 100644
--- a/components/micropython/vendor/ports/esp32/boards/sdkconfig.spiram_sx
+++ b/components/micropython/vendor/ports/esp32/boards/sdkconfig.spiram_sx
@@ -7,4 +7,8 @@ CONFIG_SPIRAM_SPEED_80M=y
 CONFIG_SPIRAM=y
 CONFIG_SPIRAM_BOOT_INIT=y
 CONFIG_SPIRAM_IGNORE_NOTFOUND=y
-CONFIG_SPIRAM_USE_CAPS_ALLOC=y
+CONFIG_SPIRAM_USE_MALLOC=y
+
+# This is the threshold for preferring small allocations from internal memory
+# first, before failing over to PSRAM.
+CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=8192
-- 
GitLab