From: Marc Zyngier <marc.zyngier@arm.com>
To: Jason Cooper <jason@lakedaemon.net>
Cc: Bjorn Andersson <bjorn@kryo.se>,
Abhijeet Dharmapurikar <adharmap@codeaurora.org>,
Stephen Boyd <sboyd@codeaurora.org>, Phong Vo <pvo@apm.com>,
Linus Walleij <linus.walleij@linaro.org>,
Tin Huynh <tnhuynh@apm.com>, Y Vo <yvo@apm.com>,
Thomas Gleixner <tglx@linutronix.de>, Toan Le <toanle@apm.com>,
Arnd Bergmann <arnd@arndb.de>,
linux-arm-msm <linux-arm-msm@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH v2 1/3] genirq: Allow the irqchip state of an IRQ to be save/restored
Date: Wed, 07 Jan 2015 16:09:54 +0000 [thread overview]
Message-ID: <54AD5A52.4090608@arm.com> (raw)
In-Reply-To: <20150107160502.GJ24989@titan.lakedaemon.net>
On 07/01/15 16:05, Jason Cooper wrote:
> Marc,
>
> On Tue, Dec 09, 2014 at 09:37:26AM +0000, Marc Zyngier wrote:
>> On 08/12/14 22:42, Bjorn Andersson wrote:
>>> On Wed, Dec 3, 2014 at 8:18 AM, Marc Zyngier <marc.zyngier@arm.com> wrote:
>>>> There is a number of cases where a kernel subsystem may want to
>>>> introspect the state of an interrupt at the irqchip level:
>>>>
>>>> - When a peripheral is shared between virtual machines,
>>>> its interrupt state becomes part of the guest's state,
>>>> and must be switched accordingly. KVM on arm/arm64 requires
>>>> this for its guest-visible timer
>>>> - Some GPIO controllers seem to require peeking into the
>>>> interrupt controller they are connected to to report
>>>> their internal state
>>>>
>>>> This seem to be a pattern that is common enough for the core code
>>>> to try and support this without too many horrible hacks. Introduce
>>>> a pair of accessors (irq_get_irqchip_state/irq_set_irqchip_state)
>>>> to retrieve the bits that can be of interest to another subsystem:
>>>> pending, active, and masked.
>>>>
>>>> - irq_get_irqchip_state returns the state of the interrupt according
>>>> to a parameter set to IRQCHIP_STATE_PENDING, IRQCHIP_STATE_ACTIVE,
>>>> IRQCHIP_STATE_MASKED or IRQCHIP_STATE_LINE_LEVEL.
>>>> - irq_set_irqchip_state similarly sets the state of the interrupt.
>>>>
>>>> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
>>>
>>> With the addition of actually assigning err to something useful in the
>>> setter below:
>>>
>>> Reviewed-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
>>> Tested-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
>>>
>>>> diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
>>>
>>> [..]
>>>
>>>> +/**
>>>> + * irq_set_irqchip_state - set the state of a forwarded interrupt.
>>>> + * @irq: Interrupt line that is forwarded to a VM
>>>> + * @which: State to be restored (one of IRQCHIP_STATE_*)
>>>> + * @val: Value corresponding to @which
>>>> + *
>>>> + * This call sets the internal irqchip state of an interrupt,
>>>> + * depending on the value of @which.
>>>> + *
>>>> + * This function should be called with preemption disabled if the
>>>> + * interrupt controller has per-cpu registers.
>>>> + */
>>>> +int irq_set_irqchip_state(unsigned int irq, enum irqchip_irq_state which,
>>>> + bool val)
>>>> +{
>>>> + struct irq_desc *desc;
>>>> + struct irq_data *data;
>>>> + struct irq_chip *chip;
>>>> + unsigned long flags;
>>>> + int err = -EINVAL;
>>>> +
>>>> + desc = irq_get_desc_buslock(irq, &flags, 0);
>>>> + if (!desc)
>>>> + return err;
>>>> +
>>>> + data = irq_desc_get_irq_data(desc);
>>>> +
>>>> + do {
>>>> + chip = irq_data_get_irq_chip(data);
>>>> + if (chip->irq_set_irqchip_state)
>>>> + break;
>>>> +#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
>>>> + data = data->parent_data;
>>>> +#else
>>>> + data = NULL;
>>>> +#endif
>>>> + } while (data);
>>>> +
>>>> + if (data)
>>>> + chip->irq_set_irqchip_state(data, which, val);
>>>
>>> err =
>>
>> Ah, that will teach me to write test code that actually checks the
>> return value! :-)
>>
>> Thanks for the fix and the tags.
>
> Did I miss the new version of this?
I'm rebasing all my stuff at the moment. Expect something later today
(or tomorrow morning worse case).
Thanks,
M.
--
Jazz is not dead. It just smells funny...
WARNING: multiple messages have this Message-ID (diff)
From: marc.zyngier@arm.com (Marc Zyngier)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 1/3] genirq: Allow the irqchip state of an IRQ to be save/restored
Date: Wed, 07 Jan 2015 16:09:54 +0000 [thread overview]
Message-ID: <54AD5A52.4090608@arm.com> (raw)
In-Reply-To: <20150107160502.GJ24989@titan.lakedaemon.net>
On 07/01/15 16:05, Jason Cooper wrote:
> Marc,
>
> On Tue, Dec 09, 2014 at 09:37:26AM +0000, Marc Zyngier wrote:
>> On 08/12/14 22:42, Bjorn Andersson wrote:
>>> On Wed, Dec 3, 2014 at 8:18 AM, Marc Zyngier <marc.zyngier@arm.com> wrote:
>>>> There is a number of cases where a kernel subsystem may want to
>>>> introspect the state of an interrupt at the irqchip level:
>>>>
>>>> - When a peripheral is shared between virtual machines,
>>>> its interrupt state becomes part of the guest's state,
>>>> and must be switched accordingly. KVM on arm/arm64 requires
>>>> this for its guest-visible timer
>>>> - Some GPIO controllers seem to require peeking into the
>>>> interrupt controller they are connected to to report
>>>> their internal state
>>>>
>>>> This seem to be a pattern that is common enough for the core code
>>>> to try and support this without too many horrible hacks. Introduce
>>>> a pair of accessors (irq_get_irqchip_state/irq_set_irqchip_state)
>>>> to retrieve the bits that can be of interest to another subsystem:
>>>> pending, active, and masked.
>>>>
>>>> - irq_get_irqchip_state returns the state of the interrupt according
>>>> to a parameter set to IRQCHIP_STATE_PENDING, IRQCHIP_STATE_ACTIVE,
>>>> IRQCHIP_STATE_MASKED or IRQCHIP_STATE_LINE_LEVEL.
>>>> - irq_set_irqchip_state similarly sets the state of the interrupt.
>>>>
>>>> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
>>>
>>> With the addition of actually assigning err to something useful in the
>>> setter below:
>>>
>>> Reviewed-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
>>> Tested-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
>>>
>>>> diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
>>>
>>> [..]
>>>
>>>> +/**
>>>> + * irq_set_irqchip_state - set the state of a forwarded interrupt.
>>>> + * @irq: Interrupt line that is forwarded to a VM
>>>> + * @which: State to be restored (one of IRQCHIP_STATE_*)
>>>> + * @val: Value corresponding to @which
>>>> + *
>>>> + * This call sets the internal irqchip state of an interrupt,
>>>> + * depending on the value of @which.
>>>> + *
>>>> + * This function should be called with preemption disabled if the
>>>> + * interrupt controller has per-cpu registers.
>>>> + */
>>>> +int irq_set_irqchip_state(unsigned int irq, enum irqchip_irq_state which,
>>>> + bool val)
>>>> +{
>>>> + struct irq_desc *desc;
>>>> + struct irq_data *data;
>>>> + struct irq_chip *chip;
>>>> + unsigned long flags;
>>>> + int err = -EINVAL;
>>>> +
>>>> + desc = irq_get_desc_buslock(irq, &flags, 0);
>>>> + if (!desc)
>>>> + return err;
>>>> +
>>>> + data = irq_desc_get_irq_data(desc);
>>>> +
>>>> + do {
>>>> + chip = irq_data_get_irq_chip(data);
>>>> + if (chip->irq_set_irqchip_state)
>>>> + break;
>>>> +#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
>>>> + data = data->parent_data;
>>>> +#else
>>>> + data = NULL;
>>>> +#endif
>>>> + } while (data);
>>>> +
>>>> + if (data)
>>>> + chip->irq_set_irqchip_state(data, which, val);
>>>
>>> err =
>>
>> Ah, that will teach me to write test code that actually checks the
>> return value! :-)
>>
>> Thanks for the fix and the tags.
>
> Did I miss the new version of this?
I'm rebasing all my stuff at the moment. Expect something later today
(or tomorrow morning worse case).
Thanks,
M.
--
Jazz is not dead. It just smells funny...
next prev parent reply other threads:[~2015-01-07 16:10 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-03 16:18 [PATCH v2 0/3] genirq: Saving/restoring the irqchip state of an irq line Marc Zyngier
2014-12-03 16:18 ` Marc Zyngier
2014-12-03 16:18 ` [PATCH v2 1/3] genirq: Allow the irqchip state of an IRQ to be save/restored Marc Zyngier
2014-12-03 16:18 ` Marc Zyngier
2014-12-08 22:42 ` Bjorn Andersson
2014-12-08 22:42 ` Bjorn Andersson
2014-12-09 9:37 ` Marc Zyngier
2014-12-09 9:37 ` Marc Zyngier
2015-01-07 16:05 ` Jason Cooper
2015-01-07 16:05 ` Jason Cooper
2015-01-07 16:09 ` Marc Zyngier [this message]
2015-01-07 16:09 ` Marc Zyngier
2015-01-07 16:13 ` Jason Cooper
2015-01-07 16:13 ` Jason Cooper
2014-12-03 16:18 ` [PATCH v2 2/3] irqchip: GIC: Add support for irq_{get,set}_irqchip_state Marc Zyngier
2014-12-03 16:18 ` [PATCH v2 2/3] irqchip: GIC: Add support for irq_{get, set}_irqchip_state Marc Zyngier
2014-12-03 16:18 ` [PATCH v2 3/3] irqchip: GICv3: Add support for irq_{get,set}_irqchip_state Marc Zyngier
2014-12-03 16:18 ` [PATCH v2 3/3] irqchip: GICv3: Add support for irq_{get, set}_irqchip_state Marc Zyngier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=54AD5A52.4090608@arm.com \
--to=marc.zyngier@arm.com \
--cc=adharmap@codeaurora.org \
--cc=arnd@arndb.de \
--cc=bjorn@kryo.se \
--cc=jason@lakedaemon.net \
--cc=linus.walleij@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pvo@apm.com \
--cc=sboyd@codeaurora.org \
--cc=tglx@linutronix.de \
--cc=tnhuynh@apm.com \
--cc=toanle@apm.com \
--cc=yvo@apm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.