From b5b6bdc123e40221ceea83eefa662c04953d0186 Mon Sep 17 00:00:00 2001 From: bhmanda-silabs <107180296+bhmanda-silabs@users.noreply.github.com> Date: Thu, 13 Mar 2025 22:25:55 +0530 Subject: [PATCH] [Silabs] Fix the secure soc reset issue (#37965) * Added platform abstraction reset function for EFR and SoC platforms * Renamed the SPAM soft reset API * Added SPAM reset call in matter code * Fixed EFR32 build issue due to namespace is missing * Update examples/platform/silabs/Rpc.cpp Co-authored-by: Mathieu Kardous <84793247+mkardous-silabs@users.noreply.github.com> * Update src/platform/silabs/SiWx917/OTAImageProcessorImpl.cpp Co-authored-by: Mathieu Kardous <84793247+mkardous-silabs@users.noreply.github.com> * Update src/platform/silabs/platformAbstraction/SilabsPlatformBase.h Co-authored-by: Mathieu Kardous <84793247+mkardous-silabs@users.noreply.github.com> * Update src/platform/silabs/platformAbstraction/SilabsPlatformBase.h Co-authored-by: Mathieu Kardous <84793247+mkardous-silabs@users.noreply.github.com> --------- Co-authored-by: Mathieu Kardous <84793247+mkardous-silabs@users.noreply.github.com> --- examples/platform/silabs/Rpc.cpp | 6 ++++-- src/platform/silabs/ConfigurationManagerImpl.cpp | 2 +- src/platform/silabs/SiWx917/OTAImageProcessorImpl.cpp | 5 ++++- src/platform/silabs/platformAbstraction/GsdkSpam.cpp | 5 +++++ src/platform/silabs/platformAbstraction/SilabsPlatform.h | 2 ++ .../silabs/platformAbstraction/SilabsPlatformBase.h | 6 ++++++ src/platform/silabs/platformAbstraction/WiseMcuSpam.cpp | 7 +++++++ 7 files changed, 29 insertions(+), 4 deletions(-) diff --git a/examples/platform/silabs/Rpc.cpp b/examples/platform/silabs/Rpc.cpp index d265e65af7..10a364cb56 100644 --- a/examples/platform/silabs/Rpc.cpp +++ b/examples/platform/silabs/Rpc.cpp @@ -21,6 +21,7 @@ #include "pigweed/RpcService.h" #include "pw_sys_io_efr32/init.h" #include +#include #include #if defined(PW_RPC_ATTRIBUTE_SERVICE) && PW_RPC_ATTRIBUTE_SERVICE @@ -73,6 +74,8 @@ size_t pw_trace_GetTraceTimeTicksPerSecond() #endif // defined(PW_RPC_TRACING_SERVICE) && PW_RPC_TRACING_SERVICE +using namespace chip::DeviceLayer::Silabs; + namespace chip { namespace rpc { @@ -117,7 +120,7 @@ class Efr32Device final : public Device osTimer_t mRebootTimerBuffer; osTimerAttr_t mRebootTimerAttr = { .name = "Reboot", .cb_mem = &mRebootTimerBuffer, .cb_size = osTimerCbSize }; - static void RebootHandler(void * timerCbArg) { NVIC_SystemReset(); } + static void RebootHandler(void * timerCbArg) { GetPlatform().SoftwareReset(); } }; #endif // defined(PW_RPC_DEVICE_SERVICE) && PW_RPC_DEVICE_SERVICE @@ -225,6 +228,5 @@ void Init() // Start App task. sRpcTaskHandle = osThreadNew(RunRpcService, nullptr, &kRpcTaskAttr); } - } // namespace rpc } // namespace chip diff --git a/src/platform/silabs/ConfigurationManagerImpl.cpp b/src/platform/silabs/ConfigurationManagerImpl.cpp index 668b150ccc..f8be7114cb 100644 --- a/src/platform/silabs/ConfigurationManagerImpl.cpp +++ b/src/platform/silabs/ConfigurationManagerImpl.cpp @@ -306,7 +306,7 @@ void ConfigurationManagerImpl::DoFactoryReset(intptr_t arg) // Block the task for 500 ms before the reset occurs to allow RPC response to be sent vTaskDelay(pdMS_TO_TICKS(500)); - NVIC_SystemReset(); + Silabs::GetPlatform().SoftwareReset(); } #ifdef SL_WIFI diff --git a/src/platform/silabs/SiWx917/OTAImageProcessorImpl.cpp b/src/platform/silabs/SiWx917/OTAImageProcessorImpl.cpp index 3829cb1db5..1be182a82a 100644 --- a/src/platform/silabs/SiWx917/OTAImageProcessorImpl.cpp +++ b/src/platform/silabs/SiWx917/OTAImageProcessorImpl.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #if CHIP_CONFIG_ENABLE_ICD_SERVER #include @@ -42,6 +43,8 @@ extern "C" { uint8_t flag = RPS_HEADER; static chip::OTAImageProcessorImpl gImageProcessor; +using namespace chip::DeviceLayer::Silabs; + namespace chip { // Define static memebers @@ -228,7 +231,7 @@ void OTAImageProcessorImpl::HandleApply(intptr_t context) // send system reset request to reset the MCU and upgrade the m4 image ChipLogProgress(SoftwareUpdate, "SoC Soft Reset initiated!"); // Reboots the device - sl_si91x_soc_nvic_reset(); + GetPlatform().SoftwareReset(); } } diff --git a/src/platform/silabs/platformAbstraction/GsdkSpam.cpp b/src/platform/silabs/platformAbstraction/GsdkSpam.cpp index bc221ead6a..7b57604a6c 100644 --- a/src/platform/silabs/platformAbstraction/GsdkSpam.cpp +++ b/src/platform/silabs/platformAbstraction/GsdkSpam.cpp @@ -124,6 +124,11 @@ CHIP_ERROR SilabsPlatform::Init(void) return CHIP_NO_ERROR; } +void SilabsPlatform::SoftwareReset() +{ + NVIC_SystemReset(); +} + CHIP_ERROR SilabsPlatform::FlashInit() { #if defined(SL_TRUSTZONE_NONSECURE) diff --git a/src/platform/silabs/platformAbstraction/SilabsPlatform.h b/src/platform/silabs/platformAbstraction/SilabsPlatform.h index df84224c50..fb596f103a 100644 --- a/src/platform/silabs/platformAbstraction/SilabsPlatform.h +++ b/src/platform/silabs/platformAbstraction/SilabsPlatform.h @@ -61,6 +61,8 @@ class SilabsPlatform : virtual public SilabsPlatformAbstractionBase CHIP_ERROR FlashErasePage(uint32_t addr) override; CHIP_ERROR FlashWritePage(uint32_t addr, const uint8_t * data, size_t size) override; + void SoftwareReset(void) override; + private: friend SilabsPlatform & GetPlatform(void); diff --git a/src/platform/silabs/platformAbstraction/SilabsPlatformBase.h b/src/platform/silabs/platformAbstraction/SilabsPlatformBase.h index 818463ecfb..555847c99e 100644 --- a/src/platform/silabs/platformAbstraction/SilabsPlatformBase.h +++ b/src/platform/silabs/platformAbstraction/SilabsPlatformBase.h @@ -56,6 +56,12 @@ class SilabsPlatformAbstractionBase virtual CHIP_ERROR FlashErasePage(uint32_t addr) { return CHIP_ERROR_NOT_IMPLEMENTED; } virtual CHIP_ERROR FlashWritePage(uint32_t addr, const uint8_t * data, size_t size) { return CHIP_ERROR_NOT_IMPLEMENTED; } + /** + * @brief Function trigger the platform to execute a software reset. + * Anything after this function will not be executed since the device will reboot. + */ + virtual void SoftwareReset(void) = 0; + // BLE Specific Method protected: diff --git a/src/platform/silabs/platformAbstraction/WiseMcuSpam.cpp b/src/platform/silabs/platformAbstraction/WiseMcuSpam.cpp index 2d052a6bcd..0eb978428d 100644 --- a/src/platform/silabs/platformAbstraction/WiseMcuSpam.cpp +++ b/src/platform/silabs/platformAbstraction/WiseMcuSpam.cpp @@ -38,6 +38,8 @@ extern "C" { #endif // SL_SI91X_BOARD_INIT #include "sl_event_handler.h" +#include "sl_si91x_hal_soc_soft_reset.h" + #ifdef SL_CATALOG_SIMPLE_BUTTON_PRESENT #include "sl_si91x_button.h" #include "sl_si91x_button_pin_config.h" @@ -208,6 +210,11 @@ uint8_t SilabsPlatform::GetButtonState(uint8_t button) } #endif // SL_CATALOG_SIMPLE_BUTTON_PRESENT +void SilabsPlatform::SoftwareReset() +{ + sl_si91x_soc_nvic_reset(); +} + CHIP_ERROR SilabsPlatform::FlashInit() { return CHIP_NO_ERROR;