summaryrefslogtreecommitdiffstats
path: root/lib/ioremap.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ioremap.c')
-rw-r--r--lib/ioremap.c28
1 files changed, 12 insertions, 16 deletions
diff --git a/lib/ioremap.c b/lib/ioremap.c
index 6c72764af19c..10d7c5485c39 100644
--- a/lib/ioremap.c
+++ b/lib/ioremap.c
@@ -101,19 +101,18 @@ static inline int ioremap_pmd_range(pud_t *pud, unsigned long addr,
101 pmd_t *pmd; 101 pmd_t *pmd;
102 unsigned long next; 102 unsigned long next;
103 103
104 phys_addr -= addr;
105 pmd = pmd_alloc(&init_mm, pud, addr); 104 pmd = pmd_alloc(&init_mm, pud, addr);
106 if (!pmd) 105 if (!pmd)
107 return -ENOMEM; 106 return -ENOMEM;
108 do { 107 do {
109 next = pmd_addr_end(addr, end); 108 next = pmd_addr_end(addr, end);
110 109
111 if (ioremap_try_huge_pmd(pmd, addr, next, phys_addr + addr, prot)) 110 if (ioremap_try_huge_pmd(pmd, addr, next, phys_addr, prot))
112 continue; 111 continue;
113 112
114 if (ioremap_pte_range(pmd, addr, next, phys_addr + addr, prot)) 113 if (ioremap_pte_range(pmd, addr, next, phys_addr, prot))
115 return -ENOMEM; 114 return -ENOMEM;
116 } while (pmd++, addr = next, addr != end); 115 } while (pmd++, phys_addr += (next - addr), addr = next, addr != end);
117 return 0; 116 return 0;
118} 117}
119 118
@@ -142,19 +141,18 @@ static inline int ioremap_pud_range(p4d_t *p4d, unsigned long addr,
142 pud_t *pud; 141 pud_t *pud;
143 unsigned long next; 142 unsigned long next;
144 143
145 phys_addr -= addr;
146 pud = pud_alloc(&init_mm, p4d, addr); 144 pud = pud_alloc(&init_mm, p4d, addr);
147 if (!pud) 145 if (!pud)
148 return -ENOMEM; 146 return -ENOMEM;
149 do { 147 do {
150 next = pud_addr_end(addr, end); 148 next = pud_addr_end(addr, end);
151 149
152 if (ioremap_try_huge_pud(pud, addr, next, phys_addr + addr, prot)) 150 if (ioremap_try_huge_pud(pud, addr, next, phys_addr, prot))
153 continue; 151 continue;
154 152
155 if (ioremap_pmd_range(pud, addr, next, phys_addr + addr, prot)) 153 if (ioremap_pmd_range(pud, addr, next, phys_addr, prot))
156 return -ENOMEM; 154 return -ENOMEM;
157 } while (pud++, addr = next, addr != end); 155 } while (pud++, phys_addr += (next - addr), addr = next, addr != end);
158 return 0; 156 return 0;
159} 157}
160 158
@@ -164,7 +162,6 @@ static inline int ioremap_p4d_range(pgd_t *pgd, unsigned long addr,
164 p4d_t *p4d; 162 p4d_t *p4d;
165 unsigned long next; 163 unsigned long next;
166 164
167 phys_addr -= addr;
168 p4d = p4d_alloc(&init_mm, pgd, addr); 165 p4d = p4d_alloc(&init_mm, pgd, addr);
169 if (!p4d) 166 if (!p4d)
170 return -ENOMEM; 167 return -ENOMEM;
@@ -173,14 +170,14 @@ static inline int ioremap_p4d_range(pgd_t *pgd, unsigned long addr,
173 170
174 if (ioremap_p4d_enabled() && 171 if (ioremap_p4d_enabled() &&
175 ((next - addr) == P4D_SIZE) && 172 ((next - addr) == P4D_SIZE) &&
176 IS_ALIGNED(phys_addr + addr, P4D_SIZE)) { 173 IS_ALIGNED(phys_addr, P4D_SIZE)) {
177 if (p4d_set_huge(p4d, phys_addr + addr, prot)) 174 if (p4d_set_huge(p4d, phys_addr, prot))
178 continue; 175 continue;
179 } 176 }
180 177
181 if (ioremap_pud_range(p4d, addr, next, phys_addr + addr, prot)) 178 if (ioremap_pud_range(p4d, addr, next, phys_addr, prot))
182 return -ENOMEM; 179 return -ENOMEM;
183 } while (p4d++, addr = next, addr != end); 180 } while (p4d++, phys_addr += (next - addr), addr = next, addr != end);
184 return 0; 181 return 0;
185} 182}
186 183
@@ -196,14 +193,13 @@ int ioremap_page_range(unsigned long addr,
196 BUG_ON(addr >= end); 193 BUG_ON(addr >= end);
197 194
198 start = addr; 195 start = addr;
199 phys_addr -= addr;
200 pgd = pgd_offset_k(addr); 196 pgd = pgd_offset_k(addr);
201 do { 197 do {
202 next = pgd_addr_end(addr, end); 198 next = pgd_addr_end(addr, end);
203 err = ioremap_p4d_range(pgd, addr, next, phys_addr+addr, prot); 199 err = ioremap_p4d_range(pgd, addr, next, phys_addr, prot);
204 if (err) 200 if (err)
205 break; 201 break;
206 } while (pgd++, addr = next, addr != end); 202 } while (pgd++, phys_addr += (next - addr), addr = next, addr != end);
207 203
208 flush_cache_vmap(start, end); 204 flush_cache_vmap(start, end);
209 205