11da177e4SLinus Torvalds /* $Id: init.c,v 1.9 1996/12/18 06:46:55 tridge Exp $ 21da177e4SLinus Torvalds * init.c: Initialize internal variables used by the PROM 31da177e4SLinus Torvalds * library functions. 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 61da177e4SLinus Torvalds */ 71da177e4SLinus Torvalds 81da177e4SLinus Torvalds #include <linux/config.h> 91da177e4SLinus Torvalds #include <linux/kernel.h> 101da177e4SLinus Torvalds #include <linux/init.h> 111da177e4SLinus Torvalds 121da177e4SLinus Torvalds #include <asm/openprom.h> 131da177e4SLinus Torvalds #include <asm/oplib.h> 141da177e4SLinus Torvalds 151da177e4SLinus Torvalds struct linux_romvec *romvec; 161da177e4SLinus Torvalds enum prom_major_version prom_vers; 171da177e4SLinus Torvalds unsigned int prom_rev, prom_prev; 181da177e4SLinus Torvalds 191da177e4SLinus Torvalds /* The root node of the prom device tree. */ 201da177e4SLinus Torvalds int prom_root_node; 211da177e4SLinus Torvalds 221da177e4SLinus Torvalds /* Pointer to the device tree operations structure. */ 231da177e4SLinus Torvalds struct linux_nodeops *prom_nodeops; 241da177e4SLinus Torvalds 251da177e4SLinus Torvalds /* You must call prom_init() before you attempt to use any of the 261da177e4SLinus Torvalds * routines in the prom library. It returns 0 on success, 1 on 271da177e4SLinus Torvalds * failure. It gets passed the pointer to the PROM vector. 281da177e4SLinus Torvalds */ 291da177e4SLinus Torvalds 301da177e4SLinus Torvalds extern void prom_meminit(void); 311da177e4SLinus Torvalds extern void prom_ranges_init(void); 321da177e4SLinus Torvalds 331da177e4SLinus Torvalds void __init prom_init(struct linux_romvec *rp) 341da177e4SLinus Torvalds { 351da177e4SLinus Torvalds #ifdef CONFIG_AP1000 361da177e4SLinus Torvalds extern struct linux_romvec *ap_prom_init(void); 371da177e4SLinus Torvalds rp = ap_prom_init(); 381da177e4SLinus Torvalds #endif 391da177e4SLinus Torvalds 401da177e4SLinus Torvalds romvec = rp; 411da177e4SLinus Torvalds #ifndef CONFIG_SUN3 421da177e4SLinus Torvalds switch(romvec->pv_romvers) { 431da177e4SLinus Torvalds case 0: 441da177e4SLinus Torvalds prom_vers = PROM_V0; 451da177e4SLinus Torvalds break; 461da177e4SLinus Torvalds case 2: 471da177e4SLinus Torvalds prom_vers = PROM_V2; 481da177e4SLinus Torvalds break; 491da177e4SLinus Torvalds case 3: 501da177e4SLinus Torvalds prom_vers = PROM_V3; 511da177e4SLinus Torvalds break; 521da177e4SLinus Torvalds case 4: 531da177e4SLinus Torvalds prom_vers = PROM_P1275; 541da177e4SLinus Torvalds prom_printf("PROMLIB: Sun IEEE Prom not supported yet\n"); 551da177e4SLinus Torvalds prom_halt(); 561da177e4SLinus Torvalds break; 571da177e4SLinus Torvalds case 42: /* why not :-) */ 581da177e4SLinus Torvalds prom_vers = PROM_AP1000; 591da177e4SLinus Torvalds break; 601da177e4SLinus Torvalds 611da177e4SLinus Torvalds default: 621da177e4SLinus Torvalds prom_printf("PROMLIB: Bad PROM version %d\n", 631da177e4SLinus Torvalds romvec->pv_romvers); 641da177e4SLinus Torvalds prom_halt(); 651da177e4SLinus Torvalds break; 661da177e4SLinus Torvalds }; 671da177e4SLinus Torvalds 681da177e4SLinus Torvalds prom_rev = romvec->pv_plugin_revision; 691da177e4SLinus Torvalds prom_prev = romvec->pv_printrev; 701da177e4SLinus Torvalds prom_nodeops = romvec->pv_nodeops; 711da177e4SLinus Torvalds 721da177e4SLinus Torvalds prom_root_node = prom_getsibling(0); 731da177e4SLinus Torvalds if((prom_root_node == 0) || (prom_root_node == -1)) 741da177e4SLinus Torvalds prom_halt(); 751da177e4SLinus Torvalds 761da177e4SLinus Torvalds if((((unsigned long) prom_nodeops) == 0) || 771da177e4SLinus Torvalds (((unsigned long) prom_nodeops) == -1)) 781da177e4SLinus Torvalds prom_halt(); 791da177e4SLinus Torvalds 801da177e4SLinus Torvalds prom_meminit(); 811da177e4SLinus Torvalds 821da177e4SLinus Torvalds prom_ranges_init(); 831da177e4SLinus Torvalds #endif 841da177e4SLinus Torvalds // printk("PROMLIB: Sun Boot Prom Version %d Revision %d\n", 851da177e4SLinus Torvalds // romvec->pv_romvers, prom_rev); 861da177e4SLinus Torvalds 871da177e4SLinus Torvalds /* Initialization successful. */ 881da177e4SLinus Torvalds return; 891da177e4SLinus Torvalds } 90