cmd_hc_sun4v.c revision aab83bb83be7342f6cfccaed8d5fe0b2f404855d
7711facfe58561dd91d6ece0f5f41150c3956c83dinak/*
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * CDDL HEADER START
7711facfe58561dd91d6ece0f5f41150c3956c83dinak *
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * The contents of this file are subject to the terms of the
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Common Development and Distribution License (the "License").
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * You may not use this file except in compliance with the License.
7711facfe58561dd91d6ece0f5f41150c3956c83dinak *
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * or http://www.opensolaris.org/os/licensing.
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * See the License for the specific language governing permissions
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * and limitations under the License.
7711facfe58561dd91d6ece0f5f41150c3956c83dinak *
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * When distributing Covered Code, include this CDDL HEADER in each
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * If applicable, add the following below this CDDL HEADER, with the
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * fields enclosed by brackets "[]" replaced with your own identifying
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * information: Portions Copyright [yyyy] [name of copyright owner]
7711facfe58561dd91d6ece0f5f41150c3956c83dinak *
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * CDDL HEADER END
7711facfe58561dd91d6ece0f5f41150c3956c83dinak */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak/*
d00756ccb34596a328f8a15d1965da5412d366d0wyllys * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * Use is subject to license terms.
7711facfe58561dd91d6ece0f5f41150c3956c83dinak */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak
7711facfe58561dd91d6ece0f5f41150c3956c83dinak
7711facfe58561dd91d6ece0f5f41150c3956c83dinak#include <fm/fmd_api.h>
7711facfe58561dd91d6ece0f5f41150c3956c83dinak#include <fm/libtopo.h>
7711facfe58561dd91d6ece0f5f41150c3956c83dinak#include <sys/fm/protocol.h>
7711facfe58561dd91d6ece0f5f41150c3956c83dinak#include <cmd.h>
7711facfe58561dd91d6ece0f5f41150c3956c83dinak#include <string.h>
7711facfe58561dd91d6ece0f5f41150c3956c83dinak#include <cmd_hc_sun4v.h>
7711facfe58561dd91d6ece0f5f41150c3956c83dinak
7711facfe58561dd91d6ece0f5f41150c3956c83dinak/* Using a global variable is safe because the DE is single threaded */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak
7711facfe58561dd91d6ece0f5f41150c3956c83dinaknvlist_t *dimm_nvl;
7711facfe58561dd91d6ece0f5f41150c3956c83dinaknvlist_t *mb_nvl;
7711facfe58561dd91d6ece0f5f41150c3956c83dinaknvlist_t *rsc_nvl;
7711facfe58561dd91d6ece0f5f41150c3956c83dinak
7711facfe58561dd91d6ece0f5f41150c3956c83dinaknvlist_t *
7711facfe58561dd91d6ece0f5f41150c3956c83dinakcmd_fault_add_location(fmd_hdl_t *hdl, nvlist_t *flt, const char *locstr) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *t, *s;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nvlist_lookup_string(flt, FM_FAULT_LOCATION, &t) == 0)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak return (flt); /* already has location value */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Replace occurrence of ": " with "/" to avoid confusing ILOM. */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys t = fmd_hdl_zalloc(hdl, strlen(locstr) + 1, FMD_SLEEP);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys s = strstr(locstr, ": ");
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (s != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) strncpy(t, locstr, s - locstr);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) strcat(t, "/");
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) strcat(t, s + 2);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) strcpy(t, locstr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Also, remove any J number from end of this string. */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys s = strstr(t, "/J");
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (s != NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys *s = '\0';
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_add_string(flt, FM_FAULT_LOCATION, t) != 0)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fmd_hdl_error(hdl, "unable to alloc location for fault\n");
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fmd_hdl_free(hdl, t, strlen(locstr) + 1);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (flt);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllystypedef struct tr_ent {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys const char *nac_component;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys const char *hc_component;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys} tr_ent_t;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysstatic tr_ent_t tr_tbl[] = {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys { "MB", "motherboard" },
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys { "CPU", "cpuboard" },
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys { "MEM", "memboard" },
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys { "CMP", "chip" },
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys { "BR", "branch" },
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys { "CH", "dram-channel" },
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys { "R", "rank" },
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys { "D", "dimm" }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys};
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys#define tr_tbl_n sizeof (tr_tbl) / sizeof (tr_ent_t)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysint
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysmap_name(const char *p) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int i;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys for (i = 0; i < tr_tbl_n; i++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (strncmp(p, tr_tbl[i].nac_component,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys strlen(tr_tbl[i].nac_component)) == 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (i);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (-1);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysint
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyscmd_count_components(const char *str, char sep)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int num = 0;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys const char *cptr = str;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (*cptr == sep) cptr++; /* skip initial sep */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (strlen(cptr) > 0) num = 1;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys while ((cptr = strchr(cptr, sep)) != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys cptr++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (cptr == NULL || strcmp(cptr, "") == 0) break;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (map_name(cptr) >= 0) num++;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (num);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys/*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * This version of breakup_components assumes that all component names which
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * it sees are of the form: <nonnumeric piece><numeric piece>
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * i.e. no embedded numerals in component name which have to be spelled out.
7711facfe58561dd91d6ece0f5f41150c3956c83dinak */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysint
7711facfe58561dd91d6ece0f5f41150c3956c83dinakcmd_breakup_components(char *str, char *sep, nvlist_t **hc_nvl)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char namebuf[64], instbuf[64];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *token, *tokbuf;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int i, j, namelen, instlen;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i = 0;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (token = strtok_r(str, sep, &tokbuf);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys token != NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys token = strtok_r(NULL, sep, &tokbuf)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys namelen = strcspn(token, "0123456789");
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys instlen = strspn(token+namelen, "0123456789");
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) strncpy(namebuf, token, namelen);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys namebuf[namelen] = '\0';
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((j = map_name(namebuf)) < 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys continue; /* skip names that don't map */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (instlen == 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) strncpy(instbuf, "0", 2);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys } else {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) strncpy(instbuf, token+namelen, instlen);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys instbuf[instlen] = '\0';
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nvlist_add_string(hc_nvl[i], FM_FMRI_HC_NAME,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys tr_tbl[j].hc_component) != 0 ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nvlist_add_string(hc_nvl[i], FM_FMRI_HC_ID, instbuf) != 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (-1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys i++;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
7711facfe58561dd91d6ece0f5f41150c3956c83dinak return (1);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak}
7711facfe58561dd91d6ece0f5f41150c3956c83dinak
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyschar *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyscmd_getfru_loc(fmd_hdl_t *hdl, nvlist_t *asru) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *fru_loc, *cpufru;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nvlist_lookup_string(asru, FM_FMRI_CPU_CPUFRU, &cpufru) == 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys fru_loc = strstr(cpufru, "MB");
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (fru_loc != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys fmd_hdl_debug(hdl, "cmd_getfru_loc: fruloc=%s\n",
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys fru_loc);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (fmd_hdl_strdup(hdl, fru_loc, FMD_SLEEP));
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
69648175ab3df6ed66211c75234243dbdf9ddd35hylee }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fmd_hdl_debug(hdl, "cmd_getfru_loc: Default fruloc=empty string\n");
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (fmd_hdl_strdup(hdl, EMPTY_STR, FMD_SLEEP));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysnvlist_t *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyscmd_mkboard_fru(fmd_hdl_t *hdl, char *frustr, char *serialstr, char *partstr) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
69648175ab3df6ed66211c75234243dbdf9ddd35hylee char *nac, *nac_name;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int n, i, len;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_t *fru, **hc_list;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (frustr == NULL)
69648175ab3df6ed66211c75234243dbdf9ddd35hylee return (NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((nac_name = strstr(frustr, "MB")) == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys len = strlen(nac_name) + 1;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nac = fmd_hdl_zalloc(hdl, len, FMD_SLEEP);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) strcpy(nac, nac_name);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys n = cmd_count_components(nac, '/');
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fmd_hdl_debug(hdl, "cmd_mkboard_fru: nac=%s components=%d\n", nac, n);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys hc_list = fmd_hdl_zalloc(hdl, sizeof (nvlist_t *)*n, FMD_SLEEP);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys for (i = 0; i < n; i++) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) nvlist_alloc(&hc_list[i],
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys NV_UNIQUE_NAME|NV_UNIQUE_NAME_TYPE, 0);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if (cmd_breakup_components(nac, "/", hc_list) < 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < n; i++) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak nvlist_free(hc_list[i]);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys fmd_hdl_free(hdl, hc_list, sizeof (nvlist_t *)*n);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys fmd_hdl_free(hdl, nac, len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nvlist_alloc(&fru, NV_UNIQUE_NAME, 0) != 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < n; i++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nvlist_free(hc_list[i]);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fmd_hdl_free(hdl, hc_list, sizeof (nvlist_t *)*n);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fmd_hdl_free(hdl, nac, len);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_add_uint8(fru, FM_VERSION, FM_HC_SCHEME_VERSION) != 0 ||
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_add_string(fru, FM_FMRI_SCHEME, FM_FMRI_SCHEME_HC) != 0 ||
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_add_string(fru, FM_FMRI_HC_ROOT, "") != 0 ||
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_add_uint32(fru, FM_FMRI_HC_LIST_SZ, n) != 0 ||
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_add_nvlist_array(fru, FM_FMRI_HC_LIST, hc_list, n) != 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < n; i++) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_free(hc_list[i]);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys fmd_hdl_free(hdl, hc_list, sizeof (nvlist_t *)*n);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fmd_hdl_free(hdl, nac, len);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nvlist_free(fru);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < n; i++) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_free(hc_list[i]);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fmd_hdl_free(hdl, hc_list, sizeof (nvlist_t *)*n);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fmd_hdl_free(hdl, nac, len);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((serialstr != NULL &&
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_add_string(fru, FM_FMRI_HC_SERIAL_ID, serialstr) != 0) ||
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (partstr != NULL &&
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nvlist_add_string(fru, FM_FMRI_HC_PART, partstr) != 0)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nvlist_free(fru);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (fru);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
7711facfe58561dd91d6ece0f5f41150c3956c83dinaknvlist_t *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyscmd_boardfru_create_fault(fmd_hdl_t *hdl, nvlist_t *asru, const char *fltnm,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint_t cert, char *loc)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
7711facfe58561dd91d6ece0f5f41150c3956c83dinak nvlist_t *flt, *nvlfru;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *serialstr, *partstr;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if ((loc == NULL) || (strcmp(loc, EMPTY_STR) == 0))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (NULL);
2cbed7292737821015ab481353eb10e8346b2c05wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nvlist_lookup_string(asru, FM_FMRI_HC_SERIAL_ID, &serialstr) != 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys serialstr = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nvlist_lookup_string(asru, FM_FMRI_HC_PART, &partstr) != 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys partstr = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlfru = cmd_mkboard_fru(hdl, loc, serialstr, partstr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlfru == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys flt = cmd_nvl_create_fault(hdl, fltnm, cert, nvlfru, nvlfru, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys flt = cmd_fault_add_location(hdl, flt, loc);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_free(nvlfru);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (flt);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys/* find_mb -- find hardware platform motherboard within libtopo */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/* ARGSUSED */
2cbed7292737821015ab481353eb10e8346b2c05wyllysstatic int
2cbed7292737821015ab481353eb10e8346b2c05wyllysfind_mb(topo_hdl_t *thp, tnode_t *node, void *arg)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int err;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nvlist_t *rsrc, **hcl;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *name;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys uint_t n;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (topo_node_resource(node, &rsrc, &err) < 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (TOPO_WALK_NEXT); /* no resource, try next */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_lookup_nvlist_array(rsrc, FM_FMRI_HC_LIST, &hcl, &n) < 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nvlist_free(rsrc);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (TOPO_WALK_NEXT);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nvlist_lookup_string(hcl[0], FM_FMRI_HC_NAME, &name) != 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_free(rsrc);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (TOPO_WALK_NEXT);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (strcmp(name, "motherboard") != 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nvlist_free(rsrc);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak return (TOPO_WALK_NEXT); /* not MB hc list, try next */
7711facfe58561dd91d6ece0f5f41150c3956c83dinak }
7711facfe58561dd91d6ece0f5f41150c3956c83dinak
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) nvlist_dup(rsrc, &mb_nvl, NV_UNIQUE_NAME);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nvlist_free(rsrc);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (TOPO_WALK_TERMINATE); /* if no space, give up */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
7711facfe58561dd91d6ece0f5f41150c3956c83dinak
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/* init_mb -- read hardware platform motherboard from libtopo */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysnvlist_t *
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllysinit_mb(fmd_hdl_t *hdl)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys topo_hdl_t *thp;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys topo_walk_t *twp;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int err;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if ((thp = fmd_hdl_topo_hold(hdl, TOPO_VERSION)) == NULL)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((twp = topo_walk_init(thp,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys FM_FMRI_SCHEME_HC, find_mb, NULL, &err))
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys == NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys fmd_hdl_topo_rele(hdl, thp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (NULL);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) topo_walk_step(twp, TOPO_WALK_CHILD);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys topo_walk_fini(twp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys fmd_hdl_topo_rele(hdl, thp);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (mb_nvl);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
7711facfe58561dd91d6ece0f5f41150c3956c83dinak/*ARGSUSED*/
7711facfe58561dd91d6ece0f5f41150c3956c83dinakstatic int
7711facfe58561dd91d6ece0f5f41150c3956c83dinakfind_dimm_sn_mem(topo_hdl_t *thp, tnode_t *node, void *arg)
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys{
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys int err;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys uint_t n;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys nvlist_t *rsrc;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys char **sn;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if (topo_node_resource(node, &rsrc, &err) < 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (TOPO_WALK_NEXT); /* no resource, try next */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_lookup_string_array(rsrc,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys FM_FMRI_HC_SERIAL_ID, &sn, &n) != 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_free(rsrc);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (TOPO_WALK_NEXT);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (strcmp(*sn, (char *)arg) != 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_free(rsrc);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (TOPO_WALK_NEXT);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) nvlist_dup(rsrc, &dimm_nvl, NV_UNIQUE_NAME);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_free(rsrc);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (TOPO_WALK_TERMINATE); /* if no space, give up */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys/*ARGSUSED*/
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysstatic int
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysfind_dimm_sn_hc(topo_hdl_t *thp, tnode_t *node, void *arg)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int err;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_t *fru;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *sn;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (topo_node_fru(node, &fru, 0, &err) < 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (TOPO_WALK_NEXT); /* no fru, try next */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_lookup_string(fru, FM_FMRI_HC_SERIAL_ID, &sn) != 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_free(fru);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (TOPO_WALK_NEXT);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (strcmp(sn, (char *)arg) != 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_free(fru);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (TOPO_WALK_NEXT);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) nvlist_dup(fru, &dimm_nvl, NV_UNIQUE_NAME);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_free(fru);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (TOPO_WALK_TERMINATE); /* if no space, give up */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/* cmd_find_dimm_by_sn -- find fmri by sn from libtopo */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
2cbed7292737821015ab481353eb10e8346b2c05wyllysnvlist_t *
2cbed7292737821015ab481353eb10e8346b2c05wyllyscmd_find_dimm_by_sn(fmd_hdl_t *hdl, char *schemename, char *sn)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys topo_hdl_t *thp;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys topo_walk_t *twp;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int err;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys dimm_nvl = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((thp = fmd_hdl_topo_hold(hdl, TOPO_VERSION)) == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (strcmp(schemename, FM_FMRI_SCHEME_MEM) == 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((twp = topo_walk_init(thp,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys schemename, find_dimm_sn_mem, sn, &err)) == NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fmd_hdl_topo_rele(hdl, thp);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((twp = topo_walk_init(thp,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys schemename, find_dimm_sn_hc, sn, &err)) == NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fmd_hdl_topo_rele(hdl, thp);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) topo_walk_step(twp, TOPO_WALK_CHILD);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys topo_walk_fini(twp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys fmd_hdl_topo_rele(hdl, thp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (dimm_nvl);
2cbed7292737821015ab481353eb10e8346b2c05wyllys}
2cbed7292737821015ab481353eb10e8346b2c05wyllys
7711facfe58561dd91d6ece0f5f41150c3956c83dinaktypedef struct cpuid {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak char serial[100];
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char id[10];
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys} cpuid_t;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys/*ARGSUSED*/
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllysstatic int
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllysfind_cpu_rsc_by_sn(topo_hdl_t *thp, tnode_t *node, void *arg)
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys{
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys int err;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys nvlist_t *rsc;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys cpuid_t *rscid = (cpuid_t *)arg;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys char *sn, *name, *id;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys nvlist_t **hcl;
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys uint_t n;
4ba70ed0e487727de98a6297bc6d0a827001a390wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (topo_node_resource(node, &rsc, &err) < 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (TOPO_WALK_NEXT); /* no rsc, try next */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_lookup_string(rsc, FM_FMRI_HC_SERIAL_ID, &sn) != 0) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak nvlist_free(rsc);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (TOPO_WALK_NEXT);
2cbed7292737821015ab481353eb10e8346b2c05wyllys }
2cbed7292737821015ab481353eb10e8346b2c05wyllys if (strcmp(rscid->serial, sn) != 0) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak nvlist_free(rsc);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (TOPO_WALK_NEXT);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if (nvlist_lookup_nvlist_array(rsc, FM_FMRI_HC_LIST, &hcl, &n) != 0) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak nvlist_free(rsc);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (TOPO_WALK_NEXT);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((nvlist_lookup_string(hcl[n - 1], FM_FMRI_HC_NAME, &name) != 0) ||
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys (nvlist_lookup_string(hcl[n - 1], FM_FMRI_HC_ID, &id) != 0)) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_free(rsc);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys return (TOPO_WALK_NEXT);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys }
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if ((strcmp(name, "cpu") != 0) || (strcmp(rscid->id, id) != 0)) {
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys nvlist_free(rsc);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys return (TOPO_WALK_NEXT);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys }
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys (void) nvlist_dup(rsc, &rsc_nvl, NV_UNIQUE_NAME);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_free(rsc);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (TOPO_WALK_TERMINATE); /* if no space, give up */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysnvlist_t *
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyscmd_find_cpu_rsc_by_sn(fmd_hdl_t *hdl, cpuid_t *cpuid)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys topo_hdl_t *thp;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys topo_walk_t *twp;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int err;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rsc_nvl = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((thp = fmd_hdl_topo_hold(hdl, TOPO_VERSION)) == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((twp = topo_walk_init(thp, FM_FMRI_SCHEME_HC,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys find_cpu_rsc_by_sn, cpuid, &err)) == NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fmd_hdl_topo_rele(hdl, thp);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) topo_walk_step(twp, TOPO_WALK_CHILD);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys topo_walk_fini(twp);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fmd_hdl_topo_rele(hdl, thp);
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys return (rsc_nvl);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysnvlist_t *
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysget_cpu_fault_resource(fmd_hdl_t *hdl, nvlist_t *asru)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint32_t cpu;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint64_t serint;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char serial[64];
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_t *rsc = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys cpuid_t cpuid;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char strid[10];
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_lookup_uint64(asru, FM_FMRI_CPU_SERIAL_ID, &serint) != 0 ||
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_lookup_uint32(asru, FM_FMRI_CPU_ID, &cpu) != 0)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (rsc);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) snprintf(serial, sizeof (serial), "%llx", serint);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys (void) snprintf(strid, sizeof (strid), "%d", cpu);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
7711facfe58561dd91d6ece0f5f41150c3956c83dinak (void) strcpy(cpuid.serial, serial);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak (void) strcpy(cpuid.id, strid);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rsc = cmd_find_cpu_rsc_by_sn(hdl, &cpuid);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rsc);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys/*ARGSUSED*/
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysstatic int
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysfind_mem_rsc_hc(topo_hdl_t *thp, tnode_t *node, void *arg)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys int err;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_t *rsc;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *sn;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (topo_node_resource(node, &rsc, &err) < 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (TOPO_WALK_NEXT); /* no rsc, try next */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_lookup_string(rsc, FM_FMRI_HC_SERIAL_ID, &sn) != 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_free(rsc);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (TOPO_WALK_NEXT);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (strcmp(sn, (char *)arg) != 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_free(rsc);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (TOPO_WALK_NEXT);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) nvlist_dup(rsc, &rsc_nvl, NV_UNIQUE_NAME);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_free(rsc);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (TOPO_WALK_TERMINATE); /* if no space, give up */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
7711facfe58561dd91d6ece0f5f41150c3956c83dinaknvlist_t *
7711facfe58561dd91d6ece0f5f41150c3956c83dinakcmd_find_mem_rsc_by_sn(fmd_hdl_t *hdl, char *sn)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak{
7711facfe58561dd91d6ece0f5f41150c3956c83dinak topo_hdl_t *thp;
7711facfe58561dd91d6ece0f5f41150c3956c83dinak topo_walk_t *twp;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys int err;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rsc_nvl = NULL;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((thp = fmd_hdl_topo_hold(hdl, TOPO_VERSION)) == NULL)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak return (NULL);
431deaa01ac039d796fdfaf86b909a75e7d9ac48hylee if ((twp = topo_walk_init(thp, FM_FMRI_SCHEME_HC,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys find_mem_rsc_hc, sn, &err)) == NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fmd_hdl_topo_rele(hdl, thp);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) topo_walk_step(twp, TOPO_WALK_CHILD);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys topo_walk_fini(twp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys fmd_hdl_topo_rele(hdl, thp);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (rsc_nvl);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysnvlist_t *
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysget_mem_fault_resource(fmd_hdl_t *hdl, nvlist_t *fru)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *sn;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint_t n;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char **snarray;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_lookup_string(fru, FM_FMRI_HC_SERIAL_ID, &sn) == 0)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (cmd_find_mem_rsc_by_sn(hdl, sn));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * T1 platform fru is in mem scheme
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_lookup_string_array(fru, FM_FMRI_MEM_SERIAL_ID,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys &snarray, &n) == 0)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (cmd_find_mem_rsc_by_sn(hdl, snarray[0]));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysint
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysis_T1_platform(nvlist_t *asru)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys{
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys char *unum;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_lookup_string(asru, FM_FMRI_MEM_UNUM, &unum) == 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (strstr(unum, "BR") == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (1);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (0);
2cbed7292737821015ab481353eb10e8346b2c05wyllys}
2cbed7292737821015ab481353eb10e8346b2c05wyllys
7711facfe58561dd91d6ece0f5f41150c3956c83dinaknvlist_t *
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyscmd_nvl_create_fault(fmd_hdl_t *hdl, const char *class, uint8_t cert,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nvlist_t *asru, nvlist_t *fru, nvlist_t *rsrc)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak{
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nvlist_t *fllist;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys uint64_t offset, phyaddr;
7711facfe58561dd91d6ece0f5f41150c3956c83dinak nvlist_t *hsp = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rsrc = NULL;
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) nvlist_add_nvlist(fru, FM_FMRI_AUTHORITY,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys cmd.cmd_auth); /* not an error if this fails */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (strstr(class, "fault.memory.") != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys /*
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * For T1 platform fault.memory.bank and fault.memory.dimm,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * do not issue the hc schmem for resource and fru
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (is_T1_platform(asru) && (strstr(class, ".page") == NULL)) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fllist = fmd_nvl_create_fault(hdl, class, cert, asru,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fru, fru);
2cbed7292737821015ab481353eb10e8346b2c05wyllys return (fllist);
2cbed7292737821015ab481353eb10e8346b2c05wyllys }
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys rsrc = get_mem_fault_resource(hdl, fru);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /*
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Need to append the phyaddr & offset into the
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * hc-specific of the fault.memory.page resource
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((rsrc != NULL) && strstr(class, ".page") != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_alloc(&hsp, NV_UNIQUE_NAME, 0) == 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nvlist_lookup_uint64(asru,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys FM_FMRI_MEM_PHYSADDR, &phyaddr) == 0)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) (nvlist_add_uint64(hsp,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys FM_FMRI_MEM_PHYSADDR,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys phyaddr));
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_lookup_uint64(asru,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys FM_FMRI_MEM_OFFSET, &offset) == 0)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) nvlist_add_uint64(hsp,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys FM_FMRI_HC_SPECIFIC_OFFSET, offset);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys (void) nvlist_add_nvlist(rsrc,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys FM_FMRI_HC_SPECIFIC, hsp);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fllist = fmd_nvl_create_fault(hdl, class, cert, asru,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fru, rsrc);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_free(hsp);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys } else {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys rsrc = get_cpu_fault_resource(hdl, asru);
d00756ccb34596a328f8a15d1965da5412d366d0wyllys fllist = fmd_nvl_create_fault(hdl, class, cert, asru,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fru, rsrc);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys }
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_free(rsrc);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (fllist);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys}
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys