103831d35Sstevel /* 203831d35Sstevel * CDDL HEADER START 303831d35Sstevel * 403831d35Sstevel * The contents of this file are subject to the terms of the 5*25cf1a30Sjl139090 * Common Development and Distribution License (the "License"). 6*25cf1a30Sjl139090 * 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*25cf1a30Sjl139090 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 2303831d35Sstevel * Use is subject to license terms. 2403831d35Sstevel */ 2503831d35Sstevel 2603831d35Sstevel #ifndef _SYS_LIBPRTDIAG_H 2703831d35Sstevel #define _SYS_LIBPRTDIAG_H 2803831d35Sstevel 2903831d35Sstevel #pragma ident "%Z%%M% %I% %E% SMI" 3003831d35Sstevel 3103831d35Sstevel #ifdef __cplusplus 3203831d35Sstevel extern "C" { 3303831d35Sstevel #endif 3403831d35Sstevel 3503831d35Sstevel #include <sys/openpromio.h> 3603831d35Sstevel #include <sys/cheetahregs.h> 3703831d35Sstevel #include "pdevinfo.h" 3803831d35Sstevel #include "display.h" 3903831d35Sstevel #include "pdevinfo_sun4u.h" 4003831d35Sstevel #include "display_sun4u.h" 4103831d35Sstevel 4203831d35Sstevel #ifdef DEBUG 4303831d35Sstevel #define D_PRINTF printf 4403831d35Sstevel #else 4503831d35Sstevel #define D_PRINTF 4603831d35Sstevel #endif 4703831d35Sstevel 4803831d35Sstevel #define EXIT_MSG(msg, err) \ 4903831d35Sstevel { printf("\n%s failed with %d\n", msg, err); exit(err); } 5003831d35Sstevel 5103831d35Sstevel /* global data */ 5203831d35Sstevel #define PCI_DEVICE(x) ((x >> 11) & 0x1f) 5303831d35Sstevel #define PCI_REG_TO_DEV(x) ((x & 0xf800) >> 11) 5403831d35Sstevel #define PCI_REG_TO_FUNC(x) ((x & 0x700) >> 8) 5503831d35Sstevel #define BUS_TYPE "UPA" 5603831d35Sstevel #define MAX_SLOTS_PER_IO_BD 8 5703831d35Sstevel 5803831d35Sstevel 5903831d35Sstevel int sys_clk; /* System clock freq. (in MHz) */ 6003831d35Sstevel 6103831d35Sstevel /* 6203831d35Sstevel * Defines for identifying PCI devices 6303831d35Sstevel */ 6403831d35Sstevel #define PCI_BRIDGE_CLASS 0x6 6503831d35Sstevel #define PCI_CLASS_SHIFT 0x10 6603831d35Sstevel #define PCI_PCI_BRIDGE_SUBCLASS 0x4 6703831d35Sstevel #define PCI_SUBCLASS_SHIFT 0x8 6803831d35Sstevel #define PCI_SUBCLASS_MASK 0xFF00 6903831d35Sstevel #define PCI_SUBCLASS_OTHER 0x80 7003831d35Sstevel 7103831d35Sstevel #define CLASS_REG_TO_SUBCLASS(class) (((class) & PCI_SUBCLASS_MASK) \ 7203831d35Sstevel >> PCI_SUBCLASS_SHIFT) 7303831d35Sstevel #define CLASS_REG_TO_CLASS(class) ((class) >> PCI_CLASS_SHIFT) 7403831d35Sstevel 7503831d35Sstevel /* 7603831d35Sstevel * display functions 7703831d35Sstevel */ 7803831d35Sstevel int error_check(Sys_tree *tree, struct system_kstat_data *kstats); 7903831d35Sstevel int disp_fail_parts(Sys_tree *tree); 8003831d35Sstevel void display_hp_fail_fault(Sys_tree *tree, struct system_kstat_data *kstats); 8103831d35Sstevel void display_diaginfo(int flag, Prom_node *root, Sys_tree *tree, 8203831d35Sstevel struct system_kstat_data *kstats); 8303831d35Sstevel void resolve_board_types(Sys_tree *); 8403831d35Sstevel void display_boardnum(int num); 8503831d35Sstevel void display_platform_specific_header(void); 8603831d35Sstevel 8703831d35Sstevel /* 8803831d35Sstevel * cpu functions 8903831d35Sstevel */ 9003831d35Sstevel void display_cpu_devices(Sys_tree *); 9103831d35Sstevel void display_cpus(Board_node *); 9203831d35Sstevel void display_mid(int mid); 93*25cf1a30Sjl139090 uint_t get_cpu_freq(Prom_node *); 9403831d35Sstevel int get_ecache_size(Prom_node *); 9503831d35Sstevel 9603831d35Sstevel /* 9703831d35Sstevel * io functions 9803831d35Sstevel */ 9903831d35Sstevel Prom_node *find_pci_bus(Prom_node *, int, int); 10003831d35Sstevel int get_pci_bus(Prom_node *); 10103831d35Sstevel int get_pci_device(Prom_node *); 10203831d35Sstevel int get_pci_to_pci_device(Prom_node *); 10303831d35Sstevel void free_io_cards(struct io_card *); 10403831d35Sstevel struct io_card *insert_io_card(struct io_card *, struct io_card *); 10503831d35Sstevel char *fmt_manf_id(unsigned int, char *); 10603831d35Sstevel int get_sbus_slot(Prom_node *); 10703831d35Sstevel void display_io_devices(Sys_tree *tree); 10803831d35Sstevel void display_pci(Board_node *bnode); 10903831d35Sstevel void display_io_cards(struct io_card *); 11003831d35Sstevel void display_ffb(Board_node *, int); 11103831d35Sstevel void display_sbus(Board_node *); 11203831d35Sstevel int populate_slot_name_arr(Prom_node *pci, int *slot_name_bits, 11303831d35Sstevel char **slot_name_arr, int num_slots); 11403831d35Sstevel int get_card_frequency(Prom_node *pci); 11503831d35Sstevel void get_dev_func_num(Prom_node *card_node, int *dev_no, int *func_no); 11603831d35Sstevel void get_pci_class_codes(Prom_node *card_node, int *class_code, 11703831d35Sstevel int *subclass_code); 11803831d35Sstevel int is_pci_bridge(Prom_node *card_node, char *name); 11903831d35Sstevel int is_pci_bridge_other(Prom_node *card_node, char *name); 12003831d35Sstevel void get_pci_card_model(Prom_node *card_node, char *model); 12103831d35Sstevel void create_io_card_name(Prom_node *card_node, char *name, 12203831d35Sstevel char *card_name); 12303831d35Sstevel void display_psycho_pci(Board_node *bnode); 12403831d35Sstevel void get_slot_number_str(struct io_card *card, char **slot_name_arr, 12503831d35Sstevel int slot_name_bits); 12603831d35Sstevel void distinguish_identical_io_cards(char *name, Prom_node *node, 12703831d35Sstevel struct io_card *card); 12803831d35Sstevel void decode_qlc_card_model_prop(Prom_node *card_node, struct io_card *card); 12903831d35Sstevel 13003831d35Sstevel /* 13103831d35Sstevel * kstat functions 13203831d35Sstevel */ 13303831d35Sstevel void read_platform_kstats(Sys_tree *tree, 13403831d35Sstevel struct system_kstat_data *sys_kstat, 13503831d35Sstevel struct bd_kstat_data *bdp, struct envctrl_kstat_data *ep); 13603831d35Sstevel void read_sun4u_kstats(Sys_tree *, struct system_kstat_data *); 13703831d35Sstevel 13803831d35Sstevel /* 13903831d35Sstevel * memory functions 14003831d35Sstevel */ 14103831d35Sstevel void display_memorysize(Sys_tree *tree, struct system_kstat_data *kstats, 14203831d35Sstevel struct grp_info *grps, struct mem_total *memory_total); 14303831d35Sstevel void display_memoryconf(Sys_tree *tree, struct grp_info *grps); 14403831d35Sstevel 14503831d35Sstevel /* 14603831d35Sstevel * prom functions 14703831d35Sstevel */ 14803831d35Sstevel void platform_disp_prom_version(Sys_tree *); 14903831d35Sstevel void disp_prom_version(Prom_node *); 15003831d35Sstevel void add_node(Sys_tree *, Prom_node *); 15103831d35Sstevel Prom_node *find_device(Board_node *, int, char *); 15203831d35Sstevel Prom_node *walk(Sys_tree *, Prom_node *, int); 15303831d35Sstevel int get_pci_class_code_reg(Prom_node *); 15403831d35Sstevel 15503831d35Sstevel /* 15603831d35Sstevel * libdevinfo functions 15703831d35Sstevel */ 15803831d35Sstevel int do_devinfo(int, char *, int, int); 15903831d35Sstevel 16003831d35Sstevel /* 16103831d35Sstevel * mc-us3 memory functions and structs 16203831d35Sstevel */ 16303831d35Sstevel typedef struct memory_bank { 16403831d35Sstevel int id; 16503831d35Sstevel int portid; 16603831d35Sstevel ushort_t valid; 16703831d35Sstevel ushort_t uk; 16803831d35Sstevel uint_t um; 16903831d35Sstevel uchar_t lk; 17003831d35Sstevel uchar_t lm; 17103831d35Sstevel uint64_t bank_size; 17203831d35Sstevel char *bank_status; 17303831d35Sstevel struct memory_bank *next; /* mc in the devtree */ 17403831d35Sstevel struct memory_bank *seg_next; /* in the segment */ 17503831d35Sstevel } memory_bank_t; 17603831d35Sstevel 17703831d35Sstevel typedef struct memory_seg { 17803831d35Sstevel int id; 17903831d35Sstevel int intlv; /* interleave for this segment */ 18003831d35Sstevel uint64_t base; /* base address for this segment */ 18103831d35Sstevel uint64_t size; /* size of this segment */ 18203831d35Sstevel int nbanks; /* number of banks in this segment */ 18303831d35Sstevel memory_bank_t *banks; /* pointer to the banks of this seg */ 18403831d35Sstevel struct memory_seg *next; 18503831d35Sstevel } memory_seg_t; 18603831d35Sstevel 18703831d35Sstevel #define NUM_MBANKS_PER_MC 4 18803831d35Sstevel 18903831d35Sstevel int get_us3_mem_regs(Board_node *bnode); 19003831d35Sstevel void display_us3_banks(void); 19103831d35Sstevel int display_us3_failed_banks(int system_failed); 19203831d35Sstevel void print_us3_memory_line(int portid, int bank_id, uint64_t bank_size, 19303831d35Sstevel char *bank_status, uint64_t dimm_size, uint32_t intlv, int seg_id); 19403831d35Sstevel void print_us3_failed_memory_line(int portid, int bank_id, 19503831d35Sstevel char *bank_status); 19603831d35Sstevel 19703831d35Sstevel #ifdef __cplusplus 19803831d35Sstevel } 19903831d35Sstevel #endif 20003831d35Sstevel 20103831d35Sstevel #endif /* _SYS_LIBPRTDIAG_H */ 202