提交 77a23f26 编写于 作者: T Takashi Iwai 提交者: Jaroslav Kysela

ALSA: Clean up SG-buffer helper functions and macros

Clean up SG-buffer helper functions and macros.  Helpers take substream
as arguments now.
Signed-off-by: NTakashi Iwai <tiwai@suse.de>
Signed-off-by: NJaroslav Kysela <perex@perex.cz>
上级 46480b3a
...@@ -65,6 +65,11 @@ struct snd_dma_buffer { ...@@ -65,6 +65,11 @@ struct snd_dma_buffer {
/* /*
* Scatter-Gather generic device pages * Scatter-Gather generic device pages
*/ */
void *snd_malloc_sgbuf_pages(struct device *device,
size_t size, struct snd_dma_buffer *dmab,
size_t *res_size);
int snd_free_sgbuf_pages(struct snd_dma_buffer *dmab);
struct snd_sg_page { struct snd_sg_page {
void *buf; void *buf;
dma_addr_t addr; dma_addr_t addr;
...@@ -95,6 +100,13 @@ static inline dma_addr_t snd_sgbuf_get_addr(struct snd_sg_buf *sgbuf, size_t off ...@@ -95,6 +100,13 @@ static inline dma_addr_t snd_sgbuf_get_addr(struct snd_sg_buf *sgbuf, size_t off
return sgbuf->table[offset >> PAGE_SHIFT].addr + offset % PAGE_SIZE; return sgbuf->table[offset >> PAGE_SHIFT].addr + offset % PAGE_SIZE;
} }
/*
* return the virtual address at the corresponding offset
*/
static inline void *snd_sgbuf_get_ptr(struct snd_sg_buf *sgbuf, size_t offset)
{
return sgbuf->table[offset >> PAGE_SHIFT].buf + offset % PAGE_SIZE;
}
/* allocate/release a buffer */ /* allocate/release a buffer */
int snd_dma_alloc_pages(int type, struct device *dev, size_t size, int snd_dma_alloc_pages(int type, struct device *dev, size_t size,
......
...@@ -974,10 +974,29 @@ int snd_pcm_lib_preallocate_pages_for_all(struct snd_pcm *pcm, ...@@ -974,10 +974,29 @@ int snd_pcm_lib_preallocate_pages_for_all(struct snd_pcm *pcm,
int snd_pcm_lib_malloc_pages(struct snd_pcm_substream *substream, size_t size); int snd_pcm_lib_malloc_pages(struct snd_pcm_substream *substream, size_t size);
int snd_pcm_lib_free_pages(struct snd_pcm_substream *substream); int snd_pcm_lib_free_pages(struct snd_pcm_substream *substream);
#define snd_pcm_substream_sgbuf(substream) ((substream)->runtime->dma_buffer_p->private_data) /*
#define snd_pcm_sgbuf_pages(size) snd_sgbuf_aligned_pages(size) * SG-buffer handling
#define snd_pcm_sgbuf_get_addr(sgbuf,ofs) snd_sgbuf_get_addr(sgbuf,ofs) */
struct page *snd_pcm_sgbuf_ops_page(struct snd_pcm_substream *substream, unsigned long offset); #define snd_pcm_substream_sgbuf(substream) \
((substream)->runtime->dma_buffer_p->private_data)
static inline dma_addr_t
snd_pcm_sgbuf_get_addr(struct snd_pcm_substream *substream, unsigned int ofs)
{
struct snd_sg_buf *sg = snd_pcm_substream_sgbuf(substream);
return snd_sgbuf_get_addr(sg, ofs);
}
static inline void *
snd_pcm_sgbuf_get_ptr(struct snd_pcm_substream *substream, unsigned int ofs)
{
struct snd_sg_buf *sg = snd_pcm_substream_sgbuf(substream);
return snd_sgbuf_get_ptr(sg, ofs);
}
struct page *snd_pcm_sgbuf_ops_page(struct snd_pcm_substream *substream,
unsigned long offset);
/* handle mmap counter - PCM mmap callback should handle this counter properly */ /* handle mmap counter - PCM mmap callback should handle this counter properly */
static inline void snd_pcm_mmap_data_open(struct vm_area_struct *area) static inline void snd_pcm_mmap_data_open(struct vm_area_struct *area)
......
...@@ -43,14 +43,6 @@ MODULE_DESCRIPTION("Memory allocator for ALSA system."); ...@@ -43,14 +43,6 @@ MODULE_DESCRIPTION("Memory allocator for ALSA system.");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
/*
*/
void *snd_malloc_sgbuf_pages(struct device *device,
size_t size, struct snd_dma_buffer *dmab,
size_t *res_size);
int snd_free_sgbuf_pages(struct snd_dma_buffer *dmab);
/* /*
*/ */
......
...@@ -125,7 +125,6 @@ typedef struct { ...@@ -125,7 +125,6 @@ typedef struct {
/* Virtual page extender stuff */ /* Virtual page extender stuff */
int nr_periods; int nr_periods;
int period_bytes; int period_bytes;
struct snd_sg_buf *sgbuf; /* DMA Scatter Gather struct */
int period_real; int period_real;
int period_virt; int period_virt;
...@@ -195,16 +194,14 @@ static void vortex_adb_setsrc(vortex_t * vortex, int adbdma, ...@@ -195,16 +194,14 @@ static void vortex_adb_setsrc(vortex_t * vortex, int adbdma,
/* DMA Engines. */ /* DMA Engines. */
static void vortex_adbdma_setbuffers(vortex_t * vortex, int adbdma, static void vortex_adbdma_setbuffers(vortex_t * vortex, int adbdma,
struct snd_sg_buf * sgbuf, int size, int size, int count);
int count);
static void vortex_adbdma_setmode(vortex_t * vortex, int adbdma, int ie, static void vortex_adbdma_setmode(vortex_t * vortex, int adbdma, int ie,
int dir, int fmt, int d, int dir, int fmt, int d,
u32 offset); u32 offset);
static void vortex_adbdma_setstartbuffer(vortex_t * vortex, int adbdma, int sb); static void vortex_adbdma_setstartbuffer(vortex_t * vortex, int adbdma, int sb);
#ifndef CHIP_AU8810 #ifndef CHIP_AU8810
static void vortex_wtdma_setbuffers(vortex_t * vortex, int wtdma, static void vortex_wtdma_setbuffers(vortex_t * vortex, int wtdma,
struct snd_sg_buf * sgbuf, int size, int size, int count);
int count);
static void vortex_wtdma_setmode(vortex_t * vortex, int wtdma, int ie, int fmt, int d, /*int e, */ static void vortex_wtdma_setmode(vortex_t * vortex, int wtdma, int ie, int fmt, int d, /*int e, */
u32 offset); u32 offset);
static void vortex_wtdma_setstartbuffer(vortex_t * vortex, int wtdma, int sb); static void vortex_wtdma_setstartbuffer(vortex_t * vortex, int wtdma, int sb);
......
...@@ -1097,19 +1097,12 @@ static void vortex_adbdma_setstartbuffer(vortex_t * vortex, int adbdma, int sb) ...@@ -1097,19 +1097,12 @@ static void vortex_adbdma_setstartbuffer(vortex_t * vortex, int adbdma, int sb)
static void static void
vortex_adbdma_setbuffers(vortex_t * vortex, int adbdma, vortex_adbdma_setbuffers(vortex_t * vortex, int adbdma,
struct snd_sg_buf * sgbuf, int psize, int count) int psize, int count)
{ {
stream_t *dma = &vortex->dma_adb[adbdma]; stream_t *dma = &vortex->dma_adb[adbdma];
if (sgbuf == NULL) {
printk(KERN_INFO "vortex: FATAL: sgbuf is NULL!\n");
return;
}
//printk(KERN_INFO "vortex: page count = %d, tblcount = %d\n", count, sgbuf->tblsize);
dma->period_bytes = psize; dma->period_bytes = psize;
dma->nr_periods = count; dma->nr_periods = count;
dma->sgbuf = sgbuf;
dma->cfg0 = 0; dma->cfg0 = 0;
dma->cfg1 = 0; dma->cfg1 = 0;
...@@ -1120,26 +1113,26 @@ vortex_adbdma_setbuffers(vortex_t * vortex, int adbdma, ...@@ -1120,26 +1113,26 @@ vortex_adbdma_setbuffers(vortex_t * vortex, int adbdma,
dma->cfg1 |= 0x88000000 | 0x44000000 | 0x30000000 | (psize - 1); dma->cfg1 |= 0x88000000 | 0x44000000 | 0x30000000 | (psize - 1);
hwwrite(vortex->mmio, hwwrite(vortex->mmio,
VORTEX_ADBDMA_BUFBASE + (adbdma << 4) + 0xc, VORTEX_ADBDMA_BUFBASE + (adbdma << 4) + 0xc,
snd_sgbuf_get_addr(sgbuf, psize * 3)); snd_pcm_sgbuf_get_addr(dma->substream, psize * 3));
/* 3 pages */ /* 3 pages */
case 3: case 3:
dma->cfg0 |= 0x12000000; dma->cfg0 |= 0x12000000;
dma->cfg1 |= 0x80000000 | 0x40000000 | ((psize - 1) << 0xc); dma->cfg1 |= 0x80000000 | 0x40000000 | ((psize - 1) << 0xc);
hwwrite(vortex->mmio, hwwrite(vortex->mmio,
VORTEX_ADBDMA_BUFBASE + (adbdma << 4) + 0x8, VORTEX_ADBDMA_BUFBASE + (adbdma << 4) + 0x8,
snd_sgbuf_get_addr(sgbuf, psize * 2)); snd_pcm_sgbuf_get_addr(dma->substream, psize * 2));
/* 2 pages */ /* 2 pages */
case 2: case 2:
dma->cfg0 |= 0x88000000 | 0x44000000 | 0x10000000 | (psize - 1); dma->cfg0 |= 0x88000000 | 0x44000000 | 0x10000000 | (psize - 1);
hwwrite(vortex->mmio, hwwrite(vortex->mmio,
VORTEX_ADBDMA_BUFBASE + (adbdma << 4) + 0x4, VORTEX_ADBDMA_BUFBASE + (adbdma << 4) + 0x4,
snd_sgbuf_get_addr(sgbuf, psize)); snd_pcm_sgbuf_get_addr(dma->substream, psize));
/* 1 page */ /* 1 page */
case 1: case 1:
dma->cfg0 |= 0x80000000 | 0x40000000 | ((psize - 1) << 0xc); dma->cfg0 |= 0x80000000 | 0x40000000 | ((psize - 1) << 0xc);
hwwrite(vortex->mmio, hwwrite(vortex->mmio,
VORTEX_ADBDMA_BUFBASE + (adbdma << 4), VORTEX_ADBDMA_BUFBASE + (adbdma << 4),
snd_sgbuf_get_addr(sgbuf, 0)); snd_pcm_sgbuf_get_addr(dma->substream, 0));
break; break;
} }
//printk("vortex: cfg0 = 0x%x\nvortex: cfg1=0x%x\n", dma->cfg0, dma->cfg1); //printk("vortex: cfg0 = 0x%x\nvortex: cfg1=0x%x\n", dma->cfg0, dma->cfg1);
...@@ -1205,7 +1198,7 @@ static int vortex_adbdma_bufshift(vortex_t * vortex, int adbdma) ...@@ -1205,7 +1198,7 @@ static int vortex_adbdma_bufshift(vortex_t * vortex, int adbdma)
//hwwrite(vortex->mmio, VORTEX_ADBDMA_BUFBASE+(((adbdma << 2)+pp) << 2), dma->table[p].addr); //hwwrite(vortex->mmio, VORTEX_ADBDMA_BUFBASE+(((adbdma << 2)+pp) << 2), dma->table[p].addr);
hwwrite(vortex->mmio, hwwrite(vortex->mmio,
VORTEX_ADBDMA_BUFBASE + (((adbdma << 2) + pp) << 2), VORTEX_ADBDMA_BUFBASE + (((adbdma << 2) + pp) << 2),
snd_sgbuf_get_addr(dma->sgbuf, snd_pcm_sgbuf_get_addr(dma->substream,
dma->period_bytes * p)); dma->period_bytes * p));
/* Force write thru cache. */ /* Force write thru cache. */
hwread(vortex->mmio, VORTEX_ADBDMA_BUFBASE + hwread(vortex->mmio, VORTEX_ADBDMA_BUFBASE +
...@@ -1244,7 +1237,10 @@ static void vortex_adbdma_resetup(vortex_t *vortex, int adbdma) { ...@@ -1244,7 +1237,10 @@ static void vortex_adbdma_resetup(vortex_t *vortex, int adbdma) {
if (pp >= 4) if (pp >= 4)
pp -= 4; pp -= 4;
} }
hwwrite(vortex->mmio, VORTEX_ADBDMA_BUFBASE+(((adbdma << 2)+pp) << 2), snd_sgbuf_get_addr(dma->sgbuf, dma->period_bytes * p)); hwwrite(vortex->mmio,
VORTEX_ADBDMA_BUFBASE + (((adbdma << 2) + pp) << 2),
snd_pcm_sgbuf_get_addr(dma->substream,
dma->period_bytes * p));
/* Force write thru cache. */ /* Force write thru cache. */
hwread(vortex->mmio, VORTEX_ADBDMA_BUFBASE + (((adbdma << 2)+pp) << 2)); hwread(vortex->mmio, VORTEX_ADBDMA_BUFBASE + (((adbdma << 2)+pp) << 2));
} }
...@@ -1367,13 +1363,12 @@ static void vortex_wtdma_setstartbuffer(vortex_t * vortex, int wtdma, int sb) ...@@ -1367,13 +1363,12 @@ static void vortex_wtdma_setstartbuffer(vortex_t * vortex, int wtdma, int sb)
static void static void
vortex_wtdma_setbuffers(vortex_t * vortex, int wtdma, vortex_wtdma_setbuffers(vortex_t * vortex, int wtdma,
struct snd_sg_buf * sgbuf, int psize, int count) int psize, int count)
{ {
stream_t *dma = &vortex->dma_wt[wtdma]; stream_t *dma = &vortex->dma_wt[wtdma];
dma->period_bytes = psize; dma->period_bytes = psize;
dma->nr_periods = count; dma->nr_periods = count;
dma->sgbuf = sgbuf;
dma->cfg0 = 0; dma->cfg0 = 0;
dma->cfg1 = 0; dma->cfg1 = 0;
...@@ -1383,23 +1378,23 @@ vortex_wtdma_setbuffers(vortex_t * vortex, int wtdma, ...@@ -1383,23 +1378,23 @@ vortex_wtdma_setbuffers(vortex_t * vortex, int wtdma,
case 4: case 4:
dma->cfg1 |= 0x88000000 | 0x44000000 | 0x30000000 | (psize-1); dma->cfg1 |= 0x88000000 | 0x44000000 | 0x30000000 | (psize-1);
hwwrite(vortex->mmio, VORTEX_WTDMA_BUFBASE + (wtdma << 4) + 0xc, hwwrite(vortex->mmio, VORTEX_WTDMA_BUFBASE + (wtdma << 4) + 0xc,
snd_sgbuf_get_addr(sgbuf, psize * 3)); snd_pcm_sgbuf_get_addr(dma->substream, psize * 3));
/* 3 pages */ /* 3 pages */
case 3: case 3:
dma->cfg0 |= 0x12000000; dma->cfg0 |= 0x12000000;
dma->cfg1 |= 0x80000000 | 0x40000000 | ((psize-1) << 0xc); dma->cfg1 |= 0x80000000 | 0x40000000 | ((psize-1) << 0xc);
hwwrite(vortex->mmio, VORTEX_WTDMA_BUFBASE + (wtdma << 4) + 0x8, hwwrite(vortex->mmio, VORTEX_WTDMA_BUFBASE + (wtdma << 4) + 0x8,
snd_sgbuf_get_addr(sgbuf, psize * 2)); snd_pcm_sgbuf_get_addr(dma->substream, psize * 2));
/* 2 pages */ /* 2 pages */
case 2: case 2:
dma->cfg0 |= 0x88000000 | 0x44000000 | 0x10000000 | (psize-1); dma->cfg0 |= 0x88000000 | 0x44000000 | 0x10000000 | (psize-1);
hwwrite(vortex->mmio, VORTEX_WTDMA_BUFBASE + (wtdma << 4) + 0x4, hwwrite(vortex->mmio, VORTEX_WTDMA_BUFBASE + (wtdma << 4) + 0x4,
snd_sgbuf_get_addr(sgbuf, psize)); snd_pcm_sgbuf_get_addr(dma->substream, psize));
/* 1 page */ /* 1 page */
case 1: case 1:
dma->cfg0 |= 0x80000000 | 0x40000000 | ((psize-1) << 0xc); dma->cfg0 |= 0x80000000 | 0x40000000 | ((psize-1) << 0xc);
hwwrite(vortex->mmio, VORTEX_WTDMA_BUFBASE + (wtdma << 4), hwwrite(vortex->mmio, VORTEX_WTDMA_BUFBASE + (wtdma << 4),
snd_sgbuf_get_addr(sgbuf, 0)); snd_pcm_sgbuf_get_addr(dma->substream, 0));
break; break;
} }
hwwrite(vortex->mmio, VORTEX_WTDMA_BUFCFG0 + (wtdma << 3), dma->cfg0); hwwrite(vortex->mmio, VORTEX_WTDMA_BUFCFG0 + (wtdma << 3), dma->cfg0);
...@@ -1465,7 +1460,8 @@ static int vortex_wtdma_bufshift(vortex_t * vortex, int wtdma) ...@@ -1465,7 +1460,8 @@ static int vortex_wtdma_bufshift(vortex_t * vortex, int wtdma)
hwwrite(vortex->mmio, hwwrite(vortex->mmio,
VORTEX_WTDMA_BUFBASE + VORTEX_WTDMA_BUFBASE +
(((wtdma << 2) + pp) << 2), (((wtdma << 2) + pp) << 2),
snd_sgbuf_get_addr(dma->sgbuf, dma->period_bytes * p)); snd_pcm_sgbuf_get_addr(dma->substream,
dma->period_bytes * p));
/* Force write thru cache. */ /* Force write thru cache. */
hwread(vortex->mmio, VORTEX_WTDMA_BUFBASE + hwread(vortex->mmio, VORTEX_WTDMA_BUFBASE +
(((wtdma << 2) + pp) << 2)); (((wtdma << 2) + pp) << 2));
......
...@@ -189,7 +189,6 @@ snd_vortex_pcm_hw_params(struct snd_pcm_substream *substream, ...@@ -189,7 +189,6 @@ snd_vortex_pcm_hw_params(struct snd_pcm_substream *substream,
{ {
vortex_t *chip = snd_pcm_substream_chip(substream); vortex_t *chip = snd_pcm_substream_chip(substream);
stream_t *stream = (stream_t *) (substream->runtime->private_data); stream_t *stream = (stream_t *) (substream->runtime->private_data);
struct snd_sg_buf *sgbuf;
int err; int err;
// Alloc buffer memory. // Alloc buffer memory.
...@@ -199,8 +198,6 @@ snd_vortex_pcm_hw_params(struct snd_pcm_substream *substream, ...@@ -199,8 +198,6 @@ snd_vortex_pcm_hw_params(struct snd_pcm_substream *substream,
printk(KERN_ERR "Vortex: pcm page alloc failed!\n"); printk(KERN_ERR "Vortex: pcm page alloc failed!\n");
return err; return err;
} }
//sgbuf = (struct snd_sg_buf *) substream->runtime->dma_private;
sgbuf = snd_pcm_substream_sgbuf(substream);
/* /*
printk(KERN_INFO "Vortex: periods %d, period_bytes %d, channels = %d\n", params_periods(hw_params), printk(KERN_INFO "Vortex: periods %d, period_bytes %d, channels = %d\n", params_periods(hw_params),
params_period_bytes(hw_params), params_channels(hw_params)); params_period_bytes(hw_params), params_channels(hw_params));
...@@ -226,7 +223,7 @@ snd_vortex_pcm_hw_params(struct snd_pcm_substream *substream, ...@@ -226,7 +223,7 @@ snd_vortex_pcm_hw_params(struct snd_pcm_substream *substream,
stream = substream->runtime->private_data = &chip->dma_adb[dma]; stream = substream->runtime->private_data = &chip->dma_adb[dma];
stream->substream = substream; stream->substream = substream;
/* Setup Buffers. */ /* Setup Buffers. */
vortex_adbdma_setbuffers(chip, dma, sgbuf, vortex_adbdma_setbuffers(chip, dma,
params_period_bytes(hw_params), params_period_bytes(hw_params),
params_periods(hw_params)); params_periods(hw_params));
} }
...@@ -240,7 +237,7 @@ snd_vortex_pcm_hw_params(struct snd_pcm_substream *substream, ...@@ -240,7 +237,7 @@ snd_vortex_pcm_hw_params(struct snd_pcm_substream *substream,
&chip->dma_wt[substream->number]; &chip->dma_wt[substream->number];
stream->dma = substream->number; stream->dma = substream->number;
stream->substream = substream; stream->substream = substream;
vortex_wtdma_setbuffers(chip, substream->number, sgbuf, vortex_wtdma_setbuffers(chip, substream->number,
params_period_bytes(hw_params), params_period_bytes(hw_params),
params_periods(hw_params)); params_periods(hw_params));
} }
...@@ -392,13 +389,6 @@ static snd_pcm_uframes_t snd_vortex_pcm_pointer(struct snd_pcm_substream *substr ...@@ -392,13 +389,6 @@ static snd_pcm_uframes_t snd_vortex_pcm_pointer(struct snd_pcm_substream *substr
return (bytes_to_frames(substream->runtime, current_ptr)); return (bytes_to_frames(substream->runtime, current_ptr));
} }
/* Page callback. */
/*
static struct page *snd_pcm_sgbuf_ops_page(struct snd_pcm_substream *substream, unsigned long offset) {
}
*/
/* operators */ /* operators */
static struct snd_pcm_ops snd_vortex_playback_ops = { static struct snd_pcm_ops snd_vortex_playback_ops = {
.open = snd_vortex_pcm_open, .open = snd_vortex_pcm_open,
......
...@@ -227,7 +227,6 @@ static inline void snd_bt87x_writel(struct snd_bt87x *chip, u32 reg, u32 value) ...@@ -227,7 +227,6 @@ static inline void snd_bt87x_writel(struct snd_bt87x *chip, u32 reg, u32 value)
static int snd_bt87x_create_risc(struct snd_bt87x *chip, struct snd_pcm_substream *substream, static int snd_bt87x_create_risc(struct snd_bt87x *chip, struct snd_pcm_substream *substream,
unsigned int periods, unsigned int period_bytes) unsigned int periods, unsigned int period_bytes)
{ {
struct snd_sg_buf *sgbuf = snd_pcm_substream_sgbuf(substream);
unsigned int i, offset; unsigned int i, offset;
u32 *risc; u32 *risc;
...@@ -246,6 +245,7 @@ static int snd_bt87x_create_risc(struct snd_bt87x *chip, struct snd_pcm_substrea ...@@ -246,6 +245,7 @@ static int snd_bt87x_create_risc(struct snd_bt87x *chip, struct snd_pcm_substrea
rest = period_bytes; rest = period_bytes;
do { do {
u32 cmd, len; u32 cmd, len;
unsigned int addr;
len = PAGE_SIZE - (offset % PAGE_SIZE); len = PAGE_SIZE - (offset % PAGE_SIZE);
if (len > rest) if (len > rest)
...@@ -260,7 +260,8 @@ static int snd_bt87x_create_risc(struct snd_bt87x *chip, struct snd_pcm_substrea ...@@ -260,7 +260,8 @@ static int snd_bt87x_create_risc(struct snd_bt87x *chip, struct snd_pcm_substrea
if (len == rest) if (len == rest)
cmd |= RISC_EOL | RISC_IRQ; cmd |= RISC_EOL | RISC_IRQ;
*risc++ = cpu_to_le32(cmd); *risc++ = cpu_to_le32(cmd);
*risc++ = cpu_to_le32((u32)snd_pcm_sgbuf_get_addr(sgbuf, offset)); addr = snd_pcm_sgbuf_get_addr(substream, offset);
*risc++ = cpu_to_le32(addr);
offset += len; offset += len;
rest -= len; rest -= len;
} while (rest > 0); } while (rest > 0);
......
...@@ -490,7 +490,6 @@ static int init_engine(struct snd_pcm_substream *substream, ...@@ -490,7 +490,6 @@ static int init_engine(struct snd_pcm_substream *substream,
{ {
struct echoaudio *chip; struct echoaudio *chip;
int err, per, rest, page, edge, offs; int err, per, rest, page, edge, offs;
struct snd_sg_buf *sgbuf;
struct audiopipe *pipe; struct audiopipe *pipe;
chip = snd_pcm_substream_chip(substream); chip = snd_pcm_substream_chip(substream);
...@@ -531,10 +530,6 @@ static int init_engine(struct snd_pcm_substream *substream, ...@@ -531,10 +530,6 @@ static int init_engine(struct snd_pcm_substream *substream,
return err; return err;
} }
sgbuf = snd_pcm_substream_sgbuf(substream);
DE_HWP(("pcm_hw_params table size=%d pages=%d\n",
sgbuf->size, sgbuf->pages));
sglist_init(chip, pipe); sglist_init(chip, pipe);
edge = PAGE_SIZE; edge = PAGE_SIZE;
for (offs = page = per = 0; offs < params_buffer_bytes(hw_params); for (offs = page = per = 0; offs < params_buffer_bytes(hw_params);
...@@ -543,16 +538,15 @@ static int init_engine(struct snd_pcm_substream *substream, ...@@ -543,16 +538,15 @@ static int init_engine(struct snd_pcm_substream *substream,
if (offs + rest > params_buffer_bytes(hw_params)) if (offs + rest > params_buffer_bytes(hw_params))
rest = params_buffer_bytes(hw_params) - offs; rest = params_buffer_bytes(hw_params) - offs;
while (rest) { while (rest) {
dma_addr_t addr;
addr = snd_pcm_sgbuf_get_addr(substream, offs);
if (rest <= edge - offs) { if (rest <= edge - offs) {
sglist_add_mapping(chip, pipe, sglist_add_mapping(chip, pipe, addr, rest);
snd_sgbuf_get_addr(sgbuf, offs),
rest);
sglist_add_irq(chip, pipe); sglist_add_irq(chip, pipe);
offs += rest; offs += rest;
rest = 0; rest = 0;
} else { } else {
sglist_add_mapping(chip, pipe, sglist_add_mapping(chip, pipe, addr,
snd_sgbuf_get_addr(sgbuf, offs),
edge - offs); edge - offs);
rest -= edge - offs; rest -= edge - offs;
offs = edge; offs = edge;
......
...@@ -296,7 +296,6 @@ struct snd_util_memblk * ...@@ -296,7 +296,6 @@ struct snd_util_memblk *
snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *substream) snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *substream)
{ {
struct snd_pcm_runtime *runtime = substream->runtime; struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_sg_buf *sgbuf = snd_pcm_substream_sgbuf(substream);
struct snd_util_memhdr *hdr; struct snd_util_memhdr *hdr;
struct snd_emu10k1_memblk *blk; struct snd_emu10k1_memblk *blk;
int page, err, idx; int page, err, idx;
...@@ -321,16 +320,9 @@ snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *subst ...@@ -321,16 +320,9 @@ snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *subst
*/ */
idx = 0; idx = 0;
for (page = blk->first_page; page <= blk->last_page; page++, idx++) { for (page = blk->first_page; page <= blk->last_page; page++, idx++) {
unsigned long ofs = idx << PAGE_SHIFT;
dma_addr_t addr; dma_addr_t addr;
#ifdef CONFIG_SND_DEBUG addr = snd_pcm_sgbuf_get_addr(substream, ofs);
if (idx >= sgbuf->pages) {
printk(KERN_ERR "emu: pages overflow! (%d-%d) for %d\n",
blk->first_page, blk->last_page, sgbuf->pages);
mutex_unlock(&hdr->block_mutex);
return NULL;
}
#endif
addr = sgbuf->table[idx].addr;
if (! is_valid_page(emu, addr)) { if (! is_valid_page(emu, addr)) {
printk(KERN_ERR "emu: failure page = %d\n", idx); printk(KERN_ERR "emu: failure page = %d\n", idx);
mutex_unlock(&hdr->block_mutex); mutex_unlock(&hdr->block_mutex);
......
...@@ -998,7 +998,6 @@ static int setup_bdle(struct snd_pcm_substream *substream, ...@@ -998,7 +998,6 @@ static int setup_bdle(struct snd_pcm_substream *substream,
struct azx_dev *azx_dev, u32 **bdlp, struct azx_dev *azx_dev, u32 **bdlp,
int ofs, int size, int with_ioc) int ofs, int size, int with_ioc)
{ {
struct snd_sg_buf *sgbuf = snd_pcm_substream_sgbuf(substream);
u32 *bdl = *bdlp; u32 *bdl = *bdlp;
while (size > 0) { while (size > 0) {
...@@ -1008,7 +1007,7 @@ static int setup_bdle(struct snd_pcm_substream *substream, ...@@ -1008,7 +1007,7 @@ static int setup_bdle(struct snd_pcm_substream *substream,
if (azx_dev->frags >= AZX_MAX_BDL_ENTRIES) if (azx_dev->frags >= AZX_MAX_BDL_ENTRIES)
return -EINVAL; return -EINVAL;
addr = snd_pcm_sgbuf_get_addr(sgbuf, ofs); addr = snd_pcm_sgbuf_get_addr(substream, ofs);
/* program the address field of the BDL entry */ /* program the address field of the BDL entry */
bdl[0] = cpu_to_le32((u32)addr); bdl[0] = cpu_to_le32((u32)addr);
bdl[1] = cpu_to_le32(upper_32_bits(addr)); bdl[1] = cpu_to_le32(upper_32_bits(addr));
......
...@@ -1483,7 +1483,6 @@ static int snd_riptide_prepare(struct snd_pcm_substream *substream) ...@@ -1483,7 +1483,6 @@ static int snd_riptide_prepare(struct snd_pcm_substream *substream)
{ {
struct snd_riptide *chip = snd_pcm_substream_chip(substream); struct snd_riptide *chip = snd_pcm_substream_chip(substream);
struct snd_pcm_runtime *runtime = substream->runtime; struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_sg_buf *sgbuf = snd_pcm_substream_sgbuf(substream);
struct pcmhw *data = get_pcmhwdev(substream); struct pcmhw *data = get_pcmhwdev(substream);
struct cmdif *cif = chip->cif; struct cmdif *cif = chip->cif;
unsigned char *lbuspath = NULL; unsigned char *lbuspath = NULL;
...@@ -1515,9 +1514,9 @@ static int snd_riptide_prepare(struct snd_pcm_substream *substream) ...@@ -1515,9 +1514,9 @@ static int snd_riptide_prepare(struct snd_pcm_substream *substream)
lbuspath = data->paths.stereo; lbuspath = data->paths.stereo;
break; break;
} }
snd_printdd("use sgdlist at 0x%p and buffer at 0x%p\n", snd_printdd("use sgdlist at 0x%p\n",
data->sgdlist.area, sgbuf); data->sgdlist.area);
if (data->sgdlist.area && sgbuf) { if (data->sgdlist.area) {
unsigned int i, j, size, pages, f, pt, period; unsigned int i, j, size, pages, f, pt, period;
struct sgd *c, *p = NULL; struct sgd *c, *p = NULL;
...@@ -1535,6 +1534,7 @@ static int snd_riptide_prepare(struct snd_pcm_substream *substream) ...@@ -1535,6 +1534,7 @@ static int snd_riptide_prepare(struct snd_pcm_substream *substream)
pt = 0; pt = 0;
j = 0; j = 0;
for (i = 0; i < pages; i++) { for (i = 0; i < pages; i++) {
unsigned int ofs, addr;
c = &data->sgdbuf[i]; c = &data->sgdbuf[i];
if (p) if (p)
p->dwNextLink = cpu_to_le32(data->sgdlist.addr + p->dwNextLink = cpu_to_le32(data->sgdlist.addr +
...@@ -1542,8 +1542,9 @@ static int snd_riptide_prepare(struct snd_pcm_substream *substream) ...@@ -1542,8 +1542,9 @@ static int snd_riptide_prepare(struct snd_pcm_substream *substream)
sizeof(struct sizeof(struct
sgd))); sgd)));
c->dwNextLink = cpu_to_le32(data->sgdlist.addr); c->dwNextLink = cpu_to_le32(data->sgdlist.addr);
c->dwSegPtrPhys = ofs = j << PAGE_SHIFT;
cpu_to_le32(sgbuf->table[j].addr + pt); addr = snd_pcm_sgbuf_get_addr(substream, ofs) + pt;
c->dwSegPtrPhys = cpu_to_le32(addr);
pt = (pt + f) % PAGE_SIZE; pt = (pt + f) % PAGE_SIZE;
if (pt == 0) if (pt == 0)
j++; j++;
......
...@@ -535,7 +535,8 @@ static inline void snd_hdspm_initialize_midi_flush(struct hdspm * hdspm); ...@@ -535,7 +535,8 @@ static inline void snd_hdspm_initialize_midi_flush(struct hdspm * hdspm);
static int hdspm_update_simple_mixer_controls(struct hdspm * hdspm); static int hdspm_update_simple_mixer_controls(struct hdspm * hdspm);
static int hdspm_autosync_ref(struct hdspm * hdspm); static int hdspm_autosync_ref(struct hdspm * hdspm);
static int snd_hdspm_set_defaults(struct hdspm * hdspm); static int snd_hdspm_set_defaults(struct hdspm * hdspm);
static void hdspm_set_sgbuf(struct hdspm * hdspm, struct snd_sg_buf *sgbuf, static void hdspm_set_sgbuf(struct hdspm * hdspm,
struct snd_pcm_substream *substream,
unsigned int reg, int channels); unsigned int reg, int channels);
static inline int HDSPM_bit2freq(int n) static inline int HDSPM_bit2freq(int n)
...@@ -3604,8 +3605,6 @@ static int snd_hdspm_hw_params(struct snd_pcm_substream *substream, ...@@ -3604,8 +3605,6 @@ static int snd_hdspm_hw_params(struct snd_pcm_substream *substream,
int i; int i;
pid_t this_pid; pid_t this_pid;
pid_t other_pid; pid_t other_pid;
struct snd_sg_buf *sgbuf;
spin_lock_irq(&hdspm->lock); spin_lock_irq(&hdspm->lock);
...@@ -3673,11 +3672,9 @@ static int snd_hdspm_hw_params(struct snd_pcm_substream *substream, ...@@ -3673,11 +3672,9 @@ static int snd_hdspm_hw_params(struct snd_pcm_substream *substream,
if (err < 0) if (err < 0)
return err; return err;
sgbuf = snd_pcm_substream_sgbuf(substream);
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
hdspm_set_sgbuf(hdspm, sgbuf, HDSPM_pageAddressBufferOut, hdspm_set_sgbuf(hdspm, substream, HDSPM_pageAddressBufferOut,
params_channels(params)); params_channels(params));
for (i = 0; i < params_channels(params); ++i) for (i = 0; i < params_channels(params); ++i)
...@@ -3688,7 +3685,7 @@ static int snd_hdspm_hw_params(struct snd_pcm_substream *substream, ...@@ -3688,7 +3685,7 @@ static int snd_hdspm_hw_params(struct snd_pcm_substream *substream,
snd_printdd("Allocated sample buffer for playback at %p\n", snd_printdd("Allocated sample buffer for playback at %p\n",
hdspm->playback_buffer); hdspm->playback_buffer);
} else { } else {
hdspm_set_sgbuf(hdspm, sgbuf, HDSPM_pageAddressBufferIn, hdspm_set_sgbuf(hdspm, substream, HDSPM_pageAddressBufferIn,
params_channels(params)); params_channels(params));
for (i = 0; i < params_channels(params); ++i) for (i = 0; i < params_channels(params); ++i)
...@@ -3703,7 +3700,7 @@ static int snd_hdspm_hw_params(struct snd_pcm_substream *substream, ...@@ -3703,7 +3700,7 @@ static int snd_hdspm_hw_params(struct snd_pcm_substream *substream,
snd_printdd("Allocated sample buffer for %s at 0x%08X\n", snd_printdd("Allocated sample buffer for %s at 0x%08X\n",
substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
"playback" : "capture", "playback" : "capture",
snd_pcm_sgbuf_get_addr(sgbuf, 0)); snd_pcm_sgbuf_get_addr(substream, 0));
*/ */
/* /*
snd_printdd("set_hwparams: %s %d Hz, %d channels, bs = %d\n", snd_printdd("set_hwparams: %s %d Hz, %d channels, bs = %d\n",
...@@ -4253,13 +4250,14 @@ static int __devinit snd_hdspm_preallocate_memory(struct hdspm * hdspm) ...@@ -4253,13 +4250,14 @@ static int __devinit snd_hdspm_preallocate_memory(struct hdspm * hdspm)
return 0; return 0;
} }
static void hdspm_set_sgbuf(struct hdspm * hdspm, struct snd_sg_buf *sgbuf, static void hdspm_set_sgbuf(struct hdspm * hdspm,
struct snd_pcm_substream *substream,
unsigned int reg, int channels) unsigned int reg, int channels)
{ {
int i; int i;
for (i = 0; i < (channels * 16); i++) for (i = 0; i < (channels * 16); i++)
hdspm_write(hdspm, reg + 4 * i, hdspm_write(hdspm, reg + 4 * i,
snd_pcm_sgbuf_get_addr(sgbuf, (size_t) 4096 * i)); snd_pcm_sgbuf_get_addr(substream, 4096 * i));
} }
/* ------------- ALSA Devices ---------------------------- */ /* ------------- ALSA Devices ---------------------------- */
......
...@@ -194,7 +194,6 @@ snd_trident_alloc_sg_pages(struct snd_trident *trident, ...@@ -194,7 +194,6 @@ snd_trident_alloc_sg_pages(struct snd_trident *trident,
struct snd_util_memblk *blk; struct snd_util_memblk *blk;
struct snd_pcm_runtime *runtime = substream->runtime; struct snd_pcm_runtime *runtime = substream->runtime;
int idx, page; int idx, page;
struct snd_sg_buf *sgbuf = snd_pcm_substream_sgbuf(substream);
if (snd_BUG_ON(runtime->dma_bytes <= 0 || if (snd_BUG_ON(runtime->dma_bytes <= 0 ||
runtime->dma_bytes > SNDRV_TRIDENT_MAX_PAGES * runtime->dma_bytes > SNDRV_TRIDENT_MAX_PAGES *
...@@ -212,18 +211,14 @@ snd_trident_alloc_sg_pages(struct snd_trident *trident, ...@@ -212,18 +211,14 @@ snd_trident_alloc_sg_pages(struct snd_trident *trident,
mutex_unlock(&hdr->block_mutex); mutex_unlock(&hdr->block_mutex);
return NULL; return NULL;
} }
if (lastpg(blk) - firstpg(blk) >= sgbuf->pages) {
snd_printk(KERN_ERR "page calculation doesn't match: allocated pages = %d, trident = %d/%d\n", sgbuf->pages, firstpg(blk), lastpg(blk));
__snd_util_mem_free(hdr, blk);
mutex_unlock(&hdr->block_mutex);
return NULL;
}
/* set TLB entries */ /* set TLB entries */
idx = 0; idx = 0;
for (page = firstpg(blk); page <= lastpg(blk); page++, idx++) { for (page = firstpg(blk); page <= lastpg(blk); page++, idx++) {
dma_addr_t addr = sgbuf->table[idx].addr; unsigned long ofs = idx << PAGE_SHIFT;
unsigned long ptr = (unsigned long)sgbuf->table[idx].buf; dma_addr_t addr = snd_pcm_sgbuf_get_addr(substream, ofs);
unsigned long ptr = (unsigned long)
snd_pcm_sgbuf_get_ptr(substream, ofs);
if (! is_valid_page(addr)) { if (! is_valid_page(addr)) {
__snd_util_mem_free(hdr, blk); __snd_util_mem_free(hdr, blk);
mutex_unlock(&hdr->block_mutex); mutex_unlock(&hdr->block_mutex);
......
...@@ -420,7 +420,6 @@ static int build_via_table(struct viadev *dev, struct snd_pcm_substream *substre ...@@ -420,7 +420,6 @@ static int build_via_table(struct viadev *dev, struct snd_pcm_substream *substre
{ {
unsigned int i, idx, ofs, rest; unsigned int i, idx, ofs, rest;
struct via82xx *chip = snd_pcm_substream_chip(substream); struct via82xx *chip = snd_pcm_substream_chip(substream);
struct snd_sg_buf *sgbuf = snd_pcm_substream_sgbuf(substream);
if (dev->table.area == NULL) { if (dev->table.area == NULL) {
/* the start of each lists must be aligned to 8 bytes, /* the start of each lists must be aligned to 8 bytes,
...@@ -449,12 +448,14 @@ static int build_via_table(struct viadev *dev, struct snd_pcm_substream *substre ...@@ -449,12 +448,14 @@ static int build_via_table(struct viadev *dev, struct snd_pcm_substream *substre
do { do {
unsigned int r; unsigned int r;
unsigned int flag; unsigned int flag;
unsigned int addr;
if (idx >= VIA_TABLE_SIZE) { if (idx >= VIA_TABLE_SIZE) {
snd_printk(KERN_ERR "via82xx: too much table size!\n"); snd_printk(KERN_ERR "via82xx: too much table size!\n");
return -EINVAL; return -EINVAL;
} }
((u32 *)dev->table.area)[idx << 1] = cpu_to_le32((u32)snd_pcm_sgbuf_get_addr(sgbuf, ofs)); addr = snd_pcm_sgbuf_get_addr(substream, ofs);
((u32 *)dev->table.area)[idx << 1] = cpu_to_le32(addr);
r = PAGE_SIZE - (ofs % PAGE_SIZE); r = PAGE_SIZE - (ofs % PAGE_SIZE);
if (rest < r) if (rest < r)
r = rest; r = rest;
......
...@@ -281,7 +281,6 @@ static int build_via_table(struct viadev *dev, struct snd_pcm_substream *substre ...@@ -281,7 +281,6 @@ static int build_via_table(struct viadev *dev, struct snd_pcm_substream *substre
{ {
unsigned int i, idx, ofs, rest; unsigned int i, idx, ofs, rest;
struct via82xx_modem *chip = snd_pcm_substream_chip(substream); struct via82xx_modem *chip = snd_pcm_substream_chip(substream);
struct snd_sg_buf *sgbuf = snd_pcm_substream_sgbuf(substream);
if (dev->table.area == NULL) { if (dev->table.area == NULL) {
/* the start of each lists must be aligned to 8 bytes, /* the start of each lists must be aligned to 8 bytes,
...@@ -310,12 +309,14 @@ static int build_via_table(struct viadev *dev, struct snd_pcm_substream *substre ...@@ -310,12 +309,14 @@ static int build_via_table(struct viadev *dev, struct snd_pcm_substream *substre
do { do {
unsigned int r; unsigned int r;
unsigned int flag; unsigned int flag;
unsigned int addr;
if (idx >= VIA_TABLE_SIZE) { if (idx >= VIA_TABLE_SIZE) {
snd_printk(KERN_ERR "via82xx: too much table size!\n"); snd_printk(KERN_ERR "via82xx: too much table size!\n");
return -EINVAL; return -EINVAL;
} }
((u32 *)dev->table.area)[idx << 1] = cpu_to_le32((u32)snd_pcm_sgbuf_get_addr(sgbuf, ofs)); addr = snd_pcm_sgbuf_get_addr(substream, ofs);
((u32 *)dev->table.area)[idx << 1] = cpu_to_le32(addr);
r = PAGE_SIZE - (ofs % PAGE_SIZE); r = PAGE_SIZE - (ofs % PAGE_SIZE);
if (rest < r) if (rest < r)
r = rest; r = rest;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册