summaryrefslogtreecommitdiff
path: root/sys/dev/dev_init.c
blob: 9933c2a219293267f6ff48f4a01b7e5940c6ba09 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <dev.h>
#include <libfdt.h>
#include <sbi.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>


static void
mem_init(struct fdt_header *fdt, struct devicetree *dt)
{

	int memory = fdt_path_offset(fdt, "/memory");
	if (memory < 0)
		printf("[dev_init] failed to find memory node\n");

	int len;

	struct _reg *val = fdt_getprop(fdt, memory, "reg", &len);
	/* bad idea */
	dt->memory.origin = fdt64_to_cpu(val->address);
	dt->memory.size = fdt64_to_cpu(val->size);
	printf("[mem_init] found %dMB of memory at %p\n", dt->memory.size >> 20, dt->memory.origin);

	int n = fdt_num_mem_rsv(fdt);
	printf("[mem_init] found %d memory reserve map entries\n", n);
}


struct devicetree
dev_init(struct fdt_header *fdt) 
{
	struct devicetree dt = {0};

	if (fdt_check_header(fdt) == 0) 
		printf("[dev_init] valid fdt at %p\n", fdt);
	else
		printf("[dev_init] error: fdt_check_header()\n");

	printf("[dev_init] detecting memory...\n");
	mem_init(fdt, &dt);

//	int offset = fdt_next_node(fdt, offset, 0);
//	do {
//		printf("[dev_init] found %s\n", fdt_get_name(fdt, offset, 0));
//		offset = fdt_next_node(fdt, offset, 0);
//	} while (offset != -FDT_ERR_NOTFOUND);
	return dt;
}