aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mm
diff options
context:
space:
mode:
authorCatalin Marinas <catalin.marinas@arm.com>2011-11-22 12:30:27 -0500
committerCatalin Marinas <catalin.marinas@arm.com>2011-12-08 05:30:36 -0500
commit03a6b8274cc61fb9bb77aaa102e63840461c5f3a (patch)
tree9d64db13ff38f31b50a69f2169828c34ac6a3b21 /arch/arm/mm
parent4e8ee7de227e3ab9a72040b448ad728c5428a042 (diff)
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>
Diffstat (limited to 'arch/arm/mm')
-rw-r--r--arch/arm/mm/ioremap.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c
index bdb248c4f55..c3fa40da3b7 100644
--- a/arch/arm/mm/ioremap.c
+++ b/arch/arm/mm/ioremap.c
@@ -79,13 +79,16 @@ static void unmap_area_sections(unsigned long virt, unsigned long size)
79{ 79{
80 unsigned long addr = virt, end = virt + (size & ~(SZ_1M - 1)); 80 unsigned long addr = virt, end = virt + (size & ~(SZ_1M - 1));
81 pgd_t *pgd; 81 pgd_t *pgd;
82 pud_t *pud;
83 pmd_t *pmdp;
82 84
83 flush_cache_vunmap(addr, end); 85 flush_cache_vunmap(addr, end);
84 pgd = pgd_offset_k(addr); 86 pgd = pgd_offset_k(addr);
87 pud = pud_offset(pgd, addr);
88 pmdp = pmd_offset(pud, addr);
85 do { 89 do {
86 pmd_t pmd, *pmdp = pmd_offset(pgd, addr); 90 pmd_t pmd = *pmdp;
87 91
88 pmd = *pmdp;
89 if (!pmd_none(pmd)) { 92 if (!pmd_none(pmd)) {
90 /* 93 /*
91 * Clear the PMD from the page table, and 94 * Clear the PMD from the page table, and
@@ -104,8 +107,8 @@ static void unmap_area_sections(unsigned long virt, unsigned long size)
104 pte_free_kernel(&init_mm, pmd_page_vaddr(pmd)); 107 pte_free_kernel(&init_mm, pmd_page_vaddr(pmd));
105 } 108 }
106 109
107 addr += PGDIR_SIZE; 110 addr += PMD_SIZE;
108 pgd++; 111 pmdp += 2;
109 } while (addr < end); 112 } while (addr < end);
110 113
111 /* 114 /*
@@ -124,6 +127,8 @@ remap_area_sections(unsigned long virt, unsigned long pfn,
124{ 127{
125 unsigned long addr = virt, end = virt + size; 128 unsigned long addr = virt, end = virt + size;
126 pgd_t *pgd; 129 pgd_t *pgd;
130 pud_t *pud;
131 pmd_t *pmd;
127 132
128 /* 133 /*
129 * Remove and free any PTE-based mapping, and 134 * Remove and free any PTE-based mapping, and
@@ -132,17 +137,17 @@ remap_area_sections(unsigned long virt, unsigned long pfn,
132 unmap_area_sections(virt, size); 137 unmap_area_sections(virt, size);
133 138
134 pgd = pgd_offset_k(addr); 139 pgd = pgd_offset_k(addr);
140 pud = pud_offset(pgd, addr);
141 pmd = pmd_offset(pud, addr);
135 do { 142 do {
136 pmd_t *pmd = pmd_offset(pgd, addr);
137
138 pmd[0] = __pmd(__pfn_to_phys(pfn) | type->prot_sect); 143 pmd[0] = __pmd(__pfn_to_phys(pfn) | type->prot_sect);
139 pfn += SZ_1M >> PAGE_SHIFT; 144 pfn += SZ_1M >> PAGE_SHIFT;
140 pmd[1] = __pmd(__pfn_to_phys(pfn) | type->prot_sect); 145 pmd[1] = __pmd(__pfn_to_phys(pfn) | type->prot_sect);
141 pfn += SZ_1M >> PAGE_SHIFT; 146 pfn += SZ_1M >> PAGE_SHIFT;
142 flush_pmd_entry(pmd); 147 flush_pmd_entry(pmd);
143 148
144 addr += PGDIR_SIZE; 149 addr += PMD_SIZE;
145 pgd++; 150 pmd += 2;
146 } while (addr < end); 151 } while (addr < end);
147 152
148 return 0; 153 return 0;
@@ -154,6 +159,8 @@ remap_area_supersections(unsigned long virt, unsigned long pfn,
154{ 159{
155 unsigned long addr = virt, end = virt + size; 160 unsigned long addr = virt, end = virt + size;
156 pgd_t *pgd; 161 pgd_t *pgd;
162 pud_t *pud;
163 pmd_t *pmd;
157 164
158 /* 165 /*
159 * Remove and free any PTE-based mapping, and 166 * Remove and free any PTE-based mapping, and
@@ -162,6 +169,8 @@ remap_area_supersections(unsigned long virt, unsigned long pfn,
162 unmap_area_sections(virt, size); 169 unmap_area_sections(virt, size);
163 170
164 pgd = pgd_offset_k(virt); 171 pgd = pgd_offset_k(virt);
172 pud = pud_offset(pgd, addr);
173 pmd = pmd_offset(pud, addr);
165 do { 174 do {
166 unsigned long super_pmd_val, i; 175 unsigned long super_pmd_val, i;
167 176
@@ -170,14 +179,12 @@ remap_area_supersections(unsigned long virt, unsigned long pfn,
170 super_pmd_val |= ((pfn >> (32 - PAGE_SHIFT)) & 0xf) << 20; 179 super_pmd_val |= ((pfn >> (32 - PAGE_SHIFT)) & 0xf) << 20;
171 180
172 for (i = 0; i < 8; i++) { 181 for (i = 0; i < 8; i++) {
173 pmd_t *pmd = pmd_offset(pgd, addr);
174
175 pmd[0] = __pmd(super_pmd_val); 182 pmd[0] = __pmd(super_pmd_val);
176 pmd[1] = __pmd(super_pmd_val); 183 pmd[1] = __pmd(super_pmd_val);
177 flush_pmd_entry(pmd); 184 flush_pmd_entry(pmd);
178 185
179 addr += PGDIR_SIZE; 186 addr += PMD_SIZE;
180 pgd++; 187 pmd += 2;
181 } 188 }
182 189
183 pfn += SUPERSECTION_SIZE >> PAGE_SHIFT; 190 pfn += SUPERSECTION_SIZE >> PAGE_SHIFT;