diff options
author | awilliam@xenbuild2.aw <awilliam@xenbuild2.aw> | 2007-01-15 15:15:26 -0700 |
---|---|---|
committer | awilliam@xenbuild2.aw <awilliam@xenbuild2.aw> | 2007-01-15 15:15:26 -0700 |
commit | b5a65552a9fb05b929d6cfe88a9a549c9361afc0 (patch) | |
tree | f1242bbae298f823b9304b2c47bfe2b4b7ace0a0 /unmodified_drivers | |
parent | e24fb235e0fa71cdede6ee905c56b0b597001cae (diff) | |
parent | f28756a6272f0b6eb04bdce6cb94de196444155b (diff) | |
download | xen-b5a65552a9fb05b929d6cfe88a9a549c9361afc0.tar.gz xen-b5a65552a9fb05b929d6cfe88a9a549c9361afc0.tar.bz2 xen-b5a65552a9fb05b929d6cfe88a9a549c9361afc0.zip |
merge with xen-unstable.hg
Diffstat (limited to 'unmodified_drivers')
-rw-r--r-- | unmodified_drivers/linux-2.6/platform-pci/platform-pci.c | 28 | ||||
-rw-r--r-- | unmodified_drivers/linux-2.6/platform-pci/platform-pci.h | 4 |
2 files changed, 20 insertions, 12 deletions
diff --git a/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c b/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c index a1b7eafc4e..321a166d05 100644 --- a/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c +++ b/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c @@ -179,7 +179,7 @@ static int get_hypercall_stubs(void) #define get_hypercall_stubs() (0) #endif -static int get_callback_irq(struct pci_dev *pdev) +static uint64_t get_callback_via(struct pci_dev *pdev) { #ifdef __ia64__ int irq, rid; @@ -194,16 +194,24 @@ static int get_callback_irq(struct pci_dev *pdev) rid); return rid | IA64_CALLBACK_IRQ_RID; #else /* !__ia64__ */ - return pdev->irq; + if (pdev->irq < 16) + return pdev->irq; /* ISA IRQ */ + /* We don't know the GSI. Specify the PCI INTx line instead. */ + return (((uint64_t)0x01 << 56) | /* PCI INTx identifier */ + ((uint64_t)pci_domain_nr(pdev->bus) << 32) | + ((uint64_t)pdev->bus->number << 16) | + ((uint64_t)(pdev->devfn & 0xff) << 8) | + ((uint64_t)(pdev->pin - 1) & 3)); #endif } static int __devinit platform_pci_init(struct pci_dev *pdev, const struct pci_device_id *ent) { - int i, ret, callback_irq; + int i, ret; long ioaddr, iolen; long mmio_addr, mmio_len; + uint64_t callback_via; i = pci_enable_device(pdev); if (i) @@ -215,9 +223,9 @@ static int __devinit platform_pci_init(struct pci_dev *pdev, mmio_addr = pci_resource_start(pdev, 1); mmio_len = pci_resource_len(pdev, 1); - callback_irq = get_callback_irq(pdev); + callback_via = get_callback_via(pdev); - if (mmio_addr == 0 || ioaddr == 0 || callback_irq == 0) { + if (mmio_addr == 0 || ioaddr == 0 || callback_via == 0) { printk(KERN_WARNING DRV_NAME ":no resources found\n"); return -ENOENT; } @@ -247,12 +255,12 @@ static int __devinit platform_pci_init(struct pci_dev *pdev, if ((ret = init_xen_info())) goto out; - if ((ret = request_irq(pdev->irq, evtchn_interrupt, SA_SHIRQ, - "xen-platform-pci", pdev))) { + if ((ret = request_irq(pdev->irq, evtchn_interrupt, + SA_SHIRQ | SA_SAMPLE_RANDOM, + "xen-platform-pci", pdev))) goto out; - } - if ((ret = set_callback_irq(callback_irq))) + if ((ret = set_callback_via(callback_via))) goto out; out: @@ -302,7 +310,7 @@ static void __exit platform_pci_module_cleanup(void) { printk(KERN_INFO DRV_NAME ":Do platform module cleanup\n"); /* disable hypervisor for callback irq */ - set_callback_irq(0); + set_callback_via(0); if (pci_device_registered) pci_unregister_driver(&platform_driver); } diff --git a/unmodified_drivers/linux-2.6/platform-pci/platform-pci.h b/unmodified_drivers/linux-2.6/platform-pci/platform-pci.h index 5e10413b13..ca65358599 100644 --- a/unmodified_drivers/linux-2.6/platform-pci/platform-pci.h +++ b/unmodified_drivers/linux-2.6/platform-pci/platform-pci.h @@ -24,13 +24,13 @@ #include <linux/interrupt.h> #include <xen/interface/hvm/params.h> -static inline int set_callback_irq(int irq) +static inline int set_callback_via(uint64_t via) { struct xen_hvm_param a; a.domid = DOMID_SELF; a.index = HVM_PARAM_CALLBACK_IRQ; - a.value = irq; + a.value = via; return HYPERVISOR_hvm_op(HVMOP_set_param, &a); } |