Commit | Line | Data |
---|---|---|
b2c5f619 MG |
1 | /* |
2 | * Global definition of all the bootwrapper operations. | |
3 | * | |
4 | * Author: Mark A. Greer <mgreer@mvista.com> | |
5 | * | |
6 | * 2006 (c) MontaVista Software, Inc. This file is licensed under | |
7 | * the terms of the GNU General Public License version 2. This program | |
8 | * is licensed "as is" without any warranty of any kind, whether express | |
9 | * or implied. | |
10 | */ | |
11 | #ifndef _PPC_BOOT_OPS_H_ | |
12 | #define _PPC_BOOT_OPS_H_ | |
13 | ||
ce3edb30 | 14 | #include <stddef.h> |
b2c5f619 | 15 | #include "types.h" |
a07940ba | 16 | #include "string.h" |
b2c5f619 MG |
17 | |
18 | #define COMMAND_LINE_SIZE 512 | |
19 | #define MAX_PATH_LEN 256 | |
20 | #define MAX_PROP_LEN 256 /* What should this be? */ | |
21 | ||
22 | /* Platform specific operations */ | |
23 | struct platform_ops { | |
24 | void (*fixups)(void); | |
25 | void (*image_hdr)(const void *); | |
26 | void * (*malloc)(u32 size); | |
c888554b MG |
27 | void (*free)(void *ptr); |
28 | void * (*realloc)(void *ptr, unsigned long size); | |
b2c5f619 | 29 | void (*exit)(void); |
79c85419 | 30 | void * (*vmlinux_alloc)(unsigned long size); |
b2c5f619 MG |
31 | }; |
32 | extern struct platform_ops platform_ops; | |
33 | ||
34 | /* Device Tree operations */ | |
35 | struct dt_ops { | |
36 | void * (*finddevice)(const char *name); | |
c888554b | 37 | int (*getprop)(const void *phandle, const char *name, void *buf, |
b2c5f619 | 38 | const int buflen); |
c888554b | 39 | int (*setprop)(const void *phandle, const char *name, |
b2c5f619 | 40 | const void *buf, const int buflen); |
a07940ba SW |
41 | void *(*get_parent)(const void *phandle); |
42 | /* The node must not already exist. */ | |
43 | void *(*create_node)(const void *parent, const char *name); | |
44 | void *(*find_node_by_prop_value)(const void *prev, | |
45 | const char *propname, | |
46 | const char *propval, int proplen); | |
35af89eb | 47 | unsigned long (*finalize)(void); |
b2c5f619 MG |
48 | }; |
49 | extern struct dt_ops dt_ops; | |
50 | ||
51 | /* Console operations */ | |
52 | struct console_ops { | |
53 | int (*open)(void); | |
54 | void (*write)(char *buf, int len); | |
55 | void (*edit_cmdline)(char *buf, int len); | |
56 | void (*close)(void); | |
57 | void *data; | |
58 | }; | |
59 | extern struct console_ops console_ops; | |
60 | ||
61 | /* Serial console operations */ | |
62 | struct serial_console_data { | |
63 | int (*open)(void); | |
64 | void (*putc)(unsigned char c); | |
65 | unsigned char (*getc)(void); | |
66 | u8 (*tstc)(void); | |
67 | void (*close)(void); | |
68 | }; | |
69 | ||
cd197ffc DG |
70 | struct loader_info { |
71 | void *promptr; | |
72 | unsigned long initrd_addr, initrd_size; | |
3af82a8b DG |
73 | char *cmdline; |
74 | int cmdline_len; | |
cd197ffc DG |
75 | }; |
76 | extern struct loader_info loader_info; | |
77 | ||
e5a2072b | 78 | void start(void); |
c888554b MG |
79 | int ft_init(void *dt_blob, unsigned int max_size, unsigned int max_find_device); |
80 | int serial_console_init(void); | |
81 | int ns16550_console_init(void *devp, struct serial_console_data *scdp); | |
82 | void *simple_alloc_init(char *base, u32 heap_size, u32 granularity, | |
83 | u32 max_allocs); | |
0e680673 | 84 | extern void flush_cache(void *, unsigned long); |
b2c5f619 MG |
85 | |
86 | static inline void *finddevice(const char *name) | |
87 | { | |
88 | return (dt_ops.finddevice) ? dt_ops.finddevice(name) : NULL; | |
89 | } | |
90 | ||
91 | static inline int getprop(void *devp, const char *name, void *buf, int buflen) | |
92 | { | |
93 | return (dt_ops.getprop) ? dt_ops.getprop(devp, name, buf, buflen) : -1; | |
94 | } | |
95 | ||
f61e7cd2 SW |
96 | static inline int setprop(void *devp, const char *name, |
97 | const void *buf, int buflen) | |
b2c5f619 MG |
98 | { |
99 | return (dt_ops.setprop) ? dt_ops.setprop(devp, name, buf, buflen) : -1; | |
100 | } | |
27fbaa97 DG |
101 | #define setprop_val(devp, name, val) \ |
102 | do { \ | |
103 | typeof(val) x = (val); \ | |
104 | setprop((devp), (name), &x, sizeof(x)); \ | |
105 | } while (0) | |
b2c5f619 | 106 | |
a07940ba SW |
107 | static inline int setprop_str(void *devp, const char *name, const char *buf) |
108 | { | |
109 | if (dt_ops.setprop) | |
110 | return dt_ops.setprop(devp, name, buf, strlen(buf) + 1); | |
111 | ||
112 | return -1; | |
113 | } | |
114 | ||
115 | static inline void *get_parent(const char *devp) | |
116 | { | |
117 | return dt_ops.get_parent ? dt_ops.get_parent(devp) : NULL; | |
118 | } | |
119 | ||
120 | static inline void *create_node(const void *parent, const char *name) | |
121 | { | |
122 | return dt_ops.create_node ? dt_ops.create_node(parent, name) : NULL; | |
123 | } | |
124 | ||
125 | ||
126 | static inline void *find_node_by_prop_value(const void *prev, | |
127 | const char *propname, | |
128 | const char *propval, int proplen) | |
129 | { | |
130 | if (dt_ops.find_node_by_prop_value) | |
131 | return dt_ops.find_node_by_prop_value(prev, propname, | |
132 | propval, proplen); | |
133 | ||
134 | return NULL; | |
135 | } | |
136 | ||
137 | static inline void *find_node_by_prop_value_str(const void *prev, | |
138 | const char *propname, | |
139 | const char *propval) | |
140 | { | |
141 | return find_node_by_prop_value(prev, propname, propval, | |
142 | strlen(propval) + 1); | |
143 | } | |
144 | ||
145 | static inline void *find_node_by_devtype(const void *prev, | |
146 | const char *type) | |
147 | { | |
148 | return find_node_by_prop_value_str(prev, "device_type", type); | |
149 | } | |
150 | ||
27fbaa97 DG |
151 | void dt_fixup_memory(u64 start, u64 size); |
152 | void dt_fixup_cpu_clocks(u32 cpufreq, u32 tbfreq, u32 busfreq); | |
153 | void dt_fixup_clock(const char *path, u32 freq); | |
154 | void __dt_fixup_mac_addresses(u32 startindex, ...); | |
155 | #define dt_fixup_mac_addresses(...) \ | |
156 | __dt_fixup_mac_addresses(0, __VA_ARGS__, NULL) | |
157 | ||
158 | ||
b2c5f619 MG |
159 | static inline void *malloc(u32 size) |
160 | { | |
161 | return (platform_ops.malloc) ? platform_ops.malloc(size) : NULL; | |
162 | } | |
163 | ||
c888554b | 164 | static inline void free(void *ptr) |
b2c5f619 MG |
165 | { |
166 | if (platform_ops.free) | |
c888554b | 167 | platform_ops.free(ptr); |
b2c5f619 MG |
168 | } |
169 | ||
170 | static inline void exit(void) | |
171 | { | |
172 | if (platform_ops.exit) | |
173 | platform_ops.exit(); | |
174 | for(;;); | |
175 | } | |
6a923216 MM |
176 | #define fatal(args...) { printf(args); exit(); } |
177 | ||
b2c5f619 | 178 | |
cd197ffc DG |
179 | #define BSS_STACK(size) \ |
180 | static char _bss_stack[size]; \ | |
181 | void *_platform_stack_top = _bss_stack + sizeof(_bss_stack); | |
182 | ||
b2c5f619 | 183 | #endif /* _PPC_BOOT_OPS_H_ */ |