aboutsummaryrefslogtreecommitdiffstats
path: root/unmodified_drivers
diff options
context:
space:
mode:
authorawilliam@xenbuild2.aw <awilliam@xenbuild2.aw>2007-01-15 15:15:26 -0700
committerawilliam@xenbuild2.aw <awilliam@xenbuild2.aw>2007-01-15 15:15:26 -0700
commitb5a65552a9fb05b929d6cfe88a9a549c9361afc0 (patch)
treef1242bbae298f823b9304b2c47bfe2b4b7ace0a0 /unmodified_drivers
parente24fb235e0fa71cdede6ee905c56b0b597001cae (diff)
parentf28756a6272f0b6eb04bdce6cb94de196444155b (diff)
downloadxen-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.c28
-rw-r--r--unmodified_drivers/linux-2.6/platform-pci/platform-pci.h4
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);
}