All of lore.kernel.org
 help / color / mirror / Atom feed
* buffer pre-allocation for rme9652 and hdsp
@ 2003-06-18 13:52 Takashi Iwai
  0 siblings, 0 replies; only message in thread
From: Takashi Iwai @ 2003-06-18 13:52 UTC (permalink / raw)
  To: alsa-devel

[-- Attachment #1: Type: text/plain, Size: 680 bytes --]

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

[-- Attachment #2: rme-buffer-fix.dif --]
[-- Type: application/octet-stream, Size: 8666 bytes --]

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 <perex@suse.cz>
 #
 
-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);

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2003-06-18 13:52 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-06-18 13:52 buffer pre-allocation for rme9652 and hdsp Takashi Iwai

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.