Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0
2 : : /*
3 : : * (C) Copyright 2002-2004 Greg Kroah-Hartman <greg@kroah.com>
4 : : * (C) Copyright 2002-2004 IBM Corp.
5 : : * (C) Copyright 2003 Matthew Wilcox
6 : : * (C) Copyright 2003 Hewlett-Packard
7 : : * (C) Copyright 2004 Jon Smirl <jonsmirl@yahoo.com>
8 : : * (C) Copyright 2004 Silicon Graphics, Inc. Jesse Barnes <jbarnes@sgi.com>
9 : : *
10 : : * File attributes for PCI devices
11 : : *
12 : : * Modeled after usb's driverfs.c
13 : : */
14 : :
15 : :
16 : : #include <linux/kernel.h>
17 : : #include <linux/sched.h>
18 : : #include <linux/pci.h>
19 : : #include <linux/stat.h>
20 : : #include <linux/export.h>
21 : : #include <linux/topology.h>
22 : : #include <linux/mm.h>
23 : : #include <linux/fs.h>
24 : : #include <linux/capability.h>
25 : : #include <linux/security.h>
26 : : #include <linux/slab.h>
27 : : #include <linux/vgaarb.h>
28 : : #include <linux/pm_runtime.h>
29 : : #include <linux/of.h>
30 : : #include "pci.h"
31 : :
32 : : static int sysfs_initialized; /* = 0 */
33 : :
34 : : /* show configuration fields */
35 : : #define pci_config_attr(field, format_string) \
36 : : static ssize_t \
37 : : field##_show(struct device *dev, struct device_attribute *attr, char *buf) \
38 : : { \
39 : : struct pci_dev *pdev; \
40 : : \
41 : : pdev = to_pci_dev(dev); \
42 : : return sprintf(buf, format_string, pdev->field); \
43 : : } \
44 : : static DEVICE_ATTR_RO(field)
45 : :
46 : 77 : pci_config_attr(vendor, "0x%04x\n");
47 : 0 : pci_config_attr(device, "0x%04x\n");
48 : 0 : pci_config_attr(subsystem_vendor, "0x%04x\n");
49 : 0 : pci_config_attr(subsystem_device, "0x%04x\n");
50 : 0 : pci_config_attr(revision, "0x%02x\n");
51 : 0 : pci_config_attr(class, "0x%06x\n");
52 : 0 : pci_config_attr(irq, "%u\n");
53 : :
54 : 0 : static ssize_t broken_parity_status_show(struct device *dev,
55 : : struct device_attribute *attr,
56 : : char *buf)
57 : : {
58 : 0 : struct pci_dev *pdev = to_pci_dev(dev);
59 : 0 : return sprintf(buf, "%u\n", pdev->broken_parity_status);
60 : : }
61 : :
62 : 0 : static ssize_t broken_parity_status_store(struct device *dev,
63 : : struct device_attribute *attr,
64 : : const char *buf, size_t count)
65 : : {
66 : 0 : struct pci_dev *pdev = to_pci_dev(dev);
67 : 0 : unsigned long val;
68 : :
69 [ # # ]: 0 : if (kstrtoul(buf, 0, &val) < 0)
70 : : return -EINVAL;
71 : :
72 : 0 : pdev->broken_parity_status = !!val;
73 : :
74 : 0 : return count;
75 : : }
76 : : static DEVICE_ATTR_RW(broken_parity_status);
77 : :
78 : 0 : static ssize_t pci_dev_show_local_cpu(struct device *dev, bool list,
79 : : struct device_attribute *attr, char *buf)
80 : : {
81 : 0 : const struct cpumask *mask;
82 : :
83 : : #ifdef CONFIG_NUMA
84 : 0 : mask = (dev_to_node(dev) == -1) ? cpu_online_mask :
85 : : cpumask_of_node(dev_to_node(dev));
86 : : #else
87 : : mask = cpumask_of_pcibus(to_pci_dev(dev)->bus);
88 : : #endif
89 : 0 : return cpumap_print_to_pagebuf(list, buf, mask);
90 : : }
91 : :
92 : 0 : static ssize_t local_cpus_show(struct device *dev,
93 : : struct device_attribute *attr, char *buf)
94 : : {
95 [ # # ]: 0 : return pci_dev_show_local_cpu(dev, false, attr, buf);
96 : : }
97 : : static DEVICE_ATTR_RO(local_cpus);
98 : :
99 : 0 : static ssize_t local_cpulist_show(struct device *dev,
100 : : struct device_attribute *attr, char *buf)
101 : : {
102 [ # # ]: 0 : return pci_dev_show_local_cpu(dev, true, attr, buf);
103 : : }
104 : : static DEVICE_ATTR_RO(local_cpulist);
105 : :
106 : : /*
107 : : * PCI Bus Class Devices
108 : : */
109 : 0 : static ssize_t cpuaffinity_show(struct device *dev,
110 : : struct device_attribute *attr, char *buf)
111 : : {
112 [ # # ]: 0 : const struct cpumask *cpumask = cpumask_of_pcibus(to_pci_bus(dev));
113 : :
114 : 0 : return cpumap_print_to_pagebuf(false, buf, cpumask);
115 : : }
116 : : static DEVICE_ATTR_RO(cpuaffinity);
117 : :
118 : 0 : static ssize_t cpulistaffinity_show(struct device *dev,
119 : : struct device_attribute *attr, char *buf)
120 : : {
121 [ # # ]: 0 : const struct cpumask *cpumask = cpumask_of_pcibus(to_pci_bus(dev));
122 : :
123 : 0 : return cpumap_print_to_pagebuf(true, buf, cpumask);
124 : : }
125 : : static DEVICE_ATTR_RO(cpulistaffinity);
126 : :
127 : : /* show resources */
128 : 0 : static ssize_t resource_show(struct device *dev, struct device_attribute *attr,
129 : : char *buf)
130 : : {
131 : 0 : struct pci_dev *pci_dev = to_pci_dev(dev);
132 : 0 : char *str = buf;
133 : 0 : int i;
134 : 0 : int max;
135 : 0 : resource_size_t start, end;
136 : :
137 [ # # ]: 0 : if (pci_dev->subordinate)
138 : : max = DEVICE_COUNT_RESOURCE;
139 : : else
140 : 0 : max = PCI_BRIDGE_RESOURCES;
141 : :
142 [ # # ]: 0 : for (i = 0; i < max; i++) {
143 : 0 : struct resource *res = &pci_dev->resource[i];
144 : 0 : pci_resource_to_user(pci_dev, i, res, &start, &end);
145 : 0 : str += sprintf(str, "0x%016llx 0x%016llx 0x%016llx\n",
146 : : (unsigned long long)start,
147 : : (unsigned long long)end,
148 : 0 : (unsigned long long)res->flags);
149 : : }
150 : 0 : return (str - buf);
151 : : }
152 : : static DEVICE_ATTR_RO(resource);
153 : :
154 : 0 : static ssize_t max_link_speed_show(struct device *dev,
155 : : struct device_attribute *attr, char *buf)
156 : : {
157 : 0 : struct pci_dev *pdev = to_pci_dev(dev);
158 : :
159 [ # # # # : 0 : return sprintf(buf, "%s\n", PCIE_SPEED2STR(pcie_get_speed_cap(pdev)));
# # # # ]
160 : : }
161 : : static DEVICE_ATTR_RO(max_link_speed);
162 : :
163 : 0 : static ssize_t max_link_width_show(struct device *dev,
164 : : struct device_attribute *attr, char *buf)
165 : : {
166 : 0 : struct pci_dev *pdev = to_pci_dev(dev);
167 : :
168 : 0 : return sprintf(buf, "%u\n", pcie_get_width_cap(pdev));
169 : : }
170 : : static DEVICE_ATTR_RO(max_link_width);
171 : :
172 : 0 : static ssize_t current_link_speed_show(struct device *dev,
173 : : struct device_attribute *attr, char *buf)
174 : : {
175 : 0 : struct pci_dev *pci_dev = to_pci_dev(dev);
176 : 0 : u16 linkstat;
177 : 0 : int err;
178 : 0 : const char *speed;
179 : :
180 : 0 : err = pcie_capability_read_word(pci_dev, PCI_EXP_LNKSTA, &linkstat);
181 [ # # ]: 0 : if (err)
182 : : return -EINVAL;
183 : :
184 [ # # ]: 0 : switch (linkstat & PCI_EXP_LNKSTA_CLS) {
185 : : case PCI_EXP_LNKSTA_CLS_32_0GB:
186 : : speed = "32 GT/s";
187 : : break;
188 : : case PCI_EXP_LNKSTA_CLS_16_0GB:
189 : : speed = "16 GT/s";
190 : : break;
191 : : case PCI_EXP_LNKSTA_CLS_8_0GB:
192 : : speed = "8 GT/s";
193 : : break;
194 : : case PCI_EXP_LNKSTA_CLS_5_0GB:
195 : : speed = "5 GT/s";
196 : : break;
197 : : case PCI_EXP_LNKSTA_CLS_2_5GB:
198 : : speed = "2.5 GT/s";
199 : : break;
200 : : default:
201 : : speed = "Unknown speed";
202 : : }
203 : :
204 : 0 : return sprintf(buf, "%s\n", speed);
205 : : }
206 : : static DEVICE_ATTR_RO(current_link_speed);
207 : :
208 : 0 : static ssize_t current_link_width_show(struct device *dev,
209 : : struct device_attribute *attr, char *buf)
210 : : {
211 : 0 : struct pci_dev *pci_dev = to_pci_dev(dev);
212 : 0 : u16 linkstat;
213 : 0 : int err;
214 : :
215 : 0 : err = pcie_capability_read_word(pci_dev, PCI_EXP_LNKSTA, &linkstat);
216 [ # # ]: 0 : if (err)
217 : : return -EINVAL;
218 : :
219 : 0 : return sprintf(buf, "%u\n",
220 : 0 : (linkstat & PCI_EXP_LNKSTA_NLW) >> PCI_EXP_LNKSTA_NLW_SHIFT);
221 : : }
222 : : static DEVICE_ATTR_RO(current_link_width);
223 : :
224 : 0 : static ssize_t secondary_bus_number_show(struct device *dev,
225 : : struct device_attribute *attr,
226 : : char *buf)
227 : : {
228 : 0 : struct pci_dev *pci_dev = to_pci_dev(dev);
229 : 0 : u8 sec_bus;
230 : 0 : int err;
231 : :
232 : 0 : err = pci_read_config_byte(pci_dev, PCI_SECONDARY_BUS, &sec_bus);
233 [ # # ]: 0 : if (err)
234 : : return -EINVAL;
235 : :
236 : 0 : return sprintf(buf, "%u\n", sec_bus);
237 : : }
238 : : static DEVICE_ATTR_RO(secondary_bus_number);
239 : :
240 : 0 : static ssize_t subordinate_bus_number_show(struct device *dev,
241 : : struct device_attribute *attr,
242 : : char *buf)
243 : : {
244 : 0 : struct pci_dev *pci_dev = to_pci_dev(dev);
245 : 0 : u8 sub_bus;
246 : 0 : int err;
247 : :
248 : 0 : err = pci_read_config_byte(pci_dev, PCI_SUBORDINATE_BUS, &sub_bus);
249 [ # # ]: 0 : if (err)
250 : : return -EINVAL;
251 : :
252 : 0 : return sprintf(buf, "%u\n", sub_bus);
253 : : }
254 : : static DEVICE_ATTR_RO(subordinate_bus_number);
255 : :
256 : 0 : static ssize_t ari_enabled_show(struct device *dev,
257 : : struct device_attribute *attr,
258 : : char *buf)
259 : : {
260 : 0 : struct pci_dev *pci_dev = to_pci_dev(dev);
261 : :
262 [ # # ]: 0 : return sprintf(buf, "%u\n", pci_ari_enabled(pci_dev->bus));
263 : : }
264 : : static DEVICE_ATTR_RO(ari_enabled);
265 : :
266 : 77 : static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
267 : : char *buf)
268 : : {
269 : 77 : struct pci_dev *pci_dev = to_pci_dev(dev);
270 : :
271 : 77 : return sprintf(buf, "pci:v%08Xd%08Xsv%08Xsd%08Xbc%02Xsc%02Xi%02X\n",
272 : 77 : pci_dev->vendor, pci_dev->device,
273 : 77 : pci_dev->subsystem_vendor, pci_dev->subsystem_device,
274 : 77 : (u8)(pci_dev->class >> 16), (u8)(pci_dev->class >> 8),
275 : 77 : (u8)(pci_dev->class));
276 : : }
277 : : static DEVICE_ATTR_RO(modalias);
278 : :
279 : 0 : static ssize_t enable_store(struct device *dev, struct device_attribute *attr,
280 : : const char *buf, size_t count)
281 : : {
282 : 0 : struct pci_dev *pdev = to_pci_dev(dev);
283 : 0 : unsigned long val;
284 : 0 : ssize_t result = kstrtoul(buf, 0, &val);
285 : :
286 [ # # ]: 0 : if (result < 0)
287 : : return result;
288 : :
289 : : /* this can crash the machine when done on the "wrong" device */
290 [ # # ]: 0 : if (!capable(CAP_SYS_ADMIN))
291 : : return -EPERM;
292 : :
293 : 0 : device_lock(dev);
294 [ # # ]: 0 : if (dev->driver)
295 : : result = -EBUSY;
296 [ # # ]: 0 : else if (val)
297 : 0 : result = pci_enable_device(pdev);
298 [ # # ]: 0 : else if (pci_is_enabled(pdev))
299 : 0 : pci_disable_device(pdev);
300 : : else
301 : : result = -EIO;
302 : 0 : device_unlock(dev);
303 : :
304 [ # # ]: 0 : return result < 0 ? result : count;
305 : : }
306 : :
307 : 0 : static ssize_t enable_show(struct device *dev, struct device_attribute *attr,
308 : : char *buf)
309 : : {
310 : 0 : struct pci_dev *pdev;
311 : :
312 : 0 : pdev = to_pci_dev(dev);
313 : 0 : return sprintf(buf, "%u\n", atomic_read(&pdev->enable_cnt));
314 : : }
315 : : static DEVICE_ATTR_RW(enable);
316 : :
317 : : #ifdef CONFIG_NUMA
318 : 0 : static ssize_t numa_node_store(struct device *dev,
319 : : struct device_attribute *attr, const char *buf,
320 : : size_t count)
321 : : {
322 : 0 : struct pci_dev *pdev = to_pci_dev(dev);
323 : 0 : int node, ret;
324 : :
325 [ # # ]: 0 : if (!capable(CAP_SYS_ADMIN))
326 : : return -EPERM;
327 : :
328 : 0 : ret = kstrtoint(buf, 0, &node);
329 [ # # ]: 0 : if (ret)
330 : 0 : return ret;
331 : :
332 [ # # ]: 0 : if ((node < 0 && node != NUMA_NO_NODE) || node >= MAX_NUMNODES)
333 : : return -EINVAL;
334 : :
335 [ # # # # ]: 0 : if (node != NUMA_NO_NODE && !node_online(node))
336 : : return -EINVAL;
337 : :
338 : 0 : add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
339 : 0 : pci_alert(pdev, FW_BUG "Overriding NUMA node to %d. Contact your vendor for updates.",
340 : : node);
341 : :
342 : 0 : dev->numa_node = node;
343 : 0 : return count;
344 : : }
345 : :
346 : 0 : static ssize_t numa_node_show(struct device *dev, struct device_attribute *attr,
347 : : char *buf)
348 : : {
349 : 0 : return sprintf(buf, "%d\n", dev->numa_node);
350 : : }
351 : : static DEVICE_ATTR_RW(numa_node);
352 : : #endif
353 : :
354 : 0 : static ssize_t dma_mask_bits_show(struct device *dev,
355 : : struct device_attribute *attr, char *buf)
356 : : {
357 : 0 : struct pci_dev *pdev = to_pci_dev(dev);
358 : :
359 : 0 : return sprintf(buf, "%d\n", fls64(pdev->dma_mask));
360 : : }
361 : : static DEVICE_ATTR_RO(dma_mask_bits);
362 : :
363 : 0 : static ssize_t consistent_dma_mask_bits_show(struct device *dev,
364 : : struct device_attribute *attr,
365 : : char *buf)
366 : : {
367 : 0 : return sprintf(buf, "%d\n", fls64(dev->coherent_dma_mask));
368 : : }
369 : : static DEVICE_ATTR_RO(consistent_dma_mask_bits);
370 : :
371 : 0 : static ssize_t msi_bus_show(struct device *dev, struct device_attribute *attr,
372 : : char *buf)
373 : : {
374 : 0 : struct pci_dev *pdev = to_pci_dev(dev);
375 : 0 : struct pci_bus *subordinate = pdev->subordinate;
376 : :
377 [ # # ]: 0 : return sprintf(buf, "%u\n", subordinate ?
378 : 0 : !(subordinate->bus_flags & PCI_BUS_FLAGS_NO_MSI)
379 : 0 : : !pdev->no_msi);
380 : : }
381 : :
382 : 0 : static ssize_t msi_bus_store(struct device *dev, struct device_attribute *attr,
383 : : const char *buf, size_t count)
384 : : {
385 : 0 : struct pci_dev *pdev = to_pci_dev(dev);
386 : 0 : struct pci_bus *subordinate = pdev->subordinate;
387 : 0 : unsigned long val;
388 : :
389 [ # # ]: 0 : if (kstrtoul(buf, 0, &val) < 0)
390 : : return -EINVAL;
391 : :
392 [ # # ]: 0 : if (!capable(CAP_SYS_ADMIN))
393 : : return -EPERM;
394 : :
395 : : /*
396 : : * "no_msi" and "bus_flags" only affect what happens when a driver
397 : : * requests MSI or MSI-X. They don't affect any drivers that have
398 : : * already requested MSI or MSI-X.
399 : : */
400 [ # # ]: 0 : if (!subordinate) {
401 : 0 : pdev->no_msi = !val;
402 [ # # ]: 0 : pci_info(pdev, "MSI/MSI-X %s for future drivers\n",
403 : : val ? "allowed" : "disallowed");
404 : 0 : return count;
405 : : }
406 : :
407 [ # # ]: 0 : if (val)
408 : 0 : subordinate->bus_flags &= ~PCI_BUS_FLAGS_NO_MSI;
409 : : else
410 : 0 : subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI;
411 : :
412 [ # # ]: 0 : dev_info(&subordinate->dev, "MSI/MSI-X %s for future drivers of devices on this bus\n",
413 : : val ? "allowed" : "disallowed");
414 : 0 : return count;
415 : : }
416 : : static DEVICE_ATTR_RW(msi_bus);
417 : :
418 : 0 : static ssize_t rescan_store(struct bus_type *bus, const char *buf, size_t count)
419 : : {
420 : 0 : unsigned long val;
421 : 0 : struct pci_bus *b = NULL;
422 : :
423 [ # # ]: 0 : if (kstrtoul(buf, 0, &val) < 0)
424 : : return -EINVAL;
425 : :
426 [ # # ]: 0 : if (val) {
427 : 0 : pci_lock_rescan_remove();
428 [ # # ]: 0 : while ((b = pci_find_next_bus(b)) != NULL)
429 : 0 : pci_rescan_bus(b);
430 : 0 : pci_unlock_rescan_remove();
431 : : }
432 : 0 : return count;
433 : : }
434 : : static BUS_ATTR_WO(rescan);
435 : :
436 : : static struct attribute *pci_bus_attrs[] = {
437 : : &bus_attr_rescan.attr,
438 : : NULL,
439 : : };
440 : :
441 : : static const struct attribute_group pci_bus_group = {
442 : : .attrs = pci_bus_attrs,
443 : : };
444 : :
445 : : const struct attribute_group *pci_bus_groups[] = {
446 : : &pci_bus_group,
447 : : NULL,
448 : : };
449 : :
450 : 0 : static ssize_t dev_rescan_store(struct device *dev,
451 : : struct device_attribute *attr, const char *buf,
452 : : size_t count)
453 : : {
454 : 0 : unsigned long val;
455 : 0 : struct pci_dev *pdev = to_pci_dev(dev);
456 : :
457 [ # # ]: 0 : if (kstrtoul(buf, 0, &val) < 0)
458 : : return -EINVAL;
459 : :
460 [ # # ]: 0 : if (val) {
461 : 0 : pci_lock_rescan_remove();
462 : 0 : pci_rescan_bus(pdev->bus);
463 : 0 : pci_unlock_rescan_remove();
464 : : }
465 : 0 : return count;
466 : : }
467 : : static DEVICE_ATTR_WO(dev_rescan);
468 : :
469 : 0 : static ssize_t remove_store(struct device *dev, struct device_attribute *attr,
470 : : const char *buf, size_t count)
471 : : {
472 : 0 : unsigned long val;
473 : :
474 [ # # ]: 0 : if (kstrtoul(buf, 0, &val) < 0)
475 : : return -EINVAL;
476 : :
477 [ # # # # ]: 0 : if (val && device_remove_file_self(dev, attr))
478 : 0 : pci_stop_and_remove_bus_device_locked(to_pci_dev(dev));
479 : 0 : return count;
480 : : }
481 : : static DEVICE_ATTR_IGNORE_LOCKDEP(remove, 0220, NULL,
482 : : remove_store);
483 : :
484 : 0 : static ssize_t bus_rescan_store(struct device *dev,
485 : : struct device_attribute *attr,
486 : : const char *buf, size_t count)
487 : : {
488 : 0 : unsigned long val;
489 : 0 : struct pci_bus *bus = to_pci_bus(dev);
490 : :
491 [ # # ]: 0 : if (kstrtoul(buf, 0, &val) < 0)
492 : : return -EINVAL;
493 : :
494 [ # # ]: 0 : if (val) {
495 : 0 : pci_lock_rescan_remove();
496 [ # # # # ]: 0 : if (!pci_is_root_bus(bus) && list_empty(&bus->devices))
497 : 0 : pci_rescan_bus_bridge_resize(bus->self);
498 : : else
499 : 0 : pci_rescan_bus(bus);
500 : 0 : pci_unlock_rescan_remove();
501 : : }
502 : 0 : return count;
503 : : }
504 : : static DEVICE_ATTR_WO(bus_rescan);
505 : :
506 : : #if defined(CONFIG_PM) && defined(CONFIG_ACPI)
507 : 0 : static ssize_t d3cold_allowed_store(struct device *dev,
508 : : struct device_attribute *attr,
509 : : const char *buf, size_t count)
510 : : {
511 : 0 : struct pci_dev *pdev = to_pci_dev(dev);
512 : 0 : unsigned long val;
513 : :
514 [ # # ]: 0 : if (kstrtoul(buf, 0, &val) < 0)
515 : : return -EINVAL;
516 : :
517 : 0 : pdev->d3cold_allowed = !!val;
518 [ # # ]: 0 : if (pdev->d3cold_allowed)
519 : 0 : pci_d3cold_enable(pdev);
520 : : else
521 : 0 : pci_d3cold_disable(pdev);
522 : :
523 : 0 : pm_runtime_resume(dev);
524 : :
525 : 0 : return count;
526 : : }
527 : :
528 : 0 : static ssize_t d3cold_allowed_show(struct device *dev,
529 : : struct device_attribute *attr, char *buf)
530 : : {
531 : 0 : struct pci_dev *pdev = to_pci_dev(dev);
532 : 0 : return sprintf(buf, "%u\n", pdev->d3cold_allowed);
533 : : }
534 : : static DEVICE_ATTR_RW(d3cold_allowed);
535 : : #endif
536 : :
537 : : #ifdef CONFIG_OF
538 : : static ssize_t devspec_show(struct device *dev,
539 : : struct device_attribute *attr, char *buf)
540 : : {
541 : : struct pci_dev *pdev = to_pci_dev(dev);
542 : : struct device_node *np = pci_device_to_OF_node(pdev);
543 : :
544 : : if (np == NULL)
545 : : return 0;
546 : : return sprintf(buf, "%pOF", np);
547 : : }
548 : : static DEVICE_ATTR_RO(devspec);
549 : : #endif
550 : :
551 : 0 : static ssize_t driver_override_store(struct device *dev,
552 : : struct device_attribute *attr,
553 : : const char *buf, size_t count)
554 : : {
555 : 0 : struct pci_dev *pdev = to_pci_dev(dev);
556 : 0 : char *driver_override, *old, *cp;
557 : :
558 : : /* We need to keep extra room for a newline */
559 [ # # ]: 0 : if (count >= (PAGE_SIZE - 1))
560 : : return -EINVAL;
561 : :
562 : 0 : driver_override = kstrndup(buf, count, GFP_KERNEL);
563 [ # # ]: 0 : if (!driver_override)
564 : : return -ENOMEM;
565 : :
566 : 0 : cp = strchr(driver_override, '\n');
567 [ # # ]: 0 : if (cp)
568 : 0 : *cp = '\0';
569 : :
570 : 0 : device_lock(dev);
571 : 0 : old = pdev->driver_override;
572 [ # # ]: 0 : if (strlen(driver_override)) {
573 : 0 : pdev->driver_override = driver_override;
574 : : } else {
575 : 0 : kfree(driver_override);
576 : 0 : pdev->driver_override = NULL;
577 : : }
578 : 0 : device_unlock(dev);
579 : :
580 : 0 : kfree(old);
581 : :
582 : 0 : return count;
583 : : }
584 : :
585 : 0 : static ssize_t driver_override_show(struct device *dev,
586 : : struct device_attribute *attr, char *buf)
587 : : {
588 : 0 : struct pci_dev *pdev = to_pci_dev(dev);
589 : 0 : ssize_t len;
590 : :
591 : 0 : device_lock(dev);
592 : 0 : len = snprintf(buf, PAGE_SIZE, "%s\n", pdev->driver_override);
593 : 0 : device_unlock(dev);
594 : 0 : return len;
595 : : }
596 : : static DEVICE_ATTR_RW(driver_override);
597 : :
598 : : static struct attribute *pci_dev_attrs[] = {
599 : : &dev_attr_resource.attr,
600 : : &dev_attr_vendor.attr,
601 : : &dev_attr_device.attr,
602 : : &dev_attr_subsystem_vendor.attr,
603 : : &dev_attr_subsystem_device.attr,
604 : : &dev_attr_revision.attr,
605 : : &dev_attr_class.attr,
606 : : &dev_attr_irq.attr,
607 : : &dev_attr_local_cpus.attr,
608 : : &dev_attr_local_cpulist.attr,
609 : : &dev_attr_modalias.attr,
610 : : #ifdef CONFIG_NUMA
611 : : &dev_attr_numa_node.attr,
612 : : #endif
613 : : &dev_attr_dma_mask_bits.attr,
614 : : &dev_attr_consistent_dma_mask_bits.attr,
615 : : &dev_attr_enable.attr,
616 : : &dev_attr_broken_parity_status.attr,
617 : : &dev_attr_msi_bus.attr,
618 : : #if defined(CONFIG_PM) && defined(CONFIG_ACPI)
619 : : &dev_attr_d3cold_allowed.attr,
620 : : #endif
621 : : #ifdef CONFIG_OF
622 : : &dev_attr_devspec.attr,
623 : : #endif
624 : : &dev_attr_driver_override.attr,
625 : : &dev_attr_ari_enabled.attr,
626 : : NULL,
627 : : };
628 : :
629 : : static struct attribute *pci_bridge_attrs[] = {
630 : : &dev_attr_subordinate_bus_number.attr,
631 : : &dev_attr_secondary_bus_number.attr,
632 : : NULL,
633 : : };
634 : :
635 : : static struct attribute *pcie_dev_attrs[] = {
636 : : &dev_attr_current_link_speed.attr,
637 : : &dev_attr_current_link_width.attr,
638 : : &dev_attr_max_link_width.attr,
639 : : &dev_attr_max_link_speed.attr,
640 : : NULL,
641 : : };
642 : :
643 : : static struct attribute *pcibus_attrs[] = {
644 : : &dev_attr_bus_rescan.attr,
645 : : &dev_attr_cpuaffinity.attr,
646 : : &dev_attr_cpulistaffinity.attr,
647 : : NULL,
648 : : };
649 : :
650 : : static const struct attribute_group pcibus_group = {
651 : : .attrs = pcibus_attrs,
652 : : };
653 : :
654 : : const struct attribute_group *pcibus_groups[] = {
655 : : &pcibus_group,
656 : : NULL,
657 : : };
658 : :
659 : 0 : static ssize_t boot_vga_show(struct device *dev, struct device_attribute *attr,
660 : : char *buf)
661 : : {
662 : 0 : struct pci_dev *pdev = to_pci_dev(dev);
663 : 0 : struct pci_dev *vga_dev = vga_default_device();
664 : :
665 [ # # ]: 0 : if (vga_dev)
666 : 0 : return sprintf(buf, "%u\n", (pdev == vga_dev));
667 : :
668 : 0 : return sprintf(buf, "%u\n",
669 : 0 : !!(pdev->resource[PCI_ROM_RESOURCE].flags &
670 : : IORESOURCE_ROM_SHADOW));
671 : : }
672 : : static DEVICE_ATTR_RO(boot_vga);
673 : :
674 : 0 : static ssize_t pci_read_config(struct file *filp, struct kobject *kobj,
675 : : struct bin_attribute *bin_attr, char *buf,
676 : : loff_t off, size_t count)
677 : : {
678 : 0 : struct pci_dev *dev = to_pci_dev(kobj_to_dev(kobj));
679 : 0 : unsigned int size = 64;
680 : 0 : loff_t init_off = off;
681 : 0 : u8 *data = (u8 *) buf;
682 : :
683 : : /* Several chips lock up trying to read undefined config space */
684 [ # # ]: 0 : if (file_ns_capable(filp, &init_user_ns, CAP_SYS_ADMIN))
685 : 0 : size = dev->cfg_size;
686 [ # # ]: 0 : else if (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)
687 : 0 : size = 128;
688 : :
689 [ # # ]: 0 : if (off > size)
690 : : return 0;
691 [ # # ]: 0 : if (off + count > size) {
692 : 0 : size -= off;
693 : 0 : count = size;
694 : : } else {
695 : 0 : size = count;
696 : : }
697 : :
698 : 0 : pci_config_pm_runtime_get(dev);
699 : :
700 [ # # # # ]: 0 : if ((off & 1) && size) {
701 : 0 : u8 val;
702 : 0 : pci_user_read_config_byte(dev, off, &val);
703 : 0 : data[off - init_off] = val;
704 : 0 : off++;
705 : 0 : size--;
706 : : }
707 : :
708 [ # # # # ]: 0 : if ((off & 3) && size > 2) {
709 : 0 : u16 val;
710 : 0 : pci_user_read_config_word(dev, off, &val);
711 : 0 : data[off - init_off] = val & 0xff;
712 : 0 : data[off - init_off + 1] = (val >> 8) & 0xff;
713 : 0 : off += 2;
714 : 0 : size -= 2;
715 : : }
716 : :
717 [ # # ]: 0 : while (size > 3) {
718 : 0 : u32 val;
719 : 0 : pci_user_read_config_dword(dev, off, &val);
720 : 0 : data[off - init_off] = val & 0xff;
721 : 0 : data[off - init_off + 1] = (val >> 8) & 0xff;
722 : 0 : data[off - init_off + 2] = (val >> 16) & 0xff;
723 : 0 : data[off - init_off + 3] = (val >> 24) & 0xff;
724 : 0 : off += 4;
725 : 0 : size -= 4;
726 : : }
727 : :
728 [ # # ]: 0 : if (size >= 2) {
729 : 0 : u16 val;
730 : 0 : pci_user_read_config_word(dev, off, &val);
731 : 0 : data[off - init_off] = val & 0xff;
732 : 0 : data[off - init_off + 1] = (val >> 8) & 0xff;
733 : 0 : off += 2;
734 : 0 : size -= 2;
735 : : }
736 : :
737 [ # # ]: 0 : if (size > 0) {
738 : 0 : u8 val;
739 : 0 : pci_user_read_config_byte(dev, off, &val);
740 : 0 : data[off - init_off] = val;
741 : 0 : off++;
742 : 0 : --size;
743 : : }
744 : :
745 : 0 : pci_config_pm_runtime_put(dev);
746 : :
747 : 0 : return count;
748 : : }
749 : :
750 : 0 : static ssize_t pci_write_config(struct file *filp, struct kobject *kobj,
751 : : struct bin_attribute *bin_attr, char *buf,
752 : : loff_t off, size_t count)
753 : : {
754 : 0 : struct pci_dev *dev = to_pci_dev(kobj_to_dev(kobj));
755 : 0 : unsigned int size = count;
756 : 0 : loff_t init_off = off;
757 : 0 : u8 *data = (u8 *) buf;
758 : 0 : int ret;
759 : :
760 : 0 : ret = security_locked_down(LOCKDOWN_PCI_ACCESS);
761 [ # # ]: 0 : if (ret)
762 : 0 : return ret;
763 : :
764 [ # # ]: 0 : if (off > dev->cfg_size)
765 : : return 0;
766 [ # # ]: 0 : if (off + count > dev->cfg_size) {
767 : 0 : size = dev->cfg_size - off;
768 : 0 : count = size;
769 : : }
770 : :
771 : 0 : pci_config_pm_runtime_get(dev);
772 : :
773 [ # # # # ]: 0 : if ((off & 1) && size) {
774 : 0 : pci_user_write_config_byte(dev, off, data[off - init_off]);
775 : 0 : off++;
776 : 0 : size--;
777 : : }
778 : :
779 [ # # # # ]: 0 : if ((off & 3) && size > 2) {
780 : 0 : u16 val = data[off - init_off];
781 : 0 : val |= (u16) data[off - init_off + 1] << 8;
782 : 0 : pci_user_write_config_word(dev, off, val);
783 : 0 : off += 2;
784 : 0 : size -= 2;
785 : : }
786 : :
787 [ # # ]: 0 : while (size > 3) {
788 : 0 : u32 val = data[off - init_off];
789 : 0 : val |= (u32) data[off - init_off + 1] << 8;
790 : 0 : val |= (u32) data[off - init_off + 2] << 16;
791 : 0 : val |= (u32) data[off - init_off + 3] << 24;
792 : 0 : pci_user_write_config_dword(dev, off, val);
793 : 0 : off += 4;
794 : 0 : size -= 4;
795 : : }
796 : :
797 [ # # ]: 0 : if (size >= 2) {
798 : 0 : u16 val = data[off - init_off];
799 : 0 : val |= (u16) data[off - init_off + 1] << 8;
800 : 0 : pci_user_write_config_word(dev, off, val);
801 : 0 : off += 2;
802 : 0 : size -= 2;
803 : : }
804 : :
805 [ # # ]: 0 : if (size) {
806 : 0 : pci_user_write_config_byte(dev, off, data[off - init_off]);
807 : 0 : off++;
808 : 0 : --size;
809 : : }
810 : :
811 : 0 : pci_config_pm_runtime_put(dev);
812 : :
813 : 0 : return count;
814 : : }
815 : :
816 : : #ifdef HAVE_PCI_LEGACY
817 : : /**
818 : : * pci_read_legacy_io - read byte(s) from legacy I/O port space
819 : : * @filp: open sysfs file
820 : : * @kobj: kobject corresponding to file to read from
821 : : * @bin_attr: struct bin_attribute for this file
822 : : * @buf: buffer to store results
823 : : * @off: offset into legacy I/O port space
824 : : * @count: number of bytes to read
825 : : *
826 : : * Reads 1, 2, or 4 bytes from legacy I/O port space using an arch specific
827 : : * callback routine (pci_legacy_read).
828 : : */
829 : : static ssize_t pci_read_legacy_io(struct file *filp, struct kobject *kobj,
830 : : struct bin_attribute *bin_attr, char *buf,
831 : : loff_t off, size_t count)
832 : : {
833 : : struct pci_bus *bus = to_pci_bus(kobj_to_dev(kobj));
834 : :
835 : : /* Only support 1, 2 or 4 byte accesses */
836 : : if (count != 1 && count != 2 && count != 4)
837 : : return -EINVAL;
838 : :
839 : : return pci_legacy_read(bus, off, (u32 *)buf, count);
840 : : }
841 : :
842 : : /**
843 : : * pci_write_legacy_io - write byte(s) to legacy I/O port space
844 : : * @filp: open sysfs file
845 : : * @kobj: kobject corresponding to file to read from
846 : : * @bin_attr: struct bin_attribute for this file
847 : : * @buf: buffer containing value to be written
848 : : * @off: offset into legacy I/O port space
849 : : * @count: number of bytes to write
850 : : *
851 : : * Writes 1, 2, or 4 bytes from legacy I/O port space using an arch specific
852 : : * callback routine (pci_legacy_write).
853 : : */
854 : : static ssize_t pci_write_legacy_io(struct file *filp, struct kobject *kobj,
855 : : struct bin_attribute *bin_attr, char *buf,
856 : : loff_t off, size_t count)
857 : : {
858 : : struct pci_bus *bus = to_pci_bus(kobj_to_dev(kobj));
859 : :
860 : : /* Only support 1, 2 or 4 byte accesses */
861 : : if (count != 1 && count != 2 && count != 4)
862 : : return -EINVAL;
863 : :
864 : : return pci_legacy_write(bus, off, *(u32 *)buf, count);
865 : : }
866 : :
867 : : /**
868 : : * pci_mmap_legacy_mem - map legacy PCI memory into user memory space
869 : : * @filp: open sysfs file
870 : : * @kobj: kobject corresponding to device to be mapped
871 : : * @attr: struct bin_attribute for this file
872 : : * @vma: struct vm_area_struct passed to mmap
873 : : *
874 : : * Uses an arch specific callback, pci_mmap_legacy_mem_page_range, to mmap
875 : : * legacy memory space (first meg of bus space) into application virtual
876 : : * memory space.
877 : : */
878 : : static int pci_mmap_legacy_mem(struct file *filp, struct kobject *kobj,
879 : : struct bin_attribute *attr,
880 : : struct vm_area_struct *vma)
881 : : {
882 : : struct pci_bus *bus = to_pci_bus(kobj_to_dev(kobj));
883 : :
884 : : return pci_mmap_legacy_page_range(bus, vma, pci_mmap_mem);
885 : : }
886 : :
887 : : /**
888 : : * pci_mmap_legacy_io - map legacy PCI IO into user memory space
889 : : * @filp: open sysfs file
890 : : * @kobj: kobject corresponding to device to be mapped
891 : : * @attr: struct bin_attribute for this file
892 : : * @vma: struct vm_area_struct passed to mmap
893 : : *
894 : : * Uses an arch specific callback, pci_mmap_legacy_io_page_range, to mmap
895 : : * legacy IO space (first meg of bus space) into application virtual
896 : : * memory space. Returns -ENOSYS if the operation isn't supported
897 : : */
898 : : static int pci_mmap_legacy_io(struct file *filp, struct kobject *kobj,
899 : : struct bin_attribute *attr,
900 : : struct vm_area_struct *vma)
901 : : {
902 : : struct pci_bus *bus = to_pci_bus(kobj_to_dev(kobj));
903 : :
904 : : return pci_mmap_legacy_page_range(bus, vma, pci_mmap_io);
905 : : }
906 : :
907 : : /**
908 : : * pci_adjust_legacy_attr - adjustment of legacy file attributes
909 : : * @b: bus to create files under
910 : : * @mmap_type: I/O port or memory
911 : : *
912 : : * Stub implementation. Can be overridden by arch if necessary.
913 : : */
914 : : void __weak pci_adjust_legacy_attr(struct pci_bus *b,
915 : : enum pci_mmap_state mmap_type)
916 : : {
917 : : }
918 : :
919 : : /**
920 : : * pci_create_legacy_files - create legacy I/O port and memory files
921 : : * @b: bus to create files under
922 : : *
923 : : * Some platforms allow access to legacy I/O port and ISA memory space on
924 : : * a per-bus basis. This routine creates the files and ties them into
925 : : * their associated read, write and mmap files from pci-sysfs.c
926 : : *
927 : : * On error unwind, but don't propagate the error to the caller
928 : : * as it is ok to set up the PCI bus without these files.
929 : : */
930 : : void pci_create_legacy_files(struct pci_bus *b)
931 : : {
932 : : int error;
933 : :
934 : : b->legacy_io = kcalloc(2, sizeof(struct bin_attribute),
935 : : GFP_ATOMIC);
936 : : if (!b->legacy_io)
937 : : goto kzalloc_err;
938 : :
939 : : sysfs_bin_attr_init(b->legacy_io);
940 : : b->legacy_io->attr.name = "legacy_io";
941 : : b->legacy_io->size = 0xffff;
942 : : b->legacy_io->attr.mode = 0600;
943 : : b->legacy_io->read = pci_read_legacy_io;
944 : : b->legacy_io->write = pci_write_legacy_io;
945 : : b->legacy_io->mmap = pci_mmap_legacy_io;
946 : : pci_adjust_legacy_attr(b, pci_mmap_io);
947 : : error = device_create_bin_file(&b->dev, b->legacy_io);
948 : : if (error)
949 : : goto legacy_io_err;
950 : :
951 : : /* Allocated above after the legacy_io struct */
952 : : b->legacy_mem = b->legacy_io + 1;
953 : : sysfs_bin_attr_init(b->legacy_mem);
954 : : b->legacy_mem->attr.name = "legacy_mem";
955 : : b->legacy_mem->size = 1024*1024;
956 : : b->legacy_mem->attr.mode = 0600;
957 : : b->legacy_mem->mmap = pci_mmap_legacy_mem;
958 : : pci_adjust_legacy_attr(b, pci_mmap_mem);
959 : : error = device_create_bin_file(&b->dev, b->legacy_mem);
960 : : if (error)
961 : : goto legacy_mem_err;
962 : :
963 : : return;
964 : :
965 : : legacy_mem_err:
966 : : device_remove_bin_file(&b->dev, b->legacy_io);
967 : : legacy_io_err:
968 : : kfree(b->legacy_io);
969 : : b->legacy_io = NULL;
970 : : kzalloc_err:
971 : : dev_warn(&b->dev, "could not create legacy I/O port and ISA memory resources in sysfs\n");
972 : : }
973 : :
974 : : void pci_remove_legacy_files(struct pci_bus *b)
975 : : {
976 : : if (b->legacy_io) {
977 : : device_remove_bin_file(&b->dev, b->legacy_io);
978 : : device_remove_bin_file(&b->dev, b->legacy_mem);
979 : : kfree(b->legacy_io); /* both are allocated here */
980 : : }
981 : : }
982 : : #endif /* HAVE_PCI_LEGACY */
983 : :
984 : : #if defined(HAVE_PCI_MMAP) || defined(ARCH_GENERIC_PCI_MMAP_RESOURCE)
985 : :
986 : 0 : int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vma,
987 : : enum pci_mmap_api mmap_api)
988 : : {
989 : 0 : unsigned long nr, start, size;
990 : 0 : resource_size_t pci_start = 0, pci_end;
991 : :
992 [ # # # # : 0 : if (pci_resource_len(pdev, resno) == 0)
# # ]
993 : : return 0;
994 [ # # ]: 0 : nr = vma_pages(vma);
995 : 0 : start = vma->vm_pgoff;
996 [ # # # # ]: 0 : size = ((pci_resource_len(pdev, resno) - 1) >> PAGE_SHIFT) + 1;
997 [ # # ]: 0 : if (mmap_api == PCI_MMAP_PROCFS) {
998 : 0 : pci_resource_to_user(pdev, resno, &pdev->resource[resno],
999 : : &pci_start, &pci_end);
1000 : 0 : pci_start >>= PAGE_SHIFT;
1001 : : }
1002 [ # # # # ]: 0 : if (start >= pci_start && start < pci_start + size &&
1003 [ # # ]: 0 : start + nr <= pci_start + size)
1004 : 0 : return 1;
1005 : : return 0;
1006 : : }
1007 : :
1008 : : /**
1009 : : * pci_mmap_resource - map a PCI resource into user memory space
1010 : : * @kobj: kobject for mapping
1011 : : * @attr: struct bin_attribute for the file being mapped
1012 : : * @vma: struct vm_area_struct passed into the mmap
1013 : : * @write_combine: 1 for write_combine mapping
1014 : : *
1015 : : * Use the regular PCI mapping routines to map a PCI resource into userspace.
1016 : : */
1017 : : static int pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr,
1018 : : struct vm_area_struct *vma, int write_combine)
1019 : : {
1020 : : struct pci_dev *pdev = to_pci_dev(kobj_to_dev(kobj));
1021 : : int bar = (unsigned long)attr->private;
1022 : : enum pci_mmap_state mmap_type;
1023 : : struct resource *res = &pdev->resource[bar];
1024 : : int ret;
1025 : :
1026 : : ret = security_locked_down(LOCKDOWN_PCI_ACCESS);
1027 : : if (ret)
1028 : : return ret;
1029 : :
1030 : : if (res->flags & IORESOURCE_MEM && iomem_is_exclusive(res->start))
1031 : : return -EINVAL;
1032 : :
1033 : : if (!pci_mmap_fits(pdev, bar, vma, PCI_MMAP_SYSFS))
1034 : : return -EINVAL;
1035 : :
1036 : : mmap_type = res->flags & IORESOURCE_MEM ? pci_mmap_mem : pci_mmap_io;
1037 : :
1038 : : return pci_mmap_resource_range(pdev, bar, vma, mmap_type, write_combine);
1039 : : }
1040 : :
1041 : 0 : static int pci_mmap_resource_uc(struct file *filp, struct kobject *kobj,
1042 : : struct bin_attribute *attr,
1043 : : struct vm_area_struct *vma)
1044 : : {
1045 : 0 : return pci_mmap_resource(kobj, attr, vma, 0);
1046 : : }
1047 : :
1048 : 0 : static int pci_mmap_resource_wc(struct file *filp, struct kobject *kobj,
1049 : : struct bin_attribute *attr,
1050 : : struct vm_area_struct *vma)
1051 : : {
1052 : 0 : return pci_mmap_resource(kobj, attr, vma, 1);
1053 : : }
1054 : :
1055 : 0 : static ssize_t pci_resource_io(struct file *filp, struct kobject *kobj,
1056 : : struct bin_attribute *attr, char *buf,
1057 : : loff_t off, size_t count, bool write)
1058 : : {
1059 [ # # ]: 0 : struct pci_dev *pdev = to_pci_dev(kobj_to_dev(kobj));
1060 : 0 : int bar = (unsigned long)attr->private;
1061 : 0 : unsigned long port = off;
1062 : :
1063 : 0 : port += pci_resource_start(pdev, bar);
1064 : :
1065 [ # # ]: 0 : if (port > pci_resource_end(pdev, bar))
1066 : : return 0;
1067 : :
1068 [ # # ]: 0 : if (port + count - 1 > pci_resource_end(pdev, bar))
1069 : : return -EINVAL;
1070 : :
1071 [ # # # # ]: 0 : switch (count) {
1072 : 0 : case 1:
1073 [ # # ]: 0 : if (write)
1074 : 0 : outb(*(u8 *)buf, port);
1075 : : else
1076 : 0 : *(u8 *)buf = inb(port);
1077 : : return 1;
1078 : 0 : case 2:
1079 [ # # ]: 0 : if (write)
1080 : 0 : outw(*(u16 *)buf, port);
1081 : : else
1082 : 0 : *(u16 *)buf = inw(port);
1083 : : return 2;
1084 : 0 : case 4:
1085 [ # # ]: 0 : if (write)
1086 : 0 : outl(*(u32 *)buf, port);
1087 : : else
1088 : 0 : *(u32 *)buf = inl(port);
1089 : : return 4;
1090 : : }
1091 : : return -EINVAL;
1092 : : }
1093 : :
1094 : 0 : static ssize_t pci_read_resource_io(struct file *filp, struct kobject *kobj,
1095 : : struct bin_attribute *attr, char *buf,
1096 : : loff_t off, size_t count)
1097 : : {
1098 : 0 : return pci_resource_io(filp, kobj, attr, buf, off, count, false);
1099 : : }
1100 : :
1101 : 0 : static ssize_t pci_write_resource_io(struct file *filp, struct kobject *kobj,
1102 : : struct bin_attribute *attr, char *buf,
1103 : : loff_t off, size_t count)
1104 : : {
1105 : 0 : int ret;
1106 : :
1107 : 0 : ret = security_locked_down(LOCKDOWN_PCI_ACCESS);
1108 [ # # ]: 0 : if (ret)
1109 : 0 : return ret;
1110 : :
1111 : 0 : return pci_resource_io(filp, kobj, attr, buf, off, count, true);
1112 : : }
1113 : :
1114 : : /**
1115 : : * pci_remove_resource_files - cleanup resource files
1116 : : * @pdev: dev to cleanup
1117 : : *
1118 : : * If we created resource files for @pdev, remove them from sysfs and
1119 : : * free their resources.
1120 : : */
1121 : 0 : static void pci_remove_resource_files(struct pci_dev *pdev)
1122 : : {
1123 : 0 : int i;
1124 : :
1125 [ # # ]: 0 : for (i = 0; i < PCI_STD_NUM_BARS; i++) {
1126 : 0 : struct bin_attribute *res_attr;
1127 : :
1128 : 0 : res_attr = pdev->res_attr[i];
1129 [ # # ]: 0 : if (res_attr) {
1130 : 0 : sysfs_remove_bin_file(&pdev->dev.kobj, res_attr);
1131 : 0 : kfree(res_attr);
1132 : : }
1133 : :
1134 : 0 : res_attr = pdev->res_attr_wc[i];
1135 [ # # ]: 0 : if (res_attr) {
1136 : 0 : sysfs_remove_bin_file(&pdev->dev.kobj, res_attr);
1137 : 0 : kfree(res_attr);
1138 : : }
1139 : : }
1140 : 0 : }
1141 : :
1142 : 132 : static int pci_create_attr(struct pci_dev *pdev, int num, int write_combine)
1143 : : {
1144 : : /* allocate attribute structure, piggyback attribute name */
1145 [ + + ]: 132 : int name_len = write_combine ? 13 : 10;
1146 : 132 : struct bin_attribute *res_attr;
1147 : 132 : char *res_attr_name;
1148 : 132 : int retval;
1149 : :
1150 : 132 : res_attr = kzalloc(sizeof(*res_attr) + name_len, GFP_ATOMIC);
1151 [ + - ]: 132 : if (!res_attr)
1152 : : return -ENOMEM;
1153 : :
1154 : 132 : res_attr_name = (char *)(res_attr + 1);
1155 : :
1156 : 132 : sysfs_bin_attr_init(res_attr);
1157 [ + + ]: 132 : if (write_combine) {
1158 : 11 : pdev->res_attr_wc[num] = res_attr;
1159 : 11 : sprintf(res_attr_name, "resource%d_wc", num);
1160 : 11 : res_attr->mmap = pci_mmap_resource_wc;
1161 : : } else {
1162 : 121 : pdev->res_attr[num] = res_attr;
1163 : 121 : sprintf(res_attr_name, "resource%d", num);
1164 [ + + ]: 121 : if (pci_resource_flags(pdev, num) & IORESOURCE_IO) {
1165 : 55 : res_attr->read = pci_read_resource_io;
1166 : 55 : res_attr->write = pci_write_resource_io;
1167 : 55 : if (arch_can_pci_mmap_io())
1168 : : res_attr->mmap = pci_mmap_resource_uc;
1169 : : } else {
1170 : 66 : res_attr->mmap = pci_mmap_resource_uc;
1171 : : }
1172 : : }
1173 : 132 : res_attr->attr.name = res_attr_name;
1174 : 132 : res_attr->attr.mode = 0600;
1175 [ - + - - ]: 132 : res_attr->size = pci_resource_len(pdev, num);
1176 : 132 : res_attr->private = (void *)(unsigned long)num;
1177 : 132 : retval = sysfs_create_bin_file(&pdev->dev.kobj, res_attr);
1178 [ - + ]: 132 : if (retval)
1179 : 0 : kfree(res_attr);
1180 : :
1181 : : return retval;
1182 : : }
1183 : :
1184 : : /**
1185 : : * pci_create_resource_files - create resource files in sysfs for @dev
1186 : : * @pdev: dev in question
1187 : : *
1188 : : * Walk the resources in @pdev creating files for each resource available.
1189 : : */
1190 : 77 : static int pci_create_resource_files(struct pci_dev *pdev)
1191 : : {
1192 : 77 : int i;
1193 : 77 : int retval;
1194 : :
1195 : : /* Expose the PCI resources from this device as files */
1196 [ + + ]: 539 : for (i = 0; i < PCI_STD_NUM_BARS; i++) {
1197 : :
1198 : : /* skip empty resources */
1199 [ + + - + : 462 : if (!pci_resource_len(pdev, i))
- + ]
1200 : 341 : continue;
1201 : :
1202 : 121 : retval = pci_create_attr(pdev, i, 0);
1203 : : /* for prefetchable resources, create a WC mappable file */
1204 [ + - + - ]: 121 : if (!retval && arch_can_pci_mmap_wc() &&
1205 [ + + ]: 121 : pdev->resource[i].flags & IORESOURCE_PREFETCH)
1206 : 11 : retval = pci_create_attr(pdev, i, 1);
1207 [ - + ]: 121 : if (retval) {
1208 : 0 : pci_remove_resource_files(pdev);
1209 : 0 : return retval;
1210 : : }
1211 : : }
1212 : : return 0;
1213 : : }
1214 : : #else /* !HAVE_PCI_MMAP */
1215 : : int __weak pci_create_resource_files(struct pci_dev *dev) { return 0; }
1216 : : void __weak pci_remove_resource_files(struct pci_dev *dev) { return; }
1217 : : #endif /* HAVE_PCI_MMAP */
1218 : :
1219 : : /**
1220 : : * pci_write_rom - used to enable access to the PCI ROM display
1221 : : * @filp: sysfs file
1222 : : * @kobj: kernel object handle
1223 : : * @bin_attr: struct bin_attribute for this file
1224 : : * @buf: user input
1225 : : * @off: file offset
1226 : : * @count: number of byte in input
1227 : : *
1228 : : * writing anything except 0 enables it
1229 : : */
1230 : 0 : static ssize_t pci_write_rom(struct file *filp, struct kobject *kobj,
1231 : : struct bin_attribute *bin_attr, char *buf,
1232 : : loff_t off, size_t count)
1233 : : {
1234 [ # # ]: 0 : struct pci_dev *pdev = to_pci_dev(kobj_to_dev(kobj));
1235 : :
1236 [ # # # # : 0 : if ((off == 0) && (*buf == '0') && (count == 2))
# # ]
1237 : 0 : pdev->rom_attr_enabled = 0;
1238 : : else
1239 : 0 : pdev->rom_attr_enabled = 1;
1240 : :
1241 : 0 : return count;
1242 : : }
1243 : :
1244 : : /**
1245 : : * pci_read_rom - read a PCI ROM
1246 : : * @filp: sysfs file
1247 : : * @kobj: kernel object handle
1248 : : * @bin_attr: struct bin_attribute for this file
1249 : : * @buf: where to put the data we read from the ROM
1250 : : * @off: file offset
1251 : : * @count: number of bytes to read
1252 : : *
1253 : : * Put @count bytes starting at @off into @buf from the ROM in the PCI
1254 : : * device corresponding to @kobj.
1255 : : */
1256 : 0 : static ssize_t pci_read_rom(struct file *filp, struct kobject *kobj,
1257 : : struct bin_attribute *bin_attr, char *buf,
1258 : : loff_t off, size_t count)
1259 : : {
1260 [ # # ]: 0 : struct pci_dev *pdev = to_pci_dev(kobj_to_dev(kobj));
1261 : 0 : void __iomem *rom;
1262 : 0 : size_t size;
1263 : :
1264 [ # # ]: 0 : if (!pdev->rom_attr_enabled)
1265 : : return -EINVAL;
1266 : :
1267 : 0 : rom = pci_map_rom(pdev, &size); /* size starts out as PCI window size */
1268 [ # # # # ]: 0 : if (!rom || !size)
1269 : : return -EIO;
1270 : :
1271 [ # # ]: 0 : if (off >= size)
1272 : : count = 0;
1273 : : else {
1274 [ # # ]: 0 : if (off + count > size)
1275 : 0 : count = size - off;
1276 : :
1277 : 0 : memcpy_fromio(buf, rom + off, count);
1278 : : }
1279 : 0 : pci_unmap_rom(pdev, rom);
1280 : :
1281 : 0 : return count;
1282 : : }
1283 : :
1284 : : static const struct bin_attribute pci_config_attr = {
1285 : : .attr = {
1286 : : .name = "config",
1287 : : .mode = 0644,
1288 : : },
1289 : : .size = PCI_CFG_SPACE_SIZE,
1290 : : .read = pci_read_config,
1291 : : .write = pci_write_config,
1292 : : };
1293 : :
1294 : : static const struct bin_attribute pcie_config_attr = {
1295 : : .attr = {
1296 : : .name = "config",
1297 : : .mode = 0644,
1298 : : },
1299 : : .size = PCI_CFG_SPACE_EXP_SIZE,
1300 : : .read = pci_read_config,
1301 : : .write = pci_write_config,
1302 : : };
1303 : :
1304 : 0 : static ssize_t reset_store(struct device *dev, struct device_attribute *attr,
1305 : : const char *buf, size_t count)
1306 : : {
1307 : 0 : struct pci_dev *pdev = to_pci_dev(dev);
1308 : 0 : unsigned long val;
1309 : 0 : ssize_t result = kstrtoul(buf, 0, &val);
1310 : :
1311 [ # # ]: 0 : if (result < 0)
1312 : : return result;
1313 : :
1314 [ # # ]: 0 : if (val != 1)
1315 : : return -EINVAL;
1316 : :
1317 : 0 : pm_runtime_get_sync(dev);
1318 : 0 : result = pci_reset_function(pdev);
1319 : 0 : pm_runtime_put(dev);
1320 [ # # ]: 0 : if (result < 0)
1321 : : return result;
1322 : :
1323 : 0 : return count;
1324 : : }
1325 : :
1326 : : static DEVICE_ATTR(reset, 0200, NULL, reset_store);
1327 : :
1328 : 77 : static int pci_create_capabilities_sysfs(struct pci_dev *dev)
1329 : : {
1330 : 77 : int retval;
1331 : :
1332 : 77 : pcie_vpd_create_sysfs_dev_files(dev);
1333 : :
1334 [ + + ]: 77 : if (dev->reset_fn) {
1335 : 11 : retval = device_create_file(&dev->dev, &dev_attr_reset);
1336 [ - + ]: 11 : if (retval)
1337 : 0 : goto error;
1338 : : }
1339 : : return 0;
1340 : :
1341 : : error:
1342 : 0 : pcie_vpd_remove_sysfs_dev_files(dev);
1343 : 0 : return retval;
1344 : : }
1345 : :
1346 : 154 : int __must_check pci_create_sysfs_dev_files(struct pci_dev *pdev)
1347 : : {
1348 : 154 : int retval;
1349 : 154 : int rom_size;
1350 : 154 : struct bin_attribute *attr;
1351 : :
1352 [ + + ]: 154 : if (!sysfs_initialized)
1353 : : return -EACCES;
1354 : :
1355 [ - + ]: 77 : if (pdev->cfg_size > PCI_CFG_SPACE_SIZE)
1356 : 0 : retval = sysfs_create_bin_file(&pdev->dev.kobj, &pcie_config_attr);
1357 : : else
1358 : 77 : retval = sysfs_create_bin_file(&pdev->dev.kobj, &pci_config_attr);
1359 [ - + ]: 77 : if (retval)
1360 : 0 : goto err;
1361 : :
1362 : 77 : retval = pci_create_resource_files(pdev);
1363 [ - + ]: 77 : if (retval)
1364 : 0 : goto err_config_file;
1365 : :
1366 : : /* If the device has a ROM, try to expose it in sysfs. */
1367 [ + + - + ]: 77 : rom_size = pci_resource_len(pdev, PCI_ROM_RESOURCE);
1368 [ + - ]: 11 : if (rom_size) {
1369 : 11 : attr = kzalloc(sizeof(*attr), GFP_ATOMIC);
1370 [ - + ]: 11 : if (!attr) {
1371 : 0 : retval = -ENOMEM;
1372 : 0 : goto err_resource_files;
1373 : : }
1374 : 11 : sysfs_bin_attr_init(attr);
1375 : 11 : attr->size = rom_size;
1376 : 11 : attr->attr.name = "rom";
1377 : 11 : attr->attr.mode = 0600;
1378 : 11 : attr->read = pci_read_rom;
1379 : 11 : attr->write = pci_write_rom;
1380 : 11 : retval = sysfs_create_bin_file(&pdev->dev.kobj, attr);
1381 [ - + ]: 11 : if (retval) {
1382 : 0 : kfree(attr);
1383 : 0 : goto err_resource_files;
1384 : : }
1385 : 11 : pdev->rom_attr = attr;
1386 : : }
1387 : :
1388 : : /* add sysfs entries for various capabilities */
1389 : 77 : retval = pci_create_capabilities_sysfs(pdev);
1390 [ - + ]: 77 : if (retval)
1391 : 0 : goto err_rom_file;
1392 : :
1393 : 77 : pci_create_firmware_label_files(pdev);
1394 : :
1395 : 77 : return 0;
1396 : :
1397 : : err_rom_file:
1398 [ # # ]: 0 : if (pdev->rom_attr) {
1399 : 0 : sysfs_remove_bin_file(&pdev->dev.kobj, pdev->rom_attr);
1400 : 0 : kfree(pdev->rom_attr);
1401 : 0 : pdev->rom_attr = NULL;
1402 : : }
1403 : 0 : err_resource_files:
1404 : 0 : pci_remove_resource_files(pdev);
1405 : 0 : err_config_file:
1406 [ # # ]: 0 : if (pdev->cfg_size > PCI_CFG_SPACE_SIZE)
1407 : 0 : sysfs_remove_bin_file(&pdev->dev.kobj, &pcie_config_attr);
1408 : : else
1409 : 0 : sysfs_remove_bin_file(&pdev->dev.kobj, &pci_config_attr);
1410 : : err:
1411 : : return retval;
1412 : : }
1413 : :
1414 : 0 : static void pci_remove_capabilities_sysfs(struct pci_dev *dev)
1415 : : {
1416 : 0 : pcie_vpd_remove_sysfs_dev_files(dev);
1417 [ # # ]: 0 : if (dev->reset_fn) {
1418 : 0 : device_remove_file(&dev->dev, &dev_attr_reset);
1419 : 0 : dev->reset_fn = 0;
1420 : : }
1421 : 0 : }
1422 : :
1423 : : /**
1424 : : * pci_remove_sysfs_dev_files - cleanup PCI specific sysfs files
1425 : : * @pdev: device whose entries we should free
1426 : : *
1427 : : * Cleanup when @pdev is removed from sysfs.
1428 : : */
1429 : 0 : void pci_remove_sysfs_dev_files(struct pci_dev *pdev)
1430 : : {
1431 [ # # ]: 0 : if (!sysfs_initialized)
1432 : : return;
1433 : :
1434 : 0 : pci_remove_capabilities_sysfs(pdev);
1435 : :
1436 [ # # ]: 0 : if (pdev->cfg_size > PCI_CFG_SPACE_SIZE)
1437 : 0 : sysfs_remove_bin_file(&pdev->dev.kobj, &pcie_config_attr);
1438 : : else
1439 : 0 : sysfs_remove_bin_file(&pdev->dev.kobj, &pci_config_attr);
1440 : :
1441 : 0 : pci_remove_resource_files(pdev);
1442 : :
1443 [ # # ]: 0 : if (pdev->rom_attr) {
1444 : 0 : sysfs_remove_bin_file(&pdev->dev.kobj, pdev->rom_attr);
1445 : 0 : kfree(pdev->rom_attr);
1446 : 0 : pdev->rom_attr = NULL;
1447 : : }
1448 : :
1449 : 0 : pci_remove_firmware_label_files(pdev);
1450 : : }
1451 : :
1452 : 11 : static int __init pci_sysfs_init(void)
1453 : : {
1454 : 11 : struct pci_dev *pdev = NULL;
1455 : 11 : int retval;
1456 : :
1457 : 11 : sysfs_initialized = 1;
1458 [ + + ]: 88 : for_each_pci_dev(pdev) {
1459 : 77 : retval = pci_create_sysfs_dev_files(pdev);
1460 [ - + ]: 77 : if (retval) {
1461 : 0 : pci_dev_put(pdev);
1462 : 0 : return retval;
1463 : : }
1464 : : }
1465 : :
1466 : : return 0;
1467 : : }
1468 : : late_initcall(pci_sysfs_init);
1469 : :
1470 : : static struct attribute *pci_dev_dev_attrs[] = {
1471 : : &dev_attr_boot_vga.attr,
1472 : : NULL,
1473 : : };
1474 : :
1475 : 77 : static umode_t pci_dev_attrs_are_visible(struct kobject *kobj,
1476 : : struct attribute *a, int n)
1477 : : {
1478 [ + - ]: 77 : struct device *dev = kobj_to_dev(kobj);
1479 : 77 : struct pci_dev *pdev = to_pci_dev(dev);
1480 : :
1481 [ + - ]: 77 : if (a == &dev_attr_boot_vga.attr)
1482 [ + + ]: 77 : if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
1483 : : return 0;
1484 : :
1485 : 11 : return a->mode;
1486 : : }
1487 : :
1488 : : static struct attribute *pci_dev_hp_attrs[] = {
1489 : : &dev_attr_remove.attr,
1490 : : &dev_attr_dev_rescan.attr,
1491 : : NULL,
1492 : : };
1493 : :
1494 : 154 : static umode_t pci_dev_hp_attrs_are_visible(struct kobject *kobj,
1495 : : struct attribute *a, int n)
1496 : : {
1497 [ + - ]: 154 : struct device *dev = kobj_to_dev(kobj);
1498 : 154 : struct pci_dev *pdev = to_pci_dev(dev);
1499 : :
1500 [ + - ]: 154 : if (pdev->is_virtfn)
1501 : : return 0;
1502 : :
1503 : 154 : return a->mode;
1504 : : }
1505 : :
1506 : 154 : static umode_t pci_bridge_attrs_are_visible(struct kobject *kobj,
1507 : : struct attribute *a, int n)
1508 : : {
1509 [ - + ]: 154 : struct device *dev = kobj_to_dev(kobj);
1510 : 154 : struct pci_dev *pdev = to_pci_dev(dev);
1511 : :
1512 [ - + ]: 154 : if (pci_is_bridge(pdev))
1513 : 0 : return a->mode;
1514 : :
1515 : : return 0;
1516 : : }
1517 : :
1518 : 308 : static umode_t pcie_dev_attrs_are_visible(struct kobject *kobj,
1519 : : struct attribute *a, int n)
1520 : : {
1521 [ - + ]: 308 : struct device *dev = kobj_to_dev(kobj);
1522 : 308 : struct pci_dev *pdev = to_pci_dev(dev);
1523 : :
1524 [ - + ]: 308 : if (pci_is_pcie(pdev))
1525 : 0 : return a->mode;
1526 : :
1527 : : return 0;
1528 : : }
1529 : :
1530 : : static const struct attribute_group pci_dev_group = {
1531 : : .attrs = pci_dev_attrs,
1532 : : };
1533 : :
1534 : : const struct attribute_group *pci_dev_groups[] = {
1535 : : &pci_dev_group,
1536 : : NULL,
1537 : : };
1538 : :
1539 : : static const struct attribute_group pci_dev_hp_attr_group = {
1540 : : .attrs = pci_dev_hp_attrs,
1541 : : .is_visible = pci_dev_hp_attrs_are_visible,
1542 : : };
1543 : :
1544 : : static const struct attribute_group pci_dev_attr_group = {
1545 : : .attrs = pci_dev_dev_attrs,
1546 : : .is_visible = pci_dev_attrs_are_visible,
1547 : : };
1548 : :
1549 : : static const struct attribute_group pci_bridge_attr_group = {
1550 : : .attrs = pci_bridge_attrs,
1551 : : .is_visible = pci_bridge_attrs_are_visible,
1552 : : };
1553 : :
1554 : : static const struct attribute_group pcie_dev_attr_group = {
1555 : : .attrs = pcie_dev_attrs,
1556 : : .is_visible = pcie_dev_attrs_are_visible,
1557 : : };
1558 : :
1559 : : static const struct attribute_group *pci_dev_attr_groups[] = {
1560 : : &pci_dev_attr_group,
1561 : : &pci_dev_hp_attr_group,
1562 : : #ifdef CONFIG_PCI_IOV
1563 : : &sriov_dev_attr_group,
1564 : : #endif
1565 : : &pci_bridge_attr_group,
1566 : : &pcie_dev_attr_group,
1567 : : #ifdef CONFIG_PCIEAER
1568 : : &aer_stats_attr_group,
1569 : : #endif
1570 : : #ifdef CONFIG_PCIEASPM
1571 : : &aspm_ctrl_attr_group,
1572 : : #endif
1573 : : NULL,
1574 : : };
1575 : :
1576 : : const struct device_type pci_dev_type = {
1577 : : .groups = pci_dev_attr_groups,
1578 : : };
|