cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ops.h (7587B)


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