074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier/*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * CDDL HEADER START
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier *
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * The contents of this file are subject to the terms of the
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Common Development and Distribution License (the "License").
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * You may not use this file except in compliance with the License.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier *
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * or http://www.opensolaris.org/os/licensing.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * See the License for the specific language governing permissions
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * and limitations under the License.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier *
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * When distributing Covered Code, include this CDDL HEADER in each
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * If applicable, add the following below this CDDL HEADER, with the
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * fields enclosed by brackets "[]" replaced with your own identifying
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * information: Portions Copyright [yyyy] [name of copyright owner]
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier *
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * CDDL HEADER END
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier/*
efd31e1d839d4665462b5c267a1c654548082663Trang Do * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <unistd.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <ctype.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <strings.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <sys/types.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <sys/devfm.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <libnvpair.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <sys/smbios.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <fm/topo_mod.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <sys/fm/protocol.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <sys/smbios_impl.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include "chip.h"
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#define CPU_SLOTS 64
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#define DIMM_SLOTS 512
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#define MC_INSTANCES 128
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#define MAXNAMELEN 256
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#define LABEL 1
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#define SKIP_CS 9999
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothiertypedef struct cpu_smbios {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier id_t cpu_id;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier uint8_t status;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier uint8_t fru;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}csmb_t;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothiertypedef struct dimm_smbios {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier id_t dimm_id;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier id_t extdimm_id;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier const char *bankloc;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}dsmb_t;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothiertypedef struct mct_smbios {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier id_t extmct_id;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier id_t mct_id;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier id_t p_id;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}msmb_t;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothiercsmb_t cpusmb[CPU_SLOTS];
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierdsmb_t dimmsmb[DIMM_SLOTS];
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothiermsmb_t mctsmb[MC_INSTANCES];
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierstatic int ncpu_ids = 0;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierstatic int bb_count = 0;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierstatic int ndimm_ids, nmct_ids = 0;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierstatic int fill_chip_smbios = 0;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothiertypedef int smbios_rec_f(topo_mod_t *, const smbios_struct_t *);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierstatic smbios_struct_t *
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothiersmb_export(const smb_struct_t *stp, smbios_struct_t *sp)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier const smb_header_t *hdr;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (stp == NULL)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (NULL);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier hdr = stp->smbst_hdr;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier sp->smbstr_id = hdr->smbh_hdl;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier sp->smbstr_type = hdr->smbh_type;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier sp->smbstr_data = hdr;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier sp->smbstr_size = (size_t)(stp->smbst_end - (uchar_t *)hdr);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (sp);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierstatic int
efd31e1d839d4665462b5c267a1c654548082663Trang Doextdimmslot_to_dimmslot(topo_mod_t *mod, id_t chip_smbid, int channum,
efd31e1d839d4665462b5c267a1c654548082663Trang Do int csnum)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbios_memdevice_ext_t emd;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbios_memdevice_t md;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int i, j, k;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int match = 0;
efd31e1d839d4665462b5c267a1c654548082663Trang Do smbios_hdl_t *shp;
efd31e1d839d4665462b5c267a1c654548082663Trang Do
efd31e1d839d4665462b5c267a1c654548082663Trang Do shp = topo_mod_smbios(mod);
efd31e1d839d4665462b5c267a1c654548082663Trang Do if (shp == NULL)
efd31e1d839d4665462b5c267a1c654548082663Trang Do return (-1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (chip_smbid == IGNORE_ID && bb_count <= 1 && nmct_ids <= 1) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier for (i = 0; i < ndimm_ids; i++) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier (void) smbios_info_extmemdevice(shp,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier dimmsmb[i].extdimm_id, &emd);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (emd.smbmdeve_drch == channum) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (csnum == SKIP_CS)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (emd.smbmdeve_md);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier for (k = 0; k < emd.smbmdeve_ncs; k++)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (emd.smbmdeve_cs[k] == csnum)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (emd.smbmdeve_md);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier for (j = 0; j < nmct_ids; j++) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (mctsmb[j].p_id == chip_smbid) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier for (i = 0; i < ndimm_ids; i++) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier (void) smbios_info_extmemdevice(shp,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier dimmsmb[i].extdimm_id, &emd);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier (void) smbios_info_memdevice(shp,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier emd.smbmdeve_md, &md);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (md.smbmd_array == mctsmb[j].mct_id &&
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier emd.smbmdeve_drch == channum) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier match = 1;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier break;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (match) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (csnum == SKIP_CS)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (emd.smbmdeve_md);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier for (k = 0; k < emd.smbmdeve_ncs; k++)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (emd.smbmdeve_cs[k] == csnum)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (emd.smbmdeve_md);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (-1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierid_t
efd31e1d839d4665462b5c267a1c654548082663Trang Domemnode_to_smbiosid(topo_mod_t *mod, uint16_t chip_smbid, const char *name,
efd31e1d839d4665462b5c267a1c654548082663Trang Do uint64_t nodeid, void *data)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (strcmp(name, CS_NODE_NAME) == 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int channum, csnum;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier id_t dimmslot = -1;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (data == NULL)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (-1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier channum = *(int *)data;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier csnum = nodeid;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Set the DIMM Slot label to the Chip Select Node
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Set the "data" to carry the DIMM instance
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
efd31e1d839d4665462b5c267a1c654548082663Trang Do dimmslot = extdimmslot_to_dimmslot(mod, chip_smbid, channum,
efd31e1d839d4665462b5c267a1c654548082663Trang Do csnum);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (dimmslot != -1 && dimmsmb[0].dimm_id != 0)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier *((id_t *)data) = dimmslot % (dimmsmb[0].dimm_id);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier else
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier *((id_t *)data) = -1;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (dimmslot);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier } else if (strcmp(name, DIMM_NODE_NAME) == 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier static int dimmnum = 0;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * On certain Intel Chips, topology does not have
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * chip-select nodes, it has the below layout
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * chip/memory-controller/dram-channel/dimm
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * so we check if channel instance is passed
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * and get the SMBIOS ID based on the channel
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (data != NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int channum;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier id_t dimmslot = -1;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier channum = *(int *)data;
efd31e1d839d4665462b5c267a1c654548082663Trang Do dimmslot = extdimmslot_to_dimmslot(mod, chip_smbid,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier channum, SKIP_CS);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (dimmslot);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier dimmnum = nodeid;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (dimmsmb[dimmnum].dimm_id);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (-1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierint
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierchip_get_smbstruct(topo_mod_t *mod, const smbios_struct_t *sp)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbios_processor_t p;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbios_memdevice_t md;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbios_processor_ext_t extp;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbios_memarray_ext_t extma;
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan smbios_memdevice_ext_t extmd;
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan int ext_match = 0;
efd31e1d839d4665462b5c267a1c654548082663Trang Do smbios_hdl_t *shp;
efd31e1d839d4665462b5c267a1c654548082663Trang Do
efd31e1d839d4665462b5c267a1c654548082663Trang Do shp = topo_mod_smbios(mod);
efd31e1d839d4665462b5c267a1c654548082663Trang Do if (shp == NULL)
efd31e1d839d4665462b5c267a1c654548082663Trang Do return (-1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier switch (sp->smbstr_type) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier case SMB_TYPE_BASEBOARD:
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier bb_count++;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier break;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier case SMB_TYPE_MEMARRAY:
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier mctsmb[nmct_ids].mct_id = sp->smbstr_id;
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan nmct_ids++;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier break;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier case SUN_OEM_EXT_MEMARRAY:
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (shp != NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (smbios_info_extmemarray(shp,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier sp->smbstr_id, &extma) != 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "chip_get_smbstruct : "
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "smbios_info_extmemarray()"
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "failed\n");
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (-1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier } else
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (-1);
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan for (int i = 0; i < nmct_ids; i++) {
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan if (extma.smbmae_ma == mctsmb[i].mct_id) {
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan mctsmb[i].extmct_id = sp->smbstr_id;
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan mctsmb[i].p_id = extma.smbmae_comp;
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan ext_match = 1;
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan break;
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan }
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan }
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan if (!ext_match) {
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan topo_mod_dprintf(mod, "chip_get_smbstruct : "
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan "EXT_MEMARRAY-MEMARRAY records are mismatched\n");
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan ext_match = 0;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (-1);
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier break;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier case SMB_TYPE_MEMDEVICE:
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier dimmsmb[ndimm_ids].dimm_id = sp->smbstr_id;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (shp != NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (smbios_info_memdevice(shp,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier sp->smbstr_id, &md) != 0)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (-1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier } else
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (-1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier dimmsmb[ndimm_ids].bankloc = md.smbmd_bloc;
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan ndimm_ids++;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier break;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Every SMB_TYPE_MEMDEVICE SHOULD have a
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * corresponding SUN_OEM_EXT_MEMDEVICE
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier case SUN_OEM_EXT_MEMDEVICE:
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan if (smbios_info_extmemdevice(shp,
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan sp->smbstr_id, &extmd) != 0) {
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan topo_mod_dprintf(mod, "chip_get_smbstruct : "
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan "smbios_info_extmemdevice()"
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan "failed\n");
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan return (-1);
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan }
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan for (int i = 0; i < ndimm_ids; i++) {
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan if (extmd.smbmdeve_md == dimmsmb[i].dimm_id) {
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan dimmsmb[i].extdimm_id = sp->smbstr_id;
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan ext_match = 1;
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan break;
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan }
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan }
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan if (!ext_match) {
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan topo_mod_dprintf(mod, "chip_get_smbstruct : "
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan "EXT_MEMDEVICE-MEMDEVICE records are mismatched\n");
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan ext_match = 0;
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan return (-1);
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier break;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier case SMB_TYPE_PROCESSOR:
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier cpusmb[ncpu_ids].cpu_id = sp->smbstr_id;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (shp != NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (smbios_info_processor(shp,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier sp->smbstr_id, &p) != 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "chip_get_smbstruct : "
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "smbios_info_processor()"
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "failed\n");
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (-1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier cpusmb[ncpu_ids].status = p.smbp_status;
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan ncpu_ids++;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier break;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Every SMB_TYPE_PROCESSOR SHOULD have a
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * corresponding SUN_OEM_EXT_PROCESSOR
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier case SUN_OEM_EXT_PROCESSOR:
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (smbios_info_extprocessor(shp,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier sp->smbstr_id, &extp) != 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "chip_get_smbstruct : "
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "smbios_info_extprocessor()"
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "failed\n");
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (-1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan for (int i = 0; i < ncpu_ids; i++) {
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan if (extp.smbpe_processor == cpusmb[i].cpu_id) {
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan cpusmb[i].fru = extp.smbpe_fru;
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan ext_match = 1;
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan break;
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan }
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan }
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan if (!ext_match) {
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan topo_mod_dprintf(mod, "chip_get_smbstruct : "
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan "EXT_PROCESSOR-PROCESSOR records are mismatched\n");
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan ext_match = 0;
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan return (-1);
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier break;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (0);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierstatic int
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierchip_smbios_iterate(topo_mod_t *mod, smbios_rec_f *func_iter)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
efd31e1d839d4665462b5c267a1c654548082663Trang Do const smb_struct_t *sp;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbios_struct_t s;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int i, rv = 0;
efd31e1d839d4665462b5c267a1c654548082663Trang Do smbios_hdl_t *shp;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
efd31e1d839d4665462b5c267a1c654548082663Trang Do shp = topo_mod_smbios(mod);
efd31e1d839d4665462b5c267a1c654548082663Trang Do if (shp == NULL)
efd31e1d839d4665462b5c267a1c654548082663Trang Do return (rv);
efd31e1d839d4665462b5c267a1c654548082663Trang Do
efd31e1d839d4665462b5c267a1c654548082663Trang Do sp = shp->sh_structs;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier for (i = 0; i < shp->sh_nstructs; i++, sp++) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (sp->smbst_hdr->smbh_type != SMB_TYPE_INACTIVE &&
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier (rv = func_iter(mod, smb_export(sp, &s))) != 0)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier break;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (rv);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierint
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierinit_chip_smbios(topo_mod_t *mod)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (!fill_chip_smbios) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (chip_smbios_iterate(mod, chip_get_smbstruct) == -1)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (-1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier fill_chip_smbios = 1;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (0);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierint
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierchip_status_smbios_get(topo_mod_t *mod, id_t smb_id)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Type-4 Socket Status bit definitions per SMBIOS Version 2.6
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier *
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * STATUS
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * CPU Socket Populated
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * CPU Socket Unpopulated
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Populated : Enabled
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Populated : Disabled by BIOS (Setup)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Populated : Disabled by BIOS (Error)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Populated : Idle
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier uint8_t enabled = 0x01;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier uint8_t populated = 0x40;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier for (int i = 0; i < ncpu_ids; i++) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (smb_id == cpusmb[i].cpu_id) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (cpusmb[i].status == (enabled | populated))
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan topo_mod_dprintf(mod, "chip_status_smbios_get() failed"
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier " considering that Type 4 ID : %d is disabled", smb_id);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (0);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierint
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierchip_fru_smbios_get(topo_mod_t *mod, id_t smb_id)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * smbios_processor_ext_t->smbpe_fru : if set to 1
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * processor is a FRU
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier uint8_t fru = 1;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier for (int i = 0; i < ncpu_ids; i++) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (smb_id == cpusmb[i].cpu_id) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (cpusmb[i].fru == fru)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier else
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (0);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
bb1fad37c75defa7a6ae25f00c1d4b356713b734Srihari Venkatesan topo_mod_dprintf(mod, "chip_fru_smbios_get() failed"
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier " considering that Type 4 ID : %d is not a FRU", smb_id);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (0);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier/*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * This could be defined as topo_mod_strlen()
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothiersize_t
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierchip_strlen(const char *str)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int len = 0;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (str != NULL)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier len = strlen(str);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (len);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier/*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * We clean Serials, Revisions, Part No. strings, to
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * avoid getting lost when fmd synthesizes these
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * strings. :, =, /, ' ' characters are replaced
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * with character '-' any non-printable characters
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * as seen with !isprint() is also replaced with '-'
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Labels are checked only for non-printable characters.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierstatic const char *
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierchip_cleanup_smbios_str(topo_mod_t *mod, const char *begin, int str_type)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier char buf[MAXNAMELEN];
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier const char *end, *cp;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier char *pp;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier char c;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int i;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier end = begin + strlen(begin);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier while (begin < end && isspace(*begin))
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier begin++;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier while (begin < end && isspace(*(end - 1)))
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier end--;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (begin >= end)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (NULL);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier cp = begin;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier for (i = 0; i < MAXNAMELEN - 1; i++) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (cp >= end)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier break;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier c = *cp;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (str_type == LABEL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (!isprint(c))
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier buf[i] = '-';
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier else
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier buf[i] = c;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier } else {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (c == ':' || c == '=' || c == '/' ||
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier isspace(c) || !isprint(c))
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier buf[i] = '-';
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier else
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier buf[i] = c;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier cp++;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier buf[i] = 0;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier pp = topo_mod_strdup(mod, buf);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (str_type == LABEL)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_strfree(mod, (char *)begin);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (pp);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierconst char *
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierchip_label_smbios_get(topo_mod_t *mod, tnode_t *pnode, id_t smb_id,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier char *ksmbios_label)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbios_info_t c;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier char *label = NULL;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier char *buf = NULL;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier const char *lsmbios_label = NULL;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int bufsz = 0;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier char *delim = NULL, *blank = " ";
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier const char *dimm_bank = NULL;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier const char *clean_label = NULL;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int err;
efd31e1d839d4665462b5c267a1c654548082663Trang Do smbios_hdl_t *shp;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
efd31e1d839d4665462b5c267a1c654548082663Trang Do shp = topo_mod_smbios(mod);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (shp != NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Get Parent FRU's label
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (topo_prop_get_string(pnode, TOPO_PGROUP_PROTOCOL,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier TOPO_PROP_LABEL, &label, &err) == -1)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "Failed to get"
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier " Label of Parent Node error : %d\n", err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (label != NULL)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier label = (char *)chip_cleanup_smbios_str(mod,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier label, LABEL);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * On Intel the driver gets the label from ksmbios
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * so we check if we already have it, if not we
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * get it from libsmbios
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (ksmbios_label == NULL && smb_id != -1) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (smbios_info_common(shp, smb_id, &c) != SMB_ERR) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier for (int i = 0; i < ndimm_ids; i++) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (smb_id == dimmsmb[i].dimm_id) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier dimm_bank = dimmsmb[i].bankloc;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier break;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (dimm_bank != NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier bufsz += chip_strlen(blank) +
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier chip_strlen(dimm_bank);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier lsmbios_label = c.smbi_location;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier } else
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier lsmbios_label = ksmbios_label;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (label != NULL && lsmbios_label != NULL)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier delim = "/";
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier bufsz += chip_strlen(label) + chip_strlen(delim) +
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier chip_strlen(lsmbios_label) + 1;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier buf = topo_mod_alloc(mod, bufsz);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (buf != NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (label != NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier (void) strlcpy(buf, label, bufsz);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (lsmbios_label != NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier (void) strlcat(buf, delim, bufsz);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * If we are working on a DIMM
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * and we are deriving from libsmbios
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * smbi_location has the Device Locator.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * add the Device Locator
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * add Bank Locator latter
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier (void) strlcat(buf, lsmbios_label,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier bufsz);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier } else if (lsmbios_label != NULL)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier (void) strlcpy(buf, lsmbios_label,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier bufsz);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (dimm_bank != NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier (void) strlcat(buf, blank, bufsz);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier (void) strlcat(buf, dimm_bank, bufsz);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier clean_label = chip_cleanup_smbios_str(mod, buf, LABEL);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_strfree(mod, label);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (clean_label);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "Failed to get Label\n");
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (NULL);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierconst char *
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierchip_serial_smbios_get(topo_mod_t *mod, id_t smb_id)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbios_info_t c;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier const char *clean_serial = NULL;
efd31e1d839d4665462b5c267a1c654548082663Trang Do smbios_hdl_t *shp;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
efd31e1d839d4665462b5c267a1c654548082663Trang Do shp = topo_mod_smbios(mod);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (shp != NULL && smb_id != -1)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (smbios_info_common(shp, smb_id, &c) != SMB_ERR) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier clean_serial = chip_cleanup_smbios_str(mod,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier c.smbi_serial, 0);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (clean_serial);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "Failed to get Serial \n");
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (NULL);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierconst char *
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierchip_part_smbios_get(topo_mod_t *mod, id_t smb_id)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbios_info_t c;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier const char *clean_part = NULL;
efd31e1d839d4665462b5c267a1c654548082663Trang Do smbios_hdl_t *shp;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
efd31e1d839d4665462b5c267a1c654548082663Trang Do shp = topo_mod_smbios(mod);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (shp != NULL && smb_id != -1)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (smbios_info_common(shp, smb_id, &c) != SMB_ERR) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier clean_part = chip_cleanup_smbios_str(mod,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier c.smbi_part, 0);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (clean_part);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "Failed to get Part\n");
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (NULL);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierconst char *
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierchip_rev_smbios_get(topo_mod_t *mod, id_t smb_id)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbios_info_t c;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier const char *clean_rev = NULL;
efd31e1d839d4665462b5c267a1c654548082663Trang Do smbios_hdl_t *shp;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
efd31e1d839d4665462b5c267a1c654548082663Trang Do shp = topo_mod_smbios(mod);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (shp != NULL && smb_id != -1)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (smbios_info_common(shp, smb_id, &c) != SMB_ERR) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier clean_rev = chip_cleanup_smbios_str(mod,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier c.smbi_version, 0);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (clean_rev);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "Failed to get Revision\n");
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (NULL);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}