root/arch/powerpc/boot/ops.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. finddevice
  2. getprop
  3. setprop
  4. setprop_str
  5. del_node
  6. get_parent
  7. create_node
  8. find_node_by_prop_value
  9. find_node_by_prop_value_str
  10. find_node_by_devtype
  11. find_node_by_alias
  12. find_node_by_compatible
  13. find_node_by_linuxphandle
  14. get_path
  15. malloc
  16. free
  17. exit
  18. __ilog2_u32

   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 
  14 #include <stddef.h>
  15 #include "types.h"
  16 #include "string.h"
  17 
  18 #define BOOT_COMMAND_LINE_SIZE  2048
  19 #define MAX_PATH_LEN            256
  20 #define MAX_PROP_LEN            256 /* What should this be? */
  21 
  22 typedef void (*kernel_entry_t)(unsigned long r3, unsigned long r4, void *r5);
  23 
  24 /* Platform specific operations */
  25 struct platform_ops {
  26         void    (*fixups)(void);
  27         void    (*image_hdr)(const void *);
  28         void *  (*malloc)(unsigned long size);
  29         void    (*free)(void *ptr);
  30         void *  (*realloc)(void *ptr, unsigned long size);
  31         void    (*exit)(void);
  32         void *  (*vmlinux_alloc)(unsigned long size);
  33         void    (*kentry)(unsigned long fdt_addr, void *vmlinux_addr);
  34 };
  35 extern struct platform_ops platform_ops;
  36 
  37 /* Device Tree operations */
  38 struct dt_ops {
  39         void *  (*finddevice)(const char *name);
  40         int     (*getprop)(const void *phandle, const char *name, void *buf,
  41                         const int buflen);
  42         int     (*setprop)(const void *phandle, const char *name,
  43                         const void *buf, const int buflen);
  44         int (*del_node)(const void *phandle);
  45         void *(*get_parent)(const void *phandle);
  46         /* The node must not already exist. */
  47         void *(*create_node)(const void *parent, const char *name);
  48         void *(*find_node_by_prop_value)(const void *prev,
  49                                          const char *propname,
  50                                          const char *propval, int proplen);
  51         void *(*find_node_by_compatible)(const void *prev,
  52                                          const char *compat);
  53         unsigned long (*finalize)(void);
  54         char *(*get_path)(const void *phandle, char *buf, int len);
  55 };
  56 extern struct dt_ops dt_ops;
  57 
  58 /* Console operations */
  59 struct console_ops {
  60         int     (*open)(void);
  61         void    (*write)(const char *buf, int len);
  62         void    (*edit_cmdline)(char *buf, int len, unsigned int getline_timeout);
  63         void    (*close)(void);
  64         void    *data;
  65 };
  66 extern struct console_ops console_ops;
  67 
  68 /* Serial console operations */
  69 struct serial_console_data {
  70         int             (*open)(void);
  71         void            (*putc)(unsigned char c);
  72         unsigned char   (*getc)(void);
  73         u8              (*tstc)(void);
  74         void            (*close)(void);
  75 };
  76 
  77 struct loader_info {
  78         void *promptr;
  79         unsigned long initrd_addr, initrd_size;
  80         char *cmdline;
  81         int cmdline_len;
  82 };
  83 extern struct loader_info loader_info;
  84 
  85 void start(void);
  86 void fdt_init(void *blob);
  87 int serial_console_init(void);
  88 int ns16550_console_init(void *devp, struct serial_console_data *scdp);
  89 int cpm_console_init(void *devp, struct serial_console_data *scdp);
  90 int mpc5200_psc_console_init(void *devp, struct serial_console_data *scdp);
  91 int uartlite_console_init(void *devp, struct serial_console_data *scdp);
  92 int opal_console_init(void *devp, struct serial_console_data *scdp);
  93 void *simple_alloc_init(char *base, unsigned long heap_size,
  94                         unsigned long granularity, unsigned long max_allocs);
  95 extern void flush_cache(void *, unsigned long);
  96 int dt_xlate_reg(void *node, int res, unsigned long *addr, unsigned long *size);
  97 int dt_xlate_addr(void *node, u32 *buf, int buflen, unsigned long *xlated_addr);
  98 int dt_is_compatible(void *node, const char *compat);
  99 void dt_get_reg_format(void *node, u32 *naddr, u32 *nsize);
 100 int dt_get_virtual_reg(void *node, void **addr, int nres);
 101 
 102 static inline void *finddevice(const char *name)
 103 {
 104         return (dt_ops.finddevice) ? dt_ops.finddevice(name) : NULL;
 105 }
 106 
 107 static inline int getprop(void *devp, const char *name, void *buf, int buflen)
 108 {
 109         return (dt_ops.getprop) ? dt_ops.getprop(devp, name, buf, buflen) : -1;
 110 }
 111 
 112 static inline int setprop(void *devp, const char *name,
 113                           const void *buf, int buflen)
 114 {
 115         return (dt_ops.setprop) ? dt_ops.setprop(devp, name, buf, buflen) : -1;
 116 }
 117 #define setprop_val(devp, name, val) \
 118         do { \
 119                 typeof(val) x = (val); \
 120                 setprop((devp), (name), &x, sizeof(x)); \
 121         } while (0)
 122 
 123 static inline int setprop_str(void *devp, const char *name, const char *buf)
 124 {
 125         if (dt_ops.setprop)
 126                 return dt_ops.setprop(devp, name, buf, strlen(buf) + 1);
 127 
 128         return -1;
 129 }
 130 
 131 static inline int del_node(const void *devp)
 132 {
 133         return dt_ops.del_node ? dt_ops.del_node(devp) : -1;
 134 }
 135 
 136 static inline void *get_parent(const char *devp)
 137 {
 138         return dt_ops.get_parent ? dt_ops.get_parent(devp) : NULL;
 139 }
 140 
 141 static inline void *create_node(const void *parent, const char *name)
 142 {
 143         return dt_ops.create_node ? dt_ops.create_node(parent, name) : NULL;
 144 }
 145 
 146 
 147 static inline void *find_node_by_prop_value(const void *prev,
 148                                             const char *propname,
 149                                             const char *propval, int proplen)
 150 {
 151         if (dt_ops.find_node_by_prop_value)
 152                 return dt_ops.find_node_by_prop_value(prev, propname,
 153                                                       propval, proplen);
 154 
 155         return NULL;
 156 }
 157 
 158 static inline void *find_node_by_prop_value_str(const void *prev,
 159                                                 const char *propname,
 160                                                 const char *propval)
 161 {
 162         return find_node_by_prop_value(prev, propname, propval,
 163                                        strlen(propval) + 1);
 164 }
 165 
 166 static inline void *find_node_by_devtype(const void *prev,
 167                                          const char *type)
 168 {
 169         return find_node_by_prop_value_str(prev, "device_type", type);
 170 }
 171 
 172 static inline void *find_node_by_alias(const char *alias)
 173 {
 174         void *devp = finddevice("/aliases");
 175 
 176         if (devp) {
 177                 char path[MAX_PATH_LEN];
 178                 if (getprop(devp, alias, path, MAX_PATH_LEN) > 0)
 179                         return finddevice(path);
 180         }
 181 
 182         return NULL;
 183 }
 184 
 185 static inline void *find_node_by_compatible(const void *prev,
 186                                             const char *compat)
 187 {
 188         if (dt_ops.find_node_by_compatible)
 189                 return dt_ops.find_node_by_compatible(prev, compat);
 190 
 191         return NULL;
 192 }
 193 
 194 void dt_fixup_memory(u64 start, u64 size);
 195 void dt_fixup_cpu_clocks(u32 cpufreq, u32 tbfreq, u32 busfreq);
 196 void dt_fixup_clock(const char *path, u32 freq);
 197 void dt_fixup_mac_address_by_alias(const char *alias, const u8 *addr);
 198 void dt_fixup_mac_address(u32 index, const u8 *addr);
 199 void __dt_fixup_mac_addresses(u32 startindex, ...);
 200 #define dt_fixup_mac_addresses(...) \
 201         __dt_fixup_mac_addresses(0, __VA_ARGS__, NULL)
 202 
 203 
 204 static inline void *find_node_by_linuxphandle(const u32 linuxphandle)
 205 {
 206         return find_node_by_prop_value(NULL, "linux,phandle",
 207                         (char *)&linuxphandle, sizeof(u32));
 208 }
 209 
 210 static inline char *get_path(const void *phandle, char *buf, int len)
 211 {
 212         if (dt_ops.get_path)
 213                 return dt_ops.get_path(phandle, buf, len);
 214 
 215         return NULL;
 216 }
 217 
 218 static inline void *malloc(unsigned long size)
 219 {
 220         return (platform_ops.malloc) ? platform_ops.malloc(size) : NULL;
 221 }
 222 
 223 static inline void free(void *ptr)
 224 {
 225         if (platform_ops.free)
 226                 platform_ops.free(ptr);
 227 }
 228 
 229 static inline void exit(void)
 230 {
 231         if (platform_ops.exit)
 232                 platform_ops.exit();
 233         for(;;);
 234 }
 235 #define fatal(args...) { printf(args); exit(); }
 236 
 237 
 238 #define BSS_STACK(size) \
 239         static char _bss_stack[size]; \
 240         void *_platform_stack_top = _bss_stack + sizeof(_bss_stack);
 241 
 242 extern unsigned long timebase_period_ns;
 243 void udelay(long delay);
 244 
 245 extern char _start[];
 246 extern char __bss_start[];
 247 extern char _end[];
 248 extern char _vmlinux_start[];
 249 extern char _vmlinux_end[];
 250 extern char _initrd_start[];
 251 extern char _initrd_end[];
 252 extern char _dtb_start[];
 253 extern char _dtb_end[];
 254 extern char _esm_blob_start[];
 255 extern char _esm_blob_end[];
 256 
 257 static inline __attribute__((const))
 258 int __ilog2_u32(u32 n)
 259 {
 260         int bit;
 261         asm ("cntlzw %0,%1" : "=r" (bit) : "r" (n));
 262         return 31 - bit;
 263 }
 264 
 265 long partial_decompress(void *inbuf, unsigned long input_size, void *outbuf,
 266         unsigned long output_size, unsigned long skip);
 267 
 268 #endif /* _PPC_BOOT_OPS_H_ */

/* [<][>][^][v][top][bottom][index][help] */