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 1999-2003 Sun Microsystems, Inc. All rights reserved. 24*03831d35Sstevel * Use is subject to license terms. 25*03831d35Sstevel */ 26*03831d35Sstevel 27*03831d35Sstevel #ifndef _SYS_LIBPRTDIAG_H 28*03831d35Sstevel #define _SYS_LIBPRTDIAG_H 29*03831d35Sstevel 30*03831d35Sstevel #pragma ident "%Z%%M% %I% %E% SMI" 31*03831d35Sstevel 32*03831d35Sstevel #ifdef __cplusplus 33*03831d35Sstevel extern "C" { 34*03831d35Sstevel #endif 35*03831d35Sstevel 36*03831d35Sstevel #include <sys/openpromio.h> 37*03831d35Sstevel #include <sys/cheetahregs.h> 38*03831d35Sstevel #include "pdevinfo.h" 39*03831d35Sstevel #include "display.h" 40*03831d35Sstevel #include "pdevinfo_sun4u.h" 41*03831d35Sstevel #include "display_sun4u.h" 42*03831d35Sstevel 43*03831d35Sstevel #ifdef DEBUG 44*03831d35Sstevel #define D_PRINTF printf 45*03831d35Sstevel #else 46*03831d35Sstevel #define D_PRINTF 47*03831d35Sstevel #endif 48*03831d35Sstevel 49*03831d35Sstevel #define EXIT_MSG(msg, err) \ 50*03831d35Sstevel { printf("\n%s failed with %d\n", msg, err); exit(err); } 51*03831d35Sstevel 52*03831d35Sstevel /* global data */ 53*03831d35Sstevel #define PCI_DEVICE(x) ((x >> 11) & 0x1f) 54*03831d35Sstevel #define PCI_REG_TO_DEV(x) ((x & 0xf800) >> 11) 55*03831d35Sstevel #define PCI_REG_TO_FUNC(x) ((x & 0x700) >> 8) 56*03831d35Sstevel #define BUS_TYPE "UPA" 57*03831d35Sstevel #define MAX_SLOTS_PER_IO_BD 8 58*03831d35Sstevel 59*03831d35Sstevel 60*03831d35Sstevel int sys_clk; /* System clock freq. (in MHz) */ 61*03831d35Sstevel 62*03831d35Sstevel /* 63*03831d35Sstevel * Defines for identifying PCI devices 64*03831d35Sstevel */ 65*03831d35Sstevel #define PCI_BRIDGE_CLASS 0x6 66*03831d35Sstevel #define PCI_CLASS_SHIFT 0x10 67*03831d35Sstevel #define PCI_PCI_BRIDGE_SUBCLASS 0x4 68*03831d35Sstevel #define PCI_SUBCLASS_SHIFT 0x8 69*03831d35Sstevel #define PCI_SUBCLASS_MASK 0xFF00 70*03831d35Sstevel #define PCI_SUBCLASS_OTHER 0x80 71*03831d35Sstevel 72*03831d35Sstevel #define CLASS_REG_TO_SUBCLASS(class) (((class) & PCI_SUBCLASS_MASK) \ 73*03831d35Sstevel >> PCI_SUBCLASS_SHIFT) 74*03831d35Sstevel #define CLASS_REG_TO_CLASS(class) ((class) >> PCI_CLASS_SHIFT) 75*03831d35Sstevel 76*03831d35Sstevel /* 77*03831d35Sstevel * display functions 78*03831d35Sstevel */ 79*03831d35Sstevel int error_check(Sys_tree *tree, struct system_kstat_data *kstats); 80*03831d35Sstevel int disp_fail_parts(Sys_tree *tree); 81*03831d35Sstevel void display_hp_fail_fault(Sys_tree *tree, struct system_kstat_data *kstats); 82*03831d35Sstevel void display_diaginfo(int flag, Prom_node *root, Sys_tree *tree, 83*03831d35Sstevel struct system_kstat_data *kstats); 84*03831d35Sstevel void resolve_board_types(Sys_tree *); 85*03831d35Sstevel void display_boardnum(int num); 86*03831d35Sstevel void display_platform_specific_header(void); 87*03831d35Sstevel 88*03831d35Sstevel /* 89*03831d35Sstevel * cpu functions 90*03831d35Sstevel */ 91*03831d35Sstevel void display_cpu_devices(Sys_tree *); 92*03831d35Sstevel void display_cpus(Board_node *); 93*03831d35Sstevel void display_mid(int mid); 94*03831d35Sstevel int get_cpu_freq(Prom_node *); 95*03831d35Sstevel int get_ecache_size(Prom_node *); 96*03831d35Sstevel 97*03831d35Sstevel /* 98*03831d35Sstevel * io functions 99*03831d35Sstevel */ 100*03831d35Sstevel Prom_node *find_pci_bus(Prom_node *, int, int); 101*03831d35Sstevel int get_pci_bus(Prom_node *); 102*03831d35Sstevel int get_pci_device(Prom_node *); 103*03831d35Sstevel int get_pci_to_pci_device(Prom_node *); 104*03831d35Sstevel void free_io_cards(struct io_card *); 105*03831d35Sstevel struct io_card *insert_io_card(struct io_card *, struct io_card *); 106*03831d35Sstevel char *fmt_manf_id(unsigned int, char *); 107*03831d35Sstevel int get_sbus_slot(Prom_node *); 108*03831d35Sstevel void display_io_devices(Sys_tree *tree); 109*03831d35Sstevel void display_pci(Board_node *bnode); 110*03831d35Sstevel void display_io_cards(struct io_card *); 111*03831d35Sstevel void display_ffb(Board_node *, int); 112*03831d35Sstevel void display_sbus(Board_node *); 113*03831d35Sstevel int populate_slot_name_arr(Prom_node *pci, int *slot_name_bits, 114*03831d35Sstevel char **slot_name_arr, int num_slots); 115*03831d35Sstevel int get_card_frequency(Prom_node *pci); 116*03831d35Sstevel void get_dev_func_num(Prom_node *card_node, int *dev_no, int *func_no); 117*03831d35Sstevel void get_pci_class_codes(Prom_node *card_node, int *class_code, 118*03831d35Sstevel int *subclass_code); 119*03831d35Sstevel int is_pci_bridge(Prom_node *card_node, char *name); 120*03831d35Sstevel int is_pci_bridge_other(Prom_node *card_node, char *name); 121*03831d35Sstevel void get_pci_card_model(Prom_node *card_node, char *model); 122*03831d35Sstevel void create_io_card_name(Prom_node *card_node, char *name, 123*03831d35Sstevel char *card_name); 124*03831d35Sstevel void display_psycho_pci(Board_node *bnode); 125*03831d35Sstevel void get_slot_number_str(struct io_card *card, char **slot_name_arr, 126*03831d35Sstevel int slot_name_bits); 127*03831d35Sstevel void distinguish_identical_io_cards(char *name, Prom_node *node, 128*03831d35Sstevel struct io_card *card); 129*03831d35Sstevel void decode_qlc_card_model_prop(Prom_node *card_node, struct io_card *card); 130*03831d35Sstevel 131*03831d35Sstevel /* 132*03831d35Sstevel * kstat functions 133*03831d35Sstevel */ 134*03831d35Sstevel void read_platform_kstats(Sys_tree *tree, 135*03831d35Sstevel struct system_kstat_data *sys_kstat, 136*03831d35Sstevel struct bd_kstat_data *bdp, struct envctrl_kstat_data *ep); 137*03831d35Sstevel void read_sun4u_kstats(Sys_tree *, struct system_kstat_data *); 138*03831d35Sstevel 139*03831d35Sstevel /* 140*03831d35Sstevel * memory functions 141*03831d35Sstevel */ 142*03831d35Sstevel void display_memorysize(Sys_tree *tree, struct system_kstat_data *kstats, 143*03831d35Sstevel struct grp_info *grps, struct mem_total *memory_total); 144*03831d35Sstevel void display_memoryconf(Sys_tree *tree, struct grp_info *grps); 145*03831d35Sstevel 146*03831d35Sstevel /* 147*03831d35Sstevel * prom functions 148*03831d35Sstevel */ 149*03831d35Sstevel void platform_disp_prom_version(Sys_tree *); 150*03831d35Sstevel void disp_prom_version(Prom_node *); 151*03831d35Sstevel void add_node(Sys_tree *, Prom_node *); 152*03831d35Sstevel Prom_node *find_device(Board_node *, int, char *); 153*03831d35Sstevel Prom_node *walk(Sys_tree *, Prom_node *, int); 154*03831d35Sstevel int get_pci_class_code_reg(Prom_node *); 155*03831d35Sstevel 156*03831d35Sstevel /* 157*03831d35Sstevel * libdevinfo functions 158*03831d35Sstevel */ 159*03831d35Sstevel int do_devinfo(int, char *, int, int); 160*03831d35Sstevel 161*03831d35Sstevel /* 162*03831d35Sstevel * mc-us3 memory functions and structs 163*03831d35Sstevel */ 164*03831d35Sstevel typedef struct memory_bank { 165*03831d35Sstevel int id; 166*03831d35Sstevel int portid; 167*03831d35Sstevel ushort_t valid; 168*03831d35Sstevel ushort_t uk; 169*03831d35Sstevel uint_t um; 170*03831d35Sstevel uchar_t lk; 171*03831d35Sstevel uchar_t lm; 172*03831d35Sstevel uint64_t bank_size; 173*03831d35Sstevel char *bank_status; 174*03831d35Sstevel struct memory_bank *next; /* mc in the devtree */ 175*03831d35Sstevel struct memory_bank *seg_next; /* in the segment */ 176*03831d35Sstevel } memory_bank_t; 177*03831d35Sstevel 178*03831d35Sstevel typedef struct memory_seg { 179*03831d35Sstevel int id; 180*03831d35Sstevel int intlv; /* interleave for this segment */ 181*03831d35Sstevel uint64_t base; /* base address for this segment */ 182*03831d35Sstevel uint64_t size; /* size of this segment */ 183*03831d35Sstevel int nbanks; /* number of banks in this segment */ 184*03831d35Sstevel memory_bank_t *banks; /* pointer to the banks of this seg */ 185*03831d35Sstevel struct memory_seg *next; 186*03831d35Sstevel } memory_seg_t; 187*03831d35Sstevel 188*03831d35Sstevel #define NUM_MBANKS_PER_MC 4 189*03831d35Sstevel 190*03831d35Sstevel int get_us3_mem_regs(Board_node *bnode); 191*03831d35Sstevel void display_us3_banks(void); 192*03831d35Sstevel int display_us3_failed_banks(int system_failed); 193*03831d35Sstevel void print_us3_memory_line(int portid, int bank_id, uint64_t bank_size, 194*03831d35Sstevel char *bank_status, uint64_t dimm_size, uint32_t intlv, int seg_id); 195*03831d35Sstevel void print_us3_failed_memory_line(int portid, int bank_id, 196*03831d35Sstevel char *bank_status); 197*03831d35Sstevel 198*03831d35Sstevel #ifdef __cplusplus 199*03831d35Sstevel } 200*03831d35Sstevel #endif 201*03831d35Sstevel 202*03831d35Sstevel #endif /* _SYS_LIBPRTDIAG_H */ 203