1 | // SPDX-License-Identifier: GPL-2.0-only |
---|---|
2 | #include <linux/pci.h> |
3 | #include <linux/usb.h> |
4 | #include <linux/usb/ehci_def.h> |
5 | #include <linux/usb/hcd.h> |
6 | #include <asm/xen/hypercall.h> |
7 | #include <xen/interface/physdev.h> |
8 | #include <xen/xen.h> |
9 | |
10 | static int xen_dbgp_op(struct usb_hcd *hcd, int op) |
11 | { |
12 | #ifdef CONFIG_PCI |
13 | const struct device *ctrlr = hcd_to_bus(hcd)->controller; |
14 | #endif |
15 | struct physdev_dbgp_op dbgp; |
16 | |
17 | if (!xen_initial_domain()) |
18 | return 0; |
19 | |
20 | dbgp.op = op; |
21 | |
22 | #ifdef CONFIG_PCI |
23 | if (dev_is_pci(ctrlr)) { |
24 | const struct pci_dev *pdev = to_pci_dev(ctrlr); |
25 | |
26 | dbgp.u.pci.seg = pci_domain_nr(bus: pdev->bus); |
27 | dbgp.u.pci.bus = pdev->bus->number; |
28 | dbgp.u.pci.devfn = pdev->devfn; |
29 | dbgp.bus = PHYSDEVOP_DBGP_BUS_PCI; |
30 | } else |
31 | #endif |
32 | dbgp.bus = PHYSDEVOP_DBGP_BUS_UNKNOWN; |
33 | |
34 | return HYPERVISOR_physdev_op(PHYSDEVOP_dbgp_op, arg: &dbgp); |
35 | } |
36 | |
37 | int xen_dbgp_reset_prep(struct usb_hcd *hcd) |
38 | { |
39 | return xen_dbgp_op(hcd, PHYSDEVOP_DBGP_RESET_PREPARE); |
40 | } |
41 | |
42 | int xen_dbgp_external_startup(struct usb_hcd *hcd) |
43 | { |
44 | return xen_dbgp_op(hcd, PHYSDEVOP_DBGP_RESET_DONE); |
45 | } |
46 | |
47 | #ifndef CONFIG_EARLY_PRINTK_DBGP |
48 | #include <linux/export.h> |
49 | EXPORT_SYMBOL_GPL(xen_dbgp_reset_prep); |
50 | EXPORT_SYMBOL_GPL(xen_dbgp_external_startup); |
51 | #endif |
52 |