Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp1682369imm; Tue, 22 May 2018 07:48:08 -0700 (PDT) X-Google-Smtp-Source: AB8JxZoUDUMsRNJS3pZ1jiI7YD5E39OYv46f9aUSzfEHjv19bQ8ddpn+PBjZisn8nIzZmR8JRb27 X-Received: by 2002:a65:4c8d:: with SMTP id m13-v6mr19682806pgt.310.1527000488596; Tue, 22 May 2018 07:48:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527000488; cv=none; d=google.com; s=arc-20160816; b=tnlMIAsW77KYjxTL5swdGtBrTv1gMhwEoUuZ/+CctzXbvXEC8aHRzOXZFSswfHTZj4 aB6986ekMUGv7ev2mPakie+ujFHVBoXhwO63xNmugw7kj3waGZupA4cOT0AuHIIkgC5M dkdz49252KAPdp08VSRDwN+iORTODon+wfVLad8OggE56vFp35bxMOSkSU7TP+8Vm021 W9XBD+/Q7t9BbFQZTLPIWM4saUPHAYVpU/3ErEfJ/8bp92xRdsiLkOX6vR8g5nOauE4Y zM4RtgF/erlqTdGw4P5yFcdlPReARlmPGIl5JiqT+fbZ2H7xUduC6reqB6YnR+SfSnDs RDDQ== 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 :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=WddCJFAWfuvwbrWpd3oy5hbIbRxZ+hNqPqVYyMuUsSE=; b=RSbjTzu6lajj9diD9OoHEWgiWv9SDa9IycgOGsXRPnDSlUcg7C6dR2W2n0b3QbB0Lp iVmGwmKaHRdzh6lQX1skBQCpAA9gZQhZt4tsOeevjQkBM/kTNY3Ma6na/TLUCiTtPe4f 6TPH07aPfI5lcnHGV89ESzbZi0rB3PXOL6sJBDQX1KBsYgUU+DE4dpNchGg8wFb8eYMR l7Ea34cF1xqo/8xN0x8Ww31MzGfQ7nFuKSWG8BCv60/pNZHPYfRkc6qS2cEY01a+IfRC jbOziz2Ollgl6UJQutBqE1QOn3DI1EM1yjQwM+edroRWVm2NfruNJ49BXCI8uwfKI34J GrrA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=DUuiEiSE; 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=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b2-v6si11402034pgn.599.2018.05.22.07.47.53; Tue, 22 May 2018 07:48:08 -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=@linaro.org header.s=google header.b=DUuiEiSE; 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=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751368AbeEVOrX (ORCPT + 99 others); Tue, 22 May 2018 10:47:23 -0400 Received: from mail-io0-f194.google.com ([209.85.223.194]:38348 "EHLO mail-io0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751277AbeEVOrT (ORCPT ); Tue, 22 May 2018 10:47:19 -0400 Received: by mail-io0-f194.google.com with SMTP id z4-v6so18788508iof.5 for ; Tue, 22 May 2018 07:47:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=WddCJFAWfuvwbrWpd3oy5hbIbRxZ+hNqPqVYyMuUsSE=; b=DUuiEiSEuBTviACGR6h4E4HxKP5MARXiCh4FFAKMTzLXmpeIml95EV1d4N24qVZiNp pQMQODMLnZ248G/zY5gpRMVbBCnOD5dq2WTsSBAQ3DGVxiKN8lCAfz4n1yx8yojqnN9W visZ5qdjRbyx2jTDoGmQQRibpow00zBPZ0W4E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=WddCJFAWfuvwbrWpd3oy5hbIbRxZ+hNqPqVYyMuUsSE=; b=bOglVpRa5+2UprT5Mi0uMPEpSW9Ikgk3hy+UBCfvxA623Zus8PgN+MBCN8ubLy+EyQ thVQ/CFERD1Uq6WmKRurw8LAkVheViLCS/pcTGjCdg6pN8dsMnpa6TxnKRJAMwyhRn0E SM+cTpH09cPj3mZjqeB+uThfU+w7AbQQCj5OG4EjLwBEAcJ/NEYRJFnaVjQmHgDqCN2e 1yPFCcQE6OaK6M26E+h5TelNBacYlxJPNSUx/ZZFwBpoi2xFE1PTp1ktwZGB0XZHwCoo NJi/TUEdUCT49O63Ss2SURr1k9FfzW0cHKcMPGFajN8z27eDJ1UoGLh3WGS2qkeOeME9 uEWQ== X-Gm-Message-State: ALKqPwdrr79f6CVGaJzHimj6PcGQNRnb3hFe1/pCtZB+FcO0qVSsF9aX 0ps0iLCFSIDlyuLgcGGmxsxWORaQaazMMQXlZkq/Tw== X-Received: by 2002:a6b:c9d8:: with SMTP id z207-v6mr26647449iof.266.1527000438371; Tue, 22 May 2018 07:47:18 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a02:7353:0:0:0:0:0 with HTTP; Tue, 22 May 2018 07:47:17 -0700 (PDT) In-Reply-To: References: <1526639490-12167-1-git-send-email-ulf.hansson@linaro.org> <1526639490-12167-9-git-send-email-ulf.hansson@linaro.org> From: Ulf Hansson Date: Tue, 22 May 2018 16:47:17 +0200 Message-ID: Subject: Re: [PATCH 8/9] PM / Domains: Add support for multi PM domains per device to genpd To: Jon Hunter Cc: "Rafael J . Wysocki" , Linux PM , Greg Kroah-Hartman , Geert Uytterhoeven , Todor Tomov , Rajendra Nayak , Viresh Kumar , Vincent Guittot , Kevin Hilman , Linux Kernel Mailing List , Linux ARM , linux-tegra@vger.kernel.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 [...] >> >> +/** >> + * genpd_dev_pm_attach_by_id() - Attach a device to one of its PM domain. >> + * @dev: Device to attach. >> + * @index: The index of the PM domain. >> + * >> + * Parse device's OF node to find a PM domain specifier at the provided @index. >> + * If such is found, allocates a new device and attaches it to retrieved >> + * pm_domain ops. >> + * >> + * Returns the allocated device if successfully attached PM domain, NULL when >> + * the device don't need a PM domain or have a single PM domain, else PTR_ERR() >> + * in case of failures. Note that if a power-domain exists for the device, but >> + * cannot be found or turned on, then return PTR_ERR(-EPROBE_DEFER) to ensure >> + * that the device is not probed and to re-try again later. >> + */ >> +struct device *genpd_dev_pm_attach_by_id(struct device *dev, >> + unsigned int index) >> +{ >> + struct device *genpd_dev; >> + int num_domains; >> + int ret; >> + >> + if (!dev->of_node) >> + return NULL; >> + >> + /* Deal only with devices using multiple PM domains. */ >> + num_domains = of_count_phandle_with_args(dev->of_node, "power-domains", >> + "#power-domain-cells"); >> + if (num_domains < 2 || index >= num_domains) >> + return NULL; >> + >> + /* Allocate and register device on the genpd bus. */ >> + genpd_dev = kzalloc(sizeof(*genpd_dev), GFP_KERNEL); >> + if (!genpd_dev) >> + return ERR_PTR(-ENOMEM); >> + >> + dev_set_name(genpd_dev, "genpd:%u:%s", index, dev_name(dev)); >> + genpd_dev->bus = &genpd_bus_type; >> + genpd_dev->release = genpd_release_dev; >> + >> + ret = device_register(genpd_dev); >> + if (ret) { >> + kfree(genpd_dev); >> + return ERR_PTR(ret); >> + } >> + >> + /* Try to attach the device to the PM domain at the specified index. */ >> + ret = __genpd_dev_pm_attach(genpd_dev, dev->of_node, index); >> + if (ret < 1) { >> + device_unregister(genpd_dev); >> + return ret ? ERR_PTR(ret) : NULL; >> + } >> + >> + pm_runtime_set_active(genpd_dev); >> + pm_runtime_enable(genpd_dev); >> + >> + return genpd_dev; >> +} >> +EXPORT_SYMBOL_GPL(genpd_dev_pm_attach_by_id); > > Thanks for sending this. Believe it or not this has still been on my to-do list > and so we definitely need a solution for Tegra. > > Looking at the above it appears that additional power-domains exposed as devices > to the client device. So I assume that this means that the drivers for devices > with multiple power-domains will need to call RPM APIs for each of these > additional power-domains. Is that correct? They can, but should not! Instead, the driver shall use device_link_add() and device_link_del(), dynamically, depending on what PM domain that their original device needs for the current running use case. In that way, they keep existing runtime PM deployment, operating on its original device. > > If so, I can see that that would work, but it does not seem to fit the RPM model > where currently for something like device clocks, the RPM callbacks can handle > all clocks at once. > > I was wondering why we could not add a list of genpd domains to the > dev_pm_domain struct for the device? For example ... See above answer, hopefully that explains it. FYI, that's why I also discovered the bug around using device links with runtime PM during probe. https://patchwork.kernel.org/patch/10408825/ > > diff --git a/include/linux/pm.h b/include/linux/pm.h > index e723b78d8357..a11d6db3c077 100644 > --- a/include/linux/pm.h > +++ b/include/linux/pm.h > @@ -659,6 +659,7 @@ extern void dev_pm_put_subsys_data(struct device *dev); > * subsystem-level and driver-level callbacks. > */ > struct dev_pm_domain { > + struct list_head genpd_list; > struct dev_pm_ops ops; > void (*detach)(struct device *dev, bool power_off); > int (*activate)(struct device *dev); > @@ -666,6 +667,11 @@ struct dev_pm_domain { > void (*dismiss)(struct device *dev); > }; > > +struct dev_pm_domain_link { > + struct generic_pm_domain *genpd; > + struct list_head node; > +}; > + > /* > * The PM_EVENT_ messages are also used by drivers implementing the legacy > * suspend framework, based on the ->suspend() and ->resume() callbacks common > diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h > index e61b5cd79fe2..019593804670 100644 > --- a/include/linux/pm_domain.h > +++ b/include/linux/pm_domain.h > @@ -51,7 +51,6 @@ struct dev_pm_opp; > > struct generic_pm_domain { > struct device dev; > - struct dev_pm_domain domain; /* PM domain operations */ > struct list_head gpd_list_node; /* Node in the global PM domains list */ > struct list_head master_links; /* Links with PM domain as a master */ > struct list_head slave_links; /* Links with PM domain as a slave */ > @@ -99,11 +98,6 @@ struct generic_pm_domain { > > }; > > -static inline struct generic_pm_domain *pd_to_genpd(struct dev_pm_domain *pd) > -{ > - return container_of(pd, struct generic_pm_domain, domain); > -} > - > > Obviously the above will not compile but the intent would be to allocate a > dev_pm_domain_link struct per power-domain that the device needs and add > to the genpd_list for the device. It would be a much bigger change in > having to iterate through all the power-domains when turning devices on > and off, however, it would simplify the client driver. > > Cheers > Jon > > -- > nvpublic Kind regards Uffe