When I want to mark memory region as Write Combined (to disable cacheable and use BIU) or Uncacheable through set PAT(Page attribute table - 7bit in PTE), then what do I must to use, and what is the difference between two these functions?
- Drivers should use
ioremap_[uc|wc]
to access PCI BARs with [uc|wc] access types: void __iomem *ioremap_wc(resource_size_t phys_addr, unsigned long size) - Drivers should use
set_memory_[uc|wc]
to set access type for RAM ranges: int set_memory_uc(unsigned long addr, int numpages)
Taken from: http://lwn.net/Articles/278994/
Why can't I use the same single function both for PCI BARs and RAM ranges?
Clarification:
Does ioremap_uc()
get physical address and return virtual address with setting Uncacheable, versus set_memory_uc()
which get already virtual address and set Uncacheable for these pages?
Are these codes equal?
void* virt_ptr = ioremap_uc(phys_ptr, size);
and
void* virt_ptr = ioremap(phys_ptr, size);
const int page_size = 4096;
set_memory_uc(virt_ptr, size/page_size);