xref: /openbmc/linux/drivers/pci/pci-sysfs.c (revision 545e4006)
1 /*
2  * drivers/pci/pci-sysfs.c
3  *
4  * (C) Copyright 2002-2004 Greg Kroah-Hartman <greg@kroah.com>
5  * (C) Copyright 2002-2004 IBM Corp.
6  * (C) Copyright 2003 Matthew Wilcox
7  * (C) Copyright 2003 Hewlett-Packard
8  * (C) Copyright 2004 Jon Smirl <jonsmirl@yahoo.com>
9  * (C) Copyright 2004 Silicon Graphics, Inc. Jesse Barnes <jbarnes@sgi.com>
10  *
11  * File attributes for PCI devices
12  *
13  * Modeled after usb's driverfs.c
14  *
15  */
16 
17 
18 #include <linux/kernel.h>
19 #include <linux/pci.h>
20 #include <linux/stat.h>
21 #include <linux/topology.h>
22 #include <linux/mm.h>
23 #include <linux/capability.h>
24 #include <linux/pci-aspm.h>
25 #include "pci.h"
26 
27 static int sysfs_initialized;	/* = 0 */
28 
29 /* show configuration fields */
30 #define pci_config_attr(field, format_string)				\
31 static ssize_t								\
32 field##_show(struct device *dev, struct device_attribute *attr, char *buf)				\
33 {									\
34 	struct pci_dev *pdev;						\
35 									\
36 	pdev = to_pci_dev (dev);					\
37 	return sprintf (buf, format_string, pdev->field);		\
38 }
39 
40 pci_config_attr(vendor, "0x%04x\n");
41 pci_config_attr(device, "0x%04x\n");
42 pci_config_attr(subsystem_vendor, "0x%04x\n");
43 pci_config_attr(subsystem_device, "0x%04x\n");
44 pci_config_attr(class, "0x%06x\n");
45 pci_config_attr(irq, "%u\n");
46 
47 static ssize_t broken_parity_status_show(struct device *dev,
48 					 struct device_attribute *attr,
49 					 char *buf)
50 {
51 	struct pci_dev *pdev = to_pci_dev(dev);
52 	return sprintf (buf, "%u\n", pdev->broken_parity_status);
53 }
54 
55 static ssize_t broken_parity_status_store(struct device *dev,
56 					  struct device_attribute *attr,
57 					  const char *buf, size_t count)
58 {
59 	struct pci_dev *pdev = to_pci_dev(dev);
60 	ssize_t consumed = -EINVAL;
61 
62 	if ((count > 0) && (*buf == '0' || *buf == '1')) {
63 		pdev->broken_parity_status = *buf == '1' ? 1 : 0;
64 		consumed = count;
65 	}
66 	return consumed;
67 }
68 
69 static ssize_t local_cpus_show(struct device *dev,
70 			struct device_attribute *attr, char *buf)
71 {
72 	cpumask_t mask;
73 	int len;
74 
75 	mask = pcibus_to_cpumask(to_pci_dev(dev)->bus);
76 	len = cpumask_scnprintf(buf, PAGE_SIZE-2, mask);
77 	buf[len++] = '\n';
78 	buf[len] = '\0';
79 	return len;
80 }
81 
82 
83 static ssize_t local_cpulist_show(struct device *dev,
84 			struct device_attribute *attr, char *buf)
85 {
86 	cpumask_t mask;
87 	int len;
88 
89 	mask = pcibus_to_cpumask(to_pci_dev(dev)->bus);
90 	len = cpulist_scnprintf(buf, PAGE_SIZE-2, mask);
91 	buf[len++] = '\n';
92 	buf[len] = '\0';
93 	return len;
94 }
95 
96 /* show resources */
97 static ssize_t
98 resource_show(struct device * dev, struct device_attribute *attr, char * buf)
99 {
100 	struct pci_dev * pci_dev = to_pci_dev(dev);
101 	char * str = buf;
102 	int i;
103 	int max = 7;
104 	resource_size_t start, end;
105 
106 	if (pci_dev->subordinate)
107 		max = DEVICE_COUNT_RESOURCE;
108 
109 	for (i = 0; i < max; i++) {
110 		struct resource *res =  &pci_dev->resource[i];
111 		pci_resource_to_user(pci_dev, i, res, &start, &end);
112 		str += sprintf(str,"0x%016llx 0x%016llx 0x%016llx\n",
113 			       (unsigned long long)start,
114 			       (unsigned long long)end,
115 			       (unsigned long long)res->flags);
116 	}
117 	return (str - buf);
118 }
119 
120 static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf)
121 {
122 	struct pci_dev *pci_dev = to_pci_dev(dev);
123 
124 	return sprintf(buf, "pci:v%08Xd%08Xsv%08Xsd%08Xbc%02Xsc%02Xi%02x\n",
125 		       pci_dev->vendor, pci_dev->device,
126 		       pci_dev->subsystem_vendor, pci_dev->subsystem_device,
127 		       (u8)(pci_dev->class >> 16), (u8)(pci_dev->class >> 8),
128 		       (u8)(pci_dev->class));
129 }
130 
131 static ssize_t is_enabled_store(struct device *dev,
132 				struct device_attribute *attr, const char *buf,
133 				size_t count)
134 {
135 	ssize_t result = -EINVAL;
136 	struct pci_dev *pdev = to_pci_dev(dev);
137 
138 	/* this can crash the machine when done on the "wrong" device */
139 	if (!capable(CAP_SYS_ADMIN))
140 		return count;
141 
142 	if (*buf == '0') {
143 		if (atomic_read(&pdev->enable_cnt) != 0)
144 			pci_disable_device(pdev);
145 		else
146 			result = -EIO;
147 	} else if (*buf == '1')
148 		result = pci_enable_device(pdev);
149 
150 	return result < 0 ? result : count;
151 }
152 
153 static ssize_t is_enabled_show(struct device *dev,
154 			       struct device_attribute *attr, char *buf)
155 {
156 	struct pci_dev *pdev;
157 
158 	pdev = to_pci_dev (dev);
159 	return sprintf (buf, "%u\n", atomic_read(&pdev->enable_cnt));
160 }
161 
162 #ifdef CONFIG_NUMA
163 static ssize_t
164 numa_node_show(struct device *dev, struct device_attribute *attr, char *buf)
165 {
166 	return sprintf (buf, "%d\n", dev->numa_node);
167 }
168 #endif
169 
170 static ssize_t
171 msi_bus_show(struct device *dev, struct device_attribute *attr, char *buf)
172 {
173 	struct pci_dev *pdev = to_pci_dev(dev);
174 
175 	if (!pdev->subordinate)
176 		return 0;
177 
178 	return sprintf (buf, "%u\n",
179 			!(pdev->subordinate->bus_flags & PCI_BUS_FLAGS_NO_MSI));
180 }
181 
182 static ssize_t
183 msi_bus_store(struct device *dev, struct device_attribute *attr,
184 	      const char *buf, size_t count)
185 {
186 	struct pci_dev *pdev = to_pci_dev(dev);
187 
188 	/* bad things may happen if the no_msi flag is changed
189 	 * while some drivers are loaded */
190 	if (!capable(CAP_SYS_ADMIN))
191 		return count;
192 
193 	if (!pdev->subordinate)
194 		return count;
195 
196 	if (*buf == '0') {
197 		pdev->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI;
198 		dev_warn(&pdev->dev, "forced subordinate bus to not support MSI,"
199 			 " bad things could happen.\n");
200 	}
201 
202 	if (*buf == '1') {
203 		pdev->subordinate->bus_flags &= ~PCI_BUS_FLAGS_NO_MSI;
204 		dev_warn(&pdev->dev, "forced subordinate bus to support MSI,"
205 			 " bad things could happen.\n");
206 	}
207 
208 	return count;
209 }
210 
211 struct device_attribute pci_dev_attrs[] = {
212 	__ATTR_RO(resource),
213 	__ATTR_RO(vendor),
214 	__ATTR_RO(device),
215 	__ATTR_RO(subsystem_vendor),
216 	__ATTR_RO(subsystem_device),
217 	__ATTR_RO(class),
218 	__ATTR_RO(irq),
219 	__ATTR_RO(local_cpus),
220 	__ATTR_RO(local_cpulist),
221 	__ATTR_RO(modalias),
222 #ifdef CONFIG_NUMA
223 	__ATTR_RO(numa_node),
224 #endif
225 	__ATTR(enable, 0600, is_enabled_show, is_enabled_store),
226 	__ATTR(broken_parity_status,(S_IRUGO|S_IWUSR),
227 		broken_parity_status_show,broken_parity_status_store),
228 	__ATTR(msi_bus, 0644, msi_bus_show, msi_bus_store),
229 	__ATTR_NULL,
230 };
231 
232 static ssize_t
233 pci_read_config(struct kobject *kobj, struct bin_attribute *bin_attr,
234 		char *buf, loff_t off, size_t count)
235 {
236 	struct pci_dev *dev = to_pci_dev(container_of(kobj,struct device,kobj));
237 	unsigned int size = 64;
238 	loff_t init_off = off;
239 	u8 *data = (u8*) buf;
240 
241 	/* Several chips lock up trying to read undefined config space */
242 	if (capable(CAP_SYS_ADMIN)) {
243 		size = dev->cfg_size;
244 	} else if (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) {
245 		size = 128;
246 	}
247 
248 	if (off > size)
249 		return 0;
250 	if (off + count > size) {
251 		size -= off;
252 		count = size;
253 	} else {
254 		size = count;
255 	}
256 
257 	if ((off & 1) && size) {
258 		u8 val;
259 		pci_user_read_config_byte(dev, off, &val);
260 		data[off - init_off] = val;
261 		off++;
262 		size--;
263 	}
264 
265 	if ((off & 3) && size > 2) {
266 		u16 val;
267 		pci_user_read_config_word(dev, off, &val);
268 		data[off - init_off] = val & 0xff;
269 		data[off - init_off + 1] = (val >> 8) & 0xff;
270 		off += 2;
271 		size -= 2;
272 	}
273 
274 	while (size > 3) {
275 		u32 val;
276 		pci_user_read_config_dword(dev, off, &val);
277 		data[off - init_off] = val & 0xff;
278 		data[off - init_off + 1] = (val >> 8) & 0xff;
279 		data[off - init_off + 2] = (val >> 16) & 0xff;
280 		data[off - init_off + 3] = (val >> 24) & 0xff;
281 		off += 4;
282 		size -= 4;
283 	}
284 
285 	if (size >= 2) {
286 		u16 val;
287 		pci_user_read_config_word(dev, off, &val);
288 		data[off - init_off] = val & 0xff;
289 		data[off - init_off + 1] = (val >> 8) & 0xff;
290 		off += 2;
291 		size -= 2;
292 	}
293 
294 	if (size > 0) {
295 		u8 val;
296 		pci_user_read_config_byte(dev, off, &val);
297 		data[off - init_off] = val;
298 		off++;
299 		--size;
300 	}
301 
302 	return count;
303 }
304 
305 static ssize_t
306 pci_write_config(struct kobject *kobj, struct bin_attribute *bin_attr,
307 		 char *buf, loff_t off, size_t count)
308 {
309 	struct pci_dev *dev = to_pci_dev(container_of(kobj,struct device,kobj));
310 	unsigned int size = count;
311 	loff_t init_off = off;
312 	u8 *data = (u8*) buf;
313 
314 	if (off > dev->cfg_size)
315 		return 0;
316 	if (off + count > dev->cfg_size) {
317 		size = dev->cfg_size - off;
318 		count = size;
319 	}
320 
321 	if ((off & 1) && size) {
322 		pci_user_write_config_byte(dev, off, data[off - init_off]);
323 		off++;
324 		size--;
325 	}
326 
327 	if ((off & 3) && size > 2) {
328 		u16 val = data[off - init_off];
329 		val |= (u16) data[off - init_off + 1] << 8;
330                 pci_user_write_config_word(dev, off, val);
331                 off += 2;
332                 size -= 2;
333         }
334 
335 	while (size > 3) {
336 		u32 val = data[off - init_off];
337 		val |= (u32) data[off - init_off + 1] << 8;
338 		val |= (u32) data[off - init_off + 2] << 16;
339 		val |= (u32) data[off - init_off + 3] << 24;
340 		pci_user_write_config_dword(dev, off, val);
341 		off += 4;
342 		size -= 4;
343 	}
344 
345 	if (size >= 2) {
346 		u16 val = data[off - init_off];
347 		val |= (u16) data[off - init_off + 1] << 8;
348 		pci_user_write_config_word(dev, off, val);
349 		off += 2;
350 		size -= 2;
351 	}
352 
353 	if (size) {
354 		pci_user_write_config_byte(dev, off, data[off - init_off]);
355 		off++;
356 		--size;
357 	}
358 
359 	return count;
360 }
361 
362 static ssize_t
363 pci_read_vpd(struct kobject *kobj, struct bin_attribute *bin_attr,
364 	     char *buf, loff_t off, size_t count)
365 {
366 	struct pci_dev *dev =
367 		to_pci_dev(container_of(kobj, struct device, kobj));
368 	int end;
369 	int ret;
370 
371 	if (off > bin_attr->size)
372 		count = 0;
373 	else if (count > bin_attr->size - off)
374 		count = bin_attr->size - off;
375 	end = off + count;
376 
377 	while (off < end) {
378 		ret = dev->vpd->ops->read(dev, off, end - off, buf);
379 		if (ret < 0)
380 			return ret;
381 		buf += ret;
382 		off += ret;
383 	}
384 
385 	return count;
386 }
387 
388 static ssize_t
389 pci_write_vpd(struct kobject *kobj, struct bin_attribute *bin_attr,
390 	      char *buf, loff_t off, size_t count)
391 {
392 	struct pci_dev *dev =
393 		to_pci_dev(container_of(kobj, struct device, kobj));
394 	int end;
395 	int ret;
396 
397 	if (off > bin_attr->size)
398 		count = 0;
399 	else if (count > bin_attr->size - off)
400 		count = bin_attr->size - off;
401 	end = off + count;
402 
403 	while (off < end) {
404 		ret = dev->vpd->ops->write(dev, off, end - off, buf);
405 		if (ret < 0)
406 			return ret;
407 		buf += ret;
408 		off += ret;
409 	}
410 
411 	return count;
412 }
413 
414 #ifdef HAVE_PCI_LEGACY
415 /**
416  * pci_read_legacy_io - read byte(s) from legacy I/O port space
417  * @kobj: kobject corresponding to file to read from
418  * @buf: buffer to store results
419  * @off: offset into legacy I/O port space
420  * @count: number of bytes to read
421  *
422  * Reads 1, 2, or 4 bytes from legacy I/O port space using an arch specific
423  * callback routine (pci_legacy_read).
424  */
425 ssize_t
426 pci_read_legacy_io(struct kobject *kobj, struct bin_attribute *bin_attr,
427 		   char *buf, loff_t off, size_t count)
428 {
429         struct pci_bus *bus = to_pci_bus(container_of(kobj,
430                                                       struct device,
431 						      kobj));
432 
433         /* Only support 1, 2 or 4 byte accesses */
434         if (count != 1 && count != 2 && count != 4)
435                 return -EINVAL;
436 
437         return pci_legacy_read(bus, off, (u32 *)buf, count);
438 }
439 
440 /**
441  * pci_write_legacy_io - write byte(s) to legacy I/O port space
442  * @kobj: kobject corresponding to file to read from
443  * @buf: buffer containing value to be written
444  * @off: offset into legacy I/O port space
445  * @count: number of bytes to write
446  *
447  * Writes 1, 2, or 4 bytes from legacy I/O port space using an arch specific
448  * callback routine (pci_legacy_write).
449  */
450 ssize_t
451 pci_write_legacy_io(struct kobject *kobj, struct bin_attribute *bin_attr,
452 		    char *buf, loff_t off, size_t count)
453 {
454         struct pci_bus *bus = to_pci_bus(container_of(kobj,
455 						      struct device,
456 						      kobj));
457         /* Only support 1, 2 or 4 byte accesses */
458         if (count != 1 && count != 2 && count != 4)
459                 return -EINVAL;
460 
461         return pci_legacy_write(bus, off, *(u32 *)buf, count);
462 }
463 
464 /**
465  * pci_mmap_legacy_mem - map legacy PCI memory into user memory space
466  * @kobj: kobject corresponding to device to be mapped
467  * @attr: struct bin_attribute for this file
468  * @vma: struct vm_area_struct passed to mmap
469  *
470  * Uses an arch specific callback, pci_mmap_legacy_page_range, to mmap
471  * legacy memory space (first meg of bus space) into application virtual
472  * memory space.
473  */
474 int
475 pci_mmap_legacy_mem(struct kobject *kobj, struct bin_attribute *attr,
476                     struct vm_area_struct *vma)
477 {
478         struct pci_bus *bus = to_pci_bus(container_of(kobj,
479                                                       struct device,
480 						      kobj));
481 
482         return pci_mmap_legacy_page_range(bus, vma);
483 }
484 #endif /* HAVE_PCI_LEGACY */
485 
486 #ifdef HAVE_PCI_MMAP
487 /**
488  * pci_mmap_resource - map a PCI resource into user memory space
489  * @kobj: kobject for mapping
490  * @attr: struct bin_attribute for the file being mapped
491  * @vma: struct vm_area_struct passed into the mmap
492  * @write_combine: 1 for write_combine mapping
493  *
494  * Use the regular PCI mapping routines to map a PCI resource into userspace.
495  */
496 static int
497 pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr,
498 		  struct vm_area_struct *vma, int write_combine)
499 {
500 	struct pci_dev *pdev = to_pci_dev(container_of(kobj,
501 						       struct device, kobj));
502 	struct resource *res = (struct resource *)attr->private;
503 	enum pci_mmap_state mmap_type;
504 	resource_size_t start, end;
505 	int i;
506 
507 	for (i = 0; i < PCI_ROM_RESOURCE; i++)
508 		if (res == &pdev->resource[i])
509 			break;
510 	if (i >= PCI_ROM_RESOURCE)
511 		return -ENODEV;
512 
513 	/* pci_mmap_page_range() expects the same kind of entry as coming
514 	 * from /proc/bus/pci/ which is a "user visible" value. If this is
515 	 * different from the resource itself, arch will do necessary fixup.
516 	 */
517 	pci_resource_to_user(pdev, i, res, &start, &end);
518 	vma->vm_pgoff += start >> PAGE_SHIFT;
519 	mmap_type = res->flags & IORESOURCE_MEM ? pci_mmap_mem : pci_mmap_io;
520 
521 	return pci_mmap_page_range(pdev, vma, mmap_type, write_combine);
522 }
523 
524 static int
525 pci_mmap_resource_uc(struct kobject *kobj, struct bin_attribute *attr,
526 		     struct vm_area_struct *vma)
527 {
528 	return pci_mmap_resource(kobj, attr, vma, 0);
529 }
530 
531 static int
532 pci_mmap_resource_wc(struct kobject *kobj, struct bin_attribute *attr,
533 		     struct vm_area_struct *vma)
534 {
535 	return pci_mmap_resource(kobj, attr, vma, 1);
536 }
537 
538 /**
539  * pci_remove_resource_files - cleanup resource files
540  * @dev: dev to cleanup
541  *
542  * If we created resource files for @dev, remove them from sysfs and
543  * free their resources.
544  */
545 static void
546 pci_remove_resource_files(struct pci_dev *pdev)
547 {
548 	int i;
549 
550 	for (i = 0; i < PCI_ROM_RESOURCE; i++) {
551 		struct bin_attribute *res_attr;
552 
553 		res_attr = pdev->res_attr[i];
554 		if (res_attr) {
555 			sysfs_remove_bin_file(&pdev->dev.kobj, res_attr);
556 			kfree(res_attr);
557 		}
558 
559 		res_attr = pdev->res_attr_wc[i];
560 		if (res_attr) {
561 			sysfs_remove_bin_file(&pdev->dev.kobj, res_attr);
562 			kfree(res_attr);
563 		}
564 	}
565 }
566 
567 static int pci_create_attr(struct pci_dev *pdev, int num, int write_combine)
568 {
569 	/* allocate attribute structure, piggyback attribute name */
570 	int name_len = write_combine ? 13 : 10;
571 	struct bin_attribute *res_attr;
572 	int retval;
573 
574 	res_attr = kzalloc(sizeof(*res_attr) + name_len, GFP_ATOMIC);
575 	if (res_attr) {
576 		char *res_attr_name = (char *)(res_attr + 1);
577 
578 		if (write_combine) {
579 			pdev->res_attr_wc[num] = res_attr;
580 			sprintf(res_attr_name, "resource%d_wc", num);
581 			res_attr->mmap = pci_mmap_resource_wc;
582 		} else {
583 			pdev->res_attr[num] = res_attr;
584 			sprintf(res_attr_name, "resource%d", num);
585 			res_attr->mmap = pci_mmap_resource_uc;
586 		}
587 		res_attr->attr.name = res_attr_name;
588 		res_attr->attr.mode = S_IRUSR | S_IWUSR;
589 		res_attr->size = pci_resource_len(pdev, num);
590 		res_attr->private = &pdev->resource[num];
591 		retval = sysfs_create_bin_file(&pdev->dev.kobj, res_attr);
592 	} else
593 		retval = -ENOMEM;
594 
595 	return retval;
596 }
597 
598 /**
599  * pci_create_resource_files - create resource files in sysfs for @dev
600  * @dev: dev in question
601  *
602  * Walk the resources in @dev creating files for each resource available.
603  */
604 static int pci_create_resource_files(struct pci_dev *pdev)
605 {
606 	int i;
607 	int retval;
608 
609 	/* Expose the PCI resources from this device as files */
610 	for (i = 0; i < PCI_ROM_RESOURCE; i++) {
611 
612 		/* skip empty resources */
613 		if (!pci_resource_len(pdev, i))
614 			continue;
615 
616 		retval = pci_create_attr(pdev, i, 0);
617 		/* for prefetchable resources, create a WC mappable file */
618 		if (!retval && pdev->resource[i].flags & IORESOURCE_PREFETCH)
619 			retval = pci_create_attr(pdev, i, 1);
620 
621 		if (retval) {
622 			pci_remove_resource_files(pdev);
623 			return retval;
624 		}
625 	}
626 	return 0;
627 }
628 #else /* !HAVE_PCI_MMAP */
629 static inline int pci_create_resource_files(struct pci_dev *dev) { return 0; }
630 static inline void pci_remove_resource_files(struct pci_dev *dev) { return; }
631 #endif /* HAVE_PCI_MMAP */
632 
633 /**
634  * pci_write_rom - used to enable access to the PCI ROM display
635  * @kobj: kernel object handle
636  * @buf: user input
637  * @off: file offset
638  * @count: number of byte in input
639  *
640  * writing anything except 0 enables it
641  */
642 static ssize_t
643 pci_write_rom(struct kobject *kobj, struct bin_attribute *bin_attr,
644 	      char *buf, loff_t off, size_t count)
645 {
646 	struct pci_dev *pdev = to_pci_dev(container_of(kobj, struct device, kobj));
647 
648 	if ((off ==  0) && (*buf == '0') && (count == 2))
649 		pdev->rom_attr_enabled = 0;
650 	else
651 		pdev->rom_attr_enabled = 1;
652 
653 	return count;
654 }
655 
656 /**
657  * pci_read_rom - read a PCI ROM
658  * @kobj: kernel object handle
659  * @buf: where to put the data we read from the ROM
660  * @off: file offset
661  * @count: number of bytes to read
662  *
663  * Put @count bytes starting at @off into @buf from the ROM in the PCI
664  * device corresponding to @kobj.
665  */
666 static ssize_t
667 pci_read_rom(struct kobject *kobj, struct bin_attribute *bin_attr,
668 	     char *buf, loff_t off, size_t count)
669 {
670 	struct pci_dev *pdev = to_pci_dev(container_of(kobj, struct device, kobj));
671 	void __iomem *rom;
672 	size_t size;
673 
674 	if (!pdev->rom_attr_enabled)
675 		return -EINVAL;
676 
677 	rom = pci_map_rom(pdev, &size);	/* size starts out as PCI window size */
678 	if (!rom)
679 		return 0;
680 
681 	if (off >= size)
682 		count = 0;
683 	else {
684 		if (off + count > size)
685 			count = size - off;
686 
687 		memcpy_fromio(buf, rom + off, count);
688 	}
689 	pci_unmap_rom(pdev, rom);
690 
691 	return count;
692 }
693 
694 static struct bin_attribute pci_config_attr = {
695 	.attr =	{
696 		.name = "config",
697 		.mode = S_IRUGO | S_IWUSR,
698 	},
699 	.size = 256,
700 	.read = pci_read_config,
701 	.write = pci_write_config,
702 };
703 
704 static struct bin_attribute pcie_config_attr = {
705 	.attr =	{
706 		.name = "config",
707 		.mode = S_IRUGO | S_IWUSR,
708 	},
709 	.size = 4096,
710 	.read = pci_read_config,
711 	.write = pci_write_config,
712 };
713 
714 int __attribute__ ((weak)) pcibios_add_platform_entries(struct pci_dev *dev)
715 {
716 	return 0;
717 }
718 
719 int __must_check pci_create_sysfs_dev_files (struct pci_dev *pdev)
720 {
721 	struct bin_attribute *attr = NULL;
722 	int retval;
723 
724 	if (!sysfs_initialized)
725 		return -EACCES;
726 
727 	if (pdev->cfg_size < 4096)
728 		retval = sysfs_create_bin_file(&pdev->dev.kobj, &pci_config_attr);
729 	else
730 		retval = sysfs_create_bin_file(&pdev->dev.kobj, &pcie_config_attr);
731 	if (retval)
732 		goto err;
733 
734 	/* If the device has VPD, try to expose it in sysfs. */
735 	if (pdev->vpd) {
736 		attr = kzalloc(sizeof(*attr), GFP_ATOMIC);
737 		if (attr) {
738 			pdev->vpd->attr = attr;
739 			attr->size = pdev->vpd->len;
740 			attr->attr.name = "vpd";
741 			attr->attr.mode = S_IRUSR | S_IWUSR;
742 			attr->read = pci_read_vpd;
743 			attr->write = pci_write_vpd;
744 			retval = sysfs_create_bin_file(&pdev->dev.kobj, attr);
745 			if (retval)
746 				goto err_vpd;
747 		} else {
748 			retval = -ENOMEM;
749 			goto err_config_file;
750 		}
751 	}
752 
753 	retval = pci_create_resource_files(pdev);
754 	if (retval)
755 		goto err_vpd_file;
756 
757 	/* If the device has a ROM, try to expose it in sysfs. */
758 	if (pci_resource_len(pdev, PCI_ROM_RESOURCE) ||
759 	    (pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW)) {
760 		attr = kzalloc(sizeof(*attr), GFP_ATOMIC);
761 		if (attr) {
762 			pdev->rom_attr = attr;
763 			attr->size = pci_resource_len(pdev, PCI_ROM_RESOURCE);
764 			attr->attr.name = "rom";
765 			attr->attr.mode = S_IRUSR;
766 			attr->read = pci_read_rom;
767 			attr->write = pci_write_rom;
768 			retval = sysfs_create_bin_file(&pdev->dev.kobj, attr);
769 			if (retval)
770 				goto err_rom;
771 		} else {
772 			retval = -ENOMEM;
773 			goto err_resource_files;
774 		}
775 	}
776 	/* add platform-specific attributes */
777 	if (pcibios_add_platform_entries(pdev))
778 		goto err_rom_file;
779 
780 	pcie_aspm_create_sysfs_dev_files(pdev);
781 
782 	return 0;
783 
784 err_rom_file:
785 	if (pci_resource_len(pdev, PCI_ROM_RESOURCE))
786 		sysfs_remove_bin_file(&pdev->dev.kobj, pdev->rom_attr);
787 err_rom:
788 	kfree(pdev->rom_attr);
789 err_resource_files:
790 	pci_remove_resource_files(pdev);
791 err_vpd_file:
792 	if (pdev->vpd) {
793 		sysfs_remove_bin_file(&pdev->dev.kobj, pdev->vpd->attr);
794 err_vpd:
795 		kfree(pdev->vpd->attr);
796 	}
797 err_config_file:
798 	if (pdev->cfg_size < 4096)
799 		sysfs_remove_bin_file(&pdev->dev.kobj, &pci_config_attr);
800 	else
801 		sysfs_remove_bin_file(&pdev->dev.kobj, &pcie_config_attr);
802 err:
803 	return retval;
804 }
805 
806 /**
807  * pci_remove_sysfs_dev_files - cleanup PCI specific sysfs files
808  * @pdev: device whose entries we should free
809  *
810  * Cleanup when @pdev is removed from sysfs.
811  */
812 void pci_remove_sysfs_dev_files(struct pci_dev *pdev)
813 {
814 	if (!sysfs_initialized)
815 		return;
816 
817 	pcie_aspm_remove_sysfs_dev_files(pdev);
818 
819 	if (pdev->vpd) {
820 		sysfs_remove_bin_file(&pdev->dev.kobj, pdev->vpd->attr);
821 		kfree(pdev->vpd->attr);
822 	}
823 	if (pdev->cfg_size < 4096)
824 		sysfs_remove_bin_file(&pdev->dev.kobj, &pci_config_attr);
825 	else
826 		sysfs_remove_bin_file(&pdev->dev.kobj, &pcie_config_attr);
827 
828 	pci_remove_resource_files(pdev);
829 
830 	if (pci_resource_len(pdev, PCI_ROM_RESOURCE)) {
831 		if (pdev->rom_attr) {
832 			sysfs_remove_bin_file(&pdev->dev.kobj, pdev->rom_attr);
833 			kfree(pdev->rom_attr);
834 		}
835 	}
836 }
837 
838 static int __init pci_sysfs_init(void)
839 {
840 	struct pci_dev *pdev = NULL;
841 	int retval;
842 
843 	sysfs_initialized = 1;
844 	for_each_pci_dev(pdev) {
845 		retval = pci_create_sysfs_dev_files(pdev);
846 		if (retval) {
847 			pci_dev_put(pdev);
848 			return retval;
849 		}
850 	}
851 
852 	return 0;
853 }
854 
855 late_initcall(pci_sysfs_init);
856