Rev 659 | Rev 867 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 659 | Rev 843 | ||
---|---|---|---|
Line 27... | Line 27... | ||
27 | */ |
27 | */ |
28 | 28 | ||
29 | #include <arch/mm/memory_init.h> |
29 | #include <arch/mm/memory_init.h> |
30 | #include <genarch/ofw/ofw.h> |
30 | #include <genarch/ofw/ofw.h> |
31 | #include <panic.h> |
31 | #include <panic.h> |
- | 32 | #include <mm/frame.h> |
|
- | 33 | #include <align.h> |
|
32 | 34 | ||
33 | #define MEMMAP_MAX_RECORDS 32 |
35 | #define MEMMAP_MAX_RECORDS 32 |
34 | 36 | ||
35 | typedef struct { |
37 | typedef struct { |
36 | __u32 start; |
38 | __u32 start; |
37 | __u32 size; |
39 | __u32 size; |
38 | } memmap_t; |
40 | } memmap_t; |
39 | 41 | ||
- | 42 | static memmap_t memmap[MEMMAP_MAX_RECORDS]; |
|
- | 43 | size_t total_mem = 0; |
|
- | 44 | ||
40 | size_t get_memory_size(void) |
45 | static void init_memmap(void) |
41 | { |
46 | { |
- | 47 | int i; |
|
- | 48 | ||
42 | phandle handle = ofw_find_device("/memory"); |
49 | phandle handle = ofw_find_device("/memory"); |
43 | if (handle == -1) |
50 | if (handle == -1) |
44 | panic("No RAM\n"); |
51 | panic("No RAM\n"); |
45 | 52 | ||
46 | memmap_t memmap[MEMMAP_MAX_RECORDS]; |
- | |
47 | size_t ret = ofw_get_property(handle, "reg", &memmap, sizeof(memmap)); |
53 | size_t ret = ofw_get_property(handle, "reg", &memmap, sizeof(memmap)); |
48 | if (ret == -1) |
54 | if (ret == -1) |
49 | panic("Device /memory has no reg property\n"); |
55 | panic("Device /memory has no reg property\n"); |
50 | 56 | ||
51 | size_t total = 0; |
- | |
52 | int i; |
- | |
53 | 57 | ||
54 | for (i = 0; i < MEMMAP_MAX_RECORDS; i++) { |
58 | for (i = 0; i < MEMMAP_MAX_RECORDS; i++) { |
55 | if (memmap[i].size == 0) |
59 | if (memmap[i].size == 0) |
56 | break; |
60 | break; |
57 | total += memmap[i].size; |
61 | total_mem += memmap[i].size; |
58 | } |
62 | } |
- | 63 | } |
|
- | 64 | ||
- | 65 | void preboot_read_config(void) |
|
- | 66 | { |
|
- | 67 | init_memmap(); |
|
- | 68 | } |
|
- | 69 | ||
- | 70 | size_t get_memory_size(void) |
|
- | 71 | { |
|
- | 72 | return total_mem; |
|
- | 73 | } |
|
- | 74 | ||
- | 75 | void ppc_init_zones(void) |
|
- | 76 | { |
|
- | 77 | int i; |
|
- | 78 | pfn_t confdata; |
|
59 | 79 | ||
- | 80 | for (i = 0; i < MEMMAP_MAX_RECORDS; i++) { |
|
- | 81 | if (memmap[i].size == 0) |
|
- | 82 | break; |
|
- | 83 | confdata = ADDR2PFN(memmap[i].start); |
|
- | 84 | if (confdata == 0) |
|
60 | return total; |
85 | confdata = 2; |
- | 86 | zone_create(ADDR2PFN(memmap[i].start), |
|
- | 87 | SIZE2FRAMES(ALIGN_DOWN(memmap[i].size,PAGE_SIZE)), |
|
- | 88 | confdata, 0); |
|
- | 89 | } |
|
61 | } |
90 | } |