From a11d752b04ba4fa8aa47d3de40ba46904698dcbc Mon Sep 17 00:00:00 2001 From: Ranjani Sridharan Date: Wed, 11 Aug 2021 20:37:11 -0700 Subject: [PATCH] drivers: Intel: IDC: make core power down IDC blocking make the core power down IDC blocking to ensure the core is actually idle before notifying the host. Signed-off-by: Ranjani Sridharan --- src/arch/xtensa/lib/cpu.c | 2 +- src/drivers/intel/cavs/idc.c | 18 ++++++++++++++++++ src/include/sof/drivers/idc.h | 3 +++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/arch/xtensa/lib/cpu.c b/src/arch/xtensa/lib/cpu.c index 8e90b085822c..dcbe811f2476 100644 --- a/src/arch/xtensa/lib/cpu.c +++ b/src/arch/xtensa/lib/cpu.c @@ -113,7 +113,7 @@ void arch_cpu_disable_core(int id) IDC_MSG_POWER_DOWN, IDC_MSG_POWER_DOWN_EXT, id }; if (arch_cpu_is_core_enabled(id)) { - idc_send_msg(&power_down, IDC_NON_BLOCKING); + idc_send_msg(&power_down, IDC_POWER_DOWN); active_cores_mask ^= (1 << id); #if CONFIG_NO_SECONDARY_CORE_ROM diff --git a/src/drivers/intel/cavs/idc.c b/src/drivers/intel/cavs/idc.c index 2eb4d682aa49..e34535d7b776 100644 --- a/src/drivers/intel/cavs/idc.c +++ b/src/drivers/intel/cavs/idc.c @@ -95,6 +95,16 @@ static bool idc_is_powered_up(int target_core) TRACE_BOOT_PLATFORM; } +/** + * \brief Checks core status register. + * \param[in] target_core Id of the core powering up. + * \return True if core powered up, false otherwise. + */ +static bool idc_is_powered_down(int target_core) +{ + return mailbox_sw_reg_read(PLATFORM_TRACEP_SECONDARY_CORE(target_core)) == 0; +} + /** * \brief Sends IDC message. * \param[in,out] msg Pointer to IDC message. @@ -150,6 +160,14 @@ int idc_send_msg(struct idc_msg *msg, uint32_t mode) mailbox_sw_reg_read(PLATFORM_TRACEP_SECONDARY_CORE(msg->core))); } break; + case IDC_POWER_DOWN: + ret = idc_wait_in_blocking_mode(msg->core, idc_is_powered_down); + if (ret < 0) { + tr_err(&idc_tr, "idc_send_msg(), power down core %d failed, reason 0x%x", + msg->core, + mailbox_sw_reg_read(PLATFORM_TRACEP_SECONDARY_CORE(msg->core))); + } + break; } return ret; diff --git a/src/include/sof/drivers/idc.h b/src/include/sof/drivers/idc.h index a433cd39461b..2074a7049808 100644 --- a/src/include/sof/drivers/idc.h +++ b/src/include/sof/drivers/idc.h @@ -30,6 +30,9 @@ /** \brief IDC send core power up flag. */ #define IDC_POWER_UP 2 +/** \brief IDC send core power down flag. */ +#define IDC_POWER_DOWN 3 + /** \brief IDC send timeout in microseconds. */ #define IDC_TIMEOUT 10000