diff options
Diffstat (limited to 'lib/ioremap.c')
-rw-r--r-- | lib/ioremap.c | 28 |
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 | ||