b84426a7f88df599b504c70dbac1fca078bc9db3
[linux-2.6-block.git] / drivers / xen / xen-pciback / pci_stub.c
1 /*
2  * PCI Stub Driver - Grabs devices in backend to be exported later
3  *
4  * Ryan Wilson <hap9@epoch.ncsc.mil>
5  * Chris Bookholt <hap10@epoch.ncsc.mil>
6  */
7
8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
9
10 #include <linux/module.h>
11 #include <linux/init.h>
12 #include <linux/rwsem.h>
13 #include <linux/list.h>
14 #include <linux/spinlock.h>
15 #include <linux/kref.h>
16 #include <linux/pci.h>
17 #include <linux/wait.h>
18 #include <linux/sched.h>
19 #include <linux/atomic.h>
20 #include <xen/events.h>
21 #include <asm/xen/pci.h>
22 #include <asm/xen/hypervisor.h>
23 #include <xen/interface/physdev.h>
24 #include "pciback.h"
25 #include "conf_space.h"
26 #include "conf_space_quirks.h"
27
28 static char *pci_devs_to_hide;
29 wait_queue_head_t xen_pcibk_aer_wait_queue;
30 /*Add sem for sync AER handling and xen_pcibk remove/reconfigue ops,
31 * We want to avoid in middle of AER ops, xen_pcibk devices is being removed
32 */
33 static DECLARE_RWSEM(pcistub_sem);
34 module_param_named(hide, pci_devs_to_hide, charp, 0444);
35
36 struct pcistub_device_id {
37         struct list_head slot_list;
38         int domain;
39         unsigned char bus;
40         unsigned int devfn;
41 };
42 static LIST_HEAD(pcistub_device_ids);
43 static DEFINE_SPINLOCK(device_ids_lock);
44
45 struct pcistub_device {
46         struct kref kref;
47         struct list_head dev_list;
48         spinlock_t lock;
49
50         struct pci_dev *dev;
51         struct xen_pcibk_device *pdev;/* non-NULL if struct pci_dev is in use */
52 };
53
54 /* Access to pcistub_devices & seized_devices lists and the initialize_devices
55  * flag must be locked with pcistub_devices_lock
56  */
57 static DEFINE_SPINLOCK(pcistub_devices_lock);
58 static LIST_HEAD(pcistub_devices);
59
60 /* wait for device_initcall before initializing our devices
61  * (see pcistub_init_devices_late)
62  */
63 static int initialize_devices;
64 static LIST_HEAD(seized_devices);
65
66 static struct pcistub_device *pcistub_device_alloc(struct pci_dev *dev)
67 {
68         struct pcistub_device *psdev;
69
70         dev_dbg(&dev->dev, "pcistub_device_alloc\n");
71
72         psdev = kzalloc(sizeof(*psdev), GFP_ATOMIC);
73         if (!psdev)
74                 return NULL;
75
76         psdev->dev = pci_dev_get(dev);
77         if (!psdev->dev) {
78                 kfree(psdev);
79                 return NULL;
80         }
81
82         kref_init(&psdev->kref);
83         spin_lock_init(&psdev->lock);
84
85         return psdev;
86 }
87
88 /* Don't call this directly as it's called by pcistub_device_put */
89 static void pcistub_device_release(struct kref *kref)
90 {
91         struct pcistub_device *psdev;
92         struct pci_dev *dev;
93         struct xen_pcibk_dev_data *dev_data;
94
95         psdev = container_of(kref, struct pcistub_device, kref);
96         dev = psdev->dev;
97         dev_data = pci_get_drvdata(dev);
98
99         dev_dbg(&dev->dev, "pcistub_device_release\n");
100
101         xen_unregister_device_domain_owner(dev);
102
103         /* Call the reset function which does not take lock as this
104          * is called from "unbind" which takes a device_lock mutex.
105          */
106         __pci_reset_function_locked(dev);
107         if (pci_load_and_free_saved_state(dev, &dev_data->pci_saved_state))
108                 dev_dbg(&dev->dev, "Could not reload PCI state\n");
109         else
110                 pci_restore_state(dev);
111
112         if (dev->msix_cap) {
113                 struct physdev_pci_device ppdev = {
114                         .seg = pci_domain_nr(dev->bus),
115                         .bus = dev->bus->number,
116                         .devfn = dev->devfn
117                 };
118                 int err = HYPERVISOR_physdev_op(PHYSDEVOP_release_msix,
119                                                 &ppdev);
120
121                 if (err)
122                         dev_warn(&dev->dev, "MSI-X release failed (%d)\n",
123                                  err);
124         }
125
126         /* Disable the device */
127         xen_pcibk_reset_device(dev);
128
129         kfree(dev_data);
130         pci_set_drvdata(dev, NULL);
131
132         /* Clean-up the device */
133         xen_pcibk_config_free_dyn_fields(dev);
134         xen_pcibk_config_free_dev(dev);
135
136         dev->dev_flags &= ~PCI_DEV_FLAGS_ASSIGNED;
137         pci_dev_put(dev);
138
139         kfree(psdev);
140 }
141
142 static inline void pcistub_device_get(struct pcistub_device *psdev)
143 {
144         kref_get(&psdev->kref);
145 }
146
147 static inline void pcistub_device_put(struct pcistub_device *psdev)
148 {
149         kref_put(&psdev->kref, pcistub_device_release);
150 }
151
152 static struct pcistub_device *pcistub_device_find(int domain, int bus,
153                                                   int slot, int func)
154 {
155         struct pcistub_device *psdev = NULL;
156         unsigned long flags;
157
158         spin_lock_irqsave(&pcistub_devices_lock, flags);
159
160         list_for_each_entry(psdev, &pcistub_devices, dev_list) {
161                 if (psdev->dev != NULL
162                     && domain == pci_domain_nr(psdev->dev->bus)
163                     && bus == psdev->dev->bus->number
164                     && slot == PCI_SLOT(psdev->dev->devfn)
165                     && func == PCI_FUNC(psdev->dev->devfn)) {
166                         pcistub_device_get(psdev);
167                         goto out;
168                 }
169         }
170
171         /* didn't find it */
172         psdev = NULL;
173
174 out:
175         spin_unlock_irqrestore(&pcistub_devices_lock, flags);
176         return psdev;
177 }
178
179 static struct pci_dev *pcistub_device_get_pci_dev(struct xen_pcibk_device *pdev,
180                                                   struct pcistub_device *psdev)
181 {
182         struct pci_dev *pci_dev = NULL;
183         unsigned long flags;
184
185         pcistub_device_get(psdev);
186
187         spin_lock_irqsave(&psdev->lock, flags);
188         if (!psdev->pdev) {
189                 psdev->pdev = pdev;
190                 pci_dev = psdev->dev;
191         }
192         spin_unlock_irqrestore(&psdev->lock, flags);
193
194         if (!pci_dev)
195                 pcistub_device_put(psdev);
196
197         return pci_dev;
198 }
199
200 struct pci_dev *pcistub_get_pci_dev_by_slot(struct xen_pcibk_device *pdev,
201                                             int domain, int bus,
202                                             int slot, int func)
203 {
204         struct pcistub_device *psdev;
205         struct pci_dev *found_dev = NULL;
206         unsigned long flags;
207
208         spin_lock_irqsave(&pcistub_devices_lock, flags);
209
210         list_for_each_entry(psdev, &pcistub_devices, dev_list) {
211                 if (psdev->dev != NULL
212                     && domain == pci_domain_nr(psdev->dev->bus)
213                     && bus == psdev->dev->bus->number
214                     && slot == PCI_SLOT(psdev->dev->devfn)
215                     && func == PCI_FUNC(psdev->dev->devfn)) {
216                         found_dev = pcistub_device_get_pci_dev(pdev, psdev);
217                         break;
218                 }
219         }
220
221         spin_unlock_irqrestore(&pcistub_devices_lock, flags);
222         return found_dev;
223 }
224
225 struct pci_dev *pcistub_get_pci_dev(struct xen_pcibk_device *pdev,
226                                     struct pci_dev *dev)
227 {
228         struct pcistub_device *psdev;
229         struct pci_dev *found_dev = NULL;
230         unsigned long flags;
231
232         spin_lock_irqsave(&pcistub_devices_lock, flags);
233
234         list_for_each_entry(psdev, &pcistub_devices, dev_list) {
235                 if (psdev->dev == dev) {
236                         found_dev = pcistub_device_get_pci_dev(pdev, psdev);
237                         break;
238                 }
239         }
240
241         spin_unlock_irqrestore(&pcistub_devices_lock, flags);
242         return found_dev;
243 }
244
245 void pcistub_put_pci_dev(struct pci_dev *dev)
246 {
247         struct pcistub_device *psdev, *found_psdev = NULL;
248         unsigned long flags;
249
250         spin_lock_irqsave(&pcistub_devices_lock, flags);
251
252         list_for_each_entry(psdev, &pcistub_devices, dev_list) {
253                 if (psdev->dev == dev) {
254                         found_psdev = psdev;
255                         break;
256                 }
257         }
258
259         spin_unlock_irqrestore(&pcistub_devices_lock, flags);
260         if (WARN_ON(!found_psdev))
261                 return;
262
263         /*hold this lock for avoiding breaking link between
264         * pcistub and xen_pcibk when AER is in processing
265         */
266         down_write(&pcistub_sem);
267         /* Cleanup our device
268          * (so it's ready for the next domain)
269          */
270
271         /* This is OK - we are running from workqueue context
272          * and want to inhibit the user from fiddling with 'reset'
273          */
274         pci_reset_function(dev);
275         pci_restore_state(dev);
276
277         /* This disables the device. */
278         xen_pcibk_reset_device(dev);
279
280         /* And cleanup up our emulated fields. */
281         xen_pcibk_config_reset_dev(dev);
282         xen_pcibk_config_free_dyn_fields(dev);
283
284         xen_unregister_device_domain_owner(dev);
285
286         spin_lock_irqsave(&found_psdev->lock, flags);
287         found_psdev->pdev = NULL;
288         spin_unlock_irqrestore(&found_psdev->lock, flags);
289
290         pcistub_device_put(found_psdev);
291         up_write(&pcistub_sem);
292 }
293
294 static int pcistub_match_one(struct pci_dev *dev,
295                              struct pcistub_device_id *pdev_id)
296 {
297         /* Match the specified device by domain, bus, slot, func and also if
298          * any of the device's parent bridges match.
299          */
300         for (; dev != NULL; dev = dev->bus->self) {
301                 if (pci_domain_nr(dev->bus) == pdev_id->domain
302                     && dev->bus->number == pdev_id->bus
303                     && dev->devfn == pdev_id->devfn)
304                         return 1;
305
306                 /* Sometimes topmost bridge links to itself. */
307                 if (dev == dev->bus->self)
308                         break;
309         }
310
311         return 0;
312 }
313
314 static int pcistub_match(struct pci_dev *dev)
315 {
316         struct pcistub_device_id *pdev_id;
317         unsigned long flags;
318         int found = 0;
319
320         spin_lock_irqsave(&device_ids_lock, flags);
321         list_for_each_entry(pdev_id, &pcistub_device_ids, slot_list) {
322                 if (pcistub_match_one(dev, pdev_id)) {
323                         found = 1;
324                         break;
325                 }
326         }
327         spin_unlock_irqrestore(&device_ids_lock, flags);
328
329         return found;
330 }
331
332 static int pcistub_init_device(struct pci_dev *dev)
333 {
334         struct xen_pcibk_dev_data *dev_data;
335         int err = 0;
336
337         dev_dbg(&dev->dev, "initializing...\n");
338
339         /* The PCI backend is not intended to be a module (or to work with
340          * removable PCI devices (yet). If it were, xen_pcibk_config_free()
341          * would need to be called somewhere to free the memory allocated
342          * here and then to call kfree(pci_get_drvdata(psdev->dev)).
343          */
344         dev_data = kzalloc(sizeof(*dev_data) +  strlen(DRV_NAME "[]")
345                                 + strlen(pci_name(dev)) + 1, GFP_ATOMIC);
346         if (!dev_data) {
347                 err = -ENOMEM;
348                 goto out;
349         }
350         pci_set_drvdata(dev, dev_data);
351
352         /*
353          * Setup name for fake IRQ handler. It will only be enabled
354          * once the device is turned on by the guest.
355          */
356         sprintf(dev_data->irq_name, DRV_NAME "[%s]", pci_name(dev));
357
358         dev_dbg(&dev->dev, "initializing config\n");
359
360         init_waitqueue_head(&xen_pcibk_aer_wait_queue);
361         err = xen_pcibk_config_init_dev(dev);
362         if (err)
363                 goto out;
364
365         /* HACK: Force device (& ACPI) to determine what IRQ it's on - we
366          * must do this here because pcibios_enable_device may specify
367          * the pci device's true irq (and possibly its other resources)
368          * if they differ from what's in the configuration space.
369          * This makes the assumption that the device's resources won't
370          * change after this point (otherwise this code may break!)
371          */
372         dev_dbg(&dev->dev, "enabling device\n");
373         err = pci_enable_device(dev);
374         if (err)
375                 goto config_release;
376
377         if (dev->msix_cap) {
378                 struct physdev_pci_device ppdev = {
379                         .seg = pci_domain_nr(dev->bus),
380                         .bus = dev->bus->number,
381                         .devfn = dev->devfn
382                 };
383
384                 err = HYPERVISOR_physdev_op(PHYSDEVOP_prepare_msix, &ppdev);
385                 if (err)
386                         dev_err(&dev->dev, "MSI-X preparation failed (%d)\n",
387                                 err);
388         }
389
390         /* We need the device active to save the state. */
391         dev_dbg(&dev->dev, "save state of device\n");
392         pci_save_state(dev);
393         dev_data->pci_saved_state = pci_store_saved_state(dev);
394         if (!dev_data->pci_saved_state)
395                 dev_err(&dev->dev, "Could not store PCI conf saved state!\n");
396         else {
397                 dev_dbg(&dev->dev, "resetting (FLR, D3, etc) the device\n");
398                 __pci_reset_function_locked(dev);
399                 pci_restore_state(dev);
400         }
401         /* Now disable the device (this also ensures some private device
402          * data is setup before we export)
403          */
404         dev_dbg(&dev->dev, "reset device\n");
405         xen_pcibk_reset_device(dev);
406
407         dev->dev_flags |= PCI_DEV_FLAGS_ASSIGNED;
408         return 0;
409
410 config_release:
411         xen_pcibk_config_free_dev(dev);
412
413 out:
414         pci_set_drvdata(dev, NULL);
415         kfree(dev_data);
416         return err;
417 }
418
419 /*
420  * Because some initialization still happens on
421  * devices during fs_initcall, we need to defer
422  * full initialization of our devices until
423  * device_initcall.
424  */
425 static int __init pcistub_init_devices_late(void)
426 {
427         struct pcistub_device *psdev;
428         unsigned long flags;
429         int err = 0;
430
431         spin_lock_irqsave(&pcistub_devices_lock, flags);
432
433         while (!list_empty(&seized_devices)) {
434                 psdev = container_of(seized_devices.next,
435                                      struct pcistub_device, dev_list);
436                 list_del(&psdev->dev_list);
437
438                 spin_unlock_irqrestore(&pcistub_devices_lock, flags);
439
440                 err = pcistub_init_device(psdev->dev);
441                 if (err) {
442                         dev_err(&psdev->dev->dev,
443                                 "error %d initializing device\n", err);
444                         kfree(psdev);
445                         psdev = NULL;
446                 }
447
448                 spin_lock_irqsave(&pcistub_devices_lock, flags);
449
450                 if (psdev)
451                         list_add_tail(&psdev->dev_list, &pcistub_devices);
452         }
453
454         initialize_devices = 1;
455
456         spin_unlock_irqrestore(&pcistub_devices_lock, flags);
457
458         return 0;
459 }
460
461 static int pcistub_seize(struct pci_dev *dev)
462 {
463         struct pcistub_device *psdev;
464         unsigned long flags;
465         int err = 0;
466
467         psdev = pcistub_device_alloc(dev);
468         if (!psdev)
469                 return -ENOMEM;
470
471         spin_lock_irqsave(&pcistub_devices_lock, flags);
472
473         if (initialize_devices) {
474                 spin_unlock_irqrestore(&pcistub_devices_lock, flags);
475
476                 /* don't want irqs disabled when calling pcistub_init_device */
477                 err = pcistub_init_device(psdev->dev);
478
479                 spin_lock_irqsave(&pcistub_devices_lock, flags);
480
481                 if (!err)
482                         list_add(&psdev->dev_list, &pcistub_devices);
483         } else {
484                 dev_dbg(&dev->dev, "deferring initialization\n");
485                 list_add(&psdev->dev_list, &seized_devices);
486         }
487
488         spin_unlock_irqrestore(&pcistub_devices_lock, flags);
489
490         if (err)
491                 pcistub_device_put(psdev);
492
493         return err;
494 }
495
496 static int pcistub_probe(struct pci_dev *dev, const struct pci_device_id *id)
497 {
498         int err = 0;
499
500         dev_dbg(&dev->dev, "probing...\n");
501
502         if (pcistub_match(dev)) {
503
504                 if (dev->hdr_type != PCI_HEADER_TYPE_NORMAL
505                     && dev->hdr_type != PCI_HEADER_TYPE_BRIDGE) {
506                         dev_err(&dev->dev, "can't export pci devices that "
507                                 "don't have a normal (0) or bridge (1) "
508                                 "header type!\n");
509                         err = -ENODEV;
510                         goto out;
511                 }
512
513                 dev_info(&dev->dev, "seizing device\n");
514                 err = pcistub_seize(dev);
515         } else
516                 /* Didn't find the device */
517                 err = -ENODEV;
518
519 out:
520         return err;
521 }
522
523 static void pcistub_remove(struct pci_dev *dev)
524 {
525         struct pcistub_device *psdev, *found_psdev = NULL;
526         unsigned long flags;
527
528         dev_dbg(&dev->dev, "removing\n");
529
530         spin_lock_irqsave(&pcistub_devices_lock, flags);
531
532         xen_pcibk_config_quirk_release(dev);
533
534         list_for_each_entry(psdev, &pcistub_devices, dev_list) {
535                 if (psdev->dev == dev) {
536                         found_psdev = psdev;
537                         break;
538                 }
539         }
540
541         spin_unlock_irqrestore(&pcistub_devices_lock, flags);
542
543         if (found_psdev) {
544                 dev_dbg(&dev->dev, "found device to remove - in use? %p\n",
545                         found_psdev->pdev);
546
547                 if (found_psdev->pdev) {
548                         pr_warn("****** removing device %s while still in-use! ******\n",
549                                pci_name(found_psdev->dev));
550                         pr_warn("****** driver domain may still access this device's i/o resources!\n");
551                         pr_warn("****** shutdown driver domain before binding device\n");
552                         pr_warn("****** to other drivers or domains\n");
553
554                         /* N.B. This ends up calling pcistub_put_pci_dev which ends up
555                          * doing the FLR. */
556                         xen_pcibk_release_pci_dev(found_psdev->pdev,
557                                                 found_psdev->dev);
558                 }
559
560                 spin_lock_irqsave(&pcistub_devices_lock, flags);
561                 list_del(&found_psdev->dev_list);
562                 spin_unlock_irqrestore(&pcistub_devices_lock, flags);
563
564                 /* the final put for releasing from the list */
565                 pcistub_device_put(found_psdev);
566         }
567 }
568
569 static DEFINE_PCI_DEVICE_TABLE(pcistub_ids) = {
570         {
571          .vendor = PCI_ANY_ID,
572          .device = PCI_ANY_ID,
573          .subvendor = PCI_ANY_ID,
574          .subdevice = PCI_ANY_ID,
575          },
576         {0,},
577 };
578
579 #define PCI_NODENAME_MAX 40
580 static void kill_domain_by_device(struct pcistub_device *psdev)
581 {
582         struct xenbus_transaction xbt;
583         int err;
584         char nodename[PCI_NODENAME_MAX];
585
586         BUG_ON(!psdev);
587         snprintf(nodename, PCI_NODENAME_MAX, "/local/domain/0/backend/pci/%d/0",
588                 psdev->pdev->xdev->otherend_id);
589
590 again:
591         err = xenbus_transaction_start(&xbt);
592         if (err) {
593                 dev_err(&psdev->dev->dev,
594                         "error %d when start xenbus transaction\n", err);
595                 return;
596         }
597         /*PV AER handlers will set this flag*/
598         xenbus_printf(xbt, nodename, "aerState" , "aerfail");
599         err = xenbus_transaction_end(xbt, 0);
600         if (err) {
601                 if (err == -EAGAIN)
602                         goto again;
603                 dev_err(&psdev->dev->dev,
604                         "error %d when end xenbus transaction\n", err);
605                 return;
606         }
607 }
608
609 /* For each aer recovery step error_detected, mmio_enabled, etc, front_end and
610  * backend need to have cooperation. In xen_pcibk, those steps will do similar
611  * jobs: send service request and waiting for front_end response.
612 */
613 static pci_ers_result_t common_process(struct pcistub_device *psdev,
614                                        pci_channel_state_t state, int aer_cmd,
615                                        pci_ers_result_t result)
616 {
617         pci_ers_result_t res = result;
618         struct xen_pcie_aer_op *aer_op;
619         int ret;
620
621         /*with PV AER drivers*/
622         aer_op = &(psdev->pdev->sh_info->aer_op);
623         aer_op->cmd = aer_cmd ;
624         /*useful for error_detected callback*/
625         aer_op->err = state;
626         /*pcifront_end BDF*/
627         ret = xen_pcibk_get_pcifront_dev(psdev->dev, psdev->pdev,
628                 &aer_op->domain, &aer_op->bus, &aer_op->devfn);
629         if (!ret) {
630                 dev_err(&psdev->dev->dev,
631                         DRV_NAME ": failed to get pcifront device\n");
632                 return PCI_ERS_RESULT_NONE;
633         }
634         wmb();
635
636         dev_dbg(&psdev->dev->dev,
637                         DRV_NAME ": aer_op %x dom %x bus %x devfn %x\n",
638                         aer_cmd, aer_op->domain, aer_op->bus, aer_op->devfn);
639         /*local flag to mark there's aer request, xen_pcibk callback will use
640         * this flag to judge whether we need to check pci-front give aer
641         * service ack signal
642         */
643         set_bit(_PCIB_op_pending, (unsigned long *)&psdev->pdev->flags);
644
645         /*It is possible that a pcifront conf_read_write ops request invokes
646         * the callback which cause the spurious execution of wake_up.
647         * Yet it is harmless and better than a spinlock here
648         */
649         set_bit(_XEN_PCIB_active,
650                 (unsigned long *)&psdev->pdev->sh_info->flags);
651         wmb();
652         notify_remote_via_irq(psdev->pdev->evtchn_irq);
653
654         ret = wait_event_timeout(xen_pcibk_aer_wait_queue,
655                                  !(test_bit(_XEN_PCIB_active, (unsigned long *)
656                                  &psdev->pdev->sh_info->flags)), 300*HZ);
657
658         if (!ret) {
659                 if (test_bit(_XEN_PCIB_active,
660                         (unsigned long *)&psdev->pdev->sh_info->flags)) {
661                         dev_err(&psdev->dev->dev,
662                                 "pcifront aer process not responding!\n");
663                         clear_bit(_XEN_PCIB_active,
664                           (unsigned long *)&psdev->pdev->sh_info->flags);
665                         aer_op->err = PCI_ERS_RESULT_NONE;
666                         return res;
667                 }
668         }
669         clear_bit(_PCIB_op_pending, (unsigned long *)&psdev->pdev->flags);
670
671         if (test_bit(_XEN_PCIF_active,
672                 (unsigned long *)&psdev->pdev->sh_info->flags)) {
673                 dev_dbg(&psdev->dev->dev,
674                         "schedule pci_conf service in " DRV_NAME "\n");
675                 xen_pcibk_test_and_schedule_op(psdev->pdev);
676         }
677
678         res = (pci_ers_result_t)aer_op->err;
679         return res;
680 }
681
682 /*
683 * xen_pcibk_slot_reset: it will send the slot_reset request to  pcifront in case
684 * of the device driver could provide this service, and then wait for pcifront
685 * ack.
686 * @dev: pointer to PCI devices
687 * return value is used by aer_core do_recovery policy
688 */
689 static pci_ers_result_t xen_pcibk_slot_reset(struct pci_dev *dev)
690 {
691         struct pcistub_device *psdev;
692         pci_ers_result_t result;
693
694         result = PCI_ERS_RESULT_RECOVERED;
695         dev_dbg(&dev->dev, "xen_pcibk_slot_reset(bus:%x,devfn:%x)\n",
696                 dev->bus->number, dev->devfn);
697
698         down_write(&pcistub_sem);
699         psdev = pcistub_device_find(pci_domain_nr(dev->bus),
700                                 dev->bus->number,
701                                 PCI_SLOT(dev->devfn),
702                                 PCI_FUNC(dev->devfn));
703
704         if (!psdev || !psdev->pdev) {
705                 dev_err(&dev->dev,
706                         DRV_NAME " device is not found/assigned\n");
707                 goto end;
708         }
709
710         if (!psdev->pdev->sh_info) {
711                 dev_err(&dev->dev, DRV_NAME " device is not connected or owned"
712                         " by HVM, kill it\n");
713                 kill_domain_by_device(psdev);
714                 goto end;
715         }
716
717         if (!test_bit(_XEN_PCIB_AERHANDLER,
718                 (unsigned long *)&psdev->pdev->sh_info->flags)) {
719                 dev_err(&dev->dev,
720                         "guest with no AER driver should have been killed\n");
721                 goto end;
722         }
723         result = common_process(psdev, 1, XEN_PCI_OP_aer_slotreset, result);
724
725         if (result == PCI_ERS_RESULT_NONE ||
726                 result == PCI_ERS_RESULT_DISCONNECT) {
727                 dev_dbg(&dev->dev,
728                         "No AER slot_reset service or disconnected!\n");
729                 kill_domain_by_device(psdev);
730         }
731 end:
732         if (psdev)
733                 pcistub_device_put(psdev);
734         up_write(&pcistub_sem);
735         return result;
736
737 }
738
739
740 /*xen_pcibk_mmio_enabled: it will send the mmio_enabled request to  pcifront
741 * in case of the device driver could provide this service, and then wait
742 * for pcifront ack
743 * @dev: pointer to PCI devices
744 * return value is used by aer_core do_recovery policy
745 */
746
747 static pci_ers_result_t xen_pcibk_mmio_enabled(struct pci_dev *dev)
748 {
749         struct pcistub_device *psdev;
750         pci_ers_result_t result;
751
752         result = PCI_ERS_RESULT_RECOVERED;
753         dev_dbg(&dev->dev, "xen_pcibk_mmio_enabled(bus:%x,devfn:%x)\n",
754                 dev->bus->number, dev->devfn);
755
756         down_write(&pcistub_sem);
757         psdev = pcistub_device_find(pci_domain_nr(dev->bus),
758                                 dev->bus->number,
759                                 PCI_SLOT(dev->devfn),
760                                 PCI_FUNC(dev->devfn));
761
762         if (!psdev || !psdev->pdev) {
763                 dev_err(&dev->dev,
764                         DRV_NAME " device is not found/assigned\n");
765                 goto end;
766         }
767
768         if (!psdev->pdev->sh_info) {
769                 dev_err(&dev->dev, DRV_NAME " device is not connected or owned"
770                         " by HVM, kill it\n");
771                 kill_domain_by_device(psdev);
772                 goto end;
773         }
774
775         if (!test_bit(_XEN_PCIB_AERHANDLER,
776                 (unsigned long *)&psdev->pdev->sh_info->flags)) {
777                 dev_err(&dev->dev,
778                         "guest with no AER driver should have been killed\n");
779                 goto end;
780         }
781         result = common_process(psdev, 1, XEN_PCI_OP_aer_mmio, result);
782
783         if (result == PCI_ERS_RESULT_NONE ||
784                 result == PCI_ERS_RESULT_DISCONNECT) {
785                 dev_dbg(&dev->dev,
786                         "No AER mmio_enabled service or disconnected!\n");
787                 kill_domain_by_device(psdev);
788         }
789 end:
790         if (psdev)
791                 pcistub_device_put(psdev);
792         up_write(&pcistub_sem);
793         return result;
794 }
795
796 /*xen_pcibk_error_detected: it will send the error_detected request to  pcifront
797 * in case of the device driver could provide this service, and then wait
798 * for pcifront ack.
799 * @dev: pointer to PCI devices
800 * @error: the current PCI connection state
801 * return value is used by aer_core do_recovery policy
802 */
803
804 static pci_ers_result_t xen_pcibk_error_detected(struct pci_dev *dev,
805         pci_channel_state_t error)
806 {
807         struct pcistub_device *psdev;
808         pci_ers_result_t result;
809
810         result = PCI_ERS_RESULT_CAN_RECOVER;
811         dev_dbg(&dev->dev, "xen_pcibk_error_detected(bus:%x,devfn:%x)\n",
812                 dev->bus->number, dev->devfn);
813
814         down_write(&pcistub_sem);
815         psdev = pcistub_device_find(pci_domain_nr(dev->bus),
816                                 dev->bus->number,
817                                 PCI_SLOT(dev->devfn),
818                                 PCI_FUNC(dev->devfn));
819
820         if (!psdev || !psdev->pdev) {
821                 dev_err(&dev->dev,
822                         DRV_NAME " device is not found/assigned\n");
823                 goto end;
824         }
825
826         if (!psdev->pdev->sh_info) {
827                 dev_err(&dev->dev, DRV_NAME " device is not connected or owned"
828                         " by HVM, kill it\n");
829                 kill_domain_by_device(psdev);
830                 goto end;
831         }
832
833         /*Guest owns the device yet no aer handler regiested, kill guest*/
834         if (!test_bit(_XEN_PCIB_AERHANDLER,
835                 (unsigned long *)&psdev->pdev->sh_info->flags)) {
836                 dev_dbg(&dev->dev, "guest may have no aer driver, kill it\n");
837                 kill_domain_by_device(psdev);
838                 goto end;
839         }
840         result = common_process(psdev, error, XEN_PCI_OP_aer_detected, result);
841
842         if (result == PCI_ERS_RESULT_NONE ||
843                 result == PCI_ERS_RESULT_DISCONNECT) {
844                 dev_dbg(&dev->dev,
845                         "No AER error_detected service or disconnected!\n");
846                 kill_domain_by_device(psdev);
847         }
848 end:
849         if (psdev)
850                 pcistub_device_put(psdev);
851         up_write(&pcistub_sem);
852         return result;
853 }
854
855 /*xen_pcibk_error_resume: it will send the error_resume request to  pcifront
856 * in case of the device driver could provide this service, and then wait
857 * for pcifront ack.
858 * @dev: pointer to PCI devices
859 */
860
861 static void xen_pcibk_error_resume(struct pci_dev *dev)
862 {
863         struct pcistub_device *psdev;
864
865         dev_dbg(&dev->dev, "xen_pcibk_error_resume(bus:%x,devfn:%x)\n",
866                 dev->bus->number, dev->devfn);
867
868         down_write(&pcistub_sem);
869         psdev = pcistub_device_find(pci_domain_nr(dev->bus),
870                                 dev->bus->number,
871                                 PCI_SLOT(dev->devfn),
872                                 PCI_FUNC(dev->devfn));
873
874         if (!psdev || !psdev->pdev) {
875                 dev_err(&dev->dev,
876                         DRV_NAME " device is not found/assigned\n");
877                 goto end;
878         }
879
880         if (!psdev->pdev->sh_info) {
881                 dev_err(&dev->dev, DRV_NAME " device is not connected or owned"
882                         " by HVM, kill it\n");
883                 kill_domain_by_device(psdev);
884                 goto end;
885         }
886
887         if (!test_bit(_XEN_PCIB_AERHANDLER,
888                 (unsigned long *)&psdev->pdev->sh_info->flags)) {
889                 dev_err(&dev->dev,
890                         "guest with no AER driver should have been killed\n");
891                 kill_domain_by_device(psdev);
892                 goto end;
893         }
894         common_process(psdev, 1, XEN_PCI_OP_aer_resume,
895                        PCI_ERS_RESULT_RECOVERED);
896 end:
897         if (psdev)
898                 pcistub_device_put(psdev);
899         up_write(&pcistub_sem);
900         return;
901 }
902
903 /*add xen_pcibk AER handling*/
904 static const struct pci_error_handlers xen_pcibk_error_handler = {
905         .error_detected = xen_pcibk_error_detected,
906         .mmio_enabled = xen_pcibk_mmio_enabled,
907         .slot_reset = xen_pcibk_slot_reset,
908         .resume = xen_pcibk_error_resume,
909 };
910
911 /*
912  * Note: There is no MODULE_DEVICE_TABLE entry here because this isn't
913  * for a normal device. I don't want it to be loaded automatically.
914  */
915
916 static struct pci_driver xen_pcibk_pci_driver = {
917         /* The name should be xen_pciback, but until the tools are updated
918          * we will keep it as pciback. */
919         .name = "pciback",
920         .id_table = pcistub_ids,
921         .probe = pcistub_probe,
922         .remove = pcistub_remove,
923         .err_handler = &xen_pcibk_error_handler,
924 };
925
926 static inline int str_to_slot(const char *buf, int *domain, int *bus,
927                               int *slot, int *func)
928 {
929         int parsed = 0;
930
931         switch (sscanf(buf, " %x:%x:%x.%x %n", domain, bus, slot, func,
932                        &parsed)) {
933         case 3:
934                 *func = -1;
935                 sscanf(buf, " %x:%x:%x.* %n", domain, bus, slot, &parsed);
936                 break;
937         case 2:
938                 *slot = *func = -1;
939                 sscanf(buf, " %x:%x:*.* %n", domain, bus, &parsed);
940                 break;
941         }
942         if (parsed && !buf[parsed])
943                 return 0;
944
945         /* try again without domain */
946         *domain = 0;
947         switch (sscanf(buf, " %x:%x.%x %n", bus, slot, func, &parsed)) {
948         case 2:
949                 *func = -1;
950                 sscanf(buf, " %x:%x.* %n", bus, slot, &parsed);
951                 break;
952         case 1:
953                 *slot = *func = -1;
954                 sscanf(buf, " %x:*.* %n", bus, &parsed);
955                 break;
956         }
957         if (parsed && !buf[parsed])
958                 return 0;
959
960         return -EINVAL;
961 }
962
963 static inline int str_to_quirk(const char *buf, int *domain, int *bus, int
964                                *slot, int *func, int *reg, int *size, int *mask)
965 {
966         int parsed = 0;
967
968         sscanf(buf, " %x:%x:%x.%x-%x:%x:%x %n", domain, bus, slot, func,
969                reg, size, mask, &parsed);
970         if (parsed && !buf[parsed])
971                 return 0;
972
973         /* try again without domain */
974         *domain = 0;
975         sscanf(buf, " %x:%x.%x-%x:%x:%x %n", bus, slot, func, reg, size,
976                mask, &parsed);
977         if (parsed && !buf[parsed])
978                 return 0;
979
980         return -EINVAL;
981 }
982
983 static int pcistub_device_id_add(int domain, int bus, int slot, int func)
984 {
985         struct pcistub_device_id *pci_dev_id;
986         unsigned long flags;
987         int rc = 0, devfn = PCI_DEVFN(slot, func);
988
989         if (slot < 0) {
990                 for (slot = 0; !rc && slot < 32; ++slot)
991                         rc = pcistub_device_id_add(domain, bus, slot, func);
992                 return rc;
993         }
994
995         if (func < 0) {
996                 for (func = 0; !rc && func < 8; ++func)
997                         rc = pcistub_device_id_add(domain, bus, slot, func);
998                 return rc;
999         }
1000
1001         if ((
1002 #if !defined(MODULE) /* pci_domains_supported is not being exported */ \
1003     || !defined(CONFIG_PCI_DOMAINS)
1004              !pci_domains_supported ? domain :
1005 #endif
1006              domain < 0 || domain > 0xffff)
1007             || bus < 0 || bus > 0xff
1008             || PCI_SLOT(devfn) != slot
1009             || PCI_FUNC(devfn) != func)
1010                 return -EINVAL;
1011
1012         pci_dev_id = kmalloc(sizeof(*pci_dev_id), GFP_KERNEL);
1013         if (!pci_dev_id)
1014                 return -ENOMEM;
1015
1016         pci_dev_id->domain = domain;
1017         pci_dev_id->bus = bus;
1018         pci_dev_id->devfn = devfn;
1019
1020         pr_debug("wants to seize %04x:%02x:%02x.%d\n",
1021                  domain, bus, slot, func);
1022
1023         spin_lock_irqsave(&device_ids_lock, flags);
1024         list_add_tail(&pci_dev_id->slot_list, &pcistub_device_ids);
1025         spin_unlock_irqrestore(&device_ids_lock, flags);
1026
1027         return 0;
1028 }
1029
1030 static int pcistub_device_id_remove(int domain, int bus, int slot, int func)
1031 {
1032         struct pcistub_device_id *pci_dev_id, *t;
1033         int err = -ENOENT;
1034         unsigned long flags;
1035
1036         spin_lock_irqsave(&device_ids_lock, flags);
1037         list_for_each_entry_safe(pci_dev_id, t, &pcistub_device_ids,
1038                                  slot_list) {
1039                 if (pci_dev_id->domain == domain && pci_dev_id->bus == bus
1040                     && (slot < 0 || PCI_SLOT(pci_dev_id->devfn) == slot)
1041                     && (func < 0 || PCI_FUNC(pci_dev_id->devfn) == func)) {
1042                         /* Don't break; here because it's possible the same
1043                          * slot could be in the list more than once
1044                          */
1045                         list_del(&pci_dev_id->slot_list);
1046                         kfree(pci_dev_id);
1047
1048                         err = 0;
1049
1050                         pr_debug("removed %04x:%02x:%02x.%d from seize list\n",
1051                                  domain, bus, slot, func);
1052                 }
1053         }
1054         spin_unlock_irqrestore(&device_ids_lock, flags);
1055
1056         return err;
1057 }
1058
1059 static int pcistub_reg_add(int domain, int bus, int slot, int func,
1060                            unsigned int reg, unsigned int size,
1061                            unsigned int mask)
1062 {
1063         int err = 0;
1064         struct pcistub_device *psdev;
1065         struct pci_dev *dev;
1066         struct config_field *field;
1067
1068         if (reg > 0xfff || (size < 4 && (mask >> (size * 8))))
1069                 return -EINVAL;
1070
1071         psdev = pcistub_device_find(domain, bus, slot, func);
1072         if (!psdev) {
1073                 err = -ENODEV;
1074                 goto out;
1075         }
1076         dev = psdev->dev;
1077
1078         field = kzalloc(sizeof(*field), GFP_ATOMIC);
1079         if (!field) {
1080                 err = -ENOMEM;
1081                 goto out;
1082         }
1083
1084         field->offset = reg;
1085         field->size = size;
1086         field->mask = mask;
1087         field->init = NULL;
1088         field->reset = NULL;
1089         field->release = NULL;
1090         field->clean = xen_pcibk_config_field_free;
1091
1092         err = xen_pcibk_config_quirks_add_field(dev, field);
1093         if (err)
1094                 kfree(field);
1095 out:
1096         if (psdev)
1097                 pcistub_device_put(psdev);
1098         return err;
1099 }
1100
1101 static ssize_t pcistub_slot_add(struct device_driver *drv, const char *buf,
1102                                 size_t count)
1103 {
1104         int domain, bus, slot, func;
1105         int err;
1106
1107         err = str_to_slot(buf, &domain, &bus, &slot, &func);
1108         if (err)
1109                 goto out;
1110
1111         err = pcistub_device_id_add(domain, bus, slot, func);
1112
1113 out:
1114         if (!err)
1115                 err = count;
1116         return err;
1117 }
1118 static DRIVER_ATTR(new_slot, S_IWUSR, NULL, pcistub_slot_add);
1119
1120 static ssize_t pcistub_slot_remove(struct device_driver *drv, const char *buf,
1121                                    size_t count)
1122 {
1123         int domain, bus, slot, func;
1124         int err;
1125
1126         err = str_to_slot(buf, &domain, &bus, &slot, &func);
1127         if (err)
1128                 goto out;
1129
1130         err = pcistub_device_id_remove(domain, bus, slot, func);
1131
1132 out:
1133         if (!err)
1134                 err = count;
1135         return err;
1136 }
1137 static DRIVER_ATTR(remove_slot, S_IWUSR, NULL, pcistub_slot_remove);
1138
1139 static ssize_t pcistub_slot_show(struct device_driver *drv, char *buf)
1140 {
1141         struct pcistub_device_id *pci_dev_id;
1142         size_t count = 0;
1143         unsigned long flags;
1144
1145         spin_lock_irqsave(&device_ids_lock, flags);
1146         list_for_each_entry(pci_dev_id, &pcistub_device_ids, slot_list) {
1147                 if (count >= PAGE_SIZE)
1148                         break;
1149
1150                 count += scnprintf(buf + count, PAGE_SIZE - count,
1151                                    "%04x:%02x:%02x.%d\n",
1152                                    pci_dev_id->domain, pci_dev_id->bus,
1153                                    PCI_SLOT(pci_dev_id->devfn),
1154                                    PCI_FUNC(pci_dev_id->devfn));
1155         }
1156         spin_unlock_irqrestore(&device_ids_lock, flags);
1157
1158         return count;
1159 }
1160 static DRIVER_ATTR(slots, S_IRUSR, pcistub_slot_show, NULL);
1161
1162 static ssize_t pcistub_irq_handler_show(struct device_driver *drv, char *buf)
1163 {
1164         struct pcistub_device *psdev;
1165         struct xen_pcibk_dev_data *dev_data;
1166         size_t count = 0;
1167         unsigned long flags;
1168
1169         spin_lock_irqsave(&pcistub_devices_lock, flags);
1170         list_for_each_entry(psdev, &pcistub_devices, dev_list) {
1171                 if (count >= PAGE_SIZE)
1172                         break;
1173                 if (!psdev->dev)
1174                         continue;
1175                 dev_data = pci_get_drvdata(psdev->dev);
1176                 if (!dev_data)
1177                         continue;
1178                 count +=
1179                     scnprintf(buf + count, PAGE_SIZE - count,
1180                               "%s:%s:%sing:%ld\n",
1181                               pci_name(psdev->dev),
1182                               dev_data->isr_on ? "on" : "off",
1183                               dev_data->ack_intr ? "ack" : "not ack",
1184                               dev_data->handled);
1185         }
1186         spin_unlock_irqrestore(&pcistub_devices_lock, flags);
1187         return count;
1188 }
1189 static DRIVER_ATTR(irq_handlers, S_IRUSR, pcistub_irq_handler_show, NULL);
1190
1191 static ssize_t pcistub_irq_handler_switch(struct device_driver *drv,
1192                                           const char *buf,
1193                                           size_t count)
1194 {
1195         struct pcistub_device *psdev;
1196         struct xen_pcibk_dev_data *dev_data;
1197         int domain, bus, slot, func;
1198         int err;
1199
1200         err = str_to_slot(buf, &domain, &bus, &slot, &func);
1201         if (err)
1202                 return err;
1203
1204         psdev = pcistub_device_find(domain, bus, slot, func);
1205         if (!psdev) {
1206                 err = -ENOENT;
1207                 goto out;
1208         }
1209
1210         dev_data = pci_get_drvdata(psdev->dev);
1211         if (!dev_data) {
1212                 err = -ENOENT;
1213                 goto out;
1214         }
1215
1216         dev_dbg(&psdev->dev->dev, "%s fake irq handler: %d->%d\n",
1217                 dev_data->irq_name, dev_data->isr_on,
1218                 !dev_data->isr_on);
1219
1220         dev_data->isr_on = !(dev_data->isr_on);
1221         if (dev_data->isr_on)
1222                 dev_data->ack_intr = 1;
1223 out:
1224         if (psdev)
1225                 pcistub_device_put(psdev);
1226         if (!err)
1227                 err = count;
1228         return err;
1229 }
1230 static DRIVER_ATTR(irq_handler_state, S_IWUSR, NULL,
1231                    pcistub_irq_handler_switch);
1232
1233 static ssize_t pcistub_quirk_add(struct device_driver *drv, const char *buf,
1234                                  size_t count)
1235 {
1236         int domain, bus, slot, func, reg, size, mask;
1237         int err;
1238
1239         err = str_to_quirk(buf, &domain, &bus, &slot, &func, &reg, &size,
1240                            &mask);
1241         if (err)
1242                 goto out;
1243
1244         err = pcistub_reg_add(domain, bus, slot, func, reg, size, mask);
1245
1246 out:
1247         if (!err)
1248                 err = count;
1249         return err;
1250 }
1251
1252 static ssize_t pcistub_quirk_show(struct device_driver *drv, char *buf)
1253 {
1254         int count = 0;
1255         unsigned long flags;
1256         struct xen_pcibk_config_quirk *quirk;
1257         struct xen_pcibk_dev_data *dev_data;
1258         const struct config_field *field;
1259         const struct config_field_entry *cfg_entry;
1260
1261         spin_lock_irqsave(&device_ids_lock, flags);
1262         list_for_each_entry(quirk, &xen_pcibk_quirks, quirks_list) {
1263                 if (count >= PAGE_SIZE)
1264                         goto out;
1265
1266                 count += scnprintf(buf + count, PAGE_SIZE - count,
1267                                    "%02x:%02x.%01x\n\t%04x:%04x:%04x:%04x\n",
1268                                    quirk->pdev->bus->number,
1269                                    PCI_SLOT(quirk->pdev->devfn),
1270                                    PCI_FUNC(quirk->pdev->devfn),
1271                                    quirk->devid.vendor, quirk->devid.device,
1272                                    quirk->devid.subvendor,
1273                                    quirk->devid.subdevice);
1274
1275                 dev_data = pci_get_drvdata(quirk->pdev);
1276
1277                 list_for_each_entry(cfg_entry, &dev_data->config_fields, list) {
1278                         field = cfg_entry->field;
1279                         if (count >= PAGE_SIZE)
1280                                 goto out;
1281
1282                         count += scnprintf(buf + count, PAGE_SIZE - count,
1283                                            "\t\t%08x:%01x:%08x\n",
1284                                            cfg_entry->base_offset +
1285                                            field->offset, field->size,
1286                                            field->mask);
1287                 }
1288         }
1289
1290 out:
1291         spin_unlock_irqrestore(&device_ids_lock, flags);
1292
1293         return count;
1294 }
1295 static DRIVER_ATTR(quirks, S_IRUSR | S_IWUSR, pcistub_quirk_show,
1296                    pcistub_quirk_add);
1297
1298 static ssize_t permissive_add(struct device_driver *drv, const char *buf,
1299                               size_t count)
1300 {
1301         int domain, bus, slot, func;
1302         int err;
1303         struct pcistub_device *psdev;
1304         struct xen_pcibk_dev_data *dev_data;
1305
1306         err = str_to_slot(buf, &domain, &bus, &slot, &func);
1307         if (err)
1308                 goto out;
1309
1310         psdev = pcistub_device_find(domain, bus, slot, func);
1311         if (!psdev) {
1312                 err = -ENODEV;
1313                 goto out;
1314         }
1315
1316         dev_data = pci_get_drvdata(psdev->dev);
1317         /* the driver data for a device should never be null at this point */
1318         if (!dev_data) {
1319                 err = -ENXIO;
1320                 goto release;
1321         }
1322         if (!dev_data->permissive) {
1323                 dev_data->permissive = 1;
1324                 /* Let user know that what they're doing could be unsafe */
1325                 dev_warn(&psdev->dev->dev, "enabling permissive mode "
1326                          "configuration space accesses!\n");
1327                 dev_warn(&psdev->dev->dev,
1328                          "permissive mode is potentially unsafe!\n");
1329         }
1330 release:
1331         pcistub_device_put(psdev);
1332 out:
1333         if (!err)
1334                 err = count;
1335         return err;
1336 }
1337
1338 static ssize_t permissive_show(struct device_driver *drv, char *buf)
1339 {
1340         struct pcistub_device *psdev;
1341         struct xen_pcibk_dev_data *dev_data;
1342         size_t count = 0;
1343         unsigned long flags;
1344         spin_lock_irqsave(&pcistub_devices_lock, flags);
1345         list_for_each_entry(psdev, &pcistub_devices, dev_list) {
1346                 if (count >= PAGE_SIZE)
1347                         break;
1348                 if (!psdev->dev)
1349                         continue;
1350                 dev_data = pci_get_drvdata(psdev->dev);
1351                 if (!dev_data || !dev_data->permissive)
1352                         continue;
1353                 count +=
1354                     scnprintf(buf + count, PAGE_SIZE - count, "%s\n",
1355                               pci_name(psdev->dev));
1356         }
1357         spin_unlock_irqrestore(&pcistub_devices_lock, flags);
1358         return count;
1359 }
1360 static DRIVER_ATTR(permissive, S_IRUSR | S_IWUSR, permissive_show,
1361                    permissive_add);
1362
1363 static void pcistub_exit(void)
1364 {
1365         driver_remove_file(&xen_pcibk_pci_driver.driver, &driver_attr_new_slot);
1366         driver_remove_file(&xen_pcibk_pci_driver.driver,
1367                            &driver_attr_remove_slot);
1368         driver_remove_file(&xen_pcibk_pci_driver.driver, &driver_attr_slots);
1369         driver_remove_file(&xen_pcibk_pci_driver.driver, &driver_attr_quirks);
1370         driver_remove_file(&xen_pcibk_pci_driver.driver,
1371                            &driver_attr_permissive);
1372         driver_remove_file(&xen_pcibk_pci_driver.driver,
1373                            &driver_attr_irq_handlers);
1374         driver_remove_file(&xen_pcibk_pci_driver.driver,
1375                            &driver_attr_irq_handler_state);
1376         pci_unregister_driver(&xen_pcibk_pci_driver);
1377 }
1378
1379 static int __init pcistub_init(void)
1380 {
1381         int pos = 0;
1382         int err = 0;
1383         int domain, bus, slot, func;
1384         int parsed;
1385
1386         if (pci_devs_to_hide && *pci_devs_to_hide) {
1387                 do {
1388                         parsed = 0;
1389
1390                         err = sscanf(pci_devs_to_hide + pos,
1391                                      " (%x:%x:%x.%x) %n",
1392                                      &domain, &bus, &slot, &func, &parsed);
1393                         switch (err) {
1394                         case 3:
1395                                 func = -1;
1396                                 sscanf(pci_devs_to_hide + pos,
1397                                        " (%x:%x:%x.*) %n",
1398                                        &domain, &bus, &slot, &parsed);
1399                                 break;
1400                         case 2:
1401                                 slot = func = -1;
1402                                 sscanf(pci_devs_to_hide + pos,
1403                                        " (%x:%x:*.*) %n",
1404                                        &domain, &bus, &parsed);
1405                                 break;
1406                         }
1407
1408                         if (!parsed) {
1409                                 domain = 0;
1410                                 err = sscanf(pci_devs_to_hide + pos,
1411                                              " (%x:%x.%x) %n",
1412                                              &bus, &slot, &func, &parsed);
1413                                 switch (err) {
1414                                 case 2:
1415                                         func = -1;
1416                                         sscanf(pci_devs_to_hide + pos,
1417                                                " (%x:%x.*) %n",
1418                                                &bus, &slot, &parsed);
1419                                         break;
1420                                 case 1:
1421                                         slot = func = -1;
1422                                         sscanf(pci_devs_to_hide + pos,
1423                                                " (%x:*.*) %n",
1424                                                &bus, &parsed);
1425                                         break;
1426                                 }
1427                         }
1428
1429                         if (parsed <= 0)
1430                                 goto parse_error;
1431
1432                         err = pcistub_device_id_add(domain, bus, slot, func);
1433                         if (err)
1434                                 goto out;
1435
1436                         pos += parsed;
1437                 } while (pci_devs_to_hide[pos]);
1438         }
1439
1440         /* If we're the first PCI Device Driver to register, we're the
1441          * first one to get offered PCI devices as they become
1442          * available (and thus we can be the first to grab them)
1443          */
1444         err = pci_register_driver(&xen_pcibk_pci_driver);
1445         if (err < 0)
1446                 goto out;
1447
1448         err = driver_create_file(&xen_pcibk_pci_driver.driver,
1449                                  &driver_attr_new_slot);
1450         if (!err)
1451                 err = driver_create_file(&xen_pcibk_pci_driver.driver,
1452                                          &driver_attr_remove_slot);
1453         if (!err)
1454                 err = driver_create_file(&xen_pcibk_pci_driver.driver,
1455                                          &driver_attr_slots);
1456         if (!err)
1457                 err = driver_create_file(&xen_pcibk_pci_driver.driver,
1458                                          &driver_attr_quirks);
1459         if (!err)
1460                 err = driver_create_file(&xen_pcibk_pci_driver.driver,
1461                                          &driver_attr_permissive);
1462
1463         if (!err)
1464                 err = driver_create_file(&xen_pcibk_pci_driver.driver,
1465                                          &driver_attr_irq_handlers);
1466         if (!err)
1467                 err = driver_create_file(&xen_pcibk_pci_driver.driver,
1468                                         &driver_attr_irq_handler_state);
1469         if (err)
1470                 pcistub_exit();
1471
1472 out:
1473         return err;
1474
1475 parse_error:
1476         pr_err("Error parsing pci_devs_to_hide at \"%s\"\n",
1477                pci_devs_to_hide + pos);
1478         return -EINVAL;
1479 }
1480
1481 #ifndef MODULE
1482 /*
1483  * fs_initcall happens before device_initcall
1484  * so xen_pcibk *should* get called first (b/c we
1485  * want to suck up any device before other drivers
1486  * get a chance by being the first pci device
1487  * driver to register)
1488  */
1489 fs_initcall(pcistub_init);
1490 #endif
1491
1492 static int __init xen_pcibk_init(void)
1493 {
1494         int err;
1495
1496         if (!xen_initial_domain())
1497                 return -ENODEV;
1498
1499         err = xen_pcibk_config_init();
1500         if (err)
1501                 return err;
1502
1503 #ifdef MODULE
1504         err = pcistub_init();
1505         if (err < 0)
1506                 return err;
1507 #endif
1508
1509         pcistub_init_devices_late();
1510         err = xen_pcibk_xenbus_register();
1511         if (err)
1512                 pcistub_exit();
1513
1514         return err;
1515 }
1516
1517 static void __exit xen_pcibk_cleanup(void)
1518 {
1519         xen_pcibk_xenbus_unregister();
1520         pcistub_exit();
1521 }
1522
1523 module_init(xen_pcibk_init);
1524 module_exit(xen_pcibk_cleanup);
1525
1526 MODULE_LICENSE("Dual BSD/GPL");
1527 MODULE_ALIAS("xen-backend:pci");