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 * Subroutines used by the i86pc Generic Topology Enumerator
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <sys/types.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <strings.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <deflt.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <fcntl.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <unistd.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <fm/topo_mod.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <fm/topo_hc.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <sys/devfm.h>
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier#include <sys/pci.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <sys/systeminfo.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <sys/fm/protocol.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <sys/utsname.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <sys/smbios.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <sys/smbios_impl.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier#include <x86pi_impl.h>
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierstatic const topo_pgroup_info_t sys_pgroup = {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier TOPO_PGROUP_SYSTEM,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier TOPO_STABILITY_PRIVATE,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier TOPO_STABILITY_PRIVATE,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier 1
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier};
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierstatic const topo_pgroup_info_t auth_pgroup = {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier FM_FMRI_AUTHORITY,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier TOPO_STABILITY_PRIVATE,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier TOPO_STABILITY_PRIVATE,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier 1
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier};
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier/*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Free hcfmri strings.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothiervoid
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierx86pi_hcfmri_info_fini(topo_mod_t *mod, x86pi_hcfmri_t *hc)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (hc->hc_name != NULL)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_strfree(mod, (char *)hc->hc_name);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (hc->manufacturer != NULL)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_strfree(mod, (char *)hc->manufacturer);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (hc->product != NULL)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_strfree(mod, (char *)hc->product);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (hc->version != NULL)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_strfree(mod, (char *)hc->version);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (hc->serial_number != NULL)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_strfree(mod, (char *)hc->serial_number);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (hc->asset_tag != NULL)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_strfree(mod, (char *)hc->asset_tag);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (hc->location != NULL)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_strfree(mod, (char *)hc->location);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (hc->part_number != NULL)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_strfree(mod, (char *)hc->part_number);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier/*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Get the server hostname (the ID as far as the topo authority is
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * concerned) from sysinfo and return a copy to the caller.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier *
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * The string must be freed with topo_mod_strfree()
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierchar *
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierx86pi_get_serverid(topo_mod_t *mod)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int result;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier char hostname[MAXNAMELEN];
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "x86pi_get_serverid\n");
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = sysinfo(SI_HOSTNAME, hostname, sizeof (hostname));
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* Everything is freed up and it's time to return the platform-id */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result == -1) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (NULL);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "x86pi_get_serverid: hostname = %s\n", hostname);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (topo_mod_strdup(mod, hostname));
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier/*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Get copy of SMBIOS.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothiersmbios_hdl_t *
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierx86pi_smb_open(topo_mod_t *mod)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbios_hdl_t *smb_hdl;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier char *f = "x86pi_smb_open";
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s\n", f);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smb_hdl = topo_mod_smbios(mod);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (smb_hdl == NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s: failed to load SMBIOS\n", f);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (NULL);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (smb_hdl);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier/*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Go through the smbios structures looking for a type. Fill in
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * the structure count as well as the id(s) of the struct types.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothiervoid
efd31e1d839d4665462b5c267a1c654548082663Trang Dox86pi_smb_strcnt(topo_mod_t *mod, smbs_cnt_t *stype)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
efd31e1d839d4665462b5c267a1c654548082663Trang Do const smb_struct_t *sp;
efd31e1d839d4665462b5c267a1c654548082663Trang Do int nstructs;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int i, cnt;
efd31e1d839d4665462b5c267a1c654548082663Trang Do smbios_hdl_t *shp;
efd31e1d839d4665462b5c267a1c654548082663Trang Do
efd31e1d839d4665462b5c267a1c654548082663Trang Do shp = topo_mod_smbios(mod);
efd31e1d839d4665462b5c267a1c654548082663Trang Do if (shp == NULL) {
efd31e1d839d4665462b5c267a1c654548082663Trang Do stype->count = 0;
efd31e1d839d4665462b5c267a1c654548082663Trang Do return;
efd31e1d839d4665462b5c267a1c654548082663Trang Do }
efd31e1d839d4665462b5c267a1c654548082663Trang Do
efd31e1d839d4665462b5c267a1c654548082663Trang Do nstructs = shp->sh_nstructs;
efd31e1d839d4665462b5c267a1c654548082663Trang Do sp = shp->sh_structs;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier for (i = 0, cnt = 0; i < nstructs; i++, sp++) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (sp->smbst_hdr->smbh_type == stype->type) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier stype->ids[cnt].node = NULL;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier stype->ids[cnt].id = sp->smbst_hdr->smbh_hdl;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier cnt++;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier stype->count = cnt;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier/*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Calculate the authority information for a node. Inherit the data if
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * possible, but always create an appropriate property group.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierint
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierx86pi_set_auth(topo_mod_t *mod, x86pi_hcfmri_t *hcfmri, tnode_t *t_parent,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier tnode_t *t_node)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int result;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int err;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int is_chassis = 0;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int chassis_instance = 0;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier nvlist_t *auth;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier char *val = NULL;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier char *prod = NULL;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier char *psn = NULL;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier char *csn = NULL;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier char *server = NULL;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier char *f = "x86pi_set_auth";
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (mod == NULL || t_parent == NULL || t_node == NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (-1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = topo_pgroup_create(t_node, &auth_pgroup, &err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result != 0 && err != ETOPO_PROP_DEFD) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * We failed to create the property group and it was not
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * already defined. Set the err code and return failure.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
d3c57c1ff7b2283ae807ba89d11852243b4e7c4bTom Pothier (void) topo_mod_seterrno(mod, err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (-1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* Get the authority information already available from the parent */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier auth = topo_mod_auth(mod, t_parent);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* Determnine if this is a chassis node and set it's instance */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if ((strlen(hcfmri->hc_name) == strlen(CHASSIS)) &&
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier strncmp(hcfmri->hc_name, CHASSIS, strlen(CHASSIS)) == 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier is_chassis = 1;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier chassis_instance = hcfmri->instance;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Set the authority data, inheriting it if possible, but creating it
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * if necessary.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* product-id */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = topo_prop_inherit(t_node, FM_FMRI_AUTHORITY,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier FM_FMRI_AUTH_PRODUCT, &err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result != 0 && err != ETOPO_PROP_DEFD) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = nvlist_lookup_string(auth, FM_FMRI_AUTH_PRODUCT,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier &prod);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result != 0 || prod == NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * No product information in the parent node or auth
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * list. Use the product information in the hcfrmi
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * struct.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier prod = (char *)hcfmri->product;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (prod == NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s: product name not "
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "found for %s node\n", f, hcfmri->hc_name);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * We continue even if the product information is not available
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * to enumerate as much as possible.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (prod != NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = topo_prop_set_string(t_node, FM_FMRI_AUTHORITY,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier FM_FMRI_AUTH_PRODUCT, TOPO_PROP_IMMUTABLE, prod,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier &err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result != 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* Preserve the error and continue */
d3c57c1ff7b2283ae807ba89d11852243b4e7c4bTom Pothier (void) topo_mod_seterrno(mod, err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s: failed to set "
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "property %s (%d) : %s\n", f,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier FM_FMRI_AUTH_PRODUCT, err,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_strerror(err));
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* product-sn */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = topo_prop_inherit(t_node, FM_FMRI_AUTHORITY,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier FM_FMRI_AUTH_PRODUCT_SN, &err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result != 0 && err != ETOPO_PROP_DEFD) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = nvlist_lookup_string(auth, FM_FMRI_AUTH_PRODUCT_SN,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier &psn);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result != 0 || psn == NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * No product-sn information in the parent node or auth
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * list.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s: psn not found\n", f);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier } else {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * We continue even if the product-sn information is
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * not available to enumerate as much as possible.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = topo_prop_set_string(t_node, FM_FMRI_AUTHORITY,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier FM_FMRI_AUTH_PRODUCT_SN, TOPO_PROP_IMMUTABLE, psn,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier &err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result != 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* Preserve the error and continue */
d3c57c1ff7b2283ae807ba89d11852243b4e7c4bTom Pothier (void) topo_mod_seterrno(mod, err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s: failed to "
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "set property %s (%d) : %s\n", f,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier FM_FMRI_AUTH_PRODUCT_SN, err,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_strerror(err));
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* chassis-id */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (is_chassis == 0 || (is_chassis == 1 && chassis_instance == 0)) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* either not a chassis node, or chassis #0 */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = topo_prop_inherit(t_node, FM_FMRI_AUTHORITY,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier FM_FMRI_AUTH_CHASSIS, &err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier } else {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* chassis 'n' in a >1 chassis system */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = err = -1;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result != 0 && err != ETOPO_PROP_DEFD) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (is_chassis == 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = nvlist_lookup_string(auth,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier FM_FMRI_AUTH_CHASSIS, &csn);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result != 0 || csn == NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * No chassis information in the parent
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * node or auth list.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "%s: csn name not found\n", f);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier } else {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * So as not to blindly set the chassis-id to
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * chassis #0's serial number.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier csn = val = topo_mod_strdup(mod, hcfmri->serial_number);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * We continue even if the chassis information is not available
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * to enumerate as much as possible.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (csn != NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (is_chassis == 1)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = topo_prop_set_string(t_node,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier FM_FMRI_AUTHORITY, FM_FMRI_AUTH_CHASSIS,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier TOPO_PROP_MUTABLE, csn, &err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier else
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = topo_prop_set_string(t_node,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier FM_FMRI_AUTHORITY, FM_FMRI_AUTH_CHASSIS,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier TOPO_PROP_IMMUTABLE, csn, &err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result != 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* Preserve the error and continue */
d3c57c1ff7b2283ae807ba89d11852243b4e7c4bTom Pothier (void) topo_mod_seterrno(mod, err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s: failed to "
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "set property %s (%d) : %s\n", f,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier FM_FMRI_AUTH_CHASSIS, err,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_strerror(err));
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (val != NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_strfree(mod, val);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier val = NULL;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* server-id */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = topo_prop_inherit(t_node, FM_FMRI_AUTHORITY,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier FM_FMRI_AUTH_SERVER, &err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result != 0 && err != ETOPO_PROP_DEFD) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = nvlist_lookup_string(auth, FM_FMRI_AUTH_SERVER,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier &server);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result != 0 || server == NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * No server information in the parent node or auth
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * list. Find the server information in hostname.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier server = val = x86pi_get_serverid(mod);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (server == NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s: server "
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "name not found for %s node\n", f,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier hcfmri->hc_name);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * We continue even if the server information is not available
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * to enumerate as much as possible.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (server != NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = topo_prop_set_string(t_node, FM_FMRI_AUTHORITY,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier FM_FMRI_AUTH_SERVER, TOPO_PROP_IMMUTABLE, server,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier &err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result != 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* Preserve the error and continue */
d3c57c1ff7b2283ae807ba89d11852243b4e7c4bTom Pothier (void) topo_mod_seterrno(mod, err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s: failed to "
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "set property %s (%d) : %s\n", f,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier FM_FMRI_AUTH_SERVER, err,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_strerror(err));
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (val != NULL)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_strfree(mod, val);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier nvlist_free(auth);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (0);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier/*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Calculate a generic FRU for the given node. If the node is not a FRU,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * then inherit the FRU data from the nodes parent.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierint
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierx86pi_set_frufmri(topo_mod_t *mod, x86pi_hcfmri_t *hcfmri, tnode_t *t_parent,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier tnode_t *t_node, int flag)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int result;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int err;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier nvlist_t *auth = NULL;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier nvlist_t *frufmri = NULL;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (t_node == NULL || mod == NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (-1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Determine if this node is a FRU
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (!(flag & X86PI_ENUM_FRU)) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* This node is not a FRU. Inherit from parent and return */
d3c57c1ff7b2283ae807ba89d11852243b4e7c4bTom Pothier (void) topo_node_fru_set(t_node, NULL, 0, &result);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (0);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * This node is a FRU. Create an FMRI.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier auth = topo_mod_auth(mod, t_parent);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier frufmri = topo_mod_hcfmri(mod, t_parent, FM_HC_SCHEME_VERSION,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier hcfmri->hc_name, hcfmri->instance, NULL, auth,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier hcfmri->part_number, hcfmri->version, hcfmri->serial_number);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (frufmri == NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "failed to create FRU: %s\n",
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_strerror(topo_mod_errno(mod)));
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier nvlist_free(auth);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* Set the FRU, whether NULL or not */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = topo_node_fru_set(t_node, frufmri, 0, &err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result != 0) {
d3c57c1ff7b2283ae807ba89d11852243b4e7c4bTom Pothier (void) topo_mod_seterrno(mod, err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier nvlist_free(frufmri);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (result);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier/*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Set the label for a topo node.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierint
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierx86pi_set_label(topo_mod_t *mod, const char *label, const char *name,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier tnode_t *t_node)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int result;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int err;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (mod == NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (-1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Set the label for this topology node.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Note that a NULL label will inherit the label from topology
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * node's parent.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = topo_node_label_set(t_node, (char *)label, &err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result != 0) {
d3c57c1ff7b2283ae807ba89d11852243b4e7c4bTom Pothier (void) topo_mod_seterrno(mod, err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "x86pi_set_label: failed with label %s "
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "on %s node: %s\n", (label == NULL ? "NULL" : label),
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier name, topo_strerror(err));
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (result);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier/*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Calculate the system information for a node. Inherit the data if
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * possible, but always create an appropriate property group.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierint
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierx86pi_set_system(topo_mod_t *mod, tnode_t *t_node)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int result;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int err;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier struct utsname uts;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier char isa[MAXNAMELEN];
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (mod == NULL || t_node == NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (-1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = topo_pgroup_create(t_node, &sys_pgroup, &err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result != 0 && err != ETOPO_PROP_DEFD) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * We failed to create the property group and it was not
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * already defined. Set the err code and return failure.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
d3c57c1ff7b2283ae807ba89d11852243b4e7c4bTom Pothier (void) topo_mod_seterrno(mod, err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (-1);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = topo_prop_inherit(t_node, TOPO_PGROUP_SYSTEM, TOPO_PROP_ISA,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier &err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result != 0 && err != ETOPO_PROP_DEFD) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier isa[0] = '\0';
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = sysinfo(SI_ARCHITECTURE, isa, sizeof (isa));
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result == -1) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* Preserve the error and continue */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "x86pi_set_system: failed to "
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "read SI_ARCHITECTURE: %d\n", errno);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (strnlen(isa, MAXNAMELEN) > 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = topo_prop_set_string(t_node,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier TOPO_PGROUP_SYSTEM, TOPO_PROP_ISA,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier TOPO_PROP_IMMUTABLE, isa, &err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result != 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* Preserve the error and continue */
d3c57c1ff7b2283ae807ba89d11852243b4e7c4bTom Pothier (void) topo_mod_seterrno(mod, err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "x86pi_set_auth: failed to "
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "set property %s (%d) : %s\n",
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier TOPO_PROP_ISA, err, topo_strerror(err));
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = topo_prop_inherit(t_node, TOPO_PGROUP_SYSTEM,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier TOPO_PROP_MACHINE, &err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result != 0 && err != ETOPO_PROP_DEFD) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = uname(&uts);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result == -1) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* Preserve the error and continue */
d3c57c1ff7b2283ae807ba89d11852243b4e7c4bTom Pothier (void) topo_mod_seterrno(mod, errno);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "x86pi_set_system: failed to "
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "read uname: %d\n", errno);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (strnlen(uts.machine, sizeof (uts.machine)) > 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier result = topo_prop_set_string(t_node,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier TOPO_PGROUP_SYSTEM, TOPO_PROP_MACHINE,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier TOPO_PROP_IMMUTABLE, uts.machine, &err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (result != 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* Preserve the error and continue */
d3c57c1ff7b2283ae807ba89d11852243b4e7c4bTom Pothier (void) topo_mod_seterrno(mod, err);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "x86pi_set_auth: failed to "
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier "set property %s (%d) : %s\n",
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier TOPO_PROP_MACHINE, err, topo_strerror(err));
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (0);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier/*
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * All the checks for compatibility are done within the kernel where the
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * ereport generators are. They'll determine first if there's a problem
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * and the topo enum will follow suit. The /dev/fm ioclt returns the value
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * of the x86gentopo_legacy kernel variable which determines if this platform
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * will provide an x86 generic topo or legacy topo enumeration.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier/* ARGSUSED */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierint
efd31e1d839d4665462b5c267a1c654548082663Trang Dox86pi_check_comp(topo_mod_t *mod)
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier{
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int rv;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int fd;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier int32_t legacy;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier nvlist_t *nvl = NULL;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier fm_ioc_data_t fid;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier char *ibuf = NULL, *obuf = NULL;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier size_t insz = 0, outsz = 0;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier char *f = "x86pi_check_comp";
efd31e1d839d4665462b5c267a1c654548082663Trang Do smbios_hdl_t *shp;
efd31e1d839d4665462b5c267a1c654548082663Trang Do
efd31e1d839d4665462b5c267a1c654548082663Trang Do shp = topo_mod_smbios(mod);
efd31e1d839d4665462b5c267a1c654548082663Trang Do if (shp == NULL)
efd31e1d839d4665462b5c267a1c654548082663Trang Do return (X86PI_NONE);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* open /dev/fm */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier fd = open("/dev/fm", O_RDONLY);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (fd < 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s: failed to open /dev/fm.\n", f);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (X86PI_NONE);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* set up buffers and ioctl data structure */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier outsz = FM_IOC_MAXBUFSZ;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier obuf = topo_mod_alloc(mod, outsz);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (obuf == NULL) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier perror("umem_alloc");
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (X86PI_NONE);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier fid.fid_version = 1;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier fid.fid_insz = insz;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier fid.fid_inbuf = ibuf;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier fid.fid_outsz = outsz;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier fid.fid_outbuf = obuf;
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* send the ioctl to /dev/fm to retrieve legacy variable */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier rv = ioctl(fd, FM_IOC_GENTOPO_LEGACY, &fid);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (rv < 0) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_dprintf(mod, "%s: ioctl to /dev/fm failed", f);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier perror("fm_ioctl");
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier (void) close(fd);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (X86PI_NONE);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier (void) close(fd);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier (void) nvlist_unpack(fid.fid_outbuf, fid.fid_outsz, &nvl, 0);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier (void) nvlist_lookup_int32(nvl, FM_GENTOPO_LEGACY, &legacy);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier nvlist_free(nvl);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier topo_mod_free(mod, obuf, outsz);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier if (legacy == 1) {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* legacy kernel variable set; will do the same */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (X86PI_NONE);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier }
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier /* legacy kernel variable not set; generic topo enum */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier return (X86PI_FULL);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier}
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierconst char *
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierx86pi_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}
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier/*
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier * Return Bus/Dev/Func from "reg" devinfo property.
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier */
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothieruint16_t
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothierx86pi_bdf(topo_mod_t *mod, di_node_t node)
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier{
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier int *val;
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier if (di_prop_lookup_ints(DDI_DEV_T_ANY, node, "reg", &val) < 0) {
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier topo_mod_dprintf(mod, "couldn't get \"reg\" prop: %s.\n",
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier strerror(errno));
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier return ((uint16_t)-1);
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier }
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier return (uint16_t)((*val & PCI_REG_BDFR_M) >> PCI_REG_FUNC_SHIFT);
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier}
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier/*
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier * Return PHY from "sata-phy" devinfo proporty.
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier */
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothierint
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothierx86pi_phy(topo_mod_t *mod, di_node_t node)
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier{
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier int *phy;
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier if (di_prop_lookup_ints(DDI_DEV_T_ANY, node, "sata-phy", &phy) < 0) {
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier topo_mod_dprintf(mod, "couldn't get \"sata-phy\" prop: %s.\n",
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier strerror(errno));
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier return (-1);
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier }
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier return (*phy);
03f9f63d24f0494b7d47b927090ad9045e396402Tom Pothier}