162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * init.c: Initialize internal variables used by the PROM 462306a36Sopenharmony_ci * library functions. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 762306a36Sopenharmony_ci * Copyright (C) 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/kernel.h> 1162306a36Sopenharmony_ci#include <linux/init.h> 1262306a36Sopenharmony_ci#include <linux/module.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <asm/openprom.h> 1562306a36Sopenharmony_ci#include <asm/oplib.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistruct linux_romvec *romvec; 1862306a36Sopenharmony_ciEXPORT_SYMBOL(romvec); 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cienum prom_major_version prom_vers; 2162306a36Sopenharmony_ciunsigned int prom_rev, prom_prev; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci/* The root node of the prom device tree. */ 2462306a36Sopenharmony_ciphandle prom_root_node; 2562306a36Sopenharmony_ciEXPORT_SYMBOL(prom_root_node); 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci/* Pointer to the device tree operations structure. */ 2862306a36Sopenharmony_cistruct linux_nodeops *prom_nodeops; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci/* You must call prom_init() before you attempt to use any of the 3162306a36Sopenharmony_ci * routines in the prom library. 3262306a36Sopenharmony_ci * It gets passed the pointer to the PROM vector. 3362306a36Sopenharmony_ci */ 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_civoid __init prom_init(struct linux_romvec *rp) 3662306a36Sopenharmony_ci{ 3762306a36Sopenharmony_ci romvec = rp; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci switch(romvec->pv_romvers) { 4062306a36Sopenharmony_ci case 0: 4162306a36Sopenharmony_ci prom_vers = PROM_V0; 4262306a36Sopenharmony_ci break; 4362306a36Sopenharmony_ci case 2: 4462306a36Sopenharmony_ci prom_vers = PROM_V2; 4562306a36Sopenharmony_ci break; 4662306a36Sopenharmony_ci case 3: 4762306a36Sopenharmony_ci prom_vers = PROM_V3; 4862306a36Sopenharmony_ci break; 4962306a36Sopenharmony_ci default: 5062306a36Sopenharmony_ci prom_printf("PROMLIB: Bad PROM version %d\n", 5162306a36Sopenharmony_ci romvec->pv_romvers); 5262306a36Sopenharmony_ci prom_halt(); 5362306a36Sopenharmony_ci break; 5462306a36Sopenharmony_ci } 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci prom_rev = romvec->pv_plugin_revision; 5762306a36Sopenharmony_ci prom_prev = romvec->pv_printrev; 5862306a36Sopenharmony_ci prom_nodeops = romvec->pv_nodeops; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci prom_root_node = prom_getsibling(0); 6162306a36Sopenharmony_ci if ((prom_root_node == 0) || ((s32)prom_root_node == -1)) 6262306a36Sopenharmony_ci prom_halt(); 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci if((((unsigned long) prom_nodeops) == 0) || 6562306a36Sopenharmony_ci (((unsigned long) prom_nodeops) == -1)) 6662306a36Sopenharmony_ci prom_halt(); 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci prom_meminit(); 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci prom_ranges_init(); 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci printk("PROMLIB: Sun Boot Prom Version %d Revision %d\n", 7362306a36Sopenharmony_ci romvec->pv_romvers, prom_rev); 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci /* Initialization successful. */ 7662306a36Sopenharmony_ci} 77