]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/drivers-frst/of/src/of.cc
update
[l4.git] / l4 / pkg / drivers-frst / of / src / of.cc
1 #include "of_if.h"
2 #include <l4/drivers/of_dev.h>
3
4 namespace L4_drivers
5 {
6   unsigned long Of_if::detect_ramsize() 
7   {
8     unsigned long addr_cells, size_cells, ram_size;
9     unsigned long reg[100];
10     phandle_t mem;
11
12     prom_getprop(get_root(), "#address-cells", &addr_cells, sizeof(&addr_cells));
13     prom_getprop(get_root(), "#size-cells", &size_cells, sizeof(&size_cells));
14     ram_size = 0;
15
16     mem = get_device("memory");
17     unsigned int len = prom_getprop(mem, "reg", &reg, sizeof(reg));
18     len /= 4; /* always 32 bit values */
19
20     if(len > sizeof(reg))
21       len = sizeof(reg);
22
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;
29
30         printf("    Memory base: [%08lx; %08lx]  size: %lu KB\n", 
31             base, base + size, size / 1024);
32     }
33
34     return ram_size;
35   }
36
37   unsigned long Of_if::cpu_detect(const char* prop)
38   {
39     phandle_t cpu;
40     unsigned long val;
41     cpu = get_device("cpu");
42
43     prom_getprop(cpu, prop, &val, sizeof(&val));
44     return val;
45   }
46
47   unsigned long Of_if::detect_bus_freq()
48   {
49     return cpu_detect("bus-frequency");
50   }
51
52   unsigned long Of_if::detect_cpu_freq()
53   {
54     return cpu_detect("clock-frequency");
55   }
56
57   unsigned long Of_if::detect_time_freq()
58   {
59     return cpu_detect("timebase-frequency");
60   }
61
62   L4_drivers::Of_if::phandle_t Of_if::get_device(const char *device, const char *prop)
63   {
64     phandle_t dev;
65     char type[32];
66     for(dev = 0; prom_next_node(&dev); )
67       {
68         prom_getprop(dev, prop, type, sizeof(type));
69
70         if (strcmp(type, device))
71           continue;
72
73         return dev;
74       }
75     return 0;
76   }
77
78   bool Of_if::detect_devices(unsigned long *start_addr, unsigned long *length)
79   {
80     static of_device_t dev[MAX_OF_DEVICES];
81     char descr[64];
82
83     printf("  Detecting hardware ...\n");
84     int i = -1;
85
86     for(phandle_t node = 0; prom_next_node(&node) && i < MAX_OF_DEVICES;)
87       {
88         if (prom_getprop(node, "device_type", &(dev[i+1].type),
89                          sizeof(dev[i].type)) < 0)
90           continue;
91         i++;
92
93         prom_getprop(node, "name", &dev[i].name, sizeof(dev[i].name));
94
95         if (prom_getprop(node, "reg", &(dev[i].reg), sizeof(dev[i].reg)) < 0)
96           dev[i].reg = 0;
97
98         if (!strcmp(dev[i].type, "cpu"))
99           {
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();
103           }
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;
107
108
109         //just for information
110         prom_getprop(node, ".description", descr, sizeof(descr));
111
112         printf("\33[1;36m"
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]);
117       }
118
119     if (i < 0)
120       return false;
121
122     *start_addr = (unsigned long)dev;
123     *length = (i + 1) * sizeof(of_device_t);
124
125     return true;
126   }
127
128
129   void Of_if::boot_finish() 
130   {
131     ihandle_t _std;
132     //close stdin
133     prom_getprop(get_chosen(), "stdin", &_std, sizeof(_std));
134     prom_call("close", 1, 0, _std);
135     //close stdout
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);
140   }
141
142   void Of_if::vesa_set_mode(int mode)
143   {
144     (void)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);
149
150     printf("VESA: returned %d fb %08lx\n", ret, adr);
151   }
152 }