xref: /linux/arch/s390/pci/pci_sysfs.c (revision 9294896e974eec9630cf9f81eb9a38d3869db105)
11e8da956SJan Glauber /*
21e8da956SJan Glauber  * Copyright IBM Corp. 2012
31e8da956SJan Glauber  *
41e8da956SJan Glauber  * Author(s):
51e8da956SJan Glauber  *   Jan Glauber <jang@linux.vnet.ibm.com>
61e8da956SJan Glauber  */
71e8da956SJan Glauber 
81e8da956SJan Glauber #define COMPONENT "zPCI"
91e8da956SJan Glauber #define pr_fmt(fmt) COMPONENT ": " fmt
101e8da956SJan Glauber 
111e8da956SJan Glauber #include <linux/kernel.h>
121e8da956SJan Glauber #include <linux/stat.h>
131e8da956SJan Glauber #include <linux/pci.h>
141e8da956SJan Glauber 
151e8da956SJan Glauber static ssize_t show_fid(struct device *dev, struct device_attribute *attr,
161e8da956SJan Glauber 			char *buf)
171e8da956SJan Glauber {
18*9294896eSSebastian Ott 	struct zpci_dev *zdev = get_zdev(to_pci_dev(dev));
191e8da956SJan Glauber 
201e8da956SJan Glauber 	sprintf(buf, "0x%08x\n", zdev->fid);
211e8da956SJan Glauber 	return strlen(buf);
221e8da956SJan Glauber }
231e8da956SJan Glauber static DEVICE_ATTR(function_id, S_IRUGO, show_fid, NULL);
241e8da956SJan Glauber 
251e8da956SJan Glauber static ssize_t show_fh(struct device *dev, struct device_attribute *attr,
261e8da956SJan Glauber 		       char *buf)
271e8da956SJan Glauber {
28*9294896eSSebastian Ott 	struct zpci_dev *zdev = get_zdev(to_pci_dev(dev));
291e8da956SJan Glauber 
301e8da956SJan Glauber 	sprintf(buf, "0x%08x\n", zdev->fh);
311e8da956SJan Glauber 	return strlen(buf);
321e8da956SJan Glauber }
331e8da956SJan Glauber static DEVICE_ATTR(function_handle, S_IRUGO, show_fh, NULL);
341e8da956SJan Glauber 
351e8da956SJan Glauber static ssize_t show_pchid(struct device *dev, struct device_attribute *attr,
361e8da956SJan Glauber 			  char *buf)
371e8da956SJan Glauber {
38*9294896eSSebastian Ott 	struct zpci_dev *zdev = get_zdev(to_pci_dev(dev));
391e8da956SJan Glauber 
401e8da956SJan Glauber 	sprintf(buf, "0x%04x\n", zdev->pchid);
411e8da956SJan Glauber 	return strlen(buf);
421e8da956SJan Glauber }
431e8da956SJan Glauber static DEVICE_ATTR(pchid, S_IRUGO, show_pchid, NULL);
441e8da956SJan Glauber 
451e8da956SJan Glauber static ssize_t show_pfgid(struct device *dev, struct device_attribute *attr,
461e8da956SJan Glauber 			  char *buf)
471e8da956SJan Glauber {
48*9294896eSSebastian Ott 	struct zpci_dev *zdev = get_zdev(to_pci_dev(dev));
491e8da956SJan Glauber 
501e8da956SJan Glauber 	sprintf(buf, "0x%02x\n", zdev->pfgid);
511e8da956SJan Glauber 	return strlen(buf);
521e8da956SJan Glauber }
531e8da956SJan Glauber static DEVICE_ATTR(pfgid, S_IRUGO, show_pfgid, NULL);
541e8da956SJan Glauber 
551e8da956SJan Glauber static struct device_attribute *zpci_dev_attrs[] = {
561e8da956SJan Glauber 	&dev_attr_function_id,
571e8da956SJan Glauber 	&dev_attr_function_handle,
581e8da956SJan Glauber 	&dev_attr_pchid,
591e8da956SJan Glauber 	&dev_attr_pfgid,
601e8da956SJan Glauber 	NULL,
611e8da956SJan Glauber };
621e8da956SJan Glauber 
631e8da956SJan Glauber int zpci_sysfs_add_device(struct device *dev)
641e8da956SJan Glauber {
651e8da956SJan Glauber 	int i, rc = 0;
661e8da956SJan Glauber 
671e8da956SJan Glauber 	for (i = 0; zpci_dev_attrs[i]; i++) {
681e8da956SJan Glauber 		rc = device_create_file(dev, zpci_dev_attrs[i]);
691e8da956SJan Glauber 		if (rc)
701e8da956SJan Glauber 			goto error;
711e8da956SJan Glauber 	}
721e8da956SJan Glauber 	return 0;
731e8da956SJan Glauber 
741e8da956SJan Glauber error:
751e8da956SJan Glauber 	while (--i >= 0)
761e8da956SJan Glauber 		device_remove_file(dev, zpci_dev_attrs[i]);
771e8da956SJan Glauber 	return rc;
781e8da956SJan Glauber }
791e8da956SJan Glauber 
801e8da956SJan Glauber void zpci_sysfs_remove_device(struct device *dev)
811e8da956SJan Glauber {
821e8da956SJan Glauber 	int i;
831e8da956SJan Glauber 
841e8da956SJan Glauber 	for (i = 0; zpci_dev_attrs[i]; i++)
851e8da956SJan Glauber 		device_remove_file(dev, zpci_dev_attrs[i]);
861e8da956SJan Glauber }
87