Linux Audio

Check our new training course

Loading...
v3.1
  1/*
  2 * PCI Backend Xenbus Setup - handles setup with frontend and xend
  3 *
  4 *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
  5 */
  6#include <linux/module.h>
 
 
 
  7#include <linux/init.h>
  8#include <linux/list.h>
  9#include <linux/vmalloc.h>
 10#include <linux/workqueue.h>
 11#include <xen/xenbus.h>
 12#include <xen/events.h>
 13#include <asm/xen/pci.h>
 14#include "pciback.h"
 15
 16#define	DRV_NAME	"xen-pciback"
 17#define INVALID_EVTCHN_IRQ  (-1)
 18struct workqueue_struct *xen_pcibk_wq;
 19
 20static int __read_mostly passthrough;
 21module_param(passthrough, bool, S_IRUGO);
 22MODULE_PARM_DESC(passthrough,
 23	"Option to specify how to export PCI topology to guest:\n"\
 24	" 0 - (default) Hide the true PCI topology and makes the frontend\n"\
 25	"   there is a single PCI bus with only the exported devices on it.\n"\
 26	"   For example, a device at 03:05.0 will be re-assigned to 00:00.0\n"\
 27	"   while second device at 02:1a.1 will be re-assigned to 00:01.1.\n"\
 28	" 1 - Passthrough provides a real view of the PCI topology to the\n"\
 29	"   frontend (for example, a device at 06:01.b will still appear at\n"\
 30	"   06:01.b to the frontend). This is similar to how Xen 2.0.x\n"\
 31	"   exposed PCI devices to its driver domains. This may be required\n"\
 32	"   for drivers which depend on finding their hardward in certain\n"\
 33	"   bus/slot locations.");
 34
 35static struct xen_pcibk_device *alloc_pdev(struct xenbus_device *xdev)
 36{
 37	struct xen_pcibk_device *pdev;
 38
 39	pdev = kzalloc(sizeof(struct xen_pcibk_device), GFP_KERNEL);
 40	if (pdev == NULL)
 41		goto out;
 42	dev_dbg(&xdev->dev, "allocated pdev @ 0x%p\n", pdev);
 43
 44	pdev->xdev = xdev;
 45	dev_set_drvdata(&xdev->dev, pdev);
 46
 47	spin_lock_init(&pdev->dev_lock);
 48
 49	pdev->sh_info = NULL;
 50	pdev->evtchn_irq = INVALID_EVTCHN_IRQ;
 51	pdev->be_watching = 0;
 52
 53	INIT_WORK(&pdev->op_work, xen_pcibk_do_op);
 54
 55	if (xen_pcibk_init_devices(pdev)) {
 56		kfree(pdev);
 57		pdev = NULL;
 58	}
 
 
 
 59out:
 60	return pdev;
 61}
 62
 63static void xen_pcibk_disconnect(struct xen_pcibk_device *pdev)
 64{
 65	spin_lock(&pdev->dev_lock);
 66
 67	/* Ensure the guest can't trigger our handler before removing devices */
 68	if (pdev->evtchn_irq != INVALID_EVTCHN_IRQ) {
 69		unbind_from_irqhandler(pdev->evtchn_irq, pdev);
 70		pdev->evtchn_irq = INVALID_EVTCHN_IRQ;
 71	}
 72	spin_unlock(&pdev->dev_lock);
 73
 74	/* If the driver domain started an op, make sure we complete it
 75	 * before releasing the shared memory */
 76
 77	/* Note, the workqueue does not use spinlocks at all.*/
 78	flush_workqueue(xen_pcibk_wq);
 79
 80	spin_lock(&pdev->dev_lock);
 81	if (pdev->sh_info != NULL) {
 82		xenbus_unmap_ring_vfree(pdev->xdev, pdev->sh_info);
 83		pdev->sh_info = NULL;
 84	}
 85	spin_unlock(&pdev->dev_lock);
 86
 87}
 88
 89static void free_pdev(struct xen_pcibk_device *pdev)
 90{
 91	if (pdev->be_watching) {
 92		unregister_xenbus_watch(&pdev->be_watch);
 93		pdev->be_watching = 0;
 94	}
 95
 96	xen_pcibk_disconnect(pdev);
 97
 
 
 98	xen_pcibk_release_devices(pdev);
 99
100	dev_set_drvdata(&pdev->xdev->dev, NULL);
101	pdev->xdev = NULL;
102
103	kfree(pdev);
104}
105
106static int xen_pcibk_do_attach(struct xen_pcibk_device *pdev, int gnt_ref,
107			     int remote_evtchn)
108{
109	int err = 0;
110	void *vaddr;
111
112	dev_dbg(&pdev->xdev->dev,
113		"Attaching to frontend resources - gnt_ref=%d evtchn=%d\n",
114		gnt_ref, remote_evtchn);
115
116	err = xenbus_map_ring_valloc(pdev->xdev, gnt_ref, &vaddr);
117	if (err < 0) {
118		xenbus_dev_fatal(pdev->xdev, err,
119				"Error mapping other domain page in ours.");
120		goto out;
121	}
122
123	spin_lock(&pdev->dev_lock);
124	pdev->sh_info = vaddr;
125	spin_unlock(&pdev->dev_lock);
126
127	err = bind_interdomain_evtchn_to_irqhandler(
128		pdev->xdev->otherend_id, remote_evtchn, xen_pcibk_handle_event,
129		0, DRV_NAME, pdev);
130	if (err < 0) {
131		xenbus_dev_fatal(pdev->xdev, err,
132				 "Error binding event channel to IRQ");
133		goto out;
134	}
135
136	spin_lock(&pdev->dev_lock);
137	pdev->evtchn_irq = err;
138	spin_unlock(&pdev->dev_lock);
139	err = 0;
140
141	dev_dbg(&pdev->xdev->dev, "Attached!\n");
142out:
143	return err;
144}
145
146static int xen_pcibk_attach(struct xen_pcibk_device *pdev)
147{
148	int err = 0;
149	int gnt_ref, remote_evtchn;
150	char *magic = NULL;
151
152
 
153	/* Make sure we only do this setup once */
154	if (xenbus_read_driver_state(pdev->xdev->nodename) !=
155	    XenbusStateInitialised)
156		goto out;
157
158	/* Wait for frontend to state that it has published the configuration */
159	if (xenbus_read_driver_state(pdev->xdev->otherend) !=
160	    XenbusStateInitialised)
161		goto out;
162
163	dev_dbg(&pdev->xdev->dev, "Reading frontend config\n");
164
165	err = xenbus_gather(XBT_NIL, pdev->xdev->otherend,
166			    "pci-op-ref", "%u", &gnt_ref,
167			    "event-channel", "%u", &remote_evtchn,
168			    "magic", NULL, &magic, NULL);
169	if (err) {
170		/* If configuration didn't get read correctly, wait longer */
171		xenbus_dev_fatal(pdev->xdev, err,
172				 "Error reading configuration from frontend");
173		goto out;
174	}
175
176	if (magic == NULL || strcmp(magic, XEN_PCI_MAGIC) != 0) {
177		xenbus_dev_fatal(pdev->xdev, -EFAULT,
178				 "version mismatch (%s/%s) with pcifront - "
179				 "halting xen_pcibk",
180				 magic, XEN_PCI_MAGIC);
 
181		goto out;
182	}
183
184	err = xen_pcibk_do_attach(pdev, gnt_ref, remote_evtchn);
185	if (err)
186		goto out;
187
188	dev_dbg(&pdev->xdev->dev, "Connecting...\n");
189
190	err = xenbus_switch_state(pdev->xdev, XenbusStateConnected);
191	if (err)
192		xenbus_dev_fatal(pdev->xdev, err,
193				 "Error switching to connected state!");
194
195	dev_dbg(&pdev->xdev->dev, "Connected? %d\n", err);
196out:
 
197
198	kfree(magic);
199
200	return err;
201}
202
203static int xen_pcibk_publish_pci_dev(struct xen_pcibk_device *pdev,
204				   unsigned int domain, unsigned int bus,
205				   unsigned int devfn, unsigned int devid)
206{
207	int err;
208	int len;
209	char str[64];
210
211	len = snprintf(str, sizeof(str), "vdev-%d", devid);
212	if (unlikely(len >= (sizeof(str) - 1))) {
213		err = -ENOMEM;
214		goto out;
215	}
216
 
217	err = xenbus_printf(XBT_NIL, pdev->xdev->nodename, str,
218			    "%04x:%02x:%02x.%02x", domain, bus,
219			    PCI_SLOT(devfn), PCI_FUNC(devfn));
220
221out:
222	return err;
223}
224
225static int xen_pcibk_export_device(struct xen_pcibk_device *pdev,
226				 int domain, int bus, int slot, int func,
227				 int devid)
228{
229	struct pci_dev *dev;
230	int err = 0;
231
232	dev_dbg(&pdev->xdev->dev, "exporting dom %x bus %x slot %x func %x\n",
233		domain, bus, slot, func);
234
235	dev = pcistub_get_pci_dev_by_slot(pdev, domain, bus, slot, func);
236	if (!dev) {
237		err = -EINVAL;
238		xenbus_dev_fatal(pdev->xdev, err,
239				 "Couldn't locate PCI device "
240				 "(%04x:%02x:%02x.%01x)! "
241				 "perhaps already in-use?",
242				 domain, bus, slot, func);
243		goto out;
244	}
245
246	err = xen_pcibk_add_pci_dev(pdev, dev, devid,
247				    xen_pcibk_publish_pci_dev);
248	if (err)
249		goto out;
250
251	dev_dbg(&dev->dev, "registering for %d\n", pdev->xdev->otherend_id);
252	if (xen_register_device_domain_owner(dev,
253					     pdev->xdev->otherend_id) != 0) {
254		dev_err(&dev->dev, "device has been assigned to another " \
255			"domain! Over-writting the ownership, but beware.\n");
256		xen_unregister_device_domain_owner(dev);
257		xen_register_device_domain_owner(dev, pdev->xdev->otherend_id);
258	}
259
260	/* TODO: It'd be nice to export a bridge and have all of its children
261	 * get exported with it. This may be best done in xend (which will
262	 * have to calculate resource usage anyway) but we probably want to
263	 * put something in here to ensure that if a bridge gets given to a
264	 * driver domain, that all devices under that bridge are not given
265	 * to other driver domains (as he who controls the bridge can disable
266	 * it and stop the other devices from working).
267	 */
268out:
269	return err;
270}
271
272static int xen_pcibk_remove_device(struct xen_pcibk_device *pdev,
273				 int domain, int bus, int slot, int func)
274{
275	int err = 0;
276	struct pci_dev *dev;
277
278	dev_dbg(&pdev->xdev->dev, "removing dom %x bus %x slot %x func %x\n",
279		domain, bus, slot, func);
280
281	dev = xen_pcibk_get_pci_dev(pdev, domain, bus, PCI_DEVFN(slot, func));
282	if (!dev) {
283		err = -EINVAL;
284		dev_dbg(&pdev->xdev->dev, "Couldn't locate PCI device "
285			"(%04x:%02x:%02x.%01x)! not owned by this domain\n",
286			domain, bus, slot, func);
287		goto out;
288	}
289
290	dev_dbg(&dev->dev, "unregistering for %d\n", pdev->xdev->otherend_id);
291	xen_unregister_device_domain_owner(dev);
292
293	xen_pcibk_release_pci_dev(pdev, dev);
 
 
294
295out:
296	return err;
297}
298
299static int xen_pcibk_publish_pci_root(struct xen_pcibk_device *pdev,
300				    unsigned int domain, unsigned int bus)
301{
302	unsigned int d, b;
303	int i, root_num, len, err;
304	char str[64];
305
306	dev_dbg(&pdev->xdev->dev, "Publishing pci roots\n");
307
308	err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename,
309			   "root_num", "%d", &root_num);
310	if (err == 0 || err == -ENOENT)
311		root_num = 0;
312	else if (err < 0)
313		goto out;
314
315	/* Verify that we haven't already published this pci root */
316	for (i = 0; i < root_num; i++) {
317		len = snprintf(str, sizeof(str), "root-%d", i);
318		if (unlikely(len >= (sizeof(str) - 1))) {
319			err = -ENOMEM;
320			goto out;
321		}
322
323		err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename,
324				   str, "%x:%x", &d, &b);
325		if (err < 0)
326			goto out;
327		if (err != 2) {
328			err = -EINVAL;
329			goto out;
330		}
331
332		if (d == domain && b == bus) {
333			err = 0;
334			goto out;
335		}
336	}
337
338	len = snprintf(str, sizeof(str), "root-%d", root_num);
339	if (unlikely(len >= (sizeof(str) - 1))) {
340		err = -ENOMEM;
341		goto out;
342	}
343
344	dev_dbg(&pdev->xdev->dev, "writing root %d at %04x:%02x\n",
345		root_num, domain, bus);
346
347	err = xenbus_printf(XBT_NIL, pdev->xdev->nodename, str,
348			    "%04x:%02x", domain, bus);
349	if (err)
350		goto out;
351
352	err = xenbus_printf(XBT_NIL, pdev->xdev->nodename,
353			    "root_num", "%d", (root_num + 1));
354
355out:
356	return err;
357}
358
359static int xen_pcibk_reconfigure(struct xen_pcibk_device *pdev)
360{
361	int err = 0;
362	int num_devs;
363	int domain, bus, slot, func;
364	int substate;
365	int i, len;
366	char state_str[64];
367	char dev_str[64];
368
369
370	dev_dbg(&pdev->xdev->dev, "Reconfiguring device ...\n");
371
 
372	/* Make sure we only reconfigure once */
373	if (xenbus_read_driver_state(pdev->xdev->nodename) !=
374	    XenbusStateReconfiguring)
375		goto out;
376
377	err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename, "num_devs", "%d",
378			   &num_devs);
379	if (err != 1) {
380		if (err >= 0)
381			err = -EINVAL;
382		xenbus_dev_fatal(pdev->xdev, err,
383				 "Error reading number of devices");
384		goto out;
385	}
386
387	for (i = 0; i < num_devs; i++) {
388		len = snprintf(state_str, sizeof(state_str), "state-%d", i);
389		if (unlikely(len >= (sizeof(state_str) - 1))) {
390			err = -ENOMEM;
391			xenbus_dev_fatal(pdev->xdev, err,
392					 "String overflow while reading "
393					 "configuration");
394			goto out;
395		}
396		err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename, state_str,
397				   "%d", &substate);
398		if (err != 1)
399			substate = XenbusStateUnknown;
400
401		switch (substate) {
402		case XenbusStateInitialising:
403			dev_dbg(&pdev->xdev->dev, "Attaching dev-%d ...\n", i);
404
405			len = snprintf(dev_str, sizeof(dev_str), "dev-%d", i);
406			if (unlikely(len >= (sizeof(dev_str) - 1))) {
407				err = -ENOMEM;
408				xenbus_dev_fatal(pdev->xdev, err,
409						 "String overflow while "
410						 "reading configuration");
411				goto out;
412			}
413			err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename,
414					   dev_str, "%x:%x:%x.%x",
415					   &domain, &bus, &slot, &func);
416			if (err < 0) {
417				xenbus_dev_fatal(pdev->xdev, err,
418						 "Error reading device "
419						 "configuration");
420				goto out;
421			}
422			if (err != 4) {
423				err = -EINVAL;
424				xenbus_dev_fatal(pdev->xdev, err,
425						 "Error parsing pci device "
426						 "configuration");
427				goto out;
428			}
429
430			err = xen_pcibk_export_device(pdev, domain, bus, slot,
431						    func, i);
432			if (err)
433				goto out;
434
435			/* Publish pci roots. */
436			err = xen_pcibk_publish_pci_roots(pdev,
437						xen_pcibk_publish_pci_root);
438			if (err) {
439				xenbus_dev_fatal(pdev->xdev, err,
440						 "Error while publish PCI root"
441						 "buses for frontend");
442				goto out;
443			}
444
445			err = xenbus_printf(XBT_NIL, pdev->xdev->nodename,
446					    state_str, "%d",
447					    XenbusStateInitialised);
448			if (err) {
449				xenbus_dev_fatal(pdev->xdev, err,
450						 "Error switching substate of "
451						 "dev-%d\n", i);
452				goto out;
453			}
454			break;
455
456		case XenbusStateClosing:
457			dev_dbg(&pdev->xdev->dev, "Detaching dev-%d ...\n", i);
458
459			len = snprintf(dev_str, sizeof(dev_str), "vdev-%d", i);
460			if (unlikely(len >= (sizeof(dev_str) - 1))) {
461				err = -ENOMEM;
462				xenbus_dev_fatal(pdev->xdev, err,
463						 "String overflow while "
464						 "reading configuration");
465				goto out;
466			}
467			err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename,
468					   dev_str, "%x:%x:%x.%x",
469					   &domain, &bus, &slot, &func);
470			if (err < 0) {
471				xenbus_dev_fatal(pdev->xdev, err,
472						 "Error reading device "
473						 "configuration");
474				goto out;
475			}
476			if (err != 4) {
477				err = -EINVAL;
478				xenbus_dev_fatal(pdev->xdev, err,
479						 "Error parsing pci device "
480						 "configuration");
481				goto out;
482			}
483
484			err = xen_pcibk_remove_device(pdev, domain, bus, slot,
485						    func);
486			if (err)
487				goto out;
488
489			/* TODO: If at some point we implement support for pci
490			 * root hot-remove on pcifront side, we'll need to
491			 * remove unnecessary xenstore nodes of pci roots here.
492			 */
493
494			break;
495
496		default:
497			break;
498		}
499	}
500
501	err = xenbus_switch_state(pdev->xdev, XenbusStateReconfigured);
502	if (err) {
503		xenbus_dev_fatal(pdev->xdev, err,
504				 "Error switching to reconfigured state!");
505		goto out;
506	}
507
508out:
 
509	return 0;
510}
511
512static void xen_pcibk_frontend_changed(struct xenbus_device *xdev,
513				     enum xenbus_state fe_state)
514{
515	struct xen_pcibk_device *pdev = dev_get_drvdata(&xdev->dev);
516
517	dev_dbg(&xdev->dev, "fe state changed %d\n", fe_state);
518
519	switch (fe_state) {
520	case XenbusStateInitialised:
521		xen_pcibk_attach(pdev);
522		break;
523
524	case XenbusStateReconfiguring:
525		xen_pcibk_reconfigure(pdev);
526		break;
527
528	case XenbusStateConnected:
529		/* pcifront switched its state from reconfiguring to connected.
530		 * Then switch to connected state.
531		 */
532		xenbus_switch_state(xdev, XenbusStateConnected);
533		break;
534
535	case XenbusStateClosing:
536		xen_pcibk_disconnect(pdev);
537		xenbus_switch_state(xdev, XenbusStateClosing);
538		break;
539
540	case XenbusStateClosed:
541		xen_pcibk_disconnect(pdev);
542		xenbus_switch_state(xdev, XenbusStateClosed);
543		if (xenbus_dev_is_online(xdev))
544			break;
545		/* fall through if not online */
546	case XenbusStateUnknown:
547		dev_dbg(&xdev->dev, "frontend is gone! unregister device\n");
548		device_unregister(&xdev->dev);
549		break;
550
551	default:
552		break;
553	}
554}
555
556static int xen_pcibk_setup_backend(struct xen_pcibk_device *pdev)
557{
558	/* Get configuration from xend (if available now) */
559	int domain, bus, slot, func;
560	int err = 0;
561	int i, num_devs;
562	char dev_str[64];
563	char state_str[64];
564
 
565	/* It's possible we could get the call to setup twice, so make sure
566	 * we're not already connected.
567	 */
568	if (xenbus_read_driver_state(pdev->xdev->nodename) !=
569	    XenbusStateInitWait)
570		goto out;
571
572	dev_dbg(&pdev->xdev->dev, "getting be setup\n");
573
574	err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename, "num_devs", "%d",
575			   &num_devs);
576	if (err != 1) {
577		if (err >= 0)
578			err = -EINVAL;
579		xenbus_dev_fatal(pdev->xdev, err,
580				 "Error reading number of devices");
581		goto out;
582	}
583
584	for (i = 0; i < num_devs; i++) {
585		int l = snprintf(dev_str, sizeof(dev_str), "dev-%d", i);
586		if (unlikely(l >= (sizeof(dev_str) - 1))) {
587			err = -ENOMEM;
588			xenbus_dev_fatal(pdev->xdev, err,
589					 "String overflow while reading "
590					 "configuration");
591			goto out;
592		}
593
594		err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename, dev_str,
595				   "%x:%x:%x.%x", &domain, &bus, &slot, &func);
596		if (err < 0) {
597			xenbus_dev_fatal(pdev->xdev, err,
598					 "Error reading device configuration");
599			goto out;
600		}
601		if (err != 4) {
602			err = -EINVAL;
603			xenbus_dev_fatal(pdev->xdev, err,
604					 "Error parsing pci device "
605					 "configuration");
606			goto out;
607		}
608
609		err = xen_pcibk_export_device(pdev, domain, bus, slot, func, i);
610		if (err)
611			goto out;
612
613		/* Switch substate of this device. */
614		l = snprintf(state_str, sizeof(state_str), "state-%d", i);
615		if (unlikely(l >= (sizeof(state_str) - 1))) {
616			err = -ENOMEM;
617			xenbus_dev_fatal(pdev->xdev, err,
618					 "String overflow while reading "
619					 "configuration");
620			goto out;
621		}
622		err = xenbus_printf(XBT_NIL, pdev->xdev->nodename, state_str,
623				    "%d", XenbusStateInitialised);
624		if (err) {
625			xenbus_dev_fatal(pdev->xdev, err, "Error switching "
626					 "substate of dev-%d\n", i);
627			goto out;
628		}
629	}
630
631	err = xen_pcibk_publish_pci_roots(pdev, xen_pcibk_publish_pci_root);
632	if (err) {
633		xenbus_dev_fatal(pdev->xdev, err,
634				 "Error while publish PCI root buses "
635				 "for frontend");
636		goto out;
637	}
638
639	err = xenbus_switch_state(pdev->xdev, XenbusStateInitialised);
640	if (err)
641		xenbus_dev_fatal(pdev->xdev, err,
642				 "Error switching to initialised state!");
643
644out:
 
645	if (!err)
646		/* see if pcifront is already configured (if not, we'll wait) */
647		xen_pcibk_attach(pdev);
648
649	return err;
650}
651
652static void xen_pcibk_be_watch(struct xenbus_watch *watch,
653			     const char **vec, unsigned int len)
654{
655	struct xen_pcibk_device *pdev =
656	    container_of(watch, struct xen_pcibk_device, be_watch);
657
658	switch (xenbus_read_driver_state(pdev->xdev->nodename)) {
659	case XenbusStateInitWait:
660		xen_pcibk_setup_backend(pdev);
661		break;
662
663	default:
664		break;
665	}
666}
667
668static int xen_pcibk_xenbus_probe(struct xenbus_device *dev,
669				const struct xenbus_device_id *id)
670{
671	int err = 0;
672	struct xen_pcibk_device *pdev = alloc_pdev(dev);
673
674	if (pdev == NULL) {
675		err = -ENOMEM;
676		xenbus_dev_fatal(dev, err,
677				 "Error allocating xen_pcibk_device struct");
678		goto out;
679	}
680
681	/* wait for xend to configure us */
682	err = xenbus_switch_state(dev, XenbusStateInitWait);
683	if (err)
684		goto out;
685
686	/* watch the backend node for backend configuration information */
687	err = xenbus_watch_path(dev, dev->nodename, &pdev->be_watch,
688				xen_pcibk_be_watch);
689	if (err)
690		goto out;
691
692	pdev->be_watching = 1;
693
694	/* We need to force a call to our callback here in case
695	 * xend already configured us!
696	 */
697	xen_pcibk_be_watch(&pdev->be_watch, NULL, 0);
698
699out:
700	return err;
701}
702
703static int xen_pcibk_xenbus_remove(struct xenbus_device *dev)
704{
705	struct xen_pcibk_device *pdev = dev_get_drvdata(&dev->dev);
706
707	if (pdev != NULL)
708		free_pdev(pdev);
709
710	return 0;
711}
712
713static const struct xenbus_device_id xenpci_ids[] = {
714	{"pci"},
715	{""},
716};
717
718static struct xenbus_driver xenbus_xen_pcibk_driver = {
719	.name			= DRV_NAME,
720	.owner			= THIS_MODULE,
721	.ids			= xenpci_ids,
722	.probe			= xen_pcibk_xenbus_probe,
723	.remove			= xen_pcibk_xenbus_remove,
724	.otherend_changed	= xen_pcibk_frontend_changed,
725};
726
727struct xen_pcibk_backend *xen_pcibk_backend;
728
729int __init xen_pcibk_xenbus_register(void)
730{
731	xen_pcibk_wq = create_workqueue("xen_pciback_workqueue");
732	if (!xen_pcibk_wq) {
733		printk(KERN_ERR "%s: create"
734			"xen_pciback_workqueue failed\n", __func__);
735		return -EFAULT;
736	}
737	xen_pcibk_backend = &xen_pcibk_vpci_backend;
738	if (passthrough)
739		xen_pcibk_backend = &xen_pcibk_passthrough_backend;
740	pr_info(DRV_NAME ": backend is %s\n", xen_pcibk_backend->name);
741	return xenbus_register_backend(&xenbus_xen_pcibk_driver);
742}
743
744void __exit xen_pcibk_xenbus_unregister(void)
745{
746	destroy_workqueue(xen_pcibk_wq);
747	xenbus_unregister_driver(&xenbus_xen_pcibk_driver);
748}
v4.10.11
  1/*
  2 * PCI Backend Xenbus Setup - handles setup with frontend and xend
  3 *
  4 *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
  5 */
  6
  7#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  8
  9#include <linux/moduleparam.h>
 10#include <linux/init.h>
 11#include <linux/list.h>
 12#include <linux/vmalloc.h>
 13#include <linux/workqueue.h>
 14#include <xen/xenbus.h>
 15#include <xen/events.h>
 16#include <asm/xen/pci.h>
 17#include "pciback.h"
 18
 
 19#define INVALID_EVTCHN_IRQ  (-1)
 
 20
 21static bool __read_mostly passthrough;
 22module_param(passthrough, bool, S_IRUGO);
 23MODULE_PARM_DESC(passthrough,
 24	"Option to specify how to export PCI topology to guest:\n"\
 25	" 0 - (default) Hide the true PCI topology and makes the frontend\n"\
 26	"   there is a single PCI bus with only the exported devices on it.\n"\
 27	"   For example, a device at 03:05.0 will be re-assigned to 00:00.0\n"\
 28	"   while second device at 02:1a.1 will be re-assigned to 00:01.1.\n"\
 29	" 1 - Passthrough provides a real view of the PCI topology to the\n"\
 30	"   frontend (for example, a device at 06:01.b will still appear at\n"\
 31	"   06:01.b to the frontend). This is similar to how Xen 2.0.x\n"\
 32	"   exposed PCI devices to its driver domains. This may be required\n"\
 33	"   for drivers which depend on finding their hardward in certain\n"\
 34	"   bus/slot locations.");
 35
 36static struct xen_pcibk_device *alloc_pdev(struct xenbus_device *xdev)
 37{
 38	struct xen_pcibk_device *pdev;
 39
 40	pdev = kzalloc(sizeof(struct xen_pcibk_device), GFP_KERNEL);
 41	if (pdev == NULL)
 42		goto out;
 43	dev_dbg(&xdev->dev, "allocated pdev @ 0x%p\n", pdev);
 44
 45	pdev->xdev = xdev;
 
 46
 47	mutex_init(&pdev->dev_lock);
 48
 49	pdev->sh_info = NULL;
 50	pdev->evtchn_irq = INVALID_EVTCHN_IRQ;
 51	pdev->be_watching = 0;
 52
 53	INIT_WORK(&pdev->op_work, xen_pcibk_do_op);
 54
 55	if (xen_pcibk_init_devices(pdev)) {
 56		kfree(pdev);
 57		pdev = NULL;
 58	}
 59
 60	dev_set_drvdata(&xdev->dev, pdev);
 61
 62out:
 63	return pdev;
 64}
 65
 66static void xen_pcibk_disconnect(struct xen_pcibk_device *pdev)
 67{
 68	mutex_lock(&pdev->dev_lock);
 
 69	/* Ensure the guest can't trigger our handler before removing devices */
 70	if (pdev->evtchn_irq != INVALID_EVTCHN_IRQ) {
 71		unbind_from_irqhandler(pdev->evtchn_irq, pdev);
 72		pdev->evtchn_irq = INVALID_EVTCHN_IRQ;
 73	}
 
 74
 75	/* If the driver domain started an op, make sure we complete it
 76	 * before releasing the shared memory */
 77
 78	flush_work(&pdev->op_work);
 
 79
 
 80	if (pdev->sh_info != NULL) {
 81		xenbus_unmap_ring_vfree(pdev->xdev, pdev->sh_info);
 82		pdev->sh_info = NULL;
 83	}
 84	mutex_unlock(&pdev->dev_lock);
 
 85}
 86
 87static void free_pdev(struct xen_pcibk_device *pdev)
 88{
 89	if (pdev->be_watching) {
 90		unregister_xenbus_watch(&pdev->be_watch);
 91		pdev->be_watching = 0;
 92	}
 93
 94	xen_pcibk_disconnect(pdev);
 95
 96	/* N.B. This calls pcistub_put_pci_dev which does the FLR on all
 97	 * of the PCIe devices. */
 98	xen_pcibk_release_devices(pdev);
 99
100	dev_set_drvdata(&pdev->xdev->dev, NULL);
101	pdev->xdev = NULL;
102
103	kfree(pdev);
104}
105
106static int xen_pcibk_do_attach(struct xen_pcibk_device *pdev, int gnt_ref,
107			     int remote_evtchn)
108{
109	int err = 0;
110	void *vaddr;
111
112	dev_dbg(&pdev->xdev->dev,
113		"Attaching to frontend resources - gnt_ref=%d evtchn=%d\n",
114		gnt_ref, remote_evtchn);
115
116	err = xenbus_map_ring_valloc(pdev->xdev, &gnt_ref, 1, &vaddr);
117	if (err < 0) {
118		xenbus_dev_fatal(pdev->xdev, err,
119				"Error mapping other domain page in ours.");
120		goto out;
121	}
122
 
123	pdev->sh_info = vaddr;
 
124
125	err = bind_interdomain_evtchn_to_irqhandler(
126		pdev->xdev->otherend_id, remote_evtchn, xen_pcibk_handle_event,
127		0, DRV_NAME, pdev);
128	if (err < 0) {
129		xenbus_dev_fatal(pdev->xdev, err,
130				 "Error binding event channel to IRQ");
131		goto out;
132	}
 
 
133	pdev->evtchn_irq = err;
 
134	err = 0;
135
136	dev_dbg(&pdev->xdev->dev, "Attached!\n");
137out:
138	return err;
139}
140
141static int xen_pcibk_attach(struct xen_pcibk_device *pdev)
142{
143	int err = 0;
144	int gnt_ref, remote_evtchn;
145	char *magic = NULL;
146
147
148	mutex_lock(&pdev->dev_lock);
149	/* Make sure we only do this setup once */
150	if (xenbus_read_driver_state(pdev->xdev->nodename) !=
151	    XenbusStateInitialised)
152		goto out;
153
154	/* Wait for frontend to state that it has published the configuration */
155	if (xenbus_read_driver_state(pdev->xdev->otherend) !=
156	    XenbusStateInitialised)
157		goto out;
158
159	dev_dbg(&pdev->xdev->dev, "Reading frontend config\n");
160
161	err = xenbus_gather(XBT_NIL, pdev->xdev->otherend,
162			    "pci-op-ref", "%u", &gnt_ref,
163			    "event-channel", "%u", &remote_evtchn,
164			    "magic", NULL, &magic, NULL);
165	if (err) {
166		/* If configuration didn't get read correctly, wait longer */
167		xenbus_dev_fatal(pdev->xdev, err,
168				 "Error reading configuration from frontend");
169		goto out;
170	}
171
172	if (magic == NULL || strcmp(magic, XEN_PCI_MAGIC) != 0) {
173		xenbus_dev_fatal(pdev->xdev, -EFAULT,
174				 "version mismatch (%s/%s) with pcifront - "
175				 "halting " DRV_NAME,
176				 magic, XEN_PCI_MAGIC);
177		err = -EFAULT;
178		goto out;
179	}
180
181	err = xen_pcibk_do_attach(pdev, gnt_ref, remote_evtchn);
182	if (err)
183		goto out;
184
185	dev_dbg(&pdev->xdev->dev, "Connecting...\n");
186
187	err = xenbus_switch_state(pdev->xdev, XenbusStateConnected);
188	if (err)
189		xenbus_dev_fatal(pdev->xdev, err,
190				 "Error switching to connected state!");
191
192	dev_dbg(&pdev->xdev->dev, "Connected? %d\n", err);
193out:
194	mutex_unlock(&pdev->dev_lock);
195
196	kfree(magic);
197
198	return err;
199}
200
201static int xen_pcibk_publish_pci_dev(struct xen_pcibk_device *pdev,
202				   unsigned int domain, unsigned int bus,
203				   unsigned int devfn, unsigned int devid)
204{
205	int err;
206	int len;
207	char str[64];
208
209	len = snprintf(str, sizeof(str), "vdev-%d", devid);
210	if (unlikely(len >= (sizeof(str) - 1))) {
211		err = -ENOMEM;
212		goto out;
213	}
214
215	/* Note: The PV protocol uses %02x, don't change it */
216	err = xenbus_printf(XBT_NIL, pdev->xdev->nodename, str,
217			    "%04x:%02x:%02x.%02x", domain, bus,
218			    PCI_SLOT(devfn), PCI_FUNC(devfn));
219
220out:
221	return err;
222}
223
224static int xen_pcibk_export_device(struct xen_pcibk_device *pdev,
225				 int domain, int bus, int slot, int func,
226				 int devid)
227{
228	struct pci_dev *dev;
229	int err = 0;
230
231	dev_dbg(&pdev->xdev->dev, "exporting dom %x bus %x slot %x func %x\n",
232		domain, bus, slot, func);
233
234	dev = pcistub_get_pci_dev_by_slot(pdev, domain, bus, slot, func);
235	if (!dev) {
236		err = -EINVAL;
237		xenbus_dev_fatal(pdev->xdev, err,
238				 "Couldn't locate PCI device "
239				 "(%04x:%02x:%02x.%d)! "
240				 "perhaps already in-use?",
241				 domain, bus, slot, func);
242		goto out;
243	}
244
245	err = xen_pcibk_add_pci_dev(pdev, dev, devid,
246				    xen_pcibk_publish_pci_dev);
247	if (err)
248		goto out;
249
250	dev_info(&dev->dev, "registering for %d\n", pdev->xdev->otherend_id);
251	if (xen_register_device_domain_owner(dev,
252					     pdev->xdev->otherend_id) != 0) {
253		dev_err(&dev->dev, "Stealing ownership from dom%d.\n",
254			xen_find_device_domain_owner(dev));
255		xen_unregister_device_domain_owner(dev);
256		xen_register_device_domain_owner(dev, pdev->xdev->otherend_id);
257	}
258
259	/* TODO: It'd be nice to export a bridge and have all of its children
260	 * get exported with it. This may be best done in xend (which will
261	 * have to calculate resource usage anyway) but we probably want to
262	 * put something in here to ensure that if a bridge gets given to a
263	 * driver domain, that all devices under that bridge are not given
264	 * to other driver domains (as he who controls the bridge can disable
265	 * it and stop the other devices from working).
266	 */
267out:
268	return err;
269}
270
271static int xen_pcibk_remove_device(struct xen_pcibk_device *pdev,
272				 int domain, int bus, int slot, int func)
273{
274	int err = 0;
275	struct pci_dev *dev;
276
277	dev_dbg(&pdev->xdev->dev, "removing dom %x bus %x slot %x func %x\n",
278		domain, bus, slot, func);
279
280	dev = xen_pcibk_get_pci_dev(pdev, domain, bus, PCI_DEVFN(slot, func));
281	if (!dev) {
282		err = -EINVAL;
283		dev_dbg(&pdev->xdev->dev, "Couldn't locate PCI device "
284			"(%04x:%02x:%02x.%d)! not owned by this domain\n",
285			domain, bus, slot, func);
286		goto out;
287	}
288
289	dev_dbg(&dev->dev, "unregistering for %d\n", pdev->xdev->otherend_id);
290	xen_unregister_device_domain_owner(dev);
291
292	/* N.B. This ends up calling pcistub_put_pci_dev which ends up
293	 * doing the FLR. */
294	xen_pcibk_release_pci_dev(pdev, dev, true /* use the lock. */);
295
296out:
297	return err;
298}
299
300static int xen_pcibk_publish_pci_root(struct xen_pcibk_device *pdev,
301				    unsigned int domain, unsigned int bus)
302{
303	unsigned int d, b;
304	int i, root_num, len, err;
305	char str[64];
306
307	dev_dbg(&pdev->xdev->dev, "Publishing pci roots\n");
308
309	err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename,
310			   "root_num", "%d", &root_num);
311	if (err == 0 || err == -ENOENT)
312		root_num = 0;
313	else if (err < 0)
314		goto out;
315
316	/* Verify that we haven't already published this pci root */
317	for (i = 0; i < root_num; i++) {
318		len = snprintf(str, sizeof(str), "root-%d", i);
319		if (unlikely(len >= (sizeof(str) - 1))) {
320			err = -ENOMEM;
321			goto out;
322		}
323
324		err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename,
325				   str, "%x:%x", &d, &b);
326		if (err < 0)
327			goto out;
328		if (err != 2) {
329			err = -EINVAL;
330			goto out;
331		}
332
333		if (d == domain && b == bus) {
334			err = 0;
335			goto out;
336		}
337	}
338
339	len = snprintf(str, sizeof(str), "root-%d", root_num);
340	if (unlikely(len >= (sizeof(str) - 1))) {
341		err = -ENOMEM;
342		goto out;
343	}
344
345	dev_dbg(&pdev->xdev->dev, "writing root %d at %04x:%02x\n",
346		root_num, domain, bus);
347
348	err = xenbus_printf(XBT_NIL, pdev->xdev->nodename, str,
349			    "%04x:%02x", domain, bus);
350	if (err)
351		goto out;
352
353	err = xenbus_printf(XBT_NIL, pdev->xdev->nodename,
354			    "root_num", "%d", (root_num + 1));
355
356out:
357	return err;
358}
359
360static int xen_pcibk_reconfigure(struct xen_pcibk_device *pdev)
361{
362	int err = 0;
363	int num_devs;
364	int domain, bus, slot, func;
365	unsigned int substate;
366	int i, len;
367	char state_str[64];
368	char dev_str[64];
369
370
371	dev_dbg(&pdev->xdev->dev, "Reconfiguring device ...\n");
372
373	mutex_lock(&pdev->dev_lock);
374	/* Make sure we only reconfigure once */
375	if (xenbus_read_driver_state(pdev->xdev->nodename) !=
376	    XenbusStateReconfiguring)
377		goto out;
378
379	err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename, "num_devs", "%d",
380			   &num_devs);
381	if (err != 1) {
382		if (err >= 0)
383			err = -EINVAL;
384		xenbus_dev_fatal(pdev->xdev, err,
385				 "Error reading number of devices");
386		goto out;
387	}
388
389	for (i = 0; i < num_devs; i++) {
390		len = snprintf(state_str, sizeof(state_str), "state-%d", i);
391		if (unlikely(len >= (sizeof(state_str) - 1))) {
392			err = -ENOMEM;
393			xenbus_dev_fatal(pdev->xdev, err,
394					 "String overflow while reading "
395					 "configuration");
396			goto out;
397		}
398		substate = xenbus_read_unsigned(pdev->xdev->nodename, state_str,
399						XenbusStateUnknown);
 
 
400
401		switch (substate) {
402		case XenbusStateInitialising:
403			dev_dbg(&pdev->xdev->dev, "Attaching dev-%d ...\n", i);
404
405			len = snprintf(dev_str, sizeof(dev_str), "dev-%d", i);
406			if (unlikely(len >= (sizeof(dev_str) - 1))) {
407				err = -ENOMEM;
408				xenbus_dev_fatal(pdev->xdev, err,
409						 "String overflow while "
410						 "reading configuration");
411				goto out;
412			}
413			err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename,
414					   dev_str, "%x:%x:%x.%x",
415					   &domain, &bus, &slot, &func);
416			if (err < 0) {
417				xenbus_dev_fatal(pdev->xdev, err,
418						 "Error reading device "
419						 "configuration");
420				goto out;
421			}
422			if (err != 4) {
423				err = -EINVAL;
424				xenbus_dev_fatal(pdev->xdev, err,
425						 "Error parsing pci device "
426						 "configuration");
427				goto out;
428			}
429
430			err = xen_pcibk_export_device(pdev, domain, bus, slot,
431						    func, i);
432			if (err)
433				goto out;
434
435			/* Publish pci roots. */
436			err = xen_pcibk_publish_pci_roots(pdev,
437						xen_pcibk_publish_pci_root);
438			if (err) {
439				xenbus_dev_fatal(pdev->xdev, err,
440						 "Error while publish PCI root"
441						 "buses for frontend");
442				goto out;
443			}
444
445			err = xenbus_printf(XBT_NIL, pdev->xdev->nodename,
446					    state_str, "%d",
447					    XenbusStateInitialised);
448			if (err) {
449				xenbus_dev_fatal(pdev->xdev, err,
450						 "Error switching substate of "
451						 "dev-%d\n", i);
452				goto out;
453			}
454			break;
455
456		case XenbusStateClosing:
457			dev_dbg(&pdev->xdev->dev, "Detaching dev-%d ...\n", i);
458
459			len = snprintf(dev_str, sizeof(dev_str), "vdev-%d", i);
460			if (unlikely(len >= (sizeof(dev_str) - 1))) {
461				err = -ENOMEM;
462				xenbus_dev_fatal(pdev->xdev, err,
463						 "String overflow while "
464						 "reading configuration");
465				goto out;
466			}
467			err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename,
468					   dev_str, "%x:%x:%x.%x",
469					   &domain, &bus, &slot, &func);
470			if (err < 0) {
471				xenbus_dev_fatal(pdev->xdev, err,
472						 "Error reading device "
473						 "configuration");
474				goto out;
475			}
476			if (err != 4) {
477				err = -EINVAL;
478				xenbus_dev_fatal(pdev->xdev, err,
479						 "Error parsing pci device "
480						 "configuration");
481				goto out;
482			}
483
484			err = xen_pcibk_remove_device(pdev, domain, bus, slot,
485						    func);
486			if (err)
487				goto out;
488
489			/* TODO: If at some point we implement support for pci
490			 * root hot-remove on pcifront side, we'll need to
491			 * remove unnecessary xenstore nodes of pci roots here.
492			 */
493
494			break;
495
496		default:
497			break;
498		}
499	}
500
501	err = xenbus_switch_state(pdev->xdev, XenbusStateReconfigured);
502	if (err) {
503		xenbus_dev_fatal(pdev->xdev, err,
504				 "Error switching to reconfigured state!");
505		goto out;
506	}
507
508out:
509	mutex_unlock(&pdev->dev_lock);
510	return 0;
511}
512
513static void xen_pcibk_frontend_changed(struct xenbus_device *xdev,
514				     enum xenbus_state fe_state)
515{
516	struct xen_pcibk_device *pdev = dev_get_drvdata(&xdev->dev);
517
518	dev_dbg(&xdev->dev, "fe state changed %d\n", fe_state);
519
520	switch (fe_state) {
521	case XenbusStateInitialised:
522		xen_pcibk_attach(pdev);
523		break;
524
525	case XenbusStateReconfiguring:
526		xen_pcibk_reconfigure(pdev);
527		break;
528
529	case XenbusStateConnected:
530		/* pcifront switched its state from reconfiguring to connected.
531		 * Then switch to connected state.
532		 */
533		xenbus_switch_state(xdev, XenbusStateConnected);
534		break;
535
536	case XenbusStateClosing:
537		xen_pcibk_disconnect(pdev);
538		xenbus_switch_state(xdev, XenbusStateClosing);
539		break;
540
541	case XenbusStateClosed:
542		xen_pcibk_disconnect(pdev);
543		xenbus_switch_state(xdev, XenbusStateClosed);
544		if (xenbus_dev_is_online(xdev))
545			break;
546		/* fall through if not online */
547	case XenbusStateUnknown:
548		dev_dbg(&xdev->dev, "frontend is gone! unregister device\n");
549		device_unregister(&xdev->dev);
550		break;
551
552	default:
553		break;
554	}
555}
556
557static int xen_pcibk_setup_backend(struct xen_pcibk_device *pdev)
558{
559	/* Get configuration from xend (if available now) */
560	int domain, bus, slot, func;
561	int err = 0;
562	int i, num_devs;
563	char dev_str[64];
564	char state_str[64];
565
566	mutex_lock(&pdev->dev_lock);
567	/* It's possible we could get the call to setup twice, so make sure
568	 * we're not already connected.
569	 */
570	if (xenbus_read_driver_state(pdev->xdev->nodename) !=
571	    XenbusStateInitWait)
572		goto out;
573
574	dev_dbg(&pdev->xdev->dev, "getting be setup\n");
575
576	err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename, "num_devs", "%d",
577			   &num_devs);
578	if (err != 1) {
579		if (err >= 0)
580			err = -EINVAL;
581		xenbus_dev_fatal(pdev->xdev, err,
582				 "Error reading number of devices");
583		goto out;
584	}
585
586	for (i = 0; i < num_devs; i++) {
587		int l = snprintf(dev_str, sizeof(dev_str), "dev-%d", i);
588		if (unlikely(l >= (sizeof(dev_str) - 1))) {
589			err = -ENOMEM;
590			xenbus_dev_fatal(pdev->xdev, err,
591					 "String overflow while reading "
592					 "configuration");
593			goto out;
594		}
595
596		err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename, dev_str,
597				   "%x:%x:%x.%x", &domain, &bus, &slot, &func);
598		if (err < 0) {
599			xenbus_dev_fatal(pdev->xdev, err,
600					 "Error reading device configuration");
601			goto out;
602		}
603		if (err != 4) {
604			err = -EINVAL;
605			xenbus_dev_fatal(pdev->xdev, err,
606					 "Error parsing pci device "
607					 "configuration");
608			goto out;
609		}
610
611		err = xen_pcibk_export_device(pdev, domain, bus, slot, func, i);
612		if (err)
613			goto out;
614
615		/* Switch substate of this device. */
616		l = snprintf(state_str, sizeof(state_str), "state-%d", i);
617		if (unlikely(l >= (sizeof(state_str) - 1))) {
618			err = -ENOMEM;
619			xenbus_dev_fatal(pdev->xdev, err,
620					 "String overflow while reading "
621					 "configuration");
622			goto out;
623		}
624		err = xenbus_printf(XBT_NIL, pdev->xdev->nodename, state_str,
625				    "%d", XenbusStateInitialised);
626		if (err) {
627			xenbus_dev_fatal(pdev->xdev, err, "Error switching "
628					 "substate of dev-%d\n", i);
629			goto out;
630		}
631	}
632
633	err = xen_pcibk_publish_pci_roots(pdev, xen_pcibk_publish_pci_root);
634	if (err) {
635		xenbus_dev_fatal(pdev->xdev, err,
636				 "Error while publish PCI root buses "
637				 "for frontend");
638		goto out;
639	}
640
641	err = xenbus_switch_state(pdev->xdev, XenbusStateInitialised);
642	if (err)
643		xenbus_dev_fatal(pdev->xdev, err,
644				 "Error switching to initialised state!");
645
646out:
647	mutex_unlock(&pdev->dev_lock);
648	if (!err)
649		/* see if pcifront is already configured (if not, we'll wait) */
650		xen_pcibk_attach(pdev);
 
651	return err;
652}
653
654static void xen_pcibk_be_watch(struct xenbus_watch *watch,
655			     const char **vec, unsigned int len)
656{
657	struct xen_pcibk_device *pdev =
658	    container_of(watch, struct xen_pcibk_device, be_watch);
659
660	switch (xenbus_read_driver_state(pdev->xdev->nodename)) {
661	case XenbusStateInitWait:
662		xen_pcibk_setup_backend(pdev);
663		break;
664
665	default:
666		break;
667	}
668}
669
670static int xen_pcibk_xenbus_probe(struct xenbus_device *dev,
671				const struct xenbus_device_id *id)
672{
673	int err = 0;
674	struct xen_pcibk_device *pdev = alloc_pdev(dev);
675
676	if (pdev == NULL) {
677		err = -ENOMEM;
678		xenbus_dev_fatal(dev, err,
679				 "Error allocating xen_pcibk_device struct");
680		goto out;
681	}
682
683	/* wait for xend to configure us */
684	err = xenbus_switch_state(dev, XenbusStateInitWait);
685	if (err)
686		goto out;
687
688	/* watch the backend node for backend configuration information */
689	err = xenbus_watch_path(dev, dev->nodename, &pdev->be_watch,
690				xen_pcibk_be_watch);
691	if (err)
692		goto out;
693
694	pdev->be_watching = 1;
695
696	/* We need to force a call to our callback here in case
697	 * xend already configured us!
698	 */
699	xen_pcibk_be_watch(&pdev->be_watch, NULL, 0);
700
701out:
702	return err;
703}
704
705static int xen_pcibk_xenbus_remove(struct xenbus_device *dev)
706{
707	struct xen_pcibk_device *pdev = dev_get_drvdata(&dev->dev);
708
709	if (pdev != NULL)
710		free_pdev(pdev);
711
712	return 0;
713}
714
715static const struct xenbus_device_id xen_pcibk_ids[] = {
716	{"pci"},
717	{""},
718};
719
720static struct xenbus_driver xen_pcibk_driver = {
721	.name                   = DRV_NAME,
722	.ids                    = xen_pcibk_ids,
 
723	.probe			= xen_pcibk_xenbus_probe,
724	.remove			= xen_pcibk_xenbus_remove,
725	.otherend_changed	= xen_pcibk_frontend_changed,
726};
727
728const struct xen_pcibk_backend *__read_mostly xen_pcibk_backend;
729
730int __init xen_pcibk_xenbus_register(void)
731{
 
 
 
 
 
 
732	xen_pcibk_backend = &xen_pcibk_vpci_backend;
733	if (passthrough)
734		xen_pcibk_backend = &xen_pcibk_passthrough_backend;
735	pr_info("backend is %s\n", xen_pcibk_backend->name);
736	return xenbus_register_backend(&xen_pcibk_driver);
737}
738
739void __exit xen_pcibk_xenbus_unregister(void)
740{
741	xenbus_unregister_driver(&xen_pcibk_driver);
 
742}