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