zephyr: clean up timer-domain left-overs, fix task cancellation

- Replace several further "timer" name domain left-overs with zephyr
  domain counterparts
- Remove useless "inline" specifier, the compiler will decide itself
- Remove the unused struct zephyr_domain::arg member
- Add delayable work cancellation when cancelling a task

Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
This commit is contained in:
Guennadi Liakhovetski 2021-05-19 14:27:28 +02:00 committed by Liam Girdwood
parent 560d29ddaf
commit 367fa7cec5
2 changed files with 16 additions and 18 deletions

View File

@ -28,7 +28,7 @@ struct timer_domain {
uint64_t timeout; /* in ticks */ uint64_t timeout; /* in ticks */
}; };
static inline void timer_report_delay(int id, uint64_t delay) static void timer_report_delay(int id, uint64_t delay)
{ {
uint32_t ll_delay_us = (delay * 1000) / uint32_t ll_delay_us = (delay * 1000) /
clock_ms_to_ticks(PLATFORM_DEFAULT_CLOCK, 1); clock_ms_to_ticks(PLATFORM_DEFAULT_CLOCK, 1);

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
// //
// Copyright(c) 2021 Intel Corporation. All rights reserved. // Copyright(c) 2019-2021 Intel Corporation. All rights reserved.
// //
// Author: Tomasz Lauda <tomasz.lauda@linux.intel.com> // Author: Tomasz Lauda <tomasz.lauda@linux.intel.com>
@ -57,19 +57,18 @@ struct zephyr_domain {
struct k_work_q ll_workq[CONFIG_CORE_COUNT]; struct k_work_q ll_workq[CONFIG_CORE_COUNT];
int ll_workq_registered[CONFIG_CORE_COUNT]; int ll_workq_registered[CONFIG_CORE_COUNT];
struct timer *timer; struct timer *timer;
void *arg[CONFIG_CORE_COUNT];
uint64_t timeout; /* in ticks */ uint64_t timeout; /* in ticks */
}; };
struct timer_zdata { struct zephyr_domain_work {
struct k_work_delayable work; struct k_work_delayable work;
void (*handler)(void *arg); void (*handler)(void *arg);
void *arg; void *arg;
}; };
struct timer_zdata zdata[CONFIG_CORE_COUNT]; struct zephyr_domain_work zdata[CONFIG_CORE_COUNT];
static inline void timer_report_delay(int id, uint64_t delay) static void zephyr_domain_report_delay(int id, uint64_t delay)
{ {
uint32_t ll_delay_us = (delay * 1000) / uint32_t ll_delay_us = (delay * 1000) /
clock_ms_to_ticks(PLATFORM_DEFAULT_CLOCK, 1); clock_ms_to_ticks(PLATFORM_DEFAULT_CLOCK, 1);
@ -79,20 +78,20 @@ static inline void timer_report_delay(int id, uint64_t delay)
return; return;
if (delay <= UINT_MAX) if (delay <= UINT_MAX)
tr_err(&ll_tr, "timer_report_delay(): timer %d delayed by %d uS %d ticks", tr_err(&ll_tr, "zephyr_domain_report_delay(): timer %d delayed by %d uS %d ticks",
id, ll_delay_us, (unsigned int)delay); id, ll_delay_us, (unsigned int)delay);
else else
tr_err(&ll_tr, "timer_report_delay(): timer %d delayed by %d uS, ticks > %u", tr_err(&ll_tr, "zephyr_domain_report_delay(): timer %d delayed by %d uS, ticks > %u",
id, ll_delay_us, UINT_MAX); id, ll_delay_us, UINT_MAX);
/* Fix compile error when traces are disabled */ /* Fix compile error when traces are disabled */
(void)ll_delay_us; (void)ll_delay_us;
} }
static void timer_z_handler(struct k_work *work) static void zephyr_domain_handler(struct k_work *work)
{ {
struct k_work_delayable *dwork = k_work_delayable_from_work(work); struct k_work_delayable *dwork = k_work_delayable_from_work(work);
struct timer_zdata *zd = CONTAINER_OF(dwork, struct timer_zdata, work); struct zephyr_domain_work *zd = CONTAINER_OF(dwork, struct zephyr_domain_work, work);
zd->handler(zd->arg); zd->handler(zd->arg);
} }
@ -159,7 +158,7 @@ static int zephyr_domain_register(struct ll_schedule_domain *domain,
zephyr_domain->ll_workq_registered[core] = 1; zephyr_domain->ll_workq_registered[core] = 1;
k_work_init_delayable(&zdata[core].work, timer_z_handler); k_work_init_delayable(&zdata[core].work, zephyr_domain_handler);
tr_info(&ll_tr, "zephyr_domain_register domain->type %d domain->clk %d domain->ticks_per_ms %d period %d", tr_info(&ll_tr, "zephyr_domain_register domain->type %d domain->clk %d domain->ticks_per_ms %d period %d",
domain->type, domain->clk, domain->ticks_per_ms, (uint32_t)period); domain->type, domain->clk, domain->ticks_per_ms, (uint32_t)period);
@ -171,20 +170,19 @@ out:
static int zephyr_domain_unregister(struct ll_schedule_domain *domain, static int zephyr_domain_unregister(struct ll_schedule_domain *domain,
struct task *task, uint32_t num_tasks) struct task *task, uint32_t num_tasks)
{ {
struct zephyr_domain *zephyr_domain = ll_sch_domain_get_pdata(domain);
int core = cpu_get_id(); int core = cpu_get_id();
tr_dbg(&ll_tr, "zephyr_domain_unregister()"); tr_dbg(&ll_tr, "zephyr_domain_unregister()");
/* tasks still registered on this core */ /* tasks still registered on this core */
if (!zephyr_domain->arg[core] || num_tasks) if (num_tasks)
return 0; return 0;
k_work_cancel_delayable(&zdata[core].work);
tr_info(&ll_tr, "zephyr_domain_unregister domain->type %d domain->clk %d", tr_info(&ll_tr, "zephyr_domain_unregister domain->type %d domain->clk %d",
domain->type, domain->clk); domain->type, domain->clk);
zephyr_domain->arg[core] = NULL;
return 0; return 0;
} }
@ -241,14 +239,14 @@ static void zephyr_domain_set(struct ll_schedule_domain *domain, uint64_t start)
tr_dbg(&ll_tr, "zephyr_domain_set(): ticks_set %u ticks_req %u current %u", tr_dbg(&ll_tr, "zephyr_domain_set(): ticks_set %u ticks_req %u current %u",
(unsigned int)ticks_set, (unsigned int)ticks_req, (unsigned int)ticks_set, (unsigned int)ticks_req,
(unsigned int)platform_timer_get_atomic(timer_get())); (unsigned int)platform_timer_get_atomic(zephyr_domain->timer));
/* Was timer set to the value we requested? If no it means some /* Was timer set to the value we requested? If no it means some
* delay occurred and we should report that in error log. * delay occurred and we should report that in error log.
*/ */
if (ticks_req < ticks_set) if (ticks_req < ticks_set)
timer_report_delay(zephyr_domain->timer->id, zephyr_domain_report_delay(zephyr_domain->timer->id,
ticks_set - ticks_req); ticks_set - ticks_req);
domain->next_tick = ticks_set; domain->next_tick = ticks_set;