Commit 7f80fe20 authored by Guo Ren's avatar Guo Ren

csky: Fixup dma_alloc_coherent with PAGE_SO attribute

This bug is from commit: 2b070ccd (fixup abiv2 mmap(... O_SYNC)
failed). In that patch we remove the _PAGE_SO for memory noncache
mapping and this will cause problem when drivers use dma descriptors
to control the transcations without dma_w/rmb().

After referencing other archs' implementation, pgprot_writecombine is
introduced for mmap(... O_SYNC).
Signed-off-by: default avatarGuo Ren <ren_guo@c-sky.com>
parent 81b23ba6
...@@ -258,6 +258,16 @@ static inline pgprot_t pgprot_noncached(pgprot_t _prot) ...@@ -258,6 +258,16 @@ static inline pgprot_t pgprot_noncached(pgprot_t _prot)
{ {
unsigned long prot = pgprot_val(_prot); unsigned long prot = pgprot_val(_prot);
prot = (prot & ~_CACHE_MASK) | _CACHE_UNCACHED | _PAGE_SO;
return __pgprot(prot);
}
#define pgprot_writecombine pgprot_writecombine
static inline pgprot_t pgprot_writecombine(pgprot_t _prot)
{
unsigned long prot = pgprot_val(_prot);
prot = (prot & ~_CACHE_MASK) | _CACHE_UNCACHED; prot = (prot & ~_CACHE_MASK) | _CACHE_UNCACHED;
return __pgprot(prot); return __pgprot(prot);
......
...@@ -29,8 +29,7 @@ void __iomem *ioremap(phys_addr_t addr, size_t size) ...@@ -29,8 +29,7 @@ void __iomem *ioremap(phys_addr_t addr, size_t size)
vaddr = (unsigned long)area->addr; vaddr = (unsigned long)area->addr;
prot = __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | prot = pgprot_noncached(PAGE_KERNEL);
_PAGE_GLOBAL | _CACHE_UNCACHED | _PAGE_SO);
if (ioremap_page_range(vaddr, vaddr + size, addr, prot)) { if (ioremap_page_range(vaddr, vaddr + size, addr, prot)) {
free_vm_area(area); free_vm_area(area);
...@@ -51,10 +50,9 @@ pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, ...@@ -51,10 +50,9 @@ pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
unsigned long size, pgprot_t vma_prot) unsigned long size, pgprot_t vma_prot)
{ {
if (!pfn_valid(pfn)) { if (!pfn_valid(pfn)) {
vma_prot.pgprot |= _PAGE_SO;
return pgprot_noncached(vma_prot); return pgprot_noncached(vma_prot);
} else if (file->f_flags & O_SYNC) { } else if (file->f_flags & O_SYNC) {
return pgprot_noncached(vma_prot); return pgprot_writecombine(vma_prot);
} }
return vma_prot; return vma_prot;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment