0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/module.h>
0010 #include <linux/pci.h>
0011 #include <linux/kernel.h>
0012 #include <linux/errno.h>
0013 #include <linux/pm.h>
0014 #include <linux/pm_runtime.h>
0015 #include <linux/string.h>
0016 #include <linux/slab.h>
0017 #include <linux/aer.h>
0018
0019 #include "../pci.h"
0020 #include "portdrv.h"
0021
0022 struct portdrv_service_data {
0023 struct pcie_port_service_driver *drv;
0024 struct device *dev;
0025 u32 service;
0026 };
0027
0028
0029
0030
0031
0032
0033
0034
0035 static void release_pcie_device(struct device *dev)
0036 {
0037 kfree(to_pcie_device(dev));
0038 }
0039
0040
0041
0042
0043
0044
0045 static int pcie_message_numbers(struct pci_dev *dev, int mask,
0046 u32 *pme, u32 *aer, u32 *dpc)
0047 {
0048 u32 nvec = 0, pos;
0049 u16 reg16;
0050
0051
0052
0053
0054
0055
0056
0057
0058 if (mask & (PCIE_PORT_SERVICE_PME | PCIE_PORT_SERVICE_HP |
0059 PCIE_PORT_SERVICE_BWNOTIF)) {
0060 pcie_capability_read_word(dev, PCI_EXP_FLAGS, ®16);
0061 *pme = (reg16 & PCI_EXP_FLAGS_IRQ) >> 9;
0062 nvec = *pme + 1;
0063 }
0064
0065 #ifdef CONFIG_PCIEAER
0066 if (mask & PCIE_PORT_SERVICE_AER) {
0067 u32 reg32;
0068
0069 pos = dev->aer_cap;
0070 if (pos) {
0071 pci_read_config_dword(dev, pos + PCI_ERR_ROOT_STATUS,
0072 ®32);
0073 *aer = (reg32 & PCI_ERR_ROOT_AER_IRQ) >> 27;
0074 nvec = max(nvec, *aer + 1);
0075 }
0076 }
0077 #endif
0078
0079 if (mask & PCIE_PORT_SERVICE_DPC) {
0080 pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_DPC);
0081 if (pos) {
0082 pci_read_config_word(dev, pos + PCI_EXP_DPC_CAP,
0083 ®16);
0084 *dpc = reg16 & PCI_EXP_DPC_IRQ;
0085 nvec = max(nvec, *dpc + 1);
0086 }
0087 }
0088
0089 return nvec;
0090 }
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101 static int pcie_port_enable_irq_vec(struct pci_dev *dev, int *irqs, int mask)
0102 {
0103 int nr_entries, nvec, pcie_irq;
0104 u32 pme = 0, aer = 0, dpc = 0;
0105
0106
0107 nr_entries = pci_alloc_irq_vectors(dev, 1, PCIE_PORT_MAX_MSI_ENTRIES,
0108 PCI_IRQ_MSIX | PCI_IRQ_MSI);
0109 if (nr_entries < 0)
0110 return nr_entries;
0111
0112
0113 nvec = pcie_message_numbers(dev, mask, &pme, &aer, &dpc);
0114 if (nvec > nr_entries) {
0115 pci_free_irq_vectors(dev);
0116 return -EIO;
0117 }
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130 if (nvec != nr_entries) {
0131 pci_free_irq_vectors(dev);
0132
0133 nr_entries = pci_alloc_irq_vectors(dev, nvec, nvec,
0134 PCI_IRQ_MSIX | PCI_IRQ_MSI);
0135 if (nr_entries < 0)
0136 return nr_entries;
0137 }
0138
0139
0140 if (mask & (PCIE_PORT_SERVICE_PME | PCIE_PORT_SERVICE_HP |
0141 PCIE_PORT_SERVICE_BWNOTIF)) {
0142 pcie_irq = pci_irq_vector(dev, pme);
0143 irqs[PCIE_PORT_SERVICE_PME_SHIFT] = pcie_irq;
0144 irqs[PCIE_PORT_SERVICE_HP_SHIFT] = pcie_irq;
0145 irqs[PCIE_PORT_SERVICE_BWNOTIF_SHIFT] = pcie_irq;
0146 }
0147
0148 if (mask & PCIE_PORT_SERVICE_AER)
0149 irqs[PCIE_PORT_SERVICE_AER_SHIFT] = pci_irq_vector(dev, aer);
0150
0151 if (mask & PCIE_PORT_SERVICE_DPC)
0152 irqs[PCIE_PORT_SERVICE_DPC_SHIFT] = pci_irq_vector(dev, dpc);
0153
0154 return 0;
0155 }
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165 static int pcie_init_service_irqs(struct pci_dev *dev, int *irqs, int mask)
0166 {
0167 int ret, i;
0168
0169 for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++)
0170 irqs[i] = -1;
0171
0172
0173
0174
0175
0176
0177 if ((mask & PCIE_PORT_SERVICE_PME) && pcie_pme_no_msi())
0178 goto legacy_irq;
0179
0180
0181 if (pcie_port_enable_irq_vec(dev, irqs, mask) == 0)
0182 return 0;
0183
0184 legacy_irq:
0185
0186 ret = pci_alloc_irq_vectors(dev, 1, 1, PCI_IRQ_LEGACY);
0187 if (ret < 0)
0188 return -ENODEV;
0189
0190 for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++)
0191 irqs[i] = pci_irq_vector(dev, 0);
0192
0193 return 0;
0194 }
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206 static int get_port_device_capability(struct pci_dev *dev)
0207 {
0208 struct pci_host_bridge *host = pci_find_host_bridge(dev->bus);
0209 int services = 0;
0210
0211 if (dev->is_hotplug_bridge &&
0212 (pcie_ports_native || host->native_pcie_hotplug)) {
0213 services |= PCIE_PORT_SERVICE_HP;
0214
0215
0216
0217
0218
0219 pcie_capability_clear_word(dev, PCI_EXP_SLTCTL,
0220 PCI_EXP_SLTCTL_CCIE | PCI_EXP_SLTCTL_HPIE);
0221 }
0222
0223 #ifdef CONFIG_PCIEAER
0224 if (dev->aer_cap && pci_aer_available() &&
0225 (pcie_ports_native || host->native_aer))
0226 services |= PCIE_PORT_SERVICE_AER;
0227 #endif
0228
0229
0230 if ((pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT ||
0231 pci_pcie_type(dev) == PCI_EXP_TYPE_RC_EC) &&
0232 (pcie_ports_native || host->native_pme)) {
0233 services |= PCIE_PORT_SERVICE_PME;
0234
0235
0236
0237
0238
0239
0240 pcie_pme_interrupt_enable(dev, false);
0241 }
0242
0243
0244
0245
0246
0247 if (pci_find_ext_capability(dev, PCI_EXT_CAP_ID_DPC) &&
0248 pci_aer_available() &&
0249 (pcie_ports_dpc_native || (services & PCIE_PORT_SERVICE_AER)))
0250 services |= PCIE_PORT_SERVICE_DPC;
0251
0252 if (pci_pcie_type(dev) == PCI_EXP_TYPE_DOWNSTREAM ||
0253 pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT) {
0254 u32 linkcap;
0255
0256 pcie_capability_read_dword(dev, PCI_EXP_LNKCAP, &linkcap);
0257 if (linkcap & PCI_EXP_LNKCAP_LBNC)
0258 services |= PCIE_PORT_SERVICE_BWNOTIF;
0259 }
0260
0261 return services;
0262 }
0263
0264
0265
0266
0267
0268
0269
0270 static int pcie_device_init(struct pci_dev *pdev, int service, int irq)
0271 {
0272 int retval;
0273 struct pcie_device *pcie;
0274 struct device *device;
0275
0276 pcie = kzalloc(sizeof(*pcie), GFP_KERNEL);
0277 if (!pcie)
0278 return -ENOMEM;
0279 pcie->port = pdev;
0280 pcie->irq = irq;
0281 pcie->service = service;
0282
0283
0284 device = &pcie->device;
0285 device->bus = &pcie_port_bus_type;
0286 device->release = release_pcie_device;
0287 dev_set_name(device, "%s:pcie%03x",
0288 pci_name(pdev),
0289 get_descriptor_id(pci_pcie_type(pdev), service));
0290 device->parent = &pdev->dev;
0291 device_enable_async_suspend(device);
0292
0293 retval = device_register(device);
0294 if (retval) {
0295 put_device(device);
0296 return retval;
0297 }
0298
0299 pm_runtime_no_callbacks(device);
0300
0301 return 0;
0302 }
0303
0304
0305
0306
0307
0308
0309
0310
0311 int pcie_port_device_register(struct pci_dev *dev)
0312 {
0313 int status, capabilities, i, nr_service;
0314 int irqs[PCIE_PORT_DEVICE_MAXSERVICES];
0315
0316
0317 status = pci_enable_device(dev);
0318 if (status)
0319 return status;
0320
0321
0322 capabilities = get_port_device_capability(dev);
0323 if (!capabilities)
0324 return 0;
0325
0326 pci_set_master(dev);
0327
0328
0329
0330
0331
0332
0333
0334 status = pcie_init_service_irqs(dev, irqs, capabilities);
0335 if (status) {
0336 capabilities &= PCIE_PORT_SERVICE_HP;
0337 if (!capabilities)
0338 goto error_disable;
0339 }
0340
0341
0342 status = -ENODEV;
0343 nr_service = 0;
0344 for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) {
0345 int service = 1 << i;
0346 if (!(capabilities & service))
0347 continue;
0348 if (!pcie_device_init(dev, service, irqs[i]))
0349 nr_service++;
0350 }
0351 if (!nr_service)
0352 goto error_cleanup_irqs;
0353
0354 return 0;
0355
0356 error_cleanup_irqs:
0357 pci_free_irq_vectors(dev);
0358 error_disable:
0359 pci_disable_device(dev);
0360 return status;
0361 }
0362
0363 typedef int (*pcie_callback_t)(struct pcie_device *);
0364
0365 int pcie_port_device_iter(struct device *dev, void *data)
0366 {
0367 struct pcie_port_service_driver *service_driver;
0368 size_t offset = *(size_t *)data;
0369 pcie_callback_t cb;
0370
0371 if ((dev->bus == &pcie_port_bus_type) && dev->driver) {
0372 service_driver = to_service_driver(dev->driver);
0373 cb = *(pcie_callback_t *)((void *)service_driver + offset);
0374 if (cb)
0375 return cb(to_pcie_device(dev));
0376 }
0377 return 0;
0378 }
0379
0380 #ifdef CONFIG_PM
0381
0382
0383
0384
0385 int pcie_port_device_suspend(struct device *dev)
0386 {
0387 size_t off = offsetof(struct pcie_port_service_driver, suspend);
0388 return device_for_each_child(dev, &off, pcie_port_device_iter);
0389 }
0390
0391 int pcie_port_device_resume_noirq(struct device *dev)
0392 {
0393 size_t off = offsetof(struct pcie_port_service_driver, resume_noirq);
0394 return device_for_each_child(dev, &off, pcie_port_device_iter);
0395 }
0396
0397
0398
0399
0400
0401 int pcie_port_device_resume(struct device *dev)
0402 {
0403 size_t off = offsetof(struct pcie_port_service_driver, resume);
0404 return device_for_each_child(dev, &off, pcie_port_device_iter);
0405 }
0406
0407
0408
0409
0410
0411 int pcie_port_device_runtime_suspend(struct device *dev)
0412 {
0413 size_t off = offsetof(struct pcie_port_service_driver, runtime_suspend);
0414 return device_for_each_child(dev, &off, pcie_port_device_iter);
0415 }
0416
0417
0418
0419
0420
0421 int pcie_port_device_runtime_resume(struct device *dev)
0422 {
0423 size_t off = offsetof(struct pcie_port_service_driver, runtime_resume);
0424 return device_for_each_child(dev, &off, pcie_port_device_iter);
0425 }
0426 #endif
0427
0428 static int remove_iter(struct device *dev, void *data)
0429 {
0430 if (dev->bus == &pcie_port_bus_type)
0431 device_unregister(dev);
0432 return 0;
0433 }
0434
0435 static int find_service_iter(struct device *device, void *data)
0436 {
0437 struct pcie_port_service_driver *service_driver;
0438 struct portdrv_service_data *pdrvs;
0439 u32 service;
0440
0441 pdrvs = (struct portdrv_service_data *) data;
0442 service = pdrvs->service;
0443
0444 if (device->bus == &pcie_port_bus_type && device->driver) {
0445 service_driver = to_service_driver(device->driver);
0446 if (service_driver->service == service) {
0447 pdrvs->drv = service_driver;
0448 pdrvs->dev = device;
0449 return 1;
0450 }
0451 }
0452
0453 return 0;
0454 }
0455
0456
0457
0458
0459
0460
0461
0462
0463 struct device *pcie_port_find_device(struct pci_dev *dev,
0464 u32 service)
0465 {
0466 struct device *device;
0467 struct portdrv_service_data pdrvs;
0468
0469 pdrvs.dev = NULL;
0470 pdrvs.service = service;
0471 device_for_each_child(&dev->dev, &pdrvs, find_service_iter);
0472
0473 device = pdrvs.dev;
0474 return device;
0475 }
0476 EXPORT_SYMBOL_GPL(pcie_port_find_device);
0477
0478
0479
0480
0481
0482
0483
0484
0485 void pcie_port_device_remove(struct pci_dev *dev)
0486 {
0487 device_for_each_child(&dev->dev, NULL, remove_iter);
0488 pci_free_irq_vectors(dev);
0489 pci_disable_device(dev);
0490 }
0491
0492
0493
0494
0495
0496
0497
0498
0499
0500 static int pcie_port_probe_service(struct device *dev)
0501 {
0502 struct pcie_device *pciedev;
0503 struct pcie_port_service_driver *driver;
0504 int status;
0505
0506 if (!dev || !dev->driver)
0507 return -ENODEV;
0508
0509 driver = to_service_driver(dev->driver);
0510 if (!driver || !driver->probe)
0511 return -ENODEV;
0512
0513 pciedev = to_pcie_device(dev);
0514 status = driver->probe(pciedev);
0515 if (status)
0516 return status;
0517
0518 get_device(dev);
0519 return 0;
0520 }
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531 static int pcie_port_remove_service(struct device *dev)
0532 {
0533 struct pcie_device *pciedev;
0534 struct pcie_port_service_driver *driver;
0535
0536 if (!dev || !dev->driver)
0537 return 0;
0538
0539 pciedev = to_pcie_device(dev);
0540 driver = to_service_driver(dev->driver);
0541 if (driver && driver->remove) {
0542 driver->remove(pciedev);
0543 put_device(dev);
0544 }
0545 return 0;
0546 }
0547
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557 static void pcie_port_shutdown_service(struct device *dev) {}
0558
0559
0560
0561
0562
0563 int pcie_port_service_register(struct pcie_port_service_driver *new)
0564 {
0565 if (pcie_ports_disabled)
0566 return -ENODEV;
0567
0568 new->driver.name = new->name;
0569 new->driver.bus = &pcie_port_bus_type;
0570 new->driver.probe = pcie_port_probe_service;
0571 new->driver.remove = pcie_port_remove_service;
0572 new->driver.shutdown = pcie_port_shutdown_service;
0573
0574 return driver_register(&new->driver);
0575 }
0576 EXPORT_SYMBOL(pcie_port_service_register);
0577
0578
0579
0580
0581
0582 void pcie_port_service_unregister(struct pcie_port_service_driver *drv)
0583 {
0584 driver_unregister(&drv->driver);
0585 }
0586 EXPORT_SYMBOL(pcie_port_service_unregister);