1  #include <xen/types.h>
2  #include <xen/lib.h>
3  #include <xen/kernel.h>
4  #include <xen/string.h>
5  #include <xen/init.h>
6  #include <xen/cache.h>
7  #include <xen/acpi.h>
8  #include <asm/io.h>
9  #include <asm/system.h>
10  #include <xen/dmi.h>
11  #include <xen/efi.h>
12  #include <xen/pci.h>
13  #include <xen/pci_regs.h>
14  
15  #define bt_ioremap(b,l)  ((void *)__acpi_map_table(b,l))
16  #define bt_iounmap(b,l)  ((void)0)
17  #define memcpy_fromio    memcpy
18  #define alloc_bootmem(l) xmalloc_bytes(l)
19  
20  struct __packed dmi_eps {
21  	char anchor[5];			/* "_DMI_" */
22  	u8 checksum;
23  	u16 size;
24  	u32 address;
25  	u16 num_structures;
26  	u8 revision;
27  };
28  
29  struct __packed smbios_eps {
30  	char anchor[4];			/* "_SM_" */
31  	u8 checksum;
32  	u8 length;
33  	u8 major, minor;
34  	u16 max_size;
35  	u8 revision;
36  	u8 _rsrvd_[5];
37  	struct dmi_eps dmi;
38  };
39  
40  struct __packed smbios3_eps {
41  	char anchor[5];			/* "_SM3_" */
42  	u8 checksum;
43  	u8 length;
44  	u8 major, minor;
45  	u8 docrev;
46  	u8 revision;
47  	u8 _rsrvd_;
48  	u32 max_size;
49  	u64 address;
50  };
51  
52  struct dmi_header
53  {
54  	u8	type;
55  	u8	length;
56  	u16	handle;
57  };
58  
59  enum dmi_entry_type {
60  	DMI_ENTRY_BIOS = 0,
61  	DMI_ENTRY_SYSTEM,
62  	DMI_ENTRY_BASEBOARD,
63  	DMI_ENTRY_CHASSIS,
64  	DMI_ENTRY_PROCESSOR,
65  	DMI_ENTRY_MEM_CONTROLLER,
66  	DMI_ENTRY_MEM_MODULE,
67  	DMI_ENTRY_CACHE,
68  	DMI_ENTRY_PORT_CONNECTOR,
69  	DMI_ENTRY_SYSTEM_SLOT,
70  	DMI_ENTRY_ONBOARD_DEVICE,
71  	DMI_ENTRY_OEMSTRINGS,
72  	DMI_ENTRY_SYSCONF,
73  	DMI_ENTRY_BIOS_LANG,
74  	DMI_ENTRY_GROUP_ASSOC,
75  	DMI_ENTRY_SYSTEM_EVENT_LOG,
76  	DMI_ENTRY_PHYS_MEM_ARRAY,
77  	DMI_ENTRY_MEM_DEVICE,
78  	DMI_ENTRY_32_MEM_ERROR,
79  	DMI_ENTRY_MEM_ARRAY_MAPPED_ADDR,
80  	DMI_ENTRY_MEM_DEV_MAPPED_ADDR,
81  	DMI_ENTRY_BUILTIN_POINTING_DEV,
82  	DMI_ENTRY_PORTABLE_BATTERY,
83  	DMI_ENTRY_SYSTEM_RESET,
84  	DMI_ENTRY_HW_SECURITY,
85  	DMI_ENTRY_SYSTEM_POWER_CONTROLS,
86  	DMI_ENTRY_VOLTAGE_PROBE,
87  	DMI_ENTRY_COOLING_DEV,
88  	DMI_ENTRY_TEMP_PROBE,
89  	DMI_ENTRY_ELECTRICAL_CURRENT_PROBE,
90  	DMI_ENTRY_OOB_REMOTE_ACCESS,
91  	DMI_ENTRY_BIS_ENTRY,
92  	DMI_ENTRY_SYSTEM_BOOT,
93  	DMI_ENTRY_MGMT_DEV,
94  	DMI_ENTRY_MGMT_DEV_COMPONENT,
95  	DMI_ENTRY_MGMT_DEV_THRES,
96  	DMI_ENTRY_MEM_CHANNEL,
97  	DMI_ENTRY_IPMI_DEV,
98  	DMI_ENTRY_SYS_POWER_SUPPLY,
99  	DMI_ENTRY_ADDITIONAL,
100  	DMI_ENTRY_ONBOARD_DEV_EXT,
101  	DMI_ENTRY_MGMT_CONTROLLER_HOST,
102  	DMI_ENTRY_INACTIVE = 126,
103  	DMI_ENTRY_END_OF_TABLE = 127,
104  };
105  
106  #undef DMI_DEBUG
107  
108  #ifdef DMI_DEBUG
109  #define dmi_printk(x) printk x
110  #else
111  #define dmi_printk(x)
112  #endif
113  
dmi_string(struct dmi_header * dm,u8 s)114  static char * __init dmi_string(struct dmi_header *dm, u8 s)
115  {
116  	char *bp=(char *)dm;
117  	bp+=dm->length;
118  	if(!s)
119  		return "";
120  	s--;
121  	while(s>0 && *bp)
122  	{
123  		bp+=strlen(bp);
124  		bp++;
125  		s--;
126  	}
127  	return bp;
128  }
129  
130  /*
131   *	We have to be cautious here. We have seen BIOSes with DMI pointers
132   *	pointing to completely the wrong place for example
133   */
134  
dmi_table(paddr_t base,u32 len,int num,void (* decode)(struct dmi_header *))135  static int __init dmi_table(paddr_t base, u32 len, int num,
136  			    void (*decode)(struct dmi_header *))
137  {
138  	u8 *buf;
139  	struct dmi_header *dm;
140  	u8 *data;
141  	int i=0;
142  
143  	buf = bt_ioremap(base, len);
144  	if(buf==NULL)
145  		return -1;
146  
147  	data = buf;
148  
149  	/*
150  	 * Stop when we have seen all the items the table claimed to have
151  	 * (SMBIOS < 3.0 only) OR we reach an end-of-table marker (SMBIOS
152  	 * >= 3.0 only) OR we run off the end of the table (should never
153  	 * happen but sometimes does on bogus implementations.)
154  	 */
155  	while((num < 0 || i < num) && data-buf+sizeof(struct dmi_header)<=len)
156  	{
157  		dm=(struct dmi_header *)data;
158  		/*
159  		 *  We want to know the total length (formated area and strings)
160  		 *  before decoding to make sure we won't run off the table in
161  		 *  dmi_decode or dmi_string
162  		 */
163  		data+=dm->length;
164  		while(data-buf<len-1 && (data[0] || data[1]))
165  			data++;
166  		if(data-buf<len-1)
167  			decode(dm);
168  		/*
169  		 * 7.45 End-of-Table (Type 127) [SMBIOS reference spec v3.0.0]
170  		 * For tables behind a 64-bit entry point, we have no item
171  		 * count and no exact table length, so stop on end-of-table
172  		 * marker. For tables behind a 32-bit entry point, we have
173  		 * seen OEM structures behind the end-of-table marker on
174  		 * some systems, so don't trust it.
175  		 */
176  		if (num < 0 && dm->type == DMI_ENTRY_END_OF_TABLE)
177  			break;
178  		data+=2;
179  		i++;
180  	}
181  	bt_iounmap(buf, len);
182  	return 0;
183  }
184  
185  
dmi_checksum(const void __iomem * buf,unsigned int len)186  static inline bool __init dmi_checksum(const void __iomem *buf,
187                                         unsigned int len)
188  {
189  	u8 sum = 0;
190  	const u8 *p = buf;
191  	unsigned int a;
192  
193  	for (a = 0; a < len; a++)
194  		sum += p[a];
195  	return sum == 0;
196  }
197  
198  static u32 __initdata efi_dmi_address;
199  static u32 __initdata efi_dmi_size;
200  static u32 __initdata efi_smbios_address;
201  static u32 __initdata efi_smbios_size;
202  static u64 __initdata efi_smbios3_address;
203  static u32 __initdata efi_smbios3_size;
204  
205  /*
206   * Important: This function gets called while still in EFI
207   * (pseudo-)physical mode.
208   */
dmi_efi_get_table(const void * smbios,const void * smbios3)209  void __init dmi_efi_get_table(const void *smbios, const void *smbios3)
210  {
211  	const struct smbios_eps *eps = smbios;
212  	const struct smbios3_eps *eps3 = smbios3;
213  
214  	if (eps3 && memcmp(eps3->anchor, "_SM3_", 5) == 0 &&
215  	    eps3->length >= sizeof(*eps3) &&
216  	    dmi_checksum(eps3, eps3->length)) {
217  		efi_smbios3_address = eps3->address;
218  		efi_smbios3_size = eps3->max_size;
219  		return;
220  	}
221  
222  	if (eps && memcmp(eps->anchor, "_SM_", 4) == 0 &&
223  	    eps->length >= sizeof(*eps) &&
224  	    dmi_checksum(eps, eps->length)) {
225  		efi_smbios_address = (u32)(long)eps;
226  		efi_smbios_size = eps->length;
227  
228  		if (memcmp(eps->dmi.anchor, "_DMI_", 5) == 0 &&
229  		    dmi_checksum(&eps->dmi, sizeof(eps->dmi))) {
230  			efi_dmi_address = eps->dmi.address;
231  			efi_dmi_size = eps->dmi.size;
232  		}
233  	}
234  }
235  
dmi_get_table(paddr_t * base,u32 * len)236  const char *__init dmi_get_table(paddr_t *base, u32 *len)
237  {
238  	static unsigned int __initdata instance;
239  
240  	if (efi_enabled(EFI_BOOT)) {
241  		if (efi_smbios3_size && !(instance & 1)) {
242  			*base = efi_smbios3_address;
243  			*len = efi_smbios3_size;
244  			instance |= 1;
245  			return "SMBIOSv3";
246  		}
247  		if (efi_dmi_size && !(instance & 2)) {
248  			*base = efi_dmi_address;
249  			*len = efi_dmi_size;
250  			instance |= 2;
251  			return "DMI";
252  		}
253  		if (efi_smbios_size && !(instance & 4)) {
254  			*base = efi_smbios_address;
255  			*len = efi_smbios_size;
256  			instance |= 4;
257  			return "SMBIOS";
258  		}
259  	} else {
260  		char __iomem *p = maddr_to_virt(0xF0000), *q;
261  		union {
262  			struct dmi_eps dmi;
263  			struct smbios3_eps smbios3;
264  		} eps;
265  
266  		for (q = p; q <= p + 0x10000 - sizeof(eps.dmi); q += 16) {
267  			memcpy_fromio(&eps, q, sizeof(eps.dmi));
268  			if (!(instance & 1) &&
269  			    memcmp(eps.dmi.anchor, "_DMI_", 5) == 0 &&
270  			    dmi_checksum(&eps.dmi, sizeof(eps.dmi))) {
271  				*base = eps.dmi.address;
272  				*len = eps.dmi.size;
273  				instance |= 1;
274  				return "DMI";
275  			}
276  
277  			BUILD_BUG_ON(sizeof(eps.smbios3) <= sizeof(eps.dmi));
278  			if ((instance & 2) ||
279  			    q > p + 0x10000 - sizeof(eps.smbios3))
280  				continue;
281  			memcpy_fromio(&eps.dmi + 1, q + sizeof(eps.dmi),
282  			              sizeof(eps.smbios3) - sizeof(eps.dmi));
283  			if (!memcmp(eps.smbios3.anchor, "_SM3_", 5) &&
284  			    eps.smbios3.length >= sizeof(eps.smbios3) &&
285  			    q <= p + 0x10000 - eps.smbios3.length &&
286  			    dmi_checksum(q, eps.smbios3.length)) {
287  				*base = eps.smbios3.address;
288  				*len = eps.smbios3.max_size;
289  				instance |= 2;
290  				return "SMBIOSv3";
291  			}
292  		}
293  	}
294  	return NULL;
295  }
296  
297  typedef union {
298  	const struct smbios_eps __iomem *legacy;
299  	const struct smbios3_eps __iomem *v3;
300  } smbios_eps_u __attribute__((transparent_union));
301  
_dmi_iterate(const struct dmi_eps * dmi,const smbios_eps_u smbios,void (* decode)(struct dmi_header *))302  static int __init _dmi_iterate(const struct dmi_eps *dmi,
303  			       const smbios_eps_u smbios,
304  			       void (*decode)(struct dmi_header *))
305  {
306  	int num;
307  	u32 len;
308  	paddr_t base;
309  
310  	if (!dmi) {
311  		num = -1;
312  		len = smbios.v3->max_size;
313  		base = smbios.v3->address;
314  		printk(KERN_INFO "SMBIOS %d.%d present.\n",
315  		       smbios.v3->major, smbios.v3->minor);
316  		dmi_printk((KERN_INFO "SMBIOS v3 table at 0x%"PRIpaddr".\n", base));
317  	} else {
318  		num = dmi->num_structures;
319  		len = dmi->size;
320  		base = dmi->address;
321  
322  		/*
323  		 * DMI version 0.0 means that the real version is taken from
324  		 * the SMBIOS version, which we may not know at this point.
325  		 */
326  		if (dmi->revision)
327  			printk(KERN_INFO "DMI %d.%d present.\n",
328  			       dmi->revision >> 4,  dmi->revision & 0x0f);
329  		else if (!smbios.legacy)
330  			printk(KERN_INFO "DMI present.\n");
331  		dmi_printk((KERN_INFO "%d structures occupying %u bytes.\n",
332  			    num, len));
333  		dmi_printk((KERN_INFO "DMI table at 0x%08X.\n", (u32)base));
334  	}
335  	return dmi_table(base, len, num, decode);
336  }
337  
dmi_iterate(void (* decode)(struct dmi_header *))338  static int __init dmi_iterate(void (*decode)(struct dmi_header *))
339  {
340  	struct dmi_eps dmi;
341  	struct smbios3_eps smbios3;
342  	char __iomem *p, *q;
343  
344  	dmi.size = 0;
345  	smbios3.length = 0;
346  
347  	p = maddr_to_virt(0xF0000);
348  	for (q = p; q < p + 0x10000; q += 16) {
349  		if (!dmi.size) {
350  			memcpy_fromio(&dmi, q, sizeof(dmi));
351  			if (memcmp(dmi.anchor, "_DMI_", 5) ||
352  			    !dmi_checksum(&dmi, sizeof(dmi)))
353  				dmi.size = 0;
354  		}
355  		if (!smbios3.length &&
356  		    q <= p + 0x10000 - sizeof(smbios3)) {
357  			memcpy_fromio(&smbios3, q, sizeof(smbios3));
358  			if (memcmp(smbios3.anchor, "_SM3_", 5) ||
359  			    smbios3.length < sizeof(smbios3) ||
360  			    q < p + 0x10000 - smbios3.length ||
361  			    !dmi_checksum(q, smbios3.length))
362  				smbios3.length = 0;
363  		}
364  	}
365  
366  	if (smbios3.length)
367  		return _dmi_iterate(NULL, &smbios3, decode);
368  	if (dmi.size)
369  		return _dmi_iterate(&dmi, NULL, decode);
370  	return -1;
371  }
372  
dmi_efi_iterate(void (* decode)(struct dmi_header *))373  static int __init dmi_efi_iterate(void (*decode)(struct dmi_header *))
374  {
375  	int ret = -1;
376  
377  	while (efi.smbios3 != EFI_INVALID_TABLE_ADDR) {
378  		struct smbios3_eps eps;
379  		const struct smbios3_eps __iomem *p;
380  
381  		p = bt_ioremap(efi.smbios3, sizeof(eps));
382  		if (!p)
383  			break;
384  		memcpy_fromio(&eps, p, sizeof(eps));
385  		bt_iounmap(p, sizeof(eps));
386  
387  		if (memcmp(eps.anchor, "_SM3_", 5) ||
388  		    eps.length < sizeof(eps))
389  			break;
390  
391  		p = bt_ioremap(efi.smbios3, eps.length);
392  		if (!p)
393  			break;
394  		if (dmi_checksum(p, eps.length))
395  			ret = _dmi_iterate(NULL, p, decode);
396  		bt_iounmap(p, eps.length);
397  		break;
398  	}
399  
400  	if (ret != 0 && efi.smbios != EFI_INVALID_TABLE_ADDR) {
401  		struct smbios_eps eps;
402  		const struct smbios_eps __iomem *p;
403  
404  		p = bt_ioremap(efi.smbios, sizeof(eps));
405  		if (!p)
406  			return -1;
407  		memcpy_fromio(&eps, p, sizeof(eps));
408  		bt_iounmap(p, sizeof(eps));
409  
410  		if (memcmp(eps.anchor, "_SM_", 4) ||
411  		    eps.length < sizeof(eps))
412  			return -1;
413  
414  		p = bt_ioremap(efi.smbios, eps.length);
415  		if (!p)
416  			return -1;
417  		if (dmi_checksum(p, eps.length) &&
418  		    memcmp(eps.dmi.anchor, "_DMI_", 5) == 0 &&
419  		    dmi_checksum(&eps.dmi, sizeof(eps.dmi))) {
420  			printk(KERN_INFO "SMBIOS %d.%d present.\n",
421  			       eps.major, eps.minor);
422  			ret = _dmi_iterate(&eps.dmi, p, decode);
423  		}
424  		bt_iounmap(p, eps.length);
425  	}
426  
427  	return ret;
428  }
429  
430  static char *__initdata dmi_ident[DMI_STRING_MAX];
431  
432  /*
433   *	Save a DMI string
434   */
435  
dmi_save_ident(struct dmi_header * dm,int slot,int string)436  static void __init dmi_save_ident(struct dmi_header *dm, int slot, int string)
437  {
438  	char *d = (char*)dm;
439  	char *p = dmi_string(dm, d[string]);
440  	if(p==NULL || *p == 0)
441  		return;
442  	if (dmi_ident[slot])
443  		return;
444  	dmi_ident[slot] = alloc_bootmem(strlen(p)+1);
445  	if(dmi_ident[slot])
446  		strlcpy(dmi_ident[slot], p, strlen(p)+1);
447  	else
448  		printk(KERN_ERR "dmi_save_ident: out of memory.\n");
449  }
450  
451  /*
452   * Ugly compatibility crap.
453   */
454  #define dmi_blacklist	dmi_system_id
455  #define NO_MATCH	{ DMI_NONE, NULL}
456  #define MATCH		DMI_MATCH
457  
458  /*
459   * Toshiba keyboard likes to repeat keys when they are not repeated.
460   */
461  
broken_toshiba_keyboard(struct dmi_blacklist * d)462  static __init int broken_toshiba_keyboard(struct dmi_blacklist *d)
463  {
464  	printk(KERN_WARNING "Toshiba with broken keyboard detected. If your keyboard sometimes generates 3 keypresses instead of one, see http://davyd.ucc.asn.au/projects/toshiba/README\n");
465  	return 0;
466  }
467  
ich10_bios_quirk(struct dmi_system_id * d)468  static int __init ich10_bios_quirk(struct dmi_system_id *d)
469  {
470      u32 port, smictl;
471  
472      if ( pci_conf_read16(0, 0, 0x1f, 0, PCI_VENDOR_ID) != 0x8086 )
473          return 0;
474  
475      switch ( pci_conf_read16(0, 0, 0x1f, 0, PCI_DEVICE_ID) ) {
476      case 0x3a14:
477      case 0x3a16:
478      case 0x3a18:
479      case 0x3a1a:
480          port = (pci_conf_read16(0, 0, 0x1f, 0, 0x40) & 0xff80) + 0x30;
481          smictl = inl(port);
482          /* turn off LEGACY_USB{,2}_EN if enabled */
483          if ( smictl & 0x20008 )
484              outl(smictl & ~0x20008, port);
485          break;
486      }
487  
488      return 0;
489  }
490  
491  #ifdef CONFIG_ACPI_SLEEP
reset_videomode_after_s3(struct dmi_blacklist * d)492  static __init int reset_videomode_after_s3(struct dmi_blacklist *d)
493  {
494  	/* See acpi_wakeup.S */
495  	acpi_video_flags |= 2;
496  	return 0;
497  }
498  #endif
499  
dmi_disable_acpi(struct dmi_blacklist * d)500  static __init int dmi_disable_acpi(struct dmi_blacklist *d)
501  {
502  	if (!acpi_force) {
503  		printk(KERN_NOTICE "%s detected: acpi off\n",d->ident);
504  		disable_acpi();
505  	} else {
506  		printk(KERN_NOTICE
507  		       "Warning: DMI blacklist says broken, but acpi forced\n");
508  	}
509  	return 0;
510  }
511  
512  /*
513   * Limit ACPI to CPU enumeration for HT
514   */
force_acpi_ht(struct dmi_blacklist * d)515  static __init int force_acpi_ht(struct dmi_blacklist *d)
516  {
517  	if (!acpi_force) {
518  		printk(KERN_NOTICE "%s detected: force use of acpi=ht\n", d->ident);
519  		disable_acpi();
520  		acpi_ht = 1;
521  	} else {
522  		printk(KERN_NOTICE
523  		       "Warning: acpi=force overrules DMI blacklist: acpi=ht\n");
524  	}
525  	return 0;
526  }
527  
528  /*
529   *	Process the DMI blacklists
530   */
531  
532  
533  /*
534   *	This will be expanded over time to force things like the APM
535   *	interrupt mask settings according to the laptop
536   */
537  
538  static __initdata struct dmi_blacklist dmi_blacklist[]={
539  
540  	{ broken_toshiba_keyboard, "Toshiba Satellite 4030cdt", { /* Keyboard generates spurious repeats */
541  			MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"),
542  			NO_MATCH, NO_MATCH, NO_MATCH
543  			} },
544  #ifdef CONFIG_ACPI_SLEEP
545  	{ reset_videomode_after_s3, "Toshiba Satellite 4030cdt", { /* Reset video mode after returning from ACPI S3 sleep */
546  			MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"),
547  			NO_MATCH, NO_MATCH, NO_MATCH
548  			} },
549  #endif
550  
551  	{ ich10_bios_quirk, "Intel board & BIOS",
552  		/*
553  		 * BIOS leaves legacy USB emulation enabled while
554  		 * SMM can't properly handle it.
555  		 */
556  		{
557  			MATCH(DMI_BOARD_VENDOR, "Intel Corp"),
558  			MATCH(DMI_BIOS_VENDOR, "Intel Corp"),
559  			NO_MATCH, NO_MATCH
560  		}
561  	},
562  
563  	/*
564  	 * If your system is blacklisted here, but you find that acpi=force
565  	 * works for you, please contact acpi-devel@sourceforge.net
566  	 */
567  
568  	/*
569  	 *	Boxes that need ACPI disabled
570  	 */
571  
572  	{ dmi_disable_acpi, "IBM Thinkpad", {
573  			MATCH(DMI_BOARD_VENDOR, "IBM"),
574  			MATCH(DMI_BOARD_NAME, "2629H1G"),
575  			NO_MATCH, NO_MATCH }},
576  
577  	/*
578  	 *	Boxes that need acpi=ht
579  	 */
580  
581  	{ force_acpi_ht, "FSC Primergy T850", {
582  			MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
583  			MATCH(DMI_PRODUCT_NAME, "PRIMERGY T850"),
584  			NO_MATCH, NO_MATCH }},
585  
586  	{ force_acpi_ht, "DELL GX240", {
587  			MATCH(DMI_BOARD_VENDOR, "Dell Computer Corporation"),
588  			MATCH(DMI_BOARD_NAME, "OptiPlex GX240"),
589  			NO_MATCH, NO_MATCH }},
590  
591  	{ force_acpi_ht, "HP VISUALIZE NT Workstation", {
592  			MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
593  			MATCH(DMI_PRODUCT_NAME, "HP VISUALIZE NT Workstation"),
594  			NO_MATCH, NO_MATCH }},
595  
596  	{ force_acpi_ht, "Compaq Workstation W8000", {
597  			MATCH(DMI_SYS_VENDOR, "Compaq"),
598  			MATCH(DMI_PRODUCT_NAME, "Workstation W8000"),
599  			NO_MATCH, NO_MATCH }},
600  
601  	{ force_acpi_ht, "ASUS P4B266", {
602  			MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
603  			MATCH(DMI_BOARD_NAME, "P4B266"),
604  			NO_MATCH, NO_MATCH }},
605  
606  	{ force_acpi_ht, "ASUS P2B-DS", {
607  			MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
608  			MATCH(DMI_BOARD_NAME, "P2B-DS"),
609  			NO_MATCH, NO_MATCH }},
610  
611  	{ force_acpi_ht, "ASUS CUR-DLS", {
612  			MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
613  			MATCH(DMI_BOARD_NAME, "CUR-DLS"),
614  			NO_MATCH, NO_MATCH }},
615  
616  	{ force_acpi_ht, "ABIT i440BX-W83977", {
617  			MATCH(DMI_BOARD_VENDOR, "ABIT <http://www.abit.com>"),
618  			MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"),
619  			NO_MATCH, NO_MATCH }},
620  
621  	{ force_acpi_ht, "IBM Bladecenter", {
622  			MATCH(DMI_BOARD_VENDOR, "IBM"),
623  			MATCH(DMI_BOARD_NAME, "IBM eServer BladeCenter HS20"),
624  			NO_MATCH, NO_MATCH }},
625  
626  	{ force_acpi_ht, "IBM eServer xSeries 360", {
627  			MATCH(DMI_BOARD_VENDOR, "IBM"),
628  			MATCH(DMI_BOARD_NAME, "eServer xSeries 360"),
629  			NO_MATCH, NO_MATCH }},
630  
631  	{ force_acpi_ht, "IBM eserver xSeries 330", {
632  			MATCH(DMI_BOARD_VENDOR, "IBM"),
633  			MATCH(DMI_BOARD_NAME, "eserver xSeries 330"),
634  			NO_MATCH, NO_MATCH }},
635  
636  	{ force_acpi_ht, "IBM eserver xSeries 440", {
637  			MATCH(DMI_BOARD_VENDOR, "IBM"),
638  			MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"),
639  			NO_MATCH, NO_MATCH }},
640  
641  	{ NULL, }
642  };
643  
644  /*
645   *	Process a DMI table entry. Right now all we care about are the BIOS
646   *	and machine entries. For 2.5 we should pull the smbus controller info
647   *	out of here.
648   */
649  
dmi_decode(struct dmi_header * dm)650  static void __init dmi_decode(struct dmi_header *dm)
651  {
652  #ifdef DMI_DEBUG
653  	u8 *data = (u8 *)dm;
654  #endif
655  
656  	switch(dm->type)
657  	{
658  		case DMI_ENTRY_BIOS:
659  			dmi_printk(("BIOS Vendor: %s\n",
660  				dmi_string(dm, data[4])));
661  			dmi_save_ident(dm, DMI_BIOS_VENDOR, 4);
662  			dmi_printk(("BIOS Version: %s\n",
663  				dmi_string(dm, data[5])));
664  			dmi_save_ident(dm, DMI_BIOS_VERSION, 5);
665  			dmi_printk(("BIOS Release: %s\n",
666  				dmi_string(dm, data[8])));
667  			dmi_save_ident(dm, DMI_BIOS_DATE, 8);
668  			break;
669  		case DMI_ENTRY_SYSTEM:
670  			dmi_printk(("System Vendor: %s\n",
671  				dmi_string(dm, data[4])));
672  			dmi_save_ident(dm, DMI_SYS_VENDOR, 4);
673  			dmi_printk(("Product Name: %s\n",
674  				dmi_string(dm, data[5])));
675  			dmi_save_ident(dm, DMI_PRODUCT_NAME, 5);
676  			dmi_printk(("Version: %s\n",
677  				dmi_string(dm, data[6])));
678  			dmi_save_ident(dm, DMI_PRODUCT_VERSION, 6);
679  			dmi_printk(("Serial Number: %s\n",
680  				dmi_string(dm, data[7])));
681  			break;
682  		case DMI_ENTRY_BASEBOARD:
683  			dmi_printk(("Board Vendor: %s\n",
684  				dmi_string(dm, data[4])));
685  			dmi_save_ident(dm, DMI_BOARD_VENDOR, 4);
686  			dmi_printk(("Board Name: %s\n",
687  				dmi_string(dm, data[5])));
688  			dmi_save_ident(dm, DMI_BOARD_NAME, 5);
689  			dmi_printk(("Board Version: %s\n",
690  				dmi_string(dm, data[6])));
691  			dmi_save_ident(dm, DMI_BOARD_VERSION, 6);
692  			break;
693  	}
694  }
695  
dmi_scan_machine(void)696  void __init dmi_scan_machine(void)
697  {
698  	if ((!efi_enabled(EFI_BOOT) ? dmi_iterate(dmi_decode) :
699  	                    dmi_efi_iterate(dmi_decode)) == 0)
700   		dmi_check_system(dmi_blacklist);
701  	else
702  		printk(KERN_INFO "DMI not present.\n");
703  }
704  
705  
706  /**
707   *	dmi_check_system - check system DMI data
708   *	@list: array of dmi_system_id structures to match against
709   *
710   *	Walk the blacklist table running matching functions until someone
711   *	returns non zero or we hit the end. Callback function is called for
712   *	each successfull match. Returns the number of matches.
713   */
dmi_check_system(struct dmi_system_id * list)714  int __init dmi_check_system(struct dmi_system_id *list)
715  {
716  	int i, count = 0;
717  	struct dmi_system_id *d = list;
718  
719  	while (d->ident) {
720  		for (i = 0; i < ARRAY_SIZE(d->matches); i++) {
721  			int s = d->matches[i].slot;
722  			if (s == DMI_NONE)
723  				continue;
724  			if (dmi_ident[s] && strstr(dmi_ident[s], d->matches[i].substr))
725  				continue;
726  			/* No match */
727  			goto fail;
728  		}
729  		if (d->callback && d->callback(d))
730  			break;
731  		count++;
732  fail:		d++;
733  	}
734  
735  	return count;
736  }
737  
738  /**
739   *	dmi_get_date - parse a DMI date
740   *	@field:	data index (see enum dmi_field)
741   *	@yearp: optional out parameter for the year
742   *	@monthp: optional out parameter for the month
743   *	@dayp: optional out parameter for the day
744   *
745   *	The date field is assumed to be in the form resembling
746   *	[mm[/dd]]/yy[yy] and the result is stored in the out
747   *	parameters any or all of which can be omitted.
748   *
749   *	If the field doesn't exist, all out parameters are set to zero
750   *	and false is returned.  Otherwise, true is returned with any
751   *	invalid part of date set to zero.
752   *
753   *	On return, year, month and day are guaranteed to be in the
754   *	range of [0,9999], [0,12] and [0,31] respectively.
755   */
dmi_get_date(int field,int * yearp,int * monthp,int * dayp)756  bool __init dmi_get_date(int field, int *yearp, int *monthp, int *dayp)
757  {
758  	int year = 0, month = 0, day = 0;
759  	bool exists;
760  	const char *s, *e, *y;
761  
762  	s = field < DMI_STRING_MAX ? dmi_ident[field] : NULL;
763  	exists = !!s;
764  	if (!exists)
765  		goto out;
766  
767  	/*
768  	 * Determine year first.  We assume the date string resembles
769  	 * mm/dd/yy[yy] but the original code extracted only the year
770  	 * from the end.  Keep the behavior in the spirit of no
771  	 * surprises.
772  	 */
773  	y = strrchr(s, '/');
774  	if (!y)
775  		goto out;
776  
777  	y++;
778  	year = simple_strtoul(y, &e, 10);
779  	if (y != e && year < 100) {	/* 2-digit year */
780  		year += 1900;
781  		if (year < 1996)	/* no dates < spec 1.0 */
782  			year += 100;
783  	}
784  	if (year > 9999)		/* year should fit in %04d */
785  		year = 0;
786  
787  	/* parse the mm and dd */
788  	month = simple_strtoul(s, &e, 10);
789  	if (s == e || *e != '/' || !month || month > 12) {
790  		month = 0;
791  		goto out;
792  	}
793  
794  	s = e + 1;
795  	day = simple_strtoul(s, &e, 10);
796  	if (s == y || s == e || *e != '/' || day > 31)
797  		day = 0;
798  out:
799  	if (yearp)
800  		*yearp = year;
801  	if (monthp)
802  		*monthp = month;
803  	if (dayp)
804  		*dayp = day;
805  	return exists;
806  }
807  
dmi_end_boot(void)808  void __init dmi_end_boot(void)
809  {
810      unsigned int i;
811  
812      for ( i = 0; i < DMI_STRING_MAX; ++i )
813          xfree(dmi_ident[i]);
814  }
815