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>
This commit is contained in:
Родитель
f584174096
Коммит
637b86e75f
|
@ -573,6 +573,51 @@ unlock_ret:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* lookup_memtype - Looksup the memory type for a physical address
|
||||||
|
* @paddr: physical address of which memory type needs to be looked up
|
||||||
|
*
|
||||||
|
* Only to be called when PAT is enabled
|
||||||
|
*
|
||||||
|
* Returns _PAGE_CACHE_WB, _PAGE_CACHE_WC, _PAGE_CACHE_UC_MINUS or
|
||||||
|
* _PAGE_CACHE_UC
|
||||||
|
*/
|
||||||
|
static unsigned long lookup_memtype(u64 paddr)
|
||||||
|
{
|
||||||
|
int rettype = _PAGE_CACHE_WB;
|
||||||
|
struct memtype *entry;
|
||||||
|
|
||||||
|
if (is_ISA_range(paddr, paddr + PAGE_SIZE - 1))
|
||||||
|
return rettype;
|
||||||
|
|
||||||
|
if (pat_pagerange_is_ram(paddr, paddr + PAGE_SIZE)) {
|
||||||
|
struct page *page;
|
||||||
|
spin_lock(&memtype_lock);
|
||||||
|
page = pfn_to_page(paddr >> PAGE_SHIFT);
|
||||||
|
rettype = get_page_memtype(page);
|
||||||
|
spin_unlock(&memtype_lock);
|
||||||
|
/*
|
||||||
|
* -1 from get_page_memtype() implies RAM page is in its
|
||||||
|
* default state and not reserved, and hence of type WB
|
||||||
|
*/
|
||||||
|
if (rettype == -1)
|
||||||
|
rettype = _PAGE_CACHE_WB;
|
||||||
|
|
||||||
|
return rettype;
|
||||||
|
}
|
||||||
|
|
||||||
|
spin_lock(&memtype_lock);
|
||||||
|
|
||||||
|
entry = memtype_rb_search(&memtype_rbroot, paddr);
|
||||||
|
if (entry != NULL)
|
||||||
|
rettype = entry->type;
|
||||||
|
else
|
||||||
|
rettype = _PAGE_CACHE_UC_MINUS;
|
||||||
|
|
||||||
|
spin_unlock(&memtype_lock);
|
||||||
|
return rettype;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* io_reserve_memtype - Request a memory type mapping for a region of memory
|
* io_reserve_memtype - Request a memory type mapping for a region of memory
|
||||||
* @start: start (physical address) of the region
|
* @start: start (physical address) of the region
|
||||||
|
|
Загрузка…
Ссылка в новой задаче