1 // SPDX-License-Identifier: GPL-2.0
3 * Purpose: PCI Express Port Bus Driver
5 * Copyright (C) 2004 Intel
6 * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
9 #include <linux/bitfield.h>
10 #include <linux/dmi.h>
11 #include <linux/init.h>
12 #include <linux/module.h>
13 #include <linux/pci.h>
14 #include <linux/kernel.h>
15 #include <linux/errno.h>
17 #include <linux/pm_runtime.h>
18 #include <linux/string.h>
19 #include <linux/slab.h>
20 #include <linux/aer.h>
26 * The PCIe Capability Interrupt Message Number (PCIe r3.1, sec 7.8.2) must
27 * be one of the first 32 MSI-X entries. Per PCI r3.0, sec 6.8.3.1, MSI
28 * supports a maximum of 32 vectors per function.
30 #define PCIE_PORT_MAX_MSI_ENTRIES 32
32 #define get_descriptor_id(type, service) (((type - 4) << 8) | service)
34 struct portdrv_service_data
{
35 struct pcie_port_service_driver
*drv
;
41 * release_pcie_device - free PCI Express port service device structure
42 * @dev: Port service device to release
44 * Invoked automatically when device is being removed in response to
45 * device_unregister(dev). Release all resources being claimed.
47 static void release_pcie_device(struct device
*dev
)
49 kfree(to_pcie_device(dev
));
53 * Fill in *pme, *aer, *dpc with the relevant Interrupt Message Numbers if
54 * services are enabled in "mask". Return the number of MSI/MSI-X vectors
55 * required to accommodate the largest Message Number.
57 static int pcie_message_numbers(struct pci_dev
*dev
, int mask
,
58 u32
*pme
, u32
*aer
, u32
*dpc
)
64 * The Interrupt Message Number indicates which vector is used, i.e.,
65 * the MSI-X table entry or the MSI offset between the base Message
66 * Data and the generated interrupt message. See PCIe r3.1, sec
67 * 7.8.2, 7.10.10, 7.31.2.
70 if (mask
& (PCIE_PORT_SERVICE_PME
| PCIE_PORT_SERVICE_HP
|
71 PCIE_PORT_SERVICE_BWCTRL
)) {
72 pcie_capability_read_word(dev
, PCI_EXP_FLAGS
, ®16
);
73 *pme
= FIELD_GET(PCI_EXP_FLAGS_IRQ
, reg16
);
78 if (mask
& PCIE_PORT_SERVICE_AER
) {
83 pci_read_config_dword(dev
, pos
+ PCI_ERR_ROOT_STATUS
,
85 *aer
= FIELD_GET(PCI_ERR_ROOT_AER_IRQ
, reg32
);
86 nvec
= max(nvec
, *aer
+ 1);
91 if (mask
& PCIE_PORT_SERVICE_DPC
) {
92 pos
= pci_find_ext_capability(dev
, PCI_EXT_CAP_ID_DPC
);
94 pci_read_config_word(dev
, pos
+ PCI_EXP_DPC_CAP
,
96 *dpc
= FIELD_GET(PCI_EXP_DPC_IRQ
, reg16
);
97 nvec
= max(nvec
, *dpc
+ 1);
105 * pcie_port_enable_irq_vec - try to set up MSI-X or MSI as interrupt mode
107 * @dev: PCI Express port to handle
108 * @irqs: Array of interrupt vectors to populate
109 * @mask: Bitmask of port capabilities returned by get_port_device_capability()
111 * Return value: 0 on success, error code on failure
113 static int pcie_port_enable_irq_vec(struct pci_dev
*dev
, int *irqs
, int mask
)
115 int nr_entries
, nvec
, pcie_irq
;
116 u32 pme
= 0, aer
= 0, dpc
= 0;
118 /* Allocate the maximum possible number of MSI/MSI-X vectors */
119 nr_entries
= pci_alloc_irq_vectors(dev
, 1, PCIE_PORT_MAX_MSI_ENTRIES
,
120 PCI_IRQ_MSIX
| PCI_IRQ_MSI
);
124 /* See how many and which Interrupt Message Numbers we actually use */
125 nvec
= pcie_message_numbers(dev
, mask
, &pme
, &aer
, &dpc
);
126 if (nvec
> nr_entries
) {
127 pci_free_irq_vectors(dev
);
132 * If we allocated more than we need, free them and reallocate fewer.
134 * Reallocating may change the specific vectors we get, so
135 * pci_irq_vector() must be done *after* the reallocation.
137 * If we're using MSI, hardware is *allowed* to change the Interrupt
138 * Message Numbers when we free and reallocate the vectors, but we
139 * assume it won't because we allocate enough vectors for the
140 * biggest Message Number we found.
142 if (nvec
!= nr_entries
) {
143 pci_free_irq_vectors(dev
);
145 nr_entries
= pci_alloc_irq_vectors(dev
, nvec
, nvec
,
146 PCI_IRQ_MSIX
| PCI_IRQ_MSI
);
151 /* PME, hotplug and bandwidth notification share an MSI/MSI-X vector */
152 if (mask
& (PCIE_PORT_SERVICE_PME
| PCIE_PORT_SERVICE_HP
|
153 PCIE_PORT_SERVICE_BWCTRL
)) {
154 pcie_irq
= pci_irq_vector(dev
, pme
);
155 irqs
[PCIE_PORT_SERVICE_PME_SHIFT
] = pcie_irq
;
156 irqs
[PCIE_PORT_SERVICE_HP_SHIFT
] = pcie_irq
;
157 irqs
[PCIE_PORT_SERVICE_BWCTRL_SHIFT
] = pcie_irq
;
160 if (mask
& PCIE_PORT_SERVICE_AER
)
161 irqs
[PCIE_PORT_SERVICE_AER_SHIFT
] = pci_irq_vector(dev
, aer
);
163 if (mask
& PCIE_PORT_SERVICE_DPC
)
164 irqs
[PCIE_PORT_SERVICE_DPC_SHIFT
] = pci_irq_vector(dev
, dpc
);
170 * pcie_init_service_irqs - initialize irqs for PCI Express port services
171 * @dev: PCI Express port to handle
172 * @irqs: Array of irqs to populate
173 * @mask: Bitmask of port capabilities returned by get_port_device_capability()
175 * Return value: Interrupt mode associated with the port
177 static int pcie_init_service_irqs(struct pci_dev
*dev
, int *irqs
, int mask
)
181 for (i
= 0; i
< PCIE_PORT_DEVICE_MAXSERVICES
; i
++)
185 * If we support PME but can't use MSI/MSI-X for it, we have to
186 * fall back to INTx or other interrupts, e.g., a system shared
189 if ((mask
& PCIE_PORT_SERVICE_PME
) && pcie_pme_no_msi())
192 /* Try to use MSI-X or MSI if supported */
193 if (pcie_port_enable_irq_vec(dev
, irqs
, mask
) == 0)
197 /* fall back to INTX IRQ */
198 ret
= pci_alloc_irq_vectors(dev
, 1, 1, PCI_IRQ_INTX
);
202 for (i
= 0; i
< PCIE_PORT_DEVICE_MAXSERVICES
; i
++)
203 irqs
[i
] = pci_irq_vector(dev
, 0);
209 * get_port_device_capability - discover capabilities of a PCI Express port
210 * @dev: PCI Express port to examine
212 * The capabilities are read from the port's PCI Express configuration registers
213 * as described in PCI Express Base Specification 1.0a sections 7.8.2, 7.8.9 and
216 * Return value: Bitmask of discovered port capabilities
218 static int get_port_device_capability(struct pci_dev
*dev
)
220 struct pci_host_bridge
*host
= pci_find_host_bridge(dev
->bus
);
223 if (dev
->is_hotplug_bridge
&&
224 (pci_pcie_type(dev
) == PCI_EXP_TYPE_ROOT_PORT
||
225 pci_pcie_type(dev
) == PCI_EXP_TYPE_DOWNSTREAM
) &&
226 (pcie_ports_native
|| host
->native_pcie_hotplug
)) {
227 services
|= PCIE_PORT_SERVICE_HP
;
230 * Disable hot-plug interrupts in case they have been enabled
231 * by the BIOS and the hot-plug service driver is not loaded.
233 pcie_capability_clear_word(dev
, PCI_EXP_SLTCTL
,
234 PCI_EXP_SLTCTL_CCIE
| PCI_EXP_SLTCTL_HPIE
);
237 #ifdef CONFIG_PCIEAER
238 if ((pci_pcie_type(dev
) == PCI_EXP_TYPE_ROOT_PORT
||
239 pci_pcie_type(dev
) == PCI_EXP_TYPE_RC_EC
) &&
240 dev
->aer_cap
&& pci_aer_available() &&
241 (pcie_ports_native
|| host
->native_aer
))
242 services
|= PCIE_PORT_SERVICE_AER
;
245 /* Root Ports and Root Complex Event Collectors may generate PMEs */
246 if ((pci_pcie_type(dev
) == PCI_EXP_TYPE_ROOT_PORT
||
247 pci_pcie_type(dev
) == PCI_EXP_TYPE_RC_EC
) &&
248 (pcie_ports_native
|| host
->native_pme
)) {
249 services
|= PCIE_PORT_SERVICE_PME
;
252 * Disable PME interrupt on this port in case it's been enabled
253 * by the BIOS (the PME service driver will enable it when
256 pcie_pme_interrupt_enable(dev
, false);
260 * With dpc-native, allow Linux to use DPC even if it doesn't have
261 * permission to use AER.
263 if (pci_find_ext_capability(dev
, PCI_EXT_CAP_ID_DPC
) &&
264 pci_aer_available() &&
265 (pcie_ports_dpc_native
|| (services
& PCIE_PORT_SERVICE_AER
)))
266 services
|= PCIE_PORT_SERVICE_DPC
;
268 if (pci_pcie_type(dev
) == PCI_EXP_TYPE_DOWNSTREAM
||
269 pci_pcie_type(dev
) == PCI_EXP_TYPE_ROOT_PORT
) {
272 pcie_capability_read_dword(dev
, PCI_EXP_LNKCAP
, &linkcap
);
273 if (linkcap
& PCI_EXP_LNKCAP_LBNC
)
274 services
|= PCIE_PORT_SERVICE_BWCTRL
;
281 * pcie_device_init - allocate and initialize PCI Express port service device
282 * @pdev: PCI Express port to associate the service device with
283 * @service: Type of service to associate with the service device
284 * @irq: Interrupt vector to associate with the service device
286 static int pcie_device_init(struct pci_dev
*pdev
, int service
, int irq
)
289 struct pcie_device
*pcie
;
290 struct device
*device
;
292 pcie
= kzalloc(sizeof(*pcie
), GFP_KERNEL
);
297 pcie
->service
= service
;
299 /* Initialize generic device interface */
300 device
= &pcie
->device
;
301 device
->bus
= &pcie_port_bus_type
;
302 device
->release
= release_pcie_device
; /* callback to free pcie dev */
303 dev_set_name(device
, "%s:pcie%03x",
305 get_descriptor_id(pci_pcie_type(pdev
), service
));
306 device
->parent
= &pdev
->dev
;
307 device_enable_async_suspend(device
);
309 retval
= device_register(device
);
315 pm_runtime_no_callbacks(device
);
321 * pcie_port_device_register - register PCI Express port
322 * @dev: PCI Express port to register
324 * Allocate the port extension structure and register services associated with
327 static int pcie_port_device_register(struct pci_dev
*dev
)
329 int status
, capabilities
, i
, nr_service
;
330 int irqs
[PCIE_PORT_DEVICE_MAXSERVICES
];
332 /* Enable PCI Express port device */
333 status
= pci_enable_device(dev
);
337 /* Get and check PCI Express port services */
338 capabilities
= get_port_device_capability(dev
);
344 * Initialize service irqs. Don't use service devices that
345 * require interrupts if there is no way to generate them.
346 * However, some drivers may have a polling mode (e.g. pciehp_poll_mode)
347 * that can be used in the absence of irqs. Allow them to determine
348 * if that is to be used.
350 status
= pcie_init_service_irqs(dev
, irqs
, capabilities
);
352 capabilities
&= PCIE_PORT_SERVICE_HP
;
357 /* Allocate child services if any */
360 for (i
= 0; i
< PCIE_PORT_DEVICE_MAXSERVICES
; i
++) {
361 int service
= 1 << i
;
362 if (!(capabilities
& service
))
364 if (!pcie_device_init(dev
, service
, irqs
[i
]))
368 goto error_cleanup_irqs
;
373 pci_free_irq_vectors(dev
);
375 pci_disable_device(dev
);
379 typedef int (*pcie_callback_t
)(struct pcie_device
*);
381 static int pcie_port_device_iter(struct device
*dev
, void *data
)
383 struct pcie_port_service_driver
*service_driver
;
384 size_t offset
= *(size_t *)data
;
387 if ((dev
->bus
== &pcie_port_bus_type
) && dev
->driver
) {
388 service_driver
= to_service_driver(dev
->driver
);
389 cb
= *(pcie_callback_t
*)((void *)service_driver
+ offset
);
391 return cb(to_pcie_device(dev
));
398 * pcie_port_device_suspend - suspend port services associated with a PCIe port
399 * @dev: PCI Express port to handle
401 static int pcie_port_device_suspend(struct device
*dev
)
403 size_t off
= offsetof(struct pcie_port_service_driver
, suspend
);
404 return device_for_each_child(dev
, &off
, pcie_port_device_iter
);
407 static int pcie_port_device_resume_noirq(struct device
*dev
)
409 size_t off
= offsetof(struct pcie_port_service_driver
, resume_noirq
);
410 return device_for_each_child(dev
, &off
, pcie_port_device_iter
);
414 * pcie_port_device_resume - resume port services associated with a PCIe port
415 * @dev: PCI Express port to handle
417 static int pcie_port_device_resume(struct device
*dev
)
419 size_t off
= offsetof(struct pcie_port_service_driver
, resume
);
420 return device_for_each_child(dev
, &off
, pcie_port_device_iter
);
424 * pcie_port_device_runtime_suspend - runtime suspend port services
425 * @dev: PCI Express port to handle
427 static int pcie_port_device_runtime_suspend(struct device
*dev
)
429 size_t off
= offsetof(struct pcie_port_service_driver
, runtime_suspend
);
430 return device_for_each_child(dev
, &off
, pcie_port_device_iter
);
434 * pcie_port_device_runtime_resume - runtime resume port services
435 * @dev: PCI Express port to handle
437 static int pcie_port_device_runtime_resume(struct device
*dev
)
439 size_t off
= offsetof(struct pcie_port_service_driver
, runtime_resume
);
440 return device_for_each_child(dev
, &off
, pcie_port_device_iter
);
444 static int remove_iter(struct device
*dev
, void *data
)
446 if (dev
->bus
== &pcie_port_bus_type
)
447 device_unregister(dev
);
451 static int find_service_iter(struct device
*device
, void *data
)
453 struct pcie_port_service_driver
*service_driver
;
454 struct portdrv_service_data
*pdrvs
;
457 pdrvs
= (struct portdrv_service_data
*) data
;
458 service
= pdrvs
->service
;
460 if (device
->bus
== &pcie_port_bus_type
&& device
->driver
) {
461 service_driver
= to_service_driver(device
->driver
);
462 if (service_driver
->service
== service
) {
463 pdrvs
->drv
= service_driver
;
473 * pcie_port_find_device - find the struct device
474 * @dev: PCI Express port the service is associated with
475 * @service: For the service to find
477 * Find the struct device associated with given service on a pci_dev
479 struct device
*pcie_port_find_device(struct pci_dev
*dev
,
482 struct device
*device
;
483 struct portdrv_service_data pdrvs
;
486 pdrvs
.service
= service
;
487 device_for_each_child(&dev
->dev
, &pdrvs
, find_service_iter
);
492 EXPORT_SYMBOL_GPL(pcie_port_find_device
);
495 * pcie_port_device_remove - unregister PCI Express port service devices
496 * @dev: PCI Express port the service devices to unregister are associated with
498 * Remove PCI Express port service devices associated with given port and
499 * disable MSI-X or MSI for the port.
501 static void pcie_port_device_remove(struct pci_dev
*dev
)
503 device_for_each_child(&dev
->dev
, NULL
, remove_iter
);
504 pci_free_irq_vectors(dev
);
508 * pcie_port_probe_service - probe driver for given PCI Express port service
509 * @dev: PCI Express port service device to probe against
511 * If PCI Express port service driver is registered with
512 * pcie_port_service_register(), this function will be called by the driver core
513 * whenever match is found between the driver and a port service device.
515 static int pcie_port_probe_service(struct device
*dev
)
517 struct pcie_device
*pciedev
;
518 struct pcie_port_service_driver
*driver
;
521 if (!dev
|| !dev
->driver
)
524 driver
= to_service_driver(dev
->driver
);
525 if (!driver
|| !driver
->probe
)
528 pciedev
= to_pcie_device(dev
);
529 status
= driver
->probe(pciedev
);
538 * pcie_port_remove_service - detach driver from given PCI Express port service
539 * @dev: PCI Express port service device to handle
541 * If PCI Express port service driver is registered with
542 * pcie_port_service_register(), this function will be called by the driver core
543 * when device_unregister() is called for the port service device associated
546 static int pcie_port_remove_service(struct device
*dev
)
548 struct pcie_device
*pciedev
;
549 struct pcie_port_service_driver
*driver
;
551 if (!dev
|| !dev
->driver
)
554 pciedev
= to_pcie_device(dev
);
555 driver
= to_service_driver(dev
->driver
);
556 if (driver
&& driver
->remove
) {
557 driver
->remove(pciedev
);
564 * pcie_port_shutdown_service - shut down given PCI Express port service
565 * @dev: PCI Express port service device to handle
567 * If PCI Express port service driver is registered with
568 * pcie_port_service_register(), this function will be called by the driver core
569 * when device_shutdown() is called for the port service device associated
572 static void pcie_port_shutdown_service(struct device
*dev
) {}
575 * pcie_port_service_register - register PCI Express port service driver
576 * @new: PCI Express port service driver to register
578 int pcie_port_service_register(struct pcie_port_service_driver
*new)
580 if (pcie_ports_disabled
)
583 new->driver
.name
= new->name
;
584 new->driver
.bus
= &pcie_port_bus_type
;
585 new->driver
.probe
= pcie_port_probe_service
;
586 new->driver
.remove
= pcie_port_remove_service
;
587 new->driver
.shutdown
= pcie_port_shutdown_service
;
589 return driver_register(&new->driver
);
593 * pcie_port_service_unregister - unregister PCI Express port service driver
594 * @drv: PCI Express port service driver to unregister
596 void pcie_port_service_unregister(struct pcie_port_service_driver
*drv
)
598 driver_unregister(&drv
->driver
);
601 /* If this switch is set, PCIe port native services should not be enabled. */
602 bool pcie_ports_disabled
;
605 * If the user specified "pcie_ports=native", use the PCIe services regardless
606 * of whether the platform has given us permission. On ACPI systems, this
607 * means we ignore _OSC.
609 bool pcie_ports_native
;
612 * If the user specified "pcie_ports=dpc-native", use the Linux DPC PCIe
613 * service even if the platform hasn't given us permission.
615 bool pcie_ports_dpc_native
;
617 static int __init
pcie_port_setup(char *str
)
619 if (!strncmp(str
, "compat", 6))
620 pcie_ports_disabled
= true;
621 else if (!strncmp(str
, "native", 6))
622 pcie_ports_native
= true;
623 else if (!strncmp(str
, "dpc-native", 10))
624 pcie_ports_dpc_native
= true;
628 __setup("pcie_ports=", pcie_port_setup
);
633 static int pcie_port_runtime_suspend(struct device
*dev
)
635 if (!to_pci_dev(dev
)->bridge_d3
)
638 return pcie_port_device_runtime_suspend(dev
);
641 static int pcie_port_runtime_idle(struct device
*dev
)
644 * Assume the PCI core has set bridge_d3 whenever it thinks the port
645 * should be good to go to D3. Everything else, including moving
646 * the port to D3, is handled by the PCI core.
648 return to_pci_dev(dev
)->bridge_d3
? 0 : -EBUSY
;
651 static const struct dev_pm_ops pcie_portdrv_pm_ops
= {
652 .suspend
= pcie_port_device_suspend
,
653 .resume_noirq
= pcie_port_device_resume_noirq
,
654 .resume
= pcie_port_device_resume
,
655 .freeze
= pcie_port_device_suspend
,
656 .thaw
= pcie_port_device_resume
,
657 .poweroff
= pcie_port_device_suspend
,
658 .restore_noirq
= pcie_port_device_resume_noirq
,
659 .restore
= pcie_port_device_resume
,
660 .runtime_suspend
= pcie_port_runtime_suspend
,
661 .runtime_resume
= pcie_port_device_runtime_resume
,
662 .runtime_idle
= pcie_port_runtime_idle
,
665 #define PCIE_PORTDRV_PM_OPS (&pcie_portdrv_pm_ops)
669 #define PCIE_PORTDRV_PM_OPS NULL
673 * pcie_portdrv_probe - Probe PCI-Express port devices
674 * @dev: PCI-Express port device being probed
676 * If detected invokes the pcie_port_device_register() method for
680 static int pcie_portdrv_probe(struct pci_dev
*dev
,
681 const struct pci_device_id
*id
)
683 int type
= pci_pcie_type(dev
);
686 if (!pci_is_pcie(dev
) ||
687 ((type
!= PCI_EXP_TYPE_ROOT_PORT
) &&
688 (type
!= PCI_EXP_TYPE_UPSTREAM
) &&
689 (type
!= PCI_EXP_TYPE_DOWNSTREAM
) &&
690 (type
!= PCI_EXP_TYPE_RC_EC
)))
693 if (type
== PCI_EXP_TYPE_RC_EC
)
696 status
= pcie_port_device_register(dev
);
702 dev_pm_set_driver_flags(&dev
->dev
, DPM_FLAG_NO_DIRECT_COMPLETE
|
703 DPM_FLAG_SMART_SUSPEND
);
705 if (pci_bridge_d3_possible(dev
)) {
707 * Keep the port resumed 100ms to make sure things like
708 * config space accesses from userspace (lspci) will not
709 * cause the port to repeatedly suspend and resume.
711 pm_runtime_set_autosuspend_delay(&dev
->dev
, 100);
712 pm_runtime_use_autosuspend(&dev
->dev
);
713 pm_runtime_mark_last_busy(&dev
->dev
);
714 pm_runtime_put_autosuspend(&dev
->dev
);
715 pm_runtime_allow(&dev
->dev
);
721 static void pcie_portdrv_remove(struct pci_dev
*dev
)
723 if (pci_bridge_d3_possible(dev
)) {
724 pm_runtime_forbid(&dev
->dev
);
725 pm_runtime_get_noresume(&dev
->dev
);
726 pm_runtime_dont_use_autosuspend(&dev
->dev
);
729 pcie_port_device_remove(dev
);
731 pci_disable_device(dev
);
734 static void pcie_portdrv_shutdown(struct pci_dev
*dev
)
736 if (pci_bridge_d3_possible(dev
)) {
737 pm_runtime_forbid(&dev
->dev
);
738 pm_runtime_get_noresume(&dev
->dev
);
739 pm_runtime_dont_use_autosuspend(&dev
->dev
);
742 pcie_port_device_remove(dev
);
745 static pci_ers_result_t
pcie_portdrv_error_detected(struct pci_dev
*dev
,
746 pci_channel_state_t error
)
748 if (error
== pci_channel_io_frozen
)
749 return PCI_ERS_RESULT_NEED_RESET
;
750 return PCI_ERS_RESULT_CAN_RECOVER
;
753 static pci_ers_result_t
pcie_portdrv_slot_reset(struct pci_dev
*dev
)
755 size_t off
= offsetof(struct pcie_port_service_driver
, slot_reset
);
756 device_for_each_child(&dev
->dev
, &off
, pcie_port_device_iter
);
758 pci_restore_state(dev
);
760 return PCI_ERS_RESULT_RECOVERED
;
763 static pci_ers_result_t
pcie_portdrv_mmio_enabled(struct pci_dev
*dev
)
765 return PCI_ERS_RESULT_RECOVERED
;
769 * LINUX Device Driver Model
771 static const struct pci_device_id port_pci_ids
[] = {
772 /* handle any PCI-Express port */
773 { PCI_DEVICE_CLASS(PCI_CLASS_BRIDGE_PCI_NORMAL
, ~0) },
774 /* subtractive decode PCI-to-PCI bridge, class type is 060401h */
775 { PCI_DEVICE_CLASS(PCI_CLASS_BRIDGE_PCI_SUBTRACTIVE
, ~0) },
776 /* handle any Root Complex Event Collector */
777 { PCI_DEVICE_CLASS(((PCI_CLASS_SYSTEM_RCEC
<< 8) | 0x00), ~0) },
781 static const struct pci_error_handlers pcie_portdrv_err_handler
= {
782 .error_detected
= pcie_portdrv_error_detected
,
783 .slot_reset
= pcie_portdrv_slot_reset
,
784 .mmio_enabled
= pcie_portdrv_mmio_enabled
,
787 static struct pci_driver pcie_portdriver
= {
789 .id_table
= port_pci_ids
,
791 .probe
= pcie_portdrv_probe
,
792 .remove
= pcie_portdrv_remove
,
793 .shutdown
= pcie_portdrv_shutdown
,
795 .err_handler
= &pcie_portdrv_err_handler
,
797 .driver_managed_dma
= true,
799 .driver
.pm
= PCIE_PORTDRV_PM_OPS
,
802 static int __init
dmi_pcie_pme_disable_msi(const struct dmi_system_id
*d
)
804 pr_notice("%s detected: will not use MSI for PCIe PME signaling\n",
806 pcie_pme_disable_msi();
810 static const struct dmi_system_id pcie_portdrv_dmi_table
[] __initconst
= {
812 * Boxes that should not use MSI for PCIe PME signaling.
815 .callback
= dmi_pcie_pme_disable_msi
,
816 .ident
= "MSI Wind U-100",
818 DMI_MATCH(DMI_SYS_VENDOR
,
819 "MICRO-STAR INTERNATIONAL CO., LTD"),
820 DMI_MATCH(DMI_PRODUCT_NAME
, "U-100"),
826 static void __init
pcie_init_services(void)
835 static int __init
pcie_portdrv_init(void)
837 if (pcie_ports_disabled
)
840 pcie_init_services();
841 dmi_check_system(pcie_portdrv_dmi_table
);
843 return pci_register_driver(&pcie_portdriver
);
845 device_initcall(pcie_portdrv_init
);