diff options
author | Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> | 2009-07-10 12:57:39 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2009-08-26 18:41:28 -0400 |
commit | 637b86e75f4c255a4446bc0b67ce9d914b9d2d42 (patch) | |
tree | dc5c835683673c7a1f47acdcc2b3da652b4bceab /arch | |
parent | f58417409603d62f2eb23db4d2cf6853d84a1698 (diff) |
x86, pat: Add lookup_memtype to get the current memtype of a paddr
Add a new routine lookup_memtype() to get the current memtype based on
the PAT reserves and frees.
Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'arch')
-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 1a9d0f07593f..71aa6f7246c6 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 |