Skip to content

Commit

Permalink
ARM: pgtable: Fix compiler warning in ioremap.c introduced by nopud
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Catalin Marinas committed Dec 8, 2011
1 parent 4e8ee7d commit 03a6b82
Showing 1 changed file with 19 additions and 12 deletions.
31 changes: 19 additions & 12 deletions arch/arm/mm/ioremap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));
pgd_t *pgd;
pud_t *pud;
pmd_t *pmdp;

flush_cache_vunmap(addr, end);
pgd = pgd_offset_k(addr);
pud = pud_offset(pgd, addr);
pmdp = pmd_offset(pud, addr);
do {
pmd_t pmd, *pmdp = pmd_offset(pgd, addr);
pmd_t pmd = *pmdp;

pmd = *pmdp;
if (!pmd_none(pmd)) {
/*
* Clear the PMD from the page table, and
Expand All @@ -104,8 +107,8 @@ static void unmap_area_sections(unsigned long virt, unsigned long size)
pte_free_kernel(&init_mm, pmd_page_vaddr(pmd));
}

addr += PGDIR_SIZE;
pgd++;
addr += PMD_SIZE;
pmdp += 2;
} while (addr < end);

/*
Expand All @@ -124,6 +127,8 @@ remap_area_sections(unsigned long virt, unsigned long pfn,
{
unsigned long addr = virt, end = virt + size;
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;

/*
* Remove and free any PTE-based mapping, and
Expand All @@ -132,17 +137,17 @@ remap_area_sections(unsigned long virt, unsigned long pfn,
unmap_area_sections(virt, size);

pgd = pgd_offset_k(addr);
pud = pud_offset(pgd, addr);
pmd = pmd_offset(pud, addr);
do {
pmd_t *pmd = pmd_offset(pgd, addr);

pmd[0] = __pmd(__pfn_to_phys(pfn) | type->prot_sect);
pfn += SZ_1M >> PAGE_SHIFT;
pmd[1] = __pmd(__pfn_to_phys(pfn) | type->prot_sect);
pfn += SZ_1M >> PAGE_SHIFT;
flush_pmd_entry(pmd);

addr += PGDIR_SIZE;
pgd++;
addr += PMD_SIZE;
pmd += 2;
} while (addr < end);

return 0;
Expand All @@ -154,6 +159,8 @@ remap_area_supersections(unsigned long virt, unsigned long pfn,
{
unsigned long addr = virt, end = virt + size;
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;

/*
* Remove and free any PTE-based mapping, and
Expand All @@ -162,6 +169,8 @@ remap_area_supersections(unsigned long virt, unsigned long pfn,
unmap_area_sections(virt, size);

pgd = pgd_offset_k(virt);
pud = pud_offset(pgd, addr);
pmd = pmd_offset(pud, addr);
do {
unsigned long super_pmd_val, i;

Expand All @@ -170,14 +179,12 @@ remap_area_supersections(unsigned long virt, unsigned long pfn,
super_pmd_val |= ((pfn >> (32 - PAGE_SHIFT)) & 0xf) << 20;

for (i = 0; i < 8; i++) {
pmd_t *pmd = pmd_offset(pgd, addr);

pmd[0] = __pmd(super_pmd_val);
pmd[1] = __pmd(super_pmd_val);
flush_pmd_entry(pmd);

addr += PGDIR_SIZE;
pgd++;
addr += PMD_SIZE;
pmd += 2;
}

pfn += SUPERSECTION_SIZE >> PAGE_SHIFT;
Expand Down

0 comments on commit 03a6b82

Please sign in to comment.