03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER START
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The contents of this file are subject to the terms of the
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Common Development and Distribution License (the "License").
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * You may not use this file except in compliance with the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
03831d35f7499c87d51205817c93e9a8d42c4baestevel * or http://www.opensolaris.org/os/licensing.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * See the License for the specific language governing permissions
03831d35f7499c87d51205817c93e9a8d42c4baestevel * and limitations under the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * When distributing Covered Code, include this CDDL HEADER in each
03831d35f7499c87d51205817c93e9a8d42c4baestevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If applicable, add the following below this CDDL HEADER, with the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * fields enclosed by brackets "[]" replaced with your own identifying
03831d35f7499c87d51205817c93e9a8d42c4baestevel * information: Portions Copyright [yyyy] [name of copyright owner]
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER END
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Use is subject to license terms.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifndef _SYS_LIBPRTDIAG_H
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define _SYS_LIBPRTDIAG_H
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#pragma ident "%Z%%M% %I% %E% SMI"
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef __cplusplus
03831d35f7499c87d51205817c93e9a8d42c4baestevelextern "C" {
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/openpromio.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/cheetahregs.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "pdevinfo.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "display.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "pdevinfo_sun4u.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "display_sun4u.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef DEBUG
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define D_PRINTF printf
03831d35f7499c87d51205817c93e9a8d42c4baestevel#else
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define D_PRINTF
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define EXIT_MSG(msg, err) \
03831d35f7499c87d51205817c93e9a8d42c4baestevel { printf("\n%s failed with %d\n", msg, err); exit(err); }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* global data */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PCI_DEVICE(x) ((x >> 11) & 0x1f)
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PCI_REG_TO_DEV(x) ((x & 0xf800) >> 11)
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PCI_REG_TO_FUNC(x) ((x & 0x700) >> 8)
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define BUS_TYPE "UPA"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define MAX_SLOTS_PER_IO_BD 8
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint sys_clk; /* System clock freq. (in MHz) */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Defines for identifying PCI devices
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PCI_BRIDGE_CLASS 0x6
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PCI_CLASS_SHIFT 0x10
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PCI_PCI_BRIDGE_SUBCLASS 0x4
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PCI_SUBCLASS_SHIFT 0x8
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PCI_SUBCLASS_MASK 0xFF00
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define PCI_SUBCLASS_OTHER 0x80
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define CLASS_REG_TO_SUBCLASS(class) (((class) & PCI_SUBCLASS_MASK) \
03831d35f7499c87d51205817c93e9a8d42c4baestevel >> PCI_SUBCLASS_SHIFT)
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define CLASS_REG_TO_CLASS(class) ((class) >> PCI_CLASS_SHIFT)
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display functions
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelint error_check(Sys_tree *tree, struct system_kstat_data *kstats);
03831d35f7499c87d51205817c93e9a8d42c4baestevelint disp_fail_parts(Sys_tree *tree);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_hp_fail_fault(Sys_tree *tree, struct system_kstat_data *kstats);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_diaginfo(int flag, Prom_node *root, Sys_tree *tree,
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct system_kstat_data *kstats);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid resolve_board_types(Sys_tree *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_boardnum(int num);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_platform_specific_header(void);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * cpu functions
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_cpu_devices(Sys_tree *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_cpus(Board_node *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_mid(int mid);
25cf1a301a396c38e8adf52c15f537b80d2483f7jluint_t get_cpu_freq(Prom_node *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelint get_ecache_size(Prom_node *);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * io functions
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelProm_node *find_pci_bus(Prom_node *, int, int);
03831d35f7499c87d51205817c93e9a8d42c4baestevelint get_pci_bus(Prom_node *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelint get_pci_device(Prom_node *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelint get_pci_to_pci_device(Prom_node *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid free_io_cards(struct io_card *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstruct io_card *insert_io_card(struct io_card *, struct io_card *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelchar *fmt_manf_id(unsigned int, char *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelint get_sbus_slot(Prom_node *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_io_devices(Sys_tree *tree);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_pci(Board_node *bnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_io_cards(struct io_card *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_ffb(Board_node *, int);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_sbus(Board_node *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelint populate_slot_name_arr(Prom_node *pci, int *slot_name_bits,
03831d35f7499c87d51205817c93e9a8d42c4baestevel char **slot_name_arr, int num_slots);
03831d35f7499c87d51205817c93e9a8d42c4baestevelint get_card_frequency(Prom_node *pci);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid get_dev_func_num(Prom_node *card_node, int *dev_no, int *func_no);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid get_pci_class_codes(Prom_node *card_node, int *class_code,
03831d35f7499c87d51205817c93e9a8d42c4baestevel int *subclass_code);
03831d35f7499c87d51205817c93e9a8d42c4baestevelint is_pci_bridge(Prom_node *card_node, char *name);
03831d35f7499c87d51205817c93e9a8d42c4baestevelint is_pci_bridge_other(Prom_node *card_node, char *name);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid get_pci_card_model(Prom_node *card_node, char *model);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid create_io_card_name(Prom_node *card_node, char *name,
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *card_name);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_psycho_pci(Board_node *bnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid get_slot_number_str(struct io_card *card, char **slot_name_arr,
03831d35f7499c87d51205817c93e9a8d42c4baestevel int slot_name_bits);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid distinguish_identical_io_cards(char *name, Prom_node *node,
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct io_card *card);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid decode_qlc_card_model_prop(Prom_node *card_node, struct io_card *card);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * kstat functions
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid read_platform_kstats(Sys_tree *tree,
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct system_kstat_data *sys_kstat,
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct bd_kstat_data *bdp, struct envctrl_kstat_data *ep);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid read_sun4u_kstats(Sys_tree *, struct system_kstat_data *);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * memory functions
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_memorysize(Sys_tree *tree, struct system_kstat_data *kstats,
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct grp_info *grps, struct mem_total *memory_total);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_memoryconf(Sys_tree *tree, struct grp_info *grps);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * prom functions
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid platform_disp_prom_version(Sys_tree *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid disp_prom_version(Prom_node *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid add_node(Sys_tree *, Prom_node *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelProm_node *find_device(Board_node *, int, char *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelProm_node *walk(Sys_tree *, Prom_node *, int);
03831d35f7499c87d51205817c93e9a8d42c4baestevelint get_pci_class_code_reg(Prom_node *);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * libdevinfo functions
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelint do_devinfo(int, char *, int, int);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * mc-us3 memory functions and structs
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baesteveltypedef struct memory_bank {
03831d35f7499c87d51205817c93e9a8d42c4baestevel int id;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int portid;
03831d35f7499c87d51205817c93e9a8d42c4baestevel ushort_t valid;
03831d35f7499c87d51205817c93e9a8d42c4baestevel ushort_t uk;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint_t um;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uchar_t lk;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uchar_t lm;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint64_t bank_size;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *bank_status;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct memory_bank *next; /* mc in the devtree */
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct memory_bank *seg_next; /* in the segment */
03831d35f7499c87d51205817c93e9a8d42c4baestevel} memory_bank_t;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baesteveltypedef struct memory_seg {
03831d35f7499c87d51205817c93e9a8d42c4baestevel int id;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int intlv; /* interleave for this segment */
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint64_t base; /* base address for this segment */
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint64_t size; /* size of this segment */
03831d35f7499c87d51205817c93e9a8d42c4baestevel int nbanks; /* number of banks in this segment */
03831d35f7499c87d51205817c93e9a8d42c4baestevel memory_bank_t *banks; /* pointer to the banks of this seg */
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct memory_seg *next;
03831d35f7499c87d51205817c93e9a8d42c4baestevel} memory_seg_t;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define NUM_MBANKS_PER_MC 4
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint get_us3_mem_regs(Board_node *bnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid display_us3_banks(void);
03831d35f7499c87d51205817c93e9a8d42c4baestevelint display_us3_failed_banks(int system_failed);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid print_us3_memory_line(int portid, int bank_id, uint64_t bank_size,
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *bank_status, uint64_t dimm_size, uint32_t intlv, int seg_id);
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid print_us3_failed_memory_line(int portid, int bank_id,
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *bank_status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef __cplusplus
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif /* _SYS_LIBPRTDIAG_H */