From patchwork Wed Mar 25 09:07:15 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Lezcano X-Patchwork-Id: 46310 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-la0-f72.google.com (mail-la0-f72.google.com [209.85.215.72]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 0CD742159D for ; Wed, 25 Mar 2015 09:08:18 +0000 (UTC) Received: by lamq1 with SMTP id q1sf3341043lam.3 for ; Wed, 25 Mar 2015 02:08:17 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe; bh=Rdd1RB3vh+H22GG3yw59B4KcvseZUFjmQ8liMqAC35Q=; b=KapgOh6ac+5Lt9IhCM+p4wuiO44uAE5lIqQHZy7yiRR3nml6lBAUYBypsD4/yB5kkI 2RxbCMwy9Gq/AhZwtE8EeskhnVA8X9XxW7Sbji0TOawmFsFODa+f7yVMtE25KkrM1OD4 Lx6uABWOu45NPMsFerQGEBXBS+811hQ/hkZ7Yd0R7ZtlScdfOMVYVGeEip1uJoGEpdYw khZQdqv4Q0ftQjafAOxH+HVU4fAnt5MeITKnaVMhDp3Z2Mg91ql6Aloa+9JsGS9udZ46 jmYlq7l8FfeFX8/W/mWoMMFPIYLVvb+TBDNkkuq0oFNhZEJo3HISCl9evD9ELOfIW+rF 8gWw== X-Gm-Message-State: ALoCoQnypifD4ZQu+qEcpghONm20KZGXfxe/r3khqFxNvzny9Q8hshXxLMrpVgBD+h7Ai2lJF+Dg X-Received: by 10.180.81.134 with SMTP id a6mr4036402wiy.1.1427274496986; Wed, 25 Mar 2015 02:08:16 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.43.169 with SMTP id x9ls70453lal.92.gmail; Wed, 25 Mar 2015 02:08:16 -0700 (PDT) X-Received: by 10.112.123.99 with SMTP id lz3mr7523570lbb.48.1427274496591; Wed, 25 Mar 2015 02:08:16 -0700 (PDT) Received: from mail-la0-f48.google.com (mail-la0-f48.google.com. [209.85.215.48]) by mx.google.com with ESMTPS id mh10si1450765lbb.174.2015.03.25.02.08.16 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 25 Mar 2015 02:08:16 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.48 as permitted sender) client-ip=209.85.215.48; Received: by lagg8 with SMTP id g8so14423533lag.1 for ; Wed, 25 Mar 2015 02:08:16 -0700 (PDT) X-Received: by 10.152.29.68 with SMTP id i4mr7577074lah.19.1427274496472; Wed, 25 Mar 2015 02:08:16 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.57.201 with SMTP id k9csp1959662lbq; Wed, 25 Mar 2015 02:08:15 -0700 (PDT) X-Received: by 10.68.231.66 with SMTP id te2mr15469687pbc.118.1427274494204; Wed, 25 Mar 2015 02:08:14 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z12si2710047pas.241.2015.03.25.02.08.12; Wed, 25 Mar 2015 02:08:14 -0700 (PDT) Received-SPF: none (google.com: linux-kernel-owner@vger.kernel.org does not designate permitted sender hosts) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752589AbbCYJIG (ORCPT + 27 others); Wed, 25 Mar 2015 05:08:06 -0400 Received: from mail-wg0-f51.google.com ([74.125.82.51]:32906 "EHLO mail-wg0-f51.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752504AbbCYJHd (ORCPT ); Wed, 25 Mar 2015 05:07:33 -0400 Received: by wgbcc7 with SMTP id cc7so19557120wgb.0 for ; Wed, 25 Mar 2015 02:07:32 -0700 (PDT) X-Received: by 10.180.24.233 with SMTP id x9mr36885738wif.9.1427274452328; Wed, 25 Mar 2015 02:07:32 -0700 (PDT) Received: from mai.lan (135-224-190-109.dsl.ovh.fr. [109.190.224.135]) by mx.google.com with ESMTPSA id ge8sm2662696wjc.32.2015.03.25.02.07.30 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 25 Mar 2015 02:07:31 -0700 (PDT) From: Daniel Lezcano To: rjw@rjwysocki.net Cc: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pm@vger.kernel.org, lina.iyer@linaro.org, Lorenzo.Pieralisi@arm.com Subject: [PATCH 7/8] ARM: cpuidle: Register per cpuidle device Date: Wed, 25 Mar 2015 10:07:15 +0100 Message-Id: <1427274436-21916-7-git-send-email-daniel.lezcano@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1427274436-21916-1-git-send-email-daniel.lezcano@linaro.org> References: <55127A53.8050206@linaro.org> <1427274436-21916-1-git-send-email-daniel.lezcano@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: daniel.lezcano@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.48 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , If the cpuidle init cpu operation returns -ENXIO, therefore reporting HW failure or misconfiguration, the CPUidle driver skips the respective cpuidle device initialization because the associated platform back-end HW is not operational. That prevents the system to crash and allows to handle the error gracefully. For example, on Qcom's platform, each core has a SPM. The device associated with this SPM is initialized before the cpuidle framework. If there is an error in the initialization (eg. error in the DT), the system continues to boot but in degraded mode as some SPM may not be correctly initialized. Signed-off-by: Daniel Lezcano Acked-by: Lorenzo Pieralisi --- drivers/cpuidle/cpuidle-arm.c | 45 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/drivers/cpuidle/cpuidle-arm.c b/drivers/cpuidle/cpuidle-arm.c index 1c94b88..545069d 100644 --- a/drivers/cpuidle/cpuidle-arm.c +++ b/drivers/cpuidle/cpuidle-arm.c @@ -17,6 +17,7 @@ #include #include #include +#include #include @@ -94,6 +95,7 @@ static int __init arm_idle_init(void) { int cpu, ret; struct cpuidle_driver *drv = &arm_idle_driver; + struct cpuidle_device *dev; /* * Initialize idle states data, starting at index 1. @@ -105,18 +107,57 @@ static int __init arm_idle_init(void) if (ret <= 0) return ret ? : -ENODEV; + ret = cpuidle_register_driver(drv); + if (ret) { + pr_err("Failed to register cpuidle driver\n"); + return ret; + } + /* * Call arch CPU operations in order to initialize * idle states suspend back-end specific data */ for_each_possible_cpu(cpu) { ret = arm_cpuidle_init(cpu); + + /* + * Skip the cpuidle device initialization if the reported + * failure is a HW misconfiguration/breakage (-ENXIO). + */ + if (ret == -ENXIO) + continue; + if (ret) { pr_err("CPU %d failed to init idle CPU ops\n", cpu); - return ret; + goto out_fail; + } + + dev = kzalloc(sizeof(*dev), GFP_KERNEL); + if (!dev) { + pr_err("Failed to allocate cpuidle device\n"); + goto out_fail; + } + dev->cpu = cpu; + + ret = cpuidle_register_device(dev); + if (ret) { + pr_err("Failed to register cpuidle device for CPU %d\n", + cpu); + kfree(dev); + goto out_fail; } } - return cpuidle_register(drv, NULL); + return 0; +out_fail: + while (--cpu >= 0) { + dev = per_cpu(cpuidle_devices, cpu); + cpuidle_unregister_device(dev); + kfree(dev); + } + + cpuidle_unregister_driver(drv); + + return ret; } device_initcall(arm_idle_init);