diff options
| -rw-r--r-- | drivers/xen/Kconfig | 9 | ||||
| -rw-r--r-- | drivers/xen/Makefile | 3 | ||||
| -rw-r--r-- | drivers/xen/events.c | 8 | ||||
| -rw-r--r-- | drivers/xen/grant-table.c | 77 | ||||
| -rw-r--r-- | drivers/xen/manage.c | 1 | ||||
| -rw-r--r-- | drivers/xen/platform-pci.c | 181 | ||||
| -rw-r--r-- | drivers/xen/xenbus/xenbus_probe.c | 22 | ||||
| -rw-r--r-- | include/linux/pci_ids.h | 3 | ||||
| -rw-r--r-- | include/xen/grant_table.h | 4 | ||||
| -rw-r--r-- | include/xen/interface/grant_table.h | 1 |
10 files changed, 291 insertions, 18 deletions
diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig index fad3df2c1276..8f84b108b491 100644 --- a/drivers/xen/Kconfig +++ b/drivers/xen/Kconfig | |||
| @@ -62,4 +62,13 @@ config XEN_SYS_HYPERVISOR | |||
| 62 | virtual environment, /sys/hypervisor will still be present, | 62 | virtual environment, /sys/hypervisor will still be present, |
| 63 | but will have no xen contents. | 63 | but will have no xen contents. |
| 64 | 64 | ||
| 65 | config XEN_PLATFORM_PCI | ||
| 66 | tristate "xen platform pci device driver" | ||
| 67 | depends on XEN | ||
| 68 | default m | ||
| 69 | help | ||
| 70 | Driver for the Xen PCI Platform device: it is responsible for | ||
| 71 | initializing xenbus and grant_table when running in a Xen HVM | ||
| 72 | domain. As a consequence this driver is required to run any Xen PV | ||
| 73 | frontend on Xen HVM. | ||
| 65 | endmenu | 74 | endmenu |
diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile index 7c284342f30f..e392fb776af3 100644 --- a/drivers/xen/Makefile +++ b/drivers/xen/Makefile | |||
| @@ -9,4 +9,5 @@ obj-$(CONFIG_XEN_XENCOMM) += xencomm.o | |||
| 9 | obj-$(CONFIG_XEN_BALLOON) += balloon.o | 9 | obj-$(CONFIG_XEN_BALLOON) += balloon.o |
| 10 | obj-$(CONFIG_XEN_DEV_EVTCHN) += evtchn.o | 10 | obj-$(CONFIG_XEN_DEV_EVTCHN) += evtchn.o |
| 11 | obj-$(CONFIG_XENFS) += xenfs/ | 11 | obj-$(CONFIG_XENFS) += xenfs/ |
| 12 | obj-$(CONFIG_XEN_SYS_HYPERVISOR) += sys-hypervisor.o \ No newline at end of file | 12 | obj-$(CONFIG_XEN_SYS_HYPERVISOR) += sys-hypervisor.o |
| 13 | obj-$(CONFIG_XEN_PLATFORM_PCI) += platform-pci.o | ||
diff --git a/drivers/xen/events.c b/drivers/xen/events.c index d659480125f0..7c64473c9f3f 100644 --- a/drivers/xen/events.c +++ b/drivers/xen/events.c | |||
| @@ -665,7 +665,7 @@ static void __xen_evtchn_do_upcall(void) | |||
| 665 | 665 | ||
| 666 | count = __get_cpu_var(xed_nesting_count); | 666 | count = __get_cpu_var(xed_nesting_count); |
| 667 | __get_cpu_var(xed_nesting_count) = 0; | 667 | __get_cpu_var(xed_nesting_count) = 0; |
| 668 | } while(count != 1); | 668 | } while (count != 1 || vcpu_info->evtchn_upcall_pending); |
| 669 | 669 | ||
| 670 | out: | 670 | out: |
| 671 | 671 | ||
| @@ -689,6 +689,7 @@ void xen_hvm_evtchn_do_upcall(void) | |||
| 689 | { | 689 | { |
| 690 | __xen_evtchn_do_upcall(); | 690 | __xen_evtchn_do_upcall(); |
| 691 | } | 691 | } |
| 692 | EXPORT_SYMBOL_GPL(xen_hvm_evtchn_do_upcall); | ||
| 692 | 693 | ||
| 693 | /* Rebind a new event channel to an existing irq. */ | 694 | /* Rebind a new event channel to an existing irq. */ |
| 694 | void rebind_evtchn_irq(int evtchn, int irq) | 695 | void rebind_evtchn_irq(int evtchn, int irq) |
| @@ -725,7 +726,10 @@ static int rebind_irq_to_cpu(unsigned irq, unsigned tcpu) | |||
| 725 | struct evtchn_bind_vcpu bind_vcpu; | 726 | struct evtchn_bind_vcpu bind_vcpu; |
| 726 | int evtchn = evtchn_from_irq(irq); | 727 | int evtchn = evtchn_from_irq(irq); |
| 727 | 728 | ||
| 728 | if (!VALID_EVTCHN(evtchn)) | 729 | /* events delivered via platform PCI interrupts are always |
| 730 | * routed to vcpu 0 */ | ||
| 731 | if (!VALID_EVTCHN(evtchn) || | ||
| 732 | (xen_hvm_domain() && !xen_have_vector_callback)) | ||
| 729 | return -1; | 733 | return -1; |
| 730 | 734 | ||
| 731 | /* Send future instances of this interrupt to other vcpu. */ | 735 | /* Send future instances of this interrupt to other vcpu. */ |
diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c index f66db3b91d61..6c4531816496 100644 --- a/drivers/xen/grant-table.c +++ b/drivers/xen/grant-table.c | |||
| @@ -37,11 +37,13 @@ | |||
| 37 | #include <linux/slab.h> | 37 | #include <linux/slab.h> |
| 38 | #include <linux/vmalloc.h> | 38 | #include <linux/vmalloc.h> |
| 39 | #include <linux/uaccess.h> | 39 | #include <linux/uaccess.h> |
| 40 | #include <linux/io.h> | ||
| 40 | 41 | ||
| 41 | #include <xen/xen.h> | 42 | #include <xen/xen.h> |
| 42 | #include <xen/interface/xen.h> | 43 | #include <xen/interface/xen.h> |
| 43 | #include <xen/page.h> | 44 | #include <xen/page.h> |
| 44 | #include <xen/grant_table.h> | 45 | #include <xen/grant_table.h> |
| 46 | #include <xen/interface/memory.h> | ||
| 45 | #include <asm/xen/hypercall.h> | 47 | #include <asm/xen/hypercall.h> |
| 46 | 48 | ||
| 47 | #include <asm/pgtable.h> | 49 | #include <asm/pgtable.h> |
| @@ -59,6 +61,8 @@ static unsigned int boot_max_nr_grant_frames; | |||
| 59 | static int gnttab_free_count; | 61 | static int gnttab_free_count; |
| 60 | static grant_ref_t gnttab_free_head; | 62 | static grant_ref_t gnttab_free_head; |
| 61 | static DEFINE_SPINLOCK(gnttab_list_lock); | 63 | static DEFINE_SPINLOCK(gnttab_list_lock); |
| 64 | unsigned long xen_hvm_resume_frames; | ||
| 65 | EXPORT_SYMBOL_GPL(xen_hvm_resume_frames); | ||
| 62 | 66 | ||
| 63 | static struct grant_entry *shared; | 67 | static struct grant_entry *shared; |
| 64 | 68 | ||
| @@ -433,7 +437,7 @@ static unsigned int __max_nr_grant_frames(void) | |||
| 433 | return query.max_nr_frames; | 437 | return query.max_nr_frames; |
| 434 | } | 438 | } |
| 435 | 439 | ||
| 436 | static inline unsigned int max_nr_grant_frames(void) | 440 | unsigned int gnttab_max_grant_frames(void) |
| 437 | { | 441 | { |
| 438 | unsigned int xen_max = __max_nr_grant_frames(); | 442 | unsigned int xen_max = __max_nr_grant_frames(); |
| 439 | 443 | ||
| @@ -441,6 +445,7 @@ static inline unsigned int max_nr_grant_frames(void) | |||
| 441 | return boot_max_nr_grant_frames; | 445 | return boot_max_nr_grant_frames; |
| 442 | return xen_max; | 446 | return xen_max; |
| 443 | } | 447 | } |
| 448 | EXPORT_SYMBOL_GPL(gnttab_max_grant_frames); | ||
| 444 | 449 | ||
| 445 | static int gnttab_map(unsigned int start_idx, unsigned int end_idx) | 450 | static int gnttab_map(unsigned int start_idx, unsigned int end_idx) |
| 446 | { | 451 | { |
| @@ -449,6 +454,30 @@ static int gnttab_map(unsigned int start_idx, unsigned int end_idx) | |||
| 449 | unsigned int nr_gframes = end_idx + 1; | 454 | unsigned int nr_gframes = end_idx + 1; |
| 450 | int rc; | 455 | int rc; |
| 451 | 456 | ||
| 457 | if (xen_hvm_domain()) { | ||
| 458 | struct xen_add_to_physmap xatp; | ||
| 459 | unsigned int i = end_idx; | ||
| 460 | rc = 0; | ||
| 461 | /* | ||
| 462 | * Loop backwards, so that the first hypercall has the largest | ||
| 463 | * index, ensuring that the table will grow only once. | ||
| 464 | */ | ||
| 465 | do { | ||
| 466 | xatp.domid = DOMID_SELF; | ||
| 467 | xatp.idx = i; | ||
| 468 | xatp.space = XENMAPSPACE_grant_table; | ||
| 469 | xatp.gpfn = (xen_hvm_resume_frames >> PAGE_SHIFT) + i; | ||
| 470 | rc = HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp); | ||
| 471 | if (rc != 0) { | ||
| 472 | printk(KERN_WARNING | ||
| 473 | "grant table add_to_physmap failed, err=%d\n", rc); | ||
| 474 | break; | ||
| 475 | } | ||
| 476 | } while (i-- > start_idx); | ||
| 477 | |||
| 478 | return rc; | ||
| 479 | } | ||
| 480 | |||
| 452 | frames = kmalloc(nr_gframes * sizeof(unsigned long), GFP_ATOMIC); | 481 | frames = kmalloc(nr_gframes * sizeof(unsigned long), GFP_ATOMIC); |
| 453 | if (!frames) | 482 | if (!frames) |
| 454 | return -ENOMEM; | 483 | return -ENOMEM; |
| @@ -465,7 +494,7 @@ static int gnttab_map(unsigned int start_idx, unsigned int end_idx) | |||
| 465 | 494 | ||
| 466 | BUG_ON(rc || setup.status); | 495 | BUG_ON(rc || setup.status); |
| 467 | 496 | ||
| 468 | rc = arch_gnttab_map_shared(frames, nr_gframes, max_nr_grant_frames(), | 497 | rc = arch_gnttab_map_shared(frames, nr_gframes, gnttab_max_grant_frames(), |
| 469 | &shared); | 498 | &shared); |
| 470 | BUG_ON(rc); | 499 | BUG_ON(rc); |
| 471 | 500 | ||
| @@ -476,9 +505,27 @@ static int gnttab_map(unsigned int start_idx, unsigned int end_idx) | |||
| 476 | 505 | ||
| 477 | int gnttab_resume(void) | 506 | int gnttab_resume(void) |
| 478 | { | 507 | { |
| 479 | if (max_nr_grant_frames() < nr_grant_frames) | 508 | unsigned int max_nr_gframes; |
| 509 | |||
| 510 | max_nr_gframes = gnttab_max_grant_frames(); | ||
| 511 | if (max_nr_gframes < nr_grant_frames) | ||
| 480 | return -ENOSYS; | 512 | return -ENOSYS; |
| 481 | return gnttab_map(0, nr_grant_frames - 1); | 513 | |
| 514 | if (xen_pv_domain()) | ||
| 515 | return gnttab_map(0, nr_grant_frames - 1); | ||
| 516 | |||
| 517 | if (!shared) { | ||
| 518 | shared = ioremap(xen_hvm_resume_frames, PAGE_SIZE * max_nr_gframes); | ||
| 519 | if (shared == NULL) { | ||
| 520 | printk(KERN_WARNING | ||
| 521 | "Failed to ioremap gnttab share frames!"); | ||
| 522 | return -ENOMEM; | ||
| 523 | } | ||
| 524 | } | ||
| 525 | |||
| 526 | gnttab_map(0, nr_grant_frames - 1); | ||
| 527 | |||
| 528 | return 0; | ||
| 482 | } | 529 | } |
| 483 | 530 | ||
| 484 | int gnttab_suspend(void) | 531 | int gnttab_suspend(void) |
| @@ -495,7 +542,7 @@ static int gnttab_expand(unsigned int req_entries) | |||
| 495 | cur = nr_grant_frames; | 542 | cur = nr_grant_frames; |
| 496 | extra = ((req_entries + (GREFS_PER_GRANT_FRAME-1)) / | 543 | extra = ((req_entries + (GREFS_PER_GRANT_FRAME-1)) / |
| 497 | GREFS_PER_GRANT_FRAME); | 544 | GREFS_PER_GRANT_FRAME); |
| 498 | if (cur + extra > max_nr_grant_frames()) | 545 | if (cur + extra > gnttab_max_grant_frames()) |
| 499 | return -ENOSPC; | 546 | return -ENOSPC; |
| 500 | 547 | ||
| 501 | rc = gnttab_map(cur, cur + extra - 1); | 548 | rc = gnttab_map(cur, cur + extra - 1); |
| @@ -505,15 +552,12 @@ static int gnttab_expand(unsigned int req_entries) | |||
| 505 | return rc; | 552 | return rc; |
| 506 | } | 553 | } |
| 507 | 554 | ||
| 508 | static int __devinit gnttab_init(void) | 555 | int gnttab_init(void) |
| 509 | { | 556 | { |
| 510 | int i; | 557 | int i; |
| 511 | unsigned int max_nr_glist_frames, nr_glist_frames; | 558 | unsigned int max_nr_glist_frames, nr_glist_frames; |
| 512 | unsigned int nr_init_grefs; | 559 | unsigned int nr_init_grefs; |
| 513 | 560 | ||
| 514 | if (!xen_domain()) | ||
| 515 | return -ENODEV; | ||
| 516 | |||
| 517 | nr_grant_frames = 1; | 561 | nr_grant_frames = 1; |
| 518 | boot_max_nr_grant_frames = __max_nr_grant_frames(); | 562 | boot_max_nr_grant_frames = __max_nr_grant_frames(); |
| 519 | 563 | ||
| @@ -556,5 +600,18 @@ static int __devinit gnttab_init(void) | |||
| 556 | kfree(gnttab_list); | 600 | kfree(gnttab_list); |
| 557 | return -ENOMEM; | 601 | return -ENOMEM; |
| 558 | } | 602 | } |
| 603 | EXPORT_SYMBOL_GPL(gnttab_init); | ||
| 604 | |||
| 605 | static int __devinit __gnttab_init(void) | ||
| 606 | { | ||
| 607 | /* Delay grant-table initialization in the PV on HVM case */ | ||
| 608 | if (xen_hvm_domain()) | ||
| 609 | return 0; | ||
| 610 | |||
| 611 | if (!xen_pv_domain()) | ||
| 612 | return -ENODEV; | ||
| 613 | |||
| 614 | return gnttab_init(); | ||
| 615 | } | ||
| 559 | 616 | ||
| 560 | core_initcall(gnttab_init); | 617 | core_initcall(__gnttab_init); |
diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c index 07e857b0de13..af9c5594d315 100644 --- a/drivers/xen/manage.c +++ b/drivers/xen/manage.c | |||
| @@ -264,5 +264,6 @@ static int __init setup_shutdown_event(void) | |||
| 264 | 264 | ||
| 265 | return 0; | 265 | return 0; |
| 266 | } | 266 | } |
| 267 | EXPORT_SYMBOL_GPL(xen_setup_shutdown_event); | ||
| 267 | 268 | ||
| 268 | subsys_initcall(setup_shutdown_event); | 269 | subsys_initcall(setup_shutdown_event); |
diff --git a/drivers/xen/platform-pci.c b/drivers/xen/platform-pci.c new file mode 100644 index 000000000000..a0ee5d06f715 --- /dev/null +++ b/drivers/xen/platform-pci.c | |||
| @@ -0,0 +1,181 @@ | |||
| 1 | /****************************************************************************** | ||
| 2 | * platform-pci.c | ||
| 3 | * | ||
| 4 | * Xen platform PCI device driver | ||
| 5 | * Copyright (c) 2005, Intel Corporation. | ||
| 6 | * Copyright (c) 2007, XenSource Inc. | ||
| 7 | * Copyright (c) 2010, Citrix | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or modify it | ||
| 10 | * under the terms and conditions of the GNU General Public License, | ||
| 11 | * version 2, as published by the Free Software Foundation. | ||
| 12 | * | ||
| 13 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
| 14 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 15 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
| 16 | * more details. | ||
| 17 | * | ||
| 18 | * You should have received a copy of the GNU General Public License along with | ||
| 19 | * this program; if not, write to the Free Software Foundation, Inc., 59 Temple | ||
| 20 | * Place - Suite 330, Boston, MA 02111-1307 USA. | ||
| 21 | * | ||
| 22 | */ | ||
| 23 | |||
| 24 | |||
| 25 | #include <linux/interrupt.h> | ||
| 26 | #include <linux/io.h> | ||
| 27 | #include <linux/module.h> | ||
| 28 | #include <linux/pci.h> | ||
| 29 | |||
| 30 | #include <xen/grant_table.h> | ||
| 31 | #include <xen/xenbus.h> | ||
| 32 | #include <xen/events.h> | ||
| 33 | #include <xen/hvm.h> | ||
| 34 | |||
| 35 | #define DRV_NAME "xen-platform-pci" | ||
| 36 | |||
| 37 | MODULE_AUTHOR("ssmith@xensource.com and stefano.stabellini@eu.citrix.com"); | ||
| 38 | MODULE_DESCRIPTION("Xen platform PCI device"); | ||
| 39 | MODULE_LICENSE("GPL"); | ||
| 40 | |||
| 41 | static unsigned long platform_mmio; | ||
| 42 | static unsigned long platform_mmio_alloc; | ||
| 43 | static unsigned long platform_mmiolen; | ||
| 44 | |||
| 45 | unsigned long alloc_xen_mmio(unsigned long len) | ||
| 46 | { | ||
| 47 | unsigned long addr; | ||
| 48 | |||
| 49 | addr = platform_mmio + platform_mmio_alloc; | ||
| 50 | platform_mmio_alloc += len; | ||
| 51 | BUG_ON(platform_mmio_alloc > platform_mmiolen); | ||
| 52 | |||
| 53 | return addr; | ||
| 54 | } | ||
| 55 | |||
| 56 | static uint64_t get_callback_via(struct pci_dev *pdev) | ||
| 57 | { | ||
| 58 | u8 pin; | ||
| 59 | int irq; | ||
| 60 | |||
| 61 | irq = pdev->irq; | ||
| 62 | if (irq < 16) | ||
| 63 | return irq; /* ISA IRQ */ | ||
| 64 | |||
| 65 | pin = pdev->pin; | ||
| 66 | |||
| 67 | /* We don't know the GSI. Specify the PCI INTx line instead. */ | ||
| 68 | return ((uint64_t)0x01 << 56) | /* PCI INTx identifier */ | ||
| 69 | ((uint64_t)pci_domain_nr(pdev->bus) << 32) | | ||
| 70 | ((uint64_t)pdev->bus->number << 16) | | ||
| 71 | ((uint64_t)(pdev->devfn & 0xff) << 8) | | ||
| 72 | ((uint64_t)(pin - 1) & 3); | ||
| 73 | } | ||
| 74 | |||
| 75 | static irqreturn_t do_hvm_evtchn_intr(int irq, void *dev_id) | ||
| 76 | { | ||
| 77 | xen_hvm_evtchn_do_upcall(); | ||
| 78 | return IRQ_HANDLED; | ||
| 79 | } | ||
| 80 | |||
| 81 | static int xen_allocate_irq(struct pci_dev *pdev) | ||
| 82 | { | ||
| 83 | return request_irq(pdev->irq, do_hvm_evtchn_intr, | ||
| 84 | IRQF_DISABLED | IRQF_NOBALANCING | IRQF_TRIGGER_RISING, | ||
| 85 | "xen-platform-pci", pdev); | ||
| 86 | } | ||
| 87 | |||
| 88 | static int __devinit platform_pci_init(struct pci_dev *pdev, | ||
| 89 | const struct pci_device_id *ent) | ||
| 90 | { | ||
| 91 | int i, ret; | ||
| 92 | long ioaddr, iolen; | ||
| 93 | long mmio_addr, mmio_len; | ||
| 94 | uint64_t callback_via; | ||
| 95 | unsigned int max_nr_gframes; | ||
| 96 | |||
| 97 | i = pci_enable_device(pdev); | ||
| 98 | if (i) | ||
| 99 | return i; | ||
| 100 | |||
| 101 | ioaddr = pci_resource_start(pdev, 0); | ||
| 102 | iolen = pci_resource_len(pdev, 0); | ||
| 103 | |||
| 104 | mmio_addr = pci_resource_start(pdev, 1); | ||
| 105 | mmio_len = pci_resource_len(pdev, 1); | ||
| 106 | |||
| 107 | if (mmio_addr == 0 || ioaddr == 0) { | ||
| 108 | dev_err(&pdev->dev, "no resources found\n"); | ||
| 109 | ret = -ENOENT; | ||
| 110 | goto pci_out; | ||
| 111 | } | ||
| 112 | |||
| 113 | if (request_mem_region(mmio_addr, mmio_len, DRV_NAME) == NULL) { | ||
| 114 | dev_err(&pdev->dev, "MEM I/O resource 0x%lx @ 0x%lx busy\n", | ||
| 115 | mmio_addr, mmio_len); | ||
| 116 | ret = -EBUSY; | ||
| 117 | goto pci_out; | ||
| 118 | } | ||
| 119 | |||
| 120 | if (request_region(ioaddr, iolen, DRV_NAME) == NULL) { | ||
| 121 | dev_err(&pdev->dev, "I/O resource 0x%lx @ 0x%lx busy\n", | ||
| 122 | iolen, ioaddr); | ||
| 123 | ret = -EBUSY; | ||
| 124 | goto mem_out; | ||
| 125 | } | ||
| 126 | |||
| 127 | platform_mmio = mmio_addr; | ||
| 128 | platform_mmiolen = mmio_len; | ||
| 129 | |||
| 130 | if (!xen_have_vector_callback) { | ||
| 131 | ret = xen_allocate_irq(pdev); | ||
| 132 | if (ret) { | ||
| 133 | dev_warn(&pdev->dev, "request_irq failed err=%d\n", ret); | ||
| 134 | goto out; | ||
| 135 | } | ||
| 136 | callback_via = get_callback_via(pdev); | ||
| 137 | ret = xen_set_callback_via(callback_via); | ||
| 138 | if (ret) { | ||
| 139 | dev_warn(&pdev->dev, "Unable to set the evtchn callback " | ||
| 140 | "err=%d\n", ret); | ||
| 141 | goto out; | ||
| 142 | } | ||
| 143 | } | ||
| 144 | |||
| 145 | max_nr_gframes = gnttab_max_grant_frames(); | ||
| 146 | xen_hvm_resume_frames = alloc_xen_mmio(PAGE_SIZE * max_nr_gframes); | ||
| 147 | ret = gnttab_init(); | ||
| 148 | if (ret) | ||
| 149 | goto out; | ||
| 150 | xenbus_probe(NULL); | ||
| 151 | return 0; | ||
| 152 | |||
| 153 | out: | ||
| 154 | release_region(ioaddr, iolen); | ||
| 155 | mem_out: | ||
| 156 | release_mem_region(mmio_addr, mmio_len); | ||
| 157 | pci_out: | ||
| 158 | pci_disable_device(pdev); | ||
| 159 | return ret; | ||
| 160 | } | ||
| 161 | |||
| 162 | static struct pci_device_id platform_pci_tbl[] __devinitdata = { | ||
| 163 | {PCI_VENDOR_ID_XEN, PCI_DEVICE_ID_XEN_PLATFORM, | ||
| 164 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, | ||
| 165 | {0,} | ||
| 166 | }; | ||
| 167 | |||
| 168 | MODULE_DEVICE_TABLE(pci, platform_pci_tbl); | ||
| 169 | |||
| 170 | static struct pci_driver platform_driver = { | ||
| 171 | .name = DRV_NAME, | ||
| 172 | .probe = platform_pci_init, | ||
| 173 | .id_table = platform_pci_tbl, | ||
| 174 | }; | ||
| 175 | |||
| 176 | static int __init platform_pci_module_init(void) | ||
| 177 | { | ||
| 178 | return pci_register_driver(&platform_driver); | ||
| 179 | } | ||
| 180 | |||
| 181 | module_init(platform_pci_module_init); | ||
diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c index d96fa75b45ec..a9e83c438cbb 100644 --- a/drivers/xen/xenbus/xenbus_probe.c +++ b/drivers/xen/xenbus/xenbus_probe.c | |||
| @@ -781,8 +781,23 @@ void xenbus_probe(struct work_struct *unused) | |||
| 781 | /* Notify others that xenstore is up */ | 781 | /* Notify others that xenstore is up */ |
| 782 | blocking_notifier_call_chain(&xenstore_chain, 0, NULL); | 782 | blocking_notifier_call_chain(&xenstore_chain, 0, NULL); |
| 783 | } | 783 | } |
| 784 | EXPORT_SYMBOL_GPL(xenbus_probe); | ||
| 784 | 785 | ||
| 785 | static int __init xenbus_probe_init(void) | 786 | static int __init xenbus_probe_initcall(void) |
| 787 | { | ||
| 788 | if (!xen_domain()) | ||
| 789 | return -ENODEV; | ||
| 790 | |||
| 791 | if (xen_initial_domain() || xen_hvm_domain()) | ||
| 792 | return 0; | ||
| 793 | |||
| 794 | xenbus_probe(NULL); | ||
| 795 | return 0; | ||
| 796 | } | ||
| 797 | |||
| 798 | device_initcall(xenbus_probe_initcall); | ||
| 799 | |||
| 800 | static int __init xenbus_init(void) | ||
| 786 | { | 801 | { |
| 787 | int err = 0; | 802 | int err = 0; |
| 788 | 803 | ||
| @@ -834,9 +849,6 @@ static int __init xenbus_probe_init(void) | |||
| 834 | goto out_unreg_back; | 849 | goto out_unreg_back; |
| 835 | } | 850 | } |
| 836 | 851 | ||
| 837 | if (!xen_initial_domain()) | ||
| 838 | xenbus_probe(NULL); | ||
| 839 | |||
| 840 | #ifdef CONFIG_XEN_COMPAT_XENFS | 852 | #ifdef CONFIG_XEN_COMPAT_XENFS |
| 841 | /* | 853 | /* |
| 842 | * Create xenfs mountpoint in /proc for compatibility with | 854 | * Create xenfs mountpoint in /proc for compatibility with |
| @@ -857,7 +869,7 @@ static int __init xenbus_probe_init(void) | |||
| 857 | return err; | 869 | return err; |
| 858 | } | 870 | } |
| 859 | 871 | ||
| 860 | postcore_initcall(xenbus_probe_init); | 872 | postcore_initcall(xenbus_init); |
| 861 | 873 | ||
| 862 | MODULE_LICENSE("GPL"); | 874 | MODULE_LICENSE("GPL"); |
| 863 | 875 | ||
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 3bedcc149c84..cca2526f28d7 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
| @@ -2772,3 +2772,6 @@ | |||
| 2772 | #define PCI_DEVICE_ID_RME_DIGI32 0x9896 | 2772 | #define PCI_DEVICE_ID_RME_DIGI32 0x9896 |
| 2773 | #define PCI_DEVICE_ID_RME_DIGI32_PRO 0x9897 | 2773 | #define PCI_DEVICE_ID_RME_DIGI32_PRO 0x9897 |
| 2774 | #define PCI_DEVICE_ID_RME_DIGI32_8 0x9898 | 2774 | #define PCI_DEVICE_ID_RME_DIGI32_8 0x9898 |
| 2775 | |||
| 2776 | #define PCI_VENDOR_ID_XEN 0x5853 | ||
| 2777 | #define PCI_DEVICE_ID_XEN_PLATFORM 0x0001 | ||
diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h index a40f1cd91be1..9a731706a016 100644 --- a/include/xen/grant_table.h +++ b/include/xen/grant_table.h | |||
| @@ -51,6 +51,7 @@ struct gnttab_free_callback { | |||
| 51 | u16 count; | 51 | u16 count; |
| 52 | }; | 52 | }; |
| 53 | 53 | ||
| 54 | int gnttab_init(void); | ||
| 54 | int gnttab_suspend(void); | 55 | int gnttab_suspend(void); |
| 55 | int gnttab_resume(void); | 56 | int gnttab_resume(void); |
| 56 | 57 | ||
| @@ -112,6 +113,9 @@ int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes, | |||
| 112 | void arch_gnttab_unmap_shared(struct grant_entry *shared, | 113 | void arch_gnttab_unmap_shared(struct grant_entry *shared, |
| 113 | unsigned long nr_gframes); | 114 | unsigned long nr_gframes); |
| 114 | 115 | ||
| 116 | extern unsigned long xen_hvm_resume_frames; | ||
| 117 | unsigned int gnttab_max_grant_frames(void); | ||
| 118 | |||
| 115 | #define gnttab_map_vaddr(map) ((void *)(map.host_virt_addr)) | 119 | #define gnttab_map_vaddr(map) ((void *)(map.host_virt_addr)) |
| 116 | 120 | ||
| 117 | #endif /* __ASM_GNTTAB_H__ */ | 121 | #endif /* __ASM_GNTTAB_H__ */ |
diff --git a/include/xen/interface/grant_table.h b/include/xen/interface/grant_table.h index 39da93c21de0..39e571796e32 100644 --- a/include/xen/interface/grant_table.h +++ b/include/xen/interface/grant_table.h | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #ifndef __XEN_PUBLIC_GRANT_TABLE_H__ | 28 | #ifndef __XEN_PUBLIC_GRANT_TABLE_H__ |
| 29 | #define __XEN_PUBLIC_GRANT_TABLE_H__ | 29 | #define __XEN_PUBLIC_GRANT_TABLE_H__ |
| 30 | 30 | ||
| 31 | #include <xen/interface/xen.h> | ||
| 31 | 32 | ||
| 32 | /*********************************** | 33 | /*********************************** |
| 33 | * GRANT TABLE REPRESENTATION | 34 | * GRANT TABLE REPRESENTATION |
