[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <8514ccbe-814a-5bdd-3791-bdd65510ce68@huawei.com>
Date: Fri, 1 Nov 2019 19:05:56 +0800
From: Zenghui Yu <yuzenghui@...wei.com>
To: Marc Zyngier <maz@...nel.org>, <kvmarm@...ts.cs.columbia.edu>,
<linux-kernel@...r.kernel.org>
CC: Eric Auger <eric.auger@...hat.com>,
James Morse <james.morse@....com>,
Julien Thierry <julien.thierry.kdev@...il.com>,
Suzuki K Poulose <suzuki.poulose@....com>,
Thomas Gleixner <tglx@...utronix.de>,
Jason Cooper <jason@...edaemon.net>,
Lorenzo Pieralisi <lorenzo.pieralisi@....com>,
"Andrew Murray" <Andrew.Murray@....com>,
Jayachandran C <jnair@...vell.com>,
"Robert Richter" <rrichter@...vell.com>
Subject: Re: [PATCH v2 13/36] irqchip/gic-v4.1: Don't use the VPE proxy if
RVPEID is set
Hi Marc,
On 2019/10/27 22:42, Marc Zyngier wrote:
> The infamous VPE proxy device isn't used with GICv4.1 because:
> - we can invalidate any LPI from the DirectLPI MMIO interface
> - the ITS and redistributors understand the life cycle of
> the doorbell, so we don't need to enable/disable it all
> the time
>
> So let's escape early from the proxy related functions.
>
> Signed-off-by: Marc Zyngier <maz@...nel.org>
Reviewed-by: Zenghui Yu <yuzenghui@...wei.com>
> ---
> drivers/irqchip/irq-gic-v3-its.c | 23 ++++++++++++++++++++++-
> 1 file changed, 22 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
> index 220d490d516e..999e61a9b2c3 100644
> --- a/drivers/irqchip/irq-gic-v3-its.c
> +++ b/drivers/irqchip/irq-gic-v3-its.c
> @@ -3069,7 +3069,7 @@ static const struct irq_domain_ops its_domain_ops = {
> /*
> * This is insane.
> *
> - * If a GICv4 doesn't implement Direct LPIs (which is extremely
> + * If a GICv4.0 doesn't implement Direct LPIs (which is extremely
> * likely), the only way to perform an invalidate is to use a fake
> * device to issue an INV command, implying that the LPI has first
> * been mapped to some event on that device. Since this is not exactly
> @@ -3077,9 +3077,18 @@ static const struct irq_domain_ops its_domain_ops = {
> * only issue an UNMAP if we're short on available slots.
> *
> * Broken by design(tm).
> + *
> + * GICv4.1 actually mandates that we're able to invalidate by writing to a
> + * MMIO register. It doesn't implement the whole of DirectLPI, but that's
> + * good enough. And most of the time, we don't even have to invalidate
> + * anything, so that's actually pretty good!
I can't understand the meaning of this last sentence. May I ask for an
explanation? :)
Thanks,
Zenghui
> */
> static void its_vpe_db_proxy_unmap_locked(struct its_vpe *vpe)
> {
> + /* GICv4.1 doesn't use a proxy, so nothing to do here */
> + if (gic_rdists->has_rvpeid)
> + return;
> +
> /* Already unmapped? */
> if (vpe->vpe_proxy_event == -1)
> return;
> @@ -3102,6 +3111,10 @@ static void its_vpe_db_proxy_unmap_locked(struct its_vpe *vpe)
>
> static void its_vpe_db_proxy_unmap(struct its_vpe *vpe)
> {
> + /* GICv4.1 doesn't use a proxy, so nothing to do here */
> + if (gic_rdists->has_rvpeid)
> + return;
> +
> if (!gic_rdists->has_direct_lpi) {
> unsigned long flags;
>
> @@ -3113,6 +3126,10 @@ static void its_vpe_db_proxy_unmap(struct its_vpe *vpe)
>
> static void its_vpe_db_proxy_map_locked(struct its_vpe *vpe)
> {
> + /* GICv4.1 doesn't use a proxy, so nothing to do here */
> + if (gic_rdists->has_rvpeid)
> + return;
> +
> /* Already mapped? */
> if (vpe->vpe_proxy_event != -1)
> return;
> @@ -3135,6 +3152,10 @@ static void its_vpe_db_proxy_move(struct its_vpe *vpe, int from, int to)
> unsigned long flags;
> struct its_collection *target_col;
>
> + /* GICv4.1 doesn't use a proxy, so nothing to do here */
> + if (gic_rdists->has_rvpeid)
> + return;
> +
> if (gic_rdists->has_direct_lpi) {
> void __iomem *rdbase;
>
>
Powered by blists - more mailing lists