What is the difference between these two functions

2019-06-28 08:50发布

问题:

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);