提交 b6ff32d9 编写于 作者: S Suresh Siddha 提交者: Ingo Molnar

x86, PAT: Consolidate code in pat_x_mtrr_type() and reserve_memtype()

Fix pat_x_mtrr_type() to use UC_MINUS when the mtrr type return UC. This
is to be  consistent with ioremap() and ioremap_nocache() which uses
UC_MINUS.

Consolidate the code such that reserve_memtype() also uses
pat_x_mtrr_type() when the caller doesn't specify any special attribute
(non WB attribute).
Signed-off-by: NSuresh Siddha <suresh.b.siddha@intel.com>
Signed-off-by: NVenkatesh Pallipadi <venkatesh.pallipadi@intel.com>
LKML-Reference: <20090409212708.939936000@intel.com>
Signed-off-by: NIngo Molnar <mingo@elte.hu>
上级 3869c4aa
...@@ -375,7 +375,8 @@ static void __iomem *ioremap_default(resource_size_t phys_addr, ...@@ -375,7 +375,8 @@ static void __iomem *ioremap_default(resource_size_t phys_addr,
* - UC_MINUS for non-WB-able memory with no other conflicting mappings * - UC_MINUS for non-WB-able memory with no other conflicting mappings
* - Inherit from confliting mappings otherwise * - Inherit from confliting mappings otherwise
*/ */
err = reserve_memtype(phys_addr, phys_addr + size, -1, &flags); err = reserve_memtype(phys_addr, phys_addr + size,
_PAGE_CACHE_WB, &flags);
if (err < 0) if (err < 0)
return NULL; return NULL;
......
...@@ -182,10 +182,10 @@ static unsigned long pat_x_mtrr_type(u64 start, u64 end, unsigned long req_type) ...@@ -182,10 +182,10 @@ static unsigned long pat_x_mtrr_type(u64 start, u64 end, unsigned long req_type)
u8 mtrr_type; u8 mtrr_type;
mtrr_type = mtrr_type_lookup(start, end); mtrr_type = mtrr_type_lookup(start, end);
if (mtrr_type == MTRR_TYPE_UNCACHABLE) if (mtrr_type != MTRR_TYPE_WRBACK)
return _PAGE_CACHE_UC; return _PAGE_CACHE_UC_MINUS;
if (mtrr_type == MTRR_TYPE_WRCOMB)
return _PAGE_CACHE_WC; return _PAGE_CACHE_WB;
} }
return req_type; return req_type;
...@@ -352,23 +352,13 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type, ...@@ -352,23 +352,13 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type,
return 0; return 0;
} }
if (req_type == -1) { /*
/* * Call mtrr_lookup to get the type hint. This is an
* Call mtrr_lookup to get the type hint. This is an * optimization for /dev/mem mmap'ers into WB memory (BIOS
* optimization for /dev/mem mmap'ers into WB memory (BIOS * tools and ACPI tools). Use WB request for WB memory and use
* tools and ACPI tools). Use WB request for WB memory and use * UC_MINUS otherwise.
* UC_MINUS otherwise. */
*/ actual_type = pat_x_mtrr_type(start, end, req_type & _PAGE_CACHE_MASK);
u8 mtrr_type = mtrr_type_lookup(start, end);
if (mtrr_type == MTRR_TYPE_WRBACK)
actual_type = _PAGE_CACHE_WB;
else
actual_type = _PAGE_CACHE_UC_MINUS;
} else {
actual_type = pat_x_mtrr_type(start, end,
req_type & _PAGE_CACHE_MASK);
}
if (new_type) if (new_type)
*new_type = actual_type; *new_type = actual_type;
...@@ -587,7 +577,8 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn, ...@@ -587,7 +577,8 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
if (flags != -1) { if (flags != -1) {
retval = reserve_memtype(offset, offset + size, flags, NULL); retval = reserve_memtype(offset, offset + size, flags, NULL);
} else { } else {
retval = reserve_memtype(offset, offset + size, -1, &flags); retval = reserve_memtype(offset, offset + size,
_PAGE_CACHE_WB, &flags);
} }
if (retval < 0) if (retval < 0)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册