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 | ||
1da177e4 LT |
30 | extern void prom_cif_init(void *, void *); |
31 | ||
32 | void __init prom_init(void *cif_handler, void *cif_stack) | |
33 | { | |
34 | char buffer[80], *p; | |
35 | int ints[3]; | |
36 | int node; | |
37 | int i = 0; | |
38 | int bufadjust; | |
39 | ||
40 | prom_vers = PROM_P1275; | |
41 | ||
42 | prom_cif_init(cif_handler, cif_stack); | |
43 | ||
44 | prom_root_node = prom_getsibling(0); | |
45 | if((prom_root_node == 0) || (prom_root_node == -1)) | |
46 | prom_halt(); | |
47 | ||
bff06d55 | 48 | prom_chosen_node = prom_finddevice(prom_chosen_path); |
1da177e4 LT |
49 | if (!prom_chosen_node || prom_chosen_node == -1) |
50 | prom_halt(); | |
51 | ||
52 | prom_stdin = prom_getint (prom_chosen_node, "stdin"); | |
53 | prom_stdout = prom_getint (prom_chosen_node, "stdout"); | |
54 | ||
55 | node = prom_finddevice("/openprom"); | |
56 | if (!node || node == -1) | |
57 | prom_halt(); | |
58 | ||
59 | prom_getstring (node, "version", buffer, sizeof (buffer)); | |
60 | ||
61 | prom_printf ("\n"); | |
62 | ||
63 | if (strncmp (buffer, "OBP ", 4)) | |
64 | goto strange_version; | |
65 | ||
66 | /* | |
67 | * Version field is expected to be 'OBP xx.yy.zz date...' | |
68 | * However, Sun can't stick to this format very well, so | |
69 | * we need to check for 'OBP xx.yy.zz date...' and adjust | |
70 | * accordingly. -spot | |
71 | */ | |
72 | ||
73 | if (strncmp (buffer, "OBP ", 5)) | |
74 | bufadjust = 4; | |
75 | else | |
76 | bufadjust = 5; | |
77 | ||
78 | p = buffer + bufadjust; | |
79 | while (p && isdigit(*p) && i < 3) { | |
80 | ints[i++] = simple_strtoul(p, NULL, 0); | |
81 | if ((p = strchr(p, '.')) != NULL) | |
82 | p++; | |
83 | } | |
84 | if (i != 3) | |
85 | goto strange_version; | |
86 | ||
87 | prom_rev = ints[1]; | |
88 | prom_prev = (ints[0] << 16) | (ints[1] << 8) | ints[2]; | |
89 | ||
90 | printk ("PROMLIB: Sun IEEE Boot Prom %s\n", buffer + bufadjust); | |
91 | ||
1da177e4 LT |
92 | /* Initialization successful. */ |
93 | return; | |
94 | ||
95 | strange_version: | |
96 | prom_printf ("Strange OBP version `%s'.\n", buffer); | |
97 | prom_halt (); | |
98 | } |