xref: /openbmc/linux/arch/s390/mm/vmem.c (revision d8bcaabe)
1 /*
2  *    Copyright IBM Corp. 2006
3  *    Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>
4  */
5 
6 #include <linux/bootmem.h>
7 #include <linux/pfn.h>
8 #include <linux/mm.h>
9 #include <linux/init.h>
10 #include <linux/list.h>
11 #include <linux/hugetlb.h>
12 #include <linux/slab.h>
13 #include <linux/memblock.h>
14 #include <asm/cacheflush.h>
15 #include <asm/pgalloc.h>
16 #include <asm/pgtable.h>
17 #include <asm/setup.h>
18 #include <asm/tlbflush.h>
19 #include <asm/sections.h>
20 #include <asm/set_memory.h>
21 
22 static DEFINE_MUTEX(vmem_mutex);
23 
24 struct memory_segment {
25 	struct list_head list;
26 	unsigned long start;
27 	unsigned long size;
28 };
29 
30 static LIST_HEAD(mem_segs);
31 
32 static void __ref *vmem_alloc_pages(unsigned int order)
33 {
34 	unsigned long size = PAGE_SIZE << order;
35 
36 	if (slab_is_available())
37 		return (void *)__get_free_pages(GFP_KERNEL, order);
38 	return (void *) memblock_alloc(size, size);
39 }
40 
41 void *vmem_crst_alloc(unsigned long val)
42 {
43 	unsigned long *table;
44 
45 	table = vmem_alloc_pages(CRST_ALLOC_ORDER);
46 	if (table)
47 		crst_table_init(table, val);
48 	return table;
49 }
50 
51 pte_t __ref *vmem_pte_alloc(void)
52 {
53 	unsigned long size = PTRS_PER_PTE * sizeof(pte_t);
54 	pte_t *pte;
55 
56 	if (slab_is_available())
57 		pte = (pte_t *) page_table_alloc(&init_mm);
58 	else
59 		pte = (pte_t *) memblock_alloc(size, size);
60 	if (!pte)
61 		return NULL;
62 	clear_table((unsigned long *) pte, _PAGE_INVALID, size);
63 	return pte;
64 }
65 
66 /*
67  * Add a physical memory range to the 1:1 mapping.
68  */
69 static int vmem_add_mem(unsigned long start, unsigned long size)
70 {
71 	unsigned long pgt_prot, sgt_prot, r3_prot;
72 	unsigned long pages4k, pages1m, pages2g;
73 	unsigned long end = start + size;
74 	unsigned long address = start;
75 	pgd_t *pg_dir;
76 	p4d_t *p4_dir;
77 	pud_t *pu_dir;
78 	pmd_t *pm_dir;
79 	pte_t *pt_dir;
80 	int ret = -ENOMEM;
81 
82 	pgt_prot = pgprot_val(PAGE_KERNEL);
83 	sgt_prot = pgprot_val(SEGMENT_KERNEL);
84 	r3_prot = pgprot_val(REGION3_KERNEL);
85 	if (!MACHINE_HAS_NX) {
86 		pgt_prot &= ~_PAGE_NOEXEC;
87 		sgt_prot &= ~_SEGMENT_ENTRY_NOEXEC;
88 		r3_prot &= ~_REGION_ENTRY_NOEXEC;
89 	}
90 	pages4k = pages1m = pages2g = 0;
91 	while (address < end) {
92 		pg_dir = pgd_offset_k(address);
93 		if (pgd_none(*pg_dir)) {
94 			p4_dir = vmem_crst_alloc(_REGION2_ENTRY_EMPTY);
95 			if (!p4_dir)
96 				goto out;
97 			pgd_populate(&init_mm, pg_dir, p4_dir);
98 		}
99 		p4_dir = p4d_offset(pg_dir, address);
100 		if (p4d_none(*p4_dir)) {
101 			pu_dir = vmem_crst_alloc(_REGION3_ENTRY_EMPTY);
102 			if (!pu_dir)
103 				goto out;
104 			p4d_populate(&init_mm, p4_dir, pu_dir);
105 		}
106 		pu_dir = pud_offset(p4_dir, address);
107 		if (MACHINE_HAS_EDAT2 && pud_none(*pu_dir) && address &&
108 		    !(address & ~PUD_MASK) && (address + PUD_SIZE <= end) &&
109 		     !debug_pagealloc_enabled()) {
110 			pud_val(*pu_dir) = address | r3_prot;
111 			address += PUD_SIZE;
112 			pages2g++;
113 			continue;
114 		}
115 		if (pud_none(*pu_dir)) {
116 			pm_dir = vmem_crst_alloc(_SEGMENT_ENTRY_EMPTY);
117 			if (!pm_dir)
118 				goto out;
119 			pud_populate(&init_mm, pu_dir, pm_dir);
120 		}
121 		pm_dir = pmd_offset(pu_dir, address);
122 		if (MACHINE_HAS_EDAT1 && pmd_none(*pm_dir) && address &&
123 		    !(address & ~PMD_MASK) && (address + PMD_SIZE <= end) &&
124 		    !debug_pagealloc_enabled()) {
125 			pmd_val(*pm_dir) = address | sgt_prot;
126 			address += PMD_SIZE;
127 			pages1m++;
128 			continue;
129 		}
130 		if (pmd_none(*pm_dir)) {
131 			pt_dir = vmem_pte_alloc();
132 			if (!pt_dir)
133 				goto out;
134 			pmd_populate(&init_mm, pm_dir, pt_dir);
135 		}
136 
137 		pt_dir = pte_offset_kernel(pm_dir, address);
138 		pte_val(*pt_dir) = address | pgt_prot;
139 		address += PAGE_SIZE;
140 		pages4k++;
141 	}
142 	ret = 0;
143 out:
144 	update_page_count(PG_DIRECT_MAP_4K, pages4k);
145 	update_page_count(PG_DIRECT_MAP_1M, pages1m);
146 	update_page_count(PG_DIRECT_MAP_2G, pages2g);
147 	return ret;
148 }
149 
150 /*
151  * Remove a physical memory range from the 1:1 mapping.
152  * Currently only invalidates page table entries.
153  */
154 static void vmem_remove_range(unsigned long start, unsigned long size)
155 {
156 	unsigned long pages4k, pages1m, pages2g;
157 	unsigned long end = start + size;
158 	unsigned long address = start;
159 	pgd_t *pg_dir;
160 	p4d_t *p4_dir;
161 	pud_t *pu_dir;
162 	pmd_t *pm_dir;
163 	pte_t *pt_dir;
164 
165 	pages4k = pages1m = pages2g = 0;
166 	while (address < end) {
167 		pg_dir = pgd_offset_k(address);
168 		if (pgd_none(*pg_dir)) {
169 			address += PGDIR_SIZE;
170 			continue;
171 		}
172 		p4_dir = p4d_offset(pg_dir, address);
173 		if (p4d_none(*p4_dir)) {
174 			address += P4D_SIZE;
175 			continue;
176 		}
177 		pu_dir = pud_offset(p4_dir, address);
178 		if (pud_none(*pu_dir)) {
179 			address += PUD_SIZE;
180 			continue;
181 		}
182 		if (pud_large(*pu_dir)) {
183 			pud_clear(pu_dir);
184 			address += PUD_SIZE;
185 			pages2g++;
186 			continue;
187 		}
188 		pm_dir = pmd_offset(pu_dir, address);
189 		if (pmd_none(*pm_dir)) {
190 			address += PMD_SIZE;
191 			continue;
192 		}
193 		if (pmd_large(*pm_dir)) {
194 			pmd_clear(pm_dir);
195 			address += PMD_SIZE;
196 			pages1m++;
197 			continue;
198 		}
199 		pt_dir = pte_offset_kernel(pm_dir, address);
200 		pte_clear(&init_mm, address, pt_dir);
201 		address += PAGE_SIZE;
202 		pages4k++;
203 	}
204 	flush_tlb_kernel_range(start, end);
205 	update_page_count(PG_DIRECT_MAP_4K, -pages4k);
206 	update_page_count(PG_DIRECT_MAP_1M, -pages1m);
207 	update_page_count(PG_DIRECT_MAP_2G, -pages2g);
208 }
209 
210 /*
211  * Add a backed mem_map array to the virtual mem_map array.
212  */
213 int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
214 {
215 	unsigned long pgt_prot, sgt_prot;
216 	unsigned long address = start;
217 	pgd_t *pg_dir;
218 	p4d_t *p4_dir;
219 	pud_t *pu_dir;
220 	pmd_t *pm_dir;
221 	pte_t *pt_dir;
222 	int ret = -ENOMEM;
223 
224 	pgt_prot = pgprot_val(PAGE_KERNEL);
225 	sgt_prot = pgprot_val(SEGMENT_KERNEL);
226 	if (!MACHINE_HAS_NX) {
227 		pgt_prot &= ~_PAGE_NOEXEC;
228 		sgt_prot &= ~_SEGMENT_ENTRY_NOEXEC;
229 	}
230 	for (address = start; address < end;) {
231 		pg_dir = pgd_offset_k(address);
232 		if (pgd_none(*pg_dir)) {
233 			p4_dir = vmem_crst_alloc(_REGION2_ENTRY_EMPTY);
234 			if (!p4_dir)
235 				goto out;
236 			pgd_populate(&init_mm, pg_dir, p4_dir);
237 		}
238 
239 		p4_dir = p4d_offset(pg_dir, address);
240 		if (p4d_none(*p4_dir)) {
241 			pu_dir = vmem_crst_alloc(_REGION3_ENTRY_EMPTY);
242 			if (!pu_dir)
243 				goto out;
244 			p4d_populate(&init_mm, p4_dir, pu_dir);
245 		}
246 
247 		pu_dir = pud_offset(p4_dir, address);
248 		if (pud_none(*pu_dir)) {
249 			pm_dir = vmem_crst_alloc(_SEGMENT_ENTRY_EMPTY);
250 			if (!pm_dir)
251 				goto out;
252 			pud_populate(&init_mm, pu_dir, pm_dir);
253 		}
254 
255 		pm_dir = pmd_offset(pu_dir, address);
256 		if (pmd_none(*pm_dir)) {
257 			/* Use 1MB frames for vmemmap if available. We always
258 			 * use large frames even if they are only partially
259 			 * used.
260 			 * Otherwise we would have also page tables since
261 			 * vmemmap_populate gets called for each section
262 			 * separately. */
263 			if (MACHINE_HAS_EDAT1) {
264 				void *new_page;
265 
266 				new_page = vmemmap_alloc_block(PMD_SIZE, node);
267 				if (!new_page)
268 					goto out;
269 				pmd_val(*pm_dir) = __pa(new_page) | sgt_prot;
270 				address = (address + PMD_SIZE) & PMD_MASK;
271 				continue;
272 			}
273 			pt_dir = vmem_pte_alloc();
274 			if (!pt_dir)
275 				goto out;
276 			pmd_populate(&init_mm, pm_dir, pt_dir);
277 		} else if (pmd_large(*pm_dir)) {
278 			address = (address + PMD_SIZE) & PMD_MASK;
279 			continue;
280 		}
281 
282 		pt_dir = pte_offset_kernel(pm_dir, address);
283 		if (pte_none(*pt_dir)) {
284 			void *new_page;
285 
286 			new_page = vmemmap_alloc_block(PAGE_SIZE, node);
287 			if (!new_page)
288 				goto out;
289 			pte_val(*pt_dir) = __pa(new_page) | pgt_prot;
290 		}
291 		address += PAGE_SIZE;
292 	}
293 	ret = 0;
294 out:
295 	return ret;
296 }
297 
298 void vmemmap_free(unsigned long start, unsigned long end)
299 {
300 }
301 
302 /*
303  * Add memory segment to the segment list if it doesn't overlap with
304  * an already present segment.
305  */
306 static int insert_memory_segment(struct memory_segment *seg)
307 {
308 	struct memory_segment *tmp;
309 
310 	if (seg->start + seg->size > VMEM_MAX_PHYS ||
311 	    seg->start + seg->size < seg->start)
312 		return -ERANGE;
313 
314 	list_for_each_entry(tmp, &mem_segs, list) {
315 		if (seg->start >= tmp->start + tmp->size)
316 			continue;
317 		if (seg->start + seg->size <= tmp->start)
318 			continue;
319 		return -ENOSPC;
320 	}
321 	list_add(&seg->list, &mem_segs);
322 	return 0;
323 }
324 
325 /*
326  * Remove memory segment from the segment list.
327  */
328 static void remove_memory_segment(struct memory_segment *seg)
329 {
330 	list_del(&seg->list);
331 }
332 
333 static void __remove_shared_memory(struct memory_segment *seg)
334 {
335 	remove_memory_segment(seg);
336 	vmem_remove_range(seg->start, seg->size);
337 }
338 
339 int vmem_remove_mapping(unsigned long start, unsigned long size)
340 {
341 	struct memory_segment *seg;
342 	int ret;
343 
344 	mutex_lock(&vmem_mutex);
345 
346 	ret = -ENOENT;
347 	list_for_each_entry(seg, &mem_segs, list) {
348 		if (seg->start == start && seg->size == size)
349 			break;
350 	}
351 
352 	if (seg->start != start || seg->size != size)
353 		goto out;
354 
355 	ret = 0;
356 	__remove_shared_memory(seg);
357 	kfree(seg);
358 out:
359 	mutex_unlock(&vmem_mutex);
360 	return ret;
361 }
362 
363 int vmem_add_mapping(unsigned long start, unsigned long size)
364 {
365 	struct memory_segment *seg;
366 	int ret;
367 
368 	mutex_lock(&vmem_mutex);
369 	ret = -ENOMEM;
370 	seg = kzalloc(sizeof(*seg), GFP_KERNEL);
371 	if (!seg)
372 		goto out;
373 	seg->start = start;
374 	seg->size = size;
375 
376 	ret = insert_memory_segment(seg);
377 	if (ret)
378 		goto out_free;
379 
380 	ret = vmem_add_mem(start, size);
381 	if (ret)
382 		goto out_remove;
383 	goto out;
384 
385 out_remove:
386 	__remove_shared_memory(seg);
387 out_free:
388 	kfree(seg);
389 out:
390 	mutex_unlock(&vmem_mutex);
391 	return ret;
392 }
393 
394 /*
395  * map whole physical memory to virtual memory (identity mapping)
396  * we reserve enough space in the vmalloc area for vmemmap to hotplug
397  * additional memory segments.
398  */
399 void __init vmem_map_init(void)
400 {
401 	struct memblock_region *reg;
402 
403 	for_each_memblock(memory, reg)
404 		vmem_add_mem(reg->base, reg->size);
405 	__set_memory((unsigned long) _stext,
406 		     (_etext - _stext) >> PAGE_SHIFT,
407 		     SET_MEMORY_RO | SET_MEMORY_X);
408 	__set_memory((unsigned long) _etext,
409 		     (_eshared - _etext) >> PAGE_SHIFT,
410 		     SET_MEMORY_RO);
411 	__set_memory((unsigned long) _sinittext,
412 		     (_einittext - _sinittext) >> PAGE_SHIFT,
413 		     SET_MEMORY_RO | SET_MEMORY_X);
414 	pr_info("Write protected kernel read-only data: %luk\n",
415 		(_eshared - _stext) >> 10);
416 }
417 
418 /*
419  * Convert memblock.memory  to a memory segment list so there is a single
420  * list that contains all memory segments.
421  */
422 static int __init vmem_convert_memory_chunk(void)
423 {
424 	struct memblock_region *reg;
425 	struct memory_segment *seg;
426 
427 	mutex_lock(&vmem_mutex);
428 	for_each_memblock(memory, reg) {
429 		seg = kzalloc(sizeof(*seg), GFP_KERNEL);
430 		if (!seg)
431 			panic("Out of memory...\n");
432 		seg->start = reg->base;
433 		seg->size = reg->size;
434 		insert_memory_segment(seg);
435 	}
436 	mutex_unlock(&vmem_mutex);
437 	return 0;
438 }
439 
440 core_initcall(vmem_convert_memory_chunk);
441