Some notebooks from HP have the problem that their BIOSes attempt to spin down hard drives before entering ACPI system states S4 and S5. This leads to a yo-yo effect during system power-off shutdown and the last phase of hibernation when the disk is first spun down by the kernel and then almost immediately turned on and off by the BIOS. This, in turn, may result in shortening the disk's life times. To prevent this from happening we can blacklist the affected systems using DMI information. However, only the on-board controlles should be blacklisted and their PCI slot numbers can be used for this purpose. Unfortunately the existing interface for checking DMI information of the system is not very convenient for this purpose, because to use it, we would have to define special callback functions or create a separate struct dmi_system_id table for each blacklisted system. To overcome this difficulty introduce a new function dmi_first_match() returning a pointer to the first entry in an array of struct dmi_system_id elements that matches the system DMI information. Then, we can use this pointer to access the entry's .driver_data field containing the additional information, such as the PCI slot number, allowing us to do the desired blacklisting. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
72 lines
2.0 KiB
C
72 lines
2.0 KiB
C
#ifndef __DMI_H__
|
|
#define __DMI_H__
|
|
|
|
#include <linux/list.h>
|
|
#include <linux/mod_devicetable.h>
|
|
|
|
/* enum dmi_field is in mod_devicetable.h */
|
|
|
|
enum dmi_device_type {
|
|
DMI_DEV_TYPE_ANY = 0,
|
|
DMI_DEV_TYPE_OTHER,
|
|
DMI_DEV_TYPE_UNKNOWN,
|
|
DMI_DEV_TYPE_VIDEO,
|
|
DMI_DEV_TYPE_SCSI,
|
|
DMI_DEV_TYPE_ETHERNET,
|
|
DMI_DEV_TYPE_TOKENRING,
|
|
DMI_DEV_TYPE_SOUND,
|
|
DMI_DEV_TYPE_PATA,
|
|
DMI_DEV_TYPE_SATA,
|
|
DMI_DEV_TYPE_SAS,
|
|
DMI_DEV_TYPE_IPMI = -1,
|
|
DMI_DEV_TYPE_OEM_STRING = -2,
|
|
};
|
|
|
|
struct dmi_header {
|
|
u8 type;
|
|
u8 length;
|
|
u16 handle;
|
|
};
|
|
|
|
struct dmi_device {
|
|
struct list_head list;
|
|
int type;
|
|
const char *name;
|
|
void *device_data; /* Type specific data */
|
|
};
|
|
|
|
#ifdef CONFIG_DMI
|
|
|
|
extern int dmi_check_system(const struct dmi_system_id *list);
|
|
const struct dmi_system_id *dmi_first_match(const struct dmi_system_id *list);
|
|
extern const char * dmi_get_system_info(int field);
|
|
extern const struct dmi_device * dmi_find_device(int type, const char *name,
|
|
const struct dmi_device *from);
|
|
extern void dmi_scan_machine(void);
|
|
extern int dmi_get_year(int field);
|
|
extern int dmi_name_in_vendors(const char *str);
|
|
extern int dmi_name_in_serial(const char *str);
|
|
extern int dmi_available;
|
|
extern int dmi_walk(void (*decode)(const struct dmi_header *));
|
|
extern bool dmi_match(enum dmi_field f, const char *str);
|
|
|
|
#else
|
|
|
|
static inline int dmi_check_system(const struct dmi_system_id *list) { return 0; }
|
|
static inline const char * dmi_get_system_info(int field) { return NULL; }
|
|
static inline const struct dmi_device * dmi_find_device(int type, const char *name,
|
|
const struct dmi_device *from) { return NULL; }
|
|
static inline void dmi_scan_machine(void) { return; }
|
|
static inline int dmi_get_year(int year) { return 0; }
|
|
static inline int dmi_name_in_vendors(const char *s) { return 0; }
|
|
static inline int dmi_name_in_serial(const char *s) { return 0; }
|
|
#define dmi_available 0
|
|
static inline int dmi_walk(void (*decode)(const struct dmi_header *))
|
|
{ return -1; }
|
|
static inline bool dmi_match(enum dmi_field f, const char *str)
|
|
{ return false; }
|
|
|
|
#endif
|
|
|
|
#endif /* __DMI_H__ */
|