Received: by 2002:a05:6358:e9c4:b0:b2:91dc:71ab with SMTP id hc4csp3181715rwb; Sat, 6 Aug 2022 14:52:43 -0700 (PDT) X-Google-Smtp-Source: AA6agR475HxQXCzblcrM6sE7+7UhiOUidcTRGzhOM+PtQXmDi2AZ9B7qBJpPwxz5nS5KhANHfBl0 X-Received: by 2002:a05:6402:35d6:b0:43d:c3b0:1206 with SMTP id z22-20020a05640235d600b0043dc3b01206mr12119638edc.415.1659822762984; Sat, 06 Aug 2022 14:52:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1659822762; cv=none; d=google.com; s=arc-20160816; b=SInj6M6j/yeV0Ter9m9XhAKbNvO7W3ZyuAhte4Ql/eISrP0CvleWEZQX8RtfRgmvOc RR779mmJYtv+JzXHLDhLnlgfAaZxW5aFTuKVrdgPXu9FCpPKpltlVoDoOrprmGCqnVVb uH2KHdg9WoJgoPyuhYnxa30NfeOfP//RcrF3rBFvOHac69NHaSaVzQIs7d8ufvJ8Y5mT 69ZfU2nFZh2mAxculZc1g+QcmDig0jjdUysOeYeF0itW0AU17N8+FefFS2VRrLVVDiRl UJEcVIYZDQgWsBQliu9FC+HzL3UsJfEp710ZL1S6W0Gqbiqg+EcNnZHg1usgeqwlFWJk apng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :feedback-id:references:in-reply-to:message-id:subject:reply-to:cc :from:to:dkim-signature:date; bh=3t+gm/btLHdYkkZ3NYKAbKt5z6sF6HBJyqJOtSUuQ1s=; b=P1XreO3SRYTpoN+6u6GnqHDSXxWzMF0kAlBRAWwGTvU/4E/3V7CpYPepPbu9HRPVpB llTHmUI6l1Ryx4sYLyLbbL5rwYiE9wCCtszkyUSrTR+ENdEdo5kQFeVSLFgio5LGyiHx t5MEXrsEZu6LqksemoRWHKsAk9VtAi9hWeZywJjy28ynPMHHJt/enWqAXQkqlOa0R6oo 9X4qrscfRF1pBqsk53ZVgcgD+Y0XoEoA9dwBdMyWkaHnty/dvtvFyBMthjxqg0Jn69Q7 plXrf9UWn6y7+hEECRRBZg5TUPcxApGO4B5/21//Dbel1uIjN23yJmHG/S5436teT8ew yWjw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@connolly.tech header.s=protonmail header.b=ZDLi9yFL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=connolly.tech Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id w5-20020a056402268500b0043c432626ffsi2820317edd.5.2022.08.06.14.52.18; Sat, 06 Aug 2022 14:52:42 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@connolly.tech header.s=protonmail header.b=ZDLi9yFL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=connolly.tech Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233245AbiHFV2q (ORCPT + 99 others); Sat, 6 Aug 2022 17:28:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56464 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232397AbiHFV2o (ORCPT ); Sat, 6 Aug 2022 17:28:44 -0400 Received: from mail-4022.proton.ch (mail-4022.proton.ch [185.70.40.22]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B3742F5A8 for ; Sat, 6 Aug 2022 14:28:41 -0700 (PDT) Date: Sat, 06 Aug 2022 21:28:34 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=connolly.tech; s=protonmail; t=1659821319; x=1660080519; bh=3t+gm/btLHdYkkZ3NYKAbKt5z6sF6HBJyqJOtSUuQ1s=; h=Date:To:From:Cc:Reply-To:Subject:Message-ID:In-Reply-To: References:Feedback-ID:From:To:Cc:Date:Subject:Reply-To: Feedback-ID:Message-ID; b=ZDLi9yFLqFvPl8PXPH6W+mA7LQJriDtwjhXbPycmo6Z7qDf3glJxf5Y0bQSGsM+ai EjqAqQGqzewMZ3DawEPtRqCOBesJmxc83bP2ftBsX8264xcac5LDHI9pRS0OSeeyw8 eLe32FYpgQzfxQcG+eSwutmgHgVWA5LWNWEOA2/4= To: Bjorn Andersson , Andy Gross , Konrad Dybcio From: Caleb Connolly Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Abel Vesa , Rajendra Nayak Reply-To: Caleb Connolly Subject: Re: [PATCH] soc: qcom: rpmhpd: Use highest corner until sync_state Message-ID: <151c8978-1fa8-6b21-8544-baf5abb45241@connolly.tech> In-Reply-To: <20220806155035.968340-1-bjorn.andersson@linaro.org> References: <20220806155035.968340-1-bjorn.andersson@linaro.org> Feedback-ID: 10753939:user:proton MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 06/08/2022 16:50, Bjorn Andersson wrote: > In some cases the hardware that the bootloader has left configured > depends on RPMH power domains for their operation up until the point > where the related Linux device driver probes and can inherit that > configuration, or power down the hardware gracefully. > > Unfortunately as Linux probes the releavant drivers in sequence there > are periods during the Linux boot flow where either the genpd refcount > will reach 0, or worse where the active performance_state votes does not > meet the requirements of the state that the hardware was left in. > > One specific example of this is during boot of e.g. SM8150/SC8180X, > where the display clock controller probes, without any particular > performance state needs (to access its registers). This will drop the > MMCX rail to MIN_SVS, which isn't sufficient to sustain the clock rates > that the later probing MDP is configured to. This results in an > unrecoverable system state. Hi Bjorn, Seems like my sm8150 device dies before getting this far, bah! > > Handle both these cases by keeping the RPMH power-domais that are > referenced voted for highest state, until sync_state indicates that all > devices referencing the RPMH power-domain driver has been probed. > > Signed-off-by: Bjorn Andersson Reviewed-by: Caleb Connolly > --- > drivers/soc/qcom/rpmhpd.c | 35 ++++++++++++++++++++++++++++++++++- > 1 file changed, 34 insertions(+), 1 deletion(-) > > diff --git a/drivers/soc/qcom/rpmhpd.c b/drivers/soc/qcom/rpmhpd.c > index 092f6ab09acf..494bb6c75ed7 100644 > --- a/drivers/soc/qcom/rpmhpd.c > +++ b/drivers/soc/qcom/rpmhpd.c > @@ -39,6 +39,7 @@ > * @res_name:=09=09Resource name used for cmd-db lookup > * @addr:=09=09Resource address as looped up using resource name from > *=09=09=09cmd-db > + * @state_synced: Indicator that sync_state has been invoked for t= he rpmhpd resource > */ > struct rpmhpd { > =09struct device=09*dev; > @@ -54,6 +55,7 @@ struct rpmhpd { > =09bool=09=09enabled; > =09const char=09*res_name; > =09u32=09=09addr; > +=09bool=09=09state_synced; > }; > > struct rpmhpd_desc { > @@ -493,7 +495,13 @@ static int rpmhpd_aggregate_corner(struct rpmhpd *pd= , unsigned int corner) > =09unsigned int this_active_corner =3D 0, this_sleep_corner =3D 0; > =09unsigned int peer_active_corner =3D 0, peer_sleep_corner =3D 0; > > -=09to_active_sleep(pd, corner, &this_active_corner, &this_sleep_corner); > +=09if (pd->state_synced) { > +=09=09to_active_sleep(pd, corner, &this_active_corner, &this_sleep_corne= r); > +=09} else { > +=09=09/* Clamp to highest corner if sync_state hasn't happened */ > +=09=09this_active_corner =3D pd->level_count - 1; > +=09=09this_sleep_corner =3D pd->level_count - 1; > +=09} > > =09if (peer && peer->enabled) > =09=09to_active_sleep(peer, peer->corner, &peer_active_corner, > @@ -708,11 +716,36 @@ static int rpmhpd_probe(struct platform_device *pde= v) > =09return of_genpd_add_provider_onecell(pdev->dev.of_node, data); > } > > +static void rpmhpd_sync_state(struct device *dev) > +{ > +=09const struct rpmhpd_desc *desc =3D of_device_get_match_data(dev); > +=09struct rpmhpd **rpmhpds =3D desc->rpmhpds; > +=09unsigned int corner; > +=09struct rpmhpd *pd; > +=09unsigned int i; > + > +=09mutex_lock(&rpmhpd_lock); > +=09for (i =3D 0; i < desc->num_pds; i++) { > +=09=09pd =3D rpmhpds[i]; > +=09=09if (!pd) > +=09=09=09continue; > + > +=09=09pd->state_synced =3D true; > +=09=09if (pd->enabled) > +=09=09=09corner =3D max(pd->corner, pd->enable_corner); > +=09=09else > +=09=09=09corner =3D 0; > +=09=09rpmhpd_aggregate_corner(pd, corner); > +=09} > +=09mutex_unlock(&rpmhpd_lock); > +} > + > static struct platform_driver rpmhpd_driver =3D { > =09.driver =3D { > =09=09.name =3D "qcom-rpmhpd", > =09=09.of_match_table =3D rpmhpd_match_table, > =09=09.suppress_bind_attrs =3D true, > +=09=09.sync_state =3D rpmhpd_sync_state, > =09}, > =09.probe =3D rpmhpd_probe, > }; > -- > 2.35.1 > -- Kind Regards, Caleb