xref: /linux/arch/s390/pci/pci_sysfs.c (revision 80b054ba2ab1c46e6c34c6a54f542d8f7ad77fca)
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 {
189294896eSSebastian Ott 	struct zpci_dev *zdev = get_zdev(to_pci_dev(dev));
191e8da956SJan Glauber 
20*80b054baSSebastian Ott 	return sprintf(buf, "0x%08x\n", zdev->fid);
211e8da956SJan Glauber }
221e8da956SJan Glauber static DEVICE_ATTR(function_id, S_IRUGO, show_fid, NULL);
231e8da956SJan Glauber 
241e8da956SJan Glauber static ssize_t show_fh(struct device *dev, struct device_attribute *attr,
251e8da956SJan Glauber 		       char *buf)
261e8da956SJan Glauber {
279294896eSSebastian Ott 	struct zpci_dev *zdev = get_zdev(to_pci_dev(dev));
281e8da956SJan Glauber 
29*80b054baSSebastian Ott 	return sprintf(buf, "0x%08x\n", zdev->fh);
301e8da956SJan Glauber }
311e8da956SJan Glauber static DEVICE_ATTR(function_handle, S_IRUGO, show_fh, NULL);
321e8da956SJan Glauber 
331e8da956SJan Glauber static ssize_t show_pchid(struct device *dev, struct device_attribute *attr,
341e8da956SJan Glauber 			  char *buf)
351e8da956SJan Glauber {
369294896eSSebastian Ott 	struct zpci_dev *zdev = get_zdev(to_pci_dev(dev));
371e8da956SJan Glauber 
38*80b054baSSebastian Ott 	return sprintf(buf, "0x%04x\n", zdev->pchid);
391e8da956SJan Glauber }
401e8da956SJan Glauber static DEVICE_ATTR(pchid, S_IRUGO, show_pchid, NULL);
411e8da956SJan Glauber 
421e8da956SJan Glauber static ssize_t show_pfgid(struct device *dev, struct device_attribute *attr,
431e8da956SJan Glauber 			  char *buf)
441e8da956SJan Glauber {
459294896eSSebastian Ott 	struct zpci_dev *zdev = get_zdev(to_pci_dev(dev));
461e8da956SJan Glauber 
47*80b054baSSebastian Ott 	return sprintf(buf, "0x%02x\n", zdev->pfgid);
481e8da956SJan Glauber }
491e8da956SJan Glauber static DEVICE_ATTR(pfgid, S_IRUGO, show_pfgid, NULL);
501e8da956SJan Glauber 
511e8da956SJan Glauber static struct device_attribute *zpci_dev_attrs[] = {
521e8da956SJan Glauber 	&dev_attr_function_id,
531e8da956SJan Glauber 	&dev_attr_function_handle,
541e8da956SJan Glauber 	&dev_attr_pchid,
551e8da956SJan Glauber 	&dev_attr_pfgid,
561e8da956SJan Glauber 	NULL,
571e8da956SJan Glauber };
581e8da956SJan Glauber 
591e8da956SJan Glauber int zpci_sysfs_add_device(struct device *dev)
601e8da956SJan Glauber {
611e8da956SJan Glauber 	int i, rc = 0;
621e8da956SJan Glauber 
631e8da956SJan Glauber 	for (i = 0; zpci_dev_attrs[i]; i++) {
641e8da956SJan Glauber 		rc = device_create_file(dev, zpci_dev_attrs[i]);
651e8da956SJan Glauber 		if (rc)
661e8da956SJan Glauber 			goto error;
671e8da956SJan Glauber 	}
681e8da956SJan Glauber 	return 0;
691e8da956SJan Glauber 
701e8da956SJan Glauber error:
711e8da956SJan Glauber 	while (--i >= 0)
721e8da956SJan Glauber 		device_remove_file(dev, zpci_dev_attrs[i]);
731e8da956SJan Glauber 	return rc;
741e8da956SJan Glauber }
751e8da956SJan Glauber 
761e8da956SJan Glauber void zpci_sysfs_remove_device(struct device *dev)
771e8da956SJan Glauber {
781e8da956SJan Glauber 	int i;
791e8da956SJan Glauber 
801e8da956SJan Glauber 	for (i = 0; zpci_dev_attrs[i]; i++)
811e8da956SJan Glauber 		device_remove_file(dev, zpci_dev_attrs[i]);
821e8da956SJan Glauber }
83