xref: /openbmc/linux/arch/m68k/sun3/prom/init.c (revision 1da177e4)
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