diff options
Diffstat (limited to 'arch/sparc64/prom/init.c')
-rw-r--r-- | arch/sparc64/prom/init.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/arch/sparc64/prom/init.c b/arch/sparc64/prom/init.c new file mode 100644 index 000000000000..817faae058cd --- /dev/null +++ b/arch/sparc64/prom/init.c | |||
@@ -0,0 +1,101 @@ | |||
1 | /* $Id: init.c,v 1.10 1999/09/21 14:35:59 davem Exp $ | ||
2 | * init.c: Initialize internal variables used by the PROM | ||
3 | * library functions. | ||
4 | * | ||
5 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | ||
6 | * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) | ||
7 | */ | ||
8 | |||
9 | #include <linux/kernel.h> | ||
10 | #include <linux/init.h> | ||
11 | #include <linux/string.h> | ||
12 | #include <linux/ctype.h> | ||
13 | |||
14 | #include <asm/openprom.h> | ||
15 | #include <asm/oplib.h> | ||
16 | |||
17 | enum prom_major_version prom_vers; | ||
18 | unsigned int prom_rev, prom_prev; | ||
19 | |||
20 | /* The root node of the prom device tree. */ | ||
21 | int prom_root_node; | ||
22 | int prom_stdin, prom_stdout; | ||
23 | int prom_chosen_node; | ||
24 | |||
25 | /* You must call prom_init() before you attempt to use any of the | ||
26 | * routines in the prom library. It returns 0 on success, 1 on | ||
27 | * failure. It gets passed the pointer to the PROM vector. | ||
28 | */ | ||
29 | |||
30 | extern void prom_meminit(void); | ||
31 | extern void prom_cif_init(void *, void *); | ||
32 | |||
33 | void __init prom_init(void *cif_handler, void *cif_stack) | ||
34 | { | ||
35 | char buffer[80], *p; | ||
36 | int ints[3]; | ||
37 | int node; | ||
38 | int i = 0; | ||
39 | int bufadjust; | ||
40 | |||
41 | prom_vers = PROM_P1275; | ||
42 | |||
43 | prom_cif_init(cif_handler, cif_stack); | ||
44 | |||
45 | prom_root_node = prom_getsibling(0); | ||
46 | if((prom_root_node == 0) || (prom_root_node == -1)) | ||
47 | prom_halt(); | ||
48 | |||
49 | prom_chosen_node = prom_finddevice("/chosen"); | ||
50 | if (!prom_chosen_node || prom_chosen_node == -1) | ||
51 | prom_halt(); | ||
52 | |||
53 | prom_stdin = prom_getint (prom_chosen_node, "stdin"); | ||
54 | prom_stdout = prom_getint (prom_chosen_node, "stdout"); | ||
55 | |||
56 | node = prom_finddevice("/openprom"); | ||
57 | if (!node || node == -1) | ||
58 | prom_halt(); | ||
59 | |||
60 | prom_getstring (node, "version", buffer, sizeof (buffer)); | ||
61 | |||
62 | prom_printf ("\n"); | ||
63 | |||
64 | if (strncmp (buffer, "OBP ", 4)) | ||
65 | goto strange_version; | ||
66 | |||
67 | /* | ||
68 | * Version field is expected to be 'OBP xx.yy.zz date...' | ||
69 | * However, Sun can't stick to this format very well, so | ||
70 | * we need to check for 'OBP xx.yy.zz date...' and adjust | ||
71 | * accordingly. -spot | ||
72 | */ | ||
73 | |||
74 | if (strncmp (buffer, "OBP ", 5)) | ||
75 | bufadjust = 4; | ||
76 | else | ||
77 | bufadjust = 5; | ||
78 | |||
79 | p = buffer + bufadjust; | ||
80 | while (p && isdigit(*p) && i < 3) { | ||
81 | ints[i++] = simple_strtoul(p, NULL, 0); | ||
82 | if ((p = strchr(p, '.')) != NULL) | ||
83 | p++; | ||
84 | } | ||
85 | if (i != 3) | ||
86 | goto strange_version; | ||
87 | |||
88 | prom_rev = ints[1]; | ||
89 | prom_prev = (ints[0] << 16) | (ints[1] << 8) | ints[2]; | ||
90 | |||
91 | printk ("PROMLIB: Sun IEEE Boot Prom %s\n", buffer + bufadjust); | ||
92 | |||
93 | prom_meminit(); | ||
94 | |||
95 | /* Initialization successful. */ | ||
96 | return; | ||
97 | |||
98 | strange_version: | ||
99 | prom_printf ("Strange OBP version `%s'.\n", buffer); | ||
100 | prom_halt (); | ||
101 | } | ||