Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp2596551ybt; Mon, 22 Jun 2020 02:22:19 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz/vCheyLu9uertXLhqnPmo9Zti+rg/l6S+PjFCJ9vmSe3vtha0r9Dxy+0sSydVj0XH3Zhx X-Received: by 2002:a17:906:95d6:: with SMTP id n22mr14880167ejy.138.1592817739380; Mon, 22 Jun 2020 02:22:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592817739; cv=none; d=google.com; s=arc-20160816; b=eIBF6Ee+beL13TKtc2aaLXruIH5gVT5yzdswPU/QepPpVwnB59Vzz6YpUvAzFjo9dn 0VhiSLX7BPTXEvi/TLhAtkNYpMQEZhvLaqqgewwZ4XX0CWlYu0YP2lSTiIBsrxpKWd/1 W8cFs51acUuBNHIY92kQQsUzc5pguUVUaG1bRvkOFtbY3OkpwwpIbIU6l6VpXqFgG9th msnud6Vczxxhg8lDYhJ10/falH01wzauGeyA7u/atS3bj1AMXhE4niWu2prXyzyuWgzL jsJF46Hjggg98sf9U66qjZPLgMQhjegHmOzgyLc+Y58459WsDeq79Ihwz4IrCy8eY2Nv suIA== 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=YezUPzNjvQxanzC++G4NuTRjYWGDG9cd7oj8499vmB8=; b=niShrqbP6LOE2y6A0LkmGev9QYn8L2PZyDRaGupBVkFXuWzTlSlauhgbXBMU9Y+zUj 9sVibw8N8ceEhcqa2XpyRIuxqpl+LQBc6WJ+HR2IaRhOmA2pxoeW86Tmss6YjLBu580y b6rU943RbyeajFhM6qJ3xkblMg5JDDef/XCisD3iZJwsCPmH6wh7hM+bKdShSe0yU8P/ /aNI0SYjdpz/NnaVvWOJgpBQ6zd9fdx9URkbvxsl1uQDcnGrfyrTXgjSsxAGcYYxeA8Z aJxKAs4lF/7Cipq3tuTMlm9o90IcJY8hAoU4mhPbe/9MLQ1iK7LDJ1gWB1v8lEe03bqP QWeg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@mg.codeaurora.org header.s=smtp header.b=ax92dtmh; 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 op10si2830936ejb.149.2020.06.22.02.21.57; Mon, 22 Jun 2020 02:22:19 -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=ax92dtmh; 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 S1726972AbgFVJTc (ORCPT + 99 others); Mon, 22 Jun 2020 05:19:32 -0400 Received: from m43-7.mailgun.net ([69.72.43.7]:30314 "EHLO m43-7.mailgun.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726953AbgFVJTb (ORCPT ); Mon, 22 Jun 2020 05:19:31 -0400 DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.codeaurora.org; q=dns/txt; s=smtp; t=1592817570; h=Content-Transfer-Encoding: Content-Type: In-Reply-To: MIME-Version: Date: Message-ID: From: References: Cc: To: Subject: Sender; bh=YezUPzNjvQxanzC++G4NuTRjYWGDG9cd7oj8499vmB8=; b=ax92dtmhPU9rE1yc20FwoE9SgK0fRVVQNb1CSpFd3sT10q9rK6y1wjWtxPyMukQenFa7RKlG pdWjsFBqZ2+JR+m1ZXp+KuH2cI/25T7Havyzok3NpXAf5SfIQt/uNabaj/xFRmbtZovCj92U u3krq0lI0SUuc+1kIsK7sL3VgQY= 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-n08.prod.us-west-2.postgun.com with SMTP id 5ef0779a4c9690533a4f38e3 (version=TLS1.2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256); Mon, 22 Jun 2020 09:19:22 GMT Received: by smtp.codeaurora.org (Postfix, from userid 1001) id 50DA1C43391; Mon, 22 Jun 2020 09:19:22 +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 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from [192.168.29.129] (unknown [49.36.71.202]) (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 11DD2C433C8; Mon, 22 Jun 2020 09:19:15 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 11DD2C433C8 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> <159086679215.69627.4444511187342075544@swboyd.mtv.corp.google.com> <159230866475.62212.10807813558467898966@swboyd.mtv.corp.google.com> <4e318931-cff0-0d8b-d0a0-9d139533c551@codeaurora.org> <159255876756.62212.4221488367063412094@swboyd.mtv.corp.google.com> From: Maulik Shah Message-ID: <65457ad5-174f-cdf5-bee8-40a12ad1115f@codeaurora.org> Date: Mon, 22 Jun 2020 14:49:11 +0530 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.9.0 MIME-Version: 1.0 In-Reply-To: <159255876756.62212.4221488367063412094@swboyd.mtv.corp.google.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit 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 6/19/2020 2:56 PM, Stephen Boyd wrote: > Quoting Maulik Shah (2020-06-18 03:03:03) >> On 6/16/2020 5:27 PM, Stephen Boyd wrote: >>> Quoting Maulik Shah (2020-06-01 04:38:25) >>>> On 5/31/2020 12:56 AM, Stephen Boyd wrote: >>>>> Quoting Maulik Shah (2020-05-29 02:20:32) >>>>>> On 5/27/2020 3:45 PM, Stephen Boyd wrote: >>>>>>> Quoting Maulik Shah (2020-05-23 10:11:13) >>>>>>>> @@ -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. >>>>> How does it break cpuidle? The irqs that would be enabled/unmasked in >>>>> pdc would only be the irqs that the kernel has setup irq handlers for >>>>> (from request_irq() and friends). We want those irqs to keep working >>>>> during cpuidle and wake the CPU from the deepest idle states. >>>>>> 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 >>>>>> How does it break cpuidle? >>>> Consider a scenario.. >>>> 1. All PDC irqs enabled/unmasked in HW when request_irq() happened/alloc happens >>>> 2. Client driver disable's irq. (lazy disable is there, so in HW its still unmasked) but disabled in SW. >>>> 3. Device enters deep CPUidle low power modes where only PDC monitors IRQ. >>>> 4. This IRQ can still wakeup from CPUidle since it was monitored by PDC. >>>> 5. From handler, it comes to know that IRQ is disabled in SW, so it really invokes irq_mask callback now to disable in HW. >>>> 6. This mask callback doesn't operate on PDC (since in PDC, IRQs gets masked only during suspend, all other times its enabled) >>>> 7. step 3 to 6 repeats, if this IRQ keeps on coming and waking up from deep cpuidle states. >>> Ok so in summary, irq is left unmasked in pdc during deep cpu idle and >>> it keeps waking up the CPU because it isn't masked at the PDC after the >>> first time it interrupts? Is this a power problem? >> yes it can be a power problem. >>> Because from a >>> correctness standpoint we don't really care. It woke up the CPU because >>> it happened, and the GIC can decide to ignore it or not by masking it at >>> the GIC. I thought that the PDC wouldn't wake up the CPU if we masked >>> the irq at the GIC level. Is that not true? >> once PDC detects IRQ, it directly doesn't wake up CPU. it replays IRQ to >> GIC. >> >> since at GIC its masked, GIC doesn't forward to cpu to immediatly wake >> it up. >> >> however after PDC detecting IRQ, it exits low power mode and >> watchdog/timer can wakeup upon expiry. > Ok. So the only problem is some screaming irq that really wants to be > handled but the driver that requested it has disabled it at runtime. The > IRQ keeps kicking the CPUs out of deep idle and then eventually the > timer tick happens and we've run the CPUs in a shallower idle state for > this time? No it may still enter deeper state next time. > Presumably we'd like to have these irqs be lazily masked at > the PDC so that they can become pending when they first arrive but not > block deep idle states if they're interrupting often while being > handled. We do lazily disable IRQ.  but didnot understand why lazily disable when they are being handled? The edge type irqs gets masked immediatly if one irq is being handled and another comes in. but that's not a problem. > > On the other hand, we want irq wake state to be the only factor in irqs > being unmasked at the PDC on the entry to suspend. Purely > masking/unmasking at the PDC when the irq is masked in software doesn't > work because suspend/resume will break for disabled but wake enabled > irqs. But doing that makes idle work easily because we can assume during > idle that leaving it unmasked until it fires and then masking it in the > PDC until it is handled gives us good deep idle states in the face of > screaming irqs. > > What are the actual requirements? Here is my attempt to boil this > discussion down into a few bullet points: > > 1. During system suspend, wake enabled irqs should be enabled in PDC > and all other irqs should be disabled in PDC. yes, IRQs should be enabled in both PDC and GIC before platform (PSCI suspend) happens if they are marked for wakeup (enable_irq_wake()) > > 2. During idle, enabled irqs must be enabled in PDC, unless they're > pending in which case they should be masked in the PDC so as to not > wake up the CPU from deep idle states i didn't get this point. During idle, if the driver choosen to keep IRQ enabled, it should be enabled in both PDC and GIC if the driver choosen to keep IRQ disabled, with this series... a. do a lay disable when driver's call disable_irq(), meaning set the SW state as disabled but leave in PDC and GIC HW as unmasked/enabled. b. if the IRQ comes inbetween and its of edge type, the generic handle_edge_irq will really mask in HW. > > 3. During non-idle, non-suspend, enabled irqs must be enabled in PDC. > > Or is #3 actually false and PDC has no bearing on this? Correct, During this time (non-idle, non-suspend) PDC will be in something called "by pass mode" where it plays role of type conversion. (a level low to level high / edge falling to edge rising) since GIC doesn't detect level low/falling edge IRQs. Thanks, Maulik -- QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation