PCI: PCIe portdrv: Simplily probe callback of service drivers
[linux-2.6] / drivers / pci / pcie / portdrv_core.c
1 /*
2  * File:        portdrv_core.c
3  * Purpose:     PCI Express Port Bus Driver's Core Functions
4  *
5  * Copyright (C) 2004 Intel
6  * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
7  */
8
9 #include <linux/module.h>
10 #include <linux/pci.h>
11 #include <linux/kernel.h>
12 #include <linux/errno.h>
13 #include <linux/pm.h>
14 #include <linux/string.h>
15 #include <linux/slab.h>
16 #include <linux/pcieport_if.h>
17
18 #include "../pci.h"
19 #include "portdrv.h"
20
21 /**
22  * release_pcie_device - free PCI Express port service device structure
23  * @dev: Port service device to release
24  *
25  * Invoked automatically when device is being removed in response to
26  * device_unregister(dev).  Release all resources being claimed.
27  */
28 static void release_pcie_device(struct device *dev)
29 {
30         kfree(to_pcie_device(dev));                     
31 }
32
33 /**
34  * assign_interrupt_mode - choose interrupt mode for PCI Express port services
35  *                         (INTx, MSI-X, MSI) and set up vectors
36  * @dev: PCI Express port to handle
37  * @vectors: Array of interrupt vectors to populate
38  * @mask: Bitmask of port capabilities returned by get_port_device_capability()
39  *
40  * Return value: Interrupt mode associated with the port
41  */
42 static int assign_interrupt_mode(struct pci_dev *dev, int *vectors, int mask)
43 {
44         struct pcie_port_data *port_data = pci_get_drvdata(dev);
45         int i, pos, nvec, status = -EINVAL;
46         int interrupt_mode = PCIE_PORT_NO_IRQ;
47
48         /* Set INTx as default */
49         for (i = 0, nvec = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) {
50                 if (mask & (1 << i)) 
51                         nvec++;
52                 vectors[i] = dev->irq;
53         }
54         if (dev->pin)
55                 interrupt_mode = PCIE_PORT_INTx_MODE;
56
57         /* Check MSI quirk */
58         if (port_data->port_type == PCIE_RC_PORT && pcie_mch_quirk)
59                 return interrupt_mode;
60
61         /* Select MSI-X over MSI if supported */                
62         pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
63         if (pos) {
64                 struct msix_entry msix_entries[PCIE_PORT_DEVICE_MAXSERVICES] = 
65                         {{0, 0}, {0, 1}, {0, 2}, {0, 3}};
66                 status = pci_enable_msix(dev, msix_entries, nvec);
67                 if (!status) {
68                         int j = 0;
69
70                         interrupt_mode = PCIE_PORT_MSIX_MODE;
71                         for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) {
72                                 if (mask & (1 << i)) 
73                                         vectors[i] = msix_entries[j++].vector;
74                         }
75                 }
76         } 
77         if (status) {
78                 pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
79                 if (pos) {
80                         status = pci_enable_msi(dev);
81                         if (!status) {
82                                 interrupt_mode = PCIE_PORT_MSI_MODE;
83                                 for (i = 0;i < PCIE_PORT_DEVICE_MAXSERVICES;i++)
84                                         vectors[i] = dev->irq;
85                         }
86                 }
87         } 
88         return interrupt_mode;
89 }
90
91 /**
92  * get_port_device_capability - discover capabilities of a PCI Express port
93  * @dev: PCI Express port to examine
94  *
95  * The capabilities are read from the port's PCI Express configuration registers
96  * as described in PCI Express Base Specification 1.0a sections 7.8.2, 7.8.9 and
97  * 7.9 - 7.11.
98  *
99  * Return value: Bitmask of discovered port capabilities
100  */
101 static int get_port_device_capability(struct pci_dev *dev)
102 {
103         int services = 0, pos;
104         u16 reg16;
105         u32 reg32;
106
107         pos = pci_find_capability(dev, PCI_CAP_ID_EXP);
108         pci_read_config_word(dev, pos + PCIE_CAPABILITIES_REG, &reg16);
109         /* Hot-Plug Capable */
110         if (reg16 & PORT_TO_SLOT_MASK) {
111                 pci_read_config_dword(dev, 
112                         pos + PCIE_SLOT_CAPABILITIES_REG, &reg32);
113                 if (reg32 & SLOT_HP_CAPABLE_MASK)
114                         services |= PCIE_PORT_SERVICE_HP;
115         }
116         /* AER capable */
117         if (pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR))
118                 services |= PCIE_PORT_SERVICE_AER;
119         /* VC support */
120         if (pci_find_ext_capability(dev, PCI_EXT_CAP_ID_VC))
121                 services |= PCIE_PORT_SERVICE_VC;
122
123         return services;
124 }
125
126 /**
127  * pcie_device_init - initialize PCI Express port service device
128  * @dev: Port service device to initialize
129  * @parent: PCI Express port to associate the service device with
130  * @port_type: Type of the port
131  * @service_type: Type of service to associate with the service device
132  * @irq: Interrupt vector to associate with the service device
133  */
134 static void pcie_device_init(struct pci_dev *parent, struct pcie_device *dev, 
135         int service_type, int irq)
136 {
137         struct pcie_port_data *port_data = pci_get_drvdata(parent);
138         struct device *device;
139         int port_type = port_data->port_type;
140
141         dev->port = parent;
142         dev->irq = irq;
143         dev->id.vendor = parent->vendor;
144         dev->id.device = parent->device;
145         dev->id.port_type = port_type;
146         dev->id.service_type = service_type;
147
148         /* Initialize generic device interface */
149         device = &dev->device;
150         memset(device, 0, sizeof(struct device));
151         device->bus = &pcie_port_bus_type;
152         device->driver = NULL;
153         device->driver_data = NULL;
154         device->release = release_pcie_device;  /* callback to free pcie dev */
155         dev_set_name(device, "%s:pcie%02x",
156                  pci_name(parent), get_descriptor_id(port_type, service_type));
157         device->parent = &parent->dev;
158 }
159
160 /**
161  * alloc_pcie_device - allocate PCI Express port service device structure
162  * @parent: PCI Express port to associate the service device with
163  * @port_type: Type of the port
164  * @service_type: Type of service to associate with the service device
165  * @irq: Interrupt vector to associate with the service device
166  */
167 static struct pcie_device* alloc_pcie_device(struct pci_dev *parent,
168         int service_type, int irq)
169 {
170         struct pcie_device *device;
171
172         device = kzalloc(sizeof(struct pcie_device), GFP_KERNEL);
173         if (!device)
174                 return NULL;
175
176         pcie_device_init(parent, device, service_type, irq);
177         return device;
178 }
179
180 /**
181  * pcie_port_device_probe - check if device is a PCI Express port
182  * @dev: Device to check
183  */
184 int pcie_port_device_probe(struct pci_dev *dev)
185 {
186         int pos, type;
187         u16 reg;
188
189         if (!(pos = pci_find_capability(dev, PCI_CAP_ID_EXP)))
190                 return -ENODEV;
191
192         pci_read_config_word(dev, pos + PCIE_CAPABILITIES_REG, &reg);
193         type = (reg >> 4) & PORT_TYPE_MASK;
194         if (    type == PCIE_RC_PORT || type == PCIE_SW_UPSTREAM_PORT ||
195                 type == PCIE_SW_DOWNSTREAM_PORT )
196                 return 0;
197
198         return -ENODEV;
199 }
200
201 /**
202  * pcie_port_device_register - register PCI Express port
203  * @dev: PCI Express port to register
204  *
205  * Allocate the port extension structure and register services associated with
206  * the port.
207  */
208 int pcie_port_device_register(struct pci_dev *dev)
209 {
210         struct pcie_port_data *port_data;
211         int status, capabilities, irq_mode, i, nr_serv;
212         int vectors[PCIE_PORT_DEVICE_MAXSERVICES];
213         u16 reg16;
214
215         port_data = kzalloc(sizeof(*port_data), GFP_KERNEL);
216         if (!port_data)
217                 return -ENOMEM;
218         pci_set_drvdata(dev, port_data);
219
220         /* Get port type */
221         pci_read_config_word(dev,
222                 pci_find_capability(dev, PCI_CAP_ID_EXP) +
223                 PCIE_CAPABILITIES_REG, &reg16);
224         port_data->port_type = (reg16 >> 4) & PORT_TYPE_MASK;
225
226         capabilities = get_port_device_capability(dev);
227         /* Root ports are capable of generating PME too */
228         if (port_data->port_type == PCIE_RC_PORT)
229                 capabilities |= PCIE_PORT_SERVICE_PME;
230
231         irq_mode = assign_interrupt_mode(dev, vectors, capabilities);
232         if (irq_mode == PCIE_PORT_NO_IRQ) {
233                 /*
234                  * Don't use service devices that require interrupts if there is
235                  * no way to generate them.
236                  */
237                 if (!(capabilities & PCIE_PORT_SERVICE_VC)) {
238                         status = -ENODEV;
239                         goto Error;
240                 }
241                 capabilities = PCIE_PORT_SERVICE_VC;
242         }
243         port_data->port_irq_mode = irq_mode;
244
245         status = pci_enable_device(dev);
246         if (status)
247                 goto Error;
248         pci_set_master(dev);
249
250         /* Allocate child services if any */
251         for (i = 0, nr_serv = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) {
252                 struct pcie_device *child;
253                 int service = 1 << i;
254
255                 if (!(capabilities & service))
256                         continue;
257
258                 child = alloc_pcie_device(dev, service, vectors[i]);
259                 if (!child)
260                         continue;
261
262                 status = device_register(&child->device);
263                 if (status) {
264                         kfree(child);
265                         continue;
266                 }
267
268                 get_device(&child->device);
269                 nr_serv++;
270         }
271         if (!nr_serv) {
272                 pci_disable_device(dev);
273                 status = -ENODEV;
274                 goto Error;
275         }
276
277         return 0;
278
279  Error:
280         kfree(port_data);
281         return status;
282 }
283
284 #ifdef CONFIG_PM
285 static int suspend_iter(struct device *dev, void *data)
286 {
287         struct pcie_port_service_driver *service_driver;
288         pm_message_t state = * (pm_message_t *) data;
289
290         if ((dev->bus == &pcie_port_bus_type) &&
291             (dev->driver)) {
292                 service_driver = to_service_driver(dev->driver);
293                 if (service_driver->suspend)
294                         service_driver->suspend(to_pcie_device(dev), state);
295         }
296         return 0;
297 }
298
299 /**
300  * pcie_port_device_suspend - suspend port services associated with a PCIe port
301  * @dev: PCI Express port to handle
302  * @state: Representation of system power management transition in progress
303  */
304 int pcie_port_device_suspend(struct pci_dev *dev, pm_message_t state)
305 {
306         return device_for_each_child(&dev->dev, &state, suspend_iter);
307 }
308
309 static int resume_iter(struct device *dev, void *data)
310 {
311         struct pcie_port_service_driver *service_driver;
312
313         if ((dev->bus == &pcie_port_bus_type) &&
314             (dev->driver)) {
315                 service_driver = to_service_driver(dev->driver);
316                 if (service_driver->resume)
317                         service_driver->resume(to_pcie_device(dev));
318         }
319         return 0;
320 }
321
322 /**
323  * pcie_port_device_suspend - resume port services associated with a PCIe port
324  * @dev: PCI Express port to handle
325  */
326 int pcie_port_device_resume(struct pci_dev *dev)
327 {
328         return device_for_each_child(&dev->dev, NULL, resume_iter);
329 }
330 #endif
331
332 static int remove_iter(struct device *dev, void *data)
333 {
334         struct pcie_port_service_driver *service_driver;
335
336         if (dev->bus == &pcie_port_bus_type) {
337                 if (dev->driver) {
338                         service_driver = to_service_driver(dev->driver);
339                         if (service_driver->remove)
340                                 service_driver->remove(to_pcie_device(dev));
341                 }
342                 *(unsigned long*)data = (unsigned long)dev;
343                 return 1;
344         }
345         return 0;
346 }
347
348 /**
349  * pcie_port_device_remove - unregister PCI Express port service devices
350  * @dev: PCI Express port the service devices to unregister are associated with
351  *
352  * Remove PCI Express port service devices associated with given port and
353  * disable MSI-X or MSI for the port.
354  */
355 void pcie_port_device_remove(struct pci_dev *dev)
356 {
357         struct pcie_port_data *port_data = pci_get_drvdata(dev);
358         int status;
359
360         do {
361                 unsigned long device_addr;
362
363                 status = device_for_each_child(&dev->dev, &device_addr, remove_iter);
364                 if (status) {
365                         struct device *device = (struct device*)device_addr;
366                         put_device(device);
367                         device_unregister(device);
368                 }
369         } while (status);
370
371         switch (port_data->port_irq_mode) {
372         case PCIE_PORT_MSIX_MODE:
373                 pci_disable_msix(dev);
374                 break;
375         case PCIE_PORT_MSI_MODE:
376                 pci_disable_msi(dev);
377                 break;
378         }
379
380         kfree(port_data);
381 }
382
383 /**
384  * pcie_port_probe_service - probe driver for given PCI Express port service
385  * @dev: PCI Express port service device to probe against
386  *
387  * If PCI Express port service driver is registered with
388  * pcie_port_service_register(), this function will be called by the driver core
389  * whenever match is found between the driver and a port service device.
390  */
391 static int pcie_port_probe_service(struct device *dev)
392 {
393         struct pcie_device *pciedev;
394         struct pcie_port_service_driver *driver;
395         int status;
396
397         if (!dev || !dev->driver)
398                 return -ENODEV;
399
400         driver = to_service_driver(dev->driver);
401         if (!driver || !driver->probe)
402                 return -ENODEV;
403
404         pciedev = to_pcie_device(dev);
405         status = driver->probe(pciedev);
406         if (!status) {
407                 dev_printk(KERN_DEBUG, dev, "service driver %s loaded\n",
408                         driver->name);
409                 get_device(dev);
410         }
411         return status;
412 }
413
414 /**
415  * pcie_port_remove_service - detach driver from given PCI Express port service
416  * @dev: PCI Express port service device to handle
417  *
418  * If PCI Express port service driver is registered with
419  * pcie_port_service_register(), this function will be called by the driver core
420  * when device_unregister() is called for the port service device associated
421  * with the driver.
422  */
423 static int pcie_port_remove_service(struct device *dev)
424 {
425         struct pcie_device *pciedev;
426         struct pcie_port_service_driver *driver;
427
428         if (!dev || !dev->driver)
429                 return 0;
430
431         pciedev = to_pcie_device(dev);
432         driver = to_service_driver(dev->driver);
433         if (driver && driver->remove) {
434                 dev_printk(KERN_DEBUG, dev, "unloading service driver %s\n",
435                         driver->name);
436                 driver->remove(pciedev);
437                 put_device(dev);
438         }
439         return 0;
440 }
441
442 /**
443  * pcie_port_shutdown_service - shut down given PCI Express port service
444  * @dev: PCI Express port service device to handle
445  *
446  * If PCI Express port service driver is registered with
447  * pcie_port_service_register(), this function will be called by the driver core
448  * when device_shutdown() is called for the port service device associated
449  * with the driver.
450  */
451 static void pcie_port_shutdown_service(struct device *dev) {}
452
453 /**
454  * pcie_port_service_register - register PCI Express port service driver
455  * @new: PCI Express port service driver to register
456  */
457 int pcie_port_service_register(struct pcie_port_service_driver *new)
458 {
459         new->driver.name = (char *)new->name;
460         new->driver.bus = &pcie_port_bus_type;
461         new->driver.probe = pcie_port_probe_service;
462         new->driver.remove = pcie_port_remove_service;
463         new->driver.shutdown = pcie_port_shutdown_service;
464
465         return driver_register(&new->driver);
466 }
467
468 /**
469  * pcie_port_service_unregister - unregister PCI Express port service driver
470  * @drv: PCI Express port service driver to unregister
471  */
472 void pcie_port_service_unregister(struct pcie_port_service_driver *drv)
473 {
474         driver_unregister(&drv->driver);
475 }
476
477 EXPORT_SYMBOL(pcie_port_service_register);
478 EXPORT_SYMBOL(pcie_port_service_unregister);