summaryrefslogtreecommitdiffstats
path: root/memtestEDK/Memtest/SingleComponents/dmi.c
diff options
context:
space:
mode:
Diffstat (limited to 'memtestEDK/Memtest/SingleComponents/dmi.c')
-rw-r--r--memtestEDK/Memtest/SingleComponents/dmi.c439
1 files changed, 0 insertions, 439 deletions
diff --git a/memtestEDK/Memtest/SingleComponents/dmi.c b/memtestEDK/Memtest/SingleComponents/dmi.c
deleted file mode 100644
index 0b1a4e0..0000000
--- a/memtestEDK/Memtest/SingleComponents/dmi.c
+++ /dev/null
@@ -1,439 +0,0 @@
-/* dmi.c using the DMI from SMBIOS to read information about the hardware's
- * memory devices capabilities and where they are mapped into the address space
- *
- * Copyright (c) Joachim Deguara, AMD 2006
- *
- * Release under the GPL version 2
- * ----------------------------------------------------
- * Memtest86+ V4.00 - Added compliance with SMBIOS Spec V2.6.1
- */
-
-
-#include "test.h"
-#include "stdint.h"
-#include "environment.h"
-
-#define round_up(x,y) (((x) + (y) - 1) & ~((y)-1))
-#define round_down(x,y) ((x) & ~((y)-1))
-
-struct dmi_eps {
- uint8_t anchor[4];
- int8_t checksum;
- uint8_t length;
- uint8_t majorversion;
- uint8_t minorversion;
- uint16_t maxstructsize;
- uint8_t revision;
- uint8_t pad[5];
- uint8_t intanchor[5];
- int8_t intchecksum;
- uint16_t tablelength;
- uint32_t tableaddress;
- uint16_t numstructs;
- uint8_t SMBIOSrev;
-} __attribute__((packed));
-
-struct tstruct_header{
- uint8_t type;
- uint8_t length;
- uint16_t handle;
-} __attribute__((packed));
-
-struct system_map {
- struct tstruct_header header;
- uint8_t manufacturer;
- uint8_t productname;
- uint8_t version;
- uint8_t serialnumber;
- uint8_t uuidbytes[16];
- uint8_t wut;
-} __attribute__((packed));
-
-struct cpu_map {
- struct tstruct_header header;
- uint8_t cpu_socket;
- uint8_t cpu_type;
- uint8_t cpu_family;
- uint8_t cpu_manufacturer;
- uint32_t cpu_id;
- uint8_t cpu_version;
- uint8_t cpu_voltage;
- uint16_t ext_clock;
- uint16_t max_speed;
- uint16_t cur_speed;
- uint8_t cpu_status;
- uint8_t cpu_upgrade;
- uint16_t l1_handle;
- uint16_t l2_handle;
- uint16_t l3_handle;
- uint8_t cpu_serial;
- uint8_t cpu_asset_tag;
- uint8_t cpu_part_number;
- uint8_t core_count;
- uint8_t core_enabled;
- uint8_t thread_count;
- uint16_t cpu_specs;
- uint16_t cpu_family_2;
-} __attribute__((packed));
-
-struct mem_dev {
- struct tstruct_header header;
- uint16_t pma_handle;
- uint16_t err_handle;
- uint16_t tot_width;
- uint16_t dat_width;
- uint16_t size;
- uint8_t form;
- uint8_t set;
- uint8_t dev_locator;
- uint8_t bank_locator;
- uint8_t type;
- uint16_t typedetail;
- uint16_t speed;
- uint8_t manufacturer;
- uint8_t serialnum;
- uint8_t asset;
- uint8_t partnum;
- uint8_t attributes;
- uint8_t ext_size;
- uint8_t conf_ram_speed;
- uint8_t min_voltage;
- uint8_t max_votage;
- uint8_t conf_voltage;
-} __attribute__((packed));
-
-struct md_map{
- struct tstruct_header header;
- uint32_t start;
- uint32_t end;
- uint16_t md_handle;
- uint16_t mama_handle;
- uint8_t row_pos;
- uint8_t interl_pos;
- uint8_t interl_depth;
-} __attribute__((packed));
-
-struct pma{
- struct tstruct_header header;
- uint8_t location;
- uint8_t use;
- uint8_t ecc;
- uint32_t capacity;
- uint16_t errhandle;
- uint16_t numdevs;
-} __attribute__((packed));
-
-static char *form_factors[] = {
- "?",
- "Other", "Unknown", "SIMM", "SIP", "Chip", "DIP", "ZIP",
- "Proprietary Card", "DIMM", "TSOP", "Row of chips", "RIMM",
- "SODIMM", "SRIMM", "FB-DIMM", "Die"
-};
-
-
-static char *memory_types[] = {
- "?",
- "Other", "????", "DRAM", "EDRAM", "VRAM", "SRAM", "RAM",
- "ROM", "FLASH", "EEPROM", "FEPROM", "EPROM", "CDRAM", "3DRAM",
- "SDRAM", "SGRAM", "RDRAM", "DDR", "DDR2", "DDR2 FB", "RSVD",
- "RSVD","RSVD","DDR3","FBD2", "DDR4", "LPDDR", "LPDDR2", "LPDDR3",
- "LPDDR4", "LNVD", "HBM", "HBM2", "DDR5", "LPDDR5"
-};
-
-
-struct mem_dev * mem_devs[MAX_DMI_MEMDEVS];
-int mem_devs_count=0;
-struct md_map * md_maps[MAX_DMI_MEMDEVS];
-struct system_map * dmi_system_info;
-struct cpu_map * dmi_cpu_info;
-int md_maps_count=0;
-int dmi_err_cnts[MAX_DMI_MEMDEVS];
-short dmi_initialized=0;
-
-char * get_tstruct_string(struct tstruct_header *header, int n){
- if(n<1)
- return 0;
- char * a = (char *)header + header->length;
- n--;
- do{
- if (!*a)
- n--;
- if (!n && *a)
- return a;
- a++;
- }while (!(*a==0 && *(a-1)==0));
- return 0;
-}
-
-
-int open_dmi(void){
- char *dmi, *dmi_search_start, *dmi_start;
- int found=0;
- struct dmi_eps *eps;
- char *table_start;
- int tstruct_count=0;
- dmi_search_start = (char *)DMI_SEARCH_START;
-
- //find anchor
- for(dmi = dmi_search_start; dmi < dmi_search_start + 0xf0000; dmi +=16){
- if( *dmi == '_' &&
- *(dmi+1) == 'S' &&
- *(dmi+2) == 'M' &&
- *(dmi+3) == '_'){
- found =1;
- break;
- }
- }
- if (!found) {
- return -1;
- }
- dmi_start=dmi;
- eps=(struct dmi_eps *)dmi;
-
- //check checksum
- int8_t checksum=0;
- for (; dmi < dmi_start + eps->length; dmi++)
- checksum += *dmi;
- if (checksum){
- return -1;
- }
-
- //we need at least revision 2.1 of SMBIOS
- if ( eps->majorversion < 2 &&
- eps->minorversion < 1){
- return -1;
- }
-
- table_start=(char *)(MAX_BLOCK_SIZE)eps->tableaddress;
- dmi=table_start;
-//look at all structs
- while(dmi < table_start + eps->tablelength){
- struct tstruct_header *header = (struct tstruct_header *)dmi;
-
- if (header->type == 17)
- mem_devs[mem_devs_count++] = (struct mem_dev *)dmi;
-
- // Mem Dev Map
- if (header->type == 20)
- md_maps[md_maps_count++] = (struct md_map *)dmi;
-
- // MB_SPEC
- if (header->type == 2)
- {
- dmi_system_info = (struct system_map *)dmi;
- }
-
- // CPU_SPEC
- if (header->type == 4)
- {
- dmi_cpu_info = (struct cpu_map *)dmi;
- }
-
- dmi+=header->length;
-
- while( ! (*dmi == 0 && *(dmi+1) == 0 ) )
- dmi++;
- dmi+=2;
-
- if (++tstruct_count > eps->numstructs)
- return -1;
- }
- return 0;
-}
-
-void init_dmi(void){
- int i;
- for(i=0; i < MAX_DMI_MEMDEVS; i++)
- dmi_err_cnts[i]=0;
- open_dmi();
- dmi_initialized=1;
-}
-
-void print_dmi_startup_info(void)
-{
- char *string1;
- char *string2;
- char *string3;
- int dmicol = 78;
- int slenght;
- int sl1, sl2, sl3;
-
- if(!dmi_initialized) { init_dmi(); }
-
- string1 = get_tstruct_string(&dmi_system_info->header,dmi_system_info->manufacturer);
- sl1 = mt86_strlen(string1);
- string2 = get_tstruct_string(&dmi_system_info->header,dmi_system_info->productname);
- sl2 = mt86_strlen(string2);
- string3 = get_tstruct_string(&dmi_cpu_info->header,dmi_cpu_info->cpu_socket);
- sl3 = mt86_strlen(string3);
-
- slenght = sl1 + sl2;
- if(sl3 > 2) { slenght += sl3 + 4; } else { slenght++; }
-
- if(sl1 && sl2)
- {
- //dmicol -= slenght; // right align
- dmicol = 39 - slenght/2; // center align
- cprint(LINE_DMI, dmicol, string1);
- dmicol += sl1 + 1;
- cprint(LINE_DMI, dmicol, string2);
- dmicol += sl2 + 1;
-
- if(sl3 > 2){
- cprint(LINE_DMI, dmicol, "(");
- dmicol++;
- cprint(LINE_DMI, dmicol, string3);
- dmicol += sl3;
- cprint(LINE_DMI, dmicol, ")");
- }
- }
-}
-
-void print_dmi_info(void){
- int i,j,page;
- char * string=0;
-
- if(!dmi_initialized)
- init_dmi();
-
- if (mem_devs_count == 0){
- cprint(POP2_Y+1, POP2_X+2, "No valid DMI Memory Devices info found");
- while (get_key() == 0);
- return;
- }
-
- for(page=1; page <= 1 + (mem_devs_count-1)/8; page++){
- pop2clear();
- cprint(POP2_Y+1, POP2_X+2, "DMI Memory Device Info (page ");
- itoa(string,page);
- cprint(POP2_Y+1, POP2_X+32, string);
- cprint(POP2_Y+1, POP2_X+33, "/");
- itoa(string,1 + (mem_devs_count-1)/8);
- cprint(POP2_Y+1, POP2_X+34, string);
- cprint(POP2_Y+1, POP2_X+35, ")");
-
- cprint(POP2_Y+3, POP2_X+4, "Location Size(MB) Speed(MHz) Type Form");
- cprint(POP2_Y+4, POP2_X+4, "--------------------------------------------------------------");
-
- for(i=8*(page-1); i<mem_devs_count && i<8*page; i++){
- int size_in_mb;
- int yof;
-
- yof = POP2_Y+5+2*(i-8*(page-1));
- cprint(yof, POP2_X+4, get_tstruct_string(&(mem_devs[i]->header), mem_devs[i]->dev_locator));
-
- if (mem_devs[i]->size == 0){
- cprint(yof, POP2_X+4+18, "Empty");
- }else if (mem_devs[i]->size == 0xFFFF){
- cprint(yof, POP2_X+4+18, "Unknown");
- }else if (mem_devs[i]->size == 0x7FFF){
- // SMBIOS 2.7+
- size_in_mb = mem_devs[i]->ext_size;
- itoa(string, size_in_mb);
- cprint(yof, POP2_X+4+18, string);
- }else{
- size_in_mb = 0xFFFF & mem_devs[i]->size;
- if (mem_devs[i]->size & 0x8000)
- size_in_mb <<= 10;
- itoa(string, size_in_mb);
- cprint(yof, POP2_X+4+18, string);
- }
-
- //this is the only field that needs to be SMBIOS 2.3+
- if ( mem_devs[i]->speed &&
- mem_devs[i]->header.length > 21){
- itoa(string, mem_devs[i]->speed);
- cprint(yof, POP2_X+4+27, string);
- }else{
- cprint(yof, POP2_X+4+27, "Unknown");
- }
- cprint(yof, POP2_X+4+37, memory_types[mem_devs[i]->type]);
- cprint(yof, POP2_X+4+44, form_factors[mem_devs[i]->form]);
-
- //print mappings
- int mapped=0,of=0;
- cprint(yof+1, POP2_X+6,"mapped to: ");
- for(j=0; j<md_maps_count; j++)
- {
- if (mem_devs[i]->header.handle != md_maps[j]->md_handle)
- continue;
- if (mapped++){
- cprint(yof+1, POP2_X+17+of, ",");
- of++;
- }
- hprint3(yof+1, POP2_X+17+of, md_maps[j]->start>>22, 4);
- of += 4;
- hprint3(yof+1, POP2_X+17+of, md_maps[j]->start<<10, 8);
- of += 8;
- cprint(yof+1, POP2_X+17+of, "-");
- of++;
- hprint3(yof+1, POP2_X+17+of, md_maps[j]->end>>22, 4);
- of += 4;
- hprint3(yof+1, POP2_X+17+of, ((md_maps[j]->end+1)<<10) - 1, 8);
- of += 8;
- if(md_maps[j]->end == 0) { hprint3(yof+1, POP2_X+17+of-8,0,8); }
- }
- if (!mapped)
- {
- cprint(yof+1, POP2_X+17, "No mapping (Interleaved Device)");
- }
-
- }
-
- wait_keyup();
- while (get_key() == 0);
- }
-}
-
-//return 1 if the list of bad memory devices changes, 0 otherwise, -1 if no mapped
-int add_dmi_err(ulong adr){
- int i,j,found=-1;
-
- if(!dmi_initialized)
- init_dmi();
-
- for(i=0; i < md_maps_count; i++){
- if ( adr < (md_maps[i]->start<<10) ||
- adr > (md_maps[i]->end<<10) )
- continue;
-
- //matching map found, now check find corresponding dev
- for(j=0; j < mem_devs_count; j++){
- if (mem_devs[j]->header.handle != md_maps[i]->md_handle)
- continue;
- if (dmi_err_cnts[j]){
- found=0;
- }else{
- found = dmi_err_cnts[j] = 1;
- }
- }
- }
-
- return found;
-}
-
-void print_dmi_err(void){
- int i,count,of;
- char *string;
-
- scroll();
-
- cprint(vv->msg_line, 0,"Bad Memory Devices: ");
- of=20;
- for ( i=count=0; i < MAX_DMI_MEMDEVS; i++){
- if (!dmi_err_cnts[i])
- continue;
- struct mem_dev *md = mem_devs[i];
- if(count++){
- cprint(vv->msg_line, of, ", ");
- of+=2;
- }
- string=get_tstruct_string((struct tstruct_header *)md,md->dev_locator);
- if (mt86_strlen(string) + of > 80){
- scroll();
- of=7;
- }
- cprint(vv->msg_line, of, string);
- of += mt86_strlen(string);
- }
-}