ALSA: memalloc: Make SG-buffer helper usable for continuous buffer, too
We have a few helper functions for making the access to the buffer address easier on SG-buffer. Those are specific to the buffer that is allocated with SG-buffer type, and it makes hard to use both SG and non-SG buffers in the same code. This patch adds a few simple checks and lets the helpers to deal with both SG- and continuous buffers gracefully. It's a preliminary step for the upcoming patch that mimics the buffer type on the fly. Link: https://lore.kernel.org/r/20200615160045.2703-4-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
28e60dbb83
commit
2a1f3368bf
@ -94,7 +94,11 @@ static inline dma_addr_t snd_sgbuf_get_addr(struct snd_dma_buffer *dmab,
|
|||||||
size_t offset)
|
size_t offset)
|
||||||
{
|
{
|
||||||
struct snd_sg_buf *sgbuf = dmab->private_data;
|
struct snd_sg_buf *sgbuf = dmab->private_data;
|
||||||
dma_addr_t addr = sgbuf->table[offset >> PAGE_SHIFT].addr;
|
dma_addr_t addr;
|
||||||
|
|
||||||
|
if (!sgbuf)
|
||||||
|
return dmab->addr + offset;
|
||||||
|
addr = sgbuf->table[offset >> PAGE_SHIFT].addr;
|
||||||
addr &= ~((dma_addr_t)PAGE_SIZE - 1);
|
addr &= ~((dma_addr_t)PAGE_SIZE - 1);
|
||||||
return addr + offset % PAGE_SIZE;
|
return addr + offset % PAGE_SIZE;
|
||||||
}
|
}
|
||||||
@ -106,6 +110,9 @@ static inline void *snd_sgbuf_get_ptr(struct snd_dma_buffer *dmab,
|
|||||||
size_t offset)
|
size_t offset)
|
||||||
{
|
{
|
||||||
struct snd_sg_buf *sgbuf = dmab->private_data;
|
struct snd_sg_buf *sgbuf = dmab->private_data;
|
||||||
|
|
||||||
|
if (!sgbuf)
|
||||||
|
return dmab->area + offset;
|
||||||
return sgbuf->table[offset >> PAGE_SHIFT].buf + offset % PAGE_SIZE;
|
return sgbuf->table[offset >> PAGE_SHIFT].buf + offset % PAGE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,6 +142,9 @@ unsigned int snd_sgbuf_get_chunk_size(struct snd_dma_buffer *dmab,
|
|||||||
struct snd_sg_buf *sg = dmab->private_data;
|
struct snd_sg_buf *sg = dmab->private_data;
|
||||||
unsigned int start, end, pg;
|
unsigned int start, end, pg;
|
||||||
|
|
||||||
|
if (!sg)
|
||||||
|
return size;
|
||||||
|
|
||||||
start = ofs >> PAGE_SHIFT;
|
start = ofs >> PAGE_SHIFT;
|
||||||
end = (ofs + size - 1) >> PAGE_SHIFT;
|
end = (ofs + size - 1) >> PAGE_SHIFT;
|
||||||
/* check page continuity */
|
/* check page continuity */
|
||||||
|
Loading…
Reference in New Issue
Block a user