176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ----------------------------------------------------------------------- * 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright 2009 Pierre-Alexandre Meyer - All Rights Reserved 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Some part borrowed from DMI Decode: 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * (C) 2000-2002 Alan Cox <alan@redhat.com> 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * (C) 2002-2007 Jean Delvare <khali@linux-fr.org> 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This program is free software; you can redistribute it and/or modify 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * it under the terms of the GNU General Public License as published by 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the Free Software Foundation, Inc., 53 Temple Place Ste 330, 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Boston MA 02111-1307, USA; either version 2 of the License, or 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * (at your option) any later version; incorporated herein by reference. 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ----------------------------------------------------------------------- */ 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <dmi/dmi.h> 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <dmi/dmi_cache.h> 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdio.h> 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 3.3.8 Cache Information (Type 7) 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanconst char *dmi_cache_mode(uint8_t code) 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman static const char *mode[] = { 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Write Through", /* 0x00 */ 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Write Back", 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Varies With Memory Address", 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Unknown" /* 0x03 */ 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return mode[code]; 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanconst char *dmi_cache_location(uint8_t code) 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman static const char *location[4] = { 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Internal", /* 0x00 */ 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "External", 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "<OUT OF SPEC", /* 0x02 */ 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Unknown" /* 0x03 */ 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (location[code] != NULL) 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return location[code]; 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return out_of_spec; 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanuint16_t dmi_cache_size(uint16_t code) 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code & 0x8000) 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return (code & 0x7FFF) << 6; /* KB */ 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return code; /* KB */ 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid dmi_cache_types(uint16_t code, const char *sep, char *array) 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* 3.3.8.2 */ 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman static const char *types[] = { 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Other", /* 0 */ 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Unknown", 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Non-burst", 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Burst", 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Pipeline Burst", 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Synchronous", 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Asynchronous" /* 6 */ 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ((code & 0x007F) == 0) 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strcpy(array, "None"); 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int i; 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 0; i <= 6; i++) 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code & (1 << i)) 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sprintf(array, "%s%s", sep, types[i]); 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanconst char *dmi_cache_ec_type(uint8_t code) 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* 3.3.8.3 */ 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman static const char *type[] = { 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Other", /* 0x01 */ 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Unknown", 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "None", 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Parity", 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Single-bit ECC", 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Multi-bit ECC" /* 0x06 */ 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code >= 0x01 && code <= 0x06) 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return type[code - 0x01]; 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return out_of_spec; 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanconst char *dmi_cache_type(uint8_t code) 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* 3.3.8.4 */ 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman static const char *type[] = { 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Other", /* 0x01 */ 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Unknown", 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Instruction", 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Data", 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Unified" /* 0x05 */ 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code >= 0x01 && code <= 0x05) 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return type[code - 0x01]; 11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return out_of_spec; 11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanconst char *dmi_cache_associativity(uint8_t code) 11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* 3.3.8.5 */ 12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman static const char *type[] = { 12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Other", /* 0x01 */ 12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Unknown", 12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Direct Mapped", 12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "2-way Set-associative", 12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "4-way Set-associative", 12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "Fully Associative", 12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "8-way Set-associative", 12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "16-way Set-associative", /* 0x08 */ 12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "12-way Set-associative", 13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "24-way Set-associative", 13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "32-way Set-associative", 13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "48-way Set-associative", 13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "64-way Set-associative" /* 0x0D */ 13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (code >= 0x01 && code <= 0x0D) 13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return type[code - 0x01]; 13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return out_of_spec; 13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 140