Lines Matching +full:pci +full:- +full:domain

1 // SPDX-License-Identifier: GPL-2.0-only
8 #include <linux/pci.h>
10 #include <linux/pci-acpi.h>
11 #include <xen/pci.h>
18 #include "../pci/pci.h"
32 struct pci_dev *physfn = pci_dev->physfn; in xen_add_device()
47 if (pci_domain_nr(pci_dev->bus) >> 16) { in xen_add_device()
49 * The hypercall interface is limited to 16bit PCI segment in xen_add_device()
54 "not registering with Xen: invalid PCI segment\n"); in xen_add_device()
61 add->seg = pci_domain_nr(pci_dev->bus); in xen_add_device()
62 add->bus = pci_dev->bus->number; in xen_add_device()
63 add->devfn = pci_dev->devfn; in xen_add_device()
70 if (pci_dev->is_virtfn) { in xen_add_device()
71 add->flags = XEN_PCI_DEV_VIRTFN; in xen_add_device()
72 add->physfn.bus = physfn->bus->number; in xen_add_device()
73 add->physfn.devfn = physfn->devfn; in xen_add_device()
76 if (pci_ari_enabled(pci_dev->bus) && PCI_SLOT(pci_dev->devfn)) in xen_add_device()
77 add->flags = XEN_PCI_DEV_EXTFN; in xen_add_device()
80 handle = ACPI_HANDLE(&pci_dev->dev); in xen_add_device()
82 if (!handle && pci_dev->is_virtfn) in xen_add_device()
83 handle = ACPI_HANDLE(physfn->bus->bridge); in xen_add_device()
88 * all. Try to get acpi handle of parent pci bus. in xen_add_device()
91 for (pbus = pci_dev->bus; pbus; pbus = pbus->parent) { in xen_add_device()
106 add->optarr[0] = pxm; in xen_add_device()
107 add->flags |= XEN_PCI_DEV_PXM; in xen_add_device()
116 if (r != -ENOSYS) in xen_add_device()
121 if (pci_domain_nr(pci_dev->bus)) in xen_add_device()
122 r = -ENOSYS; in xen_add_device()
124 else if (pci_dev->is_virtfn) { in xen_add_device()
126 .bus = pci_dev->bus->number, in xen_add_device()
127 .devfn = pci_dev->devfn, in xen_add_device()
129 .physfn.bus = physfn->bus->number, in xen_add_device()
130 .physfn.devfn = physfn->devfn, in xen_add_device()
137 else if (pci_ari_enabled(pci_dev->bus) && PCI_SLOT(pci_dev->devfn)) { in xen_add_device()
139 .bus = pci_dev->bus->number, in xen_add_device()
140 .devfn = pci_dev->devfn, in xen_add_device()
148 .bus = pci_dev->bus->number, in xen_add_device()
149 .devfn = pci_dev->devfn, in xen_add_device()
164 if (pci_domain_nr(pci_dev->bus) >> 16) { in xen_remove_device()
166 * The hypercall interface is limited to 16bit PCI segment in xen_remove_device()
170 "not unregistering with Xen: invalid PCI segment\n"); in xen_remove_device()
176 .seg = pci_domain_nr(pci_dev->bus), in xen_remove_device()
177 .bus = pci_dev->bus->number, in xen_remove_device()
178 .devfn = pci_dev->devfn in xen_remove_device()
183 } else if (pci_domain_nr(pci_dev->bus)) in xen_remove_device()
184 r = -ENOSYS; in xen_remove_device()
187 .bus = pci_dev->bus->number, in xen_remove_device()
188 .devfn = pci_dev->devfn in xen_remove_device()
201 .dev.seg = pci_domain_nr(dev->bus), in xen_reset_device()
202 .dev.bus = dev->bus->number, in xen_reset_device()
203 .dev.devfn = dev->devfn, in xen_reset_device()
207 if (pci_domain_nr(dev->bus) >> 16) { in xen_reset_device()
209 * The hypercall interface is limited to 16bit PCI segment in xen_reset_device()
212 dev_info(&dev->dev, in xen_reset_device()
213 "unable to notify Xen of device reset: invalid PCI segment\n"); in xen_reset_device()
238 dev_err(dev, "Failed to %s - passthrough or MSI/MSI-X might fail!\n", in xen_pci_notifier()
277 r.address = cfg->address; in xen_mcfg_late()
278 r.segment = cfg->segment; in xen_mcfg_late()
279 r.start_bus = cfg->start_bus; in xen_mcfg_late()
280 r.end_bus = cfg->end_bus; in xen_mcfg_late()
286 case -ENOSYS: in xen_mcfg_late()
293 cfg->name, rc); in xen_mcfg_late()
302 domid_t domain; member
315 if (owner->dev == dev) in find_device()
324 int domain = -ENODEV; in xen_find_device_domain_owner() local
329 domain = owner->domain; in xen_find_device_domain_owner()
331 return domain; in xen_find_device_domain_owner()
335 int xen_register_device_domain_owner(struct pci_dev *dev, uint16_t domain) in xen_register_device_domain_owner() argument
341 return -ENODEV; in xen_register_device_domain_owner()
347 return -EEXIST; in xen_register_device_domain_owner()
349 owner->domain = domain; in xen_register_device_domain_owner()
350 owner->dev = dev; in xen_register_device_domain_owner()
351 list_add_tail(&owner->list, &dev_domain_list); in xen_register_device_domain_owner()
365 return -ENODEV; in xen_unregister_device_domain_owner()
367 list_del(&owner->list); in xen_unregister_device_domain_owner()