diff options
Diffstat (limited to 'usr/src/lib/fm/topo/modules/sun4v/pcibus/pci_sun4v.c')
-rw-r--r-- | usr/src/lib/fm/topo/modules/sun4v/pcibus/pci_sun4v.c | 263 |
1 files changed, 0 insertions, 263 deletions
diff --git a/usr/src/lib/fm/topo/modules/sun4v/pcibus/pci_sun4v.c b/usr/src/lib/fm/topo/modules/sun4v/pcibus/pci_sun4v.c deleted file mode 100644 index 9eea771ed0..0000000000 --- a/usr/src/lib/fm/topo/modules/sun4v/pcibus/pci_sun4v.c +++ /dev/null @@ -1,263 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ - -/* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#include <fm/topo_mod.h> -#include <sys/fm/protocol.h> -#include <string.h> -#include <alloca.h> -#include <libdevinfo.h> -#include <did_props.h> - -/* - * Including the following file gives us definitions of the three - * global arrays used to adjust labels, Slot_Rewrites, Physlot_Names, - * and Missing_Names. With those defined we can use the common labeling - * routines for pci. - */ -#include "pci_sun4v.h" -#include "pci_sun4.h" - -#define PI_PROP_CHASSIS_LOCATION_NAME "chassis-location-name" - -typedef struct _pci_fru { - tnode_t *node; - char *location; - int locsiz; -} _pci_fru_t; - - -static int platform_pci_fru_location(topo_mod_t *, tnode_t *, uchar_t *, int); -static int platform_pci_fru_cb(topo_mod_t *, tnode_t *, void *); - - -int -platform_pci_label(topo_mod_t *mod, tnode_t *node, nvlist_t *in, - nvlist_t **out) -{ - int result; - int err; - int locsiz = 0; - uchar_t *loc = NULL; - char *nac = NULL; - - topo_mod_dprintf(mod, "entering platform_pci_label\n"); - - *out = NULL; - result = di_bytes_get(mod, topo_node_getspecific(node), - PI_PROP_CHASSIS_LOCATION_NAME, &locsiz, &loc); - if (result == -1 || locsiz < 0) { - topo_mod_dprintf(mod, "platform_pci_label: %s not found (%s)\n", - PI_PROP_CHASSIS_LOCATION_NAME, strerror(errno)); - - /* Invoke the generic label generator for this node */ - return (pci_label_cmn(mod, node, in, out)); - } - - /* - * We have crossed a FRU boundary. Use the value in the - * chassis-location-name property as the node label. - */ - nac = alloca(locsiz+1); - (void) memset(nac, 0, locsiz+1); - (void) memcpy(nac, loc, locsiz); - result = topo_node_label_set(node, nac, &err); - if (result < 0) { - if (err != ETOPO_PROP_NOENT) { - return (topo_mod_seterrno(mod, err)); - } - } - - return (0); -} - - -int -platform_pci_fru(topo_mod_t *mod, tnode_t *node, nvlist_t *in, - nvlist_t **out) -{ - int err = 0; - uint64_t ptr; - did_t *dp, *pdp; - tnode_t *pnode; - char *nm, *plat, *pp, **cp; - char *label; - int found_t1plat = 0; - uchar_t *loc; - int locsiz; - - topo_mod_dprintf(mod, "entering platform_pci_fru\n"); - - if (topo_prop_get_string(node, FM_FMRI_AUTHORITY, - FM_FMRI_AUTH_PRODUCT, &plat, &err) < 0) { - (void) topo_mod_seterrno(mod, err); - return (-1); - } - /* Delete the "SUNW," */ - pp = strchr(plat, ','); - if (pp == NULL) - pp = plat; - else - ++pp; - - /* Is this an UltraSPARC-T1 platform? */ - cp = usT1_plats; - while ((*cp != NULL) && (found_t1plat == 0)) { - if (strcmp(pp, *cp) == 0) - found_t1plat = 1; - cp++; - } - - topo_mod_strfree(mod, plat); - - /* - * On UltraSPARC-T1 systems, use the legacy hc scheme on - * the adapter slots to ensure ALOM on the SP can interpret - * the FRU correctly. For everything else, follow the normal - * code flow - */ - if (found_t1plat) { - *out = NULL; - nm = topo_node_name(node); - if (strcmp(nm, PCI_DEVICE) != 0 && - strcmp(nm, PCIEX_DEVICE) != 0 && - strcmp(nm, PCIEX_BUS) != 0) - return (0); - - if (nvlist_lookup_uint64(in, "nv1", &ptr) != 0) { - topo_mod_dprintf(mod, "label method argument " - "not found.\n"); - return (-1); - } - dp = (did_t *)(uintptr_t)ptr; - pnode = did_gettnode(dp); - pdp = did_find(mod, topo_node_getspecific(pnode)); - - /* - * Is there a slotname associated with the device? - */ - if ((label = pci_slot_label_lookup(mod, pnode, dp, pdp)) - != NULL) { - nvlist_t *rnvl; - char buf[PATH_MAX]; - - (void) snprintf(buf, PATH_MAX, "hc:///component=%s", - label); - if (topo_mod_str2nvl(mod, buf, &rnvl) < 0) - return (-1); - *out = rnvl; - } - return (0); - } else if (di_bytes_get(mod, topo_node_getspecific(node), - PI_PROP_CHASSIS_LOCATION_NAME, &locsiz, &loc) == 0 && locsiz > 0) { - /* - * We have crossed a FRU boundary and need to find the parent - * node with this location and set our FMRI to that value. - */ - return (platform_pci_fru_location(mod, node, loc, locsiz)); - } else { - return (pci_fru_compute(mod, node, in, out)); - } -} - - -static int -platform_pci_fru_location(topo_mod_t *mod, tnode_t *node, uchar_t *loc, - int locsiz) -{ - int err; - tnode_t *parent; - tnode_t *top; - topo_walk_t *wp; - _pci_fru_t walkdata; - - topo_mod_dprintf(mod, "entering platform_pci_fru_location\n"); - - /* Find the root node */ - top = node; - while ((parent = topo_node_parent(top)) != NULL) { - top = parent; - } - walkdata.node = node; - walkdata.locsiz = locsiz; - walkdata.location = alloca(locsiz+1); - (void) memset(walkdata.location, 0, locsiz+1); - (void) memcpy(walkdata.location, loc, locsiz); - - /* Create a walker starting at the root node */ - wp = topo_mod_walk_init(mod, top, platform_pci_fru_cb, &walkdata, &err); - if (wp == NULL) { - return (topo_mod_seterrno(mod, err)); - } - - /* - * Walk the tree breadth first to hopefully avoid visiting too many - * nodes while searching for the node with the appropriate FMRI. - */ - (void) topo_walk_step(wp, TOPO_WALK_SIBLING); - topo_walk_fini(wp); - - return (0); -} - - -static int -platform_pci_fru_cb(topo_mod_t *mod, tnode_t *node, void *private) -{ - int err; - _pci_fru_t *walkdata = (_pci_fru_t *)private; - nvlist_t *fmri; - char *location; - int result, rc; - - if (node == walkdata->node) { - /* This is the starting node. Do not check the location */ - return (TOPO_WALK_NEXT); - } - - if (topo_node_label(node, &location, &err) != 0) { - /* This node has no location property. Continue the walk */ - return (TOPO_WALK_NEXT); - } - - result = TOPO_WALK_NEXT; - if (strncmp(location, walkdata->location, walkdata->locsiz) == 0) { - /* - * We have a match. Set the node's FRU FMRI to this nodes - * FRU FMRI - */ - rc = topo_node_fru(node, &fmri, NULL, &err); - if (rc == 0) { - rc = topo_node_fru_set(walkdata->node, fmri, 0, &err); - nvlist_free(fmri); - } - if (rc != 0) { - result = TOPO_WALK_TERMINATE; - (void) topo_mod_seterrno(mod, err); - } - } - topo_mod_strfree(mod, location); - return (result); -} |