lkml.org 
[lkml]   [2022]   [Jul]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[irqchip: irq/irqchip-next] ACPI: irq: Allow acpi_gsi_to_irq() to have an arch-specific fallback
    The following commit has been merged into the irq/irqchip-next branch of irqchip:

    Commit-ID: 744b9a0c3c8334d705dea6af3645ea30d597c360
    Gitweb: https://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms/744b9a0c3c8334d705dea6af3645ea30d597c360
    Author: Marc Zyngier <maz@kernel.org>
    AuthorDate: Wed, 20 Jul 2022 18:51:22 +08:00
    Committer: Marc Zyngier <maz@kernel.org>
    CommitterDate: Wed, 20 Jul 2022 12:05:17 +01:00

    ACPI: irq: Allow acpi_gsi_to_irq() to have an arch-specific fallback

    It appears that the generic version of acpi_gsi_to_irq() doesn't
    fallback to establishing a mapping if there is no pre-existing
    one while the x86 version does.

    While arm64 seems unaffected by it, LoongArch is relying on the x86
    behaviour. In an effort to prevent new architectures from reinventing
    the proverbial wheel, provide an optional callback that the arch code
    can set to restore the x86 behaviour.

    Hopefully we can eventually get rid of this in the future once
    the expected behaviour has been clarified.

    Reported-by: Jianmin Lv <lvjianmin@loongson.cn>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Signed-off-by: Jianmin Lv <lvjianmin@loongson.cn>
    Tested-by: Hanjun Guo <guohanjun@huawei.com>
    Reviewed-by: Hanjun Guo <guohanjun@huawei.com>
    Link: https://lore.kernel.org/r/1658314292-35346-4-git-send-email-lvjianmin@loongson.cn
    ---
    drivers/acpi/irq.c | 18 ++++++++++++++++--
    include/linux/acpi.h | 1 +
    2 files changed, 17 insertions(+), 2 deletions(-)

    diff --git a/drivers/acpi/irq.c b/drivers/acpi/irq.c
    index f0de768..dabe45e 100644
    --- a/drivers/acpi/irq.c
    +++ b/drivers/acpi/irq.c
    @@ -13,6 +13,7 @@
    enum acpi_irq_model_id acpi_irq_model;

    static struct fwnode_handle *(*acpi_get_gsi_domain_id)(u32 gsi);
    +static u32 (*acpi_gsi_to_irq_fallback)(u32 gsi);

    /**
    * acpi_gsi_to_irq() - Retrieve the linux irq number for a given GSI
    @@ -32,9 +33,12 @@ int acpi_gsi_to_irq(u32 gsi, unsigned int *irq)
    DOMAIN_BUS_ANY);
    *irq = irq_find_mapping(d, gsi);
    /*
    - * *irq == 0 means no mapping, that should
    - * be reported as a failure
    + * *irq == 0 means no mapping, that should be reported as a
    + * failure, unless there is an arch-specific fallback handler.
    */
    + if (!*irq && acpi_gsi_to_irq_fallback)
    + *irq = acpi_gsi_to_irq_fallback(gsi);
    +
    return (*irq > 0) ? 0 : -EINVAL;
    }
    EXPORT_SYMBOL_GPL(acpi_gsi_to_irq);
    @@ -302,6 +306,16 @@ void __init acpi_set_irq_model(enum acpi_irq_model_id model,
    }

    /**
    + * acpi_set_gsi_to_irq_fallback - Register a GSI transfer
    + * callback to fallback to arch specified implementation.
    + * @fn: arch-specific fallback handler
    + */
    +void __init acpi_set_gsi_to_irq_fallback(u32 (*fn)(u32))
    +{
    + acpi_gsi_to_irq_fallback = fn;
    +}
    +
    +/**
    * acpi_irq_create_hierarchy - Create a hierarchical IRQ domain with the default
    * GSI domain as its parent.
    * @flags: Irq domain flags associated with the domain
    diff --git a/include/linux/acpi.h b/include/linux/acpi.h
    index 957e23f..e2b60d5 100644
    --- a/include/linux/acpi.h
    +++ b/include/linux/acpi.h
    @@ -357,6 +357,7 @@ int acpi_isa_irq_to_gsi (unsigned isa_irq, u32 *gsi);

    void acpi_set_irq_model(enum acpi_irq_model_id model,
    struct fwnode_handle *(*)(u32));
    +void acpi_set_gsi_to_irq_fallback(u32 (*)(u32));

    struct irq_domain *acpi_irq_create_hierarchy(unsigned int flags,
    unsigned int size,
    \
     
     \ /
      Last update: 2022-07-20 13:29    [W:2.170 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site