18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * init.c: Initialize internal variables used by the PROM 48c2ecf20Sopenharmony_ci * library functions. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 78c2ecf20Sopenharmony_ci * Copyright (C) 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/kernel.h> 118c2ecf20Sopenharmony_ci#include <linux/init.h> 128c2ecf20Sopenharmony_ci#include <linux/module.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include <asm/openprom.h> 158c2ecf20Sopenharmony_ci#include <asm/oplib.h> 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_cistruct linux_romvec *romvec; 188c2ecf20Sopenharmony_ciEXPORT_SYMBOL(romvec); 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_cienum prom_major_version prom_vers; 218c2ecf20Sopenharmony_ciunsigned int prom_rev, prom_prev; 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci/* The root node of the prom device tree. */ 248c2ecf20Sopenharmony_ciphandle prom_root_node; 258c2ecf20Sopenharmony_ciEXPORT_SYMBOL(prom_root_node); 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci/* Pointer to the device tree operations structure. */ 288c2ecf20Sopenharmony_cistruct linux_nodeops *prom_nodeops; 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci/* You must call prom_init() before you attempt to use any of the 318c2ecf20Sopenharmony_ci * routines in the prom library. 328c2ecf20Sopenharmony_ci * It gets passed the pointer to the PROM vector. 338c2ecf20Sopenharmony_ci */ 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_civoid __init prom_init(struct linux_romvec *rp) 368c2ecf20Sopenharmony_ci{ 378c2ecf20Sopenharmony_ci romvec = rp; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci switch(romvec->pv_romvers) { 408c2ecf20Sopenharmony_ci case 0: 418c2ecf20Sopenharmony_ci prom_vers = PROM_V0; 428c2ecf20Sopenharmony_ci break; 438c2ecf20Sopenharmony_ci case 2: 448c2ecf20Sopenharmony_ci prom_vers = PROM_V2; 458c2ecf20Sopenharmony_ci break; 468c2ecf20Sopenharmony_ci case 3: 478c2ecf20Sopenharmony_ci prom_vers = PROM_V3; 488c2ecf20Sopenharmony_ci break; 498c2ecf20Sopenharmony_ci default: 508c2ecf20Sopenharmony_ci prom_printf("PROMLIB: Bad PROM version %d\n", 518c2ecf20Sopenharmony_ci romvec->pv_romvers); 528c2ecf20Sopenharmony_ci prom_halt(); 538c2ecf20Sopenharmony_ci break; 548c2ecf20Sopenharmony_ci } 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci prom_rev = romvec->pv_plugin_revision; 578c2ecf20Sopenharmony_ci prom_prev = romvec->pv_printrev; 588c2ecf20Sopenharmony_ci prom_nodeops = romvec->pv_nodeops; 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci prom_root_node = prom_getsibling(0); 618c2ecf20Sopenharmony_ci if ((prom_root_node == 0) || ((s32)prom_root_node == -1)) 628c2ecf20Sopenharmony_ci prom_halt(); 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci if((((unsigned long) prom_nodeops) == 0) || 658c2ecf20Sopenharmony_ci (((unsigned long) prom_nodeops) == -1)) 668c2ecf20Sopenharmony_ci prom_halt(); 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci prom_meminit(); 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci prom_ranges_init(); 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci printk("PROMLIB: Sun Boot Prom Version %d Revision %d\n", 738c2ecf20Sopenharmony_ci romvec->pv_romvers, prom_rev); 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ci /* Initialization successful. */ 768c2ecf20Sopenharmony_ci} 77