mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
irqchip/irq-msi-lib: Optionally set default irq_eoi()/irq_ack()
msi_lib_init_dev_msi_info() sets the default irq_eoi()/irq_ack() callbacks unconditionally. This is correct for all existing users, but prevents the IMSIC driver to be moved to the MSI library implementation. Introduce chip_flags in struct msi_parent_ops, which instruct the library to selectively set the callbacks depending on the flags, and update all current users to set them. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Anup Patel <apatel@ventanamicro.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/all/20250217085657.789309-3-apatel@ventanamicro.com
This commit is contained in:
parent
999f458c17
commit
1c000dcaad
10 changed files with 25 additions and 5 deletions
|
@ -255,6 +255,7 @@ static void __init gicv2m_teardown(void)
|
|||
static struct msi_parent_ops gicv2m_msi_parent_ops = {
|
||||
.supported_flags = GICV2M_MSI_FLAGS_SUPPORTED,
|
||||
.required_flags = GICV2M_MSI_FLAGS_REQUIRED,
|
||||
.chip_flags = MSI_CHIP_FLAG_SET_EOI | MSI_CHIP_FLAG_SET_ACK,
|
||||
.bus_select_token = DOMAIN_BUS_NEXUS,
|
||||
.bus_select_mask = MATCH_PCI_MSI | MATCH_PLATFORM_MSI,
|
||||
.prefix = "GICv2m-",
|
||||
|
|
|
@ -203,6 +203,7 @@ static bool its_init_dev_msi_info(struct device *dev, struct irq_domain *domain,
|
|||
const struct msi_parent_ops gic_v3_its_msi_parent_ops = {
|
||||
.supported_flags = ITS_MSI_FLAGS_SUPPORTED,
|
||||
.required_flags = ITS_MSI_FLAGS_REQUIRED,
|
||||
.chip_flags = MSI_CHIP_FLAG_SET_EOI | MSI_CHIP_FLAG_SET_ACK,
|
||||
.bus_select_token = DOMAIN_BUS_NEXUS,
|
||||
.bus_select_mask = MATCH_PCI_MSI | MATCH_PLATFORM_MSI,
|
||||
.prefix = "ITS-",
|
||||
|
|
|
@ -201,6 +201,7 @@ static bool mbi_init_dev_msi_info(struct device *dev, struct irq_domain *domain,
|
|||
static const struct msi_parent_ops gic_v3_mbi_msi_parent_ops = {
|
||||
.supported_flags = MBI_MSI_FLAGS_SUPPORTED,
|
||||
.required_flags = MBI_MSI_FLAGS_REQUIRED,
|
||||
.chip_flags = MSI_CHIP_FLAG_SET_EOI | MSI_CHIP_FLAG_SET_ACK,
|
||||
.bus_select_token = DOMAIN_BUS_NEXUS,
|
||||
.bus_select_mask = MATCH_PCI_MSI | MATCH_PLATFORM_MSI,
|
||||
.prefix = "MBI-",
|
||||
|
|
|
@ -214,6 +214,7 @@ static void imx_mu_msi_irq_handler(struct irq_desc *desc)
|
|||
static const struct msi_parent_ops imx_mu_msi_parent_ops = {
|
||||
.supported_flags = IMX_MU_MSI_FLAGS_SUPPORTED,
|
||||
.required_flags = IMX_MU_MSI_FLAGS_REQUIRED,
|
||||
.chip_flags = MSI_CHIP_FLAG_SET_EOI | MSI_CHIP_FLAG_SET_ACK,
|
||||
.bus_select_token = DOMAIN_BUS_NEXUS,
|
||||
.bus_select_mask = MATCH_PLATFORM_MSI,
|
||||
.prefix = "MU-MSI-",
|
||||
|
|
|
@ -146,6 +146,7 @@ static const struct irq_domain_ops pch_msi_middle_domain_ops = {
|
|||
static struct msi_parent_ops pch_msi_parent_ops = {
|
||||
.required_flags = PCH_MSI_FLAGS_REQUIRED,
|
||||
.supported_flags = PCH_MSI_FLAGS_SUPPORTED,
|
||||
.chip_flags = MSI_CHIP_FLAG_SET_EOI | MSI_CHIP_FLAG_SET_ACK,
|
||||
.bus_select_mask = MATCH_PCI_MSI,
|
||||
.bus_select_token = DOMAIN_BUS_NEXUS,
|
||||
.prefix = "PCH-",
|
||||
|
|
|
@ -28,6 +28,7 @@ bool msi_lib_init_dev_msi_info(struct device *dev, struct irq_domain *domain,
|
|||
struct msi_domain_info *info)
|
||||
{
|
||||
const struct msi_parent_ops *pops = real_parent->msi_parent_ops;
|
||||
struct irq_chip *chip = info->chip;
|
||||
u32 required_flags;
|
||||
|
||||
/* Parent ops available? */
|
||||
|
@ -92,10 +93,10 @@ bool msi_lib_init_dev_msi_info(struct device *dev, struct irq_domain *domain,
|
|||
info->flags |= required_flags;
|
||||
|
||||
/* Chip updates for all child bus types */
|
||||
if (!info->chip->irq_eoi)
|
||||
info->chip->irq_eoi = irq_chip_eoi_parent;
|
||||
if (!info->chip->irq_ack)
|
||||
info->chip->irq_ack = irq_chip_ack_parent;
|
||||
if (!chip->irq_eoi && (pops->chip_flags & MSI_CHIP_FLAG_SET_EOI))
|
||||
chip->irq_eoi = irq_chip_eoi_parent;
|
||||
if (!chip->irq_ack && (pops->chip_flags & MSI_CHIP_FLAG_SET_ACK))
|
||||
chip->irq_ack = irq_chip_ack_parent;
|
||||
|
||||
/*
|
||||
* The device MSI domain can never have a set affinity callback. It
|
||||
|
@ -105,7 +106,7 @@ bool msi_lib_init_dev_msi_info(struct device *dev, struct irq_domain *domain,
|
|||
* device MSI domain aside of mask/unmask which is provided e.g. by
|
||||
* PCI/MSI device domains.
|
||||
*/
|
||||
info->chip->irq_set_affinity = msi_domain_set_affinity;
|
||||
chip->irq_set_affinity = msi_domain_set_affinity;
|
||||
return true;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(msi_lib_init_dev_msi_info);
|
||||
|
|
|
@ -161,6 +161,7 @@ static const struct irq_domain_ops gicp_domain_ops = {
|
|||
static const struct msi_parent_ops gicp_msi_parent_ops = {
|
||||
.supported_flags = GICP_MSI_FLAGS_SUPPORTED,
|
||||
.required_flags = GICP_MSI_FLAGS_REQUIRED,
|
||||
.chip_flags = MSI_CHIP_FLAG_SET_EOI | MSI_CHIP_FLAG_SET_ACK,
|
||||
.bus_select_token = DOMAIN_BUS_GENERIC_MSI,
|
||||
.bus_select_mask = MATCH_PLATFORM_MSI,
|
||||
.prefix = "GICP-",
|
||||
|
|
|
@ -157,6 +157,7 @@ static const struct irq_domain_ops odmi_domain_ops = {
|
|||
static const struct msi_parent_ops odmi_msi_parent_ops = {
|
||||
.supported_flags = ODMI_MSI_FLAGS_SUPPORTED,
|
||||
.required_flags = ODMI_MSI_FLAGS_REQUIRED,
|
||||
.chip_flags = MSI_CHIP_FLAG_SET_EOI | MSI_CHIP_FLAG_SET_ACK,
|
||||
.bus_select_token = DOMAIN_BUS_GENERIC_MSI,
|
||||
.bus_select_mask = MATCH_PLATFORM_MSI,
|
||||
.prefix = "ODMI-",
|
||||
|
|
|
@ -356,6 +356,7 @@ static void mvebu_sei_reset(struct mvebu_sei *sei)
|
|||
static const struct msi_parent_ops sei_msi_parent_ops = {
|
||||
.supported_flags = SEI_MSI_FLAGS_SUPPORTED,
|
||||
.required_flags = SEI_MSI_FLAGS_REQUIRED,
|
||||
.chip_flags = MSI_CHIP_FLAG_SET_EOI | MSI_CHIP_FLAG_SET_ACK,
|
||||
.bus_select_mask = MATCH_PLATFORM_MSI,
|
||||
.bus_select_token = DOMAIN_BUS_GENERIC_MSI,
|
||||
.prefix = "SEI-",
|
||||
|
|
|
@ -558,11 +558,21 @@ enum {
|
|||
MSI_FLAG_NO_AFFINITY = (1 << 21),
|
||||
};
|
||||
|
||||
/*
|
||||
* Flags for msi_parent_ops::chip_flags
|
||||
*/
|
||||
enum {
|
||||
MSI_CHIP_FLAG_SET_EOI = (1 << 0),
|
||||
MSI_CHIP_FLAG_SET_ACK = (1 << 1),
|
||||
};
|
||||
|
||||
/**
|
||||
* struct msi_parent_ops - MSI parent domain callbacks and configuration info
|
||||
*
|
||||
* @supported_flags: Required: The supported MSI flags of the parent domain
|
||||
* @required_flags: Optional: The required MSI flags of the parent MSI domain
|
||||
* @chip_flags: Optional: Select MSI chip callbacks to update with defaults
|
||||
* in msi_lib_init_dev_msi_info().
|
||||
* @bus_select_token: Optional: The bus token of the real parent domain for
|
||||
* irq_domain::select()
|
||||
* @bus_select_mask: Optional: A mask of supported BUS_DOMAINs for
|
||||
|
@ -575,6 +585,7 @@ enum {
|
|||
struct msi_parent_ops {
|
||||
u32 supported_flags;
|
||||
u32 required_flags;
|
||||
u32 chip_flags;
|
||||
u32 bus_select_token;
|
||||
u32 bus_select_mask;
|
||||
const char *prefix;
|
||||
|
|
Loading…
Add table
Reference in a new issue