wuzhangjin@xxxxxxxxx wrote:
[...]
@@ -3099,7 +3099,11 @@ static int snd_pcm_mmap_data_fault(struct vm_area_struct *area,
return VM_FAULT_SIGBUS;
} else {
vaddr = runtime->dma_area + offset;
+#if defined(__mips__) && defined(CONFIG_DMA_NONCOHERENT)
+ page = virt_to_page(CAC_ADDR(vaddr));
+#else
page = virt_to_page(vaddr);
+#endif
That is a bit ugly. It would be better to either wrap the fix up in
mips specific code so there don't have to be #ifdef __mips__ through out
the generic driver code, or fix the driver in some other way if it is
making x86 specific assumptions that don't hold in the general case.
The same applies for the remaining #ifdef __mips__ in the patch.
}
get_page(page);
vmf->page = page;
@@ -3214,6 +3218,11 @@ static int snd_pcm_mmap(struct file *file, struct vm_area_struct *area)
if (PCM_RUNTIME_CHECK(substream))
return -ENXIO;
+#if defined(__mips__) && defined(CONFIG_DMA_NONCOHERENT)
+ /* all mmap using uncached mode */
+ area->vm_page_prot = pgprot_noncached(area->vm_page_prot);
+ area->vm_flags |= (VM_RESERVED | VM_IO);
+#endif
offset = area->vm_pgoff << PAGE_SHIFT;
switch (offset) {
case SNDRV_PCM_MMAP_OFFSET_STATUS:
diff --git a/sound/core/sgbuf.c b/sound/core/sgbuf.c
index 4e7ec2b..c0fcf0d 100644
--- a/sound/core/sgbuf.c
+++ b/sound/core/sgbuf.c
@@ -114,7 +114,11 @@ void *snd_malloc_sgbuf_pages(struct device *device,
if (!i)
table->addr |= chunk; /* mark head */
table++;
+#if defined(__mips__) && defined(CONFIG_DMA_NONCOHERENT)
+ *pgtable++ = virt_to_page(CAC_ADDR(tmpb.area));
+#else
*pgtable++ = virt_to_page(tmpb.area);
+#endif
tmpb.area += PAGE_SIZE;
tmpb.addr += PAGE_SIZE;
}
@@ -125,7 +129,12 @@ void *snd_malloc_sgbuf_pages(struct device *device,
}
sgbuf->size = size;
+#if defined(__mips__) && defined(CONFIG_DMA_NONCOHERENT)
+ dmab->area = vmap(sgbuf->page_table, sgbuf->pages, \
+ VM_MAP | VM_IO, pgprot_noncached(PAGE_KERNEL));
+#else
dmab->area = vmap(sgbuf->page_table, sgbuf->pages, VM_MAP, PAGE_KERNEL);
+#endif
if (! dmab->area)
goto _failed;
if (res_size)
diff --git a/sound/pci/Kconfig b/sound/pci/Kconfig
index 82b9bdd..4ccfae0 100644
--- a/sound/pci/Kconfig
+++ b/sound/pci/Kconfig
@@ -259,7 +259,6 @@ config SND_CS5530
config SND_CS5535AUDIO
tristate "CS5535/CS5536 Audio"
- depends on X86 && !X86_64
select SND_PCM
select SND_AC97_CODEC
help