[Sound-open-firmware] [PATCH] Use 64-bit time instead of 32-bit time for work queue utility.
From: Yan Wang yan.wang@linux.intel.com
Current timer has been upgraded to 64-bit but work queue utility still uses 32-bit. So timer->hitime can't be added rightly because the 64-bit time is truncated by work queue utility. "rmbox" will still receive 32-bit timestamp value only and can't be upgraded to 64-bit timestamp.
Signed-off-by: Yan Wang yan.wang@linux.intel.com --- src/audio/dma-trace.c | 2 +- src/audio/volume.c | 2 +- src/include/reef/reef.h | 1 + src/include/reef/wait.h | 4 ++-- src/include/reef/work.h | 4 ++-- src/lib/schedule.c | 2 +- src/lib/work.c | 30 +++++++++++++++--------------- 7 files changed, 23 insertions(+), 22 deletions(-)
diff --git a/src/audio/dma-trace.c b/src/audio/dma-trace.c index 8fc220e..d725fcf 100644 --- a/src/audio/dma-trace.c +++ b/src/audio/dma-trace.c @@ -97,7 +97,7 @@ static void trace_send(struct dma_trace_data *d) trace_buffer("dts"); }
-static uint32_t trace_work(void *data, uint32_t delay) +static uint64_t trace_work(void *data, uint64_t delay) { struct dma_trace_data *d = (struct dma_trace_data *)data;
diff --git a/src/audio/volume.c b/src/audio/volume.c index 68c8453..04d1b34 100644 --- a/src/audio/volume.c +++ b/src/audio/volume.c @@ -277,7 +277,7 @@ static void vol_update(struct comp_data *cd, uint32_t chan) }
/* this ramps volume changes over time */ -static uint32_t vol_work(void *data, uint32_t delay) +static uint64_t vol_work(void *data, uint64_t delay) { struct comp_dev *dev = (struct comp_dev *)data; struct comp_data *cd = comp_get_drvdata(dev); diff --git a/src/include/reef/reef.h b/src/include/reef/reef.h index 0cf8261..3450208 100644 --- a/src/include/reef/reef.h +++ b/src/include/reef/reef.h @@ -39,6 +39,7 @@ struct ipc;
/* TODO: define for unsigned and short, byte */ #define MAX_INT 0xffffffff +#define MAX_INT64 0xffffffffffffffff
/* use same syntax as Linux for simplicity */ #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) diff --git a/src/include/reef/wait.h b/src/include/reef/wait.h index c830a75..08fc0b0 100644 --- a/src/include/reef/wait.h +++ b/src/include/reef/wait.h @@ -45,7 +45,7 @@ typedef struct { uint32_t complete; struct work work; - uint32_t timeout; + uint64_t timeout; } completion_t;
void arch_wait_for_interrupt(int level); @@ -57,7 +57,7 @@ static inline void wait_for_interrupt(int level) tracev_event(TRACE_CLASS_WAIT, "WFX"); }
-static uint32_t _wait_cb(void *data, uint32_t delay) +static uint64_t _wait_cb(void *data, uint64_t delay) { volatile completion_t *wc = (volatile completion_t*)data;
diff --git a/src/include/reef/work.h b/src/include/reef/work.h index 516f98f..0cdb085 100644 --- a/src/include/reef/work.h +++ b/src/include/reef/work.h @@ -45,10 +45,10 @@ struct work_queue; #define WORK_SYNC (1 << 0) /* work is scheduled synchronously */
struct work { - uint32_t (*cb)(void*, uint32_t udelay); /* returns reschedule timeout in msecs */ + uint64_t (*cb)(void*, uint64_t udelay); /* returns reschedule timeout in msecs */ void *cb_data; struct list_item list; - uint32_t timeout; + uint64_t timeout; uint32_t pending; uint32_t flags; }; diff --git a/src/lib/schedule.c b/src/lib/schedule.c index 427ca2e..993f94a 100644 --- a/src/lib/schedule.c +++ b/src/lib/schedule.c @@ -146,7 +146,7 @@ static inline struct task *edf_get_next(uint64_t current, }
/* work set in the future when next task can be scheduled */ -static uint32_t sch_work(void *data, uint32_t delay) +static uint64_t sch_work(void *data, uint64_t delay) { tracev_pipe("wrk"); schedule(); diff --git a/src/lib/work.c b/src/lib/work.c index a267b80..cd21b20 100644 --- a/src/lib/work.c +++ b/src/lib/work.c @@ -98,8 +98,8 @@ static int is_work_pending(struct work_queue *queue) { struct list_item *wlist; struct work *work; - uint32_t win_end; - uint32_t win_start; + uint64_t win_end; + uint64_t win_start; int pending_count = 0;
/* get the current valid window of work */ @@ -131,7 +131,7 @@ static int is_work_pending(struct work_queue *queue)
/* if work has timed out then mark it as pending to run */ if (work->timeout <= win_end || - (work->timeout >= win_start && work->timeout < MAX_INT)) { + (work->timeout >= win_start && work->timeout < MAX_INT64)) { work->pending = 1; pending_count++; } else { @@ -144,7 +144,7 @@ static int is_work_pending(struct work_queue *queue) }
static inline void work_next_timeout(struct work_queue *queue, - struct work *work, uint32_t reschedule_usecs) + struct work *work, uint64_t reschedule_usecs) { /* reschedule work */ if (work->flags & WORK_SYNC) { @@ -162,8 +162,8 @@ static void run_work(struct work_queue *queue, uint32_t *flags) struct list_item *wlist; struct list_item *tlist; struct work *work; - uint32_t reschedule_usecs; - uint32_t udelay; + uint64_t reschedule_usecs; + uint64_t udelay;
/* check each work item in queue for pending */ list_for_item_safe(wlist, tlist, &queue->work) { @@ -192,9 +192,9 @@ static void run_work(struct work_queue *queue, uint32_t *flags) } }
-static inline uint32_t calc_delta_ticks(uint32_t current, uint32_t work) +static inline uint64_t calc_delta_ticks(uint64_t current, uint64_t work) { - uint32_t max = MAX_INT; + uint64_t max = MAX_INT64;
/* does work run in next cycle ? */ if (work < current) { @@ -210,10 +210,10 @@ static void queue_get_next_timeout(struct work_queue *queue) { struct list_item *wlist; struct work *work; - uint32_t delta = MAX_INT; - uint32_t current; - uint32_t d; - uint32_t ticks; + uint64_t delta = MAX_INT64; + uint64_t current; + uint64_t d; + uint64_t ticks;
/* only recalc if work list not empty */ if (list_is_empty(&queue->work)) { @@ -246,9 +246,9 @@ static void queue_recalc_timers(struct work_queue *queue, { struct list_item *wlist; struct work *work; - uint32_t delta_ticks; - uint32_t delta_usecs; - uint32_t current; + uint64_t delta_ticks; + uint64_t delta_usecs; + uint64_t current;
/* get current time */ current = work_get_timer(queue);
On Tue, 2017-10-10 at 18:40 +0800, yan.wang@linux.intel.com wrote:
From: Yan Wang yan.wang@linux.intel.com
Current timer has been upgraded to 64-bit but work queue utility still uses 32-bit. So timer->hitime can't be added rightly because the 64-bit time is truncated by work queue utility. "rmbox" will still receive 32-bit timestamp value only and can't be upgraded to 64-bit timestamp.
Applied with some changes to use limits.h instead of local INT size macros.
Liam
--------------------------------------------------------------------- Intel Corporation (UK) Limited Registered No. 1134945 (England) Registered Office: Pipers Way, Swindon SN3 1RJ VAT No: 860 2173 47
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.
participants (2)
-
Liam Girdwood
-
yan.wang@linux.intel.com