Commit | Line | Data |
---|---|---|
23d17421 | 1 | /* |
155af2f9 HJP |
2 | * Copyright IBM Corp. 2008, 2009 |
3 | * | |
4 | * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com> | |
23d17421 HC |
5 | */ |
6 | ||
7 | #include <linux/kernel.h> | |
8 | #include <linux/module.h> | |
50be6345 PH |
9 | #include <linux/memblock.h> |
10 | #include <linux/init.h> | |
11 | #include <linux/debugfs.h> | |
12 | #include <linux/seq_file.h> | |
23d17421 HC |
13 | #include <asm/ipl.h> |
14 | #include <asm/sclp.h> | |
15 | #include <asm/setup.h> | |
16 | ||
50be6345 PH |
17 | #define CHUNK_READ_WRITE 0 |
18 | #define CHUNK_READ_ONLY 1 | |
19 | ||
20 | static inline void memblock_physmem_add(phys_addr_t start, phys_addr_t size) | |
21 | { | |
22 | memblock_add_range(&memblock.memory, start, size, 0, 0); | |
23 | memblock_add_range(&memblock.physmem, start, size, 0, 0); | |
24 | } | |
25 | ||
26 | void __init detect_memory_memblock(void) | |
23d17421 | 27 | { |
423d5b36 | 28 | unsigned long memsize, rnmax, rzm, addr, size; |
50be6345 | 29 | int type; |
23d17421 | 30 | |
37c5f6c8 DH |
31 | rzm = sclp.rzm; |
32 | rnmax = sclp.rnmax; | |
23d17421 HC |
33 | memsize = rzm * rnmax; |
34 | if (!rzm) | |
423d5b36 | 35 | rzm = 1UL << 17; |
50be6345 PH |
36 | max_physmem_end = memsize; |
37 | addr = 0; | |
38 | /* keep memblock lists close to the kernel */ | |
39 | memblock_set_bottom_up(true); | |
23d17421 HC |
40 | do { |
41 | size = 0; | |
42 | type = tprot(addr); | |
43 | do { | |
44 | size += rzm; | |
50be6345 | 45 | if (max_physmem_end && addr + size >= max_physmem_end) |
23d17421 HC |
46 | break; |
47 | } while (type == tprot(addr + size)); | |
48 | if (type == CHUNK_READ_WRITE || type == CHUNK_READ_ONLY) { | |
50be6345 PH |
49 | if (max_physmem_end && (addr + size > max_physmem_end)) |
50 | size = max_physmem_end - addr; | |
51 | memblock_physmem_add(addr, size); | |
23d17421 HC |
52 | } |
53 | addr += size; | |
50be6345 PH |
54 | } while (addr < max_physmem_end); |
55 | memblock_set_bottom_up(false); | |
56 | if (!max_physmem_end) | |
57 | max_physmem_end = memblock_end_of_DRAM(); | |
60a0c68d | 58 | } |