From patchwork Fri Mar 3 20:41:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lina Iyer X-Patchwork-Id: 9603515 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id C67B360414 for ; Fri, 3 Mar 2017 20:47:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B13C728584 for ; Fri, 3 Mar 2017 20:47:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A409928589; Fri, 3 Mar 2017 20:47:38 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 20EB128584 for ; Fri, 3 Mar 2017 20:47:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=Kf2xuJ8/WO4OrP6o/zAz0DzgakUd7ZgQ/IaguADKruI=; b=d6hRg2GlSMOcOoNQ6p90xA3pnZ 7hXlYfaa/vI/AMLgJKmOvk8hWxF32JYVXaPwxi2YPX5GUjNF9LyMtg7zkIYrXAjaXD8jBEz9LXMbP Xofqo5tZBp0tBgvkvZFeYL/KT4R5tykhYtWBksBvP7XurW29PnNq4orzOIn4nlkUlk7gf7DaNHlLd hME5gBW3cG94rFMrIPKRko+xnejCjDd6aRS+bB8c7AZJQtXVtoFkOqOMq/93LCBX0XmNtYomXCdYJ kxKrLboecJ9boqEo//xP6t+pv7piQ2JRNVGc4We9Dygsj4OB4qxJ3RC7I7UTC0fCCXiVaCFT+dZr9 B/IQ8R6A==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1cju6s-0001EG-RI; Fri, 03 Mar 2017 20:47:30 +0000 Received: from mail-pf0-x22b.google.com ([2607:f8b0:400e:c00::22b]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1cju1v-0004ro-Bz for linux-arm-kernel@lists.infradead.org; Fri, 03 Mar 2017 20:42:26 +0000 Received: by mail-pf0-x22b.google.com with SMTP id e66so18039689pfe.1 for ; Fri, 03 Mar 2017 12:42:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=91y2xiSaIH8mHCdkE7TEB06kh1lqQlJpGwOOZGDufR0=; b=KbTVS7SZSlETYT/VTgmAS9JVI5ruHfXW+zw0Tr04XyqEdR7+cAM6zR54Eveg54EA6C 1ICjq7AWAfvw77ZsCR58y54ZRfv6Ai3aWRVbBKo/30ocmTAGF9Xx4J8Bv2oTcGcVugYY fw5EWcPVVE4EnBKsupJSw1Avbl17LQfotfOAs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=91y2xiSaIH8mHCdkE7TEB06kh1lqQlJpGwOOZGDufR0=; b=IkLyd5MDW2HRtcvgInrgYRBMbcKvzvA8zfCRnA+sdFUpWP+gRwbLty/lIFUQogMzLy x8xmoUKBHLK00FOovFbX8HSVv4Fk9IGJgggKiAThzi0oom6sx6CG/aj/euON5e4j1puP CQqYJb3ZXySNpjguEkA8gs5HZHCjzyY1NHJXBh/CqgBeJWR9GybyFIbACaNzWHZr+Rrx qYXbBCrpkYFEpY0GrR+yzuZNdUzzcWdtXwgf7aqu/z5wOoRHvh26i24BVqCg/AsA/zZK JUfa2lyNfzV5C8wrhfxpjx3aCOVMzreHrL3MvBe1NOyMzDNIe8xcY9GSciwzrYFz1GeG ckQQ== X-Gm-Message-State: AMke39kYh+I6xsJzGGrQAfkauexbOj4YnkoJHvXMmk4n2bHnSdIK4PUp2EODTjYuIJTm3HtZ X-Received: by 10.98.27.204 with SMTP id b195mr5670149pfb.154.1488573722197; Fri, 03 Mar 2017 12:42:02 -0800 (PST) Received: from ubuntu.localdomain (i-global254.qualcomm.com. [199.106.103.254]) by smtp.gmail.com with ESMTPSA id o189sm25207003pga.12.2017.03.03.12.41.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 03 Mar 2017 12:42:01 -0800 (PST) From: Lina Iyer To: ulf.hansson@linaro.org, khilman@kernel.org, rjw@rjwysocki.net, linux-pm@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH V5 9/9] doc / cpu_domains: Describe CPU PM domains setup and governor Date: Fri, 3 Mar 2017 12:41:35 -0800 Message-Id: <1488573695-106680-10-git-send-email-lina.iyer@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1488573695-106680-1-git-send-email-lina.iyer@linaro.org> References: <1488573695-106680-1-git-send-email-lina.iyer@linaro.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170303_124223_456149_AB7F703B X-CRM114-Status: GOOD ( 21.58 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lorenzo.pieralisi@arm.com, Juri.Lelli@arm.com, linux-arm-msm@vger.kernel.org, sboyd@codeaurora.org, brendan.jackman@arm.com, sudeep.holla@arm.com, andy.gross@linaro.org, Lina Iyer MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP A generic CPU PM domain functionality is provided by drivers/base/power/cpu_domains.c. This document describes the generic usecase of CPU's PM domains, the setup of such domains and a CPU specific genpd governor. Signed-off-by: Lina Iyer --- Documentation/power/cpu_domains.txt | 109 ++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 Documentation/power/cpu_domains.txt diff --git a/Documentation/power/cpu_domains.txt b/Documentation/power/cpu_domains.txt new file mode 100644 index 0000000..6a39a64 --- /dev/null +++ b/Documentation/power/cpu_domains.txt @@ -0,0 +1,109 @@ +CPU PM domains +============== + +Newer CPUs are grouped in SoCs as clusters. A cluster in addition to the CPUs +may have caches, floating point units and other architecture specific power +controller that share resources when any of the CPUs are active. When the CPUs +are in idle, some of these cluster components may also idle. A cluster may +also be nested inside another cluster that provides common coherency +interfaces to share data between the clusters. The organization of such +clusters and CPU may be descibed in DT, since they are SoC specific. + +CPUIdle framework enables the CPUs to determine the sleep time and enter low +power state to save power during periods of idle. CPUs in a cluster may enter +and exit idle state independently of each other. During the time when all the +CPUs are in idle state, the cluster may safely put some of the shared +resources in their idle state. The time between the last CPU to enter idle and +the first CPU to wake up is the time available for the cluster to enter its +idle state. + +When SoCs power down the CPU during cpuidle, they generally have supplemental +hardware that can handshake with the CPU with a signal that indicates that the +CPU has stopped execution. The hardware is also responsible for warm booting +the CPU on receiving an interrupt. In a cluster architecture, common resources +that are shared by a cluster may also be powered down by an external +microcontroller or a processor. The microcontroller may be programmed in +advance to put the hardware blocks in a low power state, when the last active +CPU sends the idle signal. When the signal is received, the microcontroller +may trigger the hardware blocks to enter their low power state. When an +interrupt to wakeup the processor is received, the microcontroller is +responsible for bringing up the hardware blocks to its active state, before +waking up the CPU. The timelines for such operations should be in the +acceptable range for for CPU idle to get power benefits. + +CPU PM Domain Setup +------------------- + +PM domains are represented in the DT as domain consumers and providers. A +device may have a domain provider and a domain provider may support multiple +domain consumers. Domains like clusters, may also be nested inside one +another. A domain that has no active consumer, may be powered off and any +resuming consumer would trigger the domain back to active. Parent domains may +be powered off when the child domains are powered off. The CPU cluster can be +fashioned as a PM domain. When the CPU devices are powered off, the PM domain +may be powered off. + +Device idle is reference counted by runtime PM. When there is no active need +for the device, runtime PM invokes callbacks to suspend the parent domain. +Generic PM domain (genpd) handles the hierarchy of devices, domains and the +reference counting of objects leading to last man down and first man up in the +domain. The CPU domains helper functions defines PM domains for each CPU +cluster and attaches the CPU devices to the respective PM domains. + +Platform drivers may use the following API to register their CPU PM domains. + +of_setup_cpu_pd() - +Provides a single step registration of the CPU PM domain and attach CPUs to +the genpd. Platform drivers may additionally register callbacks for power_on +and power_off operations for the PM domain. + +of_setup_cpu_pd_single() - +Define PM domain for a single CPU and attach the CPU to its domain. + + +CPU PM Domain governor +---------------------- + +CPUs have a unique ability to determine their next wakeup. CPUs may wake up +for known timer interrupts and unknown interrupts from idle. Prediction +algorithms and heuristic based algorithms like the Menu governor for cpuidle +can determine the next wakeup of the CPU. However, determining the wakeup +across a group of CPUs is a tough problem to solve. + +A simplistic approach would be to resort to known wakeups of the CPUs in +determining the next wakeup of any CPU in the cluster. The CPU PM domain +governor does just that. By looking into the tick device of the CPUs, the +governor can determine the sleep time between the last CPU and the first +scheduled wakeup of any CPU in that domain. This combined with the PM QoS +requirement for CPU_DMA_LATENCY can be used to determine the deepest possible +idle state of the CPU domain. + + +PSCI based CPU PM Domains +------------------------- + +ARM PSCI v1.0 supports PM domains for CPU clusters like in big.Little +architecture. It is supported as part of the OS-Initiated (OSI) mode of the +PSCI firmware. Since the control of domains is abstracted in the firmware, +Linux does not need even a driver to control these domains. The complexity of +determining the idle state of the PM domain is handled by the CPU PM domains. + +Every PSCI CPU PM domain idle state has a unique PSCI state id. The state id +is read from the DT and specified using the arm,psci-suspend-param property. +This makes it easy for big.Little SoCs to just specify the PM domain idle +states for the CPU along with the psci-suspend-param and everything else is +handled by the PSCI fimrware drivers and the firmware. + + +DT definitions for PSCI CPU PM Domains +-------------------------------------- + +A PM domain's idle state can be defined in DT, the description of which is +available in [1]. PSCI based CPU PM domains may define their idle states as +part of the psci node. The additional parameter arm,psci-suspend-param is used +to indicate to the firmwware the addition cluster state that would be achieved +after the last CPU makes the PSCI call to suspend the CPU. The description of +PSCI domain states is available in [2]. + +[1]. Documentation/devicetree/bindings/arm/idle-states.txt +[2]. Documentation/devicetree/bindings/arm/psci.txt