29,6 → 29,8 |
#include <arch/mm/memory_init.h> |
#include <genarch/ofw/ofw.h> |
#include <panic.h> |
#include <mm/frame.h> |
#include <align.h> |
|
#define MEMMAP_MAX_RECORDS 32 |
|
37,25 → 39,52 |
__u32 size; |
} memmap_t; |
|
size_t get_memory_size(void) |
static memmap_t memmap[MEMMAP_MAX_RECORDS]; |
size_t total_mem = 0; |
|
static void init_memmap(void) |
{ |
int i; |
|
phandle handle = ofw_find_device("/memory"); |
if (handle == -1) |
panic("No RAM\n"); |
|
memmap_t memmap[MEMMAP_MAX_RECORDS]; |
size_t ret = ofw_get_property(handle, "reg", &memmap, sizeof(memmap)); |
if (ret == -1) |
panic("Device /memory has no reg property\n"); |
|
size_t total = 0; |
int i; |
|
for (i = 0; i < MEMMAP_MAX_RECORDS; i++) { |
if (memmap[i].size == 0) |
break; |
total += memmap[i].size; |
total_mem += memmap[i].size; |
} |
} |
|
return total; |
void preboot_read_config(void) |
{ |
init_memmap(); |
} |
|
size_t get_memory_size(void) |
{ |
return total_mem; |
} |
|
void ppc_init_zones(void) |
{ |
int i; |
pfn_t confdata; |
|
for (i = 0; i < MEMMAP_MAX_RECORDS; i++) { |
if (memmap[i].size == 0) |
break; |
confdata = ADDR2PFN(memmap[i].start); |
if (confdata == 0) |
confdata = 2; |
zone_create(ADDR2PFN(memmap[i].start), |
SIZE2FRAMES(ALIGN_DOWN(memmap[i].size,PAGE_SIZE)), |
confdata, 0); |
} |
} |