103831d35Sstevel /* 203831d35Sstevel * CDDL HEADER START 303831d35Sstevel * 403831d35Sstevel * The contents of this file are subject to the terms of the 5*2983dda7SMichael Bergknoff * Common Development and Distribution License (the "License"). 6*2983dda7SMichael Bergknoff * You may not use this file except in compliance with the License. 703831d35Sstevel * 803831d35Sstevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 903831d35Sstevel * or http://www.opensolaris.org/os/licensing. 1003831d35Sstevel * See the License for the specific language governing permissions 1103831d35Sstevel * and limitations under the License. 1203831d35Sstevel * 1303831d35Sstevel * When distributing Covered Code, include this CDDL HEADER in each 1403831d35Sstevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1503831d35Sstevel * If applicable, add the following below this CDDL HEADER, with the 1603831d35Sstevel * fields enclosed by brackets "[]" replaced with your own identifying 1703831d35Sstevel * information: Portions Copyright [yyyy] [name of copyright owner] 1803831d35Sstevel * 1903831d35Sstevel * CDDL HEADER END 2003831d35Sstevel */ 2103831d35Sstevel /* 22*2983dda7SMichael Bergknoff * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. 2303831d35Sstevel */ 2403831d35Sstevel 2503831d35Sstevel #include <stdio.h> 2603831d35Sstevel #include <stdlib.h> 2703831d35Sstevel #include <unistd.h> 2803831d35Sstevel #include <ctype.h> 2903831d35Sstevel #include <string.h> 3003831d35Sstevel #include <kvm.h> 3103831d35Sstevel #include <varargs.h> 3203831d35Sstevel #include <time.h> 3303831d35Sstevel #include <dirent.h> 3403831d35Sstevel #include <fcntl.h> 3503831d35Sstevel #include <sys/param.h> 3603831d35Sstevel #include <sys/stat.h> 3703831d35Sstevel #include <sys/types.h> 3803831d35Sstevel #include <sys/utsname.h> 3903831d35Sstevel #include <sys/openpromio.h> 4003831d35Sstevel #include <libintl.h> 4103831d35Sstevel #include <syslog.h> 4203831d35Sstevel #include <sys/dkio.h> 4303831d35Sstevel #include "pdevinfo.h" 4403831d35Sstevel #include "display.h" 4503831d35Sstevel #include "pdevinfo_sun4u.h" 4603831d35Sstevel #include "display_sun4u.h" 4703831d35Sstevel #include "libprtdiag.h" 4803831d35Sstevel 4903831d35Sstevel 5003831d35Sstevel #if !defined(TEXT_DOMAIN) 5103831d35Sstevel #define TEXT_DOMAIN "SYS_TEST" 5203831d35Sstevel #endif 5303831d35Sstevel 5403831d35Sstevel extern int sys_clk; 5503831d35Sstevel 5603831d35Sstevel int 5703831d35Sstevel display(Sys_tree *tree, 5803831d35Sstevel Prom_node *root, 5903831d35Sstevel struct system_kstat_data *kstats, 6003831d35Sstevel int syserrlog) 6103831d35Sstevel { 6203831d35Sstevel int exit_code = 0; /* init to all OK */ 6303831d35Sstevel void *value; /* used for opaque PROM data */ 6403831d35Sstevel struct mem_total memory_total; /* Total memory in system */ 6503831d35Sstevel struct grp_info grps; /* Info on all groups in system */ 6603831d35Sstevel 6703831d35Sstevel sys_clk = -1; /* System clock freq. (in MHz) */ 6803831d35Sstevel 6903831d35Sstevel /* 7003831d35Sstevel * silently check for any types of machine errors 7103831d35Sstevel */ 7203831d35Sstevel exit_code = error_check(tree, kstats); 7303831d35Sstevel 7403831d35Sstevel /* 7503831d35Sstevel * Now display the machine's configuration. We do this if we 7603831d35Sstevel * are not logging or exit_code is set (machine is broke). 7703831d35Sstevel */ 7803831d35Sstevel if (!logging || exit_code) { 7903831d35Sstevel struct utsname uts_buf; 8003831d35Sstevel 8103831d35Sstevel /* 8203831d35Sstevel * Display system banner 8303831d35Sstevel */ 8403831d35Sstevel (void) uname(&uts_buf); 8503831d35Sstevel 86*2983dda7SMichael Bergknoff log_printf(dgettext(TEXT_DOMAIN, "System Configuration: " 87*2983dda7SMichael Bergknoff "Oracle Corporation %s %s\n"), uts_buf.machine, 88*2983dda7SMichael Bergknoff get_prop_val(find_prop(root, "banner-name")), 0); 8903831d35Sstevel 9003831d35Sstevel /* display system clock frequency */ 9103831d35Sstevel value = get_prop_val(find_prop(root, "clock-frequency")); 9203831d35Sstevel if (value != NULL) { 9303831d35Sstevel sys_clk = ((*((int *)value)) + 500000) / 1000000; 9403831d35Sstevel log_printf(dgettext(TEXT_DOMAIN, "System clock " 9503831d35Sstevel "frequency: %d MHz\n"), sys_clk, 0); 9603831d35Sstevel } 9703831d35Sstevel 9803831d35Sstevel /* Display the Memory Size */ 9903831d35Sstevel display_memorysize(tree, kstats, &grps, &memory_total); 10003831d35Sstevel 10103831d35Sstevel /* Display platform specific configuration info */ 10203831d35Sstevel display_platform_specific_header(); 10303831d35Sstevel 10403831d35Sstevel /* Display the CPU devices */ 10503831d35Sstevel display_cpu_devices(tree); 10603831d35Sstevel 10703831d35Sstevel /* Display the Memory configuration */ 10803831d35Sstevel display_memoryconf(tree, &grps); 10903831d35Sstevel 11003831d35Sstevel /* Display all the IO cards. */ 11103831d35Sstevel (void) display_io_devices(tree); 11203831d35Sstevel 11303831d35Sstevel 11403831d35Sstevel /* 11503831d35Sstevel * Display any Hot plugged, disabled and failed board(s) 11603831d35Sstevel * where appropriate. 11703831d35Sstevel */ 11803831d35Sstevel display_hp_fail_fault(tree, kstats); 11903831d35Sstevel 12003831d35Sstevel display_diaginfo((syserrlog || (logging && exit_code)), 12103831d35Sstevel root, tree, kstats); 12203831d35Sstevel } 12303831d35Sstevel 12403831d35Sstevel return (exit_code); 12503831d35Sstevel } 12603831d35Sstevel 12703831d35Sstevel 12803831d35Sstevel int 12903831d35Sstevel error_check(Sys_tree *tree, struct system_kstat_data *kstats) 13003831d35Sstevel { 13103831d35Sstevel #ifdef lint 13203831d35Sstevel tree = tree; 13303831d35Sstevel kstats = kstats; 13403831d35Sstevel #endif 13503831d35Sstevel /* 13603831d35Sstevel * This function is intentionally empty 13703831d35Sstevel */ 13803831d35Sstevel return (0); 13903831d35Sstevel } 14003831d35Sstevel 14103831d35Sstevel int 14203831d35Sstevel disp_fail_parts(Sys_tree *tree) 14303831d35Sstevel { 14403831d35Sstevel #ifdef lint 14503831d35Sstevel tree = tree; 14603831d35Sstevel #endif 14703831d35Sstevel /* 14803831d35Sstevel * This function is intentionally empty 14903831d35Sstevel */ 15003831d35Sstevel return (0); 15103831d35Sstevel } 15203831d35Sstevel 15303831d35Sstevel 15403831d35Sstevel void 15503831d35Sstevel display_hp_fail_fault(Sys_tree *tree, struct system_kstat_data *kstats) 15603831d35Sstevel { 15703831d35Sstevel #ifdef lint 15803831d35Sstevel tree = tree; 15903831d35Sstevel kstats = kstats; 16003831d35Sstevel #endif 16103831d35Sstevel /* 16203831d35Sstevel * This function is intentionally empty 16303831d35Sstevel */ 16403831d35Sstevel } 16503831d35Sstevel 16603831d35Sstevel void 16703831d35Sstevel display_diaginfo(int flag, Prom_node *root, Sys_tree *tree, 16803831d35Sstevel struct system_kstat_data *kstats) 16903831d35Sstevel { 17003831d35Sstevel #ifdef lint 17103831d35Sstevel flag = flag; 17203831d35Sstevel root = root; 17303831d35Sstevel tree = tree; 17403831d35Sstevel kstats = kstats; 17503831d35Sstevel #endif 17603831d35Sstevel /* 17703831d35Sstevel * This function is intentionally empty 17803831d35Sstevel */ 17903831d35Sstevel } 18003831d35Sstevel 18103831d35Sstevel 18203831d35Sstevel void 18303831d35Sstevel resolve_board_types(Sys_tree *tree) 18403831d35Sstevel { 18503831d35Sstevel #ifdef lint 18603831d35Sstevel tree = tree; 18703831d35Sstevel #endif 18803831d35Sstevel /* 18903831d35Sstevel * This function is intentionally empty 19003831d35Sstevel */ 19103831d35Sstevel } 19203831d35Sstevel 19303831d35Sstevel void 19403831d35Sstevel display_boardnum(int num) 19503831d35Sstevel { 19603831d35Sstevel log_printf("%2d ", num, 0); 19703831d35Sstevel } 19803831d35Sstevel 19903831d35Sstevel 20003831d35Sstevel /* 20103831d35Sstevel * The various platforms can over-ride this function to 20203831d35Sstevel * return any platform specific configuration information 20303831d35Sstevel * they may wish to return in addition to the generic output. 20403831d35Sstevel */ 20503831d35Sstevel void 20603831d35Sstevel display_platform_specific_header(void) 20703831d35Sstevel { 20803831d35Sstevel /* 20903831d35Sstevel * This function is intentionally empty 21003831d35Sstevel */ 21103831d35Sstevel } 212