Add fixes for gcc8 psram fix improvement
This commit is contained in:
parent
f7742dd9cc
commit
faae3ceec5
7 changed files with 102 additions and 5 deletions
|
@ -96,5 +96,19 @@ else()
|
||||||
target_compile_options(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-issue)
|
target_compile_options(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-issue)
|
||||||
# also, make sure we link with this option so correct toolchain libs are pulled in
|
# also, make sure we link with this option so correct toolchain libs are pulled in
|
||||||
target_link_libraries(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-issue)
|
target_link_libraries(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-issue)
|
||||||
|
# set strategy selected
|
||||||
|
# note that we don't need to set link options as the library linked is independent of this
|
||||||
|
if(CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_DUPLDST)
|
||||||
|
target_compile_options(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-strategy=dupldst)
|
||||||
|
target_link_libraries(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-strategy=dupldst)
|
||||||
|
endif()
|
||||||
|
if(CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_MEMW)
|
||||||
|
target_compile_options(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-strategy=memw)
|
||||||
|
target_link_libraries(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-strategy=memw)
|
||||||
|
endif()
|
||||||
|
if(CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_NOPS)
|
||||||
|
target_compile_options(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-strategy=nops)
|
||||||
|
target_link_libraries(${COMPONENT_LIB} PUBLIC -mfix-esp32-psram-cache-strategy=nops)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -168,6 +168,40 @@ menu "ESP32-specific"
|
||||||
|
|
||||||
The workaround is not required for ESP32 revision 3 and above.
|
The workaround is not required for ESP32 revision 3 and above.
|
||||||
|
|
||||||
|
menu "SPIRAM cache workaround debugging"
|
||||||
|
|
||||||
|
choice SPIRAM_CACHE_WORKAROUND_STRATEGY
|
||||||
|
prompt "Workaround strategy"
|
||||||
|
depends on SPIRAM_CACHE_WORKAROUND
|
||||||
|
default SPIRAM_CACHE_WORKAROUND_STRATEGY_MEMW
|
||||||
|
help
|
||||||
|
Select the workaround strategy. Note that the strategy for precompiled
|
||||||
|
libraries (libgcc, newlib, bt, wifi) is not affected by this selection.
|
||||||
|
|
||||||
|
Unless you know you need a different strategy, it's suggested you stay
|
||||||
|
with the default MEMW strategy. Note that DUPLDST can interfere with hardware
|
||||||
|
encryption and this will be automatically disabled if this workaround is selected.
|
||||||
|
'Insert nops' is the workaround that was used in older esp-idf versions. This workaround
|
||||||
|
still can cause faulty data transfers from/to SPI RAM in some situation.
|
||||||
|
|
||||||
|
config SPIRAM_CACHE_WORKAROUND_STRATEGY_MEMW
|
||||||
|
bool "Insert memw after vulnerable instructions (default)"
|
||||||
|
|
||||||
|
config SPIRAM_CACHE_WORKAROUND_STRATEGY_DUPLDST
|
||||||
|
bool "Duplicate LD/ST for 32-bit, memw for 8/16 bit"
|
||||||
|
|
||||||
|
config SPIRAM_CACHE_WORKAROUND_STRATEGY_NOPS
|
||||||
|
bool "Insert nops between vulnerable loads/stores (old strategy, obsolete)"
|
||||||
|
endchoice
|
||||||
|
|
||||||
|
#This needs to be Y only for the dupldst workaround
|
||||||
|
config SPIRAM_WORKAROUND_NEED_VOLATILE_SPINLOCK
|
||||||
|
bool
|
||||||
|
default "y" if SPIRAM_CACHE_WORKAROUND_STRATEGY_DUPLDST
|
||||||
|
|
||||||
|
|
||||||
|
endmenu
|
||||||
|
|
||||||
config SPIRAM_BANKSWITCH_ENABLE
|
config SPIRAM_BANKSWITCH_ENABLE
|
||||||
bool "Enable bank switching for >4MiB external RAM"
|
bool "Enable bank switching for >4MiB external RAM"
|
||||||
default y
|
default y
|
||||||
|
|
|
@ -1,9 +1,24 @@
|
||||||
# Enable psram cache bug workaround in compiler if selected
|
# Enable psram cache bug workaround in compiler if selected
|
||||||
|
|
||||||
ifdef CONFIG_SPIRAM_CACHE_WORKAROUND
|
ifdef CONFIG_SPIRAM_CACHE_WORKAROUND
|
||||||
CFLAGS+=-mfix-esp32-psram-cache-issue
|
SPIRAM_CACHE_WORKAROUND_FLAGS = -mfix-esp32-psram-cache-issue
|
||||||
CXXFLAGS+=-mfix-esp32-psram-cache-issue
|
|
||||||
LDFLAGS+=-mfix-esp32-psram-cache-issue
|
ifdef CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_DUPLDST
|
||||||
|
SPIRAM_CACHE_WORKAROUND_FLAGS += -mfix-esp32-psram-cache-strategy=dupldst
|
||||||
endif
|
endif
|
||||||
|
ifdef CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_MEMW
|
||||||
|
SPIRAM_CACHE_WORKAROUND_FLAGS += -mfix-esp32-psram-cache-strategy=memw
|
||||||
|
endif
|
||||||
|
ifdef CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_NOPS
|
||||||
|
SPIRAM_CACHE_WORKAROUND_FLAGS += -mfix-esp32-psram-cache-strategy=nops
|
||||||
|
endif
|
||||||
|
|
||||||
|
CFLAGS+=$(SPIRAM_CACHE_WORKAROUND_FLAGS)
|
||||||
|
CXXFLAGS+=$(SPIRAM_CACHE_WORKAROUND_FLAGS)
|
||||||
|
LDFLAGS+=$(SPIRAM_CACHE_WORKAROUND_FLAGS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Enable dynamic esp_timer overflow value if building unit tests
|
# Enable dynamic esp_timer overflow value if building unit tests
|
||||||
ifneq ("$(filter esp32,$(TEST_COMPONENTS_LIST))","")
|
ifneq ("$(filter esp32,$(TEST_COMPONENTS_LIST))","")
|
||||||
|
|
|
@ -4,6 +4,16 @@ if(CONFIG_SPIRAM_CACHE_WORKAROUND)
|
||||||
# non-IDF CMakeLists.txt file is imported into a component) don't depend
|
# non-IDF CMakeLists.txt file is imported into a component) don't depend
|
||||||
# on the esp32 component so don't get the extra flag. This handles that case.
|
# on the esp32 component so don't get the extra flag. This handles that case.
|
||||||
idf_build_set_property(COMPILE_OPTIONS "-mfix-esp32-psram-cache-issue" APPEND)
|
idf_build_set_property(COMPILE_OPTIONS "-mfix-esp32-psram-cache-issue" APPEND)
|
||||||
|
# note that we don't need to set link options as the library linked is independent of this
|
||||||
|
if(CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_DUPLDST)
|
||||||
|
idf_build_set_property(COMPILE_OPTIONS "-mfix-esp32-psram-cache-strategy=dupldst" APPEND)
|
||||||
|
endif()
|
||||||
|
if(CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_MEMW)
|
||||||
|
idf_build_set_property(COMPILE_OPTIONS "-mfix-esp32-psram-cache-strategy=memw" APPEND)
|
||||||
|
endif()
|
||||||
|
if(CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_NOPS)
|
||||||
|
idf_build_set_property(COMPILE_OPTIONS "-mfix-esp32-psram-cache-strategy=nops" APPEND)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Check toolchain is configured properly in cmake
|
# Check toolchain is configured properly in cmake
|
||||||
|
|
|
@ -133,6 +133,12 @@ typedef unsigned portBASE_TYPE UBaseType_t;
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_SPIRAM_WORKAROUND_NEED_VOLATILE_SPINLOCK
|
||||||
|
#define NEED_VOLATILE_MUX volatile
|
||||||
|
#else
|
||||||
|
#define NEED_VOLATILE_MUX
|
||||||
|
#endif
|
||||||
|
|
||||||
/* "mux" data structure (spinlock) */
|
/* "mux" data structure (spinlock) */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/* owner field values:
|
/* owner field values:
|
||||||
|
@ -142,12 +148,12 @@ typedef struct {
|
||||||
*
|
*
|
||||||
* Any value other than portMUX_FREE_VAL, CORE_ID_PRO, CORE_ID_APP indicates corruption
|
* Any value other than portMUX_FREE_VAL, CORE_ID_PRO, CORE_ID_APP indicates corruption
|
||||||
*/
|
*/
|
||||||
uint32_t owner;
|
NEED_VOLATILE_MUX uint32_t owner;
|
||||||
/* count field:
|
/* count field:
|
||||||
* If mux is unlocked, count should be zero.
|
* If mux is unlocked, count should be zero.
|
||||||
* If mux is locked, count is non-zero & represents the number of recursive locks on the mux.
|
* If mux is locked, count is non-zero & represents the number of recursive locks on the mux.
|
||||||
*/
|
*/
|
||||||
uint32_t count;
|
NEED_VOLATILE_MUX uint32_t count;
|
||||||
#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
|
#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
|
||||||
const char *lastLockedFn;
|
const char *lastLockedFn;
|
||||||
int lastLockedLine;
|
int lastLockedLine;
|
||||||
|
|
|
@ -132,6 +132,7 @@ menu "mbedTLS"
|
||||||
config MBEDTLS_HARDWARE_AES
|
config MBEDTLS_HARDWARE_AES
|
||||||
bool "Enable hardware AES acceleration"
|
bool "Enable hardware AES acceleration"
|
||||||
default y
|
default y
|
||||||
|
depends on !SPIRAM_CACHE_WORKAROUND_STRATEGY_DUPLDST
|
||||||
help
|
help
|
||||||
Enable hardware accelerated AES encryption & decryption.
|
Enable hardware accelerated AES encryption & decryption.
|
||||||
|
|
||||||
|
@ -141,6 +142,7 @@ menu "mbedTLS"
|
||||||
config MBEDTLS_HARDWARE_MPI
|
config MBEDTLS_HARDWARE_MPI
|
||||||
bool "Enable hardware MPI (bignum) acceleration"
|
bool "Enable hardware MPI (bignum) acceleration"
|
||||||
default n
|
default n
|
||||||
|
depends on !SPIRAM_CACHE_WORKAROUND_STRATEGY_DUPLDST
|
||||||
help
|
help
|
||||||
Enable hardware accelerated multiple precision integer operations.
|
Enable hardware accelerated multiple precision integer operations.
|
||||||
|
|
||||||
|
@ -162,6 +164,7 @@ menu "mbedTLS"
|
||||||
config MBEDTLS_HARDWARE_SHA
|
config MBEDTLS_HARDWARE_SHA
|
||||||
bool "Enable hardware SHA acceleration"
|
bool "Enable hardware SHA acceleration"
|
||||||
default y
|
default y
|
||||||
|
depends on !SPIRAM_CACHE_WORKAROUND_STRATEGY_DUPLDST
|
||||||
help
|
help
|
||||||
Enable hardware accelerated SHA1, SHA256, SHA384 & SHA512 in mbedTLS.
|
Enable hardware accelerated SHA1, SHA256, SHA384 & SHA512 in mbedTLS.
|
||||||
|
|
||||||
|
|
|
@ -394,6 +394,21 @@ function run_tests()
|
||||||
grep -q '"command"' build/compile_commands.json || failure "compile_commands.json missing or has no no 'commands' in it"
|
grep -q '"command"' build/compile_commands.json || failure "compile_commands.json missing or has no no 'commands' in it"
|
||||||
(grep '"command"' build/compile_commands.json | grep -v mfix-esp32-psram-cache-issue) && failure "All commands in compile_commands.json should use PSRAM cache workaround"
|
(grep '"command"' build/compile_commands.json | grep -v mfix-esp32-psram-cache-issue) && failure "All commands in compile_commands.json should use PSRAM cache workaround"
|
||||||
rm -r build
|
rm -r build
|
||||||
|
#Test for various strategies
|
||||||
|
for strat in MEMW NOPS DUPLDST; do
|
||||||
|
rm -r build sdkconfig.defaults sdkconfig sdkconfig.defaults.esp32
|
||||||
|
stratlc=`echo $strat | tr A-Z a-z`
|
||||||
|
mkdir build && touch build/sdkconfig
|
||||||
|
echo "CONFIG_ESP32_SPIRAM_SUPPORT=y" > sdkconfig.defaults
|
||||||
|
echo "CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_$strat=y" >> sdkconfig.defaults
|
||||||
|
echo "CONFIG_SPIRAM_CACHE_WORKAROUND=y" >> sdkconfig.defaults
|
||||||
|
# note: we do 'reconfigure' here, as we just need to run cmake
|
||||||
|
idf.py reconfigure
|
||||||
|
grep -q '"command"' build/compile_commands.json || failure "compile_commands.json missing or has no no 'commands' in it"
|
||||||
|
(grep '"command"' build/compile_commands.json | grep -v mfix-esp32-psram-cache-strategy=$stratlc) && failure "All commands in compile_commands.json should use PSRAM cache workaround strategy $strat when selected"
|
||||||
|
echo ${PWD}
|
||||||
|
rm -r sdkconfig.defaults build
|
||||||
|
done
|
||||||
|
|
||||||
print_status "Cleaning Python bytecode"
|
print_status "Cleaning Python bytecode"
|
||||||
idf.py clean > /dev/null
|
idf.py clean > /dev/null
|
||||||
|
|
Loading…
Reference in a new issue