1*03831d35Sstevel /* 2*03831d35Sstevel * CDDL HEADER START 3*03831d35Sstevel * 4*03831d35Sstevel * The contents of this file are subject to the terms of the 5*03831d35Sstevel * Common Development and Distribution License, Version 1.0 only 6*03831d35Sstevel * (the "License"). You may not use this file except in compliance 7*03831d35Sstevel * with the License. 8*03831d35Sstevel * 9*03831d35Sstevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*03831d35Sstevel * or http://www.opensolaris.org/os/licensing. 11*03831d35Sstevel * See the License for the specific language governing permissions 12*03831d35Sstevel * and limitations under the License. 13*03831d35Sstevel * 14*03831d35Sstevel * When distributing Covered Code, include this CDDL HEADER in each 15*03831d35Sstevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*03831d35Sstevel * If applicable, add the following below this CDDL HEADER, with the 17*03831d35Sstevel * fields enclosed by brackets "[]" replaced with your own identifying 18*03831d35Sstevel * information: Portions Copyright [yyyy] [name of copyright owner] 19*03831d35Sstevel * 20*03831d35Sstevel * CDDL HEADER END 21*03831d35Sstevel */ 22*03831d35Sstevel /* 23*03831d35Sstevel * Copyright (c) 1999-2001 by Sun Microsystems, Inc. 24*03831d35Sstevel * All rights reserved. 25*03831d35Sstevel */ 26*03831d35Sstevel 27*03831d35Sstevel #pragma ident "%Z%%M% %I% %E% SMI" 28*03831d35Sstevel 29*03831d35Sstevel #include <stdio.h> 30*03831d35Sstevel #include <stdlib.h> 31*03831d35Sstevel #include <unistd.h> 32*03831d35Sstevel #include <ctype.h> 33*03831d35Sstevel #include <string.h> 34*03831d35Sstevel #include <kvm.h> 35*03831d35Sstevel #include <varargs.h> 36*03831d35Sstevel #include <errno.h> 37*03831d35Sstevel #include <time.h> 38*03831d35Sstevel #include <dirent.h> 39*03831d35Sstevel #include <fcntl.h> 40*03831d35Sstevel #include <sys/param.h> 41*03831d35Sstevel #include <sys/stat.h> 42*03831d35Sstevel #include <sys/types.h> 43*03831d35Sstevel #include <sys/utsname.h> 44*03831d35Sstevel #include <sys/openpromio.h> 45*03831d35Sstevel #include <kstat.h> 46*03831d35Sstevel #include <libintl.h> 47*03831d35Sstevel #include <syslog.h> 48*03831d35Sstevel #include <sys/dkio.h> 49*03831d35Sstevel #include "pdevinfo.h" 50*03831d35Sstevel #include "display.h" 51*03831d35Sstevel #include "pdevinfo_sun4u.h" 52*03831d35Sstevel #include "display_sun4u.h" 53*03831d35Sstevel #include "libprtdiag.h" 54*03831d35Sstevel 55*03831d35Sstevel #if !defined(TEXT_DOMAIN) 56*03831d35Sstevel #define TEXT_DOMAIN "SYS_TEST" 57*03831d35Sstevel #endif 58*03831d35Sstevel 59*03831d35Sstevel 60*03831d35Sstevel void 61*03831d35Sstevel disp_prom_version(Prom_node *flashprom) 62*03831d35Sstevel { 63*03831d35Sstevel Prop *version; 64*03831d35Sstevel char *vers; /* OBP version */ 65*03831d35Sstevel char *temp; 66*03831d35Sstevel 67*03831d35Sstevel /* Look version */ 68*03831d35Sstevel version = find_prop(flashprom, "version"); 69*03831d35Sstevel 70*03831d35Sstevel vers = (char *)get_prop_val(version); 71*03831d35Sstevel 72*03831d35Sstevel if (vers != NULL) { 73*03831d35Sstevel log_printf(" %s ", vers, 0); 74*03831d35Sstevel 75*03831d35Sstevel /* 76*03831d35Sstevel * POST string follows the NULL terminated OBP 77*03831d35Sstevel * version string. Do not attempt to print POST 78*03831d35Sstevel * string unless node size is larger than the 79*03831d35Sstevel * length of the OBP version string. 80*03831d35Sstevel */ 81*03831d35Sstevel if ((strlen(vers) + 1) < version->size) { 82*03831d35Sstevel temp = vers + strlen(vers) + 1; 83*03831d35Sstevel log_printf("%s", temp, 0); 84*03831d35Sstevel } 85*03831d35Sstevel } 86*03831d35Sstevel 87*03831d35Sstevel log_printf("\n", 0); 88*03831d35Sstevel } 89*03831d35Sstevel 90*03831d35Sstevel 91*03831d35Sstevel void 92*03831d35Sstevel platform_disp_prom_version(Sys_tree *tree) 93*03831d35Sstevel { 94*03831d35Sstevel Board_node *bnode; 95*03831d35Sstevel Prom_node *pnode; 96*03831d35Sstevel 97*03831d35Sstevel bnode = tree->bd_list; 98*03831d35Sstevel 99*03831d35Sstevel /* Display Prom revision header */ 100*03831d35Sstevel log_printf(dgettext(TEXT_DOMAIN, "System PROM " 101*03831d35Sstevel "revisions:\n"), 0); 102*03831d35Sstevel log_printf("----------------------\n", 0); 103*03831d35Sstevel 104*03831d35Sstevel if ((pnode = find_device(bnode, 0x1F, SBUS_NAME)) == NULL) { 105*03831d35Sstevel pnode = find_pci_bus(bnode->nodes, 0x1F, 1); 106*03831d35Sstevel } 107*03831d35Sstevel 108*03831d35Sstevel /* 109*03831d35Sstevel * in case of platforms with multiple flashproms, find and 110*03831d35Sstevel * display all proms with a "version"(OBP) property. bug 4187301 111*03831d35Sstevel */ 112*03831d35Sstevel for (pnode = dev_find_node(pnode, "flashprom"); pnode != NULL; 113*03831d35Sstevel pnode = dev_next_node(pnode, "flashprom")) { 114*03831d35Sstevel if (find_prop(pnode, "version") != NULL) { 115*03831d35Sstevel disp_prom_version(pnode); 116*03831d35Sstevel } 117*03831d35Sstevel } 118*03831d35Sstevel } 119*03831d35Sstevel 120*03831d35Sstevel int 121*03831d35Sstevel get_pci_class_code_reg(Prom_node *card_node) 122*03831d35Sstevel { 123*03831d35Sstevel void *value; 124*03831d35Sstevel 125*03831d35Sstevel /* 126*03831d35Sstevel * Get the class-code of this node and return it 127*03831d35Sstevel * if it exists. Otherwise return (-1). 128*03831d35Sstevel */ 129*03831d35Sstevel value = get_prop_val(find_prop(card_node, "class-code")); 130*03831d35Sstevel if (value != NULL) 131*03831d35Sstevel return (*(int *)value); 132*03831d35Sstevel else 133*03831d35Sstevel return (-1); 134*03831d35Sstevel } 135