Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * include/asm-mips/dec/prom.h | |
3 | * | |
4 | * DECstation PROM interface. | |
5 | * | |
6 | * Copyright (C) 2002 Maciej W. Rozycki | |
7 | * | |
8 | * This program is free software; you can redistribute it and/or | |
9 | * modify it under the terms of the GNU General Public License | |
10 | * as published by the Free Software Foundation; either version | |
11 | * 2 of the License, or (at your option) any later version. | |
12 | * | |
13 | * Based on arch/mips/dec/prom/prom.h by the Anonymous. | |
14 | */ | |
15 | #ifndef _ASM_DEC_PROM_H | |
16 | #define _ASM_DEC_PROM_H | |
17 | ||
1da177e4 LT |
18 | #include <linux/types.h> |
19 | ||
20 | #include <asm/addrspace.h> | |
21 | ||
22 | /* | |
23 | * PMAX/3MAX PROM entry points for DS2100/3100's and DS5000/2xx's. | |
24 | * Many of these will work for MIPSen as well! | |
25 | */ | |
3bd4c902 | 26 | #define VEC_RESET (u64 *)CKSEG1ADDR(0x1fc00000) |
1da177e4 LT |
27 | /* Prom base address */ |
28 | ||
29 | #define PMAX_PROM_ENTRY(x) (VEC_RESET + (x)) /* Prom jump table */ | |
30 | ||
31 | #define PMAX_PROM_HALT PMAX_PROM_ENTRY(2) /* valid on MIPSen */ | |
32 | #define PMAX_PROM_AUTOBOOT PMAX_PROM_ENTRY(5) /* valid on MIPSen */ | |
33 | #define PMAX_PROM_OPEN PMAX_PROM_ENTRY(6) | |
34 | #define PMAX_PROM_READ PMAX_PROM_ENTRY(7) | |
35 | #define PMAX_PROM_CLOSE PMAX_PROM_ENTRY(10) | |
36 | #define PMAX_PROM_LSEEK PMAX_PROM_ENTRY(11) | |
37 | #define PMAX_PROM_GETCHAR PMAX_PROM_ENTRY(12) | |
38 | #define PMAX_PROM_PUTCHAR PMAX_PROM_ENTRY(13) /* 12 on MIPSen */ | |
39 | #define PMAX_PROM_GETS PMAX_PROM_ENTRY(15) | |
40 | #define PMAX_PROM_PRINTF PMAX_PROM_ENTRY(17) | |
41 | #define PMAX_PROM_GETENV PMAX_PROM_ENTRY(33) /* valid on MIPSen */ | |
42 | ||
43 | ||
44 | /* | |
45 | * Magic number indicating REX PROM available on DECstation. Found in | |
46 | * register a2 on transfer of control to program from PROM. | |
47 | */ | |
48 | #define REX_PROM_MAGIC 0x30464354 | |
49 | ||
875d43e7 | 50 | #ifdef CONFIG_64BIT |
1da177e4 | 51 | |
07217d75 | 52 | #define prom_is_rex(magic) 1 /* KN04 and KN05 are REX PROMs. */ |
1da177e4 | 53 | |
875d43e7 | 54 | #else /* !CONFIG_64BIT */ |
1da177e4 LT |
55 | |
56 | #define prom_is_rex(magic) ((magic) == REX_PROM_MAGIC) | |
57 | ||
875d43e7 | 58 | #endif /* !CONFIG_64BIT */ |
1da177e4 LT |
59 | |
60 | ||
61 | /* | |
62 | * 3MIN/MAXINE PROM entry points for DS5000/1xx's, DS5000/xx's and | |
63 | * DS5000/2x0. | |
64 | */ | |
65 | #define REX_PROM_GETBITMAP 0x84/4 /* get mem bitmap */ | |
66 | #define REX_PROM_GETCHAR 0x24/4 /* getch() */ | |
67 | #define REX_PROM_GETENV 0x64/4 /* get env. variable */ | |
68 | #define REX_PROM_GETSYSID 0x80/4 /* get system id */ | |
69 | #define REX_PROM_GETTCINFO 0xa4/4 | |
70 | #define REX_PROM_PRINTF 0x30/4 /* printf() */ | |
71 | #define REX_PROM_SLOTADDR 0x6c/4 /* slotaddr */ | |
72 | #define REX_PROM_BOOTINIT 0x54/4 /* open() */ | |
73 | #define REX_PROM_BOOTREAD 0x58/4 /* read() */ | |
74 | #define REX_PROM_CLEARCACHE 0x7c/4 | |
75 | ||
76 | ||
77 | /* | |
78 | * Used by rex_getbitmap(). | |
79 | */ | |
80 | typedef struct { | |
81 | int pagesize; | |
82 | unsigned char bitmap[0]; | |
83 | } memmap; | |
84 | ||
85 | ||
86 | /* | |
87 | * Function pointers as read from a PROM's callback vector. | |
88 | */ | |
89 | extern int (*__rex_bootinit)(void); | |
90 | extern int (*__rex_bootread)(void); | |
91 | extern int (*__rex_getbitmap)(memmap *); | |
92 | extern unsigned long *(*__rex_slot_address)(int); | |
93 | extern void *(*__rex_gettcinfo)(void); | |
94 | extern int (*__rex_getsysid)(void); | |
95 | extern void (*__rex_clear_cache)(void); | |
96 | ||
97 | extern int (*__prom_getchar)(void); | |
98 | extern char *(*__prom_getenv)(char *); | |
99 | extern int (*__prom_printf)(char *, ...); | |
100 | ||
101 | extern int (*__pmax_open)(char*, int); | |
102 | extern int (*__pmax_lseek)(int, long, int); | |
103 | extern int (*__pmax_read)(int, void *, int); | |
104 | extern int (*__pmax_close)(int); | |
105 | ||
106 | ||
875d43e7 | 107 | #ifdef CONFIG_64BIT |
1da177e4 LT |
108 | |
109 | /* | |
110 | * On MIPS64 we have to call PROM functions via a helper | |
25985edc | 111 | * dispatcher to accommodate ABI incompatibilities. |
1da177e4 | 112 | */ |
a76f9fe1 MR |
113 | #define __DEC_PROM_O32(fun, arg) fun arg __asm__(#fun); \ |
114 | __asm__(#fun " = call_o32") | |
115 | ||
116 | int __DEC_PROM_O32(_rex_bootinit, (int (*)(void))); | |
117 | int __DEC_PROM_O32(_rex_bootread, (int (*)(void))); | |
118 | int __DEC_PROM_O32(_rex_getbitmap, (int (*)(memmap *), memmap *)); | |
119 | unsigned long *__DEC_PROM_O32(_rex_slot_address, | |
120 | (unsigned long *(*)(int), int)); | |
121 | void *__DEC_PROM_O32(_rex_gettcinfo, (void *(*)(void))); | |
122 | int __DEC_PROM_O32(_rex_getsysid, (int (*)(void))); | |
123 | void __DEC_PROM_O32(_rex_clear_cache, (void (*)(void))); | |
124 | ||
125 | int __DEC_PROM_O32(_prom_getchar, (int (*)(void))); | |
126 | char *__DEC_PROM_O32(_prom_getenv, (char *(*)(char *), char *)); | |
127 | int __DEC_PROM_O32(_prom_printf, (int (*)(char *, ...), char *, ...)); | |
1da177e4 LT |
128 | |
129 | ||
130 | #define rex_bootinit() _rex_bootinit(__rex_bootinit) | |
131 | #define rex_bootread() _rex_bootread(__rex_bootread) | |
132 | #define rex_getbitmap(x) _rex_getbitmap(__rex_getbitmap, x) | |
133 | #define rex_slot_address(x) _rex_slot_address(__rex_slot_address, x) | |
134 | #define rex_gettcinfo() _rex_gettcinfo(__rex_gettcinfo) | |
135 | #define rex_getsysid() _rex_getsysid(__rex_getsysid) | |
136 | #define rex_clear_cache() _rex_clear_cache(__rex_clear_cache) | |
137 | ||
138 | #define prom_getchar() _prom_getchar(__prom_getchar) | |
139 | #define prom_getenv(x) _prom_getenv(__prom_getenv, x) | |
140 | #define prom_printf(x...) _prom_printf(__prom_printf, x) | |
141 | ||
875d43e7 | 142 | #else /* !CONFIG_64BIT */ |
1da177e4 LT |
143 | |
144 | /* | |
145 | * On plain MIPS we just call PROM functions directly. | |
146 | */ | |
147 | #define rex_bootinit __rex_bootinit | |
148 | #define rex_bootread __rex_bootread | |
149 | #define rex_getbitmap __rex_getbitmap | |
150 | #define rex_slot_address __rex_slot_address | |
151 | #define rex_gettcinfo __rex_gettcinfo | |
152 | #define rex_getsysid __rex_getsysid | |
153 | #define rex_clear_cache __rex_clear_cache | |
154 | ||
155 | #define prom_getchar __prom_getchar | |
156 | #define prom_getenv __prom_getenv | |
157 | #define prom_printf __prom_printf | |
158 | ||
159 | #define pmax_open __pmax_open | |
160 | #define pmax_lseek __pmax_lseek | |
161 | #define pmax_read __pmax_read | |
162 | #define pmax_close __pmax_close | |
163 | ||
875d43e7 | 164 | #endif /* !CONFIG_64BIT */ |
1da177e4 LT |
165 | |
166 | ||
167 | extern void prom_meminit(u32); | |
168 | extern void prom_identify_arch(u32); | |
169 | extern void prom_init_cmdline(s32, s32 *, u32); | |
170 | ||
171 | extern void register_prom_console(void); | |
172 | extern void unregister_prom_console(void); | |
173 | ||
174 | #endif /* _ASM_DEC_PROM_H */ |