From: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
To: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Cc: vireshk@kernel.org, nm@ti.com, sboyd@kernel.org,
myungjoo.ham@samsung.com, kyungmin.park@samsung.com,
cw00.choi@samsung.com, andersson@kernel.org,
konrad.dybcio@linaro.org, robh+dt@kernel.org,
krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org,
linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org,
quic_asutoshd@quicinc.com, quic_cang@quicinc.com,
quic_nitirawa@quicinc.com, quic_narepall@quicinc.com,
quic_bhaskarv@quicinc.com, quic_richardp@quicinc.com,
quic_nguyenb@quicinc.com, quic_ziqichen@quicinc.com,
bmasney@redhat.com, krzysztof.kozlowski@linaro.org
Subject: Re: [PATCH 14/14] scsi: ufs: qcom: Add support for scaling interconnects
Date: Thu, 13 Jul 2023 10:50:52 +0530 [thread overview]
Message-ID: <20230713052052.GD3047@thinkpad> (raw)
In-Reply-To: <be734fa0-1b16-0dad-6205-d1f1acb1f179@linaro.org>
On Wed, Jul 12, 2023 at 08:23:02PM +0300, Dmitry Baryshkov wrote:
> On 12/07/2023 19:41, Manivannan Sadhasivam wrote:
> > On Wed, Jul 12, 2023 at 04:22:51PM +0300, Dmitry Baryshkov wrote:
> > > On 12/07/2023 13:32, Manivannan Sadhasivam wrote:
> > > > Qcom SoCs require scaling the interconnect paths for proper working of the
> > > > peripherals connected through interconnects. Even for accessing the UFS
> > > > controller, someone should setup the interconnect paths. So far, the
> > > > bootloaders used to setup the interconnect paths before booting linux as
> > > > they need to access the UFS storage for things like fetching boot firmware.
> > > > But with the advent of multi boot options, bootloader nowadays like in
> > > > SA8540p SoC do not setup the interconnect paths at all.
> > > >
> > > > So trying to configure UFS in the absence of the interconnect path
> > > > configuration, results in boot crash.
> > > >
> > > > To fix this issue and also to dynamically scale the interconnects (UFS-DDR
> > > > and CPU-UFS), interconnect API support is added to the Qcom UFS driver.
> > > > With this support, the interconnect paths are scaled dynamically based on
> > > > the gear configuration.
> > > >
> > > > During the early stage of ufs_qcom_init(), ufs_qcom_icc_init() will setup
> > > > the paths to max bandwidth to allow configuring the UFS registers. Touching
> > > > the registers without configuring the icc paths would result in a crash.
> > > > However, we don't really need to set max vote for the icc paths as any
> > > > minimal vote would suffice. But the max value would allow initialization to
> > > > be done faster. After init, the bandwidth will get updated using
> > > > ufs_qcom_icc_update_bw() based on the gear and lane configuration.
> > > >
> > > > The bandwidth values defined in ufs_qcom_bw_table struct are taken from
> > > > Qcom downstream vendor devicetree source and are calculated as per the
> > > > UFS3.1 Spec, Section 6.4.1, HS Gear Rates. So it is fixed across platforms.
> > > >
> > > > Cc: Brian Masney <bmasney@redhat.com>
> > > > Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
> > > > ---
> > > > drivers/ufs/host/ufs-qcom.c | 131 +++++++++++++++++++++++++++++++++++-
> > > > drivers/ufs/host/ufs-qcom.h | 3 +
> > > > 2 files changed, 133 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
> > > > index 8d6fd4c3324f..8a3132d45a65 100644
> > > > --- a/drivers/ufs/host/ufs-qcom.c
> > > > +++ b/drivers/ufs/host/ufs-qcom.c
> > > > @@ -7,6 +7,7 @@
> > > > #include <linux/time.h>
> > > > #include <linux/clk.h>
> > > > #include <linux/delay.h>
> > > > +#include <linux/interconnect.h>
> > > > #include <linux/module.h>
> > > > #include <linux/of.h>
> > > > #include <linux/platform_device.h>
> > > > @@ -46,6 +47,49 @@ enum {
> > > > TSTBUS_MAX,
> > > > };
> >
[...]
> > > };
> > >
> > > Also, do we have defines for gears? Can we use them instead of indices?
> > >
> >
> > There are defines for the gears but not for lanes. So I ended up using numbers
> > for simplicity.
>
> My suggestion would be to use them for gears at least. Then it becomes
> cleaner (and maybe will solve some of my other comments).
>
I think it'd better to add enums for lanes as well (in unipro.h) and use both.
> >
> > - Mani
> >
> > > > + [MODE_PWM][1][1] = { 922, 1000 },
> > > > + [MODE_PWM][2][1] = { 1844, 1000 },
> > > > + [MODE_PWM][3][1] = { 3688, 1000 },
> > > > + [MODE_PWM][4][1] = { 7376, 1000 },
> > > > + [MODE_PWM][1][2] = { 1844, 1000 },
> > > > + [MODE_PWM][2][2] = { 3688, 1000 },
> > > > + [MODE_PWM][3][2] = { 7376, 1000 },
> > > > + [MODE_PWM][4][2] = { 14752, 1000 },
> > > > + [MODE_HS_RA][1][1] = { 127796, 1000 },
> > > > + [MODE_HS_RA][2][1] = { 255591, 1000 },
> > > > + [MODE_HS_RA][3][1] = { 1492582, 102400 },
> > > > + [MODE_HS_RA][4][1] = { 2915200, 204800 },
> > > > + [MODE_HS_RA][1][2] = { 255591, 1000 },
> > > > + [MODE_HS_RA][2][2] = { 511181, 1000 },
> > > > + [MODE_HS_RA][3][2] = { 1492582, 204800 },
> > > > + [MODE_HS_RA][4][2] = { 2915200, 409600 },
> > > > + [MODE_HS_RB][1][1] = { 149422, 1000 },
> > > > + [MODE_HS_RB][2][1] = { 298189, 1000 },
> > > > + [MODE_HS_RB][3][1] = { 1492582, 102400 },
> > > > + [MODE_HS_RB][4][1] = { 2915200, 204800 },
> > > > + [MODE_HS_RB][1][2] = { 298189, 1000 },
> > > > + [MODE_HS_RB][2][2] = { 596378, 1000 },
> > > > + [MODE_HS_RB][3][2] = { 1492582, 204800 },
> > > > + [MODE_HS_RB][4][2] = { 2915200, 409600 },
> > > > + [MODE_MAX][0][0] = { 7643136, 307200 },
> > > > +};
> > > > +
[...]
> > > > +static int ufs_qcom_icc_update_bw(struct ufs_qcom_host *host)
> > > > +{
> > > > + struct __ufs_qcom_bw_table bw_table;
> > > > +
> > > > + bw_table = ufs_qcom_get_bw_table(host);
> > > > +
> > > > + return ufs_qcom_icc_set_bw(host, bw_table.bw1, bw_table.bw2);
> > > > +}
> > > > +
> > > > static int ufs_qcom_pwr_change_notify(struct ufs_hba *hba,
> > > > enum ufs_notify_change_status status,
> > > > struct ufs_pa_layer_attr *dev_max_params,
> > > > @@ -852,6 +941,8 @@ static int ufs_qcom_pwr_change_notify(struct ufs_hba *hba,
> > > > memcpy(&host->dev_req_params,
> > > > dev_req_params, sizeof(*dev_req_params));
> > > > + ufs_qcom_icc_update_bw(host);
> > > > +
> > > > /* disable the device ref clock if entered PWM mode */
> > > > if (ufshcd_is_hs_mode(&hba->pwr_info) &&
> > > > !ufshcd_is_hs_mode(dev_req_params))
> > > > @@ -981,7 +1072,9 @@ static int ufs_qcom_setup_clocks(struct ufs_hba *hba, bool on,
> > > > switch (status) {
> > > > case PRE_CHANGE:
> > > > - if (!on) {
> > > > + if (on) {
> > > > + ufs_qcom_icc_update_bw(host);
> > > > + } else {
> > > > if (!ufs_qcom_is_link_active(hba)) {
> > > > /* disable device ref_clk */
> > > > ufs_qcom_dev_ref_clk_ctrl(host, false);
> > > > @@ -993,6 +1086,9 @@ static int ufs_qcom_setup_clocks(struct ufs_hba *hba, bool on,
> > > > /* enable the device ref clock for HS mode*/
> > > > if (ufshcd_is_hs_mode(&hba->pwr_info))
> > > > ufs_qcom_dev_ref_clk_ctrl(host, true);
> > > > + } else {
> > > > + ufs_qcom_icc_set_bw(host, ufs_qcom_bw_table[MODE_MIN][0][0].bw1,
> > > > + ufs_qcom_bw_table[MODE_MIN][0][0].bw2);
>
> With MODE_MIN values being initialised to 0, can we use the value directly
> instead? You are not defining the whole table for MODE_MIN anyway.
>
I initially thought about it, but having all the values in the table gives
better visibility IMO. Otherwise, one has to look into the actual call to
determine what is being set for min and max.
- Mani
--
மணிவண்ணன் சதாசிவம்
next prev parent reply other threads:[~2023-07-13 5:21 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-12 10:31 [PATCH 00/14] UFS: Add OPP and interconnect support Manivannan Sadhasivam
2023-07-12 10:31 ` [PATCH 01/14] dt-bindings: ufs: common: add OPP table Manivannan Sadhasivam
2023-07-12 10:31 ` [PATCH 02/14] dt-bindings: opp: Increase maxItems for opp-hz property Manivannan Sadhasivam
2023-07-12 10:39 ` Viresh Kumar
2023-07-12 11:04 ` Manivannan Sadhasivam
2023-07-14 16:17 ` Rob Herring
2023-07-17 7:00 ` Manivannan Sadhasivam
2023-07-12 10:31 ` [PATCH 03/14] arm64: dts: qcom: sdm845: Add missing RPMh power domain to GCC Manivannan Sadhasivam
2023-07-12 10:39 ` Konrad Dybcio
2023-07-12 10:31 ` [PATCH 04/14] arm64: dts: qcom: sdm845: Fix the min frequency of "ice_core_clk" Manivannan Sadhasivam
2023-07-12 10:45 ` Konrad Dybcio
2023-07-12 11:04 ` Manivannan Sadhasivam
2023-07-13 7:30 ` Eric Biggers
2023-07-13 7:37 ` Manivannan Sadhasivam
2023-07-12 10:32 ` [PATCH 05/14] arm64: dts: qcom: sdm845: Add OPP table support to UFSHC Manivannan Sadhasivam
2023-07-12 10:32 ` [PATCH 06/14] arm64: dts: qcom: sm8250: " Manivannan Sadhasivam
2023-07-12 10:32 ` [PATCH 07/14] OPP: Introduce dev_pm_opp_find_freq_{ceil/floor}_indexed() APIs Manivannan Sadhasivam
2023-07-12 10:32 ` [PATCH 08/14] OPP: Introduce dev_pm_opp_get_freq_indexed() API Manivannan Sadhasivam
2023-07-12 10:32 ` [PATCH 09/14] PM / devfreq: Switch to dev_pm_opp_find_freq_{ceil/floor}_indexed() APIs Manivannan Sadhasivam
2023-07-12 10:32 ` [PATCH 10/14] scsi: ufs: core: Add OPP support for scaling clocks and regulators Manivannan Sadhasivam
2023-07-13 4:01 ` Viresh Kumar
2023-07-13 5:07 ` Manivannan Sadhasivam
2023-07-12 10:32 ` [PATCH 10/13] scsi: ufs: host: Add support for parsing OPP Manivannan Sadhasivam
2023-07-12 10:32 ` [PATCH 11/13] arm64: dts: qcom: sdm845: Add interconnect paths to UFSHC Manivannan Sadhasivam
2023-07-15 13:12 ` Konrad Dybcio
2023-07-12 10:32 ` [PATCH 11/14] scsi: ufs: host: Add support for parsing OPP Manivannan Sadhasivam
2023-07-12 13:15 ` Dmitry Baryshkov
2023-07-12 16:34 ` Manivannan Sadhasivam
2023-07-12 16:48 ` Dmitry Baryshkov
2023-07-13 4:09 ` Viresh Kumar
2023-07-13 5:05 ` Manivannan Sadhasivam
2023-07-13 5:12 ` Viresh Kumar
2023-07-13 5:28 ` Manivannan Sadhasivam
2023-07-13 5:43 ` Viresh Kumar
2023-07-13 5:53 ` Manivannan Sadhasivam
2023-07-12 10:32 ` [PATCH 12/14] arm64: dts: qcom: sdm845: Add interconnect paths to UFSHC Manivannan Sadhasivam
2023-07-15 13:12 ` Konrad Dybcio
2023-07-12 10:32 ` [PATCH 12/13] arm64: dts: qcom: sm8250: " Manivannan Sadhasivam
2023-07-15 13:13 ` Konrad Dybcio
2023-07-12 10:32 ` [PATCH 13/14] " Manivannan Sadhasivam
2023-07-15 13:14 ` Konrad Dybcio
2023-07-12 10:32 ` [PATCH 13/13] scsi: ufs: qcom: Add support for scaling interconnects Manivannan Sadhasivam
2023-07-12 10:32 ` [PATCH 14/14] " Manivannan Sadhasivam
2023-07-12 13:22 ` Dmitry Baryshkov
2023-07-12 16:41 ` Manivannan Sadhasivam
2023-07-12 17:23 ` Dmitry Baryshkov
2023-07-13 5:20 ` Manivannan Sadhasivam [this message]
2023-07-12 10:40 ` [PATCH 00/14] UFS: Add OPP and interconnect support Manivannan Sadhasivam
2023-07-12 12:18 ` Dmitry Baryshkov
2023-07-12 12:27 ` Manivannan Sadhasivam
2023-07-12 11:02 ` John Garry
2023-07-12 11:12 ` Manivannan Sadhasivam
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=20230713052052.GD3047@thinkpad \
--to=manivannan.sadhasivam@linaro.org \
--cc=andersson@kernel.org \
--cc=bmasney@redhat.com \
--cc=conor+dt@kernel.org \
--cc=cw00.choi@samsung.com \
--cc=devicetree@vger.kernel.org \
--cc=dmitry.baryshkov@linaro.org \
--cc=konrad.dybcio@linaro.org \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=krzysztof.kozlowski@linaro.org \
--cc=kyungmin.park@samsung.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=myungjoo.ham@samsung.com \
--cc=nm@ti.com \
--cc=quic_asutoshd@quicinc.com \
--cc=quic_bhaskarv@quicinc.com \
--cc=quic_cang@quicinc.com \
--cc=quic_narepall@quicinc.com \
--cc=quic_nguyenb@quicinc.com \
--cc=quic_nitirawa@quicinc.com \
--cc=quic_richardp@quicinc.com \
--cc=quic_ziqichen@quicinc.com \
--cc=robh+dt@kernel.org \
--cc=sboyd@kernel.org \
--cc=vireshk@kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).