diff options
Diffstat (limited to 'drivers/xen/dbgp.c')
-rw-r--r-- | drivers/xen/dbgp.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/drivers/xen/dbgp.c b/drivers/xen/dbgp.c new file mode 100644 index 000000000000..42569c77ccc8 --- /dev/null +++ b/drivers/xen/dbgp.c | |||
@@ -0,0 +1,48 @@ | |||
1 | #include <linux/pci.h> | ||
2 | #include <linux/usb.h> | ||
3 | #include <linux/usb/ehci_def.h> | ||
4 | #include <linux/usb/hcd.h> | ||
5 | #include <asm/xen/hypercall.h> | ||
6 | #include <xen/interface/physdev.h> | ||
7 | #include <xen/xen.h> | ||
8 | |||
9 | static int xen_dbgp_op(struct usb_hcd *hcd, int op) | ||
10 | { | ||
11 | const struct device *ctrlr = hcd_to_bus(hcd)->controller; | ||
12 | struct physdev_dbgp_op dbgp; | ||
13 | |||
14 | if (!xen_initial_domain()) | ||
15 | return 0; | ||
16 | |||
17 | dbgp.op = op; | ||
18 | |||
19 | #ifdef CONFIG_PCI | ||
20 | if (ctrlr->bus == &pci_bus_type) { | ||
21 | const struct pci_dev *pdev = to_pci_dev(ctrlr); | ||
22 | |||
23 | dbgp.u.pci.seg = pci_domain_nr(pdev->bus); | ||
24 | dbgp.u.pci.bus = pdev->bus->number; | ||
25 | dbgp.u.pci.devfn = pdev->devfn; | ||
26 | dbgp.bus = PHYSDEVOP_DBGP_BUS_PCI; | ||
27 | } else | ||
28 | #endif | ||
29 | dbgp.bus = PHYSDEVOP_DBGP_BUS_UNKNOWN; | ||
30 | |||
31 | return HYPERVISOR_physdev_op(PHYSDEVOP_dbgp_op, &dbgp); | ||
32 | } | ||
33 | |||
34 | int xen_dbgp_reset_prep(struct usb_hcd *hcd) | ||
35 | { | ||
36 | return xen_dbgp_op(hcd, PHYSDEVOP_DBGP_RESET_PREPARE); | ||
37 | } | ||
38 | |||
39 | int xen_dbgp_external_startup(struct usb_hcd *hcd) | ||
40 | { | ||
41 | return xen_dbgp_op(hcd, PHYSDEVOP_DBGP_RESET_DONE); | ||
42 | } | ||
43 | |||
44 | #ifndef CONFIG_EARLY_PRINTK_DBGP | ||
45 | #include <linux/export.h> | ||
46 | EXPORT_SYMBOL_GPL(xen_dbgp_reset_prep); | ||
47 | EXPORT_SYMBOL_GPL(xen_dbgp_external_startup); | ||
48 | #endif | ||