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 | } |