Received: by 2002:a25:e7d8:0:0:0:0:0 with SMTP id e207csp83141ybh; Mon, 9 Mar 2020 16:45:45 -0700 (PDT) X-Google-Smtp-Source: ADFU+vtAk47NnWJSA4m+W7QO4kbL4qYVCgxH5jYetvjbcQz5LVs+W7u9CS9nP4GzQB1Lw9HDSXxD X-Received: by 2002:aca:c256:: with SMTP id s83mr1216706oif.57.1583797545861; Mon, 09 Mar 2020 16:45:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1583797545; cv=none; d=google.com; s=arc-20160816; b=DCp8EqElm0g+UVsfgT1ZCkx5PN4BsmPctDr9Q+vXFp/klYxz50tS7ZqRlmI/V2+4tc 1xaTirJ2nKakVErnLmeitY7dDcV+txJQFqm8YnWhLRrAZhdSuNuA/Huw0iEhHeFalA72 oYU/J8q1T4mVmeqKfpwsU/H5V1gkyWuqF9rN+6EUV9F+Aexo0H0S9VY1+iYG/umw3k4h ieRPb8LsyFJBhZM7OsIlA+C8pvQMEEMhteYUPif5OHFENo+VpibBDcjp9E4BH67Wiu2h /m9HK3qj4lGECL4siQjCYLEHgQXWnRQKE5l8b5Omv68zKbzGdjSuUvShgaYtvWZVINBy i2xA== 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 :in-reply-to:references:mime-version:dkim-signature; bh=xs7n6p/5EOR908vUlGJCRK4XfcfhF6iASL+/f9fqBa4=; b=PPQrmW2NzeqnbPuSnslWICidPA1OemTRnlBzvKEPblSUp1kWWe4HuKwFb87W23l4nW vFB3RJSVBnSh4/Sk3kzYCRV07xfh1HHbq9uNxLNaSSDTkTNqf2UMkM68+Sx3ykc4gApv 3rMd1VbKBMQ8SB5MOLLqXwY6Fd6NXIUyDkcAdIeLmmbeOsgX5nxNGLzImOUb+S3yW2Ex oDrDH8fy7shXBvSrmiNoFp7IzwmAoAI2Dh+02BQM4jZAlDfFcA7Bm+rU2NODLCKq/kcL k+paXMRCM7adSqHGjPl/FOsg+mNnxU4OV7Z/hnLj4kWr9eJEC++sLKUw4yjMbo4azcVx o07Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=ge1B4hGA; 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=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h9si3272036otk.127.2020.03.09.16.45.34; Mon, 09 Mar 2020 16:45:45 -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=@chromium.org header.s=google header.b=ge1B4hGA; 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=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727406AbgCIXon (ORCPT + 99 others); Mon, 9 Mar 2020 19:44:43 -0400 Received: from mail-vs1-f65.google.com ([209.85.217.65]:40240 "EHLO mail-vs1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727242AbgCIXom (ORCPT ); Mon, 9 Mar 2020 19:44:42 -0400 Received: by mail-vs1-f65.google.com with SMTP id c18so7257140vsq.7 for ; Mon, 09 Mar 2020 16:44:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=xs7n6p/5EOR908vUlGJCRK4XfcfhF6iASL+/f9fqBa4=; b=ge1B4hGATR9s3Ng2NYfxGB5RxmZBNi0v8NQmaecDV77poEgjv5+h7zBVxFdwf7XK5H Nez68YCXSUynjff11ajiGPs5JC8wLuO8aBCzjqybcTIEB50rWF6OPV7RTNS246DWz7bI BeXdcQmVdU4sYy4V5QzKLaUqjVMItoqG0StPg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=xs7n6p/5EOR908vUlGJCRK4XfcfhF6iASL+/f9fqBa4=; b=KhO261yhNriO1UQh4DrNEYatzZ4mqrxPJ6znvyOhhMbg2Ecd9i5p+XeUiyIkzEcQE0 +49w3yahf0sx7LS70WC1KVRl5i06neI06Rfdkm5rbOuOdybq18seruc7JgyAnrtLcgZ0 VrQnUENlQ08vWuRh0Lni1qgbKgt2gIli1O2/U8zVQrU28YHUCQwp9zmhNjaQOFADgCG8 KfSgMH5TaucgcLCUHLwirFRqLvhG37IW06+Zy23y4oUnX1YYVInkg5AwBiHnwWK2rMty KR11GKQfFgdMWG6bJn5N9ARquBCIG9BuzdxX2PUV2RcvuDOrZ0RFmDsOC6b2mWK9iA/1 Is7A== X-Gm-Message-State: ANhLgQ3pYmqNhCp3S9Wge8vljF2rJnxyKqTjgbLha+/KYWFuJHERz7GS CajTTIBPWnWqzOy/c/D7v8ZcRrzqvNw= X-Received: by 2002:a05:6102:124b:: with SMTP id p11mr11852010vsg.38.1583797480039; Mon, 09 Mar 2020 16:44:40 -0700 (PDT) Received: from mail-vs1-f43.google.com (mail-vs1-f43.google.com. [209.85.217.43]) by smtp.gmail.com with ESMTPSA id h67sm12819393vka.25.2020.03.09.16.44.39 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 09 Mar 2020 16:44:39 -0700 (PDT) Received: by mail-vs1-f43.google.com with SMTP id u26so7282181vsg.2 for ; Mon, 09 Mar 2020 16:44:39 -0700 (PDT) X-Received: by 2002:a05:6102:2dc:: with SMTP id h28mr11670096vsh.169.1583797478587; Mon, 09 Mar 2020 16:44:38 -0700 (PDT) MIME-Version: 1.0 References: <1583746236-13325-1-git-send-email-mkshah@codeaurora.org> <1583746236-13325-6-git-send-email-mkshah@codeaurora.org> In-Reply-To: <1583746236-13325-6-git-send-email-mkshah@codeaurora.org> From: Doug Anderson Date: Mon, 9 Mar 2020 16:44:27 -0700 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v13 5/5] drivers: qcom: Update rpmh clients to use start and end transactions To: Maulik Shah Cc: Stephen Boyd , Matthias Kaehlcke , Evan Green , Bjorn Andersson , LKML , linux-arm-msm , Andy Gross , Rajendra Nayak , Lina Iyer , lsrao@codeaurora.org, Taniya Das , Odelu Kukatla , Kiran Gunda , Sibi Sankar 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 Hi, On Mon, Mar 9, 2020 at 2:31 AM Maulik Shah wrote: > > Update all rpmh clients to start using rpmh_start_transaction() and > rpmh_end_transaction(). > > Cc: Taniya Das > Cc: Odelu Kukatla > Cc: Kiran Gunda > Cc: Sibi Sankar > Signed-off-by: Maulik Shah > --- > drivers/clk/qcom/clk-rpmh.c | 21 ++++++++++++++------- > drivers/interconnect/qcom/bcm-voter.c | 13 +++++++++---- > drivers/regulator/qcom-rpmh-regulator.c | 4 ++++ > drivers/soc/qcom/rpmhpd.c | 11 +++++++++-- This needs to be 4 separate patches since the change to each subsystem will go through a different maintainer. Also: it'll be a lot easier to land this if you make the new rpmh_start_transaction() and rpmh_end_transaction() calls _optional_ for now, especially since they are just a speed optimization and not for correctness. That is, if a driver makes a call to rpmh_write(), rpmh_write_async(), rpmh_write_batch(), or rpmh_invalidate() without doing rpmh_start_transaction() then it should still work--just flush right away. Since you have rpmh_start_transaction() refcounted that's as simple as making a call to rpmh_start_transaction() at the beginning of all public calls and rpmh_end_transaction() at the end. If there was already a refcount then no harm done. If there wasn't you'll get a flush at the end. Once you make the call optional, you can actually leave changing the callers until after your series lands. Then you don't end up bothering all the other maintainers with the back-and-forth. Once all callers are updated you can make the call required. ...or (as noted below) maybe we should just keep it optional... One last note here: you have a regulator change here but aren't sending it to the regulator maintainer. That won't work. You also have an interconnect change without sending it to the interconnect maintainer. > 4 files changed, 36 insertions(+), 13 deletions(-) > > diff --git a/drivers/clk/qcom/clk-rpmh.c b/drivers/clk/qcom/clk-rpmh.c > index 12bd871..16f68d4 100644 > --- a/drivers/clk/qcom/clk-rpmh.c > +++ b/drivers/clk/qcom/clk-rpmh.c > @@ -154,22 +154,27 @@ static int clk_rpmh_send_aggregate_command(struct clk_rpmh *c) > cmd_state = c->aggr_state; > on_val = c->res_on_val; > > + rpmh_start_transaction(c->dev); > + > for (; state <= RPMH_ACTIVE_ONLY_STATE; state++) { > if (has_state_changed(c, state)) { > if (cmd_state & BIT(state)) > cmd.data = on_val; > > ret = rpmh_write_async(c->dev, state, &cmd, 1); > - if (ret) { > - dev_err(c->dev, "set %s state of %s failed: (%d)\n", > - !state ? "sleep" : > - state == RPMH_WAKE_ONLY_STATE ? > - "wake" : "active", c->res_name, ret); > - return ret; > - } > + if (ret) > + break; > } > } > > + ret |= rpmh_end_transaction(c->dev); You can't do this. "ret" is an integer and you're munging two error codes into one int. I don't think there is any clever way to do this, but probably this would be fine (the compiler should optimize): if (ret) rpmh_end_transaction(c->dev); else ret = rpmh_end_transaction(c->dev); ...or just leave the "dev_err" and "return ret" where they were and call rpmh_end_transaction() above without looking at the return value. > + if (ret) { > + dev_err(c->dev, "set %s state of %s failed: (%d)\n", > + !state ? "sleep" : state == RPMH_WAKE_ONLY_STATE ? > + "wake" : "active", c->res_name, ret); > + return ret; > + } Technically the error message above is now misleading if the "end_transaction" failed. Namely it will blame things on the active only state whereas that wasn't the problem. > + > c->last_sent_aggr_state = c->aggr_state; > c->peer->last_sent_aggr_state = c->last_sent_aggr_state; > > @@ -267,7 +272,9 @@ static int clk_rpmh_bcm_send_cmd(struct clk_rpmh *c, bool enable) > cmd.addr = c->res_addr; > cmd.data = BCM_TCS_CMD(1, enable, 0, cmd_state); > > + rpmh_start_transaction(c->dev); > ret = rpmh_write_async(c->dev, RPMH_ACTIVE_ONLY_STATE, &cmd, 1); > + ret |= rpmh_end_transaction(c->dev); Again, no |= Also: one argument for keeping start_transaction and end_transaction optional long term is that you could completely eliminate this change. > if (ret) { > dev_err(c->dev, "set active state of %s failed: (%d)\n", > c->res_name, ret); > diff --git a/drivers/interconnect/qcom/bcm-voter.c b/drivers/interconnect/qcom/bcm-voter.c > index 2adfde8..fbe18b2 100644 > --- a/drivers/interconnect/qcom/bcm-voter.c > +++ b/drivers/interconnect/qcom/bcm-voter.c > @@ -263,7 +263,9 @@ int qcom_icc_bcm_voter_commit(struct bcm_voter *voter) > tcs_list_gen(&voter->commit_list, QCOM_ICC_BUCKET_AMC, cmds, commit_idx); > > if (!commit_idx[0]) > - goto out; > + goto end; > + > + rpmh_start_transaction(voter-dev); > > ret = rpmh_invalidate(voter->dev); > if (ret) { > @@ -312,12 +314,15 @@ int qcom_icc_bcm_voter_commit(struct bcm_voter *voter) > tcs_list_gen(&voter->commit_list, QCOM_ICC_BUCKET_SLEEP, cmds, commit_idx); > > ret = rpmh_write_batch(voter->dev, RPMH_SLEEP_STATE, cmds, commit_idx); > - if (ret) { > + if (ret) > pr_err("Error sending SLEEP RPMH requests (%d)\n", ret); > - goto out; > - } > > out: > + ret = rpmh_end_transaction(voter-dev); > + if (ret) > + pr_err("Error ending rpmh transaction (%d)\n", ret); > + > +end: Personally I don't think "out" and "end" are very descriptive. My own favorite is to name these types of labels based on what has been done so far. So: exit_started_rpmh_transaction: exit_constructed_list: > list_for_each_entry_safe(bcm, bcm_tmp, &voter->commit_list, list) > list_del_init(&bcm->list); > > diff --git a/drivers/regulator/qcom-rpmh-regulator.c b/drivers/regulator/qcom-rpmh-regulator.c > index c86ad40..f4b9176 100644 > --- a/drivers/regulator/qcom-rpmh-regulator.c > +++ b/drivers/regulator/qcom-rpmh-regulator.c > @@ -163,12 +163,16 @@ static int rpmh_regulator_send_request(struct rpmh_vreg *vreg, > { > int ret; > > + rpmh_start_transaction(vreg->dev); > + > if (wait_for_ack || vreg->always_wait_for_ack) > ret = rpmh_write(vreg->dev, RPMH_ACTIVE_ONLY_STATE, cmd, 1); > else > ret = rpmh_write_async(vreg->dev, RPMH_ACTIVE_ONLY_STATE, cmd, > 1); > > + ret |= rpmh_end_transaction(vreg->dev); Again, no |=. ...and again, if starting/ending was optional you wouldn't need this change. > + > return ret; > } > > diff --git a/drivers/soc/qcom/rpmhpd.c b/drivers/soc/qcom/rpmhpd.c > index 4d264d0..0e9d204 100644 > --- a/drivers/soc/qcom/rpmhpd.c > +++ b/drivers/soc/qcom/rpmhpd.c > @@ -193,19 +193,26 @@ static const struct of_device_id rpmhpd_match_table[] = { > static int rpmhpd_send_corner(struct rpmhpd *pd, int state, > unsigned int corner, bool sync) > { > + int ret; > struct tcs_cmd cmd = { > .addr = pd->addr, > .data = corner, > }; > > + rpmh_start_transaction(pd->dev); > + > /* > * Wait for an ack only when we are increasing the > * perf state of the power domain > */ > if (sync) > - return rpmh_write(pd->dev, state, &cmd, 1); > + ret = rpmh_write(pd->dev, state, &cmd, 1); > else > - return rpmh_write_async(pd->dev, state, &cmd, 1); > + ret = rpmh_write_async(pd->dev, state, &cmd, 1); > + > + ret |= rpmh_end_transaction(pd->dev); Again, no |=. ...and again, if starting/ending was optional you wouldn't need this change. -Doug