From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4BE6DC433F5 for ; Fri, 6 May 2022 18:20:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1392505AbiEFSYC (ORCPT ); Fri, 6 May 2022 14:24:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43628 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1386409AbiEFSXe (ORCPT ); Fri, 6 May 2022 14:23:34 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E1B7D6E8F6; Fri, 6 May 2022 11:19:50 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 6FB486211D; Fri, 6 May 2022 18:19:50 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id AB7BCC385A9; Fri, 6 May 2022 18:19:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1651861189; bh=F8OZZkP2VCHLM+mFrp5QDGv1xHS8ckfdGAQvYzcVY7Y=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=CxFcRt2W8R/2CfHJ1kJIK6DpbkFRyRblymXIh7LUrOVMd5W11l1shKAC2BQG8nG8G QQupTw66h7pCGhAEjkpyG42MlPdQnclc1sSudXsVzmIRyOOd8FjgsVGmRRWWV+QUma rD4pdd+8ByoVzetqrxsKMaITP6PijA8lofpp9xr/wRlhC1gXGSeefovRsyUk65Wcva /IMS8efd5u+f/saSw8uISjQPWH0nyeD+eetTf5XMBXb5UzhyDJvo8oIrieAqA0BJyC rmEhLVU3RAdqbuLnm+E4zgE9ghOWubRqDAvEiRBlk/Q8lUkaHzzkBWOQdhCp5YXwe7 IQUyzm4DgbkxA== Received: from sofa.misterjones.org ([185.219.108.64] helo=why.misterjones.org) by disco-boy.misterjones.org with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1nn2YN-009X4h-4G; Fri, 06 May 2022 19:19:47 +0100 Date: Fri, 06 May 2022 19:19:46 +0100 Message-ID: <87mtfu7ccd.wl-maz@kernel.org> From: Marc Zyngier To: Pali =?UTF-8?B?Um9ow6Fy?= Cc: Thomas Gleixner , Rob Herring , Bjorn Helgaas , Andrew Lunn , Gregory Clement , Sebastian Hesselbarth , Thomas Petazzoni , Lorenzo Pieralisi , Krzysztof =?UTF-8?B?V2lsY3p5xYRza2k=?= , Marek =?UTF-8?B?QmVow7pu?= , linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH 2/6] irqchip/armada-370-xp: Implement SoC Error interrupts In-Reply-To: <20220506134029.21470-3-pali@kernel.org> References: <20220506134029.21470-1-pali@kernel.org> <20220506134029.21470-3-pali@kernel.org> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL-LB/10.8 EasyPG/1.0.0 Emacs/27.1 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 185.219.108.64 X-SA-Exim-Rcpt-To: pali@kernel.org, tglx@linutronix.de, robh+dt@kernel.org, bhelgaas@google.com, andrew@lunn.ch, gregory.clement@bootlin.com, sebastian.hesselbarth@gmail.com, thomas.petazzoni@bootlin.com, lorenzo.pieralisi@arm.com, kw@linux.com, kabel@kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org On Fri, 06 May 2022 14:40:25 +0100, Pali Roh=C3=A1r wrote: >=20 > MPIC IRQ 4 is used as SoC Error Summary interrupt and provides access to > another hierarchy of SoC Error interrupts. Implement a new IRQ chip and > domain for accessing this IRQ hierarchy. >=20 > Signed-off-by: Pali Roh=C3=A1r > --- > drivers/irqchip/irq-armada-370-xp.c | 213 +++++++++++++++++++++++++++- > 1 file changed, 210 insertions(+), 3 deletions(-) >=20 > diff --git a/drivers/irqchip/irq-armada-370-xp.c b/drivers/irqchip/irq-ar= mada-370-xp.c > index ebd76ea1c69b..71578b65f5c8 100644 > --- a/drivers/irqchip/irq-armada-370-xp.c > +++ b/drivers/irqchip/irq-armada-370-xp.c > @@ -117,6 +117,8 @@ > /* Registers relative to main_int_base */ > #define ARMADA_370_XP_INT_CONTROL (0x00) > #define ARMADA_370_XP_SW_TRIG_INT_OFFS (0x04) > +#define ARMADA_370_XP_INT_SOC_ERR_0_CAUSE_OFFS (0x20) > +#define ARMADA_370_XP_INT_SOC_ERR_1_CAUSE_OFFS (0x24) > #define ARMADA_370_XP_INT_SET_ENABLE_OFFS (0x30) > #define ARMADA_370_XP_INT_CLEAR_ENABLE_OFFS (0x34) > #define ARMADA_370_XP_INT_SOURCE_CTL(irq) (0x100 + irq*4) > @@ -130,6 +132,8 @@ > #define ARMADA_370_XP_CPU_INTACK_OFFS (0x44) > #define ARMADA_370_XP_INT_SET_MASK_OFFS (0x48) > #define ARMADA_370_XP_INT_CLEAR_MASK_OFFS (0x4C) > +#define ARMADA_370_XP_INT_SOC_ERR_0_MASK_OFF (0x50) > +#define ARMADA_370_XP_INT_SOC_ERR_1_MASK_OFF (0x54) > #define ARMADA_370_XP_INT_FABRIC_MASK_OFFS (0x54) > #define ARMADA_370_XP_INT_CAUSE_PERF(cpu) (1 << cpu) > =20 > @@ -146,6 +150,8 @@ > static void __iomem *per_cpu_int_base; > static void __iomem *main_int_base; > static struct irq_domain *armada_370_xp_mpic_domain; > +static struct irq_domain *armada_370_xp_soc_err_domain; > +static unsigned int soc_err_irq_num_regs; > static u32 doorbell_mask_reg; > static int parent_irq; > #ifdef CONFIG_PCI_MSI > @@ -156,6 +162,8 @@ static DEFINE_MUTEX(msi_used_lock); > static phys_addr_t msi_doorbell_addr; > #endif > =20 > +static void armada_370_xp_soc_err_irq_unmask(struct irq_data *d); > + > static inline bool is_percpu_irq(irq_hw_number_t irq) > { > if (irq <=3D ARMADA_370_XP_MAX_PER_CPU_IRQS) > @@ -509,6 +517,27 @@ static void armada_xp_mpic_reenable_percpu(void) > armada_370_xp_irq_unmask(data); > } > =20 > + /* Re-enable per-CPU SoC Error interrupts that were enabled before susp= end */ > + for (irq =3D 0; irq < soc_err_irq_num_regs * 32; irq++) { > + struct irq_data *data; > + int virq; > + > + virq =3D irq_linear_revmap(armada_370_xp_soc_err_domain, irq); > + if (virq =3D=3D 0) > + continue; > + > + data =3D irq_get_irq_data(virq); > + > + if (!irq_percpu_is_enabled(virq)) > + continue; > + > + armada_370_xp_soc_err_irq_unmask(data); > + } So you do this loop and all these lookups, both here and in the resume function (duplicated code!) just to be able to call the unmask function? This would be better served by two straight writes of the mask register, which you'd conveniently save on suspend. Yes, you have only duplicated the existing logic. But surely there is something better to do. > + > + /* Unmask summary SoC Error Interrupt */ > + if (soc_err_irq_num_regs > 0) > + writel(4, per_cpu_int_base + ARMADA_370_XP_INT_CLEAR_MASK_OFFS); > + > ipi_resume(); > } > =20 > @@ -546,8 +575,8 @@ static struct irq_chip armada_370_xp_irq_chip =3D { > static int armada_370_xp_mpic_irq_map(struct irq_domain *h, > unsigned int virq, irq_hw_number_t hw) > { > - /* IRQs 0 and 1 cannot be mapped, they are handled internally */ > - if (hw <=3D 1) > + /* IRQs 0, 1 and 4 cannot be mapped, they are handled internally */ > + if (hw <=3D 1 || hw =3D=3D 4) > return -EINVAL; > =20 > armada_370_xp_irq_mask(irq_get_irq_data(virq)); > @@ -577,6 +606,99 @@ static const struct irq_domain_ops armada_370_xp_mpi= c_irq_ops =3D { > .xlate =3D irq_domain_xlate_onecell, > }; > =20 > +static DEFINE_RAW_SPINLOCK(armada_370_xp_soc_err_lock); > + > +static void armada_370_xp_soc_err_irq_mask(struct irq_data *d) > +{ > + irq_hw_number_t hwirq =3D irqd_to_hwirq(d); > + u32 reg, mask; > + > + reg =3D hwirq >=3D 32 ? ARMADA_370_XP_INT_SOC_ERR_1_MASK_OFF > + : ARMADA_370_XP_INT_SOC_ERR_0_MASK_OFF; > + > + raw_spin_lock(&armada_370_xp_soc_err_lock); > + mask =3D readl(per_cpu_int_base + reg); > + mask &=3D ~BIT(hwirq % 32); > + writel(mask, per_cpu_int_base + reg); > + raw_spin_unlock(&armada_370_xp_soc_err_lock); > +} > + > +static void armada_370_xp_soc_err_irq_unmask(struct irq_data *d) > +{ > + irq_hw_number_t hwirq =3D irqd_to_hwirq(d); > + u32 reg, mask; > + > + reg =3D hwirq >=3D 32 ? ARMADA_370_XP_INT_SOC_ERR_1_MASK_OFF > + : ARMADA_370_XP_INT_SOC_ERR_0_MASK_OFF; > + > + raw_spin_lock(&armada_370_xp_soc_err_lock); > + mask =3D readl(per_cpu_int_base + reg); > + mask |=3D BIT(hwirq % 32); > + writel(mask, per_cpu_int_base + reg); > + raw_spin_unlock(&armada_370_xp_soc_err_lock); > +} > + > +static int armada_370_xp_soc_err_irq_mask_on_cpu(void *par) > +{ > + struct irq_data *d =3D par; > + armada_370_xp_soc_err_irq_mask(d); > + return 0; > +} > + > +static int armada_370_xp_soc_err_irq_unmask_on_cpu(void *par) > +{ > + struct irq_data *d =3D par; > + armada_370_xp_soc_err_irq_unmask(d); > + return 0; > +} > + > +static int armada_xp_soc_err_irq_set_affinity(struct irq_data *d, > + const struct cpumask *mask, > + bool force) > +{ > + unsigned int cpu; > + > + cpus_read_lock(); > + > + /* First disable IRQ on all cores */ > + for_each_online_cpu(cpu) > + smp_call_on_cpu(cpu, armada_370_xp_soc_err_irq_mask_on_cpu, d, true); > + > + /* Select a single core from the affinity mask which is online */ > + cpu =3D cpumask_any_and(mask, cpu_online_mask); > + smp_call_on_cpu(cpu, armada_370_xp_soc_err_irq_unmask_on_cpu, d, true); > + > + cpus_read_unlock(); > + > + irq_data_update_effective_affinity(d, cpumask_of(cpu)); > + > + return IRQ_SET_MASK_OK; > +} Aren't these per-CPU interrupts anyway? What does it mean to set their affinity? /me rolls eyes... > + > +static struct irq_chip armada_370_xp_soc_err_irq_chip =3D { > + .name =3D "MPIC SOC", > + .irq_mask =3D armada_370_xp_soc_err_irq_mask, > + .irq_unmask =3D armada_370_xp_soc_err_irq_unmask, > + .irq_set_affinity =3D armada_xp_soc_err_irq_set_affinity, > +}; > + > +static int armada_370_xp_soc_err_irq_map(struct irq_domain *h, > + unsigned int virq, irq_hw_number_t hw) > +{ > + armada_370_xp_soc_err_irq_mask(irq_get_irq_data(virq)); > + irq_set_status_flags(virq, IRQ_LEVEL); > + irq_set_percpu_devid(virq); > + irq_set_chip_and_handler(virq, &armada_370_xp_soc_err_irq_chip, > + handle_percpu_devid_irq); > + irq_set_probe(virq); > + return 0; > +} > + > +static const struct irq_domain_ops armada_370_xp_soc_err_irq_ops =3D { > + .map =3D armada_370_xp_soc_err_irq_map, > + .xlate =3D irq_domain_xlate_onecell, > +}; > + > #ifdef CONFIG_PCI_MSI > static void armada_370_xp_handle_msi_irq(struct pt_regs *regs, bool is_c= hained) > { > @@ -605,6 +727,32 @@ static void armada_370_xp_handle_msi_irq(struct pt_r= egs *regs, bool is_chained) > static void armada_370_xp_handle_msi_irq(struct pt_regs *r, bool b) {} > #endif > =20 > +static void armada_370_xp_handle_soc_err_irq(void) > +{ > + unsigned long status, bit; > + u32 mask, cause; > + > + if (soc_err_irq_num_regs < 1) > + return; > + > + mask =3D readl(per_cpu_int_base + ARMADA_370_XP_INT_SOC_ERR_0_MASK_OFF); > + cause =3D readl(main_int_base + ARMADA_370_XP_INT_SOC_ERR_0_CAUSE_OFFS); > + status =3D cause & mask; > + > + for_each_set_bit(bit, &status, 32) > + generic_handle_domain_irq(armada_370_xp_soc_err_domain, bit); > + > + if (soc_err_irq_num_regs < 2) > + return; > + > + mask =3D readl(per_cpu_int_base + ARMADA_370_XP_INT_SOC_ERR_1_MASK_OFF); > + cause =3D readl(main_int_base + ARMADA_370_XP_INT_SOC_ERR_1_CAUSE_OFFS); > + status =3D cause & mask; > + > + for_each_set_bit(bit, &status, 32) > + generic_handle_domain_irq(armada_370_xp_soc_err_domain, bit + 32); > +} > + > static void armada_370_xp_mpic_handle_cascade_irq(struct irq_desc *desc) > { > struct irq_chip *chip =3D irq_desc_get_chip(desc); > @@ -630,6 +778,11 @@ static void armada_370_xp_mpic_handle_cascade_irq(st= ruct irq_desc *desc) > continue; > } > =20 > + if (irqn =3D=3D 4) { > + armada_370_xp_handle_soc_err_irq(); > + continue; > + } > + > generic_handle_domain_irq(armada_370_xp_mpic_domain, irqn); > } > =20 > @@ -649,7 +802,7 @@ armada_370_xp_handle_irq(struct pt_regs *regs) > if (irqnr > 1022) > break; > =20 > - if (irqnr > 1) { > + if (irqnr > 1 && irqnr !=3D 4) { > generic_handle_domain_irq(armada_370_xp_mpic_domain, > irqnr); > continue; > @@ -659,6 +812,10 @@ armada_370_xp_handle_irq(struct pt_regs *regs) > if (irqnr =3D=3D 1) > armada_370_xp_handle_msi_irq(regs, false); > =20 > + /* SoC Error handling */ > + if (irqnr =3D=3D 4) > + armada_370_xp_handle_soc_err_irq(); > + > #ifdef CONFIG_SMP > /* IPI Handling */ > if (irqnr =3D=3D 0) { > @@ -722,6 +879,26 @@ static void armada_370_xp_mpic_resume(void) > } > } > =20 > + /* Re-enable per-CPU SoC Error interrupts */ > + for (irq =3D 0; irq < soc_err_irq_num_regs * 32; irq++) { > + struct irq_data *data; > + int virq; > + > + virq =3D irq_linear_revmap(armada_370_xp_soc_err_domain, irq); > + if (virq =3D=3D 0) > + continue; > + > + data =3D irq_get_irq_data(virq); > + > + /* > + * Re-enable on the current CPU, > + * armada_xp_mpic_reenable_percpu() will take > + * care of secondary CPUs when they come up. > + */ > + if (irq_percpu_is_enabled(virq)) > + armada_370_xp_soc_err_irq_unmask(data); > + } As I said above, this is duplicated code that should be replaced with a simple write to the corresponding MMIO registers. > + > /* Reconfigure doorbells for IPIs and MSIs */ > writel(doorbell_mask_reg, > per_cpu_int_base + ARMADA_370_XP_IN_DRBEL_MSK_OFFS); > @@ -730,6 +907,10 @@ static void armada_370_xp_mpic_resume(void) > if (doorbell_mask_reg & PCI_MSI_DOORBELL_MASK) > writel(1, per_cpu_int_base + ARMADA_370_XP_INT_CLEAR_MASK_OFFS); > =20 > + /* Unmask summary SoC Error Interrupt */ > + if (soc_err_irq_num_regs > 0) > + writel(4, per_cpu_int_base + ARMADA_370_XP_INT_CLEAR_MASK_OFFS); Magic value? Also, writing to this register tends to indicate that the whole thing should really be a chained irqchip... Maybe that's overkill in this instance, but the whole thing is rather oddly architected. > + > ipi_resume(); > } > =20 > @@ -742,6 +923,7 @@ static int __init armada_370_xp_mpic_of_init(struct d= evice_node *node, > struct device_node *parent) > { > struct resource main_int_res, per_cpu_int_res; > + struct device_node *soc_err_node; > int nr_irqs, i; > u32 control; > =20 > @@ -775,12 +957,37 @@ static int __init armada_370_xp_mpic_of_init(struct= device_node *node, > BUG_ON(!armada_370_xp_mpic_domain); > irq_domain_update_bus_token(armada_370_xp_mpic_domain, DOMAIN_BUS_WIRED= ); > =20 > + soc_err_node =3D of_get_next_child(node, NULL); > + if (!soc_err_node) { > + pr_warn("Missing SoC Error Interrupt Controller node\n"); > + pr_warn("Extended interrupts are not supported\n"); > + } else { > + pr_info("Registering MPIC SoC Error Interrupt Controller\n"); > + /* > + * Armada 370 and XP have only 32 SoC Error IRQs in one register > + * and other Armada platforms have 64 IRQs in two registers. > + */ > + soc_err_irq_num_regs =3D > + of_machine_is_compatible("marvell,armada-370-xp") ? 1 : 2; Don't you have an actual compatible string for the interrupt controller? It seems odd to rely on the SoC name. > + armada_370_xp_soc_err_domain =3D > + irq_domain_add_hierarchy(armada_370_xp_mpic_domain, 0, > + soc_err_irq_num_regs * 32, > + soc_err_node, > + &armada_370_xp_soc_err_irq_ops, > + NULL); > + BUG_ON(!armada_370_xp_soc_err_domain); > + } > + > /* Setup for the boot CPU */ > armada_xp_mpic_perf_init(); > armada_xp_mpic_smp_cpu_init(); > =20 > armada_370_xp_msi_init(node, main_int_res.start); > =20 > + /* Unmask summary SoC Error Interrupt */ > + if (soc_err_irq_num_regs > 0) > + writel(4, per_cpu_int_base + ARMADA_370_XP_INT_CLEAR_MASK_OFFS); > + Magic value, duplicated this time? > parent_irq =3D irq_of_parse_and_map(node, 0); > if (parent_irq <=3D 0) { > irq_set_default_host(armada_370_xp_mpic_domain); > --=20 > 2.20.1 >=20 >=20 M. --=20 Without deviation from the norm, progress is not possible. From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 726F1C433EF for ; Fri, 6 May 2022 18:21:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Subject:Cc:To:From:Message-ID:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=JWzlO/rviRNw+DJyMtzSl5S9JP3AUKnq22jRzcBGJTk=; b=jDed1bJFDM764B e1LPH/U4R2JuXyaM7kvL2RMpTV2CwykV2+QM7tnfdEaWz0iDaiien/sCOKMsaVJOgXigJoTj2+lgj nUUIWtjLLesl8z58kIc3WNYjmhLubY2POt81nXEz22SkGzSWh13KlxBWiQkAcgMVRtWzb/KRlzh2o W3KtjIwsggjYclBoMhbCDo4UTCEvNeYFojp/GfZJF9BW4sfADC4zoXUZ/e5c9FL73jK0ep1GDI6ge LMrq6411BIRuVNXcHIqRvplEu4d4ix+WUA4CkcWUkj+2A/eovergtBFOoVctCEAeIG/y/GyYIZsxv lnsZUjavCm4dC9b7HGKA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nn2YW-004fi0-Ro; Fri, 06 May 2022 18:19:56 +0000 Received: from ams.source.kernel.org ([145.40.68.75]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nn2YS-004fgM-Qv for linux-arm-kernel@lists.infradead.org; Fri, 06 May 2022 18:19:55 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 3DED6B83736; Fri, 6 May 2022 18:19:51 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id AB7BCC385A9; Fri, 6 May 2022 18:19:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1651861189; bh=F8OZZkP2VCHLM+mFrp5QDGv1xHS8ckfdGAQvYzcVY7Y=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=CxFcRt2W8R/2CfHJ1kJIK6DpbkFRyRblymXIh7LUrOVMd5W11l1shKAC2BQG8nG8G QQupTw66h7pCGhAEjkpyG42MlPdQnclc1sSudXsVzmIRyOOd8FjgsVGmRRWWV+QUma rD4pdd+8ByoVzetqrxsKMaITP6PijA8lofpp9xr/wRlhC1gXGSeefovRsyUk65Wcva /IMS8efd5u+f/saSw8uISjQPWH0nyeD+eetTf5XMBXb5UzhyDJvo8oIrieAqA0BJyC rmEhLVU3RAdqbuLnm+E4zgE9ghOWubRqDAvEiRBlk/Q8lUkaHzzkBWOQdhCp5YXwe7 IQUyzm4DgbkxA== Received: from sofa.misterjones.org ([185.219.108.64] helo=why.misterjones.org) by disco-boy.misterjones.org with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1nn2YN-009X4h-4G; Fri, 06 May 2022 19:19:47 +0100 Date: Fri, 06 May 2022 19:19:46 +0100 Message-ID: <87mtfu7ccd.wl-maz@kernel.org> From: Marc Zyngier To: Pali =?UTF-8?B?Um9ow6Fy?= Cc: Thomas Gleixner , Rob Herring , Bjorn Helgaas , Andrew Lunn , Gregory Clement , Sebastian Hesselbarth , Thomas Petazzoni , Lorenzo Pieralisi , Krzysztof =?UTF-8?B?V2lsY3p5xYRza2k=?= , Marek =?UTF-8?B?QmVow7pu?= , linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH 2/6] irqchip/armada-370-xp: Implement SoC Error interrupts In-Reply-To: <20220506134029.21470-3-pali@kernel.org> References: <20220506134029.21470-1-pali@kernel.org> <20220506134029.21470-3-pali@kernel.org> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL-LB/10.8 EasyPG/1.0.0 Emacs/27.1 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") X-SA-Exim-Connect-IP: 185.219.108.64 X-SA-Exim-Rcpt-To: pali@kernel.org, tglx@linutronix.de, robh+dt@kernel.org, bhelgaas@google.com, andrew@lunn.ch, gregory.clement@bootlin.com, sebastian.hesselbarth@gmail.com, thomas.petazzoni@bootlin.com, lorenzo.pieralisi@arm.com, kw@linux.com, kabel@kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220506_111953_203659_BB59F6CC X-CRM114-Status: GOOD ( 44.03 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gRnJpLCAwNiBNYXkgMjAyMiAxNDo0MDoyNSArMDEwMCwKUGFsaSBSb2jDoXIgPHBhbGlAa2Vy bmVsLm9yZz4gd3JvdGU6Cj4gCj4gTVBJQyBJUlEgNCBpcyB1c2VkIGFzIFNvQyBFcnJvciBTdW1t YXJ5IGludGVycnVwdCBhbmQgcHJvdmlkZXMgYWNjZXNzIHRvCj4gYW5vdGhlciBoaWVyYXJjaHkg b2YgU29DIEVycm9yIGludGVycnVwdHMuIEltcGxlbWVudCBhIG5ldyBJUlEgY2hpcCBhbmQKPiBk b21haW4gZm9yIGFjY2Vzc2luZyB0aGlzIElSUSBoaWVyYXJjaHkuCj4gCj4gU2lnbmVkLW9mZi1i eTogUGFsaSBSb2jDoXIgPHBhbGlAa2VybmVsLm9yZz4KPiAtLS0KPiAgZHJpdmVycy9pcnFjaGlw L2lycS1hcm1hZGEtMzcwLXhwLmMgfCAyMTMgKysrKysrKysrKysrKysrKysrKysrKysrKysrLQo+ ICAxIGZpbGUgY2hhbmdlZCwgMjEwIGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCj4gCj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtYXJtYWRhLTM3MC14cC5jIGIvZHJpdmVy cy9pcnFjaGlwL2lycS1hcm1hZGEtMzcwLXhwLmMKPiBpbmRleCBlYmQ3NmVhMWM2OWIuLjcxNTc4 YjY1ZjVjOCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLWFybWFkYS0zNzAteHAu Ywo+ICsrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtYXJtYWRhLTM3MC14cC5jCj4gQEAgLTExNyw2 ICsxMTcsOCBAQAo+ICAvKiBSZWdpc3RlcnMgcmVsYXRpdmUgdG8gbWFpbl9pbnRfYmFzZSAqLwo+ ICAjZGVmaW5lIEFSTUFEQV8zNzBfWFBfSU5UX0NPTlRST0wJCSgweDAwKQo+ICAjZGVmaW5lIEFS TUFEQV8zNzBfWFBfU1dfVFJJR19JTlRfT0ZGUwkJKDB4MDQpCj4gKyNkZWZpbmUgQVJNQURBXzM3 MF9YUF9JTlRfU09DX0VSUl8wX0NBVVNFX09GRlMJKDB4MjApCj4gKyNkZWZpbmUgQVJNQURBXzM3 MF9YUF9JTlRfU09DX0VSUl8xX0NBVVNFX09GRlMJKDB4MjQpCj4gICNkZWZpbmUgQVJNQURBXzM3 MF9YUF9JTlRfU0VUX0VOQUJMRV9PRkZTCSgweDMwKQo+ICAjZGVmaW5lIEFSTUFEQV8zNzBfWFBf SU5UX0NMRUFSX0VOQUJMRV9PRkZTCSgweDM0KQo+ICAjZGVmaW5lIEFSTUFEQV8zNzBfWFBfSU5U X1NPVVJDRV9DVEwoaXJxKQkoMHgxMDAgKyBpcnEqNCkKPiBAQCAtMTMwLDYgKzEzMiw4IEBACj4g ICNkZWZpbmUgQVJNQURBXzM3MF9YUF9DUFVfSU5UQUNLX09GRlMJCSgweDQ0KQo+ICAjZGVmaW5l IEFSTUFEQV8zNzBfWFBfSU5UX1NFVF9NQVNLX09GRlMJCSgweDQ4KQo+ICAjZGVmaW5lIEFSTUFE QV8zNzBfWFBfSU5UX0NMRUFSX01BU0tfT0ZGUwkoMHg0QykKPiArI2RlZmluZSBBUk1BREFfMzcw X1hQX0lOVF9TT0NfRVJSXzBfTUFTS19PRkYJKDB4NTApCj4gKyNkZWZpbmUgQVJNQURBXzM3MF9Y UF9JTlRfU09DX0VSUl8xX01BU0tfT0ZGCSgweDU0KQo+ICAjZGVmaW5lIEFSTUFEQV8zNzBfWFBf SU5UX0ZBQlJJQ19NQVNLX09GRlMJKDB4NTQpCj4gICNkZWZpbmUgQVJNQURBXzM3MF9YUF9JTlRf Q0FVU0VfUEVSRihjcHUpCSgxIDw8IGNwdSkKPiAgCj4gQEAgLTE0Niw2ICsxNTAsOCBAQAo+ICBz dGF0aWMgdm9pZCBfX2lvbWVtICpwZXJfY3B1X2ludF9iYXNlOwo+ICBzdGF0aWMgdm9pZCBfX2lv bWVtICptYWluX2ludF9iYXNlOwo+ICBzdGF0aWMgc3RydWN0IGlycV9kb21haW4gKmFybWFkYV8z NzBfeHBfbXBpY19kb21haW47Cj4gK3N0YXRpYyBzdHJ1Y3QgaXJxX2RvbWFpbiAqYXJtYWRhXzM3 MF94cF9zb2NfZXJyX2RvbWFpbjsKPiArc3RhdGljIHVuc2lnbmVkIGludCBzb2NfZXJyX2lycV9u dW1fcmVnczsKPiAgc3RhdGljIHUzMiBkb29yYmVsbF9tYXNrX3JlZzsKPiAgc3RhdGljIGludCBw YXJlbnRfaXJxOwo+ICAjaWZkZWYgQ09ORklHX1BDSV9NU0kKPiBAQCAtMTU2LDYgKzE2Miw4IEBA IHN0YXRpYyBERUZJTkVfTVVURVgobXNpX3VzZWRfbG9jayk7Cj4gIHN0YXRpYyBwaHlzX2FkZHJf dCBtc2lfZG9vcmJlbGxfYWRkcjsKPiAgI2VuZGlmCj4gIAo+ICtzdGF0aWMgdm9pZCBhcm1hZGFf MzcwX3hwX3NvY19lcnJfaXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpOwo+ICsKPiAgc3Rh dGljIGlubGluZSBib29sIGlzX3BlcmNwdV9pcnEoaXJxX2h3X251bWJlcl90IGlycSkKPiAgewo+ ICAJaWYgKGlycSA8PSBBUk1BREFfMzcwX1hQX01BWF9QRVJfQ1BVX0lSUVMpCj4gQEAgLTUwOSw2 ICs1MTcsMjcgQEAgc3RhdGljIHZvaWQgYXJtYWRhX3hwX21waWNfcmVlbmFibGVfcGVyY3B1KHZv aWQpCj4gIAkJYXJtYWRhXzM3MF94cF9pcnFfdW5tYXNrKGRhdGEpOwo+ICAJfQo+ICAKPiArCS8q IFJlLWVuYWJsZSBwZXItQ1BVIFNvQyBFcnJvciBpbnRlcnJ1cHRzIHRoYXQgd2VyZSBlbmFibGVk IGJlZm9yZSBzdXNwZW5kICovCj4gKwlmb3IgKGlycSA9IDA7IGlycSA8IHNvY19lcnJfaXJxX251 bV9yZWdzICogMzI7IGlycSsrKSB7Cj4gKwkJc3RydWN0IGlycV9kYXRhICpkYXRhOwo+ICsJCWlu dCB2aXJxOwo+ICsKPiArCQl2aXJxID0gaXJxX2xpbmVhcl9yZXZtYXAoYXJtYWRhXzM3MF94cF9z b2NfZXJyX2RvbWFpbiwgaXJxKTsKPiArCQlpZiAodmlycSA9PSAwKQo+ICsJCQljb250aW51ZTsK PiArCj4gKwkJZGF0YSA9IGlycV9nZXRfaXJxX2RhdGEodmlycSk7Cj4gKwo+ICsJCWlmICghaXJx X3BlcmNwdV9pc19lbmFibGVkKHZpcnEpKQo+ICsJCQljb250aW51ZTsKPiArCj4gKwkJYXJtYWRh XzM3MF94cF9zb2NfZXJyX2lycV91bm1hc2soZGF0YSk7Cj4gKwl9CgpTbyB5b3UgZG8gdGhpcyBs b29wIGFuZCBhbGwgdGhlc2UgbG9va3VwcywgYm90aCBoZXJlIGFuZCBpbiB0aGUgcmVzdW1lCmZ1 bmN0aW9uIChkdXBsaWNhdGVkIGNvZGUhKSBqdXN0IHRvIGJlIGFibGUgdG8gY2FsbCB0aGUgdW5t YXNrCmZ1bmN0aW9uPyAgVGhpcyB3b3VsZCBiZSBiZXR0ZXIgc2VydmVkIGJ5IHR3byBzdHJhaWdo dCB3cml0ZXMgb2YgdGhlCm1hc2sgcmVnaXN0ZXIsIHdoaWNoIHlvdSdkIGNvbnZlbmllbnRseSBz YXZlIG9uIHN1c3BlbmQuCgpZZXMsIHlvdSBoYXZlIG9ubHkgZHVwbGljYXRlZCB0aGUgZXhpc3Rp bmcgbG9naWMuIEJ1dCBzdXJlbHkgdGhlcmUgaXMKc29tZXRoaW5nIGJldHRlciB0byBkby4KCj4g Kwo+ICsJLyogVW5tYXNrIHN1bW1hcnkgU29DIEVycm9yIEludGVycnVwdCAqLwo+ICsJaWYgKHNv Y19lcnJfaXJxX251bV9yZWdzID4gMCkKPiArCQl3cml0ZWwoNCwgcGVyX2NwdV9pbnRfYmFzZSAr IEFSTUFEQV8zNzBfWFBfSU5UX0NMRUFSX01BU0tfT0ZGUyk7Cj4gKwo+ICAJaXBpX3Jlc3VtZSgp Owo+ICB9Cj4gIAo+IEBAIC01NDYsOCArNTc1LDggQEAgc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBh cm1hZGFfMzcwX3hwX2lycV9jaGlwID0gewo+ICBzdGF0aWMgaW50IGFybWFkYV8zNzBfeHBfbXBp Y19pcnFfbWFwKHN0cnVjdCBpcnFfZG9tYWluICpoLAo+ICAJCQkJICAgICAgdW5zaWduZWQgaW50 IHZpcnEsIGlycV9od19udW1iZXJfdCBodykKPiAgewo+IC0JLyogSVJRcyAwIGFuZCAxIGNhbm5v dCBiZSBtYXBwZWQsIHRoZXkgYXJlIGhhbmRsZWQgaW50ZXJuYWxseSAqLwo+IC0JaWYgKGh3IDw9 IDEpCj4gKwkvKiBJUlFzIDAsIDEgYW5kIDQgY2Fubm90IGJlIG1hcHBlZCwgdGhleSBhcmUgaGFu ZGxlZCBpbnRlcm5hbGx5ICovCj4gKwlpZiAoaHcgPD0gMSB8fCBodyA9PSA0KQo+ICAJCXJldHVy biAtRUlOVkFMOwo+ICAKPiAgCWFybWFkYV8zNzBfeHBfaXJxX21hc2soaXJxX2dldF9pcnFfZGF0 YSh2aXJxKSk7Cj4gQEAgLTU3Nyw2ICs2MDYsOTkgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBpcnFf ZG9tYWluX29wcyBhcm1hZGFfMzcwX3hwX21waWNfaXJxX29wcyA9IHsKPiAgCS54bGF0ZSA9IGly cV9kb21haW5feGxhdGVfb25lY2VsbCwKPiAgfTsKPiAgCj4gK3N0YXRpYyBERUZJTkVfUkFXX1NQ SU5MT0NLKGFybWFkYV8zNzBfeHBfc29jX2Vycl9sb2NrKTsKPiArCj4gK3N0YXRpYyB2b2lkIGFy bWFkYV8zNzBfeHBfc29jX2Vycl9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCj4gK3sKPiAr CWlycV9od19udW1iZXJfdCBod2lycSA9IGlycWRfdG9faHdpcnEoZCk7Cj4gKwl1MzIgcmVnLCBt YXNrOwo+ICsKPiArCXJlZyA9IGh3aXJxID49IDMyID8gQVJNQURBXzM3MF9YUF9JTlRfU09DX0VS Ul8xX01BU0tfT0ZGCj4gKwkJCSAgOiBBUk1BREFfMzcwX1hQX0lOVF9TT0NfRVJSXzBfTUFTS19P RkY7Cj4gKwo+ICsJcmF3X3NwaW5fbG9jaygmYXJtYWRhXzM3MF94cF9zb2NfZXJyX2xvY2spOwo+ ICsJbWFzayA9IHJlYWRsKHBlcl9jcHVfaW50X2Jhc2UgKyByZWcpOwo+ICsJbWFzayAmPSB+QklU KGh3aXJxICUgMzIpOwo+ICsJd3JpdGVsKG1hc2ssIHBlcl9jcHVfaW50X2Jhc2UgKyByZWcpOwo+ ICsJcmF3X3NwaW5fdW5sb2NrKCZhcm1hZGFfMzcwX3hwX3NvY19lcnJfbG9jayk7Cj4gK30KPiAr Cj4gK3N0YXRpYyB2b2lkIGFybWFkYV8zNzBfeHBfc29jX2Vycl9pcnFfdW5tYXNrKHN0cnVjdCBp cnFfZGF0YSAqZCkKPiArewo+ICsJaXJxX2h3X251bWJlcl90IGh3aXJxID0gaXJxZF90b19od2ly cShkKTsKPiArCXUzMiByZWcsIG1hc2s7Cj4gKwo+ICsJcmVnID0gaHdpcnEgPj0gMzIgPyBBUk1B REFfMzcwX1hQX0lOVF9TT0NfRVJSXzFfTUFTS19PRkYKPiArCQkJICA6IEFSTUFEQV8zNzBfWFBf SU5UX1NPQ19FUlJfMF9NQVNLX09GRjsKPiArCj4gKwlyYXdfc3Bpbl9sb2NrKCZhcm1hZGFfMzcw X3hwX3NvY19lcnJfbG9jayk7Cj4gKwltYXNrID0gcmVhZGwocGVyX2NwdV9pbnRfYmFzZSArIHJl Zyk7Cj4gKwltYXNrIHw9IEJJVChod2lycSAlIDMyKTsKPiArCXdyaXRlbChtYXNrLCBwZXJfY3B1 X2ludF9iYXNlICsgcmVnKTsKPiArCXJhd19zcGluX3VubG9jaygmYXJtYWRhXzM3MF94cF9zb2Nf ZXJyX2xvY2spOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGFybWFkYV8zNzBfeHBfc29jX2Vycl9p cnFfbWFza19vbl9jcHUodm9pZCAqcGFyKQo+ICt7Cj4gKwlzdHJ1Y3QgaXJxX2RhdGEgKmQgPSBw YXI7Cj4gKwlhcm1hZGFfMzcwX3hwX3NvY19lcnJfaXJxX21hc2soZCk7Cj4gKwlyZXR1cm4gMDsK PiArfQo+ICsKPiArc3RhdGljIGludCBhcm1hZGFfMzcwX3hwX3NvY19lcnJfaXJxX3VubWFza19v bl9jcHUodm9pZCAqcGFyKQo+ICt7Cj4gKwlzdHJ1Y3QgaXJxX2RhdGEgKmQgPSBwYXI7Cj4gKwlh cm1hZGFfMzcwX3hwX3NvY19lcnJfaXJxX3VubWFzayhkKTsKPiArCXJldHVybiAwOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgaW50IGFybWFkYV94cF9zb2NfZXJyX2lycV9zZXRfYWZmaW5pdHkoc3RydWN0 IGlycV9kYXRhICpkLAo+ICsJCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLAo+ ICsJCQkJCSAgICAgIGJvb2wgZm9yY2UpCj4gK3sKPiArCXVuc2lnbmVkIGludCBjcHU7Cj4gKwo+ ICsJY3B1c19yZWFkX2xvY2soKTsKPiArCj4gKwkvKiBGaXJzdCBkaXNhYmxlIElSUSBvbiBhbGwg Y29yZXMgKi8KPiArCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQo+ICsJCXNtcF9jYWxsX29uX2Nw dShjcHUsIGFybWFkYV8zNzBfeHBfc29jX2Vycl9pcnFfbWFza19vbl9jcHUsIGQsIHRydWUpOwo+ ICsKPiArCS8qIFNlbGVjdCBhIHNpbmdsZSBjb3JlIGZyb20gdGhlIGFmZmluaXR5IG1hc2sgd2hp Y2ggaXMgb25saW5lICovCj4gKwljcHUgPSBjcHVtYXNrX2FueV9hbmQobWFzaywgY3B1X29ubGlu ZV9tYXNrKTsKPiArCXNtcF9jYWxsX29uX2NwdShjcHUsIGFybWFkYV8zNzBfeHBfc29jX2Vycl9p cnFfdW5tYXNrX29uX2NwdSwgZCwgdHJ1ZSk7Cj4gKwo+ICsJY3B1c19yZWFkX3VubG9jaygpOwo+ ICsKPiArCWlycV9kYXRhX3VwZGF0ZV9lZmZlY3RpdmVfYWZmaW5pdHkoZCwgY3B1bWFza19vZihj cHUpKTsKPiArCj4gKwlyZXR1cm4gSVJRX1NFVF9NQVNLX09LOwo+ICt9CgpBcmVuJ3QgdGhlc2Ug cGVyLUNQVSBpbnRlcnJ1cHRzIGFueXdheT8gV2hhdCBkb2VzIGl0IG1lYW4gdG8gc2V0IHRoZWly CmFmZmluaXR5PyAvbWUgcm9sbHMgZXllcy4uLgoKPiArCj4gK3N0YXRpYyBzdHJ1Y3QgaXJxX2No aXAgYXJtYWRhXzM3MF94cF9zb2NfZXJyX2lycV9jaGlwID0gewo+ICsJLm5hbWUgPSAiTVBJQyBT T0MiLAo+ICsJLmlycV9tYXNrID0gYXJtYWRhXzM3MF94cF9zb2NfZXJyX2lycV9tYXNrLAo+ICsJ LmlycV91bm1hc2sgPSBhcm1hZGFfMzcwX3hwX3NvY19lcnJfaXJxX3VubWFzaywKPiArCS5pcnFf c2V0X2FmZmluaXR5ID0gYXJtYWRhX3hwX3NvY19lcnJfaXJxX3NldF9hZmZpbml0eSwKPiArfTsK PiArCj4gK3N0YXRpYyBpbnQgYXJtYWRhXzM3MF94cF9zb2NfZXJyX2lycV9tYXAoc3RydWN0IGly cV9kb21haW4gKmgsCj4gKwkJCQkJIHVuc2lnbmVkIGludCB2aXJxLCBpcnFfaHdfbnVtYmVyX3Qg aHcpCj4gK3sKPiArCWFybWFkYV8zNzBfeHBfc29jX2Vycl9pcnFfbWFzayhpcnFfZ2V0X2lycV9k YXRhKHZpcnEpKTsKPiArCWlycV9zZXRfc3RhdHVzX2ZsYWdzKHZpcnEsIElSUV9MRVZFTCk7Cj4g KwlpcnFfc2V0X3BlcmNwdV9kZXZpZCh2aXJxKTsKPiArCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxl cih2aXJxLCAmYXJtYWRhXzM3MF94cF9zb2NfZXJyX2lycV9jaGlwLAo+ICsJCQkJIGhhbmRsZV9w ZXJjcHVfZGV2aWRfaXJxKTsKPiArCWlycV9zZXRfcHJvYmUodmlycSk7Cj4gKwlyZXR1cm4gMDsK PiArfQo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBpcnFfZG9tYWluX29wcyBhcm1hZGFfMzcw X3hwX3NvY19lcnJfaXJxX29wcyA9IHsKPiArCS5tYXAgPSBhcm1hZGFfMzcwX3hwX3NvY19lcnJf aXJxX21hcCwKPiArCS54bGF0ZSA9IGlycV9kb21haW5feGxhdGVfb25lY2VsbCwKPiArfTsKPiAr Cj4gICNpZmRlZiBDT05GSUdfUENJX01TSQo+ICBzdGF0aWMgdm9pZCBhcm1hZGFfMzcwX3hwX2hh bmRsZV9tc2lfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBib29sIGlzX2NoYWluZWQpCj4gIHsK PiBAQCAtNjA1LDYgKzcyNywzMiBAQCBzdGF0aWMgdm9pZCBhcm1hZGFfMzcwX3hwX2hhbmRsZV9t c2lfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBib29sIGlzX2NoYWluZWQpCj4gIHN0YXRpYyB2 b2lkIGFybWFkYV8zNzBfeHBfaGFuZGxlX21zaV9pcnEoc3RydWN0IHB0X3JlZ3MgKnIsIGJvb2wg Yikge30KPiAgI2VuZGlmCj4gIAo+ICtzdGF0aWMgdm9pZCBhcm1hZGFfMzcwX3hwX2hhbmRsZV9z b2NfZXJyX2lycSh2b2lkKQo+ICt7Cj4gKwl1bnNpZ25lZCBsb25nIHN0YXR1cywgYml0Owo+ICsJ dTMyIG1hc2ssIGNhdXNlOwo+ICsKPiArCWlmIChzb2NfZXJyX2lycV9udW1fcmVncyA8IDEpCj4g KwkJcmV0dXJuOwo+ICsKPiArCW1hc2sgPSByZWFkbChwZXJfY3B1X2ludF9iYXNlICsgQVJNQURB XzM3MF9YUF9JTlRfU09DX0VSUl8wX01BU0tfT0ZGKTsKPiArCWNhdXNlID0gcmVhZGwobWFpbl9p bnRfYmFzZSArIEFSTUFEQV8zNzBfWFBfSU5UX1NPQ19FUlJfMF9DQVVTRV9PRkZTKTsKPiArCXN0 YXR1cyA9IGNhdXNlICYgbWFzazsKPiArCj4gKwlmb3JfZWFjaF9zZXRfYml0KGJpdCwgJnN0YXR1 cywgMzIpCj4gKwkJZ2VuZXJpY19oYW5kbGVfZG9tYWluX2lycShhcm1hZGFfMzcwX3hwX3NvY19l cnJfZG9tYWluLCBiaXQpOwo+ICsKPiArCWlmIChzb2NfZXJyX2lycV9udW1fcmVncyA8IDIpCj4g KwkJcmV0dXJuOwo+ICsKPiArCW1hc2sgPSByZWFkbChwZXJfY3B1X2ludF9iYXNlICsgQVJNQURB XzM3MF9YUF9JTlRfU09DX0VSUl8xX01BU0tfT0ZGKTsKPiArCWNhdXNlID0gcmVhZGwobWFpbl9p bnRfYmFzZSArIEFSTUFEQV8zNzBfWFBfSU5UX1NPQ19FUlJfMV9DQVVTRV9PRkZTKTsKPiArCXN0 YXR1cyA9IGNhdXNlICYgbWFzazsKPiArCj4gKwlmb3JfZWFjaF9zZXRfYml0KGJpdCwgJnN0YXR1 cywgMzIpCj4gKwkJZ2VuZXJpY19oYW5kbGVfZG9tYWluX2lycShhcm1hZGFfMzcwX3hwX3NvY19l cnJfZG9tYWluLCBiaXQgKyAzMik7Cj4gK30KPiArCj4gIHN0YXRpYyB2b2lkIGFybWFkYV8zNzBf eHBfbXBpY19oYW5kbGVfY2FzY2FkZV9pcnEoc3RydWN0IGlycV9kZXNjICpkZXNjKQo+ICB7Cj4g IAlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZGVzY19nZXRfY2hpcChkZXNjKTsKPiBAQCAt NjMwLDYgKzc3OCwxMSBAQCBzdGF0aWMgdm9pZCBhcm1hZGFfMzcwX3hwX21waWNfaGFuZGxlX2Nh c2NhZGVfaXJxKHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKPiAgCQkJY29udGludWU7Cj4gIAkJfQo+ ICAKPiArCQlpZiAoaXJxbiA9PSA0KSB7Cj4gKwkJCWFybWFkYV8zNzBfeHBfaGFuZGxlX3NvY19l cnJfaXJxKCk7Cj4gKwkJCWNvbnRpbnVlOwo+ICsJCX0KPiArCj4gIAkJZ2VuZXJpY19oYW5kbGVf ZG9tYWluX2lycShhcm1hZGFfMzcwX3hwX21waWNfZG9tYWluLCBpcnFuKTsKPiAgCX0KPiAgCj4g QEAgLTY0OSw3ICs4MDIsNyBAQCBhcm1hZGFfMzcwX3hwX2hhbmRsZV9pcnEoc3RydWN0IHB0X3Jl Z3MgKnJlZ3MpCj4gIAkJaWYgKGlycW5yID4gMTAyMikKPiAgCQkJYnJlYWs7Cj4gIAo+IC0JCWlm IChpcnFuciA+IDEpIHsKPiArCQlpZiAoaXJxbnIgPiAxICYmIGlycW5yICE9IDQpIHsKPiAgCQkJ Z2VuZXJpY19oYW5kbGVfZG9tYWluX2lycShhcm1hZGFfMzcwX3hwX21waWNfZG9tYWluLAo+ICAJ CQkJCQkgIGlycW5yKTsKPiAgCQkJY29udGludWU7Cj4gQEAgLTY1OSw2ICs4MTIsMTAgQEAgYXJt YWRhXzM3MF94cF9oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQo+ICAJCWlmIChpcnFu ciA9PSAxKQo+ICAJCQlhcm1hZGFfMzcwX3hwX2hhbmRsZV9tc2lfaXJxKHJlZ3MsIGZhbHNlKTsK PiAgCj4gKwkJLyogU29DIEVycm9yIGhhbmRsaW5nICovCj4gKwkJaWYgKGlycW5yID09IDQpCj4g KwkJCWFybWFkYV8zNzBfeHBfaGFuZGxlX3NvY19lcnJfaXJxKCk7Cj4gKwo+ICAjaWZkZWYgQ09O RklHX1NNUAo+ICAJCS8qIElQSSBIYW5kbGluZyAqLwo+ICAJCWlmIChpcnFuciA9PSAwKSB7Cj4g QEAgLTcyMiw2ICs4NzksMjYgQEAgc3RhdGljIHZvaWQgYXJtYWRhXzM3MF94cF9tcGljX3Jlc3Vt ZSh2b2lkKQo+ICAJCX0KPiAgCX0KPiAgCj4gKwkvKiBSZS1lbmFibGUgcGVyLUNQVSBTb0MgRXJy b3IgaW50ZXJydXB0cyAqLwo+ICsJZm9yIChpcnEgPSAwOyBpcnEgPCBzb2NfZXJyX2lycV9udW1f cmVncyAqIDMyOyBpcnErKykgewo+ICsJCXN0cnVjdCBpcnFfZGF0YSAqZGF0YTsKPiArCQlpbnQg dmlycTsKPiArCj4gKwkJdmlycSA9IGlycV9saW5lYXJfcmV2bWFwKGFybWFkYV8zNzBfeHBfc29j X2Vycl9kb21haW4sIGlycSk7Cj4gKwkJaWYgKHZpcnEgPT0gMCkKPiArCQkJY29udGludWU7Cj4g Kwo+ICsJCWRhdGEgPSBpcnFfZ2V0X2lycV9kYXRhKHZpcnEpOwo+ICsKPiArCQkvKgo+ICsJCSAq IFJlLWVuYWJsZSBvbiB0aGUgY3VycmVudCBDUFUsCj4gKwkJICogYXJtYWRhX3hwX21waWNfcmVl bmFibGVfcGVyY3B1KCkgd2lsbCB0YWtlCj4gKwkJICogY2FyZSBvZiBzZWNvbmRhcnkgQ1BVcyB3 aGVuIHRoZXkgY29tZSB1cC4KPiArCQkgKi8KPiArCQlpZiAoaXJxX3BlcmNwdV9pc19lbmFibGVk KHZpcnEpKQo+ICsJCQlhcm1hZGFfMzcwX3hwX3NvY19lcnJfaXJxX3VubWFzayhkYXRhKTsKPiAr CX0KCkFzIEkgc2FpZCBhYm92ZSwgdGhpcyBpcyBkdXBsaWNhdGVkIGNvZGUgdGhhdCBzaG91bGQg YmUgcmVwbGFjZWQgd2l0aAphIHNpbXBsZSB3cml0ZSB0byB0aGUgY29ycmVzcG9uZGluZyBNTUlP IHJlZ2lzdGVycy4KCj4gKwo+ICAJLyogUmVjb25maWd1cmUgZG9vcmJlbGxzIGZvciBJUElzIGFu ZCBNU0lzICovCj4gIAl3cml0ZWwoZG9vcmJlbGxfbWFza19yZWcsCj4gIAkgICAgICAgcGVyX2Nw dV9pbnRfYmFzZSArIEFSTUFEQV8zNzBfWFBfSU5fRFJCRUxfTVNLX09GRlMpOwo+IEBAIC03MzAs NiArOTA3LDEwIEBAIHN0YXRpYyB2b2lkIGFybWFkYV8zNzBfeHBfbXBpY19yZXN1bWUodm9pZCkK PiAgCWlmIChkb29yYmVsbF9tYXNrX3JlZyAmIFBDSV9NU0lfRE9PUkJFTExfTUFTSykKPiAgCQl3 cml0ZWwoMSwgcGVyX2NwdV9pbnRfYmFzZSArIEFSTUFEQV8zNzBfWFBfSU5UX0NMRUFSX01BU0tf T0ZGUyk7Cj4gIAo+ICsJLyogVW5tYXNrIHN1bW1hcnkgU29DIEVycm9yIEludGVycnVwdCAqLwo+ ICsJaWYgKHNvY19lcnJfaXJxX251bV9yZWdzID4gMCkKPiArCQl3cml0ZWwoNCwgcGVyX2NwdV9p bnRfYmFzZSArIEFSTUFEQV8zNzBfWFBfSU5UX0NMRUFSX01BU0tfT0ZGUyk7CgpNYWdpYyB2YWx1 ZT8KCkFsc28sIHdyaXRpbmcgdG8gdGhpcyByZWdpc3RlciB0ZW5kcyB0byBpbmRpY2F0ZSB0aGF0 IHRoZSB3aG9sZSB0aGluZwpzaG91bGQgcmVhbGx5IGJlIGEgY2hhaW5lZCBpcnFjaGlwLi4uIE1h eWJlIHRoYXQncyBvdmVya2lsbCBpbiB0aGlzCmluc3RhbmNlLCBidXQgdGhlIHdob2xlIHRoaW5n IGlzIHJhdGhlciBvZGRseSBhcmNoaXRlY3RlZC4KCj4gKwo+ICAJaXBpX3Jlc3VtZSgpOwo+ICB9 Cj4gIAo+IEBAIC03NDIsNiArOTIzLDcgQEAgc3RhdGljIGludCBfX2luaXQgYXJtYWRhXzM3MF94 cF9tcGljX29mX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAo+ICAJCQkJCSAgICAgc3Ry dWN0IGRldmljZV9ub2RlICpwYXJlbnQpCj4gIHsKPiAgCXN0cnVjdCByZXNvdXJjZSBtYWluX2lu dF9yZXMsIHBlcl9jcHVfaW50X3JlczsKPiArCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc29jX2Vycl9u b2RlOwo+ICAJaW50IG5yX2lycXMsIGk7Cj4gIAl1MzIgY29udHJvbDsKPiAgCj4gQEAgLTc3NSwx MiArOTU3LDM3IEBAIHN0YXRpYyBpbnQgX19pbml0IGFybWFkYV8zNzBfeHBfbXBpY19vZl9pbml0 KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKPiAgCUJVR19PTighYXJtYWRhXzM3MF94cF9tcGlj X2RvbWFpbik7Cj4gIAlpcnFfZG9tYWluX3VwZGF0ZV9idXNfdG9rZW4oYXJtYWRhXzM3MF94cF9t cGljX2RvbWFpbiwgRE9NQUlOX0JVU19XSVJFRCk7Cj4gIAo+ICsJc29jX2Vycl9ub2RlID0gb2Zf Z2V0X25leHRfY2hpbGQobm9kZSwgTlVMTCk7Cj4gKwlpZiAoIXNvY19lcnJfbm9kZSkgewo+ICsJ CXByX3dhcm4oIk1pc3NpbmcgU29DIEVycm9yIEludGVycnVwdCBDb250cm9sbGVyIG5vZGVcbiIp Owo+ICsJCXByX3dhcm4oIkV4dGVuZGVkIGludGVycnVwdHMgYXJlIG5vdCBzdXBwb3J0ZWRcbiIp Owo+ICsJfSBlbHNlIHsKPiArCQlwcl9pbmZvKCJSZWdpc3RlcmluZyBNUElDIFNvQyBFcnJvciBJ bnRlcnJ1cHQgQ29udHJvbGxlclxuIik7Cj4gKwkJLyoKPiArCQkgKiBBcm1hZGEgMzcwIGFuZCBY UCBoYXZlIG9ubHkgMzIgU29DIEVycm9yIElSUXMgaW4gb25lIHJlZ2lzdGVyCj4gKwkJICogYW5k IG90aGVyIEFybWFkYSBwbGF0Zm9ybXMgaGF2ZSA2NCBJUlFzIGluIHR3byByZWdpc3RlcnMuCj4g KwkJICovCj4gKwkJc29jX2Vycl9pcnFfbnVtX3JlZ3MgPQo+ICsJCQlvZl9tYWNoaW5lX2lzX2Nv bXBhdGlibGUoIm1hcnZlbGwsYXJtYWRhLTM3MC14cCIpID8gMSA6IDI7CgpEb24ndCB5b3UgaGF2 ZSBhbiBhY3R1YWwgY29tcGF0aWJsZSBzdHJpbmcgZm9yIHRoZSBpbnRlcnJ1cHQKY29udHJvbGxl cj8gIEl0IHNlZW1zIG9kZCB0byByZWx5IG9uIHRoZSBTb0MgbmFtZS4KCj4gKwkJYXJtYWRhXzM3 MF94cF9zb2NfZXJyX2RvbWFpbiA9Cj4gKwkJCWlycV9kb21haW5fYWRkX2hpZXJhcmNoeShhcm1h ZGFfMzcwX3hwX21waWNfZG9tYWluLCAwLAo+ICsJCQkJCQkgc29jX2Vycl9pcnFfbnVtX3JlZ3Mg KiAzMiwKPiArCQkJCQkJIHNvY19lcnJfbm9kZSwKPiArCQkJCQkJICZhcm1hZGFfMzcwX3hwX3Nv Y19lcnJfaXJxX29wcywKPiArCQkJCQkJIE5VTEwpOwo+ICsJCUJVR19PTighYXJtYWRhXzM3MF94 cF9zb2NfZXJyX2RvbWFpbik7Cj4gKwl9Cj4gKwo+ICAJLyogU2V0dXAgZm9yIHRoZSBib290IENQ VSAqLwo+ICAJYXJtYWRhX3hwX21waWNfcGVyZl9pbml0KCk7Cj4gIAlhcm1hZGFfeHBfbXBpY19z bXBfY3B1X2luaXQoKTsKPiAgCj4gIAlhcm1hZGFfMzcwX3hwX21zaV9pbml0KG5vZGUsIG1haW5f aW50X3Jlcy5zdGFydCk7Cj4gIAo+ICsJLyogVW5tYXNrIHN1bW1hcnkgU29DIEVycm9yIEludGVy cnVwdCAqLwo+ICsJaWYgKHNvY19lcnJfaXJxX251bV9yZWdzID4gMCkKPiArCQl3cml0ZWwoNCwg cGVyX2NwdV9pbnRfYmFzZSArIEFSTUFEQV8zNzBfWFBfSU5UX0NMRUFSX01BU0tfT0ZGUyk7Cj4g KwoKTWFnaWMgdmFsdWUsIGR1cGxpY2F0ZWQgdGhpcyB0aW1lPwoKPiAgCXBhcmVudF9pcnEgPSBp cnFfb2ZfcGFyc2VfYW5kX21hcChub2RlLCAwKTsKPiAgCWlmIChwYXJlbnRfaXJxIDw9IDApIHsK PiAgCQlpcnFfc2V0X2RlZmF1bHRfaG9zdChhcm1hZGFfMzcwX3hwX21waWNfZG9tYWluKTsKPiAt LSAKPiAyLjIwLjEKPiAKPiAKCglNLgoKLS0gCldpdGhvdXQgZGV2aWF0aW9uIGZyb20gdGhlIG5v cm0sIHByb2dyZXNzIGlzIG5vdCBwb3NzaWJsZS4KCl9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4 LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK