Skip to content

Commit

Permalink
csky: Fixup dma_alloc_coherent with PAGE_SO attribute
Browse files Browse the repository at this point in the history
This bug is from commit: 2b070cc (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: Guo Ren <[email protected]>
  • Loading branch information
guoren83 committed Jul 31, 2019
1 parent 81b23ba commit 7f80fe2
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 4 deletions.
10 changes: 10 additions & 0 deletions arch/csky/include/asm/pgtable.h
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,16 @@ static inline pgprot_t pgprot_noncached(pgprot_t _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;

return __pgprot(prot);
Expand Down
6 changes: 2 additions & 4 deletions arch/csky/mm/ioremap.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ void __iomem *ioremap(phys_addr_t addr, size_t size)

vaddr = (unsigned long)area->addr;

prot = __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE |
_PAGE_GLOBAL | _CACHE_UNCACHED | _PAGE_SO);
prot = pgprot_noncached(PAGE_KERNEL);

if (ioremap_page_range(vaddr, vaddr + size, addr, prot)) {
free_vm_area(area);
Expand All @@ -51,10 +50,9 @@ pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
unsigned long size, pgprot_t vma_prot)
{
if (!pfn_valid(pfn)) {
vma_prot.pgprot |= _PAGE_SO;
return pgprot_noncached(vma_prot);
} else if (file->f_flags & O_SYNC) {
return pgprot_noncached(vma_prot);
return pgprot_writecombine(vma_prot);
}

return vma_prot;
Expand Down

0 comments on commit 7f80fe2

Please sign in to comment.