From patchwork Tue Jun 13 14:03:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Konrad Dybcio X-Patchwork-Id: 107396 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp569426vqr; Tue, 13 Jun 2023 07:05:22 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ5m6xSwY9qfD9U0Uf2bkb+SaNcWaCoILpJv4se2E3/WGgzX/vzqT5mXMx4gm5MysjljbMrd X-Received: by 2002:a19:4409:0:b0:4f4:4533:8535 with SMTP id r9-20020a194409000000b004f445338535mr5486230lfa.67.1686665121605; Tue, 13 Jun 2023 07:05:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686665121; cv=none; d=google.com; s=arc-20160816; b=dQ8uOqOG64E7D0yC4pUhtaqs3G5sI/zEboCJVyI6kE5cv+LF0N8WDkzmn2qBDZz+II NnJKcWc0JG68veSz7k3nkUEBKnnGWPr8NKOIa5GyYRApqZfUhNE3b9xx6/wdFcqF9n44 v0ywtPng/eRqvWFNR+R4vcSyl3fjs4Zo672XcTwU+bxwk6ytuHj6ABe1BoiXAFYkma// DSvlSQIjxayI66ZW2dYpaopUNf7QLavxGHwfegzWT0W63cMAKnJ5q3G6zBs0+BpTtGL6 j7gffBX6K1A6+6OV/giB2Ba8pbbw1GTKo2PK4YxHROwahrMU6olKcAZk5XMVS3jsWRE5 7bmw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:in-reply-to:references:message-id :content-transfer-encoding:mime-version:subject:date:from :dkim-signature; bh=UEM3N0iLIlvYLepw85JsPFibfyRzMkZ98OPjRwmkvbs=; b=GnGTeVe84tzkarF8ClGj5a0b+TcoDB+3++Ow3cKD9QaTTCiokHWuYcSJIYVhz+dnbd Ai7BpK9PuGfEtsvHzTRLIF6AbwukKcgAOA0C38Z2/qwzGXshAa4X5FHMd6WPX6UfsK6o FuFxffqb0CGIMm3DYfaGbZXvkqkRM6it0ddseXc0U1botQiFo/iRemA8pB2ZhtNfqLOf iY0ifTKjTbl7snaP6lxqo77pyYmC5YG5mMDiNDxy4x3Ihu8WvOtw+jU8EZryiqtvCpEP Sq7wb4rv9Pl+rjNRrlrSpn2yhEvBrXbYnWsgJjxRQIG/EYvPnDNtHmLSg2Ki2fCYL5mx Dh8w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=VIkZPt4T; 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=linaro.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id gf21-20020a170906e21500b0094a6863fddfsi6514338ejb.430.2023.06.13.07.04.45; Tue, 13 Jun 2023 07:05:21 -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=@linaro.org header.s=google header.b=VIkZPt4T; 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=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242735AbjFMODk (ORCPT + 99 others); Tue, 13 Jun 2023 10:03:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57194 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242686AbjFMODY (ORCPT ); Tue, 13 Jun 2023 10:03:24 -0400 Received: from mail-lj1-x235.google.com (mail-lj1-x235.google.com [IPv6:2a00:1450:4864:20::235]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C4ED41721 for ; Tue, 13 Jun 2023 07:03:21 -0700 (PDT) Received: by mail-lj1-x235.google.com with SMTP id 38308e7fff4ca-2b1bb2fc9c6so67621151fa.0 for ; Tue, 13 Jun 2023 07:03:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1686664999; x=1689256999; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=UEM3N0iLIlvYLepw85JsPFibfyRzMkZ98OPjRwmkvbs=; b=VIkZPt4T9YCuZtM8Tz3q1jmyJuU17BQUF/lafjn7Ee1l+IdT+uptnMCgM+GPvXq8XP kcegQ0ne8CkPBNlI7PKdHFy60MSLrTrC5vwos/Pc1fsbGtmG6o9WapE22bOIrPUqbHzv 8B+/J3aYuF4T3m5JwtHS7pA8iPp/UO68LO85q3IHtAt8qkpaTV7j2fTVDk3VvMojjQEx nD2U2mrMjY82hoWliISuNZ9xyasBHb0DB5nDjFpFFuWqOErSl6+sMApd5lvYe2BSwAHA GvYBFQieR0VkFgiA9Mb9ia+v1LHzajoGK4CtkMiRRDkrAZyCs4mRuPk76peB9ZBVTztm B7QA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1686664999; x=1689256999; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=UEM3N0iLIlvYLepw85JsPFibfyRzMkZ98OPjRwmkvbs=; b=hw8WZoKal5IEG8xThW1eUdUV0L5ETijITgMhUDw6UHavZxRPIf+MxeEScqyrVPAsBy UvQ6zTXVhAMaTPnWA1KFMTftvP3dFYCE0Yajzd2rn+DH3AxdUgrWxTa7/drQP3rO7VlE /aYA7NPdVtim5w3MjVSTDXNWNfuS9u2QORTY/nteLZYyleiPEtfUG2ABjxdufjpKE8+d ApYxVfq2M30IjnwSWQjBtYdjmm1DHpS0iaHh0bANXA5M+Z6AqfUBgp5kuhqLhpAguZPQ 2U4n2MUXtxO6eI3wIHT9V90NqYHvn/NLK/k6zVd/pxNzS+2/R4hvuNEbzcU51RE+2Eek 3J7w== X-Gm-Message-State: AC+VfDxYHfi6kReVJARmW4rMGR20zyva7fJ0njaFwtU4dLAef9c7WFeD +I2zrsMDjIjTdNmnotHFCFHELw== X-Received: by 2002:a2e:8606:0:b0:2b1:e74b:2452 with SMTP id a6-20020a2e8606000000b002b1e74b2452mr4465332lji.49.1686664999709; Tue, 13 Jun 2023 07:03:19 -0700 (PDT) Received: from [192.168.1.101] (abyj190.neoplus.adsl.tpnet.pl. [83.9.29.190]) by smtp.gmail.com with ESMTPSA id a18-20020a05651c011200b002b32af2e9c6sm901490ljb.116.2023.06.13.07.03.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Jun 2023 07:03:19 -0700 (PDT) From: Konrad Dybcio Date: Tue, 13 Jun 2023 16:03:06 +0200 Subject: [PATCH v4 06/22] interconnect: qcom: icc-rpm: Introduce keep_alive MIME-Version: 1.0 Message-Id: <20230526-topic-smd_icc-v4-6-5ba82b6fbba2@linaro.org> References: <20230526-topic-smd_icc-v4-0-5ba82b6fbba2@linaro.org> In-Reply-To: <20230526-topic-smd_icc-v4-0-5ba82b6fbba2@linaro.org> To: Andy Gross , Bjorn Andersson , Michael Turquette , Stephen Boyd , Georgi Djakov , Leo Yan , Evan Green , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Marijn Suijten , linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, Konrad Dybcio , Dmitry Baryshkov X-Mailer: b4 0.12.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1686664985; l=3661; i=konrad.dybcio@linaro.org; s=20230215; h=from:subject:message-id; bh=g6kESh9vFn5cUExPwamnhleED6tFd+S7dtFe11cmEVE=; b=txFZvUbl6OvaruidkHxp1FJj6BwN9WJVH071d3+J3xY/alHp9umqwGhuWHDsTo9ieUl5wkYp+ Gi4fYAgm3fmDUzReinCy6Ege2000DQbd1SXJL5xS0dyrMWVAcKeSRiZ X-Developer-Key: i=konrad.dybcio@linaro.org; a=ed25519; pk=iclgkYvtl2w05SSXO5EjjSYlhFKsJ+5OSZBjOkQuEms= X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=unavailable 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 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1768596566630824258?= X-GMAIL-MSGID: =?utf-8?q?1768596566630824258?= The downstream kernel employs the concept of "keeping the bus alive" by voting for the minimum (XO/19.2MHz) rate at all times on certain (well, most) buses. This is a very important thing to have, as if we either have a lackluster/wrong DT that doesn't specify a (high enough) vote on a certain bus, we may lose access to the entire bus altogether. This is very apparent when we only start introducing interconnect support on a given platform and haven't yet introduced voting on all peripherals. The same can happen if we only have a single driver casting a vote on a certain bus and that driver exits/crashes/suspends. The keepalive vote is limited to the ACTIVE bucket, as keeping a permanent vote on the SLEEP one could prevent the platform from properly entering low power mode states. Introduce the very same concept, with a slight twist: the vendor kernel checks whether the rate is zero before setting the minimum vote, but that's rather silly, as in doing so we're at the mercy of CCF. Instead, explicitly clamp the rates to always be >= 19.2 MHz for providers with keep_alive=true. Reviewed-by: Dmitry Baryshkov Signed-off-by: Konrad Dybcio --- drivers/interconnect/qcom/icc-rpm.c | 10 ++++++++++ drivers/interconnect/qcom/icc-rpm.h | 3 +++ 2 files changed, 13 insertions(+) diff --git a/drivers/interconnect/qcom/icc-rpm.c b/drivers/interconnect/qcom/icc-rpm.c index 6acc7686ed38..863e8ba1daa2 100644 --- a/drivers/interconnect/qcom/icc-rpm.c +++ b/drivers/interconnect/qcom/icc-rpm.c @@ -50,6 +50,8 @@ #define NOC_QOS_MODE_FIXED_VAL 0x0 #define NOC_QOS_MODE_BYPASS_VAL 0x2 +#define ICC_BUS_CLK_MIN_RATE 19200000ULL + static int qcom_icc_set_qnoc_qos(struct icc_node *src) { struct icc_provider *provider = src->provider; @@ -380,6 +382,13 @@ static int qcom_icc_set(struct icc_node *src, struct icc_node *dst) do_div(rate, src_qn->buswidth); rate = min_t(u64, rate, LONG_MAX); + /* + * Downstream checks whether the requested rate is zero, but it makes little sense + * to vote for a value that's below the lower threshold, so let's not do so. + */ + if (bucket == QCOM_ICC_BUCKET_WAKE && qp->keep_alive) + rate = max(ICC_BUS_CLK_MIN_RATE, rate); + if (qp->bus_clk_rate[i] == rate) continue; @@ -453,6 +462,7 @@ int qnoc_probe(struct platform_device *pdev) for (i = 0; i < qp->num_bus_clks; i++) qp->bus_clks[i].id = bus_clocks[i]; + qp->keep_alive = desc->keep_alive; qp->type = desc->type; qp->qos_offset = desc->qos_offset; diff --git a/drivers/interconnect/qcom/icc-rpm.h b/drivers/interconnect/qcom/icc-rpm.h index ee705edf19dd..d2c04c400cad 100644 --- a/drivers/interconnect/qcom/icc-rpm.h +++ b/drivers/interconnect/qcom/icc-rpm.h @@ -33,6 +33,7 @@ enum qcom_icc_type { * @bus_clk_rate: bus clock rate in Hz * @bus_clks: the clk_bulk_data table of bus clocks * @intf_clks: a clk_bulk_data array of interface clocks + * @keep_alive: whether to always keep a minimum vote on the bus clocks * @is_on: whether the bus is powered on */ struct qcom_icc_provider { @@ -45,6 +46,7 @@ struct qcom_icc_provider { u64 bus_clk_rate[NUM_BUS_CLKS]; struct clk_bulk_data bus_clks[NUM_BUS_CLKS]; struct clk_bulk_data *intf_clks; + bool keep_alive; bool is_on; }; @@ -102,6 +104,7 @@ struct qcom_icc_desc { const char * const *bus_clocks; const char * const *intf_clocks; size_t num_intf_clocks; + bool keep_alive; bool no_clk_scaling; enum qcom_icc_type type; const struct regmap_config *regmap_cfg;