Rev 2131 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2131 | Rev 2307 | ||
---|---|---|---|
Line 36... | Line 36... | ||
36 | 36 | ||
37 | phandle ofw_chosen; |
37 | phandle ofw_chosen; |
38 | ihandle ofw_stdout; |
38 | ihandle ofw_stdout; |
39 | phandle ofw_root; |
39 | phandle ofw_root; |
40 | ihandle ofw_mmu; |
40 | ihandle ofw_mmu; |
- | 41 | ihandle ofw_memory_prop; |
|
41 | phandle ofw_memory; |
42 | phandle ofw_memory; |
42 | phandle ofw_aliases; |
43 | phandle ofw_aliases; |
43 | 44 | ||
44 | void ofw_init(void) |
45 | void ofw_init(void) |
45 | { |
46 | { |
46 | ofw_chosen = ofw_find_device("/chosen"); |
47 | ofw_chosen = ofw_find_device("/chosen"); |
47 | if (ofw_chosen == -1) |
48 | if (ofw_chosen == -1) |
48 | halt(); |
49 | halt(); |
49 | 50 | ||
50 | if (ofw_get_property(ofw_chosen, "stdout", &ofw_stdout, sizeof(ofw_stdout)) <= 0) |
51 | if (ofw_get_property(ofw_chosen, "stdout", &ofw_stdout, sizeof(ofw_stdout)) <= 0) |
51 | ofw_stdout = 0; |
52 | ofw_stdout = 0; |
52 | 53 | ||
53 | ofw_root = ofw_find_device("/"); |
54 | ofw_root = ofw_find_device("/"); |
54 | if (ofw_root == -1) { |
55 | if (ofw_root == -1) { |
55 | puts("\r\nError: Unable to find / device, halted.\r\n"); |
56 | puts("\r\nError: Unable to find / device, halted.\r\n"); |
56 | halt(); |
57 | halt(); |
57 | } |
58 | } |
58 | 59 | ||
59 | if (ofw_get_property(ofw_chosen, "mmu", &ofw_mmu, sizeof(ofw_mmu)) <= 0) { |
60 | if (ofw_get_property(ofw_chosen, "mmu", &ofw_mmu, sizeof(ofw_mmu)) <= 0) { |
60 | puts("\r\nError: Unable to get mmu property, halted.\r\n"); |
61 | puts("\r\nError: Unable to get mmu property, halted.\r\n"); |
61 | halt(); |
62 | halt(); |
62 | } |
63 | } |
- | 64 | if (ofw_get_property(ofw_chosen, "memory", &ofw_memory_prop, sizeof(ofw_memory_prop)) <= 0) { |
|
- | 65 | puts("\r\nError: Unable to get memory property, halted.\r\n"); |
|
- | 66 | halt(); |
|
- | 67 | } |
|
63 | 68 | ||
64 | ofw_memory = ofw_find_device("/memory"); |
69 | ofw_memory = ofw_find_device("/memory"); |
65 | if (ofw_memory == -1) { |
70 | if (ofw_memory == -1) { |
66 | puts("\r\nError: Unable to find /memory device, halted.\r\n"); |
71 | puts("\r\nError: Unable to find /memory device, halted.\r\n"); |
67 | halt(); |
72 | halt(); |
Line 198... | Line 203... | ||
198 | if (sizeof(unative_t) == 8) |
203 | if (sizeof(unative_t) == 8) |
199 | shift = 32; |
204 | shift = 32; |
200 | else |
205 | else |
201 | shift = 0; |
206 | shift = 0; |
202 | 207 | ||
203 | return (void *) ((result[2]<<shift)|result[3]); |
208 | return (void *) ((result[2] << shift) | result[3]); |
204 | } |
209 | } |
205 | 210 | ||
206 | void *ofw_claim(const void *virt, const int len) |
211 | void *ofw_claim_virt(const void *virt, const int len) |
207 | { |
212 | { |
208 | ofw_arg_t retaddr; |
213 | ofw_arg_t retaddr; |
209 | int shift; |
- | |
210 | 214 | ||
211 | if (ofw_call("call-method", 5, 2, &retaddr, "claim", ofw_mmu, 0, len, virt) != 0) { |
215 | if (ofw_call("call-method", 5, 2, &retaddr, "claim", ofw_mmu, 0, len, virt) != 0) { |
212 | puts("Error: MMU method claim() failed, halting.\n"); |
216 | puts("Error: MMU method claim() failed, halting.\n"); |
213 | halt(); |
217 | halt(); |
214 | } |
218 | } |
215 | 219 | ||
216 | return (void *) retaddr; |
220 | return (void *) retaddr; |
217 | } |
221 | } |
218 | 222 | ||
- | 223 | void *ofw_claim_phys(const void *phys, const int len) |
|
- | 224 | { |
|
- | 225 | ofw_arg_t retaddr[2]; |
|
- | 226 | int shift; |
|
- | 227 | ||
- | 228 | if (sizeof(unative_t) == 8) { |
|
- | 229 | shift = 32; |
|
- | 230 | if (ofw_call("call-method", 6, 3, retaddr, "claim", |
|
- | 231 | ofw_memory_prop, 0, len, ((uintptr_t) phys) >> shift, |
|
- | 232 | ((uintptr_t) phys) & ((uint32_t) -1)) != 0) { |
|
- | 233 | /* |
|
- | 234 | * Note that this will help us to discover |
|
- | 235 | * conflicts between OpenFirmware allocations |
|
- | 236 | * and our use of physical memory. |
|
- | 237 | * It is better to detect collisions here |
|
- | 238 | * than to cope with weird errors later. |
|
- | 239 | * |
|
- | 240 | * So this is really not to make the loader |
|
- | 241 | * more generic; it is here for debugging |
|
- | 242 | * purposes. |
|
- | 243 | */ |
|
- | 244 | puts("Error: memory method claim() failed, halting.\n"); |
|
- | 245 | halt(); |
|
- | 246 | } |
|
- | 247 | } else { |
|
- | 248 | shift = 0; |
|
- | 249 | /* |
|
- | 250 | * FIXME: the number of arguments is probably different... |
|
- | 251 | */ |
|
- | 252 | puts("Error: 32-bit ofw_claim_phys not implemented.\n"); |
|
- | 253 | halt(); |
|
- | 254 | } |
|
- | 255 | ||
- | 256 | return (void *) ((retaddr[0] << shift) | retaddr[1]); |
|
- | 257 | } |
|
- | 258 | ||
219 | int ofw_map(const void *phys, const void *virt, const int size, const int mode) |
259 | int ofw_map(const void *phys, const void *virt, const int size, const int mode) |
220 | { |
260 | { |
221 | uintptr_t phys_hi, phys_lo; |
261 | uintptr_t phys_hi, phys_lo; |
222 | 262 | ||
223 | if (sizeof(unative_t) == 8) { |
263 | if (sizeof(unative_t) == 8) { |
Line 228... | Line 268... | ||
228 | phys_hi = 0; |
268 | phys_hi = 0; |
229 | phys_lo = (uintptr_t) phys; |
269 | phys_lo = (uintptr_t) phys; |
230 | } |
270 | } |
231 | 271 | ||
232 | return ofw_call("call-method", 7, 1, NULL, "map", ofw_mmu, mode, size, virt, |
272 | return ofw_call("call-method", 7, 1, NULL, "map", ofw_mmu, mode, size, virt, |
233 | phys_hi, phys_lo); |
273 | phys_hi, phys_lo); |
234 | } |
274 | } |
235 | 275 | ||
236 | /** Save OpenFirmware physical memory map. |
276 | /** Save OpenFirmware physical memory map. |
237 | * |
277 | * |
238 | * @param map Memory map structure where the map will be saved. |
278 | * @param map Memory map structure where the map will be saved. |
Line 250... | Line 290... | ||
250 | return false; |
290 | return false; |
251 | 291 | ||
252 | int pos; |
292 | int pos; |
253 | map->total = 0; |
293 | map->total = 0; |
254 | map->count = 0; |
294 | map->count = 0; |
255 | for (pos = 0; (pos < ret / sizeof(uint32_t)) && (map->count < |
295 | for (pos = 0; (pos < ret / sizeof(uint32_t)) && |
256 | MEMMAP_MAX_RECORDS); pos += ac + sc) { |
296 | (map->count < MEMMAP_MAX_RECORDS); pos += ac + sc) { |
257 | void * start = (void *) ((uintptr_t) buf[pos + ac - 1]); |
297 | void * start = (void *) ((uintptr_t) buf[pos + ac - 1]); |
258 | unsigned int size = buf[pos + ac + sc - 1]; |
298 | unsigned int size = buf[pos + ac + sc - 1]; |
259 | 299 | ||
260 | if (size > 0) { |
300 | if (size > 0) { |
261 | map->zones[map->count].start = start; |
301 | map->zones[map->count].start = start; |