Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp654438imm; Wed, 11 Jul 2018 08:44:44 -0700 (PDT) X-Google-Smtp-Source: AAOMgpcufebdDMVBqV/BU7nfJC9n6PPiFD0s3bEsDVTEiGOUM/0Du+iPWEpIb3pjximdRfcaaqPE X-Received: by 2002:a17:902:70c6:: with SMTP id l6-v6mr29245480plt.286.1531323884328; Wed, 11 Jul 2018 08:44:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1531323884; cv=none; d=google.com; s=arc-20160816; b=g7uwe7C6CKVdgcUCOE4x7OY4ju5yX6lYyMI4stVyMxzV8GmCADrKUzGucXeJpR4hsv 2q+jnpQz/oB481zkMSWQjCBXOSvMn4lsRzgQKIWkgPonLpmuJrwUhvYu5GNpo39+7nnX ubsKsudkUf0pTRgbei34dFewtoX+KyIJ9w+Mq5LblH8+TXdKhvsTEDC3kVeep9sVpRu3 /IqFQqbC4eJCx0eU+7Pyzwa26nUOAO6Hf8ofhkX6pDI5WLdARrZORbbLsG3wxFkC0MiN chERzqrPhy/zqfQBdo6NPTNSF+JYmMRLnxLJ2Xx/kUAnL2hifgDPdtmNv7XWY23kFo6I xCtA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature :arc-authentication-results; bh=SDLeo/868n8Rwo3UbTW1G8tdmWnKLZnbd2H1n9G1yQA=; b=I2AHulWlF6aT11YARTpHkEXPbhSBiHzH+b342SMLbudMvVdpKxaaJ4R6e3NehNenuO bp24oNp5hZsrgHRF9YySqFAA78kppkJIrk1IKyZlEmKscgfRe9pmC5IHsPHDxhIy+Rc6 3w7c0L8jrPmLhlIZFsLKpLX+N2T41Yl+bMJC4ACBagbQasyoJYggyQtSoYMhCie92sy4 0UCT4NBz1to9UG9xtoHZWMCBI6PfM1Kx3Abvq/gYArK7DbsKgxDeAmDPBTN++bZWq7nI 5HQ5L48uSk0O/uM9Naq9lXOFpalr5zI6rd0yn0nnJIYKoTQWbHGunSO8bxQThoRdHaLS Eq5g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=cuOYaHut; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w15-v6si19259431plp.7.2018.07.11.08.44.29; Wed, 11 Jul 2018 08:44:44 -0700 (PDT) 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; dkim=pass header.i=@chromium.org header.s=google header.b=cuOYaHut; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387597AbeGKNDa (ORCPT + 99 others); Wed, 11 Jul 2018 09:03:30 -0400 Received: from mail-yw0-f196.google.com ([209.85.161.196]:47088 "EHLO mail-yw0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732544AbeGKNDa (ORCPT ); Wed, 11 Jul 2018 09:03:30 -0400 Received: by mail-yw0-f196.google.com with SMTP id e23-v6so8581436ywe.13 for ; Wed, 11 Jul 2018 05:59:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=SDLeo/868n8Rwo3UbTW1G8tdmWnKLZnbd2H1n9G1yQA=; b=cuOYaHutfm+MS4zKflr6ijokGsoA1kEMsezZEkye5LitrefdeK1tnV3vZmGaP9ftBM 21eCApKSGuZEvoxIF31buQX5fXCQZnoelAK9jup+3/Ygnfd6Unm1M+0y1Q3UYVLKWLkj qHurnkde0AXoeKWtYduJ6sIwVf3XlZqeDyCow= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=SDLeo/868n8Rwo3UbTW1G8tdmWnKLZnbd2H1n9G1yQA=; b=ovizCFOtXJLbocEasrZYioNAzeXnF3HR/h466045+u+QwyvqyYhMK40BUCMYBbNb7t 8VmGGnWmydLSEKT1YJmZpW4GASGKoRI2I7c2y2T4iEmeQhrzjTnOZm930J/nYy3m5wEq g56sUttm9SUTbkiMlxTlGBgFjW2gfeXq4QYzCRx0SzSVaIIf+o+X7rb3++5EZ8TCUjxj R9/rXRN6TOVn5NUYHiLyY6srQu/n+q2V6mg9NFU0KQKDCjce+Ncpdc/GnEtpIovWOQdL TUJlHCE7UHHq9apUwv2A4TNKK5zfwwpo+ReHyxiP+CCFQmW4EtfykpTwpKDua2+cLsmW s1oA== X-Gm-Message-State: APt69E2d921i26wDG3L/x/VPTYQVXbHCpqtPu6DtLKyBNnwXaFHBkc1C 80pQKEjmOcGbNqua7tnt5YC5/oQDIEc= X-Received: by 2002:a81:5ac6:: with SMTP id o189-v6mr13798589ywb.444.1531313955362; Wed, 11 Jul 2018 05:59:15 -0700 (PDT) Received: from mail-yb0-f173.google.com (mail-yb0-f173.google.com. [209.85.213.173]) by smtp.gmail.com with ESMTPSA id q12-v6sm1385714ywl.26.2018.07.11.05.59.15 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 05:59:15 -0700 (PDT) Received: by mail-yb0-f173.google.com with SMTP id c10-v6so8208723ybf.9 for ; Wed, 11 Jul 2018 05:59:15 -0700 (PDT) X-Received: by 2002:a25:7146:: with SMTP id m67-v6mr12450695ybc.226.1531313510809; Wed, 11 Jul 2018 05:51:50 -0700 (PDT) MIME-Version: 1.0 References: <20180708173413.1965-1-vivek.gautam@codeaurora.org> <20180708173413.1965-2-vivek.gautam@codeaurora.org> <17407514.unFVTGoGrn@aspire.rjw.lan> In-Reply-To: From: Tomasz Figa Date: Wed, 11 Jul 2018 21:51:39 +0900 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v12 1/4] iommu/arm-smmu: Add pm_runtime/sleep ops To: rafael@kernel.org, Vivek Gautam Cc: "Rafael J. Wysocki" , "list@263.net:IOMMU DRIVERS , Joerg Roedel ," , Rob Herring , Mark Rutland , Robin Murphy , Will Deacon , "list@263.net:IOMMU DRIVERS , Joerg Roedel ," , devicetree@vger.kernel.org, Linux Kernel Mailing List , Alex Williamson , Rob Clark , Linux PM , freedreno , sboyd@kernel.org, Sricharan R , Marek Szyprowski , Archit Taneja , linux-arm-msm , jcrouse@codeaurora.org Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jul 11, 2018 at 8:11 PM Rafael J. Wysocki wrote: > > On Wed, Jul 11, 2018 at 12:55 PM, Vivek Gautam > wrote: > > Hi Rafael, > > > > > > On Wed, Jul 11, 2018 at 3:20 PM, Rafael J. Wysocki wrote: > >> On Sunday, July 8, 2018 7:34:10 PM CEST Vivek Gautam wrote: > >>> From: Sricharan R > >>> > >>> The smmu needs to be functional only when the respective > >>> master's using it are active. The device_link feature > >>> helps to track such functional dependencies, so that the > >>> iommu gets powered when the master device enables itself > >>> using pm_runtime. So by adapting the smmu driver for > >>> runtime pm, above said dependency can be addressed. > >>> > >>> This patch adds the pm runtime/sleep callbacks to the > >>> driver and also the functions to parse the smmu clocks > >>> from DT and enable them in resume/suspend. > >>> > >>> Signed-off-by: Sricharan R > >>> Signed-off-by: Archit Taneja > >>> [vivek: Clock rework to request bulk of clocks] > >>> Signed-off-by: Vivek Gautam > >>> Reviewed-by: Tomasz Figa > >>> --- > >>> > >>> - No change since v11. > >>> > >>> drivers/iommu/arm-smmu.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++-- > >>> 1 file changed, 58 insertions(+), 2 deletions(-) > >>> > >>> diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c > >>> index f7a96bcf94a6..a01d0dde21dd 100644 > >>> --- a/drivers/iommu/arm-smmu.c > >>> +++ b/drivers/iommu/arm-smmu.c > >>> @@ -48,6 +48,7 @@ > >>> #include > >>> #include > >>> #include > >>> +#include > >>> #include > >>> #include > >>> > >>> @@ -205,6 +206,8 @@ struct arm_smmu_device { > >>> u32 num_global_irqs; > >>> u32 num_context_irqs; > >>> unsigned int *irqs; > >>> + struct clk_bulk_data *clks; > >>> + int num_clks; > >>> > >>> u32 cavium_id_base; /* Specific to Cavium */ > >>> > >>> @@ -1897,10 +1900,12 @@ static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu) > >>> struct arm_smmu_match_data { > >>> enum arm_smmu_arch_version version; > >>> enum arm_smmu_implementation model; > >>> + const char * const *clks; > >>> + int num_clks; > >>> }; > >>> > >>> #define ARM_SMMU_MATCH_DATA(name, ver, imp) \ > >>> -static struct arm_smmu_match_data name = { .version = ver, .model = imp } > >>> +static const struct arm_smmu_match_data name = { .version = ver, .model = imp } > >>> > >>> ARM_SMMU_MATCH_DATA(smmu_generic_v1, ARM_SMMU_V1, GENERIC_SMMU); > >>> ARM_SMMU_MATCH_DATA(smmu_generic_v2, ARM_SMMU_V2, GENERIC_SMMU); > >>> @@ -1919,6 +1924,23 @@ static const struct of_device_id arm_smmu_of_match[] = { > >>> }; > >>> MODULE_DEVICE_TABLE(of, arm_smmu_of_match); > >>> > >>> +static void arm_smmu_fill_clk_data(struct arm_smmu_device *smmu, > >>> + const char * const *clks) > >>> +{ > >>> + int i; > >>> + > >>> + if (smmu->num_clks < 1) > >>> + return; > >>> + > >>> + smmu->clks = devm_kcalloc(smmu->dev, smmu->num_clks, > >>> + sizeof(*smmu->clks), GFP_KERNEL); > >>> + if (!smmu->clks) > >>> + return; > >>> + > >>> + for (i = 0; i < smmu->num_clks; i++) > >>> + smmu->clks[i].id = clks[i]; > >>> +} > >>> + > >>> #ifdef CONFIG_ACPI > >>> static int acpi_smmu_get_data(u32 model, struct arm_smmu_device *smmu) > >>> { > >>> @@ -2001,6 +2023,9 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev, > >>> data = of_device_get_match_data(dev); > >>> smmu->version = data->version; > >>> smmu->model = data->model; > >>> + smmu->num_clks = data->num_clks; > >>> + > >>> + arm_smmu_fill_clk_data(smmu, data->clks); > >>> > >>> parse_driver_options(smmu); > >>> > >>> @@ -2099,6 +2124,14 @@ static int arm_smmu_device_probe(struct platform_device *pdev) > >>> smmu->irqs[i] = irq; > >>> } > >>> > >>> + err = devm_clk_bulk_get(smmu->dev, smmu->num_clks, smmu->clks); > >>> + if (err) > >>> + return err; > >>> + > >>> + err = clk_bulk_prepare(smmu->num_clks, smmu->clks); > >>> + if (err) > >>> + return err; > >>> + > >>> err = arm_smmu_device_cfg_probe(smmu); > >>> if (err) > >>> return err; > >>> @@ -2181,6 +2214,9 @@ static int arm_smmu_device_remove(struct platform_device *pdev) > >>> > >>> /* Turn the thing off */ > >>> writel(sCR0_CLIENTPD, ARM_SMMU_GR0_NS(smmu) + ARM_SMMU_GR0_sCR0); > >>> + > >>> + clk_bulk_unprepare(smmu->num_clks, smmu->clks); > >>> + > >>> return 0; > >>> } > >>> > >>> @@ -2197,7 +2233,27 @@ static int __maybe_unused arm_smmu_pm_resume(struct device *dev) > >>> return 0; > >>> } > >>> > >>> -static SIMPLE_DEV_PM_OPS(arm_smmu_pm_ops, NULL, arm_smmu_pm_resume); > >>> +static int __maybe_unused arm_smmu_runtime_resume(struct device *dev) > >>> +{ > >>> + struct arm_smmu_device *smmu = dev_get_drvdata(dev); > >>> + > >>> + return clk_bulk_enable(smmu->num_clks, smmu->clks); > >>> +} > >>> + > >>> +static int __maybe_unused arm_smmu_runtime_suspend(struct device *dev) > >>> +{ > >>> + struct arm_smmu_device *smmu = dev_get_drvdata(dev); > >>> + > >>> + clk_bulk_disable(smmu->num_clks, smmu->clks); > >>> + > >>> + return 0; > >>> +} > >>> + > >>> +static const struct dev_pm_ops arm_smmu_pm_ops = { > >>> + SET_SYSTEM_SLEEP_PM_OPS(NULL, arm_smmu_pm_resume) > >> > >> This is suspicious. > >> > >> If you need a runtime suspend method, why do you think that it is not necessary > >> to suspend the device during system-wide transitions? > > > > Okay, so you suggest to put clock disabling in say arm_smmu_pm_suspend()? > > In that case the clocks have to be enabled in the resume path too. > > > > I remember Tomasz pointed to that we shouldn't need clock enable in resume > > path [1]. > > > > [1] https://lkml.org/lkml/2018/3/15/60 That was an answer for a different question. I don't remember suggesting having no suspend function. Although, given the PM subsystem internals, the suspend function wouldn't be called on SMMU implementation needed power control (since they would have runtime PM enabled) and on others, it would be called but do nothing (since no clocks). > > Honestly, I just don't know. :-) > > It just looks odd the way it is done. I think the clock should be > gated during system-wide suspend too, because the system can spend > much more time in a sleep state than in the working state, on average. > > And note that you cannot rely on runtime PM to always do it for you, > because it may be disabled at a client device or even blocked by user > space via power/control in sysfs and that shouldn't matter for > system-wide PM. User space blocking runtime PM through sysfs is a good point. I'm not 100% sure how the PM subsystem deals with that in case of system-wide suspend. I guess for consistency and safety, we should have the suspend callback. Best regards, Tomasz