3 * Purpose: PCI Express Port Bus Driver's Core Functions
5 * Copyright (C) 2004 Intel
6 * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
9 #include <linux/module.h>
10 #include <linux/pci.h>
11 #include <linux/kernel.h>
12 #include <linux/errno.h>
14 #include <linux/pcieport_if.h>
18 extern int pcie_mch_quirk; /* MSI-quirk Indicator */
20 extern struct device_driver pcieport_generic_driver;
22 static int pcie_port_probe_service(struct device *dev)
24 struct pcie_device *pciedev;
25 struct pcie_port_service_driver *driver;
28 if (!dev || !dev->driver)
31 driver = to_service_driver(dev->driver);
32 if (!driver || !driver->probe)
35 pciedev = to_pcie_device(dev);
36 status = driver->probe(pciedev, driver->id_table);
38 printk(KERN_DEBUG "Load service driver %s on pcie device %s\n",
39 driver->name, dev->bus_id);
45 static int pcie_port_remove_service(struct device *dev)
47 struct pcie_device *pciedev;
48 struct pcie_port_service_driver *driver;
50 if (!dev || !dev->driver)
53 pciedev = to_pcie_device(dev);
54 driver = to_service_driver(dev->driver);
55 if (driver && driver->remove) {
56 printk(KERN_DEBUG "Unload service driver %s on pcie device %s\n",
57 driver->name, dev->bus_id);
58 driver->remove(pciedev);
64 static void pcie_port_shutdown_service(struct device *dev) {}
66 static int pcie_port_suspend_service(struct device *dev, u32 state, u32 level)
68 struct pcie_device *pciedev;
69 struct pcie_port_service_driver *driver;
71 if (!dev || !dev->driver)
74 pciedev = to_pcie_device(dev);
75 driver = to_service_driver(dev->driver);
76 if (driver && driver->suspend)
77 driver->suspend(pciedev, state);
81 static int pcie_port_resume_service(struct device *dev, u32 state)
83 struct pcie_device *pciedev;
84 struct pcie_port_service_driver *driver;
86 if (!dev || !dev->driver)
89 pciedev = to_pcie_device(dev);
90 driver = to_service_driver(dev->driver);
92 if (driver && driver->resume)
93 driver->resume(pciedev);
100 * Being invoked automatically when device is being removed
101 * in response to device_unregister(dev) call.
102 * Release all resources being claimed.
104 static void release_pcie_device(struct device *dev)
106 kfree(to_pcie_device(dev));
109 static int is_msi_quirked(struct pci_dev *dev)
111 int port_type, quirk = 0;
114 pci_read_config_word(dev,
115 pci_find_capability(dev, PCI_CAP_ID_EXP) +
116 PCIE_CAPABILITIES_REG, ®16);
117 port_type = (reg16 >> 4) & PORT_TYPE_MASK;
120 if (pcie_mch_quirk == 1)
123 case PCIE_SW_UPSTREAM_PORT:
124 case PCIE_SW_DOWNSTREAM_PORT:
131 static int assign_interrupt_mode(struct pci_dev *dev, int *vectors, int mask)
133 int i, pos, nvec, status = -EINVAL;
134 int interrupt_mode = PCIE_PORT_INTx_MODE;
136 /* Set INTx as default */
137 for (i = 0, nvec = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) {
140 vectors[i] = dev->irq;
143 /* Check MSI quirk */
144 if (is_msi_quirked(dev))
145 return interrupt_mode;
147 /* Select MSI-X over MSI if supported */
148 pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
150 struct msix_entry msix_entries[PCIE_PORT_DEVICE_MAXSERVICES] =
151 {{0, 0}, {0, 1}, {0, 2}, {0, 3}};
152 printk("%s Found MSIX capability\n", __FUNCTION__);
153 status = pci_enable_msix(dev, msix_entries, nvec);
157 interrupt_mode = PCIE_PORT_MSIX_MODE;
158 for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) {
160 vectors[i] = msix_entries[j++].vector;
165 pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
167 printk("%s Found MSI capability\n", __FUNCTION__);
168 status = pci_enable_msi(dev);
170 interrupt_mode = PCIE_PORT_MSI_MODE;
171 for (i = 0;i < PCIE_PORT_DEVICE_MAXSERVICES;i++)
172 vectors[i] = dev->irq;
176 return interrupt_mode;
179 static int get_port_device_capability(struct pci_dev *dev)
181 int services = 0, pos;
185 pos = pci_find_capability(dev, PCI_CAP_ID_EXP);
186 pci_read_config_word(dev, pos + PCIE_CAPABILITIES_REG, ®16);
187 /* Hot-Plug Capable */
188 if (reg16 & PORT_TO_SLOT_MASK) {
189 pci_read_config_dword(dev,
190 pos + PCIE_SLOT_CAPABILITIES_REG, ®32);
191 if (reg32 & SLOT_HP_CAPABLE_MASK)
192 services |= PCIE_PORT_SERVICE_HP;
195 pos = pci_find_capability(dev, PCI_CAP_ID_PME);
197 services |= PCIE_PORT_SERVICE_PME;
199 pos = PCI_CFG_SPACE_SIZE;
201 pci_read_config_dword(dev, pos, ®32);
202 switch (reg32 & 0xffff) {
203 case PCI_EXT_CAP_ID_ERR:
204 services |= PCIE_PORT_SERVICE_AER;
207 case PCI_EXT_CAP_ID_VC:
208 services |= PCIE_PORT_SERVICE_VC;
220 static void pcie_device_init(struct pcie_device *parent,
221 struct pcie_device *dev,
222 int port_type, int service_type)
224 struct device *device;
227 dev->id.vendor = parent->port->vendor;
228 dev->id.device = parent->port->device;
229 dev->id.port_type = port_type;
230 dev->id.service_type = (1 << service_type);
233 /* Initialize generic device interface */
234 device = &dev->device;
235 memset(device, 0, sizeof(struct device));
236 INIT_LIST_HEAD(&device->node);
237 INIT_LIST_HEAD(&device->children);
238 INIT_LIST_HEAD(&device->bus_list);
239 device->bus = &pcie_port_bus_type;
240 device->driver = NULL;
241 device->driver_data = NULL;
242 device->release = release_pcie_device; /* callback to free pcie dev */
243 sprintf(&device->bus_id[0], "%s.%02x", parent->device.bus_id,
244 get_descriptor_id(port_type, service_type));
245 device->parent = ((parent == NULL) ? NULL : &parent->device);
248 static struct pcie_device* alloc_pcie_device(
249 struct pcie_device *parent, struct pci_dev *bridge,
250 int port_type, int service_type, int irq, int irq_mode)
252 struct pcie_device *device;
253 static int NR_PORTS = 0;
255 device = kmalloc(sizeof(struct pcie_device), GFP_KERNEL);
259 memset(device, 0, sizeof(struct pcie_device));
260 device->port = bridge;
261 device->interrupt_mode = irq_mode;
264 pcie_device_init(NULL, device, port_type, service_type);
266 device->device.driver = &pcieport_generic_driver;
267 sprintf(&device->device.bus_id[0], "port%d", NR_PORTS);
269 pcie_device_init(parent, device, port_type, service_type);
271 printk(KERN_DEBUG "Allocate Port Device[%s]\n", device->device.bus_id);
275 int pcie_port_device_probe(struct pci_dev *dev)
280 if (!(pos = pci_find_capability(dev, PCI_CAP_ID_EXP)))
283 pci_read_config_word(dev, pos + PCIE_CAPABILITIES_REG, ®);
284 type = (reg >> 4) & PORT_TYPE_MASK;
285 if ( type == PCIE_RC_PORT || type == PCIE_SW_UPSTREAM_PORT ||
286 type == PCIE_SW_DOWNSTREAM_PORT )
292 int pcie_port_device_register(struct pci_dev *dev)
294 struct pcie_device *parent;
295 int status, type, capabilities, irq_mode, i;
296 int vectors[PCIE_PORT_DEVICE_MAXSERVICES];
300 pci_read_config_word(dev,
301 pci_find_capability(dev, PCI_CAP_ID_EXP) +
302 PCIE_CAPABILITIES_REG, ®16);
303 type = (reg16 >> 4) & PORT_TYPE_MASK;
305 /* Now get port services */
306 capabilities = get_port_device_capability(dev);
307 irq_mode = assign_interrupt_mode(dev, vectors, capabilities);
309 /* Allocate parent */
310 parent = alloc_pcie_device(NULL, dev, type, 0, dev->irq, irq_mode);
314 status = device_register(&parent->device);
319 get_device(&parent->device);
320 pci_set_drvdata(dev, parent);
322 /* Allocate child services if any */
323 for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) {
324 struct pcie_device *child;
326 if (capabilities & (1 << i)) {
327 child = alloc_pcie_device(
329 dev, /* Root/Upstream/Downstream */
330 type, /* port type */
331 i, /* service type */
332 vectors[i], /* irq */
333 irq_mode /* interrupt mode */);
335 status = device_register(&child->device);
340 get_device(&child->device);
348 int pcie_port_device_suspend(struct pcie_device *dev, u32 state)
350 struct list_head *head;
351 struct device *parent, *child;
352 struct device_driver *driver;
353 struct pcie_port_service_driver *service_driver;
355 parent = &dev->device;
356 head = &parent->children;
357 while (!list_empty(head)) {
358 child = container_of(head->next, struct device, node);
359 driver = child->driver;
362 service_driver = to_service_driver(driver);
363 if (service_driver->suspend)
364 service_driver->suspend(to_pcie_device(child), state);
369 int pcie_port_device_resume(struct pcie_device *dev)
371 struct list_head *head;
372 struct device *parent, *child;
373 struct device_driver *driver;
374 struct pcie_port_service_driver *service_driver;
376 parent = &dev->device;
377 head = &parent->children;
378 while (!list_empty(head)) {
379 child = container_of(head->next, struct device, node);
380 driver = child->driver;
383 service_driver = to_service_driver(driver);
384 if (service_driver->resume)
385 service_driver->resume(to_pcie_device(child));
392 void pcie_port_device_remove(struct pcie_device *dev)
394 struct list_head *head;
395 struct device *parent, *child;
396 struct device_driver *driver;
397 struct pcie_port_service_driver *service_driver;
399 parent = &dev->device;
400 head = &parent->children;
401 while (!list_empty(head)) {
402 child = container_of(head->next, struct device, node);
403 driver = child->driver;
405 service_driver = to_service_driver(driver);
406 if (service_driver->remove)
407 service_driver->remove(to_pcie_device(child));
410 device_unregister(child);
413 /* Switch to INTx by default if MSI enabled */
414 if (dev->interrupt_mode == PCIE_PORT_MSIX_MODE)
415 pci_disable_msix(dev->port);
416 else if (dev->interrupt_mode == PCIE_PORT_MSI_MODE)
417 pci_disable_msi(dev->port);
419 device_unregister(parent);
422 void pcie_port_bus_register(void)
424 bus_register(&pcie_port_bus_type);
425 driver_register(&pcieport_generic_driver);
428 void pcie_port_bus_unregister(void)
430 driver_unregister(&pcieport_generic_driver);
431 bus_unregister(&pcie_port_bus_type);
434 int pcie_port_service_register(struct pcie_port_service_driver *new)
436 new->driver.name = (char *)new->name;
437 new->driver.bus = &pcie_port_bus_type;
438 new->driver.probe = pcie_port_probe_service;
439 new->driver.remove = pcie_port_remove_service;
440 new->driver.shutdown = pcie_port_shutdown_service;
441 new->driver.suspend = pcie_port_suspend_service;
442 new->driver.resume = pcie_port_resume_service;
444 return driver_register(&new->driver);
447 void pcie_port_service_unregister(struct pcie_port_service_driver *new)
449 driver_unregister(&new->driver);
452 EXPORT_SYMBOL(pcie_port_service_register);
453 EXPORT_SYMBOL(pcie_port_service_unregister);