Update of /cvsroot/alsa/alsa-kernel/pci/trident In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18820/alsa-kernel/pci/trident
Modified Files: trident_main.c trident_memory.c trident_synth.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: trident_main.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/trident/trident_main.c,v retrieving revision 1.53 retrieving revision 1.54 diff -u -r1.53 -r1.54 --- trident_main.c 22 Feb 2004 18:35:01 -0000 1.53 +++ trident_main.c 2 Mar 2004 15:32:38 -0000 1.54 @@ -2189,10 +2189,10 @@ if (trident->tlb.entries) { snd_pcm_substream_t *substream; for (substream = pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; substream; substream = substream->next) - snd_pcm_lib_preallocate_sg_pages(trident->pci, substream, 64*1024, 128*1024); - snd_pcm_lib_preallocate_pci_pages(trident->pci, pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream, 64*1024, 128*1024); + snd_pcm_lib_preallocate_pages(substream, SNDRV_DMA_TYPE_PCI_SG, trident->pci, 64*1024, 128*1024); + snd_pcm_lib_preallocate_pages(pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream, SNDRV_DMA_TYPE_PCI, trident->pci, 64*1024, 128*1024); } else { - snd_pcm_lib_preallocate_pci_pages_for_all(trident->pci, pcm, 64*1024, 128*1024); + snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_PCI, trident->pci, 64*1024, 128*1024); } if (rpcm) @@ -2246,9 +2246,9 @@ trident->foldback = foldback; if (trident->tlb.entries) - snd_pcm_lib_preallocate_sg_pages_for_all(trident->pci, foldback, 0, 128*1024); + snd_pcm_lib_preallocate_pages_for_all(foldback, SNDRV_DMA_TYPE_PCI_SG, trident->pci, 0, 128*1024); else - snd_pcm_lib_preallocate_pci_pages_for_all(trident->pci, foldback, 64*1024, 128*1024); + snd_pcm_lib_preallocate_pages_for_all(foldback, SNDRV_DMA_TYPE_PCI, trident->pci, 64*1024, 128*1024); if (rpcm) *rpcm = foldback; @@ -2287,7 +2287,7 @@ strcpy(spdif->name, "Trident 4DWave IEC958"); trident->spdif = spdif; - snd_pcm_lib_preallocate_pci_pages_for_all(trident->pci, spdif, 64*1024, 128*1024); + snd_pcm_lib_preallocate_pages_for_all(spdif, SNDRV_DMA_TYPE_PCI, trident->pci, 64*1024, 128*1024); if (rpcm) *rpcm = spdif; @@ -3348,13 +3348,12 @@ /* TLB array must be aligned to 16kB !!! so we allocate 32kB region and correct offset when necessary */ - trident->tlb.buffer = snd_malloc_pci_pages(trident->pci, 2 * SNDRV_TRIDENT_MAX_PAGES * 4, &trident->tlb.buffer_dmaaddr); - if (trident->tlb.buffer == NULL) { + if (snd_dma_alloc_pages(&trident->dma_dev, 2 * SNDRV_TRIDENT_MAX_PAGES * 4, &trident->tlb.buffer) < 0) { snd_printk(KERN_ERR "trident: unable to allocate TLB buffer\n"); return -ENOMEM; } - trident->tlb.entries = (unsigned int*)(((unsigned long)trident->tlb.buffer + SNDRV_TRIDENT_MAX_PAGES * 4 - 1) & ~(SNDRV_TRIDENT_MAX_PAGES * 4 - 1)); - trident->tlb.entries_dmaaddr = (trident->tlb.buffer_dmaaddr + SNDRV_TRIDENT_MAX_PAGES * 4 - 1) & ~(SNDRV_TRIDENT_MAX_PAGES * 4 - 1); + trident->tlb.entries = (unsigned int*)(((unsigned long)trident->tlb.buffer.area + SNDRV_TRIDENT_MAX_PAGES * 4 - 1) & ~(SNDRV_TRIDENT_MAX_PAGES * 4 - 1)); + trident->tlb.entries_dmaaddr = (trident->tlb.buffer.addr + SNDRV_TRIDENT_MAX_PAGES * 4 - 1) & ~(SNDRV_TRIDENT_MAX_PAGES * 4 - 1); /* allocate shadow TLB page table (virtual addresses) */ trident->tlb.shadow_entries = (unsigned long *)vmalloc(SNDRV_TRIDENT_MAX_PAGES*sizeof(unsigned long)); if (trident->tlb.shadow_entries == NULL) { @@ -3362,15 +3361,14 @@ return -ENOMEM; } /* allocate and setup silent page and initialise TLB entries */ - trident->tlb.silent_page = snd_malloc_pci_pages(trident->pci, SNDRV_TRIDENT_PAGE_SIZE, &trident->tlb.silent_page_dmaaddr); - if (trident->tlb.silent_page == 0UL) { + if (snd_dma_alloc_pages(&trident->dma_dev, SNDRV_TRIDENT_PAGE_SIZE, &trident->tlb.silent_page) < 0) { snd_printk(KERN_ERR "trident: unable to allocate silent page\n"); return -ENOMEM; } - memset(trident->tlb.silent_page, 0, SNDRV_TRIDENT_PAGE_SIZE); + memset(trident->tlb.silent_page.area, 0, SNDRV_TRIDENT_PAGE_SIZE); for (i = 0; i < SNDRV_TRIDENT_MAX_PAGES; i++) { - trident->tlb.entries[i] = cpu_to_le32(trident->tlb.silent_page_dmaaddr & ~(SNDRV_TRIDENT_PAGE_SIZE-1)); - trident->tlb.shadow_entries[i] = (unsigned long)trident->tlb.silent_page; + trident->tlb.entries[i] = cpu_to_le32(trident->tlb.silent_page.addr & ~(SNDRV_TRIDENT_PAGE_SIZE-1)); + trident->tlb.shadow_entries[i] = (unsigned long)trident->tlb.silent_page.area; } /* use emu memory block manager code to manage tlb page allocation */ @@ -3585,9 +3583,13 @@ } trident->irq = pci->irq; + memset(&trident->dma_dev, 0, sizeof(trident->dma_dev)); + trident->dma_dev.type = SNDRV_DMA_TYPE_PCI; + trident->dma_dev.dev.pci = pci; + /* allocate 16k-aligned TLB for NX cards */ trident->tlb.entries = NULL; - trident->tlb.buffer = NULL; + trident->tlb.buffer.area = NULL; if (trident->device == TRIDENT_DEVICE_ID_NX) { if ((err = snd_trident_tlb_alloc(trident)) < 0) { snd_trident_free(trident); @@ -3681,15 +3683,15 @@ else if (trident->device == TRIDENT_DEVICE_ID_SI7018) { outl(0, TRID_REG(trident, SI_SERIAL_INTF_CTRL)); } - if (trident->tlb.buffer) { + if (trident->tlb.buffer.area) { outl(0, TRID_REG(trident, NX_TLBC)); if (trident->tlb.memhdr) snd_util_memhdr_free(trident->tlb.memhdr); - if (trident->tlb.silent_page) - snd_free_pci_pages(trident->pci, SNDRV_TRIDENT_PAGE_SIZE, trident->tlb.silent_page, trident->tlb.silent_page_dmaaddr); + if (trident->tlb.silent_page.area) + snd_dma_free_pages(&trident->dma_dev, &trident->tlb.silent_page); if (trident->tlb.shadow_entries) vfree(trident->tlb.shadow_entries); - snd_free_pci_pages(trident->pci, 2 * SNDRV_TRIDENT_MAX_PAGES * 4, trident->tlb.buffer, trident->tlb.buffer_dmaaddr); + snd_dma_free_pages(&trident->dma_dev, &trident->tlb.buffer); } if (trident->irq >= 0) free_irq(trident->irq, (void *)trident); Index: trident_memory.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/trident/trident_memory.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- trident_memory.c 9 Mar 2003 23:16:12 -0000 1.11 +++ trident_memory.c 2 Mar 2004 15:32:38 -0000 1.12 @@ -47,7 +47,7 @@ /* fill TLB entrie(s) corresponding to page with ptr */ #define set_tlb_bus(trident,page,ptr,addr) __set_tlb_bus(trident,page,ptr,addr) /* fill TLB entrie(s) corresponding to page with silence pointer */ -#define set_silent_tlb(trident,page) __set_tlb_bus(trident, page, (unsigned long)trident->tlb.silent_page, trident->tlb.silent_page_dmaaddr) +#define set_silent_tlb(trident,page) __set_tlb_bus(trident, page, (unsigned long)trident->tlb.silent_page.area, trident->tlb.silent_page.addr) /* get aligned page from offset address */ #define get_aligned_page(offset) ((offset) >> 12) /* get offset address from aligned page */ @@ -367,8 +367,13 @@ void *ptr = page_to_ptr(trident, page); dma_addr_t addr = page_to_addr(trident, page); set_silent_tlb(trident, page); - if (ptr) - snd_free_pci_pages(trident->pci, ALIGN_PAGE_SIZE, ptr, addr); + if (ptr) { + struct snd_dma_buffer dmab; + dmab.area = ptr; + dmab.addr = addr; + dmab.bytes = ALIGN_PAGE_SIZE; + snd_dma_free_pages(&trident->dma_dev, &dmab); + } } /* check new allocation range */ @@ -399,8 +404,7 @@ static int synth_alloc_pages(trident_t *hw, snd_util_memblk_t *blk) { int page, first_page, last_page; - void *ptr; - dma_addr_t addr; + struct snd_dma_buffer dmab; firstpg(blk) = get_aligned_page(blk->offset); lastpg(blk) = get_aligned_page(blk->offset + blk->size - 1); @@ -410,14 +414,13 @@ * fortunately Trident page size and kernel PAGE_SIZE is identical! */ for (page = first_page; page <= last_page; page++) { - ptr = snd_malloc_pci_pages(hw->pci, ALIGN_PAGE_SIZE, &addr); - if (ptr == NULL) + if (snd_dma_alloc_pages(&hw->dma_dev, ALIGN_PAGE_SIZE, &dmab) < 0) goto __fail; - if (! is_valid_page(addr)) { - snd_free_pci_pages(hw->pci, ALIGN_PAGE_SIZE, ptr, addr); + if (! is_valid_page(dmab.addr)) { + snd_dma_free_pages(&hw->dma_dev, &dmab); goto __fail; } - set_tlb_bus(hw, page, (unsigned long)ptr, addr); + set_tlb_bus(hw, page, (unsigned long)dmab.area, dmab.addr); } return 0; Index: trident_synth.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/trident/trident_synth.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- trident_synth.c 16 May 2003 08:37:42 -0000 1.11 +++ trident_synth.c 2 Mar 2004 15:32:38 -0000 1.12 @@ -507,7 +507,6 @@ char *data, long len, int atomic) { trident_t *trident = snd_magic_cast(trident_t, private_data, return -ENXIO); - unsigned char *block = NULL; int size = instr->size; int shift = 0; @@ -530,7 +529,7 @@ if (trident->tlb.entries) { snd_util_memblk_t *memblk; - memblk = snd_trident_synth_alloc(trident,size); + memblk = snd_trident_synth_alloc(trident, size); if (memblk == NULL) return -ENOMEM; if (snd_trident_synth_copy_from_user(trident, memblk, 0, data, size) ) { @@ -540,17 +539,17 @@ instr->address.ptr = (unsigned char*)memblk; instr->address.memory = memblk->offset; } else { - dma_addr_t addr; - block = (unsigned char *) snd_malloc_pci_pages(trident->pci, size, &addr); - if (block == NULL) + struct snd_dma_buffer dmab; + + if (snd_dma_alloc_pages(&trident->dma_dev, size, &dmab) < 0) return -ENOMEM; - if (copy_from_user(block, data, size)) { - snd_free_pci_pages(trident->pci, size, block, addr); + if (copy_from_user(dmab.area, data, size)) { + snd_dma_free_pages(&trident->dma_dev, &dmab); return -EFAULT; } - instr->address.ptr = block; - instr->address.memory = addr; + instr->address.ptr = dmab.area; + instr->address.memory = dmab.addr; } trident->synth.current_size += size; ------------------------------------------------------- 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