25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen/*
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * CDDL HEADER START
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen *
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * The contents of this file are subject to the terms of the
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Common Development and Distribution License (the "License").
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * You may not use this file except in compliance with the License.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen *
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * or http://www.opensolaris.org/os/licensing.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * See the License for the specific language governing permissions
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * and limitations under the License.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen *
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * When distributing Covered Code, include this CDDL HEADER in each
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * If applicable, add the following below this CDDL HEADER, with the
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * fields enclosed by brackets "[]" replaced with your own identifying
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * information: Portions Copyright [yyyy] [name of copyright owner]
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen *
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * CDDL HEADER END
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen/*
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Use is subject to license terms.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen/*
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * etm_filter.c
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Description:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Find the ldom that own the resource specified in the detector field
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * of the ereport.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen#include <pthread.h>
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen#include <stdio.h>
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen#include <strings.h>
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen#include <sys/types.h>
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen#include <sys/stat.h>
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen#include <sys/fm/ldom.h>
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen#include <sys/fm/protocol.h>
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen#include <fm/fmd_api.h>
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen#include <fm/libtopo.h>
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen#include <fm/topo_hc.h>
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen#include "etm_filter.h"
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic etm_prc_t *etm_rcs; /* vector of root complexes */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic uint16_t etm_rc_cnt; /* count of rc entries in rcs */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic uint16_t etm_rc_max; /* max entries allowed in rcs */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic pthread_mutex_t etm_rc_lock; /* lock of the rc vector */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenextern ldom_hdl_t *etm_lhp; /* libldom handle */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen/* ARGSUSED */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic int
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenetm_pciexrc_walker(topo_hdl_t *thp, tnode_t *node, void *arg)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen{
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen int i; /* temp counter */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen int n; /* temp size of new vector */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen int err; /* temp error var */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen char *str; /* topo node value */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen fmd_hdl_t *hdl = arg; /* etm mod hdl */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen etm_prc_t *rcl; /* root complex vector */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen etm_prc_t *p; /* temp pointer */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen topo_instance_t ins; /* rc id */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen uint64_t ba; /* bus address */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* pciexrc node */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (strcmp(topo_node_name(node), PCIEX_ROOT) != 0)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (TOPO_WALK_NEXT);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (topo_prop_get_string(node, TOPO_PGROUP_IO, TOPO_IO_DEV, &str,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen &err) != 0)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (TOPO_WALK_NEXT);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* physical id and bus address of a root complex */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen ins = topo_node_instance(node);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) sscanf(str, "/pci@%llx", &ba);
2c07a09983fd87547573e6ac9b5fbee5f44fa309Yanmin Sun topo_hdl_strfree(thp, str);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /*
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * prc vector is full, so double its size
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (etm_rc_cnt >= etm_rc_max) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen n = (etm_rc_max == 0) ? 1 : 2 * etm_rc_max;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen rcl = fmd_hdl_zalloc(hdl, n * sizeof (etm_prc_t), FMD_SLEEP);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen for (i = 0, p = rcl; i < n; i++, p++) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen p->prc_id = -1;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen p->prc_status = -1;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (etm_rcs != NULL) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen bcopy(etm_rcs, rcl, etm_rc_max * sizeof (etm_prc_t));
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen fmd_hdl_free(hdl, etm_rcs,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen etm_rc_max * sizeof (etm_prc_t));
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen etm_rcs = rcl;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen etm_rc_max = n;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (etm_rc_cnt >= etm_rc_max) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen fmd_hdl_abort(hdl, "rcs is full. Expect counter value %d<%d\n",
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen etm_rc_cnt, etm_rc_max);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* Add the rc at the end of the list */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen p = etm_rcs + etm_rc_cnt;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen p->prc_id = ins;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen p->prc_cfg_handle = ba;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen etm_rc_cnt++;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (TOPO_WALK_NEXT);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen}
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen/*
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * etm_pciexrc_init()
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Description:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Walk through the topology to find the pciexrc nodes. Then save the
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * physical instances and bus addreses in a vector.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic void
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenetm_pciexrc_init(fmd_hdl_t *hdl)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen{
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen topo_hdl_t *thp; /* topo handle */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen topo_walk_t *twp; /* topo walk handle */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen int err; /* topo error */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if ((thp = fmd_hdl_topo_hold(hdl, TOPO_VERSION)) == NULL)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen twp = topo_walk_init(thp, FM_FMRI_SCHEME_HC, etm_pciexrc_walker,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void *) hdl, &err);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (twp == NULL) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen fmd_hdl_topo_rele(hdl, thp);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) topo_walk_step(twp, TOPO_WALK_CHILD);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen topo_walk_fini(twp);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen fmd_hdl_topo_rele(hdl, thp);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen}
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen/*
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * etm_update_prc()
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Description:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Query ldmd for the ldom id
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenvoid
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenetm_update_prc(fmd_hdl_t *hdl, etm_prc_t *prc)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen{
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen char name[MAX_LDOM_NAME]; /* domain name */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen uint64_t virt_cfg_handle; /* bus address from ldmd */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen uint64_t did; /* domain id */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (prc == NULL)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* call libldom to find the ldom id */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen prc->prc_status = ldom_find_id(etm_lhp, prc->prc_cfg_handle,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen LDOM_RSRC_PCI, &virt_cfg_handle, name, MAX_LDOM_NAME, &did);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (prc->prc_status) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* cache the ldom id */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen prc->prc_did = did;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (prc->prc_name != NULL) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen fmd_hdl_free(hdl, prc->prc_name, prc->prc_name_sz);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen prc->prc_name_sz = strlen(name) + 1;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen prc->prc_name = fmd_hdl_zalloc(hdl, prc->prc_name_sz, FMD_SLEEP);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) strncpy(prc->prc_name, name, prc->prc_name_sz);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen}
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen/*
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * etm_find_ldom_id()
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Description:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Find the ldom name and the domain id that owns the resource specified in
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * the ereport detector
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenint
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenetm_filter_find_ldom_id(fmd_hdl_t *hdl, nvlist_t *evp, char *name,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen int name_size, uint64_t *did)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen{
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen char *str; /* temp string */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen char *s; /* temp string */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen int i; /* loop counter */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen int ins; /* instance number */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen nvlist_t *det; /* ereport detector */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen nvlist_t **hcl; /* hc name-value pair list */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen uint_t sz; /* size of hcl */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen etm_prc_t *prc; /* root complex */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* check paramters */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (name == NULL || name_size <= 0) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen fmd_hdl_debug(hdl, "Invalid parameters");
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (-1);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* must be an ereport */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if ((nvlist_lookup_string(evp, FM_CLASS, &str) != 0) ||
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (strncmp(str, FM_EREPORT_CLASS, strlen(FM_EREPORT_CLASS)) != 0)) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen fmd_hdl_debug(hdl, "not an ereport");
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (-1);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* the detector is of hc-scheme */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (nvlist_lookup_nvlist(evp, FM_EREPORT_DETECTOR, &det) != 0) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen fmd_hdl_debug(hdl, "ereport detector not found");
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (-1);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if ((nvlist_lookup_string(det, FM_FMRI_SCHEME, &str) != 0) ||
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (strcmp(str, FM_FMRI_SCHEME_HC) != 0)) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen fmd_hdl_debug(hdl, "detector is not hc-schemed\n");
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (-1);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /*
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Find the pciexrc and extract the instance number
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (nvlist_lookup_nvlist_array(det, FM_FMRI_HC_LIST, &hcl, &sz) != 0) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen fmd_hdl_debug(hdl, "%s is not found\n", FM_FMRI_HC_LIST);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (-1);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen for (i = 0; i < sz; i++) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (nvlist_lookup_string(hcl[i], FM_FMRI_HC_NAME, &str) == 0 &&
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen nvlist_lookup_string(hcl[i], FM_FMRI_HC_ID, &s) == 0 &&
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen strcmp(str, PCIEX_ROOT) == 0) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) sscanf(s, "%d", &ins);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen break;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (i >= sz) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen fmd_hdl_debug(hdl, "%s not found\n", PCIEX_ROOT);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (-1);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) pthread_mutex_lock(&etm_rc_lock);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* search the entry by the physical instance number */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen for (i = 0, prc = etm_rcs; prc != NULL && i < etm_rc_cnt;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen i++, prc++) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (prc->prc_id == ins) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* update the cached entry */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (prc->prc_status != 0) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen etm_update_prc(hdl, prc);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* check for cached ldom name */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (prc->prc_status == 0 && prc->prc_name != NULL) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen *did = prc->prc_did;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) strncpy(name, prc->prc_name, name_size);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) pthread_mutex_unlock(&etm_rc_lock);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (0);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen break;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (i >= etm_rc_cnt) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen fmd_hdl_debug(hdl, "prc[%d] not found\n", ins);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) pthread_mutex_unlock(&etm_rc_lock);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (-1);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen} /* etm_find_ldom_id */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen/*
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * etm_find_ldom_name()
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Description:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Find the ldom name of a given domain id (did)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenint
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenetm_filter_find_ldom_name(fmd_hdl_t *hdl, uint64_t did, char *name,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen int name_size)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen{
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen int rc = -1; /* return value */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen int i; /* loop counter */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen etm_prc_t *prc; /* root complex */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) pthread_mutex_lock(&etm_rc_lock);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* visit all the root complexes to find an entry that matches the did */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen for (i = 0, prc = etm_rcs; prc != NULL && i < etm_rc_cnt;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen i++, prc++) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* update the cached entry */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (prc->prc_status != 0) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen etm_update_prc(hdl, prc);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* find the cached ldom name */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (prc->prc_status == 0 && prc->prc_did == did) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen rc = 0;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) strncpy(name, prc->prc_name ? prc->prc_name : "",
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen name_size);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen break;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) pthread_mutex_unlock(&etm_rc_lock);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (rc);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen} /* etm_find_ldom_name */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen/*
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * etm_filter_handle_ldom_event()
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Description:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Invalidate the ldom name in the physical root complex vector.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenvoid
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenetm_filter_handle_ldom_event(fmd_hdl_t *hdl, etm_async_event_type_t event,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen char *name) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen int i; /* loop counter */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen etm_prc_t *prc; /* root complex */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /*
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Clear the cached ldom name
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen switch (event) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen case ETM_ASYNC_EVENT_LDOM_ADD:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen case ETM_ASYNC_EVENT_LDOM_REMOVE:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen case ETM_ASYNC_EVENT_LDOM_BIND:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen case ETM_ASYNC_EVENT_LDOM_UNBIND:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) pthread_mutex_lock(&etm_rc_lock);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen for (i = 0, prc = etm_rcs; prc != NULL && i < etm_rc_cnt;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen i++, prc++) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (prc->prc_name != NULL &&
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen strcmp(prc->prc_name, name) == 0) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen fmd_hdl_free(hdl, prc->prc_name,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen prc->prc_name_sz);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen prc->prc_name = NULL;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen prc->prc_name_sz = 0;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen prc->prc_status = -1;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) pthread_mutex_unlock(&etm_rc_lock);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen break;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen default:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen break;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen}
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen/* ARGSUSED */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenvoid
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenetm_filter_init(fmd_hdl_t *hdl) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen etm_rcs = NULL;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen etm_rc_cnt = 0;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen etm_rc_max = 0;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) pthread_mutex_init(&etm_rc_lock, NULL);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen etm_pciexrc_init(hdl);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen}
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenvoid
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenetm_filter_fini(fmd_hdl_t *hdl) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen int i; /* loop counter */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen etm_prc_t *prc; /* root complex pointer */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen for (i = 0, prc = etm_rcs; prc != NULL && i < etm_rc_cnt;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen i++, prc++) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (prc->prc_name != NULL) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen fmd_hdl_free(hdl, prc->prc_name, prc->prc_name_sz);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen prc->prc_name = NULL;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen prc->prc_name_sz = 0;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen prc->prc_status = -1;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (etm_rcs != NULL && etm_rc_max > 0) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen fmd_hdl_free(hdl, etm_rcs, etm_rc_max * sizeof (etm_prc_t));
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) pthread_mutex_destroy(&etm_rc_lock);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen}