1 /* $Id: init.c,v 1.9 1996/12/18 06:46:55 tridge 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 */ 7 8 #include <linux/config.h> 9 #include <linux/kernel.h> 10 #include <linux/init.h> 11 12 #include <asm/openprom.h> 13 #include <asm/oplib.h> 14 15 struct linux_romvec *romvec; 16 enum prom_major_version prom_vers; 17 unsigned int prom_rev, prom_prev; 18 19 /* The root node of the prom device tree. */ 20 int prom_root_node; 21 22 /* Pointer to the device tree operations structure. */ 23 struct linux_nodeops *prom_nodeops; 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_ranges_init(void); 32 33 void __init prom_init(struct linux_romvec *rp) 34 { 35 #ifdef CONFIG_AP1000 36 extern struct linux_romvec *ap_prom_init(void); 37 rp = ap_prom_init(); 38 #endif 39 40 romvec = rp; 41 #ifndef CONFIG_SUN3 42 switch(romvec->pv_romvers) { 43 case 0: 44 prom_vers = PROM_V0; 45 break; 46 case 2: 47 prom_vers = PROM_V2; 48 break; 49 case 3: 50 prom_vers = PROM_V3; 51 break; 52 case 4: 53 prom_vers = PROM_P1275; 54 prom_printf("PROMLIB: Sun IEEE Prom not supported yet\n"); 55 prom_halt(); 56 break; 57 case 42: /* why not :-) */ 58 prom_vers = PROM_AP1000; 59 break; 60 61 default: 62 prom_printf("PROMLIB: Bad PROM version %d\n", 63 romvec->pv_romvers); 64 prom_halt(); 65 break; 66 }; 67 68 prom_rev = romvec->pv_plugin_revision; 69 prom_prev = romvec->pv_printrev; 70 prom_nodeops = romvec->pv_nodeops; 71 72 prom_root_node = prom_getsibling(0); 73 if((prom_root_node == 0) || (prom_root_node == -1)) 74 prom_halt(); 75 76 if((((unsigned long) prom_nodeops) == 0) || 77 (((unsigned long) prom_nodeops) == -1)) 78 prom_halt(); 79 80 prom_meminit(); 81 82 prom_ranges_init(); 83 #endif 84 // printk("PROMLIB: Sun Boot Prom Version %d Revision %d\n", 85 // romvec->pv_romvers, prom_rev); 86 87 /* Initialization successful. */ 88 return; 89 } 90