Received: by 2002:a25:ef43:0:0:0:0:0 with SMTP id w3csp377761ybm; Fri, 29 May 2020 02:23:17 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxgWg0cwVjjervQ5/hyg4OHSsjQEBsrVZASmf4aha1KLVqpoNijECI+6HD/UYPZasupBhIl X-Received: by 2002:aa7:d806:: with SMTP id v6mr5656050edq.174.1590744197208; Fri, 29 May 2020 02:23:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1590744197; cv=none; d=google.com; s=arc-20160816; b=PFQf0cPE/BPWk2jS7OJv+PF7D0+0pVGp9BWuqltoRqF1HBdbKp40diyDHHUgrKJa+9 CaUgT18d+nLAixEoEEemfd5G378MQB0SxEVNVdOjxcJoUKwxTLKdBnxifU+j484pFUVs VwJ83eudSsWYGctxecE0dbDLxAyZWjnw2Dm0HFF8DgfBjdiIK93NT/0j2mzM/9KkMBlA rP62hT9x/qrEZPilZSbuWiO2pdUZZyeIy8cIC0DcqkKaG2PWLxju2qIH/mNHjMlRVRFi e+8W7tIM1cenU7TpsItXA1ESFTd2i+urBGEVhUJeTmsAwrsJi0l3gudBndDPw7FQpiRc EGNQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-language :content-transfer-encoding:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dmarc-filter :dkim-signature; bh=gtTL96xroM0cMRUy1kb2dBW2tNzxqYj7hRbU9Vw34yY=; b=fmVyeD0WkYIablHxTb92a4L4qnMr189GhdXPi5ZiW8oLwwpy0ul7Te9M5sEnsiaPBJ bs/wO1ZFkqf8zboM9PN+hcxOESmmhnkUUcCcbrx1Wh1AZeCcTrFsJo9yxcmKWpdxuPI5 qPCEmYjXolnbB672mx7CHQLNSAFGHm1+W2zAdFNvDjezdw16BW1vvMQXHtFIHcXtoKTx CU+Nvynu8/bTa8RvAf2GyibH1QEhZ8alGLhWpI1W7wfdFkr0KfT2W3BgpysAY9ujxruh jSUvSZbwUaaGebukWSmTwRTiTH+pFhBlG1ylra2kwiMr/fmGAWy0imbyQKvxY6a07PeB i0kQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@mg.codeaurora.org header.s=smtp header.b=aBbcC9cg; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id l64si4499092ede.102.2020.05.29.02.22.52; Fri, 29 May 2020 02:23:17 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=fail header.i=@mg.codeaurora.org header.s=smtp header.b=aBbcC9cg; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725836AbgE2JU6 (ORCPT + 99 others); Fri, 29 May 2020 05:20:58 -0400 Received: from m43-7.mailgun.net ([69.72.43.7]:21975 "EHLO m43-7.mailgun.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725562AbgE2JU6 (ORCPT ); Fri, 29 May 2020 05:20:58 -0400 DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.codeaurora.org; q=dns/txt; s=smtp; t=1590744057; h=Content-Transfer-Encoding: Content-Type: In-Reply-To: MIME-Version: Date: Message-ID: From: References: Cc: To: Subject: Sender; bh=gtTL96xroM0cMRUy1kb2dBW2tNzxqYj7hRbU9Vw34yY=; b=aBbcC9cghWSCnaj4zUDi1u61WoBMTfdAVjWOYzdG+ZXQ4TRJHAgOuQR4pkw7EXNzYq4CHjKT ZfnesNxR6fvF02GGNqQxZ05oJKqyWShw4MG1nrgUANf3tr65mEgPLNAyi9bJjtQ3BWmJdF5H 4Gnp9Vu1alK15BEXqPS+cHHGDlI= X-Mailgun-Sending-Ip: 69.72.43.7 X-Mailgun-Sid: WyI0MWYwYSIsICJsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnIiwgImJlOWU0YSJd Received: from smtp.codeaurora.org (ec2-35-166-182-171.us-west-2.compute.amazonaws.com [35.166.182.171]) by smtp-out-n05.prod.us-east-1.postgun.com with SMTP id 5ed0d3eb44a25e005206a62a (version=TLS1.2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256); Fri, 29 May 2020 09:20:43 GMT Received: by smtp.codeaurora.org (Postfix, from userid 1001) id 59565C43391; Fri, 29 May 2020 09:20:42 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-caf-mail-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=2.0 tests=ALL_TRUSTED,SPF_NONE, URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from [192.168.43.129] (unknown [106.222.19.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: mkshah) by smtp.codeaurora.org (Postfix) with ESMTPSA id F2202C433C9; Fri, 29 May 2020 09:20:35 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org F2202C433C9 Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; spf=none smtp.mailfrom=mkshah@codeaurora.org Subject: Re: [PATCH v2 4/4] irqchip: qcom-pdc: Introduce irq_set_wake call To: Stephen Boyd , bjorn.andersson@linaro.org, evgreen@chromium.org, linus.walleij@linaro.org, maz@kernel.org, mka@chromium.org Cc: linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-gpio@vger.kernel.org, agross@kernel.org, tglx@linutronix.de, jason@lakedaemon.net, dianders@chromium.org, rnayak@codeaurora.org, ilina@codeaurora.org, lsrao@codeaurora.org References: <1590253873-11556-1-git-send-email-mkshah@codeaurora.org> <1590253873-11556-5-git-send-email-mkshah@codeaurora.org> <159057454795.88029.5963412495484312088@swboyd.mtv.corp.google.com> From: Maulik Shah Message-ID: Date: Fri, 29 May 2020 14:50:32 +0530 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.8.1 MIME-Version: 1.0 In-Reply-To: <159057454795.88029.5963412495484312088@swboyd.mtv.corp.google.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-GB Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, On 5/27/2020 3:45 PM, Stephen Boyd wrote: > Quoting Maulik Shah (2020-05-23 10:11:13) >> Remove irq_disable callback to allow lazy disable for pdc interrupts. >> >> Add irq_set_wake callback that unmask interrupt in HW when drivers >> mark interrupt for wakeup. Interrupt will be cleared in HW during >> lazy disable if its not marked for wakeup. >> >> Signed-off-by: Maulik Shah >> --- >> drivers/irqchip/qcom-pdc.c | 33 +++++++++++++++++---------------- >> 1 file changed, 17 insertions(+), 16 deletions(-) >> >> diff --git a/drivers/irqchip/qcom-pdc.c b/drivers/irqchip/qcom-pdc.c >> index 6ae9e1f..f7c0662 100644 >> --- a/drivers/irqchip/qcom-pdc.c >> +++ b/drivers/irqchip/qcom-pdc.c >> @@ -36,6 +36,7 @@ struct pdc_pin_region { >> u32 cnt; >> }; >> >> +DECLARE_BITMAP(pdc_wake_irqs, PDC_MAX_IRQS); > static? Thanks i will declare as static in v3. > >> static DEFINE_RAW_SPINLOCK(pdc_lock); >> static void __iomem *pdc_base; >> static struct pdc_pin_region *pdc_region; >> @@ -87,22 +88,20 @@ static void pdc_enable_intr(struct irq_data *d, bool on) >> raw_spin_unlock(&pdc_lock); >> } >> >> -static void qcom_pdc_gic_disable(struct irq_data *d) >> +static int qcom_pdc_gic_set_wake(struct irq_data *d, unsigned int on) >> { >> if (d->hwirq == GPIO_NO_WAKE_IRQ) >> - return; >> - >> - pdc_enable_intr(d, false); >> - irq_chip_disable_parent(d); >> -} >> + return 0; > Shouldn't this fail if we can't set for wake? we return success/failure from parent chip with below call at end of set_wake. return irq_chip_set_wake_parent(d, on); > >> >> -static void qcom_pdc_gic_enable(struct irq_data *d) >> -{ >> - if (d->hwirq == GPIO_NO_WAKE_IRQ) >> - return; >> + if (on) { >> + pdc_enable_intr(d, true); >> + irq_chip_enable_parent(d); >> + set_bit(d->hwirq, pdc_wake_irqs); >> + } else { >> + clear_bit(d->hwirq, pdc_wake_irqs); >> + } >> >> - pdc_enable_intr(d, true); >> - irq_chip_enable_parent(d); >> + return irq_chip_set_wake_parent(d, on); >> } >> >> static void qcom_pdc_gic_mask(struct irq_data *d) > The diff is really hard to read too. Maybe set_wake can be added first > and then the enable/disable functions removed? i think should be ok in same patch, if you insist i can split this change in to two. > >> @@ -110,6 +109,9 @@ static void qcom_pdc_gic_mask(struct irq_data *d) >> if (d->hwirq == GPIO_NO_WAKE_IRQ) >> return; >> >> + if (!test_bit(d->hwirq, pdc_wake_irqs)) >> + pdc_enable_intr(d, false); >> + >> irq_chip_mask_parent(d); >> } >> >> @@ -118,6 +120,7 @@ static void qcom_pdc_gic_unmask(struct irq_data *d) >> if (d->hwirq == GPIO_NO_WAKE_IRQ) >> return; >> >> + pdc_enable_intr(d, true); >> irq_chip_unmask_parent(d); >> } >> > I find these two hunks deeply confusing. I'm not sure what the > maintainers think though. I hope it would be simpler to always enable > the hwirqs in the pdc when an irq is requested and only disable it in > the pdc when the system goes to suspend and the pdc pin isn't for an irq > that's marked for wakeup. Does that break somehow? PDC monitors interrupts during CPUidle as well, in cases where deepest low power mode happened from cpuidle where GIC is not active. If we keep PDC IRQ always enabled/unmasked during idle and then disable/mask when entering to suspend, it will break cpuidle. > > My understanding of the hardware is that the GPIO controller has lines > directly connected to various SPI lines on the GIC and PDC has a way to > monitor those direct connections and wakeup the CPUs when they trigger > the detection logic in the PDC. The enable/disable bit in PDC gates that > logic for each wire between the GPIO controller and the GIC. > > So isn't it simpler to leave the PDC monitoring pins that we care about > all the time and only stop monitoring when we enter and leave suspend? it can affect idle path as explained above. > And shouldn't the driver set something sane in qcom_pdc_init() to > disable all the pdc pins so that we don't rely on boot state to > configure pins for wakeup? We don't rely on boot state, by default all interrupt will be disabled. This is same to GIC driver having GICD_ISENABLER register, where all bits (one bit per interrupt) set to 0 (masked irqs) during boot up. Similarly PDC also have all bits set to 0 in PDC's IRQ_ENABLE_BANK. Thanks, Maulik > >> @@ -197,15 +200,13 @@ static struct irq_chip qcom_pdc_gic_chip = { >> .irq_eoi = irq_chip_eoi_parent, >> .irq_mask = qcom_pdc_gic_mask, >> .irq_unmask = qcom_pdc_gic_unmask, >> - .irq_disable = qcom_pdc_gic_disable, >> - .irq_enable = qcom_pdc_gic_enable, >> .irq_get_irqchip_state = qcom_pdc_gic_get_irqchip_state, >> .irq_set_irqchip_state = qcom_pdc_gic_set_irqchip_state, >> .irq_retrigger = irq_chip_retrigger_hierarchy, >> .irq_set_type = qcom_pdc_gic_set_type, >> + .irq_set_wake = qcom_pdc_gic_set_wake, >> .flags = IRQCHIP_MASK_ON_SUSPEND | >> - IRQCHIP_SET_TYPE_MASKED | >> - IRQCHIP_SKIP_SET_WAKE, >> + IRQCHIP_SET_TYPE_MASKED, >> .irq_set_vcpu_affinity = irq_chip_set_vcpu_affinity_parent, >> .irq_set_affinity = irq_chip_set_affinity_parent, -- QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation