diff options
Diffstat (limited to 'drivers/pci/pci-label.c')
| -rw-r--r-- | drivers/pci/pci-label.c | 218 | 
1 files changed, 68 insertions, 150 deletions
| diff --git a/drivers/pci/pci-label.c b/drivers/pci/pci-label.c index 781e45cf60d1..c32f3b7540e8 100644 --- a/drivers/pci/pci-label.c +++ b/drivers/pci/pci-label.c @@ -33,6 +33,21 @@  #include <linux/pci-acpi.h>  #include "pci.h" +static bool device_has_acpi_name(struct device *dev) +{ +#ifdef CONFIG_ACPI +	acpi_handle handle = ACPI_HANDLE(dev); + +	if (!handle) +		return false; + +	return acpi_check_dsm(handle, &pci_acpi_dsm_guid, 0x2, +			      1 << DSM_PCI_DEVICE_NAME); +#else +	return false; +#endif +} +  #ifdef CONFIG_DMI  enum smbios_attr_enum {  	SMBIOS_ATTR_NONE = 0, @@ -45,13 +60,9 @@ static size_t find_smbios_instance_string(struct pci_dev *pdev, char *buf,  {  	const struct dmi_device *dmi;  	struct dmi_dev_onboard *donboard; -	int domain_nr; -	int bus; -	int devfn; - -	domain_nr = pci_domain_nr(pdev->bus); -	bus = pdev->bus->number; -	devfn = pdev->devfn; +	int domain_nr = pci_domain_nr(pdev->bus); +	int bus = pdev->bus->number; +	int devfn = pdev->devfn;  	dmi = NULL;  	while ((dmi = dmi_find_device(DMI_DEV_TYPE_DEV_ONBOARD, @@ -62,13 +73,11 @@ static size_t find_smbios_instance_string(struct pci_dev *pdev, char *buf,  				donboard->devfn == devfn) {  			if (buf) {  				if (attribute == SMBIOS_ATTR_INSTANCE_SHOW) -					return scnprintf(buf, PAGE_SIZE, -							 "%d\n", -							 donboard->instance); +					return sysfs_emit(buf, "%d\n", +							  donboard->instance);  				else if (attribute == SMBIOS_ATTR_LABEL_SHOW) -					return scnprintf(buf, PAGE_SIZE, -							 "%s\n", -							 dmi->name); +					return sysfs_emit(buf, "%s\n", +							  dmi->name);  			}  			return strlen(dmi->name);  		} @@ -76,78 +85,52 @@ static size_t find_smbios_instance_string(struct pci_dev *pdev, char *buf,  	return 0;  } -static umode_t smbios_instance_string_exist(struct kobject *kobj, -					    struct attribute *attr, int n) +static ssize_t smbios_label_show(struct device *dev, +				 struct device_attribute *attr, char *buf)  { -	struct device *dev; -	struct pci_dev *pdev; - -	dev = kobj_to_dev(kobj); -	pdev = to_pci_dev(dev); - -	return find_smbios_instance_string(pdev, NULL, SMBIOS_ATTR_NONE) ? -					   S_IRUGO : 0; -} - -static ssize_t smbioslabel_show(struct device *dev, -				struct device_attribute *attr, char *buf) -{ -	struct pci_dev *pdev; -	pdev = to_pci_dev(dev); +	struct pci_dev *pdev = to_pci_dev(dev);  	return find_smbios_instance_string(pdev, buf,  					   SMBIOS_ATTR_LABEL_SHOW);  } +static struct device_attribute dev_attr_smbios_label = __ATTR(label, 0444, +						    smbios_label_show, NULL); -static ssize_t smbiosinstance_show(struct device *dev, -				   struct device_attribute *attr, char *buf) +static ssize_t index_show(struct device *dev, struct device_attribute *attr, +			  char *buf)  { -	struct pci_dev *pdev; -	pdev = to_pci_dev(dev); +	struct pci_dev *pdev = to_pci_dev(dev);  	return find_smbios_instance_string(pdev, buf,  					   SMBIOS_ATTR_INSTANCE_SHOW);  } +static DEVICE_ATTR_RO(index); -static struct device_attribute smbios_attr_label = { -	.attr = {.name = "label", .mode = 0444}, -	.show = smbioslabel_show, -}; - -static struct device_attribute smbios_attr_instance = { -	.attr = {.name = "index", .mode = 0444}, -	.show = smbiosinstance_show, -}; - -static struct attribute *smbios_attributes[] = { -	&smbios_attr_label.attr, -	&smbios_attr_instance.attr, +static struct attribute *smbios_attrs[] = { +	&dev_attr_smbios_label.attr, +	&dev_attr_index.attr,  	NULL,  }; -static const struct attribute_group smbios_attr_group = { -	.attrs = smbios_attributes, -	.is_visible = smbios_instance_string_exist, -}; - -static int pci_create_smbiosname_file(struct pci_dev *pdev) +static umode_t smbios_attr_is_visible(struct kobject *kobj, struct attribute *a, +				      int n)  { -	return sysfs_create_group(&pdev->dev.kobj, &smbios_attr_group); -} +	struct device *dev = kobj_to_dev(kobj); +	struct pci_dev *pdev = to_pci_dev(dev); -static void pci_remove_smbiosname_file(struct pci_dev *pdev) -{ -	sysfs_remove_group(&pdev->dev.kobj, &smbios_attr_group); -} -#else -static inline int pci_create_smbiosname_file(struct pci_dev *pdev) -{ -	return -1; -} +	if (device_has_acpi_name(dev)) +		return 0; -static inline void pci_remove_smbiosname_file(struct pci_dev *pdev) -{ +	if (!find_smbios_instance_string(pdev, NULL, SMBIOS_ATTR_NONE)) +		return 0; + +	return a->mode;  } + +const struct attribute_group pci_dev_smbios_attr_group = { +	.attrs = smbios_attrs, +	.is_visible = smbios_attr_is_visible, +};  #endif  #ifdef CONFIG_ACPI @@ -169,11 +152,10 @@ static void dsm_label_utf16s_to_utf8s(union acpi_object *obj, char *buf)  static int dsm_get_label(struct device *dev, char *buf,  			 enum acpi_attr_enum attr)  { -	acpi_handle handle; +	acpi_handle handle = ACPI_HANDLE(dev);  	union acpi_object *obj, *tmp;  	int len = -1; -	handle = ACPI_HANDLE(dev);  	if (!handle)  		return -1; @@ -209,103 +191,39 @@ static int dsm_get_label(struct device *dev, char *buf,  	return len;  } -static bool device_has_dsm(struct device *dev) -{ -	acpi_handle handle; - -	handle = ACPI_HANDLE(dev); -	if (!handle) -		return false; - -	return !!acpi_check_dsm(handle, &pci_acpi_dsm_guid, 0x2, -				1 << DSM_PCI_DEVICE_NAME); -} - -static umode_t acpi_index_string_exist(struct kobject *kobj, -				       struct attribute *attr, int n) -{ -	struct device *dev; - -	dev = kobj_to_dev(kobj); - -	if (device_has_dsm(dev)) -		return S_IRUGO; - -	return 0; -} - -static ssize_t acpilabel_show(struct device *dev, -			      struct device_attribute *attr, char *buf) +static ssize_t label_show(struct device *dev, struct device_attribute *attr, +			  char *buf)  {  	return dsm_get_label(dev, buf, ACPI_ATTR_LABEL_SHOW);  } +static DEVICE_ATTR_RO(label); -static ssize_t acpiindex_show(struct device *dev, +static ssize_t acpi_index_show(struct device *dev,  			      struct device_attribute *attr, char *buf)  {  	return dsm_get_label(dev, buf, ACPI_ATTR_INDEX_SHOW);  } +static DEVICE_ATTR_RO(acpi_index); -static struct device_attribute acpi_attr_label = { -	.attr = {.name = "label", .mode = 0444}, -	.show = acpilabel_show, -}; - -static struct device_attribute acpi_attr_index = { -	.attr = {.name = "acpi_index", .mode = 0444}, -	.show = acpiindex_show, -}; - -static struct attribute *acpi_attributes[] = { -	&acpi_attr_label.attr, -	&acpi_attr_index.attr, +static struct attribute *acpi_attrs[] = { +	&dev_attr_label.attr, +	&dev_attr_acpi_index.attr,  	NULL,  }; -static const struct attribute_group acpi_attr_group = { -	.attrs = acpi_attributes, -	.is_visible = acpi_index_string_exist, -}; - -static int pci_create_acpi_index_label_files(struct pci_dev *pdev) +static umode_t acpi_attr_is_visible(struct kobject *kobj, struct attribute *a, +				    int n)  { -	return sysfs_create_group(&pdev->dev.kobj, &acpi_attr_group); -} +	struct device *dev = kobj_to_dev(kobj); -static int pci_remove_acpi_index_label_files(struct pci_dev *pdev) -{ -	sysfs_remove_group(&pdev->dev.kobj, &acpi_attr_group); -	return 0; -} -#else -static inline int pci_create_acpi_index_label_files(struct pci_dev *pdev) -{ -	return -1; -} +	if (!device_has_acpi_name(dev)) +		return 0; -static inline int pci_remove_acpi_index_label_files(struct pci_dev *pdev) -{ -	return -1; +	return a->mode;  } -static inline bool device_has_dsm(struct device *dev) -{ -	return false; -} +const struct attribute_group pci_dev_acpi_attr_group = { +	.attrs = acpi_attrs, +	.is_visible = acpi_attr_is_visible, +};  #endif - -void pci_create_firmware_label_files(struct pci_dev *pdev) -{ -	if (device_has_dsm(&pdev->dev)) -		pci_create_acpi_index_label_files(pdev); -	else -		pci_create_smbiosname_file(pdev); -} - -void pci_remove_firmware_label_files(struct pci_dev *pdev) -{ -	if (device_has_dsm(&pdev->dev)) -		pci_remove_acpi_index_label_files(pdev); -	else -		pci_remove_smbiosname_file(pdev); -} | 
