Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp5938932imu; Wed, 30 Jan 2019 06:12:11 -0800 (PST) X-Google-Smtp-Source: ALg8bN5CEPUtfk/H9axGsKZi6cMoSA/BMiqp5leU3QinAs4ldixbbEzqdb+/6hT8L+D/giVRVrZ9 X-Received: by 2002:a17:902:8346:: with SMTP id z6mr30477413pln.340.1548857531230; Wed, 30 Jan 2019 06:12:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1548857531; cv=none; d=google.com; s=arc-20160816; b=iicq7l9HVhDDpCLYYN8CsMK5NoH6GpP7r8zYXDlEBYRZ1TIutfhLW648Olzl1Ny4m9 lhMAknBF/s/j5tsNi5Q92dV2kNeG8w5QmgM/v9vPBVT05cru3QwE4wBIaY2Uv5jHcud3 JFXW56i56uXFanQRA2jh0XvKjr+c+ZPLpG8J1UTcxRmhuQh9svkKVjT/iK73L+9kUWOK 0MUksEsHzJOdxgMXQyrnucO6nFXNUuYoQjl6+d0ed4VYYhiPusJmbuUyonbt0h0du2QI H4+AR5+Dm6xhoefZ6VNxwAsY5dlMeoy+/HpmCrGKnXORmav6ziQm6YAW3JXhBUIclfQm +Z2g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:date:cc:to:from:subject:message-id; bh=xZGzn7cujExyx6ips0Li+W+WDNXcuPp2TNk0nq4Ha2Q=; b=yHEsfBxC7nN1F2lfYiyPcSxDrD5LMT/UdmbD+q1Yv/p8nTLYo6BV3eGx0JltL2VWw/ 42v55LlYGKkPVn/4DCUZDTGiujLzhFaw3oZSsQYsb5Bz0LEzY1gAj5o5eyj38mFJ4bVi RDW5qmJq4Xrg570DrWdxexhgrpVJSlzAb/DzcsO3kI2rzshNp7P+qbCuZyLwiWGi49sV JgbuU6sBFEI3gw146U0eJX1C5hf1ol16IcEZfDrcJ3gFuGLYWwvIT/QwFqzyWYlHH7ja scvreid6KXSAHW3yDknm7lKsjOz4H0DFoOO2Xa/VKQ6sxq0D5TZ8Dm676g2ZgM5kmu1f hSHw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q70si1309616pgq.526.2019.01.30.06.11.55; Wed, 30 Jan 2019 06:12:11 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727740AbfA3OLb (ORCPT + 99 others); Wed, 30 Jan 2019 09:11:31 -0500 Received: from metis.ext.pengutronix.de ([85.220.165.71]:45549 "EHLO metis.ext.pengutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727509AbfA3OLb (ORCPT ); Wed, 30 Jan 2019 09:11:31 -0500 Received: from kresse.hi.pengutronix.de ([2001:67c:670:100:1d::2a]) by metis.ext.pengutronix.de with esmtp (Exim 4.89) (envelope-from ) id 1goqaO-0002Hf-7t; Wed, 30 Jan 2019 15:11:28 +0100 Message-ID: <1548857486.6869.31.camel@pengutronix.de> Subject: Re: [PATCH V2 4/4] irq: imx: irqsteer: add multi output interrupts support From: Lucas Stach To: Dong Aisheng Cc: Aisheng Dong , "linux-kernel@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "shawnguo@kernel.org" , dl-linux-imx , "robh+dt@kernel.org" , "devicetree@vger.kernel.org" , "tglx@linutronix.de" , Marc Zyngier Date: Wed, 30 Jan 2019 15:11:26 +0100 In-Reply-To: References: <1548853196-11447-1-git-send-email-aisheng.dong@nxp.com> <1548853196-11447-5-git-send-email-aisheng.dong@nxp.com> <1548855138.6869.27.camel@pengutronix.de> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.22.6-1+deb9u1 Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::2a X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Am Mittwoch, den 30.01.2019, 22:03 +0800 schrieb Dong Aisheng: > > On Wed, Jan 30, 2019 at 9:33 PM Lucas Stach wrote: > > > > Am Mittwoch, den 30.01.2019, 13:06 +0000 schrieb Aisheng Dong: > > > One irqsteer channel can support up to 8 output interrupts. > > > > > > > > > > > Cc: Marc Zyngier > > > > > > > > Cc: Lucas Stach > > > > > > > > Cc: Shawn Guo > > > > Signed-off-by: Dong Aisheng > > > > > > --- > > > ChangeLog: > > > v1->v2: > > >  * calculate irq_count by fsl,num-irqs instead of parsing interrupts > > >    property from devicetree to match the input interrupts and outputs > > >  * improve output interrupt handler by searching only two registers > > >    withint the same group > > > --- > > >  drivers/irqchip/irq-imx-irqsteer.c | 76 +++++++++++++++++++++++++++++--------- > > >  1 file changed, 59 insertions(+), 17 deletions(-) > > > > > > diff --git a/drivers/irqchip/irq-imx-irqsteer.c b/drivers/irqchip/irq-imx-irqsteer.c > > > index 67ed862..cc40039 100644 > > > --- a/drivers/irqchip/irq-imx-irqsteer.c > > > +++ b/drivers/irqchip/irq-imx-irqsteer.c > > > @@ -10,6 +10,7 @@ > > >  #include > > >  #include > > >  #include > > > +#include > > >  #include > > >  #include > > > > > > @@ -21,10 +22,13 @@ > > > >  #define CHAN_MINTDIS(t)            (CTRL_STRIDE_OFF(t, 3) + 0x4) > > > >  #define CHAN_MASTRSTAT(t)  (CTRL_STRIDE_OFF(t, 3) + 0x8) > > > > +#define CHAN_MAX_OUTPUT_INT        0x8 > > > > > > + > > >  struct irqsteer_data { > > > > >   void __iomem            *regs; > > > > >   struct clk              *ipg_clk; > > > > > - int                     irq; > > > > > + int                     irq[CHAN_MAX_OUTPUT_INT]; > > > > > + int                     irq_count; > > > > >   raw_spinlock_t          lock; > > > > >   int                     reg_num; > > > > >   int                     channel; > > > > > > @@ -87,26 +91,45 @@ static const struct irq_domain_ops imx_irqsteer_domain_ops = { > > > > >   .xlate          = irq_domain_xlate_onecell, > > > > > >  }; > > > > > > +static int imx_irqsteer_get_hwirq_base(struct irqsteer_data *data, u32 irq) > > > +{ > > > > +   int i; > > > > > > + > > > > +   for (i = 0; i < data->irq_count; i++) { > > > > +           if (data->irq[i] == irq) > > > > > > +                     break; > > > > return i * 64; here... > > > +     } > > > + > > > +     return i * 64; > > > > ... and -EINVAL or something here, so we don't return a out of bounds > > hwirq base if the loop ever doesn't match something? > > > > Good suggestion, will add it. > > > > +} > > > + > > >  static void imx_irqsteer_irq_handler(struct irq_desc *desc) > > >  { > > > >     struct irqsteer_data *data = irq_desc_get_handler_data(desc); > > > > +   int hwirq; > > > >     int i; > > > >     chained_irq_enter(irq_desc_get_chip(desc), desc); > > > > -   for (i = 0; i < data->reg_num * 32; i += 32) { > > > > -           int idx = imx_irqsteer_get_reg_index(data, i); > > > > +   hwirq = imx_irqsteer_get_hwirq_base(data, irq_desc_get_irq(desc)); > > > > > > + > > > > +   for (i = 0; i < 2; i++) { > > > > +           int idx = imx_irqsteer_get_reg_index(data, hwirq); > > > >             unsigned long irqmap; > > > >             int pos, virq; > > > > +           if (hwirq >= data->reg_num * 32) > > > > +                   break; > > > > > > + > > > >             irqmap = readl_relaxed(data->regs + > > > >                                    CHANSTATUS(idx, data->reg_num)); > > > >             for_each_set_bit(pos, &irqmap, 32) { > > > > -                   virq = irq_find_mapping(data->domain, pos + i); > > > > > > +                     virq = irq_find_mapping(data->domain, pos + hwirq); > > > > The irq index calculation need to be "pos + i * 32 + hwirq", otherwise > > this will map to the wrong virqs for the second register in each group. > > > > For second register map, hwirq will plus 32 in next round. > So i can't see this will map a wrong virqs. > And it looks to me ""pos + i * 32 + hwirq" is equal to "hwirq + 32". > Am i missed something? You are right, I forgot about the hwirq being incremented in the loop when writing this comment. > > >                       if (virq) > > > >                             generic_handle_irq(virq); > > > >             } > > > > > > +             hwirq += 32; > > > > Could be folded into the loop head. > > > > You mean “for (i = 0; i < 2; i++, hwirq +=32)” ? > I feel that's not quite necessary. I personally find that quite a bit clearer than incrementing the loop variables at different spots. And I probably wouldn't have missed hwirq being incremented in the loop if I had seen it in the head. Regards, Lucas