diff options
Diffstat (limited to 'arch/sparc64/prom/init.c')
-rw-r--r-- | arch/sparc64/prom/init.c | 60 |
1 files changed, 8 insertions, 52 deletions
diff --git a/arch/sparc64/prom/init.c b/arch/sparc64/prom/init.c index f3cc2d8578b2..1c0db842a6f4 100644 --- a/arch/sparc64/prom/init.c +++ b/arch/sparc64/prom/init.c | |||
@@ -14,11 +14,10 @@ | |||
14 | #include <asm/openprom.h> | 14 | #include <asm/openprom.h> |
15 | #include <asm/oplib.h> | 15 | #include <asm/oplib.h> |
16 | 16 | ||
17 | enum prom_major_version prom_vers; | 17 | /* OBP version string. */ |
18 | unsigned int prom_rev, prom_prev; | 18 | char prom_version[80]; |
19 | 19 | ||
20 | /* The root node of the prom device tree. */ | 20 | /* The root node of the prom device tree. */ |
21 | int prom_root_node; | ||
22 | int prom_stdin, prom_stdout; | 21 | int prom_stdin, prom_stdout; |
23 | int prom_chosen_node; | 22 | int prom_chosen_node; |
24 | 23 | ||
@@ -31,68 +30,25 @@ extern void prom_cif_init(void *, void *); | |||
31 | 30 | ||
32 | void __init prom_init(void *cif_handler, void *cif_stack) | 31 | void __init prom_init(void *cif_handler, void *cif_stack) |
33 | { | 32 | { |
34 | char buffer[80], *p; | ||
35 | int ints[3]; | ||
36 | int node; | 33 | int node; |
37 | int i = 0; | ||
38 | int bufadjust; | ||
39 | |||
40 | prom_vers = PROM_P1275; | ||
41 | 34 | ||
42 | prom_cif_init(cif_handler, cif_stack); | 35 | prom_cif_init(cif_handler, cif_stack); |
43 | 36 | ||
44 | prom_root_node = prom_getsibling(0); | ||
45 | if((prom_root_node == 0) || (prom_root_node == -1)) | ||
46 | prom_halt(); | ||
47 | |||
48 | prom_chosen_node = prom_finddevice(prom_chosen_path); | 37 | prom_chosen_node = prom_finddevice(prom_chosen_path); |
49 | if (!prom_chosen_node || prom_chosen_node == -1) | 38 | if (!prom_chosen_node || prom_chosen_node == -1) |
50 | prom_halt(); | 39 | prom_halt(); |
51 | 40 | ||
52 | prom_stdin = prom_getint (prom_chosen_node, "stdin"); | 41 | prom_stdin = prom_getint(prom_chosen_node, "stdin"); |
53 | prom_stdout = prom_getint (prom_chosen_node, "stdout"); | 42 | prom_stdout = prom_getint(prom_chosen_node, "stdout"); |
54 | 43 | ||
55 | node = prom_finddevice("/openprom"); | 44 | node = prom_finddevice("/openprom"); |
56 | if (!node || node == -1) | 45 | if (!node || node == -1) |
57 | prom_halt(); | 46 | prom_halt(); |
58 | 47 | ||
59 | prom_getstring (node, "version", buffer, sizeof (buffer)); | 48 | prom_getstring(node, "version", prom_version, sizeof(prom_version)); |
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 | 49 | ||
92 | /* Initialization successful. */ | 50 | prom_printf("\n"); |
93 | return; | ||
94 | 51 | ||
95 | strange_version: | 52 | printk("PROMLIB: Sun IEEE Boot Prom '%s'\n", prom_version); |
96 | prom_printf ("Strange OBP version `%s'.\n", buffer); | 53 | printk("PROMLIB: Root node compatible: %s\n", prom_root_compatible); |
97 | prom_halt (); | ||
98 | } | 54 | } |