Commit 67b2dcc3 authored by Alan Cox's avatar Alan Cox Committed by Linus Torvalds

[PATCH] update dmi support

parent e4192bb6
...@@ -31,7 +31,7 @@ static char * __init dmi_string(struct dmi_header *dm, u8 s) ...@@ -31,7 +31,7 @@ static char * __init dmi_string(struct dmi_header *dm, u8 s)
if(!s) if(!s)
return ""; return "";
s--; s--;
while(s>0) while(s>0 && *bp)
{ {
bp+=strlen(bp); bp+=strlen(bp);
bp++; bp++;
...@@ -50,7 +50,7 @@ static int __init dmi_table(u32 base, int len, int num, void (*decode)(struct dm ...@@ -50,7 +50,7 @@ static int __init dmi_table(u32 base, int len, int num, void (*decode)(struct dm
u8 *buf; u8 *buf;
struct dmi_header *dm; struct dmi_header *dm;
u8 *data; u8 *data;
int i=1; int i=0;
buf = bt_ioremap(base, len); buf = bt_ioremap(base, len);
if(buf==NULL) if(buf==NULL)
...@@ -59,28 +59,23 @@ static int __init dmi_table(u32 base, int len, int num, void (*decode)(struct dm ...@@ -59,28 +59,23 @@ static int __init dmi_table(u32 base, int len, int num, void (*decode)(struct dm
data = buf; data = buf;
/* /*
* Stop when we see al the items the table claimed to have * Stop when we see all the items the table claimed to have
* OR we run off the end of the table (also happens) * OR we run off the end of the table (also happens)
*/ */
while(i<num && (data - buf) < len) while(i<num && data-buf+sizeof(struct dmi_header)<=len)
{ {
dm=(struct dmi_header *)data; dm=(struct dmi_header *)data;
/* /*
* Avoid misparsing crud if the length of the last * We want to know the total length (formated area and strings)
* record is crap * before decoding to make sure we won't run off the table in
* dmi_decode or dmi_string
*/ */
if((data-buf+dm->length) >= len)
break;
decode(dm);
data+=dm->length; data+=dm->length;
/* while(data-buf<len-1 && (data[0] || data[1]))
* Don't go off the end of the data if there is
* stuff looking like string fill past the end
*/
while((data-buf) < len && (*data || data[1]))
data++; data++;
if(data-buf<len-1)
decode(dm);
data+=2; data+=2;
i++; i++;
} }
...@@ -89,11 +84,20 @@ static int __init dmi_table(u32 base, int len, int num, void (*decode)(struct dm ...@@ -89,11 +84,20 @@ static int __init dmi_table(u32 base, int len, int num, void (*decode)(struct dm
} }
inline static int __init dmi_checksum(u8 *buf)
{
u8 sum=0;
int a;
for(a=0; a<15; a++)
sum+=buf[a];
return (sum==0);
}
static int __init dmi_iterate(void (*decode)(struct dmi_header *)) static int __init dmi_iterate(void (*decode)(struct dmi_header *))
{ {
unsigned char buf[20]; u8 buf[15];
long fp=0xE0000L; u32 fp=0xF0000;
fp -= 16;
#ifdef CONFIG_SIMNOW #ifdef CONFIG_SIMNOW
/* /*
...@@ -105,24 +109,30 @@ static int __init dmi_iterate(void (*decode)(struct dmi_header *)) ...@@ -105,24 +109,30 @@ static int __init dmi_iterate(void (*decode)(struct dmi_header *))
while( fp < 0xFFFFF) while( fp < 0xFFFFF)
{ {
fp+=16; isa_memcpy_fromio(buf, fp, 15);
isa_memcpy_fromio(buf, fp, 20); if(memcmp(buf, "_DMI_", 5)==0 && dmi_checksum(buf))
if(memcmp(buf, "_DMI_", 5)==0)
{ {
u16 num=buf[13]<<8|buf[12]; u16 num=buf[13]<<8|buf[12];
u16 len=buf[7]<<8|buf[6]; u16 len=buf[7]<<8|buf[6];
u32 base=buf[11]<<24|buf[10]<<16|buf[9]<<8|buf[8]; u32 base=buf[11]<<24|buf[10]<<16|buf[9]<<8|buf[8];
dmi_printk((KERN_INFO "DMI %d.%d present.\n", /*
buf[14]>>4, buf[14]&0x0F)); * DMI version 0.0 means that the real version is taken from
* the SMBIOS version, which we don't know at this point.
*/
if(buf[14]!=0)
dmi_printk((KERN_INFO "DMI %d.%d present.\n",
buf[14]>>4, buf[14]&0x0F));
else
dmi_printk((KERN_INFO "DMI present.\n"));
dmi_printk((KERN_INFO "%d structures occupying %d bytes.\n", dmi_printk((KERN_INFO "%d structures occupying %d bytes.\n",
buf[13]<<8|buf[12], num, len));
buf[7]<<8|buf[6]));
dmi_printk((KERN_INFO "DMI table at 0x%08X.\n", dmi_printk((KERN_INFO "DMI table at 0x%08X.\n",
buf[11]<<24|buf[10]<<16|buf[9]<<8|buf[8])); base));
if(dmi_table(base,len, num, decode)==0) if(dmi_table(base,len, num, decode)==0)
return 0; return 0;
} }
fp+=16;
} }
return -1; return -1;
} }
...@@ -823,59 +833,43 @@ static __init void dmi_check_blacklist(void) ...@@ -823,59 +833,43 @@ static __init void dmi_check_blacklist(void)
static void __init dmi_decode(struct dmi_header *dm) static void __init dmi_decode(struct dmi_header *dm)
{ {
u8 *data = (u8 *)dm; u8 *data = (u8 *)dm;
char *p;
switch(dm->type) switch(dm->type)
{ {
case 0: case 0:
p=dmi_string(dm,data[4]); dmi_printk(("BIOS Vendor: %s\n",
if(*p) dmi_string(dm, data[4])));
{ dmi_save_ident(dm, DMI_BIOS_VENDOR, 4);
dmi_printk(("BIOS Vendor: %s\n", p)); dmi_printk(("BIOS Version: %s\n",
dmi_save_ident(dm, DMI_BIOS_VENDOR, 4); dmi_string(dm, data[5])));
dmi_printk(("BIOS Version: %s\n", dmi_save_ident(dm, DMI_BIOS_VERSION, 5);
dmi_string(dm, data[5]))); dmi_printk(("BIOS Release: %s\n",
dmi_save_ident(dm, DMI_BIOS_VERSION, 5); dmi_string(dm, data[8])));
dmi_printk(("BIOS Release: %s\n", dmi_save_ident(dm, DMI_BIOS_DATE, 8);
dmi_string(dm, data[8])));
dmi_save_ident(dm, DMI_BIOS_DATE, 8);
}
break; break;
case 1: case 1:
p=dmi_string(dm,data[4]); dmi_printk(("System Vendor: %s\n",
if(*p) dmi_string(dm, data[4])));
{ dmi_save_ident(dm, DMI_SYS_VENDOR, 4);
dmi_printk(("System Vendor: %s.\n",p)); dmi_printk(("Product Name: %s\n",
dmi_save_ident(dm, DMI_SYS_VENDOR, 4); dmi_string(dm, data[5])));
dmi_printk(("Product Name: %s.\n", dmi_save_ident(dm, DMI_PRODUCT_NAME, 5);
dmi_string(dm, data[5]))); dmi_printk(("Version: %s\n",
dmi_save_ident(dm, DMI_PRODUCT_NAME, 5); dmi_string(dm, data[6])));
dmi_printk(("Version %s.\n", dmi_save_ident(dm, DMI_PRODUCT_VERSION, 6);
dmi_string(dm, data[6]))); dmi_printk(("Serial Number: %s\n",
dmi_save_ident(dm, DMI_PRODUCT_VERSION, 6); dmi_string(dm, data[7])));
dmi_printk(("Serial Number %s.\n",
dmi_string(dm, data[7])));
}
break; break;
case 2: case 2:
p=dmi_string(dm,data[4]); dmi_printk(("Board Vendor: %s\n",
if(*p) dmi_string(dm, data[4])));
{ dmi_save_ident(dm, DMI_BOARD_VENDOR, 4);
dmi_printk(("Board Vendor: %s.\n",p)); dmi_printk(("Board Name: %s\n",
dmi_save_ident(dm, DMI_BOARD_VENDOR, 4); dmi_string(dm, data[5])));
dmi_printk(("Board Name: %s.\n", dmi_save_ident(dm, DMI_BOARD_NAME, 5);
dmi_string(dm, data[5]))); dmi_printk(("Board Version: %s\n",
dmi_save_ident(dm, DMI_BOARD_NAME, 5); dmi_string(dm, data[6])));
dmi_printk(("Board Version: %s.\n", dmi_save_ident(dm, DMI_BOARD_VERSION, 6);
dmi_string(dm, data[6])));
dmi_save_ident(dm, DMI_BOARD_VERSION, 6);
}
break;
case 3:
p=dmi_string(dm,data[8]);
if(*p && *p!=' ')
dmi_printk(("Asset Tag: %s.\n", p));
break; break;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment