|
@@ -79,13 +79,16 @@ static void unmap_area_sections(unsigned long virt, unsigned long size)
|
|
{
|
|
{
|
|
unsigned long addr = virt, end = virt + (size & ~(SZ_1M - 1));
|
|
unsigned long addr = virt, end = virt + (size & ~(SZ_1M - 1));
|
|
pgd_t *pgd;
|
|
pgd_t *pgd;
|
|
|
|
+ pud_t *pud;
|
|
|
|
+ pmd_t *pmdp;
|
|
|
|
|
|
flush_cache_vunmap(addr, end);
|
|
flush_cache_vunmap(addr, end);
|
|
pgd = pgd_offset_k(addr);
|
|
pgd = pgd_offset_k(addr);
|
|
|
|
+ pud = pud_offset(pgd, addr);
|
|
|
|
+ pmdp = pmd_offset(pud, addr);
|
|
do {
|
|
do {
|
|
- pmd_t pmd, *pmdp = pmd_offset(pgd, addr);
|
|
|
|
|
|
+ pmd_t pmd = *pmdp;
|
|
|
|
|
|
- pmd = *pmdp;
|
|
|
|
if (!pmd_none(pmd)) {
|
|
if (!pmd_none(pmd)) {
|
|
/*
|
|
/*
|
|
* Clear the PMD from the page table, and
|
|
* Clear the PMD from the page table, and
|
|
@@ -104,8 +107,8 @@ static void unmap_area_sections(unsigned long virt, unsigned long size)
|
|
pte_free_kernel(&init_mm, pmd_page_vaddr(pmd));
|
|
pte_free_kernel(&init_mm, pmd_page_vaddr(pmd));
|
|
}
|
|
}
|
|
|
|
|
|
- addr += PGDIR_SIZE;
|
|
|
|
- pgd++;
|
|
|
|
|
|
+ addr += PMD_SIZE;
|
|
|
|
+ pmdp += 2;
|
|
} while (addr < end);
|
|
} while (addr < end);
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -124,6 +127,8 @@ remap_area_sections(unsigned long virt, unsigned long pfn,
|
|
{
|
|
{
|
|
unsigned long addr = virt, end = virt + size;
|
|
unsigned long addr = virt, end = virt + size;
|
|
pgd_t *pgd;
|
|
pgd_t *pgd;
|
|
|
|
+ pud_t *pud;
|
|
|
|
+ pmd_t *pmd;
|
|
|
|
|
|
/*
|
|
/*
|
|
* Remove and free any PTE-based mapping, and
|
|
* Remove and free any PTE-based mapping, and
|
|
@@ -132,17 +137,17 @@ remap_area_sections(unsigned long virt, unsigned long pfn,
|
|
unmap_area_sections(virt, size);
|
|
unmap_area_sections(virt, size);
|
|
|
|
|
|
pgd = pgd_offset_k(addr);
|
|
pgd = pgd_offset_k(addr);
|
|
|
|
+ pud = pud_offset(pgd, addr);
|
|
|
|
+ pmd = pmd_offset(pud, addr);
|
|
do {
|
|
do {
|
|
- pmd_t *pmd = pmd_offset(pgd, addr);
|
|
|
|
-
|
|
|
|
pmd[0] = __pmd(__pfn_to_phys(pfn) | type->prot_sect);
|
|
pmd[0] = __pmd(__pfn_to_phys(pfn) | type->prot_sect);
|
|
pfn += SZ_1M >> PAGE_SHIFT;
|
|
pfn += SZ_1M >> PAGE_SHIFT;
|
|
pmd[1] = __pmd(__pfn_to_phys(pfn) | type->prot_sect);
|
|
pmd[1] = __pmd(__pfn_to_phys(pfn) | type->prot_sect);
|
|
pfn += SZ_1M >> PAGE_SHIFT;
|
|
pfn += SZ_1M >> PAGE_SHIFT;
|
|
flush_pmd_entry(pmd);
|
|
flush_pmd_entry(pmd);
|
|
|
|
|
|
- addr += PGDIR_SIZE;
|
|
|
|
- pgd++;
|
|
|
|
|
|
+ addr += PMD_SIZE;
|
|
|
|
+ pmd += 2;
|
|
} while (addr < end);
|
|
} while (addr < end);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
@@ -154,6 +159,8 @@ remap_area_supersections(unsigned long virt, unsigned long pfn,
|
|
{
|
|
{
|
|
unsigned long addr = virt, end = virt + size;
|
|
unsigned long addr = virt, end = virt + size;
|
|
pgd_t *pgd;
|
|
pgd_t *pgd;
|
|
|
|
+ pud_t *pud;
|
|
|
|
+ pmd_t *pmd;
|
|
|
|
|
|
/*
|
|
/*
|
|
* Remove and free any PTE-based mapping, and
|
|
* Remove and free any PTE-based mapping, and
|
|
@@ -162,6 +169,8 @@ remap_area_supersections(unsigned long virt, unsigned long pfn,
|
|
unmap_area_sections(virt, size);
|
|
unmap_area_sections(virt, size);
|
|
|
|
|
|
pgd = pgd_offset_k(virt);
|
|
pgd = pgd_offset_k(virt);
|
|
|
|
+ pud = pud_offset(pgd, addr);
|
|
|
|
+ pmd = pmd_offset(pud, addr);
|
|
do {
|
|
do {
|
|
unsigned long super_pmd_val, i;
|
|
unsigned long super_pmd_val, i;
|
|
|
|
|
|
@@ -170,14 +179,12 @@ remap_area_supersections(unsigned long virt, unsigned long pfn,
|
|
super_pmd_val |= ((pfn >> (32 - PAGE_SHIFT)) & 0xf) << 20;
|
|
super_pmd_val |= ((pfn >> (32 - PAGE_SHIFT)) & 0xf) << 20;
|
|
|
|
|
|
for (i = 0; i < 8; i++) {
|
|
for (i = 0; i < 8; i++) {
|
|
- pmd_t *pmd = pmd_offset(pgd, addr);
|
|
|
|
-
|
|
|
|
pmd[0] = __pmd(super_pmd_val);
|
|
pmd[0] = __pmd(super_pmd_val);
|
|
pmd[1] = __pmd(super_pmd_val);
|
|
pmd[1] = __pmd(super_pmd_val);
|
|
flush_pmd_entry(pmd);
|
|
flush_pmd_entry(pmd);
|
|
|
|
|
|
- addr += PGDIR_SIZE;
|
|
|
|
- pgd++;
|
|
|
|
|
|
+ addr += PMD_SIZE;
|
|
|
|
+ pmd += 2;
|
|
}
|
|
}
|
|
|
|
|
|
pfn += SUPERSECTION_SIZE >> PAGE_SHIFT;
|
|
pfn += SUPERSECTION_SIZE >> PAGE_SHIFT;
|