Skip to content

Commit 4ee11c1

Browse files
Suresh Warrierpaulusmack
authored andcommitted
powerpc/powernv: Provide facilities for EOI, usable from real mode
This adds a new function pnv_opal_pci_msi_eoi() which does the part of end-of-interrupt (EOI) handling of an MSI which involves doing an OPAL call. This function can be called in real mode. This doesn't just export pnv_ioda2_msi_eoi() because that does a call to icp_native_eoi(), which does not work in real mode. This also adds a function, is_pnv_opal_msi(), which KVM can call to check whether an interrupt is one for which we should be calling pnv_opal_pci_msi_eoi() when we need to do an EOI. [paulus@ozlabs.org - split out the addition of pnv_opal_pci_msi_eoi() from Suresh's patch "KVM: PPC: Book3S HV: Handle passthrough interrupts in guest"; added is_pnv_opal_msi(); wrote description.] Signed-off-by: Suresh Warrier <warrier@linux.vnet.ibm.com> Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
1 parent 07b1fdf commit 4ee11c1

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
lines changed

arch/powerpc/include/asm/pnv-pci.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#include <linux/pci.h>
1414
#include <linux/pci_hotplug.h>
15+
#include <linux/irq.h>
1516
#include <misc/cxl-base.h>
1617
#include <asm/opal-api.h>
1718

@@ -33,6 +34,8 @@ int pnv_cxl_alloc_hwirqs(struct pci_dev *dev, int num);
3334
void pnv_cxl_release_hwirqs(struct pci_dev *dev, int hwirq, int num);
3435
int pnv_cxl_get_irq_count(struct pci_dev *dev);
3536
struct device_node *pnv_pci_get_phb_node(struct pci_dev *dev);
37+
int64_t pnv_opal_pci_msi_eoi(struct irq_chip *chip, unsigned int hw_irq);
38+
bool is_pnv_opal_msi(struct irq_chip *chip);
3639

3740
#ifdef CONFIG_CXL_BASE
3841
int pnv_cxl_alloc_hwirq_ranges(struct cxl_irq_ranges *irqs,

arch/powerpc/platforms/powernv/pci-ioda.c

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2710,15 +2710,21 @@ static void pnv_pci_ioda2_setup_dma_pe(struct pnv_phb *phb,
27102710
}
27112711

27122712
#ifdef CONFIG_PCI_MSI
2713-
static void pnv_ioda2_msi_eoi(struct irq_data *d)
2713+
int64_t pnv_opal_pci_msi_eoi(struct irq_chip *chip, unsigned int hw_irq)
27142714
{
2715-
unsigned int hw_irq = (unsigned int)irqd_to_hwirq(d);
2716-
struct irq_chip *chip = irq_data_get_irq_chip(d);
27172715
struct pnv_phb *phb = container_of(chip, struct pnv_phb,
27182716
ioda.irq_chip);
2717+
2718+
return opal_pci_msi_eoi(phb->opal_id, hw_irq);
2719+
}
2720+
2721+
static void pnv_ioda2_msi_eoi(struct irq_data *d)
2722+
{
27192723
int64_t rc;
2724+
unsigned int hw_irq = (unsigned int)irqd_to_hwirq(d);
2725+
struct irq_chip *chip = irq_data_get_irq_chip(d);
27202726

2721-
rc = opal_pci_msi_eoi(phb->opal_id, hw_irq);
2727+
rc = pnv_opal_pci_msi_eoi(chip, hw_irq);
27222728
WARN_ON_ONCE(rc);
27232729

27242730
icp_native_eoi(d);
@@ -2748,6 +2754,16 @@ void pnv_set_msi_irq_chip(struct pnv_phb *phb, unsigned int virq)
27482754
irq_set_chip(virq, &phb->ioda.irq_chip);
27492755
}
27502756

2757+
/*
2758+
* Returns true iff chip is something that we could call
2759+
* pnv_opal_pci_msi_eoi for.
2760+
*/
2761+
bool is_pnv_opal_msi(struct irq_chip *chip)
2762+
{
2763+
return chip->irq_eoi == pnv_ioda2_msi_eoi;
2764+
}
2765+
EXPORT_SYMBOL_GPL(is_pnv_opal_msi);
2766+
27512767
static int pnv_pci_ioda_msi_setup(struct pnv_phb *phb, struct pci_dev *dev,
27522768
unsigned int hwirq, unsigned int virq,
27532769
unsigned int is_64, struct msi_msg *msg)

0 commit comments

Comments
 (0)