summaryrefslogtreecommitdiff
path: root/usr/src/common/smbios
diff options
context:
space:
mode:
authorRobert Mustacchi <rm@joyent.com>2019-02-11 19:51:43 +0000
committerRobert Mustacchi <rm@joyent.com>2019-07-09 13:33:41 +0000
commit1566bc3431383e39ac9bc7fb7f00feff9c06acda (patch)
treeb97efc285d2be15904b95595aaf0eda164270bfe /usr/src/common/smbios
parent6f2b04a2ce785423fe988216ae694366499884b2 (diff)
downloadillumos-joyent-1566bc3431383e39ac9bc7fb7f00feff9c06acda.tar.gz
10395 Add support for SMBIOS 3.2
10396 Want libjedec 10397 Check for SMBIOS table with higher version 10398 smbios slot version check is broken for smbios 3.x 10399 smbios CPU Cache extended size not correctly calculated 10400 smbios(1M) slot printing could be clearer Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com> Reviewed by: Jordan Hendricks <jordan.hendricks@joyent.com> Reviewed by: C Fraire <cfraire@me.com> Approved by: Richard Lowe <richlowe@richlowe.net>
Diffstat (limited to 'usr/src/common/smbios')
-rw-r--r--usr/src/common/smbios/mktables.sh9
-rw-r--r--usr/src/common/smbios/smb_info.c101
-rw-r--r--usr/src/common/smbios/smb_open.c3
3 files changed, 103 insertions, 10 deletions
diff --git a/usr/src/common/smbios/mktables.sh b/usr/src/common/smbios/mktables.sh
index 969c329b25..cd711f6474 100644
--- a/usr/src/common/smbios/mktables.sh
+++ b/usr/src/common/smbios/mktables.sh
@@ -22,7 +22,7 @@
#
#
# Copyright 2015 OmniTI Computer Consulting, Inc. All rights reserved.
-# Copyright (c) 2017, Joyent, Inc.
+# Copyright (c) 2018, Joyent, Inc.
# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
@@ -49,9 +49,10 @@ SMB_CAF_ smbios_cache_flag_name uint_t
SMB_EVFL_ smbios_evlog_flag_name uint_t
SMB_IPMI_F_ smbios_ipmi_flag_name uint_t
SMB_POWERSUP_F_ smbios_powersup_flag_name uint_t
+SMB_MOMC_ smbios_memdevice_op_capab_name uint_t
SMB_MDF_ smbios_memdevice_flag_name uint_t
SMB_PRC_ smbios_processor_core_flag_name uint_t
-SMB_TYPE_ smbios_type_name uint_t
+SMB_TYPE_ smbios_type_name uint_t
SMB_SLCH1_ smbios_slot_ch1_name uint_t
SMB_SLCH2_ smbios_slot_ch2_name uint_t
'
@@ -93,6 +94,8 @@ SMB_MDF_ smbios_memdevice_flag_desc uint_t
SMB_MDFF_ smbios_memdevice_form_desc uint_t
SMB_MDT_ smbios_memdevice_type_desc uint_t
SMB_MDR_ smbios_memdevice_rank_desc uint_t
+SMB_MTECH_ smbios_memdevice_memtech_desc uint_t
+SMB_MOMC_ smbios_memdevice_op_capab_desc uint_t
SMB_OBT_ smbios_onboard_type_desc uint_t
SMB_POC_ smbios_port_conn_desc uint_t
SMB_POT_ smbios_port_type_desc uint_t
@@ -109,7 +112,7 @@ SMB_SLU_ smbios_slot_usage_desc uint_t
SMB_SLW_ smbios_slot_width_desc uint_t
SMB_TPROBE_L_ smbios_tprobe_loc_desc uint_t
SMB_TPROBE_S_ smbios_tprobe_status_desc uint_t
-SMB_TYPE_ smbios_type_desc uint_t
+SMB_TYPE_ smbios_type_desc uint_t
SMB_VPROBE_L_ smbios_vprobe_loc_desc uint_t
SMB_VPROBE_S_ smbios_vprobe_status_desc uint_t
SMB_WAKEUP_ smbios_system_wakeup_desc uint_t
diff --git a/usr/src/common/smbios/smb_info.c b/usr/src/common/smbios/smb_info.c
index eb39095bde..2c67f2964a 100644
--- a/usr/src/common/smbios/smb_info.c
+++ b/usr/src/common/smbios/smb_info.c
@@ -67,6 +67,7 @@
#include <sys/smbios_impl.h>
#include <sys/byteorder.h>
+#include <sys/debug.h>
#ifdef _KERNEL
#include <sys/sunddi.h>
@@ -603,12 +604,14 @@ smbios_info_cache(smbios_hdl_t *shp, id_t id, smbios_cache_t *cap)
cap->smba_flags |= SMB_CAF_SOCKETED;
if (smb_libgteq(shp, SMB_VERSION_31)) {
- if (smb_gteq(shp, SMB_VERSION_31)) {
- cap->smba_maxsize2 =
- SMB_CACHE_EXT_SIZE(c.smbca_maxsize2);
- cap->smba_size2 = SMB_CACHE_EXT_SIZE(c.smbca_size2);
- } else {
+ cap->smba_maxsize2 = SMB_CACHE_EXT_SIZE(c.smbca_maxsize2);
+ cap->smba_size2 = SMB_CACHE_EXT_SIZE(c.smbca_size2);
+
+ if (cap->smba_maxsize2 == 0) {
cap->smba_maxsize2 = cap->smba_maxsize;
+ }
+
+ if (cap->smba_size2 == 0) {
cap->smba_size2 = cap->smba_size;
}
}
@@ -654,7 +657,7 @@ smbios_info_slot(smbios_hdl_t *shp, id_t id, smbios_slot_t *sp)
return (smb_set_errno(shp, ESMB_TYPE));
smb_info_bcopy(stp->smbst_hdr, &s, sizeof (s));
- bzero(sp, sizeof (smbios_slot_t));
+ bzero(sp, sizeof (smb_base_slot_t));
sp->smbl_name = smb_strptr(stp, s.smbsl_name);
sp->smbl_type = s.smbsl_type;
@@ -668,6 +671,77 @@ smbios_info_slot(smbios_hdl_t *shp, id_t id, smbios_slot_t *sp)
sp->smbl_bus = s.smbsl_bus;
sp->smbl_df = s.smbsl_df;
+ if (smb_libgteq(shp, SMB_VERSION_32)) {
+ sp->smbl_dbw = s.smbsl_dbw;
+ sp->smbl_npeers = s.smbsl_npeers;
+ }
+
+ return (0);
+}
+
+void
+smbios_info_slot_peers_free(smbios_hdl_t *shp, uint_t npeers,
+ smbios_slot_peer_t *peer)
+{
+ size_t sz = npeers * sizeof (smbios_slot_peer_t);
+
+ if (npeers == 0) {
+ ASSERT3P(peer, ==, NULL);
+ return;
+ }
+
+ smb_free(peer, sz);
+}
+
+int
+smbios_info_slot_peers(smbios_hdl_t *shp, id_t id, uint_t *npeers,
+ smbios_slot_peer_t **peerp)
+{
+ const smb_struct_t *stp = smb_lookup_id(shp, id);
+ const smb_slot_t *slotp = (const smb_slot_t *)stp->smbst_hdr;
+ smbios_slot_peer_t *peer;
+ size_t minlen;
+ uint_t i;
+
+ if (stp == NULL)
+ return (-1); /* errno is set for us */
+
+ if (stp->smbst_hdr->smbh_type != SMB_TYPE_SLOT)
+ return (smb_set_errno(shp, ESMB_TYPE));
+
+ if (stp->smbst_hdr->smbh_len <= offsetof(smb_slot_t, smbsl_npeers) ||
+ slotp->smbsl_npeers == 0) {
+ *npeers = 0;
+ *peerp = NULL;
+ return (0);
+ }
+
+ /*
+ * Make sure that the size of the structure makes sense for the number
+ * of peers reported.
+ */
+ minlen = slotp->smbsl_npeers * sizeof (smb_slot_peer_t) +
+ offsetof(smb_slot_t, smbsl_npeers);
+ if (stp->smbst_hdr->smbh_len < minlen) {
+ return (smb_set_errno(shp, ESMB_SHORT));
+ }
+
+ if ((peer = smb_alloc(slotp->smbsl_npeers *
+ sizeof (smbios_slot_peer_t))) == NULL) {
+ return (smb_set_errno(shp, ESMB_NOMEM));
+ }
+
+ for (i = 0; i < slotp->smbsl_npeers; i++) {
+ peer[i].smblp_group = slotp->smbsl_peers[i].smbspb_group_no;
+ peer[i].smblp_bus = slotp->smbsl_peers[i].smbspb_bus;
+ peer[i].smblp_device = slotp->smbsl_peers[i].smbspb_df >> 3;
+ peer[i].smblp_function = slotp->smbsl_peers[i].smbspb_df & 0x7;
+ peer[i].smblp_data_width = slotp->smbsl_peers[i].smbspb_width;
+ }
+
+ *npeers = slotp->smbsl_npeers;
+ *peerp = peer;
+
return (0);
}
@@ -923,6 +997,21 @@ smbios_info_memdevice(smbios_hdl_t *shp, id_t id, smbios_memdevice_t *mdp)
mdp->smbmd_confvolt = m.smbmdev_confvolt;
}
+ if (smb_libgteq(shp, SMB_VERSION_32)) {
+ mdp->smbmd_memtech = m.smbmdev_memtech;
+ mdp->smbmd_opcap_flags = m.smbmdev_opmode;
+ mdp->smbmd_firmware_rev = smb_strptr(stp,
+ m.smbmdev_fwver);
+ mdp->smbmd_modmfg_id = m.smbmdev_modulemfgid;
+ mdp->smbmd_modprod_id = m.smbmdev_moduleprodid;
+ mdp->smbmd_cntrlmfg_id = m.smbmdev_memsysmfgid;
+ mdp->smbmd_cntrlprod_id = m.smbmdev_memsysprodid;
+ mdp->smbmd_nvsize = m.smbmdev_nvsize;
+ mdp->smbmd_volatile_size = m.smbmdev_volsize;
+ mdp->smbmd_cache_size = m.smbmdev_cachesize;
+ mdp->smbmd_logical_size = m.smbmdev_logicalsize;
+ }
+
return (0);
}
diff --git a/usr/src/common/smbios/smb_open.c b/usr/src/common/smbios/smb_open.c
index 36472b491d..a81294592d 100644
--- a/usr/src/common/smbios/smb_open.c
+++ b/usr/src/common/smbios/smb_open.c
@@ -21,7 +21,7 @@
/*
* Copyright 2015 OmniTI Computer Consulting, Inc. All rights reserved.
- * Copyright 2016 Joyent, Inc.
+ * Copyright 2018 Joyent, Inc.
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -229,6 +229,7 @@ smbios_bufopen(const smbios_entry_t *ep, const void *buf, size_t len,
case SMB_VERSION_28:
case SMB_VERSION_30:
case SMB_VERSION_31:
+ case SMB_VERSION_32:
break;
default:
return (smb_open_error(shp, errp, ESMB_VERSION));