1 /* 2 * Xen PCI Frontend. 3 * 4 * Author: Ryan Wilson <hap9@epoch.ncsc.mil> 5 */ 6 #include <linux/module.h> 7 #include <linux/init.h> 8 #include <linux/mm.h> 9 #include <xen/xenbus.h> 10 #include <xen/events.h> 11 #include <xen/grant_table.h> 12 #include <xen/page.h> 13 #include <linux/spinlock.h> 14 #include <linux/pci.h> 15 #include <linux/msi.h> 16 #include <xen/interface/io/pciif.h> 17 #include <asm/xen/pci.h> 18 #include <linux/interrupt.h> 19 #include <linux/atomic.h> 20 #include <linux/workqueue.h> 21 #include <linux/bitops.h> 22 #include <linux/time.h> 23 24 #define INVALID_GRANT_REF (0) 25 #define INVALID_EVTCHN (-1) 26 27 struct pci_bus_entry { 28 struct list_head list; 29 struct pci_bus *bus; 30 }; 31 32 #define _PDEVB_op_active (0) 33 #define PDEVB_op_active (1 << (_PDEVB_op_active)) 34 35 struct pcifront_device { 36 struct xenbus_device *xdev; 37 struct list_head root_buses; 38 39 int evtchn; 40 int gnt_ref; 41 42 int irq; 43 44 /* Lock this when doing any operations in sh_info */ 45 spinlock_t sh_info_lock; 46 struct xen_pci_sharedinfo *sh_info; 47 struct work_struct op_work; 48 unsigned long flags; 49 50 }; 51 52 struct pcifront_sd { 53 int domain; 54 struct pcifront_device *pdev; 55 }; 56 57 static inline struct pcifront_device * 58 pcifront_get_pdev(struct pcifront_sd *sd) 59 { 60 return sd->pdev; 61 } 62 63 static inline void pcifront_init_sd(struct pcifront_sd *sd, 64 unsigned int domain, unsigned int bus, 65 struct pcifront_device *pdev) 66 { 67 sd->domain = domain; 68 sd->pdev = pdev; 69 } 70 71 static DEFINE_SPINLOCK(pcifront_dev_lock); 72 static struct pcifront_device *pcifront_dev; 73 74 static int verbose_request; 75 module_param(verbose_request, int, 0644); 76 77 static int errno_to_pcibios_err(int errno) 78 { 79 switch (errno) { 80 case XEN_PCI_ERR_success: 81 return PCIBIOS_SUCCESSFUL; 82 83 case XEN_PCI_ERR_dev_not_found: 84 return PCIBIOS_DEVICE_NOT_FOUND; 85 86 case XEN_PCI_ERR_invalid_offset: 87 case XEN_PCI_ERR_op_failed: 88 return PCIBIOS_BAD_REGISTER_NUMBER; 89 90 case XEN_PCI_ERR_not_implemented: 91 return PCIBIOS_FUNC_NOT_SUPPORTED; 92 93 case XEN_PCI_ERR_access_denied: 94 return PCIBIOS_SET_FAILED; 95 } 96 return errno; 97 } 98 99 static inline void schedule_pcifront_aer_op(struct pcifront_device *pdev) 100 { 101 if (test_bit(_XEN_PCIB_active, (unsigned long *)&pdev->sh_info->flags) 102 && !test_and_set_bit(_PDEVB_op_active, &pdev->flags)) { 103 dev_dbg(&pdev->xdev->dev, "schedule aer frontend job\n"); 104 schedule_work(&pdev->op_work); 105 } 106 } 107 108 static int do_pci_op(struct pcifront_device *pdev, struct xen_pci_op *op) 109 { 110 int err = 0; 111 struct xen_pci_op *active_op = &pdev->sh_info->op; 112 unsigned long irq_flags; 113 evtchn_port_t port = pdev->evtchn; 114 unsigned irq = pdev->irq; 115 s64 ns, ns_timeout; 116 struct timeval tv; 117 118 spin_lock_irqsave(&pdev->sh_info_lock, irq_flags); 119 120 memcpy(active_op, op, sizeof(struct xen_pci_op)); 121 122 /* Go */ 123 wmb(); 124 set_bit(_XEN_PCIF_active, (unsigned long *)&pdev->sh_info->flags); 125 notify_remote_via_evtchn(port); 126 127 /* 128 * We set a poll timeout of 3 seconds but give up on return after 129 * 2 seconds. It is better to time out too late rather than too early 130 * (in the latter case we end up continually re-executing poll() with a 131 * timeout in the past). 1s difference gives plenty of slack for error. 132 */ 133 do_gettimeofday(&tv); 134 ns_timeout = timeval_to_ns(&tv) + 2 * (s64)NSEC_PER_SEC; 135 136 xen_clear_irq_pending(irq); 137 138 while (test_bit(_XEN_PCIF_active, 139 (unsigned long *)&pdev->sh_info->flags)) { 140 xen_poll_irq_timeout(irq, jiffies + 3*HZ); 141 xen_clear_irq_pending(irq); 142 do_gettimeofday(&tv); 143 ns = timeval_to_ns(&tv); 144 if (ns > ns_timeout) { 145 dev_err(&pdev->xdev->dev, 146 "pciback not responding!!!\n"); 147 clear_bit(_XEN_PCIF_active, 148 (unsigned long *)&pdev->sh_info->flags); 149 err = XEN_PCI_ERR_dev_not_found; 150 goto out; 151 } 152 } 153 154 /* 155 * We might lose backend service request since we 156 * reuse same evtchn with pci_conf backend response. So re-schedule 157 * aer pcifront service. 158 */ 159 if (test_bit(_XEN_PCIB_active, 160 (unsigned long *)&pdev->sh_info->flags)) { 161 dev_err(&pdev->xdev->dev, 162 "schedule aer pcifront service\n"); 163 schedule_pcifront_aer_op(pdev); 164 } 165 166 memcpy(op, active_op, sizeof(struct xen_pci_op)); 167 168 err = op->err; 169 out: 170 spin_unlock_irqrestore(&pdev->sh_info_lock, irq_flags); 171 return err; 172 } 173 174 /* Access to this function is spinlocked in drivers/pci/access.c */ 175 static int pcifront_bus_read(struct pci_bus *bus, unsigned int devfn, 176 int where, int size, u32 *val) 177 { 178 int err = 0; 179 struct xen_pci_op op = { 180 .cmd = XEN_PCI_OP_conf_read, 181 .domain = pci_domain_nr(bus), 182 .bus = bus->number, 183 .devfn = devfn, 184 .offset = where, 185 .size = size, 186 }; 187 struct pcifront_sd *sd = bus->sysdata; 188 struct pcifront_device *pdev = pcifront_get_pdev(sd); 189 190 if (verbose_request) 191 dev_info(&pdev->xdev->dev, 192 "read dev=%04x:%02x:%02x.%d - offset %x size %d\n", 193 pci_domain_nr(bus), bus->number, PCI_SLOT(devfn), 194 PCI_FUNC(devfn), where, size); 195 196 err = do_pci_op(pdev, &op); 197 198 if (likely(!err)) { 199 if (verbose_request) 200 dev_info(&pdev->xdev->dev, "read got back value %x\n", 201 op.value); 202 203 *val = op.value; 204 } else if (err == -ENODEV) { 205 /* No device here, pretend that it just returned 0 */ 206 err = 0; 207 *val = 0; 208 } 209 210 return errno_to_pcibios_err(err); 211 } 212 213 /* Access to this function is spinlocked in drivers/pci/access.c */ 214 static int pcifront_bus_write(struct pci_bus *bus, unsigned int devfn, 215 int where, int size, u32 val) 216 { 217 struct xen_pci_op op = { 218 .cmd = XEN_PCI_OP_conf_write, 219 .domain = pci_domain_nr(bus), 220 .bus = bus->number, 221 .devfn = devfn, 222 .offset = where, 223 .size = size, 224 .value = val, 225 }; 226 struct pcifront_sd *sd = bus->sysdata; 227 struct pcifront_device *pdev = pcifront_get_pdev(sd); 228 229 if (verbose_request) 230 dev_info(&pdev->xdev->dev, 231 "write dev=%04x:%02x:%02x.%d - " 232 "offset %x size %d val %x\n", 233 pci_domain_nr(bus), bus->number, 234 PCI_SLOT(devfn), PCI_FUNC(devfn), where, size, val); 235 236 return errno_to_pcibios_err(do_pci_op(pdev, &op)); 237 } 238 239 struct pci_ops pcifront_bus_ops = { 240 .read = pcifront_bus_read, 241 .write = pcifront_bus_write, 242 }; 243 244 #ifdef CONFIG_PCI_MSI 245 static int pci_frontend_enable_msix(struct pci_dev *dev, 246 int vector[], int nvec) 247 { 248 int err; 249 int i; 250 struct xen_pci_op op = { 251 .cmd = XEN_PCI_OP_enable_msix, 252 .domain = pci_domain_nr(dev->bus), 253 .bus = dev->bus->number, 254 .devfn = dev->devfn, 255 .value = nvec, 256 }; 257 struct pcifront_sd *sd = dev->bus->sysdata; 258 struct pcifront_device *pdev = pcifront_get_pdev(sd); 259 struct msi_desc *entry; 260 261 if (nvec > SH_INFO_MAX_VEC) { 262 dev_err(&dev->dev, "too much vector for pci frontend: %x." 263 " Increase SH_INFO_MAX_VEC.\n", nvec); 264 return -EINVAL; 265 } 266 267 i = 0; 268 list_for_each_entry(entry, &dev->msi_list, list) { 269 op.msix_entries[i].entry = entry->msi_attrib.entry_nr; 270 /* Vector is useless at this point. */ 271 op.msix_entries[i].vector = -1; 272 i++; 273 } 274 275 err = do_pci_op(pdev, &op); 276 277 if (likely(!err)) { 278 if (likely(!op.value)) { 279 /* we get the result */ 280 for (i = 0; i < nvec; i++) { 281 if (op.msix_entries[i].vector <= 0) { 282 dev_warn(&dev->dev, "MSI-X entry %d is invalid: %d!\n", 283 i, op.msix_entries[i].vector); 284 err = -EINVAL; 285 vector[i] = -1; 286 continue; 287 } 288 vector[i] = op.msix_entries[i].vector; 289 } 290 } else { 291 printk(KERN_DEBUG "enable msix get value %x\n", 292 op.value); 293 } 294 } else { 295 dev_err(&dev->dev, "enable msix get err %x\n", err); 296 } 297 return err; 298 } 299 300 static void pci_frontend_disable_msix(struct pci_dev *dev) 301 { 302 int err; 303 struct xen_pci_op op = { 304 .cmd = XEN_PCI_OP_disable_msix, 305 .domain = pci_domain_nr(dev->bus), 306 .bus = dev->bus->number, 307 .devfn = dev->devfn, 308 }; 309 struct pcifront_sd *sd = dev->bus->sysdata; 310 struct pcifront_device *pdev = pcifront_get_pdev(sd); 311 312 err = do_pci_op(pdev, &op); 313 314 /* What should do for error ? */ 315 if (err) 316 dev_err(&dev->dev, "pci_disable_msix get err %x\n", err); 317 } 318 319 static int pci_frontend_enable_msi(struct pci_dev *dev, int vector[]) 320 { 321 int err; 322 struct xen_pci_op op = { 323 .cmd = XEN_PCI_OP_enable_msi, 324 .domain = pci_domain_nr(dev->bus), 325 .bus = dev->bus->number, 326 .devfn = dev->devfn, 327 }; 328 struct pcifront_sd *sd = dev->bus->sysdata; 329 struct pcifront_device *pdev = pcifront_get_pdev(sd); 330 331 err = do_pci_op(pdev, &op); 332 if (likely(!err)) { 333 vector[0] = op.value; 334 if (op.value <= 0) { 335 dev_warn(&dev->dev, "MSI entry is invalid: %d!\n", 336 op.value); 337 err = -EINVAL; 338 vector[0] = -1; 339 } 340 } else { 341 dev_err(&dev->dev, "pci frontend enable msi failed for dev " 342 "%x:%x\n", op.bus, op.devfn); 343 err = -EINVAL; 344 } 345 return err; 346 } 347 348 static void pci_frontend_disable_msi(struct pci_dev *dev) 349 { 350 int err; 351 struct xen_pci_op op = { 352 .cmd = XEN_PCI_OP_disable_msi, 353 .domain = pci_domain_nr(dev->bus), 354 .bus = dev->bus->number, 355 .devfn = dev->devfn, 356 }; 357 struct pcifront_sd *sd = dev->bus->sysdata; 358 struct pcifront_device *pdev = pcifront_get_pdev(sd); 359 360 err = do_pci_op(pdev, &op); 361 if (err == XEN_PCI_ERR_dev_not_found) { 362 /* XXX No response from backend, what shall we do? */ 363 printk(KERN_DEBUG "get no response from backend for disable MSI\n"); 364 return; 365 } 366 if (err) 367 /* how can pciback notify us fail? */ 368 printk(KERN_DEBUG "get fake response frombackend\n"); 369 } 370 371 static struct xen_pci_frontend_ops pci_frontend_ops = { 372 .enable_msi = pci_frontend_enable_msi, 373 .disable_msi = pci_frontend_disable_msi, 374 .enable_msix = pci_frontend_enable_msix, 375 .disable_msix = pci_frontend_disable_msix, 376 }; 377 378 static void pci_frontend_registrar(int enable) 379 { 380 if (enable) 381 xen_pci_frontend = &pci_frontend_ops; 382 else 383 xen_pci_frontend = NULL; 384 }; 385 #else 386 static inline void pci_frontend_registrar(int enable) { }; 387 #endif /* CONFIG_PCI_MSI */ 388 389 /* Claim resources for the PCI frontend as-is, backend won't allow changes */ 390 static int pcifront_claim_resource(struct pci_dev *dev, void *data) 391 { 392 struct pcifront_device *pdev = data; 393 int i; 394 struct resource *r; 395 396 for (i = 0; i < PCI_NUM_RESOURCES; i++) { 397 r = &dev->resource[i]; 398 399 if (!r->parent && r->start && r->flags) { 400 dev_info(&pdev->xdev->dev, "claiming resource %s/%d\n", 401 pci_name(dev), i); 402 if (pci_claim_resource(dev, i)) { 403 dev_err(&pdev->xdev->dev, "Could not claim resource %s/%d! " 404 "Device offline. Try using e820_host=1 in the guest config.\n", 405 pci_name(dev), i); 406 } 407 } 408 } 409 410 return 0; 411 } 412 413 static int __devinit pcifront_scan_bus(struct pcifront_device *pdev, 414 unsigned int domain, unsigned int bus, 415 struct pci_bus *b) 416 { 417 struct pci_dev *d; 418 unsigned int devfn; 419 420 /* Scan the bus for functions and add. 421 * We omit handling of PCI bridge attachment because pciback prevents 422 * bridges from being exported. 423 */ 424 for (devfn = 0; devfn < 0x100; devfn++) { 425 d = pci_get_slot(b, devfn); 426 if (d) { 427 /* Device is already known. */ 428 pci_dev_put(d); 429 continue; 430 } 431 432 d = pci_scan_single_device(b, devfn); 433 if (d) 434 dev_info(&pdev->xdev->dev, "New device on " 435 "%04x:%02x:%02x.%d found.\n", domain, bus, 436 PCI_SLOT(devfn), PCI_FUNC(devfn)); 437 } 438 439 return 0; 440 } 441 442 static int __devinit pcifront_scan_root(struct pcifront_device *pdev, 443 unsigned int domain, unsigned int bus) 444 { 445 struct pci_bus *b; 446 struct pcifront_sd *sd = NULL; 447 struct pci_bus_entry *bus_entry = NULL; 448 int err = 0; 449 450 #ifndef CONFIG_PCI_DOMAINS 451 if (domain != 0) { 452 dev_err(&pdev->xdev->dev, 453 "PCI Root in non-zero PCI Domain! domain=%d\n", domain); 454 dev_err(&pdev->xdev->dev, 455 "Please compile with CONFIG_PCI_DOMAINS\n"); 456 err = -EINVAL; 457 goto err_out; 458 } 459 #endif 460 461 dev_info(&pdev->xdev->dev, "Creating PCI Frontend Bus %04x:%02x\n", 462 domain, bus); 463 464 bus_entry = kmalloc(sizeof(*bus_entry), GFP_KERNEL); 465 sd = kmalloc(sizeof(*sd), GFP_KERNEL); 466 if (!bus_entry || !sd) { 467 err = -ENOMEM; 468 goto err_out; 469 } 470 pcifront_init_sd(sd, domain, bus, pdev); 471 472 b = pci_scan_bus_parented(&pdev->xdev->dev, bus, 473 &pcifront_bus_ops, sd); 474 if (!b) { 475 dev_err(&pdev->xdev->dev, 476 "Error creating PCI Frontend Bus!\n"); 477 err = -ENOMEM; 478 goto err_out; 479 } 480 481 bus_entry->bus = b; 482 483 list_add(&bus_entry->list, &pdev->root_buses); 484 485 /* pci_scan_bus_parented skips devices which do not have a have 486 * devfn==0. The pcifront_scan_bus enumerates all devfn. */ 487 err = pcifront_scan_bus(pdev, domain, bus, b); 488 489 /* Claim resources before going "live" with our devices */ 490 pci_walk_bus(b, pcifront_claim_resource, pdev); 491 492 /* Create SysFS and notify udev of the devices. Aka: "going live" */ 493 pci_bus_add_devices(b); 494 495 return err; 496 497 err_out: 498 kfree(bus_entry); 499 kfree(sd); 500 501 return err; 502 } 503 504 static int __devinit pcifront_rescan_root(struct pcifront_device *pdev, 505 unsigned int domain, unsigned int bus) 506 { 507 int err; 508 struct pci_bus *b; 509 510 #ifndef CONFIG_PCI_DOMAINS 511 if (domain != 0) { 512 dev_err(&pdev->xdev->dev, 513 "PCI Root in non-zero PCI Domain! domain=%d\n", domain); 514 dev_err(&pdev->xdev->dev, 515 "Please compile with CONFIG_PCI_DOMAINS\n"); 516 return -EINVAL; 517 } 518 #endif 519 520 dev_info(&pdev->xdev->dev, "Rescanning PCI Frontend Bus %04x:%02x\n", 521 domain, bus); 522 523 b = pci_find_bus(domain, bus); 524 if (!b) 525 /* If the bus is unknown, create it. */ 526 return pcifront_scan_root(pdev, domain, bus); 527 528 err = pcifront_scan_bus(pdev, domain, bus, b); 529 530 /* Claim resources before going "live" with our devices */ 531 pci_walk_bus(b, pcifront_claim_resource, pdev); 532 533 /* Create SysFS and notify udev of the devices. Aka: "going live" */ 534 pci_bus_add_devices(b); 535 536 return err; 537 } 538 539 static void free_root_bus_devs(struct pci_bus *bus) 540 { 541 struct pci_dev *dev; 542 543 while (!list_empty(&bus->devices)) { 544 dev = container_of(bus->devices.next, struct pci_dev, 545 bus_list); 546 dev_dbg(&dev->dev, "removing device\n"); 547 pci_remove_bus_device(dev); 548 } 549 } 550 551 static void pcifront_free_roots(struct pcifront_device *pdev) 552 { 553 struct pci_bus_entry *bus_entry, *t; 554 555 dev_dbg(&pdev->xdev->dev, "cleaning up root buses\n"); 556 557 list_for_each_entry_safe(bus_entry, t, &pdev->root_buses, list) { 558 list_del(&bus_entry->list); 559 560 free_root_bus_devs(bus_entry->bus); 561 562 kfree(bus_entry->bus->sysdata); 563 564 device_unregister(bus_entry->bus->bridge); 565 pci_remove_bus(bus_entry->bus); 566 567 kfree(bus_entry); 568 } 569 } 570 571 static pci_ers_result_t pcifront_common_process(int cmd, 572 struct pcifront_device *pdev, 573 pci_channel_state_t state) 574 { 575 pci_ers_result_t result; 576 struct pci_driver *pdrv; 577 int bus = pdev->sh_info->aer_op.bus; 578 int devfn = pdev->sh_info->aer_op.devfn; 579 struct pci_dev *pcidev; 580 int flag = 0; 581 582 dev_dbg(&pdev->xdev->dev, 583 "pcifront AER process: cmd %x (bus:%x, devfn%x)", 584 cmd, bus, devfn); 585 result = PCI_ERS_RESULT_NONE; 586 587 pcidev = pci_get_bus_and_slot(bus, devfn); 588 if (!pcidev || !pcidev->driver) { 589 dev_err(&pdev->xdev->dev, "device or AER driver is NULL\n"); 590 if (pcidev) 591 pci_dev_put(pcidev); 592 return result; 593 } 594 pdrv = pcidev->driver; 595 596 if (get_driver(&pdrv->driver)) { 597 if (pdrv->err_handler && pdrv->err_handler->error_detected) { 598 dev_dbg(&pcidev->dev, 599 "trying to call AER service\n"); 600 if (pcidev) { 601 flag = 1; 602 switch (cmd) { 603 case XEN_PCI_OP_aer_detected: 604 result = pdrv->err_handler-> 605 error_detected(pcidev, state); 606 break; 607 case XEN_PCI_OP_aer_mmio: 608 result = pdrv->err_handler-> 609 mmio_enabled(pcidev); 610 break; 611 case XEN_PCI_OP_aer_slotreset: 612 result = pdrv->err_handler-> 613 slot_reset(pcidev); 614 break; 615 case XEN_PCI_OP_aer_resume: 616 pdrv->err_handler->resume(pcidev); 617 break; 618 default: 619 dev_err(&pdev->xdev->dev, 620 "bad request in aer recovery " 621 "operation!\n"); 622 623 } 624 } 625 } 626 put_driver(&pdrv->driver); 627 } 628 if (!flag) 629 result = PCI_ERS_RESULT_NONE; 630 631 return result; 632 } 633 634 635 static void pcifront_do_aer(struct work_struct *data) 636 { 637 struct pcifront_device *pdev = 638 container_of(data, struct pcifront_device, op_work); 639 int cmd = pdev->sh_info->aer_op.cmd; 640 pci_channel_state_t state = 641 (pci_channel_state_t)pdev->sh_info->aer_op.err; 642 643 /*If a pci_conf op is in progress, 644 we have to wait until it is done before service aer op*/ 645 dev_dbg(&pdev->xdev->dev, 646 "pcifront service aer bus %x devfn %x\n", 647 pdev->sh_info->aer_op.bus, pdev->sh_info->aer_op.devfn); 648 649 pdev->sh_info->aer_op.err = pcifront_common_process(cmd, pdev, state); 650 651 /* Post the operation to the guest. */ 652 wmb(); 653 clear_bit(_XEN_PCIB_active, (unsigned long *)&pdev->sh_info->flags); 654 notify_remote_via_evtchn(pdev->evtchn); 655 656 /*in case of we lost an aer request in four lines time_window*/ 657 smp_mb__before_clear_bit(); 658 clear_bit(_PDEVB_op_active, &pdev->flags); 659 smp_mb__after_clear_bit(); 660 661 schedule_pcifront_aer_op(pdev); 662 663 } 664 665 static irqreturn_t pcifront_handler_aer(int irq, void *dev) 666 { 667 struct pcifront_device *pdev = dev; 668 schedule_pcifront_aer_op(pdev); 669 return IRQ_HANDLED; 670 } 671 static int pcifront_connect(struct pcifront_device *pdev) 672 { 673 int err = 0; 674 675 spin_lock(&pcifront_dev_lock); 676 677 if (!pcifront_dev) { 678 dev_info(&pdev->xdev->dev, "Installing PCI frontend\n"); 679 pcifront_dev = pdev; 680 } else { 681 dev_err(&pdev->xdev->dev, "PCI frontend already installed!\n"); 682 err = -EEXIST; 683 } 684 685 spin_unlock(&pcifront_dev_lock); 686 687 return err; 688 } 689 690 static void pcifront_disconnect(struct pcifront_device *pdev) 691 { 692 spin_lock(&pcifront_dev_lock); 693 694 if (pdev == pcifront_dev) { 695 dev_info(&pdev->xdev->dev, 696 "Disconnecting PCI Frontend Buses\n"); 697 pcifront_dev = NULL; 698 } 699 700 spin_unlock(&pcifront_dev_lock); 701 } 702 static struct pcifront_device *alloc_pdev(struct xenbus_device *xdev) 703 { 704 struct pcifront_device *pdev; 705 706 pdev = kzalloc(sizeof(struct pcifront_device), GFP_KERNEL); 707 if (pdev == NULL) 708 goto out; 709 710 pdev->sh_info = 711 (struct xen_pci_sharedinfo *)__get_free_page(GFP_KERNEL); 712 if (pdev->sh_info == NULL) { 713 kfree(pdev); 714 pdev = NULL; 715 goto out; 716 } 717 pdev->sh_info->flags = 0; 718 719 /*Flag for registering PV AER handler*/ 720 set_bit(_XEN_PCIB_AERHANDLER, (void *)&pdev->sh_info->flags); 721 722 dev_set_drvdata(&xdev->dev, pdev); 723 pdev->xdev = xdev; 724 725 INIT_LIST_HEAD(&pdev->root_buses); 726 727 spin_lock_init(&pdev->sh_info_lock); 728 729 pdev->evtchn = INVALID_EVTCHN; 730 pdev->gnt_ref = INVALID_GRANT_REF; 731 pdev->irq = -1; 732 733 INIT_WORK(&pdev->op_work, pcifront_do_aer); 734 735 dev_dbg(&xdev->dev, "Allocated pdev @ 0x%p pdev->sh_info @ 0x%p\n", 736 pdev, pdev->sh_info); 737 out: 738 return pdev; 739 } 740 741 static void free_pdev(struct pcifront_device *pdev) 742 { 743 dev_dbg(&pdev->xdev->dev, "freeing pdev @ 0x%p\n", pdev); 744 745 pcifront_free_roots(pdev); 746 747 cancel_work_sync(&pdev->op_work); 748 749 if (pdev->irq >= 0) 750 unbind_from_irqhandler(pdev->irq, pdev); 751 752 if (pdev->evtchn != INVALID_EVTCHN) 753 xenbus_free_evtchn(pdev->xdev, pdev->evtchn); 754 755 if (pdev->gnt_ref != INVALID_GRANT_REF) 756 gnttab_end_foreign_access(pdev->gnt_ref, 0 /* r/w page */, 757 (unsigned long)pdev->sh_info); 758 else 759 free_page((unsigned long)pdev->sh_info); 760 761 dev_set_drvdata(&pdev->xdev->dev, NULL); 762 763 kfree(pdev); 764 } 765 766 static int pcifront_publish_info(struct pcifront_device *pdev) 767 { 768 int err = 0; 769 struct xenbus_transaction trans; 770 771 err = xenbus_grant_ring(pdev->xdev, virt_to_mfn(pdev->sh_info)); 772 if (err < 0) 773 goto out; 774 775 pdev->gnt_ref = err; 776 777 err = xenbus_alloc_evtchn(pdev->xdev, &pdev->evtchn); 778 if (err) 779 goto out; 780 781 err = bind_evtchn_to_irqhandler(pdev->evtchn, pcifront_handler_aer, 782 0, "pcifront", pdev); 783 784 if (err < 0) 785 return err; 786 787 pdev->irq = err; 788 789 do_publish: 790 err = xenbus_transaction_start(&trans); 791 if (err) { 792 xenbus_dev_fatal(pdev->xdev, err, 793 "Error writing configuration for backend " 794 "(start transaction)"); 795 goto out; 796 } 797 798 err = xenbus_printf(trans, pdev->xdev->nodename, 799 "pci-op-ref", "%u", pdev->gnt_ref); 800 if (!err) 801 err = xenbus_printf(trans, pdev->xdev->nodename, 802 "event-channel", "%u", pdev->evtchn); 803 if (!err) 804 err = xenbus_printf(trans, pdev->xdev->nodename, 805 "magic", XEN_PCI_MAGIC); 806 807 if (err) { 808 xenbus_transaction_end(trans, 1); 809 xenbus_dev_fatal(pdev->xdev, err, 810 "Error writing configuration for backend"); 811 goto out; 812 } else { 813 err = xenbus_transaction_end(trans, 0); 814 if (err == -EAGAIN) 815 goto do_publish; 816 else if (err) { 817 xenbus_dev_fatal(pdev->xdev, err, 818 "Error completing transaction " 819 "for backend"); 820 goto out; 821 } 822 } 823 824 xenbus_switch_state(pdev->xdev, XenbusStateInitialised); 825 826 dev_dbg(&pdev->xdev->dev, "publishing successful!\n"); 827 828 out: 829 return err; 830 } 831 832 static int __devinit pcifront_try_connect(struct pcifront_device *pdev) 833 { 834 int err = -EFAULT; 835 int i, num_roots, len; 836 char str[64]; 837 unsigned int domain, bus; 838 839 840 /* Only connect once */ 841 if (xenbus_read_driver_state(pdev->xdev->nodename) != 842 XenbusStateInitialised) 843 goto out; 844 845 err = pcifront_connect(pdev); 846 if (err) { 847 xenbus_dev_fatal(pdev->xdev, err, 848 "Error connecting PCI Frontend"); 849 goto out; 850 } 851 852 err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend, 853 "root_num", "%d", &num_roots); 854 if (err == -ENOENT) { 855 xenbus_dev_error(pdev->xdev, err, 856 "No PCI Roots found, trying 0000:00"); 857 err = pcifront_scan_root(pdev, 0, 0); 858 num_roots = 0; 859 } else if (err != 1) { 860 if (err == 0) 861 err = -EINVAL; 862 xenbus_dev_fatal(pdev->xdev, err, 863 "Error reading number of PCI roots"); 864 goto out; 865 } 866 867 for (i = 0; i < num_roots; i++) { 868 len = snprintf(str, sizeof(str), "root-%d", i); 869 if (unlikely(len >= (sizeof(str) - 1))) { 870 err = -ENOMEM; 871 goto out; 872 } 873 874 err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend, str, 875 "%x:%x", &domain, &bus); 876 if (err != 2) { 877 if (err >= 0) 878 err = -EINVAL; 879 xenbus_dev_fatal(pdev->xdev, err, 880 "Error reading PCI root %d", i); 881 goto out; 882 } 883 884 err = pcifront_scan_root(pdev, domain, bus); 885 if (err) { 886 xenbus_dev_fatal(pdev->xdev, err, 887 "Error scanning PCI root %04x:%02x", 888 domain, bus); 889 goto out; 890 } 891 } 892 893 err = xenbus_switch_state(pdev->xdev, XenbusStateConnected); 894 895 out: 896 return err; 897 } 898 899 static int pcifront_try_disconnect(struct pcifront_device *pdev) 900 { 901 int err = 0; 902 enum xenbus_state prev_state; 903 904 905 prev_state = xenbus_read_driver_state(pdev->xdev->nodename); 906 907 if (prev_state >= XenbusStateClosing) 908 goto out; 909 910 if (prev_state == XenbusStateConnected) { 911 pcifront_free_roots(pdev); 912 pcifront_disconnect(pdev); 913 } 914 915 err = xenbus_switch_state(pdev->xdev, XenbusStateClosed); 916 917 out: 918 919 return err; 920 } 921 922 static int __devinit pcifront_attach_devices(struct pcifront_device *pdev) 923 { 924 int err = -EFAULT; 925 int i, num_roots, len; 926 unsigned int domain, bus; 927 char str[64]; 928 929 if (xenbus_read_driver_state(pdev->xdev->nodename) != 930 XenbusStateReconfiguring) 931 goto out; 932 933 err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend, 934 "root_num", "%d", &num_roots); 935 if (err == -ENOENT) { 936 xenbus_dev_error(pdev->xdev, err, 937 "No PCI Roots found, trying 0000:00"); 938 err = pcifront_rescan_root(pdev, 0, 0); 939 num_roots = 0; 940 } else if (err != 1) { 941 if (err == 0) 942 err = -EINVAL; 943 xenbus_dev_fatal(pdev->xdev, err, 944 "Error reading number of PCI roots"); 945 goto out; 946 } 947 948 for (i = 0; i < num_roots; i++) { 949 len = snprintf(str, sizeof(str), "root-%d", i); 950 if (unlikely(len >= (sizeof(str) - 1))) { 951 err = -ENOMEM; 952 goto out; 953 } 954 955 err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend, str, 956 "%x:%x", &domain, &bus); 957 if (err != 2) { 958 if (err >= 0) 959 err = -EINVAL; 960 xenbus_dev_fatal(pdev->xdev, err, 961 "Error reading PCI root %d", i); 962 goto out; 963 } 964 965 err = pcifront_rescan_root(pdev, domain, bus); 966 if (err) { 967 xenbus_dev_fatal(pdev->xdev, err, 968 "Error scanning PCI root %04x:%02x", 969 domain, bus); 970 goto out; 971 } 972 } 973 974 xenbus_switch_state(pdev->xdev, XenbusStateConnected); 975 976 out: 977 return err; 978 } 979 980 static int pcifront_detach_devices(struct pcifront_device *pdev) 981 { 982 int err = 0; 983 int i, num_devs; 984 unsigned int domain, bus, slot, func; 985 struct pci_bus *pci_bus; 986 struct pci_dev *pci_dev; 987 char str[64]; 988 989 if (xenbus_read_driver_state(pdev->xdev->nodename) != 990 XenbusStateConnected) 991 goto out; 992 993 err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend, "num_devs", "%d", 994 &num_devs); 995 if (err != 1) { 996 if (err >= 0) 997 err = -EINVAL; 998 xenbus_dev_fatal(pdev->xdev, err, 999 "Error reading number of PCI devices"); 1000 goto out; 1001 } 1002 1003 /* Find devices being detached and remove them. */ 1004 for (i = 0; i < num_devs; i++) { 1005 int l, state; 1006 l = snprintf(str, sizeof(str), "state-%d", i); 1007 if (unlikely(l >= (sizeof(str) - 1))) { 1008 err = -ENOMEM; 1009 goto out; 1010 } 1011 err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend, str, "%d", 1012 &state); 1013 if (err != 1) 1014 state = XenbusStateUnknown; 1015 1016 if (state != XenbusStateClosing) 1017 continue; 1018 1019 /* Remove device. */ 1020 l = snprintf(str, sizeof(str), "vdev-%d", i); 1021 if (unlikely(l >= (sizeof(str) - 1))) { 1022 err = -ENOMEM; 1023 goto out; 1024 } 1025 err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend, str, 1026 "%x:%x:%x.%x", &domain, &bus, &slot, &func); 1027 if (err != 4) { 1028 if (err >= 0) 1029 err = -EINVAL; 1030 xenbus_dev_fatal(pdev->xdev, err, 1031 "Error reading PCI device %d", i); 1032 goto out; 1033 } 1034 1035 pci_bus = pci_find_bus(domain, bus); 1036 if (!pci_bus) { 1037 dev_dbg(&pdev->xdev->dev, "Cannot get bus %04x:%02x\n", 1038 domain, bus); 1039 continue; 1040 } 1041 pci_dev = pci_get_slot(pci_bus, PCI_DEVFN(slot, func)); 1042 if (!pci_dev) { 1043 dev_dbg(&pdev->xdev->dev, 1044 "Cannot get PCI device %04x:%02x:%02x.%d\n", 1045 domain, bus, slot, func); 1046 continue; 1047 } 1048 pci_remove_bus_device(pci_dev); 1049 pci_dev_put(pci_dev); 1050 1051 dev_dbg(&pdev->xdev->dev, 1052 "PCI device %04x:%02x:%02x.%d removed.\n", 1053 domain, bus, slot, func); 1054 } 1055 1056 err = xenbus_switch_state(pdev->xdev, XenbusStateReconfiguring); 1057 1058 out: 1059 return err; 1060 } 1061 1062 static void __init_refok pcifront_backend_changed(struct xenbus_device *xdev, 1063 enum xenbus_state be_state) 1064 { 1065 struct pcifront_device *pdev = dev_get_drvdata(&xdev->dev); 1066 1067 switch (be_state) { 1068 case XenbusStateUnknown: 1069 case XenbusStateInitialising: 1070 case XenbusStateInitWait: 1071 case XenbusStateInitialised: 1072 case XenbusStateClosed: 1073 break; 1074 1075 case XenbusStateConnected: 1076 pcifront_try_connect(pdev); 1077 break; 1078 1079 case XenbusStateClosing: 1080 dev_warn(&xdev->dev, "backend going away!\n"); 1081 pcifront_try_disconnect(pdev); 1082 break; 1083 1084 case XenbusStateReconfiguring: 1085 pcifront_detach_devices(pdev); 1086 break; 1087 1088 case XenbusStateReconfigured: 1089 pcifront_attach_devices(pdev); 1090 break; 1091 } 1092 } 1093 1094 static int pcifront_xenbus_probe(struct xenbus_device *xdev, 1095 const struct xenbus_device_id *id) 1096 { 1097 int err = 0; 1098 struct pcifront_device *pdev = alloc_pdev(xdev); 1099 1100 if (pdev == NULL) { 1101 err = -ENOMEM; 1102 xenbus_dev_fatal(xdev, err, 1103 "Error allocating pcifront_device struct"); 1104 goto out; 1105 } 1106 1107 err = pcifront_publish_info(pdev); 1108 if (err) 1109 free_pdev(pdev); 1110 1111 out: 1112 return err; 1113 } 1114 1115 static int pcifront_xenbus_remove(struct xenbus_device *xdev) 1116 { 1117 struct pcifront_device *pdev = dev_get_drvdata(&xdev->dev); 1118 if (pdev) 1119 free_pdev(pdev); 1120 1121 return 0; 1122 } 1123 1124 static const struct xenbus_device_id xenpci_ids[] = { 1125 {"pci"}, 1126 {""}, 1127 }; 1128 1129 static DEFINE_XENBUS_DRIVER(xenpci, "pcifront", 1130 .probe = pcifront_xenbus_probe, 1131 .remove = pcifront_xenbus_remove, 1132 .otherend_changed = pcifront_backend_changed, 1133 ); 1134 1135 static int __init pcifront_init(void) 1136 { 1137 if (!xen_pv_domain() || xen_initial_domain()) 1138 return -ENODEV; 1139 1140 pci_frontend_registrar(1 /* enable */); 1141 1142 return xenbus_register_frontend(&xenpci_driver); 1143 } 1144 1145 static void __exit pcifront_cleanup(void) 1146 { 1147 xenbus_unregister_driver(&xenpci_driver); 1148 pci_frontend_registrar(0 /* disable */); 1149 } 1150 module_init(pcifront_init); 1151 module_exit(pcifront_cleanup); 1152 1153 MODULE_DESCRIPTION("Xen PCI passthrough frontend."); 1154 MODULE_LICENSE("GPL"); 1155 MODULE_ALIAS("xen:pci"); 1156