cmd_hc_sun4v.c revision aab83bb83be7342f6cfccaed8d5fe0b2f404855d
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * See the License for the specific language governing permissions
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * and limitations under the License.
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 * CDDL HEADER END
d00756ccb34596a328f8a15d1965da5412d366d0wyllys * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
7711facfe58561dd91d6ece0f5f41150c3956c83dinak * Use is subject to license terms.
7711facfe58561dd91d6ece0f5f41150c3956c83dinak/* Using a global variable is safe because the DE is single threaded */
7711facfe58561dd91d6ece0f5f41150c3956c83dinakcmd_fault_add_location(fmd_hdl_t *hdl, nvlist_t *flt, const char *locstr) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys char *t, *s;
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nvlist_lookup_string(flt, FM_FAULT_LOCATION, &t) == 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Replace occurrence of ": " with "/" to avoid confusing ILOM. */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys t = fmd_hdl_zalloc(hdl, strlen(locstr) + 1, FMD_SLEEP);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (s != NULL) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys /* Also, remove any J number from end of this string. */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_add_string(flt, FM_FAULT_LOCATION, t) != 0)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fmd_hdl_error(hdl, "unable to alloc location for fault\n");
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllystypedef struct tr_ent {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysmap_name(const char *p) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys for (i = 0; i < tr_tbl_n; i++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (i);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (-1);
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.
7711facfe58561dd91d6ece0f5f41150c3956c83dinakcmd_breakup_components(char *str, char *sep, nvlist_t **hc_nvl)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys continue; /* skip names that don't map */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nvlist_add_string(hc_nvl[i], FM_FMRI_HC_ID, instbuf) != 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (-1);
7711facfe58561dd91d6ece0f5f41150c3956c83dinak return (1);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nvlist_lookup_string(asru, FM_FMRI_CPU_CPUFRU, &cpufru) == 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fmd_hdl_debug(hdl, "cmd_getfru_loc: Default fruloc=empty string\n");
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyscmd_mkboard_fru(fmd_hdl_t *hdl, char *frustr, char *serialstr, char *partstr) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fmd_hdl_debug(hdl, "cmd_mkboard_fru: nac=%s components=%d\n", nac, n);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys hc_list = fmd_hdl_zalloc(hdl, sizeof (nvlist_t *)*n, FMD_SLEEP);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys for (i = 0; i < n; i++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < n; i++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < n; i++) {
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_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++) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys for (i = 0; i < n; i++) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlist_add_string(fru, FM_FMRI_HC_SERIAL_ID, serialstr) != 0) ||
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys nvlist_add_string(fru, FM_FMRI_HC_PART, partstr) != 0)) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyscmd_boardfru_create_fault(fmd_hdl_t *hdl, nvlist_t *asru, const char *fltnm,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nvlist_lookup_string(asru, FM_FMRI_HC_SERIAL_ID, &serialstr) != 0)
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nvlist_lookup_string(asru, FM_FMRI_HC_PART, &partstr) != 0)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys nvlfru = cmd_mkboard_fru(hdl, loc, serialstr, partstr);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys flt = cmd_nvl_create_fault(hdl, fltnm, cert, nvlfru, nvlfru, NULL);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys/* find_mb -- find hardware platform motherboard within libtopo */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/* ARGSUSED */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_lookup_nvlist_array(rsrc, FM_FMRI_HC_LIST, &hcl, &n) < 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if (nvlist_lookup_string(hcl[0], FM_FMRI_HC_NAME, &name) != 0) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak return (TOPO_WALK_NEXT); /* not MB hc list, try next */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (TOPO_WALK_TERMINATE); /* if no space, give up */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/* init_mb -- read hardware platform motherboard from libtopo */
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if ((thp = fmd_hdl_topo_hold(hdl, TOPO_VERSION)) == NULL)
7711facfe58561dd91d6ece0f5f41150c3956c83dinak/*ARGSUSED*/
7711facfe58561dd91d6ece0f5f41150c3956c83dinakfind_dimm_sn_mem(topo_hdl_t *thp, tnode_t *node, void *arg)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (TOPO_WALK_TERMINATE); /* if no space, give up */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys/*ARGSUSED*/
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllysfind_dimm_sn_hc(topo_hdl_t *thp, tnode_t *node, void *arg)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_lookup_string(fru, FM_FMRI_HC_SERIAL_ID, &sn) != 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (TOPO_WALK_TERMINATE); /* if no space, give up */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys/* cmd_find_dimm_by_sn -- find fmri by sn from libtopo */
2cbed7292737821015ab481353eb10e8346b2c05wyllyscmd_find_dimm_by_sn(fmd_hdl_t *hdl, char *schemename, char *sn)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((thp = fmd_hdl_topo_hold(hdl, TOPO_VERSION)) == NULL)
7711facfe58561dd91d6ece0f5f41150c3956c83dinaktypedef struct cpuid {
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys/*ARGSUSED*/
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllysfind_cpu_rsc_by_sn(topo_hdl_t *thp, tnode_t *node, void *arg)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_lookup_string(rsc, FM_FMRI_HC_SERIAL_ID, &sn) != 0) {
7711facfe58561dd91d6ece0f5f41150c3956c83dinak if (nvlist_lookup_nvlist_array(rsc, FM_FMRI_HC_LIST, &hcl, &n) != 0) {
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)) {
fa60c371cd00bdca17de2ff18fe3e64d051ae61bwyllys if ((strcmp(name, "cpu") != 0) || (strcmp(rscid->id, id) != 0)) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (TOPO_WALK_TERMINATE); /* if no space, give up */
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllyscmd_find_cpu_rsc_by_sn(fmd_hdl_t *hdl, cpuid_t *cpuid)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if ((thp = fmd_hdl_topo_hold(hdl, TOPO_VERSION)) == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysget_cpu_fault_resource(fmd_hdl_t *hdl, nvlist_t *asru)
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 (void) snprintf(serial, sizeof (serial), "%llx", serint);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys/*ARGSUSED*/
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllysfind_mem_rsc_hc(topo_hdl_t *thp, tnode_t *node, void *arg)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_lookup_string(rsc, FM_FMRI_HC_SERIAL_ID, &sn) != 0) {
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys return (TOPO_WALK_TERMINATE); /* if no space, give up */
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((thp = fmd_hdl_topo_hold(hdl, TOPO_VERSION)) == NULL)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_lookup_string(fru, FM_FMRI_HC_SERIAL_ID, &sn) == 0)
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * T1 platform fru is in mem scheme
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_lookup_string_array(fru, FM_FMRI_MEM_SERIAL_ID,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (nvlist_lookup_string(asru, FM_FMRI_MEM_UNUM, &unum) == 0) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (1);
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys return (0);
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllyscmd_nvl_create_fault(fmd_hdl_t *hdl, const char *class, uint8_t cert,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * For T1 platform fault.memory.bank and fault.memory.dimm,
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys * do not issue the hc schmem for resource and fru
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys if (is_T1_platform(asru) && (strstr(class, ".page") == NULL)) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fllist = fmd_nvl_create_fault(hdl, class, cert, asru,
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * Need to append the phyaddr & offset into the
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys * hc-specific of the fault.memory.page resource
99ebb4ca412cb0a19d77a3899a87c055b9c30fa8wyllys if ((rsrc != NULL) && strstr(class, ".page") != NULL) {
30a5e8fa1253cb33980ee4514743cf683f584b4ewyllys fllist = fmd_nvl_create_fault(hdl, class, cert, asru,