[ARM] Introduce new PTE memory type bits
Provide L_PTE_MT_xxx definitions to describe the memory types that we use in Linux/ARM. These definitions are carefully picked such that: 1. their LSBs match what is required for pre-ARMv6 CPUs. 2. they all have a unique encoding, including after modification by build_mem_type_table() (the result being that some have more than one combination.) Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:

committed by
Russell King

orang tua
9cff96e5bf
melakukan
bb30f36f9b
@@ -21,7 +21,7 @@
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/tlbflush.h>
|
||||
|
||||
static unsigned long shared_pte_mask = L_PTE_CACHEABLE;
|
||||
static unsigned long shared_pte_mask = L_PTE_MT_BUFFERABLE;
|
||||
|
||||
/*
|
||||
* We take the easy way out of this problem - we make the
|
||||
@@ -63,9 +63,10 @@ static int adjust_pte(struct vm_area_struct *vma, unsigned long address)
|
||||
* If this page isn't present, or is already setup to
|
||||
* fault (ie, is old), we can safely ignore any issues.
|
||||
*/
|
||||
if (ret && pte_val(entry) & shared_pte_mask) {
|
||||
if (ret && (pte_val(entry) & L_PTE_MT_MASK) != shared_pte_mask) {
|
||||
flush_cache_page(vma, address, pte_pfn(entry));
|
||||
pte_val(entry) &= ~shared_pte_mask;
|
||||
pte_val(entry) &= ~L_PTE_MT_MASK;
|
||||
pte_val(entry) |= shared_pte_mask;
|
||||
set_pte_at(vma->vm_mm, address, pte, entry);
|
||||
flush_tlb_page(vma, address);
|
||||
}
|
||||
@@ -197,7 +198,7 @@ void __init check_writebuffer_bugs(void)
|
||||
unsigned long *p1, *p2;
|
||||
pgprot_t prot = __pgprot(L_PTE_PRESENT|L_PTE_YOUNG|
|
||||
L_PTE_DIRTY|L_PTE_WRITE|
|
||||
L_PTE_BUFFERABLE);
|
||||
L_PTE_MT_BUFFERABLE);
|
||||
|
||||
p1 = vmap(&page, 1, VM_IOREMAP, prot);
|
||||
p2 = vmap(&page, 1, VM_IOREMAP, prot);
|
||||
@@ -218,7 +219,7 @@ void __init check_writebuffer_bugs(void)
|
||||
|
||||
if (v) {
|
||||
printk("failed, %s\n", reason);
|
||||
shared_pte_mask |= L_PTE_BUFFERABLE;
|
||||
shared_pte_mask = L_PTE_MT_UNCACHED;
|
||||
} else {
|
||||
printk("ok\n");
|
||||
}
|
||||
|
Reference in New Issue
Block a user