diff options
author | Jordan Hargrave <jharg93@gmail.com> | 2016-01-15 16:08:45 -0500 |
---|---|---|
committer | Jean Delvare <jdelvare@suse.de> | 2016-01-15 16:08:45 -0500 |
commit | e5b6c1518878e157df4121c1caf70d9c470a6d31 (patch) | |
tree | 1918fbc2dd9d73ee7b60e5273cf021160ac59a62 /drivers/firmware/dmi_scan.c | |
parent | bfab8b48598f851dfeca2b40fd06969bf8634d37 (diff) |
firmware: dmi_scan: Save SMBIOS Type 9 System Slots
Save SMBIOS Type 9 System Slots during DMI scan. PCI address of
onboard devices was already saved but not for slots.
Signed-off-by: Jordan Hargrave <jordan_hargrave@dell.com>
Signed-off-by: Jean Delvare <jdelvare@suse.de>
Diffstat (limited to 'drivers/firmware/dmi_scan.c')
-rw-r--r-- | drivers/firmware/dmi_scan.c | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c index 908653fe5c10..88bebe1968b7 100644 --- a/drivers/firmware/dmi_scan.c +++ b/drivers/firmware/dmi_scan.c | |||
@@ -321,26 +321,31 @@ static void __init dmi_save_ipmi_device(const struct dmi_header *dm) | |||
321 | list_add_tail(&dev->list, &dmi_devices); | 321 | list_add_tail(&dev->list, &dmi_devices); |
322 | } | 322 | } |
323 | 323 | ||
324 | static void __init dmi_save_dev_onboard(int instance, int segment, int bus, | 324 | static void __init dmi_save_dev_pciaddr(int instance, int segment, int bus, |
325 | int devfn, const char *name) | 325 | int devfn, const char *name, int type) |
326 | { | 326 | { |
327 | struct dmi_dev_onboard *onboard_dev; | 327 | struct dmi_dev_onboard *dev; |
328 | 328 | ||
329 | onboard_dev = dmi_alloc(sizeof(*onboard_dev) + strlen(name) + 1); | 329 | /* Ignore invalid values */ |
330 | if (!onboard_dev) | 330 | if (type == DMI_DEV_TYPE_DEV_SLOT && |
331 | segment == 0xFFFF && bus == 0xFF && devfn == 0xFF) | ||
331 | return; | 332 | return; |
332 | 333 | ||
333 | onboard_dev->instance = instance; | 334 | dev = dmi_alloc(sizeof(*dev) + strlen(name) + 1); |
334 | onboard_dev->segment = segment; | 335 | if (!dev) |
335 | onboard_dev->bus = bus; | 336 | return; |
336 | onboard_dev->devfn = devfn; | ||
337 | 337 | ||
338 | strcpy((char *)&onboard_dev[1], name); | 338 | dev->instance = instance; |
339 | onboard_dev->dev.type = DMI_DEV_TYPE_DEV_ONBOARD; | 339 | dev->segment = segment; |
340 | onboard_dev->dev.name = (char *)&onboard_dev[1]; | 340 | dev->bus = bus; |
341 | onboard_dev->dev.device_data = onboard_dev; | 341 | dev->devfn = devfn; |
342 | 342 | ||
343 | list_add(&onboard_dev->dev.list, &dmi_devices); | 343 | strcpy((char *)&dev[1], name); |
344 | dev->dev.type = type; | ||
345 | dev->dev.name = (char *)&dev[1]; | ||
346 | dev->dev.device_data = dev; | ||
347 | |||
348 | list_add(&dev->dev.list, &dmi_devices); | ||
344 | } | 349 | } |
345 | 350 | ||
346 | static void __init dmi_save_extended_devices(const struct dmi_header *dm) | 351 | static void __init dmi_save_extended_devices(const struct dmi_header *dm) |
@@ -353,10 +358,23 @@ static void __init dmi_save_extended_devices(const struct dmi_header *dm) | |||
353 | return; | 358 | return; |
354 | 359 | ||
355 | name = dmi_string_nosave(dm, d[0x4]); | 360 | name = dmi_string_nosave(dm, d[0x4]); |
356 | dmi_save_dev_onboard(d[0x6], *(u16 *)(d + 0x7), d[0x9], d[0xA], name); | 361 | dmi_save_dev_pciaddr(d[0x6], *(u16 *)(d + 0x7), d[0x9], d[0xA], name, |
362 | DMI_DEV_TYPE_DEV_ONBOARD); | ||
357 | dmi_save_one_device(d[0x5] & 0x7f, name); | 363 | dmi_save_one_device(d[0x5] & 0x7f, name); |
358 | } | 364 | } |
359 | 365 | ||
366 | static void __init dmi_save_system_slot(const struct dmi_header *dm) | ||
367 | { | ||
368 | const u8 *d = (u8 *)dm; | ||
369 | |||
370 | /* Need SMBIOS 2.6+ structure */ | ||
371 | if (dm->length < 0x11) | ||
372 | return; | ||
373 | dmi_save_dev_pciaddr(*(u16 *)(d + 0x9), *(u16 *)(d + 0xD), d[0xF], | ||
374 | d[0x10], dmi_string_nosave(dm, d[0x4]), | ||
375 | DMI_DEV_TYPE_DEV_SLOT); | ||
376 | } | ||
377 | |||
360 | static void __init count_mem_devices(const struct dmi_header *dm, void *v) | 378 | static void __init count_mem_devices(const struct dmi_header *dm, void *v) |
361 | { | 379 | { |
362 | if (dm->type != DMI_ENTRY_MEM_DEVICE) | 380 | if (dm->type != DMI_ENTRY_MEM_DEVICE) |
@@ -427,6 +445,9 @@ static void __init dmi_decode(const struct dmi_header *dm, void *dummy) | |||
427 | dmi_save_ident(dm, DMI_CHASSIS_SERIAL, 7); | 445 | dmi_save_ident(dm, DMI_CHASSIS_SERIAL, 7); |
428 | dmi_save_ident(dm, DMI_CHASSIS_ASSET_TAG, 8); | 446 | dmi_save_ident(dm, DMI_CHASSIS_ASSET_TAG, 8); |
429 | break; | 447 | break; |
448 | case 9: /* System Slots */ | ||
449 | dmi_save_system_slot(dm); | ||
450 | break; | ||
430 | case 10: /* Onboard Devices Information */ | 451 | case 10: /* Onboard Devices Information */ |
431 | dmi_save_devices(dm); | 452 | dmi_save_devices(dm); |
432 | break; | 453 | break; |