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