[Sound-open-firmware] [PATCH] sof: buffer: add spin lock for buffer consume/produce
Xiuli Pan
xiuli.pan at linux.intel.com
Mon Feb 12 04:55:33 CET 2018
From: Pan Xiuli <xiuli.pan at linux.intel.com>
We may have irq to modify buffer when are modifing the buffer.
Add the spin lock to make modify atomic.
Signed-off-by: Pan Xiuli <xiuli.pan at linux.intel.com>
---
Test with:
Mininow max rt5651
SOF master: 019637ab250daa53c15da0a0a98c54f1c58d8ca3
SOF-Tool master: 33e4b0cc6f6a44e3e7ee849c04c515a5537242c7
https://github.com/plbossart/sound/tree/topic/sof-v4.14:
6fa721a8b7c6567eea0a2181bf9a3d2a12c31b00
Signed-off-by: Pan Xiuli <xiuli.pan at linux.intel.com>
---
src/audio/buffer.c | 2 ++
src/include/reef/audio/buffer.h | 14 ++++++++++++++
2 files changed, 16 insertions(+)
diff --git a/src/audio/buffer.c b/src/audio/buffer.c
index 0acf660..6ae7d92 100644
--- a/src/audio/buffer.c
+++ b/src/audio/buffer.c
@@ -84,6 +84,8 @@ struct comp_buffer *buffer_new(struct sof_ipc_buffer *desc)
buffer->avail = 0;
buffer->connected = 0;
+ spinlock_init(&buffer->lock);
+
return buffer;
}
diff --git a/src/include/reef/audio/buffer.h b/src/include/reef/audio/buffer.h
index 2bb2033..3e6d9e9 100644
--- a/src/include/reef/audio/buffer.h
+++ b/src/include/reef/audio/buffer.h
@@ -71,6 +71,8 @@ struct comp_buffer {
/* lists */
struct list_item source_list; /* list in comp buffers */
struct list_item sink_list; /* list in comp buffers */
+
+ spinlock_t lock;
};
/* pipeline buffer creation and destruction */
@@ -81,6 +83,10 @@ void buffer_free(struct comp_buffer *buffer);
static inline void comp_update_buffer_produce(struct comp_buffer *buffer,
uint32_t bytes)
{
+ uint32_t flags;
+
+ spin_lock_irq(&buffer->lock, flags);
+
buffer->w_ptr += bytes;
/* check for pointer wrap */
@@ -98,6 +104,8 @@ static inline void comp_update_buffer_produce(struct comp_buffer *buffer,
/* calculate free bytes */
buffer->free = buffer->size - buffer->avail;
+ spin_unlock_irq(&buffer->lock, flags);
+
tracev_buffer("pro");
tracev_value((buffer->avail << 16) | buffer->free);
tracev_value((buffer->ipc_buffer.comp.id << 16) | buffer->size);
@@ -108,6 +116,10 @@ static inline void comp_update_buffer_produce(struct comp_buffer *buffer,
static inline void comp_update_buffer_consume(struct comp_buffer *buffer,
uint32_t bytes)
{
+ uint32_t flags;
+
+ spin_lock_irq(&buffer->lock, flags);
+
buffer->r_ptr += bytes;
/* check for pointer wrap */
@@ -125,6 +137,8 @@ static inline void comp_update_buffer_consume(struct comp_buffer *buffer,
/* calculate free bytes */
buffer->free = buffer->size - buffer->avail;
+ spin_unlock_irq(&buffer->lock, flags);
+
tracev_buffer("con");
tracev_value((buffer->avail << 16) | buffer->free);
tracev_value((buffer->ipc_buffer.comp.id << 16) | buffer->size);
--
2.7.4
More information about the Sound-open-firmware
mailing list