From: Matthias Kaehlcke <mka@chromium.org>
To: Akash Asthana <akashast@codeaurora.org>
Cc: gregkh@linuxfoundation.org, agross@kernel.org,
bjorn.andersson@linaro.org, wsa@the-dreams.de,
broonie@kernel.org, mark.rutland@arm.com, robh+dt@kernel.org,
georgi.djakov@linaro.org, linux-i2c@vger.kernel.org,
linux-spi@vger.kernel.org, devicetree@vger.kernel.org,
swboyd@chromium.org, mgautam@codeaurora.org,
linux-arm-msm@vger.kernel.org, linux-serial@vger.kernel.org,
dianders@chromium.org, evgreen@chromium.org
Subject: Re: [PATCH V4 3/9] soc: qcom: geni: Support for ICC voting
Date: Wed, 15 Apr 2020 16:36:03 -0700 [thread overview]
Message-ID: <20200415233603.GZ199755@google.com> (raw)
In-Reply-To: <1586946198-13912-4-git-send-email-akashast@codeaurora.org>
Hi Akash,
On Wed, Apr 15, 2020 at 03:53:12PM +0530, Akash Asthana wrote:
> Add necessary macros and structure variables to support ICC BW
> voting from individual SE drivers.
>
> Signed-off-by: Akash Asthana <akashast@codeaurora.org>
> ---
> Changes in V2:
> - As per Bjorn's comment dropped enums for ICC paths, given the three
> paths individual members
>
> Changes in V3:
> - Add geni_icc_get, geni_icc_vote_on and geni_icc_vote_off as helper API.
> - Add geni_icc_path structure in common header
>
> Changes in V4:
> - As per Bjorn's comment print error message in geni_icc_get if return
> value is not -EPROBE_DEFER.
> - As per Bjorn's comment remove NULL on path before calling icc_set_bw
> API.
> - As per Bjorn's comment drop __func__ print.
> - As per Matthias's comment, make ICC path a array instead of individual
> member entry in geni_se struct.
>
> Note: I have ignored below check patch suggestion because it was throwing
> compilation error as 'icc_ddr' is not compile time comstant.
>
> WARNING: char * array declaration might be better as static const
> - FILE: drivers/soc/qcom/qcom-geni-se.c:726:
> - const char *icc_names[] = {"qup-core", "qup-config", icc_ddr};
>
>
> drivers/soc/qcom/qcom-geni-se.c | 61 +++++++++++++++++++++++++++++++++++++++++
> include/linux/qcom-geni-se.h | 31 +++++++++++++++++++++
> 2 files changed, 92 insertions(+)
>
> diff --git a/drivers/soc/qcom/qcom-geni-se.c b/drivers/soc/qcom/qcom-geni-se.c
> index 7d622ea..1527bc4 100644
> --- a/drivers/soc/qcom/qcom-geni-se.c
> +++ b/drivers/soc/qcom/qcom-geni-se.c
> @@ -720,6 +720,67 @@ void geni_se_rx_dma_unprep(struct geni_se *se, dma_addr_t iova, size_t len)
> }
> EXPORT_SYMBOL(geni_se_rx_dma_unprep);
>
> +int geni_icc_get(struct geni_se *se, const char *icc_ddr)
> +{
> + int i, icc_err;
> + const char *icc_names[] = {"qup-core", "qup-config", icc_ddr};
> +
> + for (i = 0; i < ARRAY_SIZE(se->icc_paths); i++) {
> + if (!icc_names[i])
> + continue;
> +
> + se->icc_paths[i].path = devm_of_icc_get(se->dev, icc_names[i]);
> + if (IS_ERR(se->icc_paths[i].path))
> + goto icc_get_failure;
> + }
> +
> + return 0;
> +
> +icc_get_failure:
> + icc_err = PTR_ERR(se->icc_paths[i].path);
> + if (icc_err != -EPROBE_DEFER)
> + dev_err_ratelimited(se->dev, "Failed to get path:%d, ret:%d\n",
Better be explicit that it's an ICC path and log icc_names[i] instead of i.
> + i, icc_err);
> + return icc_err;
> +
> +}
> +EXPORT_SYMBOL(geni_icc_get);
> +
> +int geni_icc_vote_on(struct geni_se *se)
> +{
> + int i, ret;
> +
> + for (i = 0; i < ARRAY_SIZE(se->icc_paths); i++) {
> + ret = icc_set_bw(se->icc_paths[i].path,
> + se->icc_paths[i].avg_bw, se->icc_paths[i].peak_bw);
I'll leave it to others to decide whether it's ok to leave the
implementation of the icc_enable/disable() APIs suggested on
https://patchwork.kernel.org/patch/11467511/#23269555 for later.
> + if (ret) {
> + dev_err_ratelimited(se->dev, "ICC BW voting failed on path:%d, ret:%d\n",
> + i, ret);
Instead of logging the index, which isn't very expressive, you could have
a static string array of the path names ({"core", "config", "ddr"} or
similar) that is used when logging errors in _vote_on/off().
> + return ret;
> + }
> + }
> +
> + return 0;
> +}
> +EXPORT_SYMBOL(geni_icc_vote_on);
> +
> +int geni_icc_vote_off(struct geni_se *se)
> +{
> + int i, ret;
> +
> + for (i = 0; i < ARRAY_SIZE(se->icc_paths); i++) {
> + ret = icc_set_bw(se->icc_paths[i].path, 0, 0);
> + if (ret) {
> + dev_err_ratelimited(se->dev, "ICC BW remove failed on path:%d, ret:%d\n",
> + i, ret);
> + return ret;
> + }
> + }
> +
> + return 0;
> +}
> +EXPORT_SYMBOL(geni_icc_vote_off);
> +
> static int geni_se_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> diff --git a/include/linux/qcom-geni-se.h b/include/linux/qcom-geni-se.h
> index dd46494..b5b9316 100644
> --- a/include/linux/qcom-geni-se.h
> +++ b/include/linux/qcom-geni-se.h
> @@ -6,6 +6,8 @@
> #ifndef _LINUX_QCOM_GENI_SE
> #define _LINUX_QCOM_GENI_SE
>
> +#include <linux/interconnect.h>
> +
> /* Transfer mode supported by GENI Serial Engines */
> enum geni_se_xfer_mode {
> GENI_SE_INVALID,
> @@ -25,6 +27,12 @@ enum geni_se_protocol_type {
> struct geni_wrapper;
> struct clk;
>
> +struct geni_icc_path {
> + struct icc_path *path;
> + unsigned int avg_bw;
> + unsigned int peak_bw;
> +};
> +
> /**
> * struct geni_se - GENI Serial Engine
> * @base: Base Address of the Serial Engine's register block
> @@ -33,6 +41,7 @@ struct clk;
> * @clk: Handle to the core serial engine clock
> * @num_clk_levels: Number of valid clock levels in clk_perf_tbl
> * @clk_perf_tbl: Table of clock frequency input to serial engine clock
> + * @icc_paths: Array of ICC paths for SE
> */
> struct geni_se {
> void __iomem *base;
> @@ -41,6 +50,7 @@ struct geni_se {
> struct clk *clk;
> unsigned int num_clk_levels;
> unsigned long *clk_perf_tbl;
> + struct geni_icc_path icc_paths[3];
You also need enums for the paths, otherwise you end up with code like
this, which isn't really self-explanatory:
gi2c->se.icc_paths[0].avg_bw = GENI_DEFAULT_BW;
gi2c->se.icc_paths[1].avg_bw = GENI_DEFAULT_BW;
gi2c->se.icc_paths[2].avg_bw = Bps_to_icc(gi2c->clk_freq_out);
(from "[V4,5/9] i2c: i2c-qcom-geni: Add interconnect support")
I know Bjorn asked in v1 to remove the enums you had, however it was
a slightly different context. If we are sticking to use an array of
'struct geni_icc_path' (which reduces redundant code) the enums are
'needed'.
next prev parent reply other threads:[~2020-04-15 23:36 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-15 10:23 [PATCH V4 0/9] Add interconnect support to QSPI and QUP drivers Akash Asthana
2020-04-15 10:23 ` [PATCH V4 1/9] interconnect: Add devm_of_icc_get() as exported API for users Akash Asthana
2020-04-28 16:04 ` Georgi Djakov
2020-04-15 10:23 ` [PATCH V4 2/9] interconnect: Set peak requirement as twice of average Akash Asthana
2020-04-23 9:31 ` Georgi Djakov
2020-04-28 9:46 ` Akash Asthana
2020-04-28 10:53 ` Georgi Djakov
2020-04-15 10:23 ` [PATCH V4 3/9] soc: qcom: geni: Support for ICC voting Akash Asthana
2020-04-15 23:36 ` Matthias Kaehlcke [this message]
2020-04-28 9:48 ` Akash Asthana
2020-04-15 10:23 ` [PATCH V4 4/9] soc: qcom-geni-se: Add interconnect support to fix earlycon crash Akash Asthana
2020-04-16 0:31 ` Matthias Kaehlcke
2020-04-28 10:21 ` Akash Asthana
2020-04-28 15:48 ` Matthias Kaehlcke
2020-04-15 10:23 ` [PATCH V4 5/9] i2c: i2c-qcom-geni: Add interconnect support Akash Asthana
2020-04-16 17:09 ` Matthias Kaehlcke
2020-04-15 10:23 ` [PATCH V4 6/9] spi: spi-geni-qcom: " Akash Asthana
2020-04-15 11:39 ` Mark Brown
2020-04-15 10:23 ` [PATCH V4 7/9] tty: serial: qcom_geni_serial: " Akash Asthana
2020-04-16 17:17 ` Matthias Kaehlcke
2020-04-15 10:23 ` [PATCH V4 8/9] spi: spi-qcom-qspi: " Akash Asthana
2020-04-15 10:23 ` [PATCH V4 9/9] arm64: dts: sc7180: Add interconnect for QUP and QSPI Akash Asthana
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200415233603.GZ199755@google.com \
--to=mka@chromium.org \
--cc=agross@kernel.org \
--cc=akashast@codeaurora.org \
--cc=bjorn.andersson@linaro.org \
--cc=broonie@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=dianders@chromium.org \
--cc=evgreen@chromium.org \
--cc=georgi.djakov@linaro.org \
--cc=gregkh@linuxfoundation.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
--cc=linux-spi@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mgautam@codeaurora.org \
--cc=robh+dt@kernel.org \
--cc=swboyd@chromium.org \
--cc=wsa@the-dreams.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.