mirror of
https://github.com/torvalds/linux.git
synced 2024-12-01 16:41:39 +00:00
ARM: pgtable: Fix compiler warning in ioremap.c introduced by nopud
With the arch/arm code conversion to pgtable-nopud.h, the section and supersection (un|re)map code triggers compiler warnings on UP systems. This is caused by pmd_offset() being given a pgd_t argument rather than a pud_t one. This patch makes the necessary conversion with the assumption that the pud is folded into the pgd. The page table setting code only loops over the pmd which is enough with the classic page tables. This code is not compiled when LPAE is enabled. Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
parent
4e8ee7de22
commit
03a6b8274c
@ -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;
|
addr += PMD_SIZE;
|
||||||
pgd++;
|
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;
|
addr += PMD_SIZE;
|
||||||
pgd++;
|
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;
|
addr += PMD_SIZE;
|
||||||
pgd++;
|
pmd += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
pfn += SUPERSECTION_SIZE >> PAGE_SHIFT;
|
pfn += SUPERSECTION_SIZE >> PAGE_SHIFT;
|
||||||
|
Loading…
Reference in New Issue
Block a user