]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
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 | } |