Skip to content

Commit 9f418cc

Browse files
authored
Merge pull request #20 from tlauda/topic/buffer_l1_cache_handling
buffer: L1 cache operations handling
2 parents 11716bb + 76596a8 commit 9f418cc

5 files changed

Lines changed: 85 additions & 94 deletions

File tree

src/audio/buffer.c

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,73 @@ void buffer_free(struct comp_buffer *buffer)
9999
rfree(buffer->addr);
100100
rfree(buffer);
101101
}
102+
103+
void comp_update_buffer_produce(struct comp_buffer *buffer, uint32_t bytes)
104+
{
105+
uint32_t flags;
106+
107+
spin_lock_irq(&buffer->lock, flags);
108+
109+
if (buffer->source->is_dma_connected)
110+
dcache_invalidate_region(buffer->w_ptr, bytes);
111+
else if (buffer->sink->is_dma_connected)
112+
dcache_writeback_region(buffer->w_ptr, bytes);
113+
114+
buffer->w_ptr += bytes;
115+
116+
/* check for pointer wrap */
117+
if (buffer->w_ptr >= buffer->end_addr)
118+
buffer->w_ptr = buffer->addr + (buffer->w_ptr - buffer->end_addr);
119+
120+
/* calculate available bytes */
121+
if (buffer->r_ptr < buffer->w_ptr)
122+
buffer->avail = buffer->w_ptr - buffer->r_ptr;
123+
else if (buffer->r_ptr == buffer->w_ptr)
124+
buffer->avail = buffer->size; /* full */
125+
else
126+
buffer->avail = buffer->size - (buffer->r_ptr - buffer->w_ptr);
127+
128+
/* calculate free bytes */
129+
buffer->free = buffer->size - buffer->avail;
130+
131+
spin_unlock_irq(&buffer->lock, flags);
132+
133+
tracev_buffer("pro");
134+
tracev_value((buffer->avail << 16) | buffer->free);
135+
tracev_value((buffer->ipc_buffer.comp.id << 16) | buffer->size);
136+
tracev_value((buffer->r_ptr - buffer->addr) << 16 | (buffer->w_ptr - buffer->addr));
137+
}
138+
139+
void comp_update_buffer_consume(struct comp_buffer *buffer, uint32_t bytes)
140+
{
141+
uint32_t flags;
142+
143+
spin_lock_irq(&buffer->lock, flags);
144+
145+
buffer->r_ptr += bytes;
146+
147+
/* check for pointer wrap */
148+
if (buffer->r_ptr >= buffer->end_addr)
149+
buffer->r_ptr = buffer->addr + (buffer->r_ptr - buffer->end_addr);
150+
151+
/* calculate available bytes */
152+
if (buffer->r_ptr < buffer->w_ptr)
153+
buffer->avail = buffer->w_ptr - buffer->r_ptr;
154+
else if (buffer->r_ptr == buffer->w_ptr)
155+
buffer->avail = 0; /* empty */
156+
else
157+
buffer->avail = buffer->size - (buffer->r_ptr - buffer->w_ptr);
158+
159+
/* calculate free bytes */
160+
buffer->free = buffer->size - buffer->avail;
161+
162+
if (buffer->sink->is_dma_connected)
163+
dcache_writeback_region(buffer->r_ptr, bytes);
164+
165+
spin_unlock_irq(&buffer->lock, flags);
166+
167+
tracev_buffer("con");
168+
tracev_value((buffer->avail << 16) | buffer->free);
169+
tracev_value((buffer->ipc_buffer.comp.id << 16) | buffer->size);
170+
tracev_value((buffer->r_ptr - buffer->addr) << 16 | (buffer->w_ptr - buffer->addr));
171+
}

src/audio/dai.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,6 @@ static void dai_dma_cb(void *data, uint32_t type, struct dma_sg_elem *next)
123123
/* recalc available buffer space */
124124
comp_update_buffer_consume(dma_buffer, copied_size);
125125

126-
/* writeback buffer contents from cache */
127-
dcache_writeback_region(dma_buffer->r_ptr, copied_size);
128-
129126
/* update host position(in bytes offset) for drivers */
130127
dev->position += copied_size;
131128
if (dd->dai_pos) {
@@ -144,9 +141,6 @@ static void dai_dma_cb(void *data, uint32_t type, struct dma_sg_elem *next)
144141
dma_buffer = list_first_item(&dev->bsink_list,
145142
struct comp_buffer, source_list);
146143

147-
/* invalidate buffer contents */
148-
dcache_invalidate_region(dma_buffer->w_ptr, dd->period_bytes);
149-
150144
/* recalc available buffer space */
151145
comp_update_buffer_produce(dma_buffer, dd->period_bytes);
152146

@@ -229,6 +223,7 @@ static struct comp_dev *dai_new(struct sof_ipc_comp *comp)
229223
dma_set_cb(dd->dma, dd->chan, DMA_IRQ_TYPE_BLOCK |
230224
DMA_IRQ_TYPE_LLIST, dai_dma_cb, dev);
231225
dev->state = COMP_STATE_READY;
226+
dev->is_dma_connected = 1;
232227
return dev;
233228

234229
error:

src/audio/host.c

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -134,22 +134,13 @@ static void host_dma_cb(void *data, uint32_t type, struct dma_sg_elem *next)
134134
/* update buffer positions */
135135
dma_buffer = hd->dma_buffer;
136136

137-
if (dev->params.direction == SOF_IPC_STREAM_PLAYBACK) {
138-
139-
/* invalidate audio data */
140-
dcache_invalidate_region(dma_buffer->w_ptr, local_elem->size);
141-
137+
if (dev->params.direction == SOF_IPC_STREAM_PLAYBACK)
142138
/* recalc available buffer space */
143139
comp_update_buffer_produce(hd->dma_buffer, local_elem->size);
144-
145-
} else {
140+
else
146141
/* recalc available buffer space */
147142
comp_update_buffer_consume(hd->dma_buffer, local_elem->size);
148143

149-
/* writeback audio data */
150-
dcache_writeback_region(dma_buffer->r_ptr, local_elem->size);
151-
}
152-
153144
/* new local period, update host buffer position blks */
154145
hd->local_pos += local_elem->size;
155146
dev->position += local_elem->size;
@@ -319,20 +310,13 @@ static void host_gw_dma_update(struct comp_dev *dev)
319310
/* update buffer positions */
320311
dma_buffer = hd->dma_buffer;
321312

322-
if (dev->params.direction == SOF_IPC_STREAM_PLAYBACK) {
323-
/* invalidate audio data */
324-
dcache_invalidate_region(dma_buffer->w_ptr, local_elem->size);
325-
313+
if (dev->params.direction == SOF_IPC_STREAM_PLAYBACK)
326314
/* recalc available buffer space */
327315
comp_update_buffer_produce(hd->dma_buffer, local_elem->size);
328-
} else {
316+
else
329317
/* recalc available buffer space */
330318
comp_update_buffer_consume(hd->dma_buffer, local_elem->size);
331319

332-
/* writeback audio data */
333-
dcache_writeback_region(dma_buffer->r_ptr, local_elem->size);
334-
}
335-
336320
dev->position += local_elem->size;
337321

338322
/* new local period, update host buffer position blks */
@@ -565,6 +549,7 @@ static struct comp_dev *host_new(struct sof_ipc_comp *comp)
565549
/* init posn data. TODO: other fields */
566550
hd->posn.comp_id = comp->id;
567551
dev->state = COMP_STATE_READY;
552+
dev->is_dma_connected = 1;
568553
return dev;
569554

570555
error:

src/include/sof/audio/buffer.h

Lines changed: 2 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -80,70 +80,10 @@ struct comp_buffer *buffer_new(struct sof_ipc_buffer *desc);
8080
void buffer_free(struct comp_buffer *buffer);
8181

8282
/* called by a component after producing data into this buffer */
83-
static inline void comp_update_buffer_produce(struct comp_buffer *buffer,
84-
uint32_t bytes)
85-
{
86-
uint32_t flags;
87-
88-
spin_lock_irq(&buffer->lock, flags);
89-
90-
buffer->w_ptr += bytes;
91-
92-
/* check for pointer wrap */
93-
if (buffer->w_ptr >= buffer->end_addr)
94-
buffer->w_ptr = buffer->addr + (buffer->w_ptr - buffer->end_addr);
95-
96-
/* calculate available bytes */
97-
if (buffer->r_ptr < buffer->w_ptr)
98-
buffer->avail = buffer->w_ptr - buffer->r_ptr;
99-
else if (buffer->r_ptr == buffer->w_ptr)
100-
buffer->avail = buffer->size; /* full */
101-
else
102-
buffer->avail = buffer->size - (buffer->r_ptr - buffer->w_ptr);
103-
104-
/* calculate free bytes */
105-
buffer->free = buffer->size - buffer->avail;
106-
107-
spin_unlock_irq(&buffer->lock, flags);
108-
109-
tracev_buffer("pro");
110-
tracev_value((buffer->avail << 16) | buffer->free);
111-
tracev_value((buffer->ipc_buffer.comp.id << 16) | buffer->size);
112-
tracev_value((buffer->r_ptr - buffer->addr) << 16 | (buffer->w_ptr - buffer->addr));
113-
}
83+
void comp_update_buffer_produce(struct comp_buffer *buffer, uint32_t bytes);
11484

11585
/* called by a component after consuming data from this buffer */
116-
static inline void comp_update_buffer_consume(struct comp_buffer *buffer,
117-
uint32_t bytes)
118-
{
119-
uint32_t flags;
120-
121-
spin_lock_irq(&buffer->lock, flags);
122-
123-
buffer->r_ptr += bytes;
124-
125-
/* check for pointer wrap */
126-
if (buffer->r_ptr >= buffer->end_addr)
127-
buffer->r_ptr = buffer->addr + (buffer->r_ptr - buffer->end_addr);
128-
129-
/* calculate available bytes */
130-
if (buffer->r_ptr < buffer->w_ptr)
131-
buffer->avail = buffer->w_ptr - buffer->r_ptr;
132-
else if (buffer->r_ptr == buffer->w_ptr)
133-
buffer->avail = 0; /* empty */
134-
else
135-
buffer->avail = buffer->size - (buffer->r_ptr - buffer->w_ptr);
136-
137-
/* calculate free bytes */
138-
buffer->free = buffer->size - buffer->avail;
139-
140-
spin_unlock_irq(&buffer->lock, flags);
141-
142-
tracev_buffer("con");
143-
tracev_value((buffer->avail << 16) | buffer->free);
144-
tracev_value((buffer->ipc_buffer.comp.id << 16) | buffer->size);
145-
tracev_value((buffer->r_ptr - buffer->addr) << 16 | (buffer->w_ptr - buffer->addr));
146-
}
86+
void comp_update_buffer_consume(struct comp_buffer *buffer, uint32_t bytes);
14787

14888
/* get the max number of bytes that can be copied between sink and source */
14989
static inline int comp_buffer_can_copy_bytes(struct comp_buffer *source,

src/include/sof/audio/component.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -173,12 +173,13 @@ struct comp_driver {
173173
struct comp_dev {
174174

175175
/* runtime */
176-
uint16_t state; /* COMP_STATE_ */
177-
uint16_t is_endpoint; /* component is end point in pipeline */
178-
spinlock_t lock; /* lock for this component */
179-
uint64_t position; /* component rendering position */
180-
uint32_t frames; /* number of frames we copy to sink */
181-
uint32_t frame_bytes; /* frames size copied to sink in bytes */
176+
uint16_t state; /* COMP_STATE_ */
177+
uint16_t is_endpoint; /* component is end point in pipeline */
178+
uint16_t is_dma_connected; /* component is connected to DMA */
179+
spinlock_t lock; /* lock for this component */
180+
uint64_t position; /* component rendering position */
181+
uint32_t frames; /* number of frames we copy to sink */
182+
uint32_t frame_bytes; /* frames size copied to sink in bytes */
182183
struct pipeline *pipeline; /* pipeline we belong to */
183184

184185
/* common runtime configuration for downstream/upstream */

0 commit comments

Comments
 (0)