Skip to content

Commit c93fd52

Browse files
Ahmed S. DarwishKAGA-KOKO
authored andcommitted
PCI/MSI: Move mask and unmask helpers to msi.h
The upcoming support for per device MSI interrupt domains needs to share some of the inline helpers with the MSI implementation. Move them to the header file. Signed-off-by: Ahmed S. Darwish <[email protected]> Signed-off-by: Thomas Gleixner <[email protected]> Reviewed-by: Jason Gunthorpe <[email protected]> Acked-by: Bjorn Helgaas <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent db537dd commit c93fd52

File tree

2 files changed

+74
-70
lines changed

2 files changed

+74
-70
lines changed

drivers/pci/msi/msi.c

Lines changed: 1 addition & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
static int pci_msi_enable = 1;
1717
int pci_msi_ignore_mask;
1818

19-
static noinline void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
19+
void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
2020
{
2121
raw_spinlock_t *lock = &to_pci_dev(desc->dev)->msi_lock;
2222
unsigned long flags;
@@ -32,65 +32,6 @@ static noinline void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 s
3232
raw_spin_unlock_irqrestore(lock, flags);
3333
}
3434

35-
static inline void pci_msi_mask(struct msi_desc *desc, u32 mask)
36-
{
37-
pci_msi_update_mask(desc, 0, mask);
38-
}
39-
40-
static inline void pci_msi_unmask(struct msi_desc *desc, u32 mask)
41-
{
42-
pci_msi_update_mask(desc, mask, 0);
43-
}
44-
45-
static inline void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
46-
{
47-
return desc->pci.mask_base + desc->msi_index * PCI_MSIX_ENTRY_SIZE;
48-
}
49-
50-
/*
51-
* This internal function does not flush PCI writes to the device. All
52-
* users must ensure that they read from the device before either assuming
53-
* that the device state is up to date, or returning out of this file.
54-
* It does not affect the msi_desc::msix_ctrl cache either. Use with care!
55-
*/
56-
static void pci_msix_write_vector_ctrl(struct msi_desc *desc, u32 ctrl)
57-
{
58-
void __iomem *desc_addr = pci_msix_desc_addr(desc);
59-
60-
if (desc->pci.msi_attrib.can_mask)
61-
writel(ctrl, desc_addr + PCI_MSIX_ENTRY_VECTOR_CTRL);
62-
}
63-
64-
static inline void pci_msix_mask(struct msi_desc *desc)
65-
{
66-
desc->pci.msix_ctrl |= PCI_MSIX_ENTRY_CTRL_MASKBIT;
67-
pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
68-
/* Flush write to device */
69-
readl(desc->pci.mask_base);
70-
}
71-
72-
static inline void pci_msix_unmask(struct msi_desc *desc)
73-
{
74-
desc->pci.msix_ctrl &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT;
75-
pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
76-
}
77-
78-
static void __pci_msi_mask_desc(struct msi_desc *desc, u32 mask)
79-
{
80-
if (desc->pci.msi_attrib.is_msix)
81-
pci_msix_mask(desc);
82-
else
83-
pci_msi_mask(desc, mask);
84-
}
85-
86-
static void __pci_msi_unmask_desc(struct msi_desc *desc, u32 mask)
87-
{
88-
if (desc->pci.msi_attrib.is_msix)
89-
pci_msix_unmask(desc);
90-
else
91-
pci_msi_unmask(desc, mask);
92-
}
93-
9435
/**
9536
* pci_msi_mask_irq - Generic IRQ chip callback to mask PCI/MSI interrupts
9637
* @data: pointer to irqdata associated to that interrupt

drivers/pci/msi/msi.h

Lines changed: 73 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,67 @@
88
int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
99
void pci_msi_teardown_msi_irqs(struct pci_dev *dev);
1010

11-
#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
12-
int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
13-
void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
14-
#else
15-
static inline int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
11+
/* Mask/unmask helpers */
12+
void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set);
13+
14+
static inline void pci_msi_mask(struct msi_desc *desc, u32 mask)
1615
{
17-
WARN_ON_ONCE(1);
18-
return -ENODEV;
16+
pci_msi_update_mask(desc, 0, mask);
1917
}
2018

21-
static inline void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev)
19+
static inline void pci_msi_unmask(struct msi_desc *desc, u32 mask)
2220
{
23-
WARN_ON_ONCE(1);
21+
pci_msi_update_mask(desc, mask, 0);
22+
}
23+
24+
static inline void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
25+
{
26+
return desc->pci.mask_base + desc->msi_index * PCI_MSIX_ENTRY_SIZE;
27+
}
28+
29+
/*
30+
* This internal function does not flush PCI writes to the device. All
31+
* users must ensure that they read from the device before either assuming
32+
* that the device state is up to date, or returning out of this file.
33+
* It does not affect the msi_desc::msix_ctrl cache either. Use with care!
34+
*/
35+
static inline void pci_msix_write_vector_ctrl(struct msi_desc *desc, u32 ctrl)
36+
{
37+
void __iomem *desc_addr = pci_msix_desc_addr(desc);
38+
39+
if (desc->pci.msi_attrib.can_mask)
40+
writel(ctrl, desc_addr + PCI_MSIX_ENTRY_VECTOR_CTRL);
41+
}
42+
43+
static inline void pci_msix_mask(struct msi_desc *desc)
44+
{
45+
desc->pci.msix_ctrl |= PCI_MSIX_ENTRY_CTRL_MASKBIT;
46+
pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
47+
/* Flush write to device */
48+
readl(desc->pci.mask_base);
49+
}
50+
51+
static inline void pci_msix_unmask(struct msi_desc *desc)
52+
{
53+
desc->pci.msix_ctrl &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT;
54+
pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
55+
}
56+
57+
static inline void __pci_msi_mask_desc(struct msi_desc *desc, u32 mask)
58+
{
59+
if (desc->pci.msi_attrib.is_msix)
60+
pci_msix_mask(desc);
61+
else
62+
pci_msi_mask(desc, mask);
63+
}
64+
65+
static inline void __pci_msi_unmask_desc(struct msi_desc *desc, u32 mask)
66+
{
67+
if (desc->pci.msi_attrib.is_msix)
68+
pci_msix_unmask(desc);
69+
else
70+
pci_msi_unmask(desc, mask);
2471
}
25-
#endif
2672

2773
/*
2874
* PCI 2.3 does not specify mask bits for each MSI interrupt. Attempting to
@@ -37,3 +83,20 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
3783
return 0xffffffff;
3884
return (1 << (1 << desc->pci.msi_attrib.multi_cap)) - 1;
3985
}
86+
87+
/* Legacy (!IRQDOMAIN) fallbacks */
88+
#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
89+
int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
90+
void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
91+
#else
92+
static inline int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
93+
{
94+
WARN_ON_ONCE(1);
95+
return -ENODEV;
96+
}
97+
98+
static inline void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev)
99+
{
100+
WARN_ON_ONCE(1);
101+
}
102+
#endif

0 commit comments

Comments
 (0)