GNU Linux-libre 4.14.332-gnu1
[releases.git] / arch / arm / mm / nommu.c
1 /*
2  *  linux/arch/arm/mm/nommu.c
3  *
4  * ARM uCLinux supporting functions.
5  */
6 #include <linux/module.h>
7 #include <linux/mm.h>
8 #include <linux/pagemap.h>
9 #include <linux/io.h>
10 #include <linux/memblock.h>
11 #include <linux/kernel.h>
12
13 #include <asm/cacheflush.h>
14 #include <asm/cp15.h>
15 #include <asm/sections.h>
16 #include <asm/page.h>
17 #include <asm/setup.h>
18 #include <asm/traps.h>
19 #include <asm/mach/arch.h>
20 #include <asm/cputype.h>
21 #include <asm/mpu.h>
22 #include <asm/procinfo.h>
23
24 #include "mm.h"
25
26 unsigned long vectors_base;
27
28 /*
29  * empty_zero_page is a special page that is used for
30  * zero-initialized data and COW.
31  */
32 struct page *empty_zero_page;
33 EXPORT_SYMBOL(empty_zero_page);
34
35 #ifdef CONFIG_ARM_MPU
36 struct mpu_rgn_info mpu_rgn_info;
37
38 /* Region number */
39 static void rgnr_write(u32 v)
40 {
41         asm("mcr        p15, 0, %0, c6, c2, 0" : : "r" (v));
42 }
43
44 /* Data-side / unified region attributes */
45
46 /* Region access control register */
47 static void dracr_write(u32 v)
48 {
49         asm("mcr        p15, 0, %0, c6, c1, 4" : : "r" (v));
50 }
51
52 /* Region size register */
53 static void drsr_write(u32 v)
54 {
55         asm("mcr        p15, 0, %0, c6, c1, 2" : : "r" (v));
56 }
57
58 /* Region base address register */
59 static void drbar_write(u32 v)
60 {
61         asm("mcr        p15, 0, %0, c6, c1, 0" : : "r" (v));
62 }
63
64 static u32 drbar_read(void)
65 {
66         u32 v;
67         asm("mrc        p15, 0, %0, c6, c1, 0" : "=r" (v));
68         return v;
69 }
70 /* Optional instruction-side region attributes */
71
72 /* I-side Region access control register */
73 static void iracr_write(u32 v)
74 {
75         asm("mcr        p15, 0, %0, c6, c1, 5" : : "r" (v));
76 }
77
78 /* I-side Region size register */
79 static void irsr_write(u32 v)
80 {
81         asm("mcr        p15, 0, %0, c6, c1, 3" : : "r" (v));
82 }
83
84 /* I-side Region base address register */
85 static void irbar_write(u32 v)
86 {
87         asm("mcr        p15, 0, %0, c6, c1, 1" : : "r" (v));
88 }
89
90 static unsigned long irbar_read(void)
91 {
92         unsigned long v;
93         asm("mrc        p15, 0, %0, c6, c1, 1" : "=r" (v));
94         return v;
95 }
96
97 /* MPU initialisation functions */
98 void __init adjust_lowmem_bounds_mpu(void)
99 {
100         phys_addr_t phys_offset = PHYS_OFFSET;
101         phys_addr_t aligned_region_size, specified_mem_size, rounded_mem_size;
102         struct memblock_region *reg;
103         bool first = true;
104         phys_addr_t mem_start;
105         phys_addr_t mem_end;
106
107         for_each_memblock(memory, reg) {
108                 if (first) {
109                         /*
110                          * Initially only use memory continuous from
111                          * PHYS_OFFSET */
112                         if (reg->base != phys_offset)
113                                 panic("First memory bank must be contiguous from PHYS_OFFSET");
114
115                         mem_start = reg->base;
116                         mem_end = reg->base + reg->size;
117                         specified_mem_size = reg->size;
118                         first = false;
119                 } else {
120                         /*
121                          * memblock auto merges contiguous blocks, remove
122                          * all blocks afterwards in one go (we can't remove
123                          * blocks separately while iterating)
124                          */
125                         pr_notice("Ignoring RAM after %pa, memory at %pa ignored\n",
126                                   &mem_end, &reg->base);
127                         memblock_remove(reg->base, 0 - reg->base);
128                         break;
129                 }
130         }
131
132         /*
133          * MPU has curious alignment requirements: Size must be power of 2, and
134          * region start must be aligned to the region size
135          */
136         if (phys_offset != 0)
137                 pr_info("PHYS_OFFSET != 0 => MPU Region size constrained by alignment requirements\n");
138
139         /*
140          * Maximum aligned region might overflow phys_addr_t if phys_offset is
141          * 0. Hence we keep everything below 4G until we take the smaller of
142          * the aligned_region_size and rounded_mem_size, one of which is
143          * guaranteed to be smaller than the maximum physical address.
144          */
145         aligned_region_size = (phys_offset - 1) ^ (phys_offset);
146         /* Find the max power-of-two sized region that fits inside our bank */
147         rounded_mem_size = (1 <<  __fls(specified_mem_size)) - 1;
148
149         /* The actual region size is the smaller of the two */
150         aligned_region_size = aligned_region_size < rounded_mem_size
151                                 ? aligned_region_size + 1
152                                 : rounded_mem_size + 1;
153
154         if (aligned_region_size != specified_mem_size) {
155                 pr_warn("Truncating memory from %pa to %pa (MPU region constraints)",
156                                 &specified_mem_size, &aligned_region_size);
157                 memblock_remove(mem_start + aligned_region_size,
158                                 specified_mem_size - aligned_region_size);
159
160                 mem_end = mem_start + aligned_region_size;
161         }
162
163         pr_debug("MPU Region from %pa size %pa (end %pa))\n",
164                 &phys_offset, &aligned_region_size, &mem_end);
165
166 }
167
168 static int mpu_present(void)
169 {
170         return ((read_cpuid_ext(CPUID_EXT_MMFR0) & MMFR0_PMSA) == MMFR0_PMSAv7);
171 }
172
173 static int mpu_max_regions(void)
174 {
175         /*
176          * We don't support a different number of I/D side regions so if we
177          * have separate instruction and data memory maps then return
178          * whichever side has a smaller number of supported regions.
179          */
180         u32 dregions, iregions, mpuir;
181         mpuir = read_cpuid(CPUID_MPUIR);
182
183         dregions = iregions = (mpuir & MPUIR_DREGION_SZMASK) >> MPUIR_DREGION;
184
185         /* Check for separate d-side and i-side memory maps */
186         if (mpuir & MPUIR_nU)
187                 iregions = (mpuir & MPUIR_IREGION_SZMASK) >> MPUIR_IREGION;
188
189         /* Use the smallest of the two maxima */
190         return min(dregions, iregions);
191 }
192
193 static int mpu_iside_independent(void)
194 {
195         /* MPUIR.nU specifies whether there is *not* a unified memory map */
196         return read_cpuid(CPUID_MPUIR) & MPUIR_nU;
197 }
198
199 static int mpu_min_region_order(void)
200 {
201         u32 drbar_result, irbar_result;
202         /* We've kept a region free for this probing */
203         rgnr_write(MPU_PROBE_REGION);
204         isb();
205         /*
206          * As per ARM ARM, write 0xFFFFFFFC to DRBAR to find the minimum
207          * region order
208         */
209         drbar_write(0xFFFFFFFC);
210         drbar_result = irbar_result = drbar_read();
211         drbar_write(0x0);
212         /* If the MPU is non-unified, we use the larger of the two minima*/
213         if (mpu_iside_independent()) {
214                 irbar_write(0xFFFFFFFC);
215                 irbar_result = irbar_read();
216                 irbar_write(0x0);
217         }
218         isb(); /* Ensure that MPU region operations have completed */
219         /* Return whichever result is larger */
220         return __ffs(max(drbar_result, irbar_result));
221 }
222
223 static int mpu_setup_region(unsigned int number, phys_addr_t start,
224                         unsigned int size_order, unsigned int properties)
225 {
226         u32 size_data;
227
228         /* We kept a region free for probing resolution of MPU regions*/
229         if (number > mpu_max_regions() || number == MPU_PROBE_REGION)
230                 return -ENOENT;
231
232         if (size_order > 32)
233                 return -ENOMEM;
234
235         if (size_order < mpu_min_region_order())
236                 return -ENOMEM;
237
238         /* Writing N to bits 5:1 (RSR_SZ)  specifies region size 2^N+1 */
239         size_data = ((size_order - 1) << MPU_RSR_SZ) | 1 << MPU_RSR_EN;
240
241         dsb(); /* Ensure all previous data accesses occur with old mappings */
242         rgnr_write(number);
243         isb();
244         drbar_write(start);
245         dracr_write(properties);
246         isb(); /* Propagate properties before enabling region */
247         drsr_write(size_data);
248
249         /* Check for independent I-side registers */
250         if (mpu_iside_independent()) {
251                 irbar_write(start);
252                 iracr_write(properties);
253                 isb();
254                 irsr_write(size_data);
255         }
256         isb();
257
258         /* Store region info (we treat i/d side the same, so only store d) */
259         mpu_rgn_info.rgns[number].dracr = properties;
260         mpu_rgn_info.rgns[number].drbar = start;
261         mpu_rgn_info.rgns[number].drsr = size_data;
262         return 0;
263 }
264
265 /*
266 * Set up default MPU regions, doing nothing if there is no MPU
267 */
268 void __init mpu_setup(void)
269 {
270         int region_err;
271         if (!mpu_present())
272                 return;
273
274         region_err = mpu_setup_region(MPU_RAM_REGION, PHYS_OFFSET,
275                                         ilog2(memblock.memory.regions[0].size),
276                                         MPU_AP_PL1RW_PL0RW | MPU_RGN_NORMAL);
277         if (region_err) {
278                 panic("MPU region initialization failure! %d", region_err);
279         } else {
280                 pr_info("Using ARMv7 PMSA Compliant MPU. "
281                          "Region independence: %s, Max regions: %d\n",
282                         mpu_iside_independent() ? "Yes" : "No",
283                         mpu_max_regions());
284         }
285 }
286 #else
287 static void adjust_lowmem_bounds_mpu(void) {}
288 static void __init mpu_setup(void) {}
289 #endif /* CONFIG_ARM_MPU */
290
291 #ifdef CONFIG_CPU_CP15
292 #ifdef CONFIG_CPU_HIGH_VECTOR
293 static unsigned long __init setup_vectors_base(void)
294 {
295         unsigned long reg = get_cr();
296
297         set_cr(reg | CR_V);
298         return 0xffff0000;
299 }
300 #else /* CONFIG_CPU_HIGH_VECTOR */
301 /* Write exception base address to VBAR */
302 static inline void set_vbar(unsigned long val)
303 {
304         asm("mcr p15, 0, %0, c12, c0, 0" : : "r" (val) : "cc");
305 }
306
307 /*
308  * Security extensions, bits[7:4], permitted values,
309  * 0b0000 - not implemented, 0b0001/0b0010 - implemented
310  */
311 static inline bool security_extensions_enabled(void)
312 {
313         /* Check CPUID Identification Scheme before ID_PFR1 read */
314         if ((read_cpuid_id() & 0x000f0000) == 0x000f0000)
315                 return !!cpuid_feature_extract(CPUID_EXT_PFR1, 4);
316         return 0;
317 }
318
319 static unsigned long __init setup_vectors_base(void)
320 {
321         unsigned long base = 0, reg = get_cr();
322
323         set_cr(reg & ~CR_V);
324         if (security_extensions_enabled()) {
325                 if (IS_ENABLED(CONFIG_REMAP_VECTORS_TO_RAM))
326                         base = CONFIG_DRAM_BASE;
327                 set_vbar(base);
328         } else if (IS_ENABLED(CONFIG_REMAP_VECTORS_TO_RAM)) {
329                 if (CONFIG_DRAM_BASE != 0)
330                         pr_err("Security extensions not enabled, vectors cannot be remapped to RAM, vectors base will be 0x00000000\n");
331         }
332
333         return base;
334 }
335 #endif /* CONFIG_CPU_HIGH_VECTOR */
336 #endif /* CONFIG_CPU_CP15 */
337
338 void __init arm_mm_memblock_reserve(void)
339 {
340 #ifndef CONFIG_CPU_V7M
341         vectors_base = IS_ENABLED(CONFIG_CPU_CP15) ? setup_vectors_base() : 0;
342         /*
343          * Register the exception vector page.
344          * some architectures which the DRAM is the exception vector to trap,
345          * alloc_page breaks with error, although it is not NULL, but "0."
346          */
347         memblock_reserve(vectors_base, 2 * PAGE_SIZE);
348 #else /* ifndef CONFIG_CPU_V7M */
349         /*
350          * There is no dedicated vector page on V7-M. So nothing needs to be
351          * reserved here.
352          */
353 #endif
354         /*
355          * In any case, always ensure address 0 is never used as many things
356          * get very confused if 0 is returned as a legitimate address.
357          */
358         memblock_reserve(0, 1);
359 }
360
361 void __init adjust_lowmem_bounds(void)
362 {
363         phys_addr_t end;
364         adjust_lowmem_bounds_mpu();
365         end = memblock_end_of_DRAM();
366         high_memory = __va(end - 1) + 1;
367         memblock_set_current_limit(end);
368 }
369
370 /*
371  * paging_init() sets up the page tables, initialises the zone memory
372  * maps, and sets up the zero page, bad page and bad page tables.
373  */
374 void __init paging_init(const struct machine_desc *mdesc)
375 {
376         void *zero_page;
377
378         early_trap_init((void *)vectors_base);
379         mpu_setup();
380
381         /* allocate the zero page. */
382         zero_page = (void *)memblock_alloc(PAGE_SIZE, PAGE_SIZE);
383         if (!zero_page)
384                 panic("%s: Failed to allocate %lu bytes align=0x%lx\n",
385                       __func__, PAGE_SIZE, PAGE_SIZE);
386
387         bootmem_init();
388
389         empty_zero_page = virt_to_page(zero_page);
390         flush_dcache_page(empty_zero_page);
391 }
392
393 /*
394  * We don't need to do anything here for nommu machines.
395  */
396 void setup_mm_for_reboot(void)
397 {
398 }
399
400 void flush_dcache_page(struct page *page)
401 {
402         __cpuc_flush_dcache_area(page_address(page), PAGE_SIZE);
403 }
404 EXPORT_SYMBOL(flush_dcache_page);
405
406 void flush_kernel_dcache_page(struct page *page)
407 {
408         __cpuc_flush_dcache_area(page_address(page), PAGE_SIZE);
409 }
410 EXPORT_SYMBOL(flush_kernel_dcache_page);
411
412 void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
413                        unsigned long uaddr, void *dst, const void *src,
414                        unsigned long len)
415 {
416         memcpy(dst, src, len);
417         if (vma->vm_flags & VM_EXEC)
418                 __cpuc_coherent_user_range(uaddr, uaddr + len);
419 }
420
421 void __iomem *__arm_ioremap_pfn(unsigned long pfn, unsigned long offset,
422                                 size_t size, unsigned int mtype)
423 {
424         if (pfn >= (0x100000000ULL >> PAGE_SHIFT))
425                 return NULL;
426         return (void __iomem *) (offset + (pfn << PAGE_SHIFT));
427 }
428 EXPORT_SYMBOL(__arm_ioremap_pfn);
429
430 void __iomem *__arm_ioremap_caller(phys_addr_t phys_addr, size_t size,
431                                    unsigned int mtype, void *caller)
432 {
433         return (void __iomem *)phys_addr;
434 }
435
436 void __iomem * (*arch_ioremap_caller)(phys_addr_t, size_t, unsigned int, void *);
437
438 void __iomem *ioremap(resource_size_t res_cookie, size_t size)
439 {
440         return __arm_ioremap_caller(res_cookie, size, MT_DEVICE,
441                                     __builtin_return_address(0));
442 }
443 EXPORT_SYMBOL(ioremap);
444
445 void __iomem *ioremap_cache(resource_size_t res_cookie, size_t size)
446         __alias(ioremap_cached);
447
448 void __iomem *ioremap_cached(resource_size_t res_cookie, size_t size)
449 {
450         return __arm_ioremap_caller(res_cookie, size, MT_DEVICE_CACHED,
451                                     __builtin_return_address(0));
452 }
453 EXPORT_SYMBOL(ioremap_cache);
454 EXPORT_SYMBOL(ioremap_cached);
455
456 void __iomem *ioremap_wc(resource_size_t res_cookie, size_t size)
457 {
458         return __arm_ioremap_caller(res_cookie, size, MT_DEVICE_WC,
459                                     __builtin_return_address(0));
460 }
461 EXPORT_SYMBOL(ioremap_wc);
462
463 #ifdef CONFIG_PCI
464
465 #include <asm/mach/map.h>
466
467 void __iomem *pci_remap_cfgspace(resource_size_t res_cookie, size_t size)
468 {
469         return arch_ioremap_caller(res_cookie, size, MT_UNCACHED,
470                                    __builtin_return_address(0));
471 }
472 EXPORT_SYMBOL_GPL(pci_remap_cfgspace);
473 #endif
474
475 void *arch_memremap_wb(phys_addr_t phys_addr, size_t size)
476 {
477         return (void *)phys_addr;
478 }
479
480 void __iounmap(volatile void __iomem *addr)
481 {
482 }
483 EXPORT_SYMBOL(__iounmap);
484
485 void (*arch_iounmap)(volatile void __iomem *);
486
487 void iounmap(volatile void __iomem *addr)
488 {
489 }
490 EXPORT_SYMBOL(iounmap);