Update of /cvsroot/alsa/alsa-driver/acore
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18820/alsa-driver/acore

Modified Files:
        memalloc.inc memalloc.patch sgbuf.c 
Log Message:
Big DMA cleanup originated by Russell King <[EMAIL PROTECTED]>
* Russel
  - introduced 'struct device' support for 2.6 dma_alloc_coherent()
* Jaroslav
  - removed all bus-specific allocation functions
  - extended snd_dma_alloc_pages/snd_dma_free_pages to handle all bus types
  - recoded all (or almost all) device drivers
  - sgbuf functions are bus independent now


Index: memalloc.inc
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/acore/memalloc.inc,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- memalloc.inc        10 Nov 2003 17:32:37 -0000      1.2
+++ memalloc.inc        2 Mar 2004 15:32:35 -0000       1.3
@@ -26,3 +26,50 @@
        return res;
 }
 #endif
+
+static LIST_HEAD(snd_pci_devices);
+
+struct snd_pci_device {
+       struct list_head *list;
+       struct device dev;
+       struct pci_dev *pci;
+};
+
+struct device *snd_kdevice_pci(struct pci_dev *pci)
+{
+       struct snd_pci_device *pdev;
+       struct list_head *pos;
+
+       list_for_each(pos, &snd_pci_devices) {
+               pdev = list_entry(pos, struct snd_pci_device, list);
+               if (pdev->pci == pci)
+                       return &pdev->dev;
+       }
+       pdev = kmalloc(sizeof(struct snd_pci_device), GFP_KERNEL);
+       if (pdev == NULL) {
+               printk(KERN_ERR "unable to allocate snd_pci_device struct\n");
+               return NULL;
+       }
+       pdev->dev.d.pci = pci;
+       pdev->dev.dma_mask = &pci->dma_mask;
+       return &pdev->dev;
+}
+EXPORT_SYMBOL(snd_kdevice_pci);
+
+static void snd_kdevice_free_all(void)
+{
+       struct snd_pci_device *pdev;
+       struct list_head *pos, *n;
+
+       list_for_each_safe(pos, n, &snd_pci_devices) {
+               pdev = list_entry(pos, struct snd_pci_device, list);
+               kfree(pdev);
+       }
+}
+
+static const char *snd_kdevice_busid(struct device *dev)
+{
+       if (dev->d.pci)
+               return dev->d.pci->slot_name;
+       return "???";
+}

Index: memalloc.patch
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/acore/memalloc.patch,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- memalloc.patch      19 Jan 2004 18:38:28 -0000      1.3
+++ memalloc.patch      2 Mar 2004 15:32:35 -0000       1.4
@@ -1,81 +1,69 @@
---- ../../alsa-kernel/core/memalloc.c  2004-01-19 12:52:21.856491159 +0100
-+++ memalloc.c 2004-01-19 13:00:09.973519397 +0100
+--- memalloc.c.old     2004-03-02 11:09:58.000000000 +0100
++++ memalloc.c 2004-03-02 11:09:17.000000000 +0100
 @@ -1,3 +1,4 @@
 +#include "memalloc.inc"
  /*
   *  Copyright (c) by Jaroslav Kysela <[EMAIL PROTECTED]>
   *                   Takashi Iwai <[EMAIL PROTECTED]>
-@@ -73,6 +74,7 @@
- #define snd_assert(expr, args...) /**/
+@@ -461,7 +462,7 @@
  #endif
- 
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 0)
  #ifdef CONFIG_PCI
- #if defined(__i386__) || defined(__ppc__) || defined(__x86_64__)
- #define HACK_PCI_ALLOC_CONSISTENT
-@@ -94,19 +96,31 @@
-                                   dma_addr_t *dma_handle)
- {
-       void *ret;
--      u64 dma_mask, cdma_mask;
-+      u64 dma_mask;
-+#ifdef CONFIG_HAVE_PCI_CONSISTENT_DMA_MASK
-+      u64 cdma_mask;
-+#endif
-       unsigned long mask;
- 
-       if (hwdev == NULL)
-               return pci_alloc_consistent(hwdev, size, dma_handle);
-       dma_mask = hwdev->dma_mask;
-+#ifdef CONFIG_HAVE_PCI_CONSISTENT_DMA_MASK
-       cdma_mask = hwdev->consistent_dma_mask;
--      mask = (unsigned long)dma_mask && (unsigned long)cdma_mask;
-+#endif
-+      mask = (unsigned long)dma_mask;
-+#ifdef CONFIG_HAVE_PCI_CONSISTENT_DMA_MASK
-+      mask &= (unsigned long)cdma_mask;
-+#endif
-       hwdev->dma_mask = 0xffffffff; /* do without masking */
-+#ifdef CONFIG_HAVE_PCI_CONSISTENT_DMA_MASK
-       hwdev->consistent_dma_mask = 0xffffffff; /* do without masking */
-+#endif
-       ret = pci_alloc_consistent(hwdev, size, dma_handle);
-       hwdev->dma_mask = dma_mask; /* restore */
-+#ifdef CONFIG_HAVE_PCI_CONSISTENT_DMA_MASK
-       hwdev->consistent_dma_mask = cdma_mask; /* restore */
-+#endif
-       if (ret) {
-               /* obtained address is out of range? */
-               if (((unsigned long)*dma_handle + size - 1) & ~mask) {
-@@ -128,6 +142,7 @@
- 
- #endif /* arch */
- #endif /* CONFIG_PCI */
-+#endif /* LINUX >= 2.4.0 */
- 
- 
- /*
-@@ -623,7 +638,7 @@
+       case SNDRV_DMA_TYPE_PCI:
+-              dmab->area = snd_malloc_dev_pages(&dev->dev.pci->dev, size, 
&dmab->addr);
++              dmab->area = snd_malloc_dev_pages(snd_kdevice_pci(dev->dev.pci), size, 
&dmab->addr);
+               break;
+ #endif
+       case SNDRV_DMA_TYPE_DEV:
+@@ -522,7 +523,7 @@
+ #endif
+ #ifdef CONFIG_PCI
+       case SNDRV_DMA_TYPE_PCI:
+-              dmab->area = snd_malloc_dev_pages_fallback(&dev->dev.pci->dev, size, 
&dmab->addr, &dmab->bytes);
++              dmab->area = 
snd_malloc_dev_pages_fallback(snd_kdevice_pci(dev->dev.pci), size, &dmab->addr, 
&dmab->bytes);
+               break;
+ #endif
+       case SNDRV_DMA_TYPE_DEV:
+@@ -569,7 +570,7 @@
+ #endif
+ #ifdef CONFIG_PCI
+       case SNDRV_DMA_TYPE_PCI:
+-              snd_free_dev_pages(&dev->dev.pci->dev, dmab->bytes, dmab->area, 
dmab->addr);
++              snd_free_dev_pages(snd_kdevice_pci(dev->dev.pci), dmab->bytes, 
dmab->area, dmab->addr);
+               break;
+ #endif
+       case SNDRV_DMA_TYPE_DEV:
+@@ -724,6 +725,7 @@
+               kfree(mem);
+       }
+       up(&list_mutex);
++      snd_kdevice_free_all();
  }
  
  
--#if defined(__i386__)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 0) && defined(__i386__)
- /*
-  * on ix86, we allocate a page with GFP_KERNEL to assure the
-  * allocation.  the code is almost same with kernel/i386/pci-dma.c but
-@@ -648,7 +663,7 @@
-       dma_addr_t addr;
-       unsigned long mask;
+@@ -771,7 +773,7 @@
+ {
+       memset(dev, 0, sizeof(*dev));
+       dev->type = SNDRV_DMA_TYPE_DEV;
+-      dev->dev.dev = &pci->dev;
++      dev->dev.dev = snd_kdevice_pci(pci);
+       dev->id = id;
+ }
  
--      mask = pci ? (unsigned long)pci->consistent_dma_mask : 0x00ffffffUL;
-+      mask = pci ? (unsigned long)pci->dma_mask : 0x00ffffffUL;
-       ptr = (void *)__get_free_page(GFP_KERNEL);
-       if (ptr) {
-               addr = virt_to_phys(ptr);
-@@ -1012,3 +1027,5 @@
- EXPORT_SYMBOL(snd_malloc_sbus_pages_fallback);
- EXPORT_SYMBOL(snd_free_sbus_pages);
- #endif
+@@ -873,7 +875,11 @@
+                       if (mem->dev.dev.dev) {
+                               len += sprintf(page + len, "%s [%s]",
+                                              mem->dev.type == SNDRV_DMA_TYPE_DEV_SG 
? "DEV" : "DEV-SG",
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 0)
+                                              mem->dev.dev.dev->bus_id);
++#else
++                                             snd_kdevice_busid(mem->dev.dev.dev));
++#endif
+                       }
+                       break;
+               default:
+@@ -950,3 +956,5 @@
+ EXPORT_SYMBOL(snd_malloc_pages);
+ EXPORT_SYMBOL(snd_malloc_pages_fallback);
+ EXPORT_SYMBOL(snd_free_pages);
 +
 +#include "memalloc.inc1"

Index: sgbuf.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/acore/sgbuf.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- sgbuf.c     10 Nov 2003 17:32:37 -0000      1.5
+++ sgbuf.c     2 Mar 2004 15:32:35 -0000       1.6
@@ -57,8 +57,8 @@
        unsigned int i;
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 0)
        unsigned long rmask;
-       if (sgbuf->pci)
-               rmask = ~((unsigned long)sgbuf->pci->dma_mask);
+       if (sgbuf->dev->dev.dev->dma_mask)
+               rmask = ~((unsigned long)(*sgbuf->dev->dev.dev->dma_mask));
        else
                rmask = ~0xffffffUL;
 #endif
@@ -107,7 +107,28 @@
                vfree(vmaddr); /* don't use wrapper */
 }
 
-void *snd_malloc_sgbuf_pages(struct pci_dev *pci, size_t size, struct snd_dma_buffer 
*dmab)
+int snd_free_sgbuf_pages(const struct snd_dma_device *dev,
+                        struct snd_dma_buffer *dmab)
+{
+       struct snd_sg_buf *sgbuf = dmab->private_data;
+
+       if (dmab->area)
+               release_vm_buffer(sgbuf, dmab->area);
+       dmab->area = NULL;
+       if (sgbuf->table)
+               kfree(sgbuf->table);
+       sgbuf->table = NULL;
+       if (sgbuf->page_table)
+               kfree(sgbuf->page_table);
+       kfree(sgbuf);
+       dmab->private_data = NULL;
+       
+       return 0;
+}
+
+void *snd_malloc_sgbuf_pages(const struct snd_dma_device *dev,
+                            size_t size, struct snd_dma_buffer *dmab,
+                            size_t *res_size)
 {
        struct snd_sg_buf *sgbuf;
        unsigned int pages;
@@ -118,7 +139,7 @@
        if (! sgbuf)
                return NULL;
        memset(sgbuf, 0, sizeof(*sgbuf));
-       sgbuf->pci = pci;
+       sgbuf->dev = dev;
        pages = snd_sgbuf_aligned_pages(size);
        sgbuf->tblsize = sgbuf_align_table(pages);
        sgbuf->table = kmalloc(sizeof(*sgbuf->table) * sgbuf->tblsize, GFP_KERNEL);
@@ -149,26 +170,8 @@
        return dmab->area;
 
  _failed:
-       snd_free_sgbuf_pages(dmab); /* free the table */
+       snd_free_sgbuf_pages(dev, dmab); /* free the table */
        return NULL;
 }
 
-int snd_free_sgbuf_pages(struct snd_dma_buffer *dmab)
-{
-       struct snd_sg_buf *sgbuf = dmab->private_data;
-
-       if (dmab->area)
-               release_vm_buffer(sgbuf, dmab->area);
-       dmab->area = NULL;
-       if (sgbuf->table)
-               kfree(sgbuf->table);
-       sgbuf->table = NULL;
-       if (sgbuf->page_table)
-               kfree(sgbuf->page_table);
-       kfree(sgbuf);
-       dmab->private_data = NULL;
-       
-       return 0;
-}
-
 #endif /* < 2.5.0 */



-------------------------------------------------------
SF.Net is sponsored by: Speed Start Your Linux Apps Now.
Build and deploy apps & Web services for Linux with
a free DVD software kit from IBM. Click Now!
http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to