forked from Minki/linux
Merge branch 'dmi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging
Pull dmi updates from Jean Delvare. * 'dmi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging: firmware: dmi_scan: Save SMBIOS Type 9 System Slots firmware: dmi_scan: Fix dmi_find_device description firmware: dmi_scan: Clarify dmi_save_extended_devices firmware: dmi_scan: Optimize dmi_save_extended_devices
This commit is contained in:
commit
d45187aaf0
|
@ -321,39 +321,58 @@ static void __init dmi_save_ipmi_device(const struct dmi_header *dm)
|
||||||
list_add_tail(&dev->list, &dmi_devices);
|
list_add_tail(&dev->list, &dmi_devices);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init dmi_save_dev_onboard(int instance, int segment, int bus,
|
static void __init dmi_save_dev_pciaddr(int instance, int segment, int bus,
|
||||||
int devfn, const char *name)
|
int devfn, const char *name, int type)
|
||||||
{
|
{
|
||||||
struct dmi_dev_onboard *onboard_dev;
|
struct dmi_dev_onboard *dev;
|
||||||
|
|
||||||
onboard_dev = dmi_alloc(sizeof(*onboard_dev) + strlen(name) + 1);
|
/* Ignore invalid values */
|
||||||
if (!onboard_dev)
|
if (type == DMI_DEV_TYPE_DEV_SLOT &&
|
||||||
|
segment == 0xFFFF && bus == 0xFF && devfn == 0xFF)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
onboard_dev->instance = instance;
|
dev = dmi_alloc(sizeof(*dev) + strlen(name) + 1);
|
||||||
onboard_dev->segment = segment;
|
if (!dev)
|
||||||
onboard_dev->bus = bus;
|
return;
|
||||||
onboard_dev->devfn = devfn;
|
|
||||||
|
|
||||||
strcpy((char *)&onboard_dev[1], name);
|
dev->instance = instance;
|
||||||
onboard_dev->dev.type = DMI_DEV_TYPE_DEV_ONBOARD;
|
dev->segment = segment;
|
||||||
onboard_dev->dev.name = (char *)&onboard_dev[1];
|
dev->bus = bus;
|
||||||
onboard_dev->dev.device_data = onboard_dev;
|
dev->devfn = devfn;
|
||||||
|
|
||||||
list_add(&onboard_dev->dev.list, &dmi_devices);
|
strcpy((char *)&dev[1], name);
|
||||||
|
dev->dev.type = type;
|
||||||
|
dev->dev.name = (char *)&dev[1];
|
||||||
|
dev->dev.device_data = dev;
|
||||||
|
|
||||||
|
list_add(&dev->dev.list, &dmi_devices);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init dmi_save_extended_devices(const struct dmi_header *dm)
|
static void __init dmi_save_extended_devices(const struct dmi_header *dm)
|
||||||
{
|
{
|
||||||
const u8 *d = (u8 *) dm + 5;
|
const char *name;
|
||||||
|
const u8 *d = (u8 *)dm;
|
||||||
|
|
||||||
/* Skip disabled device */
|
/* Skip disabled device */
|
||||||
if ((*d & 0x80) == 0)
|
if ((d[0x5] & 0x80) == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
dmi_save_dev_onboard(*(d+1), *(u16 *)(d+2), *(d+4), *(d+5),
|
name = dmi_string_nosave(dm, d[0x4]);
|
||||||
dmi_string_nosave(dm, *(d-1)));
|
dmi_save_dev_pciaddr(d[0x6], *(u16 *)(d + 0x7), d[0x9], d[0xA], name,
|
||||||
dmi_save_one_device(*d & 0x7f, dmi_string_nosave(dm, *(d - 1)));
|
DMI_DEV_TYPE_DEV_ONBOARD);
|
||||||
|
dmi_save_one_device(d[0x5] & 0x7f, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __init dmi_save_system_slot(const struct dmi_header *dm)
|
||||||
|
{
|
||||||
|
const u8 *d = (u8 *)dm;
|
||||||
|
|
||||||
|
/* Need SMBIOS 2.6+ structure */
|
||||||
|
if (dm->length < 0x11)
|
||||||
|
return;
|
||||||
|
dmi_save_dev_pciaddr(*(u16 *)(d + 0x9), *(u16 *)(d + 0xD), d[0xF],
|
||||||
|
d[0x10], dmi_string_nosave(dm, d[0x4]),
|
||||||
|
DMI_DEV_TYPE_DEV_SLOT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init count_mem_devices(const struct dmi_header *dm, void *v)
|
static void __init count_mem_devices(const struct dmi_header *dm, void *v)
|
||||||
|
@ -426,6 +445,9 @@ static void __init dmi_decode(const struct dmi_header *dm, void *dummy)
|
||||||
dmi_save_ident(dm, DMI_CHASSIS_SERIAL, 7);
|
dmi_save_ident(dm, DMI_CHASSIS_SERIAL, 7);
|
||||||
dmi_save_ident(dm, DMI_CHASSIS_ASSET_TAG, 8);
|
dmi_save_ident(dm, DMI_CHASSIS_ASSET_TAG, 8);
|
||||||
break;
|
break;
|
||||||
|
case 9: /* System Slots */
|
||||||
|
dmi_save_system_slot(dm);
|
||||||
|
break;
|
||||||
case 10: /* Onboard Devices Information */
|
case 10: /* Onboard Devices Information */
|
||||||
dmi_save_devices(dm);
|
dmi_save_devices(dm);
|
||||||
break;
|
break;
|
||||||
|
@ -869,7 +891,7 @@ EXPORT_SYMBOL(dmi_name_in_vendors);
|
||||||
* @from: previous device found in search, or %NULL for new search.
|
* @from: previous device found in search, or %NULL for new search.
|
||||||
*
|
*
|
||||||
* Iterates through the list of known onboard devices. If a device is
|
* Iterates through the list of known onboard devices. If a device is
|
||||||
* found with a matching @vendor and @device, a pointer to its device
|
* found with a matching @type and @name, a pointer to its device
|
||||||
* structure is returned. Otherwise, %NULL is returned.
|
* structure is returned. Otherwise, %NULL is returned.
|
||||||
* A new search is initiated by passing %NULL as the @from argument.
|
* A new search is initiated by passing %NULL as the @from argument.
|
||||||
* If @from is not %NULL, searches continue from next device.
|
* If @from is not %NULL, searches continue from next device.
|
||||||
|
|
|
@ -22,6 +22,7 @@ enum dmi_device_type {
|
||||||
DMI_DEV_TYPE_IPMI = -1,
|
DMI_DEV_TYPE_IPMI = -1,
|
||||||
DMI_DEV_TYPE_OEM_STRING = -2,
|
DMI_DEV_TYPE_OEM_STRING = -2,
|
||||||
DMI_DEV_TYPE_DEV_ONBOARD = -3,
|
DMI_DEV_TYPE_DEV_ONBOARD = -3,
|
||||||
|
DMI_DEV_TYPE_DEV_SLOT = -4,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum dmi_entry_type {
|
enum dmi_entry_type {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user