Lines Matching +full:memory +full:- +full:region

19 struct region {  struct
25 static struct region __initdata mem[MPU_MAX_REGIONS]; argument
27 static struct region __initdata xip[MPU_MAX_REGIONS];
46 /* Region number */
52 /* Data-side / unified region attributes */
54 /* Region access control register */
60 /* Region size register */
66 /* Region base address register */
76 /* Optional instruction-side region attributes */
78 /* I-side Region access control register */
84 /* I-side Region size register */
90 /* I-side Region base address register */
108 /* Data-side / unified region attributes */
110 /* Region access control register */
118 /* Region size register */
126 /* Region base address register */
137 /* ARMv7-M only supports a unified MPU, so I-side operations are nop */
146 static bool __init try_split_region(phys_addr_t base, phys_addr_t size, struct region *region) in try_split_region() argument
149 phys_addr_t abase = base & ~(size - 1); in try_split_region()
150 phys_addr_t asize = base + size - abase; in try_split_region()
157 bdiff = base - abase; in try_split_region()
158 sdiff = p2size - asize; in try_split_region()
177 _set_bit(i, &region->subreg); in try_split_region()
180 _set_bit(PMSAv7_NR_SUBREGS - i, &region->subreg); in try_split_region()
183 region->base = abase; in try_split_region()
184 region->size = p2size; in try_split_region()
190 unsigned int limit, struct region *regions) in allocate_region()
197 /* Try cover region as is (maybe with help of subregions) */ in allocate_region()
201 diff -= size; in allocate_region()
205 * Maximum aligned region might overflow phys_addr_t in allocate_region()
207 * until we take the smaller of the aligned region in allocate_region()
208 * size ("asize") and rounded region size ("p2size"), in allocate_region()
212 phys_addr_t asize = (base - 1) ^ base; in allocate_region()
213 phys_addr_t p2size = (1 << __fls(diff)) - 1; in allocate_region()
224 attempts--; in allocate_region()
241 /* Free-up PMSAv7_PROBE_REGION */ in pmsav7_adjust_lowmem_bounds()
249 /* We need to keep one slot for background region */ in pmsav7_adjust_lowmem_bounds()
250 mem_max_regions--; in pmsav7_adjust_lowmem_bounds()
254 mem_max_regions--; in pmsav7_adjust_lowmem_bounds()
259 num = allocate_region(CONFIG_XIP_PHYS_ADDR, __pa(_exiprom) - CONFIG_XIP_PHYS_ADDR, in pmsav7_adjust_lowmem_bounds()
262 mem_max_regions -= num; in pmsav7_adjust_lowmem_bounds()
270 * Initially only use memory continuous from in pmsav7_adjust_lowmem_bounds()
273 panic("First memory bank must be contiguous from PHYS_OFFSET"); in pmsav7_adjust_lowmem_bounds()
277 specified_mem_size = mem_end - mem_start; in pmsav7_adjust_lowmem_bounds()
284 pr_notice("Ignoring RAM after %pa, memory at %pa ignored\n", in pmsav7_adjust_lowmem_bounds()
286 memblock_remove(reg_start, 0 - reg_start); in pmsav7_adjust_lowmem_bounds()
297 total_mem_size += mem[i].size - subreg * hweight_long(mem[i].subreg); in pmsav7_adjust_lowmem_bounds()
304 pr_warn("Truncating memory from %pa to %pa (MPU region constraints)", in pmsav7_adjust_lowmem_bounds()
307 specified_mem_size - total_mem_size); in pmsav7_adjust_lowmem_bounds()
315 * have separate instruction and data memory maps then return in __mpu_max_regions()
324 /* Check for separate d-side and i-side memory maps */ in __mpu_max_regions()
334 /* MPUIR.nU specifies whether there is *not* a unified memory map */ in mpu_iside_independent()
342 /* We've kept a region free for this probing */ in __mpu_min_region_order()
347 * region order in __mpu_min_region_order()
352 /* If the MPU is non-unified, we use the larger of the two minima*/ in __mpu_min_region_order()
358 isb(); /* Ensure that MPU region operations have completed */ in __mpu_min_region_order()
370 /* We kept a region free for probing resolution of MPU regions*/ in mpu_setup_region()
373 return -ENOENT; in mpu_setup_region()
376 return -ENOMEM; in mpu_setup_region()
379 return -ENOMEM; in mpu_setup_region()
381 /* Writing N to bits 5:1 (RSR_SZ) specifies region size 2^N+1 */ in mpu_setup_region()
382 size_data = ((size_order - 1) << PMSAv7_RSR_SZ) | 1 << PMSAv7_RSR_EN; in mpu_setup_region()
393 isb(); /* Propagate properties before enabling region */ in mpu_setup_region()
396 /* Check for independent I-side registers */ in mpu_setup_region()
405 /* Store region info (we treat i/d side the same, so only store d) */ in mpu_setup_region()
420 int i, region = 0, err = 0; in pmsav7_setup() local
425 err |= mpu_setup_region(region++, 0, 32, in pmsav7_setup()
433 * In case we overwrite RAM region we set earlier in in pmsav7_setup()
434 * head-nommu.S (which is cachable) all subsequent in pmsav7_setup()
436 * with BG region (which is uncachable), thus we need in pmsav7_setup()
439 bool need_flush = region == PMSAv7_RAM_REGION; in pmsav7_setup()
444 err |= mpu_setup_region(region++, xip[i].base, ilog2(xip[i].size), in pmsav7_setup()
455 err |= mpu_setup_region(region++, mem[i].base, ilog2(mem[i].size), in pmsav7_setup()
462 err |= mpu_setup_region(region++, vectors_base, ilog2(2 * PAGE_SIZE), in pmsav7_setup()
467 panic("MPU region initialization failure! %d", err); in pmsav7_setup()
470 "Region independence: %s, Used %d of %d regions\n", in pmsav7_setup()