xref: /titanic_51/usr/src/lib/libprtdiag/inc/libprtdiag.h (revision 25cf1a301a396c38e8adf52c15f537b80d2483f7)
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