b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * CDDL HEADER START
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * The contents of this file are subject to the terms of the
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * Common Development and Distribution License (the "License").
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * You may not use this file except in compliance with the License.
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * See the License for the specific language governing permissions
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * and limitations under the License.
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * When distributing Covered Code, include this CDDL HEADER in each
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * If applicable, add the following below this CDDL HEADER, with the
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * fields enclosed by brackets "[]" replaced with your own identifying
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * information: Portions Copyright [yyyy] [name of copyright owner]
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * CDDL HEADER END
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * Use is subject to license terms.
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * sun4v specific xaui enumerators
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxextern "C" {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#define XFP_MAX 1 /* max number of xfp per xaui card */
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxstatic int xaui_enum(topo_mod_t *, tnode_t *, const char *, topo_instance_t,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx topo_instance_t, void *, void *);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx/*ARGSUSED*/
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * Turn on module debugging output
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if (topo_mod_register(mod, &xaui_info, TOPO_VERSION) < 0) {
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return; /* mod errno already set */
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx fmri = topo_mod_hcfmri(mod, parent, FM_HC_SCHEME_VERSION, name, i,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx "Unable to make nvlist for %s bind: %s.\n",
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx "topo_node_bind (%s%d/%s%d) failed: %s\n",
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if (topo_pgroup_create(ntn, &xaui_auth_pgroup, &err) == 0) {
9c94f155585ea35e938fea603bc227c685223abdCheng Sean Ye (void) topo_prop_inherit(ntn, FM_FMRI_AUTHORITY,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if (e < 0)
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (0);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lustatic void *
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier * Remove the 3 character device name (pci/niu) from devfs path.
4df55fde49134f9735f84011f23a767c75e393c7Janie Lustatic char *
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothierxaui_trans_str(topo_mod_t *mod, char *dn, char *p, size_t buf_len)
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier topo_mod_dprintf(mod, "xaui_trans_str: dev path(%s) dev name(%s)\n",
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier /* strip out either "pci" or "niu" */
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier if (dn[i] == p[0] && dn[i + 1] == p[1] && dn[i + 2] == p[2])
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier } while (i < buf_len);
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier topo_mod_dprintf(mod, "xaui_trans_str: return(%s)\n", buf);
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothierstatic char *
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothierxaui_get_path(topo_mod_t *mod, void *priv, topo_instance_t inst)
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * There are two ways to get here:
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * 1. niu enum - private data is the di_node_t for this xaui
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * - instance is the ethernet function number
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * device path looks like: /niu@80/network@0:nxge@0
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * PRI path looks like: /@80/@0
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * 2. pcibus enum - private data is the parent tnode_t
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * - instance is the pci function number
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * device path looks like: /pci@500/pci@0/pci@8/network@0:nxge0
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * PRI path looks like: /@500/@0/@8/@0
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * PRI path for pciex is /@Bus/@Dev/@Func/@Instance
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /* coming from pcibus */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /* coming from niu */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /* get device path */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_dprintf(mod, "devfs_path (%s)\n", devfs_path);
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier /* remove device name from path */
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier buf = xaui_trans_str(mod, devfs_path, "pci", dev_path_len);
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier buf = xaui_trans_str(mod, devfs_path, "niu", dev_path_len);
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier /* lop off "/network@" */
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier /* path: transposed address + '/@instance' (0/1) + '\0' */
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier if (snprintf(path, path_len, "%s/@%d", buf, inst) < 0) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /* should return something like /@500/@0/@8/@0 or /@80/@0 */
3357fc65c82fa21d1aabd8d906fb1f49810afe0bTom Pothier topo_mod_dprintf(mod, "xaui_get_path: path(%s)\n", path);
4df55fde49134f9735f84011f23a767c75e393c7Janie Luxaui_get_pri_label(topo_mod_t *mod, topo_instance_t n, void *priv,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /* Get device path minus the device names */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (-1);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (-1);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_dprintf(mod, "failed to get pri/md (%d)\n", bufsize);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (-1);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if ((mdp = md_init_intern(bufp, xaui_topo_alloc, xaui_topo_free)) ==
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (-1);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (-1);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_dprintf(mod, "no component nodes found\n");
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu xaui_topo_free(listp, sizeof (mde_cookie_t) * num_nodes);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (-1);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_mod_dprintf(mod, "number of comps (%d)\n", ncomp);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu for (i = 0; i < ncomp; i++) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * Look for type == "io", topo-hc-name == "xaui";
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * match "path" md property.
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if ((md_get_prop_str(mdp, listp[i], "type", &pstr) == 0) &&
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu (md_get_prop_str(mdp, listp[i], "topo-hc-name", &pstr)
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu (md_get_prop_str(mdp, listp[i], "path", &pstr) == 0) &&
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /* check node path */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /* this is the node, grab the label */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /* need to free this later */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu xaui_topo_free(listp, sizeof (mde_cookie_t) * num_nodes);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (0);
4df55fde49134f9735f84011f23a767c75e393c7Janie Luxaui_label_set(topo_mod_t *mod, tnode_t *node, topo_instance_t n, void *priv)
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu (void) xaui_get_pri_label(mod, n, priv, (char **)&label);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (-1);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu FM_FMRI_AUTHORITY, FM_FMRI_AUTH_PRODUCT, &plat, &err) < 0) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * Trim SUNW, from the platform name
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (strcmp(Phyxaui_Names->psn_names[p].pnm_platform,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu for (i = 0; i < Phyxaui_Names->psn_names[p].pnm_nnames;
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (0);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx/*ARGSUSED*/
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxxaui_declare(tnode_t *parent, const char *name, topo_instance_t i,
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if ((ntn = xaui_tnode_create(mod, parent, name, i, NULL)) == NULL) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /* when coming from pcibus: private data == parent tnode */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu /* reset pcibus/niu switch */
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx /* set ASRU to resource fmri */
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx "failed: %s\n",
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx if ((rp = topo_mod_load(mp, XFP, TOPO_VERSION)) == NULL) {
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (rp);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx/*ARGSUSED*/
b48b4ad70157f504f1e9b62203d1cc83a5c03104zxxaui_enum(topo_mod_t *mod, tnode_t *rnode, const char *name,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu topo_instance_t min, topo_instance_t max, void *arg, void *priv)
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx "Currently only know how to enumerate %s components.\n",
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (0);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx * Load XFP enum
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (-1);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if ((xauin = xaui_declare(rnode, name, min, priv, mod)) == NULL)
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (-1);
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx /* set the private data to be the instance number of niufn */
b48b4ad70157f504f1e9b62203d1cc83a5c03104zx return (0);