diff options
-rw-r--r-- | chip/npcx/flash.c | 11 | ||||
-rw-r--r-- | chip/stm32/bkpdata.c | 10 | ||||
-rw-r--r-- | common/i2c_master.c | 4 | ||||
-rw-r--r-- | core/cortex-m/task.c | 8 | ||||
-rw-r--r-- | power/common.c | 9 |
5 files changed, 34 insertions, 8 deletions
diff --git a/chip/npcx/flash.c b/chip/npcx/flash.c index 5bb8d209b4..b2b51d15df 100644 --- a/chip/npcx/flash.c +++ b/chip/npcx/flash.c @@ -60,8 +60,11 @@ static void flash_pinmux(int enable) static void flash_execute_cmd(uint8_t code, uint8_t cts) { - /* Flash mutex must be held while executing UMA commands. */ - ASSERT(flash_lock.lock); + /* + * Flash mutex must be held while executing UMA commands after + * task_start(). + */ + ASSERT(!task_start_called() || flash_lock.lock); /* set UMA_CODE */ NPCX_UMA_CODE = code; @@ -723,6 +726,10 @@ int flash_pre_init(void) void flash_lock_mapped_storage(int lock) { + /* Must not call mutex_lock() before task_start(). */ + if (!task_start_called()) + return; + if (lock) mutex_lock(&flash_lock); else diff --git a/chip/stm32/bkpdata.c b/chip/stm32/bkpdata.c index 2b26ace7ea..c31c1a9185 100644 --- a/chip/stm32/bkpdata.c +++ b/chip/stm32/bkpdata.c @@ -23,6 +23,7 @@ uint16_t bkpdata_read(enum bkpdata_index index) int bkpdata_write(enum bkpdata_index index, uint16_t value) { + int use_mutex = task_start_called(); static struct mutex bkpdata_write_mutex; if (index < 0 || index >= STM32_BKP_ENTRIES) @@ -30,9 +31,11 @@ int bkpdata_write(enum bkpdata_index index, uint16_t value) /* * Two entries share a single 32-bit register, lock mutex to prevent - * read/mask/write races. + * read/mask/write races. Must not call mutex_lock() before + * task_start(). */ - mutex_lock(&bkpdata_write_mutex); + if (use_mutex) + mutex_lock(&bkpdata_write_mutex); if (index & 1) { uint32_t val = STM32_BKP_DATA(index >> 1); val = (val & 0x0000FFFF) | (value << 16); @@ -42,7 +45,8 @@ int bkpdata_write(enum bkpdata_index index, uint16_t value) val = (val & 0xFFFF0000) | value; STM32_BKP_DATA(index >> 1) = val; } - mutex_unlock(&bkpdata_write_mutex); + if (use_mutex) + mutex_unlock(&bkpdata_write_mutex); return EC_SUCCESS; } diff --git a/common/i2c_master.c b/common/i2c_master.c index f078e690f7..78a5e505b9 100644 --- a/common/i2c_master.c +++ b/common/i2c_master.c @@ -242,6 +242,10 @@ void i2c_prepare_sysjump(void) { int i; + /* Must not call mutex_lock() before task_start(). */ + if (!task_start_called()) + return; + /* Lock all i2c controllers */ for (i = 0; i < ARRAY_SIZE(port_mutex); ++i) mutex_lock(port_mutex + i); diff --git a/core/cortex-m/task.c b/core/cortex-m/task.c index 75fbf99155..61697d2684 100644 --- a/core/cortex-m/task.c +++ b/core/cortex-m/task.c @@ -860,7 +860,13 @@ void mutex_lock(struct mutex *mtx) uint32_t value; uint32_t id = 1 << task_get_current(); - ASSERT(id != TASK_ID_INVALID); + /* + * mutex_lock() must not be used in interrupt context (because we wait + * if there is contention). Task ID is not valid before task_start() + * (since current_task is scratchpad). + */ + ASSERT(!in_interrupt_context() && task_start_called()); + atomic_or(&mtx->waiters, id); do { diff --git a/power/common.c b/power/common.c index 0cdabca0fa..b3200fd186 100644 --- a/power/common.c +++ b/power/common.c @@ -1049,10 +1049,15 @@ DECLARE_HOOK(HOOK_INIT, restore_enable_5v_state, HOOK_PRIO_FIRST); static void preserve_enable_5v_state(void) { - mutex_lock(&pwr_5v_ctl_mtx); + /* Must not call mutex_lock() before task_start(). */ + int use_mutex = task_start_called(); + + if (use_mutex) + mutex_lock(&pwr_5v_ctl_mtx); system_add_jump_tag(P5_SYSJUMP_TAG, 0, sizeof(pwr_5v_en_req), &pwr_5v_en_req); - mutex_unlock(&pwr_5v_ctl_mtx); + if (use_mutex) + mutex_unlock(&pwr_5v_ctl_mtx); } DECLARE_HOOK(HOOK_SYSJUMP, preserve_enable_5v_state, HOOK_PRIO_DEFAULT); #endif /* defined(CONFIG_POWER_PP5000_CONTROL) */ |