diff options
author | Ian Campbell <Ian.Campbell@citrix.com> | 2011-02-18 12:06:55 -0500 |
---|---|---|
committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2011-03-10 14:44:45 -0500 |
commit | 71eef7d1e3d9df760897fdd2cad6949a8bcf1620 (patch) | |
tree | b9c2a91248e58618eada7e120023fb641dcb719b /arch/x86/pci | |
parent | ca1d8fe9521fb67c95cfa736c08f4bbbc282b5bd (diff) |
xen: events: remove dom0 specific xen_create_msi_irq
The function name does not distinguish it from xen_allocate_pirq_msi
(which operates on domU and pvhvm domains rather than dom0).
Hoist domain 0 specific functionality up into the only caller leaving
functionality common to all guest types in xen_bind_pirq_msi_to_irq.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Diffstat (limited to 'arch/x86/pci')
-rw-r--r-- | arch/x86/pci/xen.c | 45 |
1 files changed, 40 insertions, 5 deletions
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c index ffd8c7a2cdbb..8c4085a95ef1 100644 --- a/arch/x86/pci/xen.c +++ b/arch/x86/pci/xen.c | |||
@@ -185,15 +185,50 @@ static void xen_teardown_msi_irq(unsigned int irq) | |||
185 | #ifdef CONFIG_XEN_DOM0 | 185 | #ifdef CONFIG_XEN_DOM0 |
186 | static int xen_initdom_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) | 186 | static int xen_initdom_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) |
187 | { | 187 | { |
188 | int irq; | 188 | int ret = 0; |
189 | struct msi_desc *msidesc; | 189 | struct msi_desc *msidesc; |
190 | 190 | ||
191 | list_for_each_entry(msidesc, &dev->msi_list, list) { | 191 | list_for_each_entry(msidesc, &dev->msi_list, list) { |
192 | irq = xen_create_msi_irq(dev, msidesc, type); | 192 | struct physdev_map_pirq map_irq; |
193 | if (irq < 0) | 193 | |
194 | return -1; | 194 | memset(&map_irq, 0, sizeof(map_irq)); |
195 | map_irq.domid = DOMID_SELF; | ||
196 | map_irq.type = MAP_PIRQ_TYPE_MSI; | ||
197 | map_irq.index = -1; | ||
198 | map_irq.pirq = -1; | ||
199 | map_irq.bus = dev->bus->number; | ||
200 | map_irq.devfn = dev->devfn; | ||
201 | |||
202 | if (type == PCI_CAP_ID_MSIX) { | ||
203 | int pos; | ||
204 | u32 table_offset, bir; | ||
205 | |||
206 | pos = pci_find_capability(dev, PCI_CAP_ID_MSIX); | ||
207 | |||
208 | pci_read_config_dword(dev, pos + PCI_MSIX_TABLE, | ||
209 | &table_offset); | ||
210 | bir = (u8)(table_offset & PCI_MSIX_FLAGS_BIRMASK); | ||
211 | |||
212 | map_irq.table_base = pci_resource_start(dev, bir); | ||
213 | map_irq.entry_nr = msidesc->msi_attrib.entry_nr; | ||
214 | } | ||
215 | |||
216 | ret = HYPERVISOR_physdev_op(PHYSDEVOP_map_pirq, &map_irq); | ||
217 | if (ret) { | ||
218 | dev_warn(&dev->dev, "xen map irq failed %d\n", ret); | ||
219 | goto out; | ||
220 | } | ||
221 | |||
222 | ret = xen_bind_pirq_msi_to_irq(dev, msidesc, | ||
223 | map_irq.pirq, map_irq.index, | ||
224 | (type == PCI_CAP_ID_MSIX) ? | ||
225 | "msi-x" : "msi"); | ||
226 | if (ret < 0) | ||
227 | goto out; | ||
195 | } | 228 | } |
196 | return 0; | 229 | ret = 0; |
230 | out: | ||
231 | return ret; | ||
197 | } | 232 | } |
198 | #endif | 233 | #endif |
199 | #endif | 234 | #endif |