idc: allow idc_free() to disable only irqs

This commit:
- adds flags argument to idc_free() function;
- adds IDC_FREE_IRQ_ONLY flags, which allows
  idc_free() to disable only interrupts.

Signed-off-by: Bartosz Kokoszko <bartoszx.kokoszko@linux.intel.com>
This commit is contained in:
Bartosz Kokoszko 2021-10-20 16:25:10 +02:00 committed by Liam Girdwood
parent 17ebe860f0
commit 225d8e3b86
3 changed files with 9 additions and 3 deletions

View File

@ -164,7 +164,7 @@ void cpu_power_down_core(void)
{
arch_interrupt_global_disable();
idc_free();
idc_free(0);
schedule_free();

View File

@ -279,7 +279,7 @@ int platform_idc_restore(void)
/**
* \brief Frees IDC data and unregisters interrupt.
*/
void idc_free(void)
void idc_free(uint32_t flags)
{
struct idc *idc = *idc_get();
int core = cpu_get_id();
@ -299,5 +299,8 @@ void idc_free(void)
idc_write(IPC_IDCTFC(i), core, idctfc);
}
if (flags & IDC_FREE_IRQ_ONLY)
return;
schedule_task_free(&idc->idc_task);
}

View File

@ -94,6 +94,9 @@
/** \brief Max IDC message payload size in bytes. */
#define IDC_MAX_PAYLOAD_SIZE 96
/** \brief IDC free function flags */
#define IDC_FREE_IRQ_ONLY BIT(0) /**< disable only irqs */
/** \brief IDC message payload. */
struct idc_payload {
uint8_t data[IDC_MAX_PAYLOAD_SIZE];
@ -128,7 +131,7 @@ static inline struct idc_payload *idc_payload_get(struct idc *idc,
void idc_enable_interrupts(int target_core, int source_core);
void idc_free(void);
void idc_free(uint32_t flags);
int platform_idc_init(void);