From mboxrd@z Thu Jan 1 00:00:00 1970 From: Takashi Iwai Subject: buffer pre-allocation for rme9652 and hdsp Date: Wed, 18 Jun 2003 15:52:02 +0200 Sender: alsa-devel-admin@lists.sourceforge.net Message-ID: Mime-Version: 1.0 (generated by SEMI 1.14.4 - "Hosorogi") Content-Type: multipart/mixed; boundary="Multipart_Wed_Jun_18_15:52:02_2003-1" Return-path: Errors-To: alsa-devel-admin@lists.sourceforge.net List-Help: List-Post: List-Subscribe: , List-Unsubscribe: , List-Archive: To: alsa-devel@lists.sourceforge.net List-Id: alsa-devel@alsa-project.org --Multipart_Wed_Jun_18_15:52:02_2003-1 Content-Type: text/plain; charset=US-ASCII Hi, can hdsp and rme9652 users try the attached patch (to the very latest cvs tree)? with this patch, hdsp and rme9652 drivers communicate with the common snd-page-alloc module for the buffer allocation, since the latest snd-page-alloc module works on behalf of snd-hammerfall-mem module. in other words, you can load snd-page-alloc module instead of snd-hammerfall-mem module somewere in the init script. after applying this and updating the cvs tree, compiling and installaing it, please check the proc file /proc/drivers/snd-page-alloc. this will show you the list of allocated buffers and their usages. if the patch works, i'll commit it to cvs, too. thanks, Takashi --Multipart_Wed_Jun_18_15:52:02_2003-1 Content-Type: application/octet-stream Content-Disposition: attachment; filename="rme-buffer-fix.dif" Content-Transfer-Encoding: 7bit Index: alsa-kernel/pci/rme9652/Makefile =================================================================== RCS file: /suse/tiwai/cvs/alsa/alsa-kernel/pci/rme9652/Makefile,v retrieving revision 1.7 diff -u -r1.7 Makefile --- alsa-kernel/pci/rme9652/Makefile 10 Feb 2003 09:02:18 -0000 1.7 +++ alsa-kernel/pci/rme9652/Makefile 18 Jun 2003 13:41:32 -0000 @@ -3,10 +3,9 @@ # Copyright (c) 2001 by Jaroslav Kysela # -snd-hammerfall-mem-objs := hammerfall_mem.o snd-rme9652-objs := rme9652.o snd-hdsp-objs := hdsp.o # Toplevel Module Dependency -obj-$(CONFIG_SND_RME9652) += snd-rme9652.o snd-hammerfall-mem.o -obj-$(CONFIG_SND_HDSP) += snd-hdsp.o snd-hammerfall-mem.o +obj-$(CONFIG_SND_RME9652) += snd-rme9652.o +obj-$(CONFIG_SND_HDSP) += snd-hdsp.o Index: alsa-kernel/pci/rme9652/hdsp.c =================================================================== RCS file: /suse/tiwai/cvs/alsa/alsa-kernel/pci/rme9652/hdsp.c,v retrieving revision 1.34 diff -u -r1.34 hdsp.c --- alsa-kernel/pci/rme9652/hdsp.c 18 Jun 2003 10:34:11 -0000 1.34 +++ alsa-kernel/pci/rme9652/hdsp.c 18 Jun 2003 13:41:58 -0000 @@ -437,8 +437,39 @@ #define HDSP_PREALLOCATE_MEMORY /* via module snd-hdsp_mem */ #ifdef HDSP_PREALLOCATE_MEMORY -extern void *snd_hammerfall_get_buffer(struct pci_dev *, dma_addr_t *dmaaddr); -extern void snd_hammerfall_free_buffer(struct pci_dev *, void *ptr); +static void *snd_hammerfall_get_buffer(struct pci_dev *pci, size_t size, dma_addr_t *addrp, int capture) +{ + struct snd_dma_device pdev; + struct snd_dma_buffer dmbuf; + + snd_dma_device_pci(&pdev, pci, capture); + dmbuf.bytes = 0; + if (! snd_dma_get_reserved(&pdev, &dmbuf)) { + if (snd_dma_alloc_pages(&pdev, size, &dmbuf) < 0) + return NULL; + snd_dma_set_reserved(&pdev, &dmbuf); + } + *addrp = dmbuf.addr; + return dmbuf.area; +} + +static void snd_hammerfall_free_buffer(struct pci_dev *pci, size_t size, void *ptr, dma_addr_t addr, int capture) +{ + struct snd_dma_device dev; + snd_dma_device_pci(&dev, pci, capture); + snd_dma_free_reserved(&dev); +} + +#else +static void *snd_hammerfall_get_buffer(struct pci_dev *pci, size_t size, dma_addr_t *addrp, int capture) +{ + return snd_malloc_pci_pages(pci, size, addrp); +} + +static void snd_hammerfall_free_buffer(struct pci_dev *pci, size_t size, void *ptr, dma_addr_t addr, int capture) +{ + snd_free_pci_pages(pci, size, ptr, addr); +} #endif static struct pci_device_id snd_hdsp_ids[] __devinitdata = { @@ -2969,25 +3000,15 @@ static void snd_hdsp_free_buffers(hdsp_t *hdsp) { if (hdsp->capture_buffer_unaligned) { -#ifndef HDSP_PREALLOCATE_MEMORY - snd_free_pci_pages(hdsp->pci, - HDSP_DMA_AREA_BYTES, - hdsp->capture_buffer_unaligned, - hdsp->capture_buffer_addr); -#else - snd_hammerfall_free_buffer(hdsp->pci, hdsp->capture_buffer_unaligned); -#endif + snd_hammerfall_free_buffer(hdsp->pci, HDSP_DMA_AREA_BYTES, + hdsp->capture_buffer_unaligned, + hdsp->capture_buffer_addr, 1); } if (hdsp->playback_buffer_unaligned) { -#ifndef HDSP_PREALLOCATE_MEMORY - snd_free_pci_pages(hdsp->pci, - HDSP_DMA_AREA_BYTES, - hdsp->playback_buffer_unaligned, - hdsp->playback_buffer_addr); -#else - snd_hammerfall_free_buffer(hdsp->pci, hdsp->playback_buffer_unaligned); -#endif + snd_hammerfall_free_buffer(hdsp->pci, HDSP_DMA_AREA_BYTES, + hdsp->playback_buffer_unaligned, + hdsp->playback_buffer_addr, 0); } } @@ -2997,28 +3018,15 @@ dma_addr_t pb_addr, cb_addr; unsigned long pb_bus, cb_bus; -#ifndef HDSP_PREALLOCATE_MEMORY - cb = snd_malloc_pci_pages(hdsp->pci, HDSP_DMA_AREA_BYTES, &cb_addr); - pb = snd_malloc_pci_pages(hdsp->pci, HDSP_DMA_AREA_BYTES, &pb_addr); -#else - cb = snd_hammerfall_get_buffer(hdsp->pci, &cb_addr); - pb = snd_hammerfall_get_buffer(hdsp->pci, &pb_addr); -#endif + cb = snd_hammerfall_get_buffer(hdsp->pci, HDSP_DMA_AREA_BYTES, &cb_addr, 1); + pb = snd_hammerfall_get_buffer(hdsp->pci, HDSP_DMA_AREA_BYTES, &pb_addr, 0); if (cb == 0 || pb == 0) { if (cb) { -#ifdef HDSP_PREALLOCATE_MEMORY - snd_hammerfall_free_buffer(hdsp->pci, cb); -#else - snd_free_pci_pages(hdsp->pci, HDSP_DMA_AREA_BYTES, cb, cb_addr); -#endif + snd_hammerfall_free_buffer(hdsp->pci, HDSP_DMA_AREA_BYTES, cb, cb_addr, 1); } if (pb) { -#ifdef HDSP_PREALLOCATE_MEMORY - snd_hammerfall_free_buffer(hdsp->pci, pb); -#else - snd_free_pci_pages(hdsp->pci, HDSP_DMA_AREA_BYTES, pb, pb_addr); -#endif + snd_hammerfall_free_buffer(hdsp->pci, HDSP_DMA_AREA_BYTES, pb, pb_addr, 0); } printk(KERN_ERR "%s: no buffers available\n", hdsp->card_name); Index: alsa-kernel/pci/rme9652/rme9652.c =================================================================== RCS file: /suse/tiwai/cvs/alsa/alsa-kernel/pci/rme9652/rme9652.c,v retrieving revision 1.32 diff -u -r1.32 rme9652.c --- alsa-kernel/pci/rme9652/rme9652.c 5 May 2003 10:09:10 -0000 1.32 +++ alsa-kernel/pci/rme9652/rme9652.c 18 Jun 2003 13:41:41 -0000 @@ -309,10 +309,42 @@ #define RME9652_PREALLOCATE_MEMORY /* via module snd-hammerfall-mem */ #ifdef RME9652_PREALLOCATE_MEMORY -extern void *snd_hammerfall_get_buffer(struct pci_dev *, dma_addr_t *dmaaddr); -extern void snd_hammerfall_free_buffer(struct pci_dev *, void *ptr); +static void *snd_hammerfall_get_buffer(struct pci_dev *pci, size_t size, dma_addr_t *addrp, int capture) +{ + struct snd_dma_device pdev; + struct snd_dma_buffer dmbuf; + + snd_dma_device_pci(&pdev, pci, capture); + dmbuf.bytes = 0; + if (! snd_dma_get_reserved(&pdev, &dmbuf)) { + if (snd_dma_alloc_pages(&pdev, size, &dmbuf) < 0) + return NULL; + snd_dma_set_reserved(&pdev, &dmbuf); + } + *addrp = dmbuf.addr; + return dmbuf.area; +} + +static void snd_hammerfall_free_buffer(struct pci_dev *pci, size_t size, void *ptr, dma_addr_t addr, int capture) +{ + struct snd_dma_device dev; + snd_dma_device_pci(&dev, pci, capture); + snd_dma_free_reserved(&dev); +} + +#else +static void *snd_hammerfall_get_buffer(struct pci_dev *pci, size_t size, dma_addr_t *addrp, int capture) +{ + return snd_malloc_pci_pages(pci, size, addrp); +} + +static void snd_hammerfall_free_buffer(struct pci_dev *pci, size_t size, void *ptr, dma_addr_t addr, int capture) +{ + snd_free_pci_pages(pci, size, ptr, addr); +} #endif + static struct pci_device_id snd_rme9652_ids[] __devinitdata = { { .vendor = 0x10ee, @@ -1810,25 +1842,15 @@ static void snd_rme9652_free_buffers(rme9652_t *rme9652) { if (rme9652->capture_buffer_unaligned) { -#ifndef RME9652_PREALLOCATE_MEMORY - snd_free_pci_pages(rme9652->pci, - RME9652_DMA_AREA_BYTES, - rme9652->capture_buffer_unaligned, - rme9652->capture_buffer_addr); -#else - snd_hammerfall_free_buffer(rme9652->pci, rme9652->capture_buffer_unaligned); -#endif + snd_hammerfall_free_buffer(rme9652->pci, RME9652_DMA_AREA_BYTES, + rme9652->capture_buffer_unaligned, + rme9652->capture_buffer_addr, 1); } if (rme9652->playback_buffer_unaligned) { -#ifndef RME9652_PREALLOCATE_MEMORY - snd_free_pci_pages(rme9652->pci, - RME9652_DMA_AREA_BYTES, - rme9652->playback_buffer_unaligned, - rme9652->playback_buffer_addr); -#else - snd_hammerfall_free_buffer(rme9652->pci, rme9652->playback_buffer_unaligned); -#endif + snd_hammerfall_free_buffer(rme9652->pci, RME9652_DMA_AREA_BYTES, + rme9652->playback_buffer_unaligned, + rme9652->playback_buffer_addr, 0); } } @@ -1855,28 +1877,15 @@ dma_addr_t pb_addr, cb_addr; unsigned long pb_bus, cb_bus; -#ifndef RME9652_PREALLOCATE_MEMORY - cb = snd_malloc_pci_pages(rme9652->pci, RME9652_DMA_AREA_BYTES, &cb_addr); - pb = snd_malloc_pci_pages(rme9652->pci, RME9652_DMA_AREA_BYTES, &pb_addr); -#else - cb = snd_hammerfall_get_buffer(rme9652->pci, &cb_addr); - pb = snd_hammerfall_get_buffer(rme9652->pci, &pb_addr); -#endif + cb = snd_hammerfall_get_buffer(rme9652->pci, RME9652_DMA_AREA_BYTES, &cb_addr, 1); + pb = snd_hammerfall_get_buffer(rme9652->pci, RME9652_DMA_AREA_BYTES, &pb_addr, 0); if (cb == 0 || pb == 0) { if (cb) { -#ifdef RME9652_PREALLOCATE_MEMORY - snd_hammerfall_free_buffer(rme9652->pci, cb); -#else - snd_free_pci_pages(rme9652->pci, RME9652_DMA_AREA_BYTES, cb, cb_addr); -#endif + snd_hammerfall_free_buffer(rme9652->pci, RME9652_DMA_AREA_BYTES, cb, cb_addr, 1); } if (pb) { -#ifdef RME9652_PREALLOCATE_MEMORY - snd_hammerfall_free_buffer(rme9652->pci, pb); -#else - snd_free_pci_pages(rme9652->pci, RME9652_DMA_AREA_BYTES, pb, pb_addr); -#endif + snd_hammerfall_free_buffer(rme9652->pci, RME9652_DMA_AREA_BYTES, pb, pb_addr, 0); } printk(KERN_ERR "%s: no buffers available\n", rme9652->card_name); --Multipart_Wed_Jun_18_15:52:02_2003-1-- ------------------------------------------------------- This SF.Net email is sponsored by: INetU Attention Web Developers & Consultants: Become An INetU Hosting Partner. Refer Dedicated Servers. We Manage Them. You Get 10% Monthly Commission! INetU Dedicated Managed Hosting http://www.inetu.net/partner/index.php