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; | |
73 | }; | |
74 | extern struct loader_info loader_info; | |
75 | ||
e5a2072b | 76 | void start(void); |
c888554b MG |
77 | int ft_init(void *dt_blob, unsigned int max_size, unsigned int max_find_device); |
78 | int serial_console_init(void); | |
79 | int ns16550_console_init(void *devp, struct serial_console_data *scdp); | |
80 | void *simple_alloc_init(char *base, u32 heap_size, u32 granularity, | |
81 | u32 max_allocs); | |
0e680673 | 82 | extern void flush_cache(void *, unsigned long); |
b2c5f619 MG |
83 | |
84 | static inline void *finddevice(const char *name) | |
85 | { | |
86 | return (dt_ops.finddevice) ? dt_ops.finddevice(name) : NULL; | |
87 | } | |
88 | ||
89 | static inline int getprop(void *devp, const char *name, void *buf, int buflen) | |
90 | { | |
91 | return (dt_ops.getprop) ? dt_ops.getprop(devp, name, buf, buflen) : -1; | |
92 | } | |
93 | ||
f61e7cd2 SW |
94 | static inline int setprop(void *devp, const char *name, |
95 | const void *buf, int buflen) | |
b2c5f619 MG |
96 | { |
97 | return (dt_ops.setprop) ? dt_ops.setprop(devp, name, buf, buflen) : -1; | |
98 | } | |
27fbaa97 DG |
99 | #define setprop_val(devp, name, val) \ |
100 | do { \ | |
101 | typeof(val) x = (val); \ | |
102 | setprop((devp), (name), &x, sizeof(x)); \ | |
103 | } while (0) | |
b2c5f619 | 104 | |
a07940ba SW |
105 | static inline int setprop_str(void *devp, const char *name, const char *buf) |
106 | { | |
107 | if (dt_ops.setprop) | |
108 | return dt_ops.setprop(devp, name, buf, strlen(buf) + 1); | |
109 | ||
110 | return -1; | |
111 | } | |
112 | ||
113 | static inline void *get_parent(const char *devp) | |
114 | { | |
115 | return dt_ops.get_parent ? dt_ops.get_parent(devp) : NULL; | |
116 | } | |
117 | ||
118 | static inline void *create_node(const void *parent, const char *name) | |
119 | { | |
120 | return dt_ops.create_node ? dt_ops.create_node(parent, name) : NULL; | |
121 | } | |
122 | ||
123 | ||
124 | static inline void *find_node_by_prop_value(const void *prev, | |
125 | const char *propname, | |
126 | const char *propval, int proplen) | |
127 | { | |
128 | if (dt_ops.find_node_by_prop_value) | |
129 | return dt_ops.find_node_by_prop_value(prev, propname, | |
130 | propval, proplen); | |
131 | ||
132 | return NULL; | |
133 | } | |
134 | ||
135 | static inline void *find_node_by_prop_value_str(const void *prev, | |
136 | const char *propname, | |
137 | const char *propval) | |
138 | { | |
139 | return find_node_by_prop_value(prev, propname, propval, | |
140 | strlen(propval) + 1); | |
141 | } | |
142 | ||
143 | static inline void *find_node_by_devtype(const void *prev, | |
144 | const char *type) | |
145 | { | |
146 | return find_node_by_prop_value_str(prev, "device_type", type); | |
147 | } | |
148 | ||
27fbaa97 DG |
149 | void dt_fixup_memory(u64 start, u64 size); |
150 | void dt_fixup_cpu_clocks(u32 cpufreq, u32 tbfreq, u32 busfreq); | |
151 | void dt_fixup_clock(const char *path, u32 freq); | |
152 | void __dt_fixup_mac_addresses(u32 startindex, ...); | |
153 | #define dt_fixup_mac_addresses(...) \ | |
154 | __dt_fixup_mac_addresses(0, __VA_ARGS__, NULL) | |
155 | ||
156 | ||
b2c5f619 MG |
157 | static inline void *malloc(u32 size) |
158 | { | |
159 | return (platform_ops.malloc) ? platform_ops.malloc(size) : NULL; | |
160 | } | |
161 | ||
c888554b | 162 | static inline void free(void *ptr) |
b2c5f619 MG |
163 | { |
164 | if (platform_ops.free) | |
c888554b | 165 | platform_ops.free(ptr); |
b2c5f619 MG |
166 | } |
167 | ||
168 | static inline void exit(void) | |
169 | { | |
170 | if (platform_ops.exit) | |
171 | platform_ops.exit(); | |
172 | for(;;); | |
173 | } | |
6a923216 MM |
174 | #define fatal(args...) { printf(args); exit(); } |
175 | ||
b2c5f619 | 176 | |
cd197ffc DG |
177 | #define BSS_STACK(size) \ |
178 | static char _bss_stack[size]; \ | |
179 | void *_platform_stack_top = _bss_stack + sizeof(_bss_stack); | |
180 | ||
b2c5f619 | 181 | #endif /* _PPC_BOOT_OPS_H_ */ |