2 #include <l4/drivers/of_dev.h>
6 unsigned long Of_if::detect_ramsize()
8 unsigned long addr_cells, size_cells, ram_size;
9 unsigned long reg[100];
12 prom_getprop(get_root(), "#address-cells", &addr_cells, sizeof(&addr_cells));
13 prom_getprop(get_root(), "#size-cells", &size_cells, sizeof(&size_cells));
16 mem = get_device("memory");
17 unsigned int len = prom_getprop(mem, "reg", ®, sizeof(reg));
18 len /= 4; /* always 32 bit values */
23 unsigned long base, size;
24 for(unsigned i = 0; i < len; i += (addr_cells + size_cells)) {
25 base = reg[i + addr_cells - 1];
26 size = reg[i + addr_cells + size_cells - 1];
27 if((base + size) > ram_size)
28 ram_size = base + size;
30 printf(" Memory base: [%08lx; %08lx] size: %lu KB\n",
31 base, base + size, size / 1024);
37 unsigned long Of_if::cpu_detect(const char* prop)
41 cpu = get_device("cpu");
43 prom_getprop(cpu, prop, &val, sizeof(&val));
47 unsigned long Of_if::detect_bus_freq()
49 return cpu_detect("bus-frequency");
52 unsigned long Of_if::detect_cpu_freq()
54 return cpu_detect("clock-frequency");
57 unsigned long Of_if::detect_time_freq()
59 return cpu_detect("timebase-frequency");
62 L4_drivers::Of_if::phandle_t Of_if::get_device(const char *device, const char *prop)
66 for(dev = 0; prom_next_node(&dev); )
68 prom_getprop(dev, prop, type, sizeof(type));
70 if (strcmp(type, device))
78 bool Of_if::detect_devices(unsigned long *start_addr, unsigned long *length)
80 static of_device_t dev[MAX_OF_DEVICES];
83 printf(" Detecting hardware ...\n");
86 for(phandle_t node = 0; prom_next_node(&node) && i < MAX_OF_DEVICES;)
88 if (prom_getprop(node, "device_type", &(dev[i+1].type),
89 sizeof(dev[i].type)) < 0)
93 prom_getprop(node, "name", &dev[i].name, sizeof(dev[i].name));
95 if (prom_getprop(node, "reg", &(dev[i].reg), sizeof(dev[i].reg)) < 0)
98 if (!strcmp(dev[i].type, "cpu"))
100 dev[i].freq.cpu_freq = detect_cpu_freq();
101 dev[i].freq.bus_freq = detect_bus_freq();
102 dev[i].freq.time_freq = detect_time_freq();
104 else if (prom_getprop(node, "interrupts", (dev[i].interrupts),
105 sizeof(dev[i].interrupts)) < 0)
106 dev[i].interrupts[0] = dev[i].interrupts[1] = dev[i].interrupts[2] = ~0UL;
109 //just for information
110 prom_getprop(node, ".description", descr, sizeof(descr));
113 " [%s]\33[0;36m (%s)\33[0m\n"
114 " reg: %08lx interrupts: %08lx, %08lx, %08lx\n",
115 dev[i].name, descr, dev[i].reg, dev[i].interrupts[0],
116 dev[i].interrupts[1], dev[i].interrupts[2]);
122 *start_addr = (unsigned long)dev;
123 *length = (i + 1) * sizeof(of_device_t);
129 void Of_if::boot_finish()
133 prom_getprop(get_chosen(), "stdin", &_std, sizeof(_std));
134 prom_call("close", 1, 0, _std);
136 prom_getprop(get_chosen(), "stdout", &_std, sizeof(_std));
137 prom_call("close", 1, 0, _std);
138 //finish pending dma requests
139 prom_call("quiesce", 0, 0);
142 void Of_if::vesa_set_mode(int mode)
145 unsigned long test_mode = 0x117;
146 phandle_t disp = get_device("display", "name");
147 int ret = prom_call("vesa-set-mode", 2, 1, disp, test_mode);// &test_mode);
148 unsigned long adr = prom_call("vesa-frame-buffer-adr", 1, 1);
150 printf("VESA: returned %d fb %08lx\n", ret, adr);