aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firmware/dmi_scan.c
diff options
context:
space:
mode:
authorJordan Hargrave <jharg93@gmail.com>2016-01-15 16:08:45 -0500
committerJean Delvare <jdelvare@suse.de>2016-01-15 16:08:45 -0500
commite5b6c1518878e157df4121c1caf70d9c470a6d31 (patch)
tree1918fbc2dd9d73ee7b60e5273cf021160ac59a62 /drivers/firmware/dmi_scan.c
parentbfab8b48598f851dfeca2b40fd06969bf8634d37 (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.c51
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
324static void __init dmi_save_dev_onboard(int instance, int segment, int bus, 324static 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
346static void __init dmi_save_extended_devices(const struct dmi_header *dm) 351static 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
366static 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
360static void __init count_mem_devices(const struct dmi_header *dm, void *v) 378static 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;