|
@@ -237,7 +237,8 @@ void __iomem *ioremap_nocache(resource_size_t phys_addr, unsigned long size)
|
|
* pat_enabled ? _PAGE_CACHE_MODE_UC : _PAGE_CACHE_MODE_UC_MINUS;
|
|
* pat_enabled ? _PAGE_CACHE_MODE_UC : _PAGE_CACHE_MODE_UC_MINUS;
|
|
*
|
|
*
|
|
* Till we fix all X drivers to use ioremap_wc(), we will use
|
|
* Till we fix all X drivers to use ioremap_wc(), we will use
|
|
- * UC MINUS.
|
|
|
|
|
|
+ * UC MINUS. Drivers that are certain they need or can already
|
|
|
|
+ * be converted over to strong UC can use ioremap_uc().
|
|
*/
|
|
*/
|
|
enum page_cache_mode pcm = _PAGE_CACHE_MODE_UC_MINUS;
|
|
enum page_cache_mode pcm = _PAGE_CACHE_MODE_UC_MINUS;
|
|
|
|
|
|
@@ -246,6 +247,39 @@ void __iomem *ioremap_nocache(resource_size_t phys_addr, unsigned long size)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(ioremap_nocache);
|
|
EXPORT_SYMBOL(ioremap_nocache);
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * ioremap_uc - map bus memory into CPU space as strongly uncachable
|
|
|
|
+ * @phys_addr: bus address of the memory
|
|
|
|
+ * @size: size of the resource to map
|
|
|
|
+ *
|
|
|
|
+ * ioremap_uc performs a platform specific sequence of operations to
|
|
|
|
+ * make bus memory CPU accessible via the readb/readw/readl/writeb/
|
|
|
|
+ * writew/writel functions and the other mmio helpers. The returned
|
|
|
|
+ * address is not guaranteed to be usable directly as a virtual
|
|
|
|
+ * address.
|
|
|
|
+ *
|
|
|
|
+ * This version of ioremap ensures that the memory is marked with a strong
|
|
|
|
+ * preference as completely uncachable on the CPU when possible. For non-PAT
|
|
|
|
+ * systems this ends up setting page-attribute flags PCD=1, PWT=1. For PAT
|
|
|
|
+ * systems this will set the PAT entry for the pages as strong UC. This call
|
|
|
|
+ * will honor existing caching rules from things like the PCI bus. Note that
|
|
|
|
+ * there are other caches and buffers on many busses. In particular driver
|
|
|
|
+ * authors should read up on PCI writes.
|
|
|
|
+ *
|
|
|
|
+ * It's useful if some control registers are in such an area and
|
|
|
|
+ * write combining or read caching is not desirable:
|
|
|
|
+ *
|
|
|
|
+ * Must be freed with iounmap.
|
|
|
|
+ */
|
|
|
|
+void __iomem *ioremap_uc(resource_size_t phys_addr, unsigned long size)
|
|
|
|
+{
|
|
|
|
+ enum page_cache_mode pcm = _PAGE_CACHE_MODE_UC;
|
|
|
|
+
|
|
|
|
+ return __ioremap_caller(phys_addr, size, pcm,
|
|
|
|
+ __builtin_return_address(0));
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL_GPL(ioremap_uc);
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* ioremap_wc - map memory into CPU space write combined
|
|
* ioremap_wc - map memory into CPU space write combined
|
|
* @phys_addr: bus address of the memory
|
|
* @phys_addr: bus address of the memory
|