/* * Use the SMBIOS info to determine if the system has an IPMI. */ static int get_smbios_ipmi_info(void) { smbios_ipmi_t ipmi; if (ksmbios == NULL || smbios_info_ipmi(ksmbios, &ipmi) == SMB_ERR) return (DDI_FAILURE); cmn_err(CE_CONT, "!SMBIOS type 0x%x, addr 0x%llx", ipmi.smbip_type, (long long unsigned int)(ipmi.smbip_addr)); /* * Some systems have a bios that will report an IPMI device even when * it is not installed. In this case we see 0x0 as the base address. * If we see this address, assume the device is not really present. */ if (ipmi.smbip_addr == NULL) { cmn_err(CE_WARN, "!SMBIOS: Invalid base address"); return (DDI_FAILURE); } sc->ipmi_io_type = ipmi.smbip_type; switch (ipmi.smbip_type) { case SMB_IPMI_T_KCS: case SMB_IPMI_T_SMIC: sc->ipmi_io_address = ipmi.smbip_addr; sc->ipmi_io_mode = (ipmi.smbip_flags & SMB_IPMI_F_IOADDR) ? 1 : 0; sc->ipmi_io_spacing = ipmi.smbip_regspacing; break; case SMB_IPMI_T_SSIF: if ((ipmi.smbip_addr & 0xffffffffffffff00) != 0) { cmn_err(CE_WARN, "!SMBIOS: Invalid SSIF SMBus address, " "using BMC I2C slave address instead"); sc->ipmi_io_address = ipmi.smbip_i2c; } else { sc->ipmi_io_address = ipmi.smbip_addr; } break; default: return (DDI_FAILURE); } if (ipmi.smbip_intr > 15) { cmn_err(CE_WARN, "!SMBIOS: Non-ISA IRQ %d for IPMI", ipmi.smbip_intr); return (DDI_FAILURE); } sc->ipmi_io_irq = ipmi.smbip_intr; return (DDI_SUCCESS); }
static void print_ipmi(smbios_hdl_t *shp, FILE *fp) { smbios_ipmi_t i; (void) smbios_info_ipmi(shp, &i); desc_printf(smbios_ipmi_type_desc(i.smbip_type), fp, " Type: %u", i.smbip_type); oprintf(fp, " BMC IPMI Version: %u.%u\n", i.smbip_vers.smbv_major, i.smbip_vers.smbv_minor); oprintf(fp, " i2c Bus Slave Address: 0x%x\n", i.smbip_i2c); oprintf(fp, " NV Storage Device Bus ID: 0x%x\n", i.smbip_bus); oprintf(fp, " BMC Base Address: 0x%llx\n", (u_longlong_t)i.smbip_addr); oprintf(fp, " Interrupt Number: %u\n", i.smbip_intr); oprintf(fp, " Register Spacing: %u\n", i.smbip_regspacing); flag_printf(fp, "Flags", i.smbip_flags, sizeof (i.smbip_flags) * NBBY, smbios_ipmi_flag_name, smbios_ipmi_flag_desc); }
/*ARGSUSED*/ int do_prominfo(int opt_v, char *progname, int opt_l, int opt_p) { smbios_hdl_t *shp; smbios_system_t sys; smbios_bios_t bios; smbios_ipmi_t ipmi; smbios_info_t info; topo_hdl_t *thp; char *uuid; const char *s; id_t id; int err; if ((shp = smbios_open(NULL, SMB_VERSION, 0, &err)) == NULL) { (void) fprintf(stderr, gettext("%s: failed to open SMBIOS: %s\n"), progname, smbios_errmsg(err)); return (1); } if ((id = smbios_info_system(shp, &sys)) != SMB_ERR && smbios_info_common(shp, id, &info) != SMB_ERR) { (void) printf(gettext("System Configuration: %s %s\n"), info.smbi_manufacturer, info.smbi_product); } else { (void) fprintf(stderr, gettext("%s: failed to get system info: %s\n"), progname, smbios_errmsg(smbios_errno(shp))); } if (smbios_info_bios(shp, &bios) != SMB_ERR) { (void) printf(gettext("BIOS Configuration: %s %s %s\n"), bios.smbb_vendor, bios.smbb_version, bios.smbb_reldate); } else { (void) fprintf(stderr, gettext("%s: failed to get bios info: %s\n"), progname, smbios_errmsg(smbios_errno(shp))); } if (smbios_info_ipmi(shp, &ipmi) != SMB_ERR) { if ((s = smbios_ipmi_type_desc(ipmi.smbip_type)) == NULL) s = gettext("Unknown"); (void) printf(gettext("BMC Configuration: IPMI %u.%u (%s)\n"), ipmi.smbip_vers.smbv_major, ipmi.smbip_vers.smbv_minor, s); } /* * Silently swallow all libtopo and libpcidb related errors. */ uuid = NULL; if ((thp = topo_open(TOPO_VERSION, NULL, &err)) != NULL) { if ((uuid = topo_snap_hold(thp, NULL, &err)) == NULL) { topo_close(thp); thp = NULL; } } prt_php = pcidb_open(PCIDB_VERSION); (void) printf(gettext( "\n==== Processor Sockets ====================================\n")); (void) printf(gettext("\n%-32s %s"), "Version", "Location Tag"); (void) printf(gettext( "\n-------------------------------- --------------------------\n")); (void) smbios_iter(shp, do_procs, NULL); (void) printf(gettext( "\n==== Memory Device Sockets ================================\n")); (void) printf(gettext("\n%-11s %-6s %-3s %-19s %s"), "Type", "Status", "Set", "Device Locator", "Bank Locator"); (void) printf(gettext( "\n----------- ------ --- ------------------- ----------------\n")); (void) smbios_iter(shp, do_memdevs, NULL); (void) printf(gettext( "\n==== On-Board Devices =====================================\n")); (void) smbios_iter(shp, do_obdevs, NULL); (void) printf(gettext( "\n==== Upgradeable Slots ====================================\n")); (void) printf(gettext("\n%-3s %-9s %-16s %s"), "ID", "Status", "Type", "Description"); (void) printf(gettext( "\n--- --------- ---------------- ----------------------------\n")); (void) smbios_iter(shp, do_slots, thp); smbios_close(shp); topo_hdl_strfree(thp, uuid); if (thp != NULL) { topo_snap_release(thp); topo_close(thp); } pcidb_close(prt_php); return (0); }