Rev 1782 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1782 | Rev 1783 | ||
---|---|---|---|
Line 29... | Line 29... | ||
29 | #include "ofw.h" |
29 | #include "ofw.h" |
30 | #include <printf.h> |
30 | #include <printf.h> |
31 | #include <asm.h> |
31 | #include <asm.h> |
32 | #include <types.h> |
32 | #include <types.h> |
33 | 33 | ||
34 | #define MAX_OFW_ARGS 10 |
- | |
35 | - | ||
36 | /** OpenFirmware command structure |
- | |
37 | * |
- | |
38 | */ |
- | |
39 | typedef struct { |
- | |
40 | const char *service; /**< Command name */ |
- | |
41 | unsigned long nargs; /**< Number of in arguments */ |
- | |
42 | unsigned long nret; /**< Number of out arguments */ |
- | |
43 | ofw_arg_t args[MAX_OFW_ARGS]; /**< List of arguments */ |
- | |
44 | } ofw_args_t; |
- | |
45 | - | ||
46 | typedef void (*ofw_entry)(ofw_args_t *); |
- | |
47 | - | ||
48 | ofw_entry ofw; |
34 | uintptr_t ofw_cif; |
49 | 35 | ||
50 | phandle ofw_chosen; |
36 | phandle ofw_chosen; |
51 | ihandle ofw_stdout; |
37 | ihandle ofw_stdout; |
52 | phandle ofw_root; |
38 | phandle ofw_root; |
53 | ihandle ofw_mmu; |
39 | ihandle ofw_mmu; |
Line 70... | Line 56... | ||
70 | va_end(list); |
56 | va_end(list); |
71 | 57 | ||
72 | for (i = 0; i < nret; i++) |
58 | for (i = 0; i < nret; i++) |
73 | args.args[i + nargs] = 0; |
59 | args.args[i + nargs] = 0; |
74 | 60 | ||
75 | ofw(&args); |
61 | (void) ofw(&args); |
76 | 62 | ||
77 | for (i = 1; i < nret; i++) |
63 | for (i = 1; i < nret; i++) |
78 | rets[i - 1] = args.args[i + nargs]; |
64 | rets[i - 1] = args.args[i + nargs]; |
79 | 65 | ||
80 | return args.args[nargs]; |
66 | return args.args[nargs]; |
81 | } |
67 | } |
82 | 68 | ||
83 | 69 | ||
84 | phandle ofw_find_device(const char *name) |
70 | phandle ofw_find_device(const char *name) |
Line 174... | Line 160... | ||
174 | if (ofw_call("call-method", 3, 5, result, "translate", ofw_mmu, virt) != 0) { |
160 | if (ofw_call("call-method", 3, 5, result, "translate", ofw_mmu, virt) != 0) { |
175 | puts("Error: MMU method translate() failed, halting.\n"); |
161 | puts("Error: MMU method translate() failed, halting.\n"); |
176 | halt(); |
162 | halt(); |
177 | } |
163 | } |
178 | 164 | ||
- | 165 | if (ofw_translate_failed(result[0])) |
|
- | 166 | return NULL; |
|
- | 167 | ||
179 | if (sizeof(unative_t) == 8) |
168 | if (sizeof(unative_t) == 8) |
180 | shift = 32; |
169 | shift = 32; |
181 | else |
170 | else |
182 | shift = 0; |
171 | shift = 0; |
183 | 172 | ||
184 | return (void *) (((result[2]&0xffffffff)<<shift)|((result[3])&0xffffffff)); |
173 | return (void *) ((result[2]<<shift)|result[3]); |
185 | } |
174 | } |
186 | 175 | ||
- | 176 | void *ofw_claim(const void *virt, const int len) |
|
- | 177 | { |
|
- | 178 | ofw_arg_t retaddr; |
|
- | 179 | int shift; |
|
- | 180 | ||
- | 181 | if (ofw_call("call-method", 5, 2, &retaddr, "claim", ofw_mmu, 0, len, virt) != 0) { |
|
- | 182 | puts("Error: MMU method claim() failed, halting.\n"); |
|
- | 183 | halt(); |
|
- | 184 | } |
|
- | 185 | ||
- | 186 | return (void *) retaddr; |
|
- | 187 | } |
|
187 | 188 | ||
188 | int ofw_map(const void *phys, const void *virt, const int size, const int mode) |
189 | int ofw_map(const void *phys, const void *virt, const int size, const int mode) |
189 | { |
190 | { |
190 | uintptr_t phys_hi, phys_lo; |
191 | uintptr_t phys_hi, phys_lo; |
191 | 192 |