176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ----------------------------------------------------------------------- * 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Pportions of this file taken from the dmidecode project 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright (C) 2000-2002 Alan Cox <alan@redhat.com> 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright (C) 2002-2008 Jean Delvare <khali@linux-fr.org> 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This program is free software; you can redistribute it and/or modify 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * it under the terms of the GNU General Public License as published by 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the Free Software Foundation; either version 2 of the License, or 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * (at your option) any later version. 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This program is distributed in the hope that it will be useful, 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * but WITHOUT ANY WARRANTY; without even the implied warranty of 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * GNU General Public License for more details. 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * You should have received a copy of the GNU General Public License 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * along with this program; if not, write to the Free Software 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * For the avoidance of doubt the "preferred form" of this code is one which 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * is in an open unpatent encumbered format. Where cryptographic key signing 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * forms part of the process of creating an executable the information 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * including keys needed to generate an equivalently functional executable 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * are deemed to be part of the source code. 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <dmi/dmi.h> 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdio.h> 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid dmi_memory_array_error_handle(uint16_t code, char *array) 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code == 0xFFFE) 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(array, "%s", "Not Provided"); 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (code == 0xFFFF) 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(array, "%s", "No Error"); 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(array, "0x%04X", code); 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid dmi_memory_device_width(uint16_t code, char *width) 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 3.3.18 Memory Device (Type 17) 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * If no memory module is present, width may be 0 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code == 0xFFFF || code == 0) 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(width, "%s", "Unknown"); 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(width, "%u bits", code); 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid dmi_memory_device_size(uint16_t code, char *size) 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code == 0) 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(size, "%s", "Free"); 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (code == 0xFFFF) 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(size, "%s", "Unknown"); 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code & 0x8000) 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(size, "%u kB", code & 0x7FFF); 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(size, "%u MB", code); 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanconst char *dmi_memory_device_form_factor(uint8_t code) 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* 3.3.18.1 */ 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman static const char *form_factor[] = { 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Other", /* 0x01 */ 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Unknown", 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "SIMM", 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "SIP", 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Chip", 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "DIP", 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "ZIP", 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Proprietary Card", 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "DIMM", 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "TSOP", 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Row Of Chips", 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "RIMM", 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "SODIMM", 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "SRIMM", 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "FB-DIMM" /* 0x0F */ 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code >= 0x01 && code <= 0x0F) 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return form_factor[code - 0x01]; 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return out_of_spec; 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid dmi_memory_device_set(uint8_t code, char *set) 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code == 0) 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(set, "%s", "None"); 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (code == 0xFF) 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(set, "%s", "Unknown"); 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(set, "%u", code); 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanconst char *dmi_memory_device_type(uint8_t code) 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* 3.3.18.2 */ 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman static const char *type[] = { 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Other", /* 0x01 */ 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Unknown", 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "DRAM", 11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "EDRAM", 11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "VRAM", 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "SRAM", 11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "RAM", 11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "ROM", 11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Flash", 11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "EEPROM", 11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "FEPROM", 11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "EPROM", 12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "CDRAM", 12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "3DRAM", 12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "SDRAM", 12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "SGRAM", 12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "RDRAM", 12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "DDR", 12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "DDR2", 12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "DDR2 FB-DIMM", /* 0x14 */ 12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NULL, 12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NULL, 13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NULL, 13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "DDR3", /* 0x18 */ 13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "FBD2" /* 0x19 */ 13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code >= 0x01 && code <= 0x19) 13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return type[code - 0x01]; 13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return out_of_spec; 13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid dmi_memory_device_type_detail(uint16_t code, char *type_detail, int sizeof_type_detail) 14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* 3.3.18.3 */ 14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman static const char *detail[] = { 14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Other", /* 1 */ 14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Unknown", 14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Fast-paged", 14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Static Column", 14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Pseudo-static", 14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "RAMBus", 15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Synchronous", 15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "CMOS", 15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "EDO", 15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Window DRAM", 15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Cache DRAM", 15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Non-Volatile" /* 12 */ 15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ((code & 0x1FFE) == 0) 15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(type_detail, "%s", "None"); 16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int i; 16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 1; i <= 12; i++) 16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code & (1 << i)) 16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman snprintf(type_detail, sizeof_type_detail, "%s", detail[i - 1]); 16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid dmi_memory_device_speed(uint16_t code, char *speed) 17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code == 0) 17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(speed, "%s", "Unknown"); 17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(speed, "%u MHz", code); 17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 3.3.7 Memory Module Information (Type 6) 17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid dmi_memory_module_types(uint16_t code, const char *sep, char *type, int sizeof_type) 18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* 3.3.7.1 */ 18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman static const char *types[] = { 18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Other", /* 0 */ 18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Unknown", 18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Standard", 18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "FPM", 18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "EDO", 19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Parity", 19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "ECC", 19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "SIMM", 19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "DIMM", 19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Burst EDO", 19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "SDRAM" /* 10 */ 19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ((code & 0x07FF) == 0) 19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(type, "%s", "None"); 20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int i; 20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 0; i <= 10; i++) 20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code & (1 << i)) 20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman snprintf(type, sizeof_type, "%s%s%s", type, sep, types[i]); 20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid dmi_memory_module_connections(uint8_t code, char *connection, int sizeof_connection) 21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code == 0xFF) 21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(connection, "%s", "None"); 21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ((code & 0xF0) != 0xF0) 21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(connection, "%u ", code >> 4); 21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ((code & 0x0F) != 0x0F) 21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman snprintf(connection, sizeof_connection, "%s%u", connection, code & 0x0F); 21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid dmi_memory_module_speed(uint8_t code, char *speed) 22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code == 0) 22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(speed, "%s", "Unknown"); 22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(speed, "%u ns", code); 22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid dmi_memory_module_size(uint8_t code, char *size, int sizeof_size) 23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* 3.3.7.2 */ 23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (code & 0x7F) { 23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 0x7D: 23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(size, "%s", "Not Determinable"); 23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 0x7E: 23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(size, "%s", "Disabled"); 23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 0x7F: 24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(size, "%s", "Not Installed"); 24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: 24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(size, "%u MB", 1 << (code & 0x7F)); 24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code & 0x80) 24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman snprintf(size, sizeof_size, "%s %s", size, "(Double-bank Connection)"); 24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman snprintf(size, sizeof_size, "%s %s", size, "(Single-bank Connection)"); 25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid dmi_memory_module_error(uint8_t code, const char *prefix, char *error) 25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code & (1 << 2)) 25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(error, "%s", "See Event Log\n"); 25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ((code & 0x03) == 0) 25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(error, "%s", "OK\n"); 25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code & (1 << 0)) 26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(error, "%sUncorrectable Errors\n", prefix); 26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code & (1 << 1)) 26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(error, "%sCorrectable Errors\n", prefix); 26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 265