diff options
| -rw-r--r-- | arch/x86/mm/pat.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index 1a9d0f07593..71aa6f7246c 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c | |||
| @@ -574,6 +574,51 @@ unlock_ret: | |||
| 574 | 574 | ||
| 575 | 575 | ||
| 576 | /** | 576 | /** |
| 577 | * lookup_memtype - Looksup the memory type for a physical address | ||
| 578 | * @paddr: physical address of which memory type needs to be looked up | ||
| 579 | * | ||
| 580 | * Only to be called when PAT is enabled | ||
| 581 | * | ||
| 582 | * Returns _PAGE_CACHE_WB, _PAGE_CACHE_WC, _PAGE_CACHE_UC_MINUS or | ||
| 583 | * _PAGE_CACHE_UC | ||
| 584 | */ | ||
| 585 | static unsigned long lookup_memtype(u64 paddr) | ||
| 586 | { | ||
| 587 | int rettype = _PAGE_CACHE_WB; | ||
| 588 | struct memtype *entry; | ||
| 589 | |||
| 590 | if (is_ISA_range(paddr, paddr + PAGE_SIZE - 1)) | ||
| 591 | return rettype; | ||
| 592 | |||
| 593 | if (pat_pagerange_is_ram(paddr, paddr + PAGE_SIZE)) { | ||
| 594 | struct page *page; | ||
| 595 | spin_lock(&memtype_lock); | ||
| 596 | page = pfn_to_page(paddr >> PAGE_SHIFT); | ||
| 597 | rettype = get_page_memtype(page); | ||
| 598 | spin_unlock(&memtype_lock); | ||
| 599 | /* | ||
| 600 | * -1 from get_page_memtype() implies RAM page is in its | ||
| 601 | * default state and not reserved, and hence of type WB | ||
| 602 | */ | ||
| 603 | if (rettype == -1) | ||
| 604 | rettype = _PAGE_CACHE_WB; | ||
| 605 | |||
| 606 | return rettype; | ||
| 607 | } | ||
| 608 | |||
| 609 | spin_lock(&memtype_lock); | ||
| 610 | |||
| 611 | entry = memtype_rb_search(&memtype_rbroot, paddr); | ||
| 612 | if (entry != NULL) | ||
| 613 | rettype = entry->type; | ||
| 614 | else | ||
| 615 | rettype = _PAGE_CACHE_UC_MINUS; | ||
| 616 | |||
| 617 | spin_unlock(&memtype_lock); | ||
| 618 | return rettype; | ||
| 619 | } | ||
| 620 | |||
| 621 | /** | ||
| 577 | * io_reserve_memtype - Request a memory type mapping for a region of memory | 622 | * io_reserve_memtype - Request a memory type mapping for a region of memory |
| 578 | * @start: start (physical address) of the region | 623 | * @start: start (physical address) of the region |
| 579 | * @end: end (physical address) of the region | 624 | * @end: end (physical address) of the region |
