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