4496171313bed39e96f21bc2f9faf2868e267ae3girish/*
4496171313bed39e96f21bc2f9faf2868e267ae3girish * CDDL HEADER START
4496171313bed39e96f21bc2f9faf2868e267ae3girish *
4496171313bed39e96f21bc2f9faf2868e267ae3girish * The contents of this file are subject to the terms of the
4496171313bed39e96f21bc2f9faf2868e267ae3girish * Common Development and Distribution License (the "License").
4496171313bed39e96f21bc2f9faf2868e267ae3girish * You may not use this file except in compliance with the License.
4496171313bed39e96f21bc2f9faf2868e267ae3girish *
4496171313bed39e96f21bc2f9faf2868e267ae3girish * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4496171313bed39e96f21bc2f9faf2868e267ae3girish * or http://www.opensolaris.org/os/licensing.
4496171313bed39e96f21bc2f9faf2868e267ae3girish * See the License for the specific language governing permissions
4496171313bed39e96f21bc2f9faf2868e267ae3girish * and limitations under the License.
4496171313bed39e96f21bc2f9faf2868e267ae3girish *
4496171313bed39e96f21bc2f9faf2868e267ae3girish * When distributing Covered Code, include this CDDL HEADER in each
4496171313bed39e96f21bc2f9faf2868e267ae3girish * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4496171313bed39e96f21bc2f9faf2868e267ae3girish * If applicable, add the following below this CDDL HEADER, with the
4496171313bed39e96f21bc2f9faf2868e267ae3girish * fields enclosed by brackets "[]" replaced with your own identifying
4496171313bed39e96f21bc2f9faf2868e267ae3girish * information: Portions Copyright [yyyy] [name of copyright owner]
4496171313bed39e96f21bc2f9faf2868e267ae3girish *
4496171313bed39e96f21bc2f9faf2868e267ae3girish * CDDL HEADER END
4496171313bed39e96f21bc2f9faf2868e267ae3girish */
4496171313bed39e96f21bc2f9faf2868e267ae3girish/*
087113e1a972d4b6246cf32a83c330968117b93emb * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
4496171313bed39e96f21bc2f9faf2868e267ae3girish * Use is subject to license terms.
4496171313bed39e96f21bc2f9faf2868e267ae3girish */
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish/*
4496171313bed39e96f21bc2f9faf2868e267ae3girish * Sun4v Platform specific functions.
4496171313bed39e96f21bc2f9faf2868e267ae3girish *
4496171313bed39e96f21bc2f9faf2868e267ae3girish * called when :
4496171313bed39e96f21bc2f9faf2868e267ae3girish * machine_type == huron
4496171313bed39e96f21bc2f9faf2868e267ae3girish *
4496171313bed39e96f21bc2f9faf2868e267ae3girish */
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#pragma ident "%Z%%M% %I% %E% SMI"
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <stdio.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <stdlib.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <unistd.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <kstat.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <fcntl.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <string.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <assert.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <libintl.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <note.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <sys/systeminfo.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <sys/openpromio.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <sys/sysmacros.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <picl.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include "picldefs.h"
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <pdevinfo.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <display.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <display_sun4v.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <libprtdiag.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include "huron.h"
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#if !defined(TEXT_DOMAIN)
4496171313bed39e96f21bc2f9faf2868e267ae3girish#define TEXT_DOMAIN "SYS_TEST"
4496171313bed39e96f21bc2f9faf2868e267ae3girish#endif
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girishstatic void
4496171313bed39e96f21bc2f9faf2868e267ae3girishhuron_get_bus_type(char *path, struct io_card *card)
4496171313bed39e96f21bc2f9faf2868e267ae3girish{
87c478a5395a3af1176f469bdeaf2ce044e4ae1azx if (strcmp(path, HURON_NIU) == 0) {
87c478a5395a3af1176f469bdeaf2ce044e4ae1azx (void) strcpy(card->bus_type, "NIU");
4496171313bed39e96f21bc2f9faf2868e267ae3girish } else {
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) strcpy(card->bus_type, "PCIE");
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish}
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girishvoid
4496171313bed39e96f21bc2f9faf2868e267ae3girishhuron_get_slot_number(char *path, struct io_card *card)
4496171313bed39e96f21bc2f9faf2868e267ae3girish{
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (strcmp(path, HURON_N2_XAUI0) == 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) strcpy(card->slot_str, "0");
4496171313bed39e96f21bc2f9faf2868e267ae3girish card->slot = 0;
4496171313bed39e96f21bc2f9faf2868e267ae3girish } else if (strcmp(path, HURON_N2_XAUI1) == 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) strcpy(card->slot_str, "1");
4496171313bed39e96f21bc2f9faf2868e267ae3girish card->slot = 1;
b423da26b867ead68b8fda8497cf4e5bb7ed1631zx } else if (strncmp(path, HURON_PCIE_SLOT0,
087113e1a972d4b6246cf32a83c330968117b93emb strlen(HURON_PCIE_SLOT0)) == 0) {
b423da26b867ead68b8fda8497cf4e5bb7ed1631zx (void) strcpy(card->slot_str, "0");
b423da26b867ead68b8fda8497cf4e5bb7ed1631zx card->slot = 0;
4496171313bed39e96f21bc2f9faf2868e267ae3girish } else if (strncmp(path, HURON_PCIE_SLOT1,
087113e1a972d4b6246cf32a83c330968117b93emb strlen(HURON_PCIE_SLOT1)) == 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) strcpy(card->slot_str, "1");
4496171313bed39e96f21bc2f9faf2868e267ae3girish card->slot = 1;
4496171313bed39e96f21bc2f9faf2868e267ae3girish } else if (strncmp(path, HURON_PCIE_SLOT2,
087113e1a972d4b6246cf32a83c330968117b93emb strlen(HURON_PCIE_SLOT2)) == 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) strcpy(card->slot_str, "2");
4496171313bed39e96f21bc2f9faf2868e267ae3girish card->slot = 2;
4496171313bed39e96f21bc2f9faf2868e267ae3girish } else if (strncmp(path, HURON_PCIE_SLOT3,
087113e1a972d4b6246cf32a83c330968117b93emb strlen(HURON_PCIE_SLOT3)) == 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) strcpy(card->slot_str, "3");
4496171313bed39e96f21bc2f9faf2868e267ae3girish card->slot = 3;
4496171313bed39e96f21bc2f9faf2868e267ae3girish } else if (strncmp(path, HURON_PCIE_SLOT4,
087113e1a972d4b6246cf32a83c330968117b93emb strlen(HURON_PCIE_SLOT4)) == 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) strcpy(card->slot_str, "4");
4496171313bed39e96f21bc2f9faf2868e267ae3girish card->slot = 4;
4496171313bed39e96f21bc2f9faf2868e267ae3girish } else if (strncmp(path, HURON_PCIE_SLOT5,
087113e1a972d4b6246cf32a83c330968117b93emb strlen(HURON_PCIE_SLOT5)) == 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) strcpy(card->slot_str, "5");
4496171313bed39e96f21bc2f9faf2868e267ae3girish card->slot = 5;
4496171313bed39e96f21bc2f9faf2868e267ae3girish } else {
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) strcpy(card->slot_str, MOTHERBOARD);
4496171313bed39e96f21bc2f9faf2868e267ae3girish card->slot = NO_SLOT;
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish}
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girishint
4496171313bed39e96f21bc2f9faf2868e267ae3girishhuron_get_network_instance(char *path)
4496171313bed39e96f21bc2f9faf2868e267ae3girish{
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (strcmp(path, HURON_NETWORK_0) == 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (0);
4496171313bed39e96f21bc2f9faf2868e267ae3girish } else if (strcmp(path, HURON_NETWORK_1) == 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (1);
4496171313bed39e96f21bc2f9faf2868e267ae3girish } else if (strcmp(path, HURON_NETWORK_2) == 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (2);
4496171313bed39e96f21bc2f9faf2868e267ae3girish } else if (strcmp(path, HURON_NETWORK_3) == 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (3);
4496171313bed39e96f21bc2f9faf2868e267ae3girish } else if (strcmp(path, HURON_N2_XAUI0) == 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (0);
4496171313bed39e96f21bc2f9faf2868e267ae3girish } else if (strcmp(path, HURON_N2_XAUI1) == 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (1);
4496171313bed39e96f21bc2f9faf2868e267ae3girish } else {
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (-1);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish}
4496171313bed39e96f21bc2f9faf2868e267ae3girish/*
4496171313bed39e96f21bc2f9faf2868e267ae3girish * add all io devices under pci in io list
4496171313bed39e96f21bc2f9faf2868e267ae3girish */
4496171313bed39e96f21bc2f9faf2868e267ae3girish/* ARGSUSED */
4496171313bed39e96f21bc2f9faf2868e267ae3girishint
4496171313bed39e96f21bc2f9faf2868e267ae3girishhuron_pci_callback(picl_nodehdl_t pcih, void *args)
4496171313bed39e96f21bc2f9faf2868e267ae3girish{
4496171313bed39e96f21bc2f9faf2868e267ae3girish int err = PICL_SUCCESS;
4496171313bed39e96f21bc2f9faf2868e267ae3girish picl_nodehdl_t nodeh;
4496171313bed39e96f21bc2f9faf2868e267ae3girish char path[MAXSTRLEN];
4496171313bed39e96f21bc2f9faf2868e267ae3girish char parent_path[MAXSTRLEN];
4496171313bed39e96f21bc2f9faf2868e267ae3girish char piclclass[PICL_CLASSNAMELEN_MAX];
4496171313bed39e96f21bc2f9faf2868e267ae3girish char name[MAXSTRLEN];
4496171313bed39e96f21bc2f9faf2868e267ae3girish char model[MAXSTRLEN];
4496171313bed39e96f21bc2f9faf2868e267ae3girish char *compatible;
4496171313bed39e96f21bc2f9faf2868e267ae3girish char binding_name[MAXSTRLEN];
4496171313bed39e96f21bc2f9faf2868e267ae3girish struct io_card pci_card;
4496171313bed39e96f21bc2f9faf2868e267ae3girish int32_t instance;
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propval_by_name(pcih, PICL_PROP_DEVFS_PATH, parent_path,
4496171313bed39e96f21bc2f9faf2868e267ae3girish sizeof (parent_path));
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (err != PICL_SUCCESS) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (err);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* Walk through the children */
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propval_by_name(pcih, PICL_PROP_CHILD, &nodeh,
4496171313bed39e96f21bc2f9faf2868e267ae3girish sizeof (picl_nodehdl_t));
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish while (err == PICL_SUCCESS) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propval_by_name(nodeh, PICL_PROP_CLASSNAME,
4496171313bed39e96f21bc2f9faf2868e267ae3girish piclclass, sizeof (piclclass));
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (err != PICL_SUCCESS)
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (err);
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (strcmp(piclclass, "pciex") == 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propval_by_name(nodeh, PICL_PROP_PEER,
4496171313bed39e96f21bc2f9faf2868e267ae3girish &nodeh, sizeof (picl_nodehdl_t));
4496171313bed39e96f21bc2f9faf2868e267ae3girish continue;
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish
87c478a5395a3af1176f469bdeaf2ce044e4ae1azx if (strcmp(piclclass, "sun4v") == 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propval_by_name(nodeh, PICL_PROP_CHILD,
4496171313bed39e96f21bc2f9faf2868e267ae3girish &nodeh, sizeof (picl_nodehdl_t));
4496171313bed39e96f21bc2f9faf2868e267ae3girish continue;
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propval_by_name(nodeh, PICL_PROP_DEVFS_PATH,
4496171313bed39e96f21bc2f9faf2868e267ae3girish path, sizeof (path));
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (err != PICL_SUCCESS) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (err);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) strlcpy(pci_card.notes, path, sizeof (pci_card.notes));
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish huron_get_bus_type(parent_path, &pci_card);
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propval_by_name(nodeh, PICL_PROP_NAME, &name,
4496171313bed39e96f21bc2f9faf2868e267ae3girish sizeof (name));
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (err == PICL_PROPNOTFOUND)
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) strcpy(name, "");
4496171313bed39e96f21bc2f9faf2868e267ae3girish else if (err != PICL_SUCCESS)
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (err);
4496171313bed39e96f21bc2f9faf2868e267ae3girish
87c478a5395a3af1176f469bdeaf2ce044e4ae1azx if (strcmp(parent_path, HURON_NIU) == 0)
87c478a5395a3af1176f469bdeaf2ce044e4ae1azx huron_get_slot_number(path, &pci_card);
87c478a5395a3af1176f469bdeaf2ce044e4ae1azx else
87c478a5395a3af1176f469bdeaf2ce044e4ae1azx huron_get_slot_number(parent_path, &pci_card);
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* Figure NAC name */
4496171313bed39e96f21bc2f9faf2868e267ae3girish if ((strcmp(name, NETWORK) == 0) &&
4496171313bed39e96f21bc2f9faf2868e267ae3girish (strcmp(pci_card.slot_str, MOTHERBOARD) == 0)) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish instance = huron_get_network_instance(path);
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) snprintf(pci_card.status,
4496171313bed39e96f21bc2f9faf2868e267ae3girish sizeof (pci_card.status), "%s/%s%d", MOTHERBOARD,
4496171313bed39e96f21bc2f9faf2868e267ae3girish "NET", instance);
4496171313bed39e96f21bc2f9faf2868e267ae3girish } else {
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (pci_card.slot != NO_SLOT) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) snprintf(pci_card.status,
4496171313bed39e96f21bc2f9faf2868e267ae3girish sizeof (pci_card.status), "%s/%s%d",
4496171313bed39e96f21bc2f9faf2868e267ae3girish MOTHERBOARD, pci_card.bus_type,
4496171313bed39e96f21bc2f9faf2868e267ae3girish pci_card.slot);
4496171313bed39e96f21bc2f9faf2868e267ae3girish } else {
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) snprintf(pci_card.status,
4496171313bed39e96f21bc2f9faf2868e267ae3girish sizeof (pci_card.status), "%s/%s",
4496171313bed39e96f21bc2f9faf2868e267ae3girish MOTHERBOARD, pci_card.bus_type);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish /*
4496171313bed39e96f21bc2f9faf2868e267ae3girish * Get the name of this card. Iif binding_name is found,
4496171313bed39e96f21bc2f9faf2868e267ae3girish * name will be <nodename>-<binding_name>
4496171313bed39e96f21bc2f9faf2868e267ae3girish */
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propval_by_name(nodeh, PICL_PROP_BINDING_NAME,
4496171313bed39e96f21bc2f9faf2868e267ae3girish &binding_name, sizeof (binding_name));
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (err == PICL_PROPNOTFOUND) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish /*
4496171313bed39e96f21bc2f9faf2868e267ae3girish * if compatible prop is found, name will be
4496171313bed39e96f21bc2f9faf2868e267ae3girish * <nodename>-<compatible>
4496171313bed39e96f21bc2f9faf2868e267ae3girish */
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = huron_get_first_compatible_value(nodeh,
4496171313bed39e96f21bc2f9faf2868e267ae3girish &compatible);
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (err == PICL_SUCCESS) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) strlcat(name, "-", MAXSTRLEN);
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) strlcat(name, compatible, MAXSTRLEN);
4496171313bed39e96f21bc2f9faf2868e267ae3girish free(compatible);
4496171313bed39e96f21bc2f9faf2868e267ae3girish } else if (err != PICL_PROPNOTFOUND) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (err);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish } else if (err != PICL_SUCCESS) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (err);
4496171313bed39e96f21bc2f9faf2868e267ae3girish } else if (strcmp(name, binding_name) != 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) strlcat(name, "-", MAXSTRLEN);
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) strlcat(name, binding_name, MAXSTRLEN);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) strlcpy(pci_card.name, name, sizeof (pci_card.name));
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* Get the model of this card */
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propval_by_name(nodeh, OBP_PROP_MODEL,
4496171313bed39e96f21bc2f9faf2868e267ae3girish &model, sizeof (model));
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (err == PICL_PROPNOTFOUND)
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) strcpy(model, "");
4496171313bed39e96f21bc2f9faf2868e267ae3girish else if (err != PICL_SUCCESS)
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (err);
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) strlcpy(pci_card.model, model, sizeof (pci_card.model));
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* Print NAC name */
4496171313bed39e96f21bc2f9faf2868e267ae3girish log_printf("%-11s", pci_card.status);
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* Print IO Type */
4496171313bed39e96f21bc2f9faf2868e267ae3girish log_printf("%6s", pci_card.bus_type);
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* Print Slot # */
4496171313bed39e96f21bc2f9faf2868e267ae3girish log_printf("%5s", pci_card.slot_str);
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* Print Parent Path */
4496171313bed39e96f21bc2f9faf2868e267ae3girish log_printf("%46.45s", pci_card.notes);
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* Printf Card Name */
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (strlen(pci_card.name) > 24)
4496171313bed39e96f21bc2f9faf2868e267ae3girish log_printf("%25.24s+", pci_card.name);
4496171313bed39e96f21bc2f9faf2868e267ae3girish else
4496171313bed39e96f21bc2f9faf2868e267ae3girish log_printf("%26s", pci_card.name);
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* Print Card Model */
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (strlen(pci_card.model) > 10)
4496171313bed39e96f21bc2f9faf2868e267ae3girish log_printf("%10.9s+", pci_card.model);
4496171313bed39e96f21bc2f9faf2868e267ae3girish else
4496171313bed39e96f21bc2f9faf2868e267ae3girish log_printf("%10s", pci_card.model);
4496171313bed39e96f21bc2f9faf2868e267ae3girish log_printf("\n");
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propval_by_name(nodeh, PICL_PROP_PEER, &nodeh,
4496171313bed39e96f21bc2f9faf2868e267ae3girish sizeof (picl_nodehdl_t));
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (PICL_WALK_CONTINUE);
4496171313bed39e96f21bc2f9faf2868e267ae3girish}
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish/*
4496171313bed39e96f21bc2f9faf2868e267ae3girish * local functions
4496171313bed39e96f21bc2f9faf2868e267ae3girish */
4496171313bed39e96f21bc2f9faf2868e267ae3girish/*
4496171313bed39e96f21bc2f9faf2868e267ae3girish * add all io devices under pci in io list
4496171313bed39e96f21bc2f9faf2868e267ae3girish */
4496171313bed39e96f21bc2f9faf2868e267ae3girish/* ARGSUSED */
4496171313bed39e96f21bc2f9faf2868e267ae3girishint
4496171313bed39e96f21bc2f9faf2868e267ae3girishhuron_hw_rev_callback(picl_nodehdl_t pcih, void *args)
4496171313bed39e96f21bc2f9faf2868e267ae3girish{
4496171313bed39e96f21bc2f9faf2868e267ae3girish int err = PICL_SUCCESS;
4496171313bed39e96f21bc2f9faf2868e267ae3girish char path[MAXSTRLEN] = "";
4496171313bed39e96f21bc2f9faf2868e267ae3girish char device_path[MAXSTRLEN];
4496171313bed39e96f21bc2f9faf2868e267ae3girish char NAC[MAXSTRLEN];
4496171313bed39e96f21bc2f9faf2868e267ae3girish char *compatible;
4496171313bed39e96f21bc2f9faf2868e267ae3girish int32_t revision;
4496171313bed39e96f21bc2f9faf2868e267ae3girish int device_found = 0;
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propval_by_name(pcih, PICL_PROP_DEVFS_PATH, path,
4496171313bed39e96f21bc2f9faf2868e267ae3girish sizeof (path));
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (err != PICL_SUCCESS) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (err);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish if ((strcmp(path, HURON_NETWORK_0) == 0) ||
4496171313bed39e96f21bc2f9faf2868e267ae3girish (strcmp(path, HURON_NETWORK_1) == 0)) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish device_found = 1;
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) snprintf(NAC, sizeof (NAC), "%s/%s%d",
087113e1a972d4b6246cf32a83c330968117b93emb MOTHERBOARD, OPHIR, 0);
4496171313bed39e96f21bc2f9faf2868e267ae3girish revision = huron_get_int_propval(pcih, OBP_PROP_REVISION_ID,
4496171313bed39e96f21bc2f9faf2868e267ae3girish &err);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish if ((strcmp(path, HURON_NETWORK_2) == 0) ||
4496171313bed39e96f21bc2f9faf2868e267ae3girish (strcmp(path, HURON_NETWORK_3) == 0)) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish device_found = 1;
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) snprintf(NAC, sizeof (NAC), "%s/%s%d", MOTHERBOARD,
087113e1a972d4b6246cf32a83c330968117b93emb OPHIR, 1);
4496171313bed39e96f21bc2f9faf2868e267ae3girish revision = huron_get_int_propval(pcih, OBP_PROP_REVISION_ID,
4496171313bed39e96f21bc2f9faf2868e267ae3girish &err);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (strcmp(path, HURON_SWITCH_A_PATH) == 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish device_found = 1;
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) snprintf(NAC, sizeof (NAC), "%s/%s",
087113e1a972d4b6246cf32a83c330968117b93emb MOTHERBOARD, HURON_SWITCH_A);
4496171313bed39e96f21bc2f9faf2868e267ae3girish revision = huron_get_int_propval(pcih, OBP_PROP_REVISION_ID,
4496171313bed39e96f21bc2f9faf2868e267ae3girish &err);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (strcmp(path, HURON_SWITCH_B_PATH) == 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish device_found = 1;
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) snprintf(NAC, sizeof (NAC), "%s/%s", MOTHERBOARD,
087113e1a972d4b6246cf32a83c330968117b93emb HURON_SWITCH_B);
4496171313bed39e96f21bc2f9faf2868e267ae3girish revision = huron_get_int_propval(pcih, OBP_PROP_REVISION_ID,
4496171313bed39e96f21bc2f9faf2868e267ae3girish &err);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (strcmp(path, HURON_SWITCH_C_PATH) == 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish device_found = 1;
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) snprintf(NAC, sizeof (NAC), "%s/%s", MOTHERBOARD,
087113e1a972d4b6246cf32a83c330968117b93emb HURON_SWITCH_C);
4496171313bed39e96f21bc2f9faf2868e267ae3girish revision = huron_get_int_propval(pcih, OBP_PROP_REVISION_ID,
4496171313bed39e96f21bc2f9faf2868e267ae3girish &err);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (strcmp(path, HURON_LSI_PATH) == 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish device_found = 1;
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) snprintf(NAC, sizeof (NAC), "%s/%s", MOTHERBOARD,
4496171313bed39e96f21bc2f9faf2868e267ae3girish SAS_SATA_HBA);
4496171313bed39e96f21bc2f9faf2868e267ae3girish revision = huron_get_int_propval(pcih, OBP_PROP_REVISION_ID,
4496171313bed39e96f21bc2f9faf2868e267ae3girish &err);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (device_found == 1) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) strcpy(device_path, path);
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = huron_get_first_compatible_value(pcih, &compatible);
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* Print NAC name */
4496171313bed39e96f21bc2f9faf2868e267ae3girish log_printf("%-20s", NAC);
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* Print Device Path */
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (strlen(device_path) > 45)
4496171313bed39e96f21bc2f9faf2868e267ae3girish log_printf("%45.44s+", device_path);
4496171313bed39e96f21bc2f9faf2868e267ae3girish else
4496171313bed39e96f21bc2f9faf2868e267ae3girish log_printf("%46s", device_path);
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* Print Compatible # */
087113e1a972d4b6246cf32a83c330968117b93emb if (err == PICL_SUCCESS) {
087113e1a972d4b6246cf32a83c330968117b93emb log_printf("%31s", compatible);
087113e1a972d4b6246cf32a83c330968117b93emb free(compatible);
087113e1a972d4b6246cf32a83c330968117b93emb } else
087113e1a972d4b6246cf32a83c330968117b93emb log_printf("%31s", " ");
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* Print Revision */
4496171313bed39e96f21bc2f9faf2868e267ae3girish log_printf("%6d", revision);
4496171313bed39e96f21bc2f9faf2868e267ae3girish log_printf("\n");
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (PICL_WALK_CONTINUE);
4496171313bed39e96f21bc2f9faf2868e267ae3girish}
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish/*
4496171313bed39e96f21bc2f9faf2868e267ae3girish * return the first compatible value
4496171313bed39e96f21bc2f9faf2868e267ae3girish */
4496171313bed39e96f21bc2f9faf2868e267ae3girishint
4496171313bed39e96f21bc2f9faf2868e267ae3girishhuron_get_first_compatible_value(picl_nodehdl_t nodeh, char **outbuf)
4496171313bed39e96f21bc2f9faf2868e267ae3girish{
4496171313bed39e96f21bc2f9faf2868e267ae3girish int err;
4496171313bed39e96f21bc2f9faf2868e267ae3girish picl_prophdl_t proph;
4496171313bed39e96f21bc2f9faf2868e267ae3girish picl_propinfo_t pinfo;
4496171313bed39e96f21bc2f9faf2868e267ae3girish picl_prophdl_t tblh;
4496171313bed39e96f21bc2f9faf2868e267ae3girish picl_prophdl_t rowproph;
4496171313bed39e96f21bc2f9faf2868e267ae3girish char *pval;
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propinfo_by_name(nodeh, OBP_PROP_COMPATIBLE,
4496171313bed39e96f21bc2f9faf2868e267ae3girish &pinfo, &proph);
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (err != PICL_SUCCESS)
087113e1a972d4b6246cf32a83c330968117b93emb return (err);
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (pinfo.type == PICL_PTYPE_CHARSTRING) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish pval = malloc(pinfo.size);
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (pval == NULL)
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (PICL_FAILURE);
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propval(proph, pval, pinfo.size);
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (err != PICL_SUCCESS) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish free(pval);
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (err);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish *outbuf = pval;
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (PICL_SUCCESS);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (pinfo.type != PICL_PTYPE_TABLE)
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (PICL_FAILURE);
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* get first string from table */
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propval(proph, &tblh, pinfo.size);
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (err != PICL_SUCCESS)
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (err);
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_next_by_row(tblh, &rowproph);
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (err != PICL_SUCCESS)
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (err);
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propinfo(rowproph, &pinfo);
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (err != PICL_SUCCESS)
087113e1a972d4b6246cf32a83c330968117b93emb return (err);
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish pval = malloc(pinfo.size);
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (pval == NULL)
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (PICL_FAILURE);
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propval(rowproph, pval, pinfo.size);
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (err != PICL_SUCCESS) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish free(pval);
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (err);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish *outbuf = pval;
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (PICL_SUCCESS);
4496171313bed39e96f21bc2f9faf2868e267ae3girish}
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girishint64_t
4496171313bed39e96f21bc2f9faf2868e267ae3girishhuron_get_int_propval(picl_nodehdl_t modh, char *prop_name, int *ret)
4496171313bed39e96f21bc2f9faf2868e267ae3girish{
4496171313bed39e96f21bc2f9faf2868e267ae3girish int err;
4496171313bed39e96f21bc2f9faf2868e267ae3girish picl_prophdl_t proph;
4496171313bed39e96f21bc2f9faf2868e267ae3girish picl_propinfo_t pinfo;
4496171313bed39e96f21bc2f9faf2868e267ae3girish int8_t int8v;
4496171313bed39e96f21bc2f9faf2868e267ae3girish int16_t int16v;
4496171313bed39e96f21bc2f9faf2868e267ae3girish int32_t int32v;
4496171313bed39e96f21bc2f9faf2868e267ae3girish int64_t int64v;
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propinfo_by_name(modh, prop_name, &pinfo, &proph);
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (err != PICL_SUCCESS) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish *ret = err;
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (0);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish /*
4496171313bed39e96f21bc2f9faf2868e267ae3girish * If it is not an int, uint or byte array prop, return failure
4496171313bed39e96f21bc2f9faf2868e267ae3girish */
4496171313bed39e96f21bc2f9faf2868e267ae3girish if ((pinfo.type != PICL_PTYPE_INT) &&
087113e1a972d4b6246cf32a83c330968117b93emb (pinfo.type != PICL_PTYPE_UNSIGNED_INT) &&
087113e1a972d4b6246cf32a83c330968117b93emb (pinfo.type != PICL_PTYPE_BYTEARRAY)) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish *ret = PICL_FAILURE;
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (0);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish switch (pinfo.size) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish case sizeof (int8_t):
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propval(proph, &int8v, sizeof (int8v));
4496171313bed39e96f21bc2f9faf2868e267ae3girish *ret = err;
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (int8v);
4496171313bed39e96f21bc2f9faf2868e267ae3girish case sizeof (int16_t):
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propval(proph, &int16v, sizeof (int16v));
4496171313bed39e96f21bc2f9faf2868e267ae3girish *ret = err;
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (int16v);
4496171313bed39e96f21bc2f9faf2868e267ae3girish case sizeof (int32_t):
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propval(proph, &int32v, sizeof (int32v));
4496171313bed39e96f21bc2f9faf2868e267ae3girish *ret = err;
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (int32v);
4496171313bed39e96f21bc2f9faf2868e267ae3girish case sizeof (int64_t):
4496171313bed39e96f21bc2f9faf2868e267ae3girish err = picl_get_propval(proph, &int64v, sizeof (int64v));
4496171313bed39e96f21bc2f9faf2868e267ae3girish *ret = err;
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (int64v);
4496171313bed39e96f21bc2f9faf2868e267ae3girish default: /* not supported size */
4496171313bed39e96f21bc2f9faf2868e267ae3girish *ret = PICL_FAILURE;
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (0);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish}