1/* $Id: init.c,v 1.1.1.1 2008/10/15 03:26:19 james26_jang 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 17enum prom_major_version prom_vers; 18unsigned int prom_rev, prom_prev; 19 20/* The root node of the prom device tree. */ 21int prom_root_node; 22int prom_stdin, prom_stdout; 23int 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 30extern void prom_meminit(void); 31extern void prom_cif_init(void *, void *); 32 33void __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 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 48 prom_chosen_node = prom_finddevice("/chosen"); 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 /* Version field is expected to be 'OBP xx.yy.zz date...' */ 67 68 p = buffer + 4; 69 while (p && isdigit(*p) && i < 3) { 70 ints[i++] = simple_strtoul(p, NULL, 0); 71 if ((p = strchr(p, '.')) != NULL) 72 p++; 73 } 74 if (i != 3) 75 goto strange_version; 76 77 prom_rev = ints[1]; 78 prom_prev = (ints[0] << 16) | (ints[1] << 8) | ints[2]; 79 80 printk ("PROMLIB: Sun IEEE Boot Prom %s\n", buffer + 4); 81 82 prom_meminit(); 83 84 /* Initialization successful. */ 85 return; 86 87strange_version: 88 prom_printf ("Strange OBP version `%s'.\n", buffer); 89 prom_halt (); 90} 91