2 * Purpose: Export the firmware instance and label associated with
3 * a pci device to sysfs
4 * Copyright (C) 2010 Dell Inc.
5 * by Narendra K <Narendra_K@dell.com>,
6 * Jordan Hargrave <Jordan_Hargrave@dell.com>
8 * SMBIOS defines type 41 for onboard pci devices. This code retrieves
9 * the instance number and string from the type 41 record and exports
12 * Please see http://linux.dell.com/wiki/index.php/Oss/libnetdevname for more
16 #include <linux/dmi.h>
17 #include <linux/sysfs.h>
18 #include <linux/pci.h>
19 #include <linux/pci_ids.h>
20 #include <linux/module.h>
21 #include <linux/device.h>
24 enum smbios_attr_enum
{
26 SMBIOS_ATTR_LABEL_SHOW
,
27 SMBIOS_ATTR_INSTANCE_SHOW
,
31 find_smbios_instance_string(struct pci_dev
*pdev
, char *buf
,
32 enum smbios_attr_enum attribute
)
34 const struct dmi_device
*dmi
;
35 struct dmi_dev_onboard
*donboard
;
39 bus
= pdev
->bus
->number
;
43 while ((dmi
= dmi_find_device(DMI_DEV_TYPE_DEV_ONBOARD
,
44 NULL
, dmi
)) != NULL
) {
45 donboard
= dmi
->device_data
;
46 if (donboard
&& donboard
->bus
== bus
&&
47 donboard
->devfn
== devfn
) {
49 if (attribute
== SMBIOS_ATTR_INSTANCE_SHOW
)
50 return scnprintf(buf
, PAGE_SIZE
,
53 else if (attribute
== SMBIOS_ATTR_LABEL_SHOW
)
54 return scnprintf(buf
, PAGE_SIZE
,
58 return strlen(dmi
->name
);
65 smbios_instance_string_exist(struct kobject
*kobj
, struct attribute
*attr
,
71 dev
= container_of(kobj
, struct device
, kobj
);
72 pdev
= to_pci_dev(dev
);
74 return find_smbios_instance_string(pdev
, NULL
, SMBIOS_ATTR_NONE
) ?
79 smbioslabel_show(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
82 pdev
= to_pci_dev(dev
);
84 return find_smbios_instance_string(pdev
, buf
,
85 SMBIOS_ATTR_LABEL_SHOW
);
89 smbiosinstance_show(struct device
*dev
,
90 struct device_attribute
*attr
, char *buf
)
93 pdev
= to_pci_dev(dev
);
95 return find_smbios_instance_string(pdev
, buf
,
96 SMBIOS_ATTR_INSTANCE_SHOW
);
99 static struct device_attribute smbios_attr_label
= {
100 .attr
= {.name
= "label", .mode
= 0444},
101 .show
= smbioslabel_show
,
104 static struct device_attribute smbios_attr_instance
= {
105 .attr
= {.name
= "index", .mode
= 0444},
106 .show
= smbiosinstance_show
,
109 static struct attribute
*smbios_attributes
[] = {
110 &smbios_attr_label
.attr
,
111 &smbios_attr_instance
.attr
,
115 static struct attribute_group smbios_attr_group
= {
116 .attrs
= smbios_attributes
,
117 .is_visible
= smbios_instance_string_exist
,
121 pci_create_smbiosname_file(struct pci_dev
*pdev
)
123 if (!sysfs_create_group(&pdev
->dev
.kobj
, &smbios_attr_group
))
129 pci_remove_smbiosname_file(struct pci_dev
*pdev
)
131 sysfs_remove_group(&pdev
->dev
.kobj
, &smbios_attr_group
);
134 void pci_create_firmware_label_files(struct pci_dev
*pdev
)
136 if (!pci_create_smbiosname_file(pdev
))
140 void pci_remove_firmware_label_files(struct pci_dev
*pdev
)
142 pci_remove_smbiosname_file(pdev
);