27,15 → 27,64 |
*/ |
|
#include <arch/mm/memory_init.h> |
#include <genarch/ofw/memory_init.h> |
#include <typedefs.h> |
#include <genarch/ofw/ofw.h> |
#include <panic.h> |
#include <mm/frame.h> |
#include <align.h> |
|
#define MEMMAP_MAX_RECORDS 32 |
|
typedef struct { |
__u32 start; |
__u32 size; |
} memmap_t; |
|
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"); |
|
size_t ret = ofw_get_property(handle, "reg", &memmap, sizeof(memmap)); |
if (ret == -1) |
panic("Device /memory has no reg property\n"); |
|
|
for (i = 0; i < MEMMAP_MAX_RECORDS; i++) { |
if (memmap[i].size == 0) |
break; |
total_mem += memmap[i].size; |
} |
} |
|
void preboot_read_config(void) |
{ |
ofw_init_memmap(); |
init_memmap(); |
} |
|
size_t get_memory_size(void) |
{ |
return ofw_get_memory_size(); |
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); |
} |
} |