6 #include <linux/module.h>
10 #include <xen/events.h>
14 #include <linux/pci.h>
21 #include <linux/bitops.h>
22 #include <linux/time.h>
25 #define INVALID_GRANT_REF (0)
26 #define INVALID_EVTCHN (-1)
33 #define _PDEVB_op_active (0)
34 #define PDEVB_op_active (1 << (_PDEVB_op_active))
65 unsigned int domain,
unsigned int bus,
75 static int verbose_request;
78 static int errno_to_pcibios_err(
int errno)
100 static inline void schedule_pcifront_aer_op(
struct pcifront_device *pdev)
104 dev_dbg(&pdev->
xdev->dev,
"schedule aer frontend job\n");
113 unsigned long irq_flags;
126 notify_remote_via_evtchn(port);
140 (
unsigned long *)&pdev->
sh_info->flags)) {
144 ns = timeval_to_ns(&tv);
145 if (ns > ns_timeout) {
147 "pciback not responding!!!\n");
149 (
unsigned long *)&pdev->
sh_info->flags);
161 (
unsigned long *)&pdev->
sh_info->flags)) {
163 "schedule aer pcifront service\n");
164 schedule_pcifront_aer_op(pdev);
193 "read dev=%04x:%02x:%02x.%d - offset %x size %d\n",
197 err = do_pci_op(pdev, &op);
205 }
else if (err == -
ENODEV) {
211 return errno_to_pcibios_err(err);
215 static int pcifront_bus_write(
struct pci_bus *bus,
unsigned int devfn,
216 int where,
int size,
u32 val)
232 "write dev=%04x:%02x:%02x.%d - "
233 "offset %x size %d val %x\n",
237 return errno_to_pcibios_err(do_pci_op(pdev, &op));
240 static struct pci_ops pcifront_bus_ops = {
241 .read = pcifront_bus_read,
242 .write = pcifront_bus_write,
245 #ifdef CONFIG_PCI_MSI
246 static int pci_frontend_enable_msix(
struct pci_dev *
dev,
254 .bus = dev->
bus->number,
263 dev_err(&dev->
dev,
"too much vector for pci frontend: %x."
264 " Increase SH_INFO_MAX_VEC.\n", nvec);
276 err = do_pci_op(pdev, &op);
281 for (i = 0; i < nvec; i++) {
283 dev_warn(&dev->
dev,
"MSI-X entry %d is invalid: %d!\n",
297 dev_err(&dev->
dev,
"enable msix get err %x\n", err);
302 static void pci_frontend_disable_msix(
struct pci_dev *dev)
308 .bus = dev->
bus->number,
314 err = do_pci_op(pdev, &op);
318 dev_err(&dev->
dev,
"pci_disable_msix get err %x\n", err);
321 static int pci_frontend_enable_msi(
struct pci_dev *dev,
int vector[])
327 .bus = dev->
bus->number,
333 err = do_pci_op(pdev, &op);
335 vector[0] = op.
value;
343 dev_err(&dev->
dev,
"pci frontend enable msi failed for dev "
350 static void pci_frontend_disable_msi(
struct pci_dev *dev)
356 .bus = dev->
bus->number,
362 err = do_pci_op(pdev, &op);
373 static struct xen_pci_frontend_ops pci_frontend_ops = {
374 .enable_msi = pci_frontend_enable_msi,
375 .disable_msi = pci_frontend_disable_msi,
376 .enable_msix = pci_frontend_enable_msix,
377 .disable_msix = pci_frontend_disable_msix,
380 static void pci_frontend_registrar(
int enable)
383 xen_pci_frontend = &pci_frontend_ops;
385 xen_pci_frontend =
NULL;
388 static inline void pci_frontend_registrar(
int enable) { };
392 static int pcifront_claim_resource(
struct pci_dev *dev,
void *
data)
405 dev_err(&pdev->
xdev->dev,
"Could not claim resource %s/%d! "
406 "Device offline. Try using e820_host=1 in the guest config.\n",
416 unsigned int domain,
unsigned int bus,
426 for (devfn = 0; devfn < 0x100; devfn++) {
437 "%04x:%02x:%02x.%d found.\n", domain, bus,
445 unsigned int domain,
unsigned int bus)
452 #ifndef CONFIG_PCI_DOMAINS
455 "PCI Root in non-zero PCI Domain! domain=%d\n", domain);
457 "Please compile with CONFIG_PCI_DOMAINS\n");
463 dev_info(&pdev->
xdev->dev,
"Creating PCI Frontend Bus %04x:%02x\n",
468 if (!bus_entry || !sd) {
472 pcifront_init_sd(sd, domain, bus, pdev);
475 &pcifront_bus_ops, sd);
478 "Error creating PCI Frontend Bus!\n");
489 err = pcifront_scan_bus(pdev, domain, bus, b);
507 unsigned int domain,
unsigned int bus)
512 #ifndef CONFIG_PCI_DOMAINS
515 "PCI Root in non-zero PCI Domain! domain=%d\n", domain);
517 "Please compile with CONFIG_PCI_DOMAINS\n");
522 dev_info(&pdev->
xdev->dev,
"Rescanning PCI Frontend Bus %04x:%02x\n",
528 return pcifront_scan_root(pdev, domain, bus);
530 err = pcifront_scan_bus(pdev, domain, bus, b);
541 static void free_root_bus_devs(
struct pci_bus *bus)
545 while (!list_empty(&bus->
devices)) {
557 dev_dbg(&pdev->
xdev->dev,
"cleaning up root buses\n");
562 free_root_bus_devs(bus_entry->
bus);
579 int bus = pdev->
sh_info->aer_op.bus;
580 int devfn = pdev->
sh_info->aer_op.devfn;
585 "pcifront AER process: cmd %x (bus:%x, devfn%x)",
590 if (!pcidev || !pcidev->
driver) {
591 dev_err(&pdev->
xdev->dev,
"device or AER driver is NULL\n");
601 "trying to call AER service\n");
607 error_detected(pcidev, state);
622 "bad request in aer recovery "
636 static void pcifront_do_aer(
struct work_struct *data)
640 int cmd = pdev->
sh_info->aer_op.cmd;
647 "pcifront service aer bus %x devfn %x\n",
650 pdev->
sh_info->aer_op.err = pcifront_common_process(cmd, pdev, state);
655 notify_remote_via_evtchn(pdev->
evtchn);
662 schedule_pcifront_aer_op(pdev);
666 static irqreturn_t pcifront_handler_aer(
int irq,
void *dev)
669 schedule_pcifront_aer_op(pdev);
676 spin_lock(&pcifront_dev_lock);
679 dev_info(&pdev->
xdev->dev,
"Installing PCI frontend\n");
682 dev_err(&pdev->
xdev->dev,
"PCI frontend already installed!\n");
685 spin_unlock(&pcifront_dev_lock);
690 dev_err(&pdev->
xdev->dev,
"Could not setup SWIOTLB!\n");
697 spin_lock(&pcifront_dev_lock);
699 if (pdev == pcifront_dev) {
701 "Disconnecting PCI Frontend Buses\n");
705 spin_unlock(&pcifront_dev_lock);
740 dev_dbg(&xdev->
dev,
"Allocated pdev @ 0x%p pdev->sh_info @ 0x%p\n",
748 dev_dbg(&pdev->
xdev->dev,
"freeing pdev @ 0x%p\n", pdev);
750 pcifront_free_roots(pdev);
787 0,
"pcifront", pdev);
798 "Error writing configuration for backend "
799 "(start transaction)");
804 "pci-op-ref",
"%u", pdev->
gnt_ref);
807 "event-channel",
"%u", pdev->
evtchn);
815 "Error writing configuration for backend");
823 "Error completing transaction "
831 dev_dbg(&pdev->
xdev->dev,
"publishing successful!\n");
840 int i, num_roots,
len;
842 unsigned int domain,
bus;
850 err = pcifront_connect_and_init_dma(pdev);
853 "Error setting up PCI Frontend");
858 "root_num",
"%d", &num_roots);
861 "No PCI Roots found, trying 0000:00");
862 err = pcifront_scan_root(pdev, 0, 0);
864 }
else if (err != 1) {
868 "Error reading number of PCI roots");
872 for (i = 0; i < num_roots; i++) {
873 len =
snprintf(str,
sizeof(str),
"root-%d", i);
874 if (
unlikely(len >= (
sizeof(str) - 1))) {
880 "%x:%x", &domain, &bus);
885 "Error reading PCI root %d", i);
889 err = pcifront_scan_root(pdev, domain, bus);
892 "Error scanning PCI root %04x:%02x",
916 pcifront_free_roots(pdev);
917 pcifront_disconnect(pdev);
930 int i, num_roots, len;
931 unsigned int domain,
bus;
939 "root_num",
"%d", &num_roots);
942 "No PCI Roots found, trying 0000:00");
943 err = pcifront_rescan_root(pdev, 0, 0);
945 }
else if (err != 1) {
949 "Error reading number of PCI roots");
953 for (i = 0; i < num_roots; i++) {
954 len =
snprintf(str,
sizeof(str),
"root-%d", i);
955 if (
unlikely(len >= (
sizeof(str) - 1))) {
961 "%x:%x", &domain, &bus);
966 "Error reading PCI root %d", i);
970 err = pcifront_rescan_root(pdev, domain, bus);
973 "Error scanning PCI root %04x:%02x",
1003 "Error reading number of PCI devices");
1008 for (i = 0; i < num_devs; i++) {
1010 l =
snprintf(str,
sizeof(str),
"state-%d", i);
1011 if (
unlikely(l >= (
sizeof(str) - 1))) {
1024 l =
snprintf(str,
sizeof(str),
"vdev-%d", i);
1025 if (
unlikely(l >= (
sizeof(str) - 1))) {
1030 "%x:%x:%x.%x", &domain, &bus, &slot, &func);
1035 "Error reading PCI device %d", i);
1043 "Cannot get PCI device %04x:%02x:%02x.%d\n",
1044 domain, bus, slot, func);
1051 "PCI device %04x:%02x:%02x.%d removed.\n",
1052 domain, bus, slot, func);
1075 pcifront_try_connect(pdev);
1080 pcifront_try_disconnect(pdev);
1084 pcifront_detach_devices(pdev);
1088 pcifront_attach_devices(pdev);
1093 static int pcifront_xenbus_probe(
struct xenbus_device *xdev,
1102 "Error allocating pcifront_device struct");
1106 err = pcifront_publish_info(pdev);
1114 static int pcifront_xenbus_remove(
struct xenbus_device *xdev)
1129 .probe = pcifront_xenbus_probe,
1130 .
remove = pcifront_xenbus_remove,
1131 .otherend_changed = pcifront_backend_changed,
1134 static int __init pcifront_init(
void)
1139 pci_frontend_registrar(1 );
1144 static void __exit pcifront_cleanup(
void)
1147 pci_frontend_registrar(0 );