Re: [PATCH V5 1/7] soc: qcom: geni: Support for ICC voting
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
- Subject: Re: [PATCH V5 1/7] soc: qcom: geni: Support for ICC voting
- From: Akash Asthana <akashast@xxxxxxxxxxxxxx>
- Date: Tue, 12 May 2020 19:56:05 +0530
- Cc: gregkh@xxxxxxxxxxxxxxxxxxx, agross@xxxxxxxxxx, bjorn.andersson@xxxxxxxxxx, wsa@xxxxxxxxxxxxx, broonie@xxxxxxxxxx, mark.rutland@xxxxxxx, robh+dt@xxxxxxxxxx, linux-i2c@xxxxxxxxxxxxxxx, linux-spi@xxxxxxxxxxxxxxx, devicetree@xxxxxxxxxxxxxxx, swboyd@xxxxxxxxxxxx, mgautam@xxxxxxxxxxxxxx, linux-arm-msm@xxxxxxxxxxxxxxx, linux-serial@xxxxxxxxxxxxxxx, dianders@xxxxxxxxxxxx, evgreen@xxxxxxxxxxxx, georgi.djakov@xxxxxxxxxx
- Dmarc-filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 4FCE1C433F2
- In-reply-to: <20200508190301.GG4525@google.com>
- References: <1588919619-21355-1-git-send-email-akashast@codeaurora.org> <1588919619-21355-2-git-send-email-akashast@codeaurora.org> <20200508190301.GG4525@google.com>
- User-agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.8.0
Hi Matthias,
On 5/9/2020 12:33 AM, Matthias Kaehlcke wrote:
On Fri, May 08, 2020 at 12:03:33PM +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@xxxxxxxxxxxxxx>
---
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};
Changes in V5:
- As per Matthias's comment defined enums for ICC paths.
- Integrate icc_enable/disable with power on/off call for driver.
- As per Matthias's comment added icc_path_names array to print icc path name
in failure case.
- As per Georgi's suggestion assume peak_bw = avg_bw if not mentioned.
drivers/soc/qcom/qcom-geni-se.c | 92 +++++++++++++++++++++++++++++++++++++++++
include/linux/qcom-geni-se.h | 42 +++++++++++++++++++
2 files changed, 134 insertions(+)
diff --git a/drivers/soc/qcom/qcom-geni-se.c b/drivers/soc/qcom/qcom-geni-se.c
index 7d622ea..63403bf 100644
--- a/drivers/soc/qcom/qcom-geni-se.c
+++ b/drivers/soc/qcom/qcom-geni-se.c
@@ -92,6 +92,9 @@ struct geni_wrapper {
struct clk_bulk_data ahb_clks[NUM_AHB_CLKS];
};
+static const char * const icc_path_names[] = {"qup-core", "qup-config",
+ "qup-memory"};
+
#define QUP_HW_VER_REG 0x4
/* Common SE registers */
@@ -720,6 +723,95 @@ 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 ICC path:%s, ret:%d\n",
+ icc_names[i], icc_err);
+ return icc_err;
+
+}
+EXPORT_SYMBOL(geni_icc_get);
+
+void geni_icc_bw_init(struct geni_icc_path *icc_paths, unsigned int avg_bw,
+ unsigned int peak_bw)
I noticed that all callers of geni_icc_bw_init() pass 0 as
'peak_pw' (aka peak == avg). Unless there are plans to use other
values for the peak bandwidth in the future it is pointless to
track the bandwidth(s) in two variables. And if the bandwidth is
tracked in a single variable this function is not needed.
As of now we are not aware of our peak requirement(avg requirement works
good for us) so I am passing (peak = avg) as per Georgi's suggestion.
But I wanted to make this feature more generic and keeping the
possibilty open that we might have to use other peak(!=0) value in future.
Regards,
Akash
+{
+ if (!peak_bw)
+ peak_bw = avg_bw;
+ icc_paths->avg_bw = avg_bw;
+ icc_paths->peak_bw = peak_bw;
+}
+EXPORT_SYMBOL(geni_icc_bw_init);
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,\na Linux Foundation Collaborative Project
[Index of Archives]
[Linux Kernel]
[Linux ARM (vger)]
[Linux ARM MSM]
[Linux Omap]
[Linux Arm]
[Linux Tegra]
[Fedora ARM]
[Linux for Samsung SOC]
[eCos]
[Linux Fastboot]
[Gcc Help]
[Git]
[DCCP]
[IETF Announce]
[Security]
[Linux MIPS]
[Yosemite Campsites]
|