From: Sean Paul <seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
To: Abhinav Kumar <abhinavk-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
Cc: jeykumar-jfJNa2p1gH1BDgjK7y7TUQ@public.gmane.org,
linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org,
robdclark-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org,
nganji-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org,
seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org,
hoegsberg-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org,
jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org,
freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org,
chandanu-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org
Subject: Re: [DPU PATCH v2 2/2] drm/msm/dsi: implement auto PHY timing calculator for 10nm PHY
Date: Fri, 13 Apr 2018 16:29:19 -0400 [thread overview]
Message-ID: <20180413202919.GK73214@art_vandelay> (raw)
In-Reply-To: <1523411647-16840-2-git-send-email-abhinavk-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
On Tue, Apr 10, 2018 at 06:54:07PM -0700, Abhinav Kumar wrote:
> Currently the DSI PHY timings are hard-coded for a specific panel
> for the 10nm PHY.
>
> Replace this with the auto PHY timing calculator which can calculate
> the PHY timings for any panel.
Any chance you could document what you're doing so anyone without documentation
has a clue what's going on?
Sean
>
> Changes in v2:
> - None
>
> Reviewed-by: Archit Taneja <architt@codeaurora.org>
> Signed-off-by: Abhinav Kumar <abhinavk@codeaurora.org>
> ---
> drivers/gpu/drm/msm/dsi/phy/dsi_phy.c | 111 +++++++++++++++++++++++++++++
> drivers/gpu/drm/msm/dsi/phy/dsi_phy.h | 2 +
> drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c | 28 --------
> 3 files changed, 113 insertions(+), 28 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c
> index 8e9d5c2..5b42885 100644
> --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c
> +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c
> @@ -265,6 +265,117 @@ int msm_dsi_dphy_timing_calc_v2(struct msm_dsi_dphy_timing *timing,
> return 0;
> }
>
> +int msm_dsi_dphy_timing_calc_v3(struct msm_dsi_dphy_timing *timing,
> + struct msm_dsi_phy_clk_request *clk_req)
> +{
> + const unsigned long bit_rate = clk_req->bitclk_rate;
> + const unsigned long esc_rate = clk_req->escclk_rate;
> + s32 ui, ui_x8, lpx;
> + s32 tmax, tmin;
> + s32 pcnt0 = 50;
> + s32 pcnt1 = 50;
> + s32 pcnt2 = 10;
> + s32 pcnt3 = 30;
> + s32 pcnt4 = 10;
> + s32 pcnt5 = 2;
> + s32 coeff = 1000; /* Precision, should avoid overflow */
> + s32 hb_en, hb_en_ckln;
> + s32 temp;
> +
> + if (!bit_rate || !esc_rate)
> + return -EINVAL;
> +
> + timing->hs_halfbyte_en = 0;
> + hb_en = 0;
> + timing->hs_halfbyte_en_ckln = 0;
> + hb_en_ckln = 0;
> +
> + ui = mult_frac(NSEC_PER_MSEC, coeff, bit_rate / 1000);
> + ui_x8 = ui << 3;
> + lpx = mult_frac(NSEC_PER_MSEC, coeff, esc_rate / 1000);
> +
> + temp = S_DIV_ROUND_UP(38 * coeff, ui_x8);
> + tmin = max_t(s32, temp, 0);
> + temp = (95 * coeff) / ui_x8;
> + tmax = max_t(s32, temp, 0);
> + timing->clk_prepare = linear_inter(tmax, tmin, pcnt0, 0, false);
> +
> +
> + temp = 300 * coeff - (timing->clk_prepare << 3) * ui;
> + tmin = S_DIV_ROUND_UP(temp, ui_x8) - 1;
> + tmax = (tmin > 255) ? 511 : 255;
> + timing->clk_zero = linear_inter(tmax, tmin, pcnt5, 0, false);
> +
> + tmin = DIV_ROUND_UP(60 * coeff + 3 * ui, ui_x8);
> + temp = 105 * coeff + 12 * ui - 20 * coeff;
> + tmax = (temp + 3 * ui) / ui_x8;
> + timing->clk_trail = linear_inter(tmax, tmin, pcnt3, 0, false);
> +
> + temp = S_DIV_ROUND_UP(40 * coeff + 4 * ui, ui_x8);
> + tmin = max_t(s32, temp, 0);
> + temp = (85 * coeff + 6 * ui) / ui_x8;
> + tmax = max_t(s32, temp, 0);
> + timing->hs_prepare = linear_inter(tmax, tmin, pcnt1, 0, false);
> +
> + temp = 145 * coeff + 10 * ui - (timing->hs_prepare << 3) * ui;
> + tmin = S_DIV_ROUND_UP(temp, ui_x8) - 1;
> + tmax = 255;
> + timing->hs_zero = linear_inter(tmax, tmin, pcnt4, 0, false);
> +
> + tmin = DIV_ROUND_UP(60 * coeff + 4 * ui, ui_x8) - 1;
> + temp = 105 * coeff + 12 * ui - 20 * coeff;
> + tmax = (temp / ui_x8) - 1;
> + timing->hs_trail = linear_inter(tmax, tmin, pcnt3, 0, false);
> +
> + temp = 50 * coeff + ((hb_en << 2) - 8) * ui;
> + timing->hs_rqst = S_DIV_ROUND_UP(temp, ui_x8);
> +
> + tmin = DIV_ROUND_UP(100 * coeff, ui_x8) - 1;
> + tmax = 255;
> + timing->hs_exit = linear_inter(tmax, tmin, pcnt2, 0, false);
> +
> + temp = 50 * coeff + ((hb_en_ckln << 2) - 8) * ui;
> + timing->hs_rqst_ckln = S_DIV_ROUND_UP(temp, ui_x8);
> +
> + temp = 60 * coeff + 52 * ui - 43 * ui;
> + tmin = DIV_ROUND_UP(temp, ui_x8) - 1;
> + tmax = 63;
> + timing->shared_timings.clk_post =
> + linear_inter(tmax, tmin, pcnt2, 0, false);
> +
> + temp = 8 * ui + (timing->clk_prepare << 3) * ui;
> + temp += (((timing->clk_zero + 3) << 3) + 11) * ui;
> + temp += hb_en_ckln ? (((timing->hs_rqst_ckln << 3) + 4) * ui) :
> + (((timing->hs_rqst_ckln << 3) + 8) * ui);
> + tmin = S_DIV_ROUND_UP(temp, ui_x8) - 1;
> + tmax = 63;
> + if (tmin > tmax) {
> + temp = linear_inter(tmax << 1, tmin, pcnt2, 0, false);
> + timing->shared_timings.clk_pre = temp >> 1;
> + timing->shared_timings.clk_pre_inc_by_2 = 1;
> + } else {
> + timing->shared_timings.clk_pre =
> + linear_inter(tmax, tmin, pcnt2, 0, false);
> + timing->shared_timings.clk_pre_inc_by_2 = 0;
> + }
> +
> + timing->ta_go = 3;
> + timing->ta_sure = 0;
> + timing->ta_get = 4;
> +
> + DBG("%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d",
> + timing->shared_timings.clk_pre, timing->shared_timings.clk_post,
> + timing->shared_timings.clk_pre_inc_by_2, timing->clk_zero,
> + timing->clk_trail, timing->clk_prepare, timing->hs_exit,
> + timing->hs_zero, timing->hs_prepare, timing->hs_trail,
> + timing->hs_rqst, timing->hs_rqst_ckln, timing->hs_halfbyte_en,
> + timing->hs_halfbyte_en_ckln, timing->hs_prep_dly,
> + timing->hs_prep_dly_ckln);
> +
> +
> + return 0;
> +}
> +
> void msm_dsi_phy_set_src_pll(struct msm_dsi_phy *phy, int pll_id, u32 reg,
> u32 bit_mask)
> {
> diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h
> index c56268c..a24ab80 100644
> --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h
> +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h
> @@ -101,6 +101,8 @@ int msm_dsi_dphy_timing_calc(struct msm_dsi_dphy_timing *timing,
> struct msm_dsi_phy_clk_request *clk_req);
> int msm_dsi_dphy_timing_calc_v2(struct msm_dsi_dphy_timing *timing,
> struct msm_dsi_phy_clk_request *clk_req);
> +int msm_dsi_dphy_timing_calc_v3(struct msm_dsi_dphy_timing *timing,
> + struct msm_dsi_phy_clk_request *clk_req);
> void msm_dsi_phy_set_src_pll(struct msm_dsi_phy *phy, int pll_id, u32 reg,
> u32 bit_mask);
> int msm_dsi_phy_init_common(struct msm_dsi_phy *phy);
> diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c
> index 0af951a..b3fffc8 100644
> --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c
> +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c
> @@ -79,34 +79,6 @@ static void dsi_phy_hw_v3_0_lane_settings(struct msm_dsi_phy *phy)
> dsi_phy_write(lane_base + REG_DSI_10nm_PHY_LN_TX_DCTRL(3), 0x04);
> }
>
> -static int msm_dsi_dphy_timing_calc_v3(struct msm_dsi_dphy_timing *timing,
> - struct msm_dsi_phy_clk_request *clk_req)
> -{
> - /*
> - * TODO: These params need to be computed, they're currently hardcoded
> - * for a 1440x2560@60Hz panel with a byteclk of 100.618 Mhz, and a
> - * default escape clock of 19.2 Mhz.
> - */
> -
> - timing->hs_halfbyte_en = 0;
> - timing->clk_zero = 0x1c;
> - timing->clk_prepare = 0x07;
> - timing->clk_trail = 0x07;
> - timing->hs_exit = 0x23;
> - timing->hs_zero = 0x21;
> - timing->hs_prepare = 0x07;
> - timing->hs_trail = 0x07;
> - timing->hs_rqst = 0x05;
> - timing->ta_sure = 0x00;
> - timing->ta_go = 0x03;
> - timing->ta_get = 0x04;
> -
> - timing->shared_timings.clk_pre = 0x2d;
> - timing->shared_timings.clk_post = 0x0d;
> -
> - return 0;
> -}
> -
> static int dsi_10nm_phy_enable(struct msm_dsi_phy *phy, int src_pll_id,
> struct msm_dsi_phy_clk_request *clk_req)
> {
> --
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
> a Linux Foundation Collaborative Project
>
--
Sean Paul, Software Engineer, Google / Chromium OS
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno
next prev parent reply other threads:[~2018-04-13 20:29 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-07 7:50 [DPU PATCH 1/2] drm/msm/dsi: check video mode engine status before waiting Abhinav Kumar
2018-04-07 7:50 ` [DPU PATCH 2/2] drm/msm/dsi: implement auto PHY timing calculator for 10nm PHY Abhinav Kumar
2018-04-08 8:01 ` Archit Taneja
2018-04-09 15:28 ` [Freedreno] [DPU PATCH 1/2] drm/msm/dsi: check video mode engine status before waiting Jordan Crouse
[not found] ` <20180409152802.GC5491-9PYrDHPZ2Orvke4nUoYGnHL1okKdlPRT@public.gmane.org>
2018-04-09 21:09 ` abhinavk-sgV2jX0FEOL9JmXXK+q4OQ
[not found] ` <1523087405-18877-1-git-send-email-abhinavk-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-04-11 1:54 ` [DPU PATCH v2 " Abhinav Kumar
[not found] ` <1523411647-16840-1-git-send-email-abhinavk-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-04-13 20:26 ` Sean Paul
2018-04-13 21:10 ` [Freedreno] " abhinavk
[not found] ` <8353aed54639deed0adee6671bbd1895-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-04-13 22:04 ` abhinavk-sgV2jX0FEOL9JmXXK+q4OQ
[not found] ` <c5c2cbf36c5fabee154eaa03801e71dc-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-04-16 17:07 ` Sean Paul
2018-04-16 17:44 ` abhinavk-sgV2jX0FEOL9JmXXK+q4OQ
[not found] ` <56ad41e7f95e907943a310d9c657ae4d-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-04-16 18:50 ` Sean Paul
2018-04-11 1:54 ` [DPU PATCH v2 2/2] drm/msm/dsi: implement auto PHY timing calculator for 10nm PHY Abhinav Kumar
[not found] ` <1523411647-16840-2-git-send-email-abhinavk-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-04-13 20:29 ` Sean Paul [this message]
2018-04-13 20:52 ` abhinavk-sgV2jX0FEOL9JmXXK+q4OQ
[not found] ` <41fb3b8501b466e40a542066b76004c0-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-04-16 17:01 ` Sean Paul
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=20180413202919.GK73214@art_vandelay \
--to=seanpaul-f7+t8e8rja9g9huczpvpmw@public.gmane.org \
--cc=abhinavk-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org \
--cc=chandanu-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org \
--cc=dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
--cc=freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
--cc=hoegsberg-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org \
--cc=jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org \
--cc=jeykumar-jfJNa2p1gH1BDgjK7y7TUQ@public.gmane.org \
--cc=jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org \
--cc=linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=nganji-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org \
--cc=robdclark-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.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