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