|
@@ -151,32 +151,33 @@ static int pat_x_mtrr_type(u64 start, u64 end, unsigned long prot,
|
|
|
unsigned long pat_type;
|
|
|
u8 mtrr_type;
|
|
|
|
|
|
- mtrr_type = mtrr_type_lookup(start, end);
|
|
|
- if (mtrr_type == 0xFF) { /* MTRR not enabled */
|
|
|
- *ret_prot = prot;
|
|
|
- return 0;
|
|
|
- }
|
|
|
- if (mtrr_type == 0xFE) { /* MTRR match error */
|
|
|
- *ret_prot = _PAGE_CACHE_UC;
|
|
|
- return -1;
|
|
|
- }
|
|
|
- if (mtrr_type != MTRR_TYPE_UNCACHABLE &&
|
|
|
- mtrr_type != MTRR_TYPE_WRBACK &&
|
|
|
- mtrr_type != MTRR_TYPE_WRCOMB) { /* MTRR type unhandled */
|
|
|
- *ret_prot = _PAGE_CACHE_UC;
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
pat_type = prot & _PAGE_CACHE_MASK;
|
|
|
prot &= (~_PAGE_CACHE_MASK);
|
|
|
|
|
|
- /* Currently doing intersection by hand. Optimize it later. */
|
|
|
+ /*
|
|
|
+ * We return the PAT request directly for types where PAT takes
|
|
|
+ * precedence with respect to MTRR and for UC_MINUS.
|
|
|
+ * Consistency checks with other PAT requests is done later
|
|
|
+ * while going through memtype list.
|
|
|
+ */
|
|
|
if (pat_type == _PAGE_CACHE_WC) {
|
|
|
*ret_prot = prot | _PAGE_CACHE_WC;
|
|
|
+ return 0;
|
|
|
} else if (pat_type == _PAGE_CACHE_UC_MINUS) {
|
|
|
*ret_prot = prot | _PAGE_CACHE_UC_MINUS;
|
|
|
- } else if (pat_type == _PAGE_CACHE_UC ||
|
|
|
- mtrr_type == MTRR_TYPE_UNCACHABLE) {
|
|
|
+ return 0;
|
|
|
+ } else if (pat_type == _PAGE_CACHE_UC) {
|
|
|
+ *ret_prot = prot | _PAGE_CACHE_UC;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Look for MTRR hint to get the effective type in case where PAT
|
|
|
+ * request is for WB.
|
|
|
+ */
|
|
|
+ mtrr_type = mtrr_type_lookup(start, end);
|
|
|
+
|
|
|
+ if (mtrr_type == MTRR_TYPE_UNCACHABLE) {
|
|
|
*ret_prot = prot | _PAGE_CACHE_UC;
|
|
|
} else if (mtrr_type == MTRR_TYPE_WRCOMB) {
|
|
|
*ret_prot = prot | _PAGE_CACHE_WC;
|
|
@@ -233,14 +234,12 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type,
|
|
|
|
|
|
if (req_type == -1) {
|
|
|
/*
|
|
|
- * Special case where caller wants to inherit from mtrr or
|
|
|
- * existing pat mapping, defaulting to UC_MINUS in case of
|
|
|
- * no match.
|
|
|
+ * Call mtrr_lookup to get the type hint. This is an
|
|
|
+ * optimization for /dev/mem mmap'ers into WB memory (BIOS
|
|
|
+ * tools and ACPI tools). Use WB request for WB memory and use
|
|
|
+ * UC_MINUS otherwise.
|
|
|
*/
|
|
|
u8 mtrr_type = mtrr_type_lookup(start, end);
|
|
|
- if (mtrr_type == 0xFE) { /* MTRR match error */
|
|
|
- err = -1;
|
|
|
- }
|
|
|
|
|
|
if (mtrr_type == MTRR_TYPE_WRBACK) {
|
|
|
req_type = _PAGE_CACHE_WB;
|