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/*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Create Base Board (MB) topology node from SMBIOS Type 2 structure
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <sys/types.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <strings.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <fm/topo_mod.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <fm/topo_hc.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <sys/systeminfo.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <sys/smbios_impl.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <sys/smbios.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <x86pi_impl.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier/* base baoed type values to hc-canonical-name */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierstatic const struct x86pi_bb_name {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int type;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier const char *name;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier} x86pi_bb_names[] = {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier { SMB_BBT_SBLADE, "systemboard" },
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier { SMB_BBT_PROC, "cpuboard" },
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier { SMB_BBT_IO, "ioboard" },
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier { SMB_BBT_MEM, "memboard" },
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier { SMB_BBT_DAUGHTER, "systemboard" },
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier { SMB_BBT_MOTHER, "motherboard" },
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier { SMB_BBT_PROCMEM, "systemboard" },
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier { SMB_BBT_PROCIO, "systemboard" },
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier { SMB_BBT_INTER, "systemboard" },
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier { 0x00 }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier};
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothiertnode_t *
efd31e1d839d4665462b5c267a1c654548082663Trang Dox86pi_gen_bboard(topo_mod_t *mod, tnode_t *t_parent, int smb_id,
efd31e1d839d4665462b5c267a1c654548082663Trang Do int instance, int psmb_id)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int rv;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbios_info_t ip;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbios_bboard_t bb;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbios_struct_t sp;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier x86pi_hcfmri_t bb_hcfmri;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier tnode_t *bb_node;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier const struct x86pi_bb_name *bbnp;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier static int cpuboard = 0;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier static int memboard = 0;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier static int ioboard = 0;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier static int systemboard = 0;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier static int motherboard = 0;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier char *f = "x86pi_gen_bboard";
efd31e1d839d4665462b5c267a1c654548082663Trang Do smbios_hdl_t *shp;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s\n", f);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
efd31e1d839d4665462b5c267a1c654548082663Trang Do shp = topo_mod_smbios(mod);
efd31e1d839d4665462b5c267a1c654548082663Trang Do if (shp == NULL) {
efd31e1d839d4665462b5c267a1c654548082663Trang Do topo_mod_dprintf(mod, "%s: failed to load SMBIOS\n", f);
efd31e1d839d4665462b5c267a1c654548082663Trang Do return (NULL);
efd31e1d839d4665462b5c267a1c654548082663Trang Do }
efd31e1d839d4665462b5c267a1c654548082663Trang Do
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* SMBIOS Base Board struct */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier rv = smbios_info_bboard(shp, smb_id, &bb);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (rv != 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s: smbios_info_bboard() failed\n", f);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (NULL);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier (void) smbios_lookup_id(shp, psmb_id, &sp);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (sp.smbstr_type == SMB_TYPE_CHASSIS &&
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier bb.smbb_chassis != psmb_id) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s: base board (%d) does not belong to "
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "chassis (%d)\n", f, smb_id, psmb_id);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (NULL);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* SMBIOS Base Board strings */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier rv = smbios_info_common(shp, smb_id, &ip);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (rv != 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (NULL);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * populate string entries
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier *
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * We don't set "product" because it may contain characters
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * unacceptable by fmri. topo_mod_auth() will set the product-id
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * for us and call topo_cleanup_auth_str() when necessary.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier bb_hcfmri.serial_number = x86pi_cleanup_smbios_str(mod,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier ip.smbi_serial, 0);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier bb_hcfmri.version = x86pi_cleanup_smbios_str(mod, ip.smbi_version, 0);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* asset tag string contains the part number */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier bb_hcfmri.part_number = x86pi_cleanup_smbios_str(mod,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier ip.smbi_asset, 0);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier bb_hcfmri.location = x86pi_cleanup_smbios_str(mod, ip.smbi_location, 0);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* determine the hc-name */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier for (bbnp = x86pi_bb_names; bbnp->type != 0x00; bbnp++) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (bbnp->type == bb.smbb_type) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier switch (bbnp->type) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier case SMB_BBT_PROC :
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier instance = cpuboard++;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier break;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier case SMB_BBT_IO :
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier instance = ioboard++;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier break;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier case SMB_BBT_MEM :
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier instance = memboard++;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier break;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier case SMB_BBT_MOTHER :
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier instance = motherboard++;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier break;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier default :
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Enumerate any other baseboard type
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * as systemboard.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier *
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * SMB_BBT_UNKNOWN
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * SMB_BBT_OTHER
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * SMB_BBT_SBLADE
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * SMB_BBT_CSWITCH
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * SMB_BBT_SMM
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * SMB_BBT_DAUGHTER
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * SMB_BBT_PROCMEM
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * SMB_BBT_PROCIO
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * SMB_BBT_INTER
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier instance = systemboard++;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier break;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier break;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier bb_hcfmri.instance = instance;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (bbnp->type != 0x00)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier bb_hcfmri.hc_name = topo_mod_strdup(mod, bbnp->name);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier else
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier bb_hcfmri.hc_name = topo_mod_strdup(mod, "NULL");
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s: S/N (%s)\n", f, bb_hcfmri.serial_number);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s: version/N (%s)\n", f, bb_hcfmri.version);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s: Part/N (%s)\n", f, bb_hcfmri.part_number);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s: location (%s)\n", f, bb_hcfmri.location);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s: instance (%d)\n", f, bb_hcfmri.instance);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s: hc_name (%s)\n", f, bb_hcfmri.hc_name);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier rv = x86pi_enum_generic(mod, &bb_hcfmri, t_parent, t_parent, &bb_node,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier X86PI_ENUM_FRU);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (rv != 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s: failed to create tnode %d\n", f,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier instance);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier bb_node = NULL;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* free up strings */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (bb_hcfmri.hc_name != NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_strfree(mod, (char *)bb_hcfmri.hc_name);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (bb_hcfmri.part_number != NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_strfree(mod, (char *)bb_hcfmri.part_number);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (bb_hcfmri.serial_number != NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_strfree(mod, (char *)bb_hcfmri.serial_number);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (bb_hcfmri.version != NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_strfree(mod, (char *)bb_hcfmri.version);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (bb_hcfmri.location != NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_strfree(mod, (char *)bb_hcfmri.location);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (bb_node);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierint
efd31e1d839d4665462b5c267a1c654548082663Trang Dox86pi_bb_getchips(topo_mod_t *mod, int index, int nboards)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier id_t *cid;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int count;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int ncmp = 0;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbios_struct_t sp;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbs_cnt_t *smbc = NULL;
efd31e1d839d4665462b5c267a1c654548082663Trang Do smbios_hdl_t *shp;
efd31e1d839d4665462b5c267a1c654548082663Trang Do
efd31e1d839d4665462b5c267a1c654548082663Trang Do shp = topo_mod_smbios(mod);
efd31e1d839d4665462b5c267a1c654548082663Trang Do if (shp == NULL)
efd31e1d839d4665462b5c267a1c654548082663Trang Do return (ncmp);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier cid = stypes[SMB_TYPE_BASEBOARD].ids[index].con_ids;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier count = stypes[SMB_TYPE_BASEBOARD].ids[index].con_cnt;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier for (int i = 0; i < count; i++) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier (void) smbios_lookup_id(shp, cid[i], &sp);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (sp.smbstr_type == SMB_TYPE_PROCESSOR) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier ncmp++;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * If there are missing SMB_TYPE_PROCESSOR structures
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * contained within SMB_TYPE_BASEBOARD, and if the
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * system has only one baseboard we enumerate
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * all processors under it.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbc = &stypes[SMB_TYPE_PROCESSOR];
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbc->type = SMB_TYPE_PROCESSOR;
efd31e1d839d4665462b5c267a1c654548082663Trang Do x86pi_smb_strcnt(mod, smbc);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (nboards == 1) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (ncmp != stypes[SMB_TYPE_PROCESSOR].count)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier ncmp = stypes[SMB_TYPE_PROCESSOR].count;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier } else {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (ncmp == 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "failed to get processors"
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier " (or) no processors are contained"
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier " within baseboard instance %d, unable to"
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier " enumerate chips\n", index);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (ncmp);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierid_t
efd31e1d839d4665462b5c267a1c654548082663Trang Dox86pi_bb_topparent(topo_mod_t *mod, int index, tnode_t **pnode, id_t *psmbid)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier id_t top_bb_smbid = -1;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier id_t smb_id;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int bb_count, ch_count;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbios_struct_t sp;
efd31e1d839d4665462b5c267a1c654548082663Trang Do smbios_hdl_t *shp;
efd31e1d839d4665462b5c267a1c654548082663Trang Do
efd31e1d839d4665462b5c267a1c654548082663Trang Do shp = topo_mod_smbios(mod);
efd31e1d839d4665462b5c267a1c654548082663Trang Do if (shp == NULL)
efd31e1d839d4665462b5c267a1c654548082663Trang Do return (top_bb_smbid);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smb_id = stypes[SMB_TYPE_BASEBOARD].ids[index].con_by_id;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier (void) smbios_lookup_id(shp, smb_id, &sp);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (sp.smbstr_type == SMB_TYPE_CHASSIS) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier top_bb_smbid = stypes[SMB_TYPE_BASEBOARD].ids[index].id;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier *psmbid = smb_id;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier ch_count = stypes[SMB_TYPE_CHASSIS].count;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier for (int i = 0; i < ch_count; i++)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (stypes[SMB_TYPE_CHASSIS].ids[i].id == *psmbid)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier *pnode = stypes[SMB_TYPE_CHASSIS].ids[i].node;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (top_bb_smbid);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier } else if (sp.smbstr_type == SMB_TYPE_BASEBOARD) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier bb_count = stypes[SMB_TYPE_BASEBOARD].count;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier for (int i = 0; i < bb_count; i++) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (stypes[SMB_TYPE_BASEBOARD].ids[i].id == smb_id) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (stypes[SMB_TYPE_BASEBOARD].ids[i].visited
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier == X86PI_VISITED) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier top_bb_smbid =
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier stypes[SMB_TYPE_BASEBOARD].\
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier ids[index].id;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier *pnode =
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier stypes[SMB_TYPE_BASEBOARD].ids[i].\
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier node;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier *psmbid =
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier stypes[SMB_TYPE_BASEBOARD].ids[i].\
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier id;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier break;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
efd31e1d839d4665462b5c267a1c654548082663Trang Do top_bb_smbid = x86pi_bb_topparent(mod,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier i, pnode, psmbid);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier break;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (top_bb_smbid);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierid_t
efd31e1d839d4665462b5c267a1c654548082663Trang Dox86pi_bb_chassis(topo_mod_t *mod, id_t bb_smbid)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbios_bboard_t bb;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int rv;
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 rv = smbios_info_bboard(shp, bb_smbid, &bb);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (rv != 0)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (-1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (bb.smbb_chassis);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierint
efd31e1d839d4665462b5c267a1c654548082663Trang Dox86pi_bb_contains(topo_mod_t *mod)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int rv;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier id_t smb_id;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbios_bboard_t bb;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int bb_count = 0;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier uint_t cont_cnt = 0;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbios_struct_t sp;
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 bb_count = stypes[SMB_TYPE_BASEBOARD].count;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier for (int i = 0; i < bb_count; i++) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smb_id = stypes[SMB_TYPE_BASEBOARD].ids[i].id;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* SMBIOS Base Board struct */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier rv = smbios_info_bboard(shp, smb_id, &bb);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (rv != 0)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (-1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* Set Baseboard - Chassis Relationship */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (stypes[SMB_TYPE_BASEBOARD].ids[i].con_by_id == 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier stypes[SMB_TYPE_BASEBOARD].ids[i].con_by_id =
efd31e1d839d4665462b5c267a1c654548082663Trang Do rv = x86pi_bb_chassis(mod, smb_id);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (rv == -1) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, " failed to get"
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier " the chassis handle\n");
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (rv);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* SMBIOS contained object handles */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier cont_cnt = bb.smbb_contn;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (cont_cnt > 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier id_t *cont_hdl;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier uint16_t hdl;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* allocate space for and get contained handles */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier cont_hdl = topo_mod_alloc(mod, cont_cnt *
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier sizeof (id_t));
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier rv = smbios_info_contains(shp, smb_id, cont_cnt,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier cont_hdl);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (rv > SMB_CONT_MAX) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_free(mod, cont_hdl, cont_cnt *
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier sizeof (id_t));
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (-1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier cont_cnt = MIN(rv, cont_cnt);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* attach contained handles */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier stypes[SMB_TYPE_BASEBOARD].ids[i].con_cnt = cont_cnt;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier for (int j = 0; j < cont_cnt; j++) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier hdl = (uint16_t)cont_hdl[j];
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "id %d contained handle"
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier " %d: %d\n", i, j, hdl);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier stypes[SMB_TYPE_BASEBOARD].ids[i].\
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier con_ids[j] = hdl;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier (void) smbios_lookup_id(shp, hdl, &sp);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (sp.smbstr_type == SMB_TYPE_BASEBOARD) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier for (int k = 0; k < bb_count; k++)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (stypes[SMB_TYPE_BASEBOARD].\
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier ids[k].id == hdl)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier stypes[\
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier SMB_TYPE_BASEBOARD\
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier ].ids[k].con_by_id =
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smb_id;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_free(mod, cont_hdl, cont_cnt * sizeof (id_t));
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (0);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}