Re: [PATCH V6 4/5] phy: freescale: fsl-samsung-hdmi: Use closest divider
From: Dominique Martinet
Date: Thu Sep 05 2024 - 21:55:02 EST
Adam Ford wrote on Thu, Sep 05, 2024 at 07:57:36PM -0500:
> > > Signed-off-by: Dominique Martinet <dominique.martinet@xxxxxxxxxxxxxxxxx>
> >
> > b4 (or whatever you're using) probably picked that up from the patch I
> > included in my reply to this patch, this sob should go away.
> >
> For each iteration, I grabbed the patches from patchwork which
> contained any s-o-b messages, if present. I didn't add anything
> manually.
Yes, I'm just saying the tool got confused - I replied to an earlier
iteration of this patch with a quote of the 0.5% tolerance patch I
properly sent afterwards here:
https://lore.kernel.org/all/ZtaawD3vb8gmnVmO@xxxxxxxxxxxxxxxxx/
And it picked the sob from the patch, that I hadn't intended to be added
as a review -- from my understanding a sob is something you'd add if you
pick the patch through your tree (e.g. I add sob for patches I apply
through the 9p tree I maintain), but not something to give on reviews.
I'll reply to individual patches with reviewed-by/tested-by once this
thread has settled down; I don't have more comments than what I sent
just now, so I think this is almost ready.
> > > +static u32 fsl_samsung_hdmi_phy_get_closest_rate(unsigned long rate,
> > > + u32 int_div_clk, u32 frac_div_clk)
> > > +{
> > > + /* The int_div_clk may be greater than rate, so cast it and use ABS */
> > > + if (abs((long)rate - (long)int_div_clk) < (rate - frac_div_clk))
> >
> > I still think `rate - frac_div_clk` might not always hold in the future
> > (because there is no intrinsic reason we'd pick the smaller end in case
> > of inexact match and a future improvement might change this to the
> > closest value as well), so I'll argue again for having both use abs(),
> > but at least there's only one place to update if that changes in the
> > future now so hopefully whoever does this will notice...
>
> I can add the ABS on the fractional divider. I left it out on purpose
> since the LUT table always return a value equal or less, so the extra
> ABS seemed like busy work. However, I can see the argument for being
> consistent.
Yeah, I agree it's not needed right now; I won't insist on this, just
saying I prefer consistency/future-proofing here.
> > > + return int_div_clk;
> > > +
> > > + return frac_div_clk;
> > > +}
> > > +
> > > static long phy_clk_round_rate(struct clk_hw *hw,
> > > unsigned long rate, unsigned long *parent_rate)
> > > {
> > > @@ -563,6 +573,7 @@ static long phy_clk_round_rate(struct clk_hw *hw,
> > > for (i = ARRAY_SIZE(phy_pll_cfg) - 1; i >= 0; i--)
> > > if (phy_pll_cfg[i].pixclk <= rate)
> > > break;
> > > +
> >
> > (unrelated)
>
> I don't understand what you're asking here.
This chunk is just adding a blank line that's not related to the rest of
the patch; it's fine, just pointed it out if it wasn't intended.
(these are usually leftovers from tests or something like that)
> > > - phy->cur_cfg = &calculated_phy_pll_cfg;
> > > + goto done;
> > > } else {
> > > /* Otherwise, search the LUT */
> > > - dev_dbg(phy->dev, "fsl_samsung_hdmi_phy: using fractional divider\n");
> > > - for (i = ARRAY_SIZE(phy_pll_cfg) - 1; i >= 0; i--)
> > > - if (phy_pll_cfg[i].pixclk <= rate)
> > > + for (i = ARRAY_SIZE(phy_pll_cfg) - 1; i >= 0; i--) {
> > > + if (phy_pll_cfg[i].pixclk == rate) {
> > > + dev_dbg(phy->dev, "fsl_samsung_hdmi_phy: using fractional divider\n");
> >
> > nitpick: might make sense to print what was picked in case of inexact
> > match as well, but these are dbg warning so probably fine either way.
>
> I can add the actual values returned.
Note my argument here wasn't about having the values on this line, it's
that the inexact case (when comparing with
fsl_samsung_hdmi_phy_get_closest_rate) doesn't print either line
(having the values can't hurt for dbg though, I think it could be useful
if you rework this)
> > overall I find the flow of this function hard to read; it's a bit ugly
> > flow-wise but jumping in the clock comparison 'if' might help trim this?
> > (and if we're going out of our way to factor out the diff, maybe the lut
> > lookup could be as well)
> >
> > But I'm probably just being overcritical here, it's fine as is if you
> > pefer your version, just writing down this as an illustration of what I
> > meant with the above sentence as I'm not sure I was clear -- I'll be
> > just as happy to consider this series done so we can do more interesting
> > things :P
>
> Now I am a bit more confused, because above I got the impression you
> were withdrawing your s-o-b, but now it sounds like you want to move
> it forward.
I don't have any strong opinion here: I generally dislike nitpicking
about form, and value the progress you've done more than fixing the flow
of this function (e.g. this function already is good/progress from what
we have right now, we don't need perfect)
withdrawing my s-o-b doesn't meant I disagree with the patch, I just
hadn't willingly given it. If you don't mind reworking the patch a bit
I'll retest the new version, otherwise I'm fine approving this as is.
> It sounded like Frieder was making some progress on understanding a
> little more about the fractional divider.
That's awesome!
I think we can/want to get this merged first, and we can improve
with fractional divider calculations in a later iteration to get rid of
the LUT altogether; it'll be easier for other users of the chip to go a
step at a time as well if they notice a breakage.
> > // (I haven't given up on that *5 to move inside this function...)
>
> I wanted to keep the PMS calculator returning the real clock value
> since the calculations are based on equation in the ref manual, Fpll =
> Fref * M / (P*S)
> This way, the calling function can determine if it needs to be
> multiplied by 5. I haven't fully determined how the fractional
> calculator determines what frequency it wants for a target frequency,
> and using the values for P, M and S from the fractional divider
> doesn't seem to always yield 5x like they did for the table entries
> using the integer divider.
The way I see it is that 5x is an artifact of the PMS calculation:
the caller doesn't want '5x rate', it wants 'rate', and actually setting
the p/m/s values provided by the function gets us 'rate', so it feels
like that's not the caller should have to worry about.. When we add
fractional divider support then it'll be the calculator's job to
determine if/when it needs that 5x.
But if I understand what you're saying, fsl_samsung_hdmi_phy_find_pms()
is not a pms specific to the NXP chip, but something more general to any
integer divisor that is better kept more generic if it weren't for the
few references to our hardware (e.g. limits on m)?
If so then I guess I can understand your position, I wouldn't go as far
as saying it warrants another level of indirection so I guess it's fine
as is.
(In a similar line of thought, had I implemented this I would have had
the function not return generic p/m/s but return the pll registers
directly -- it took me a moment to check why we were setting regs[2] to
`s-1` and confirming we had s>1...)
Anyway, once again I don't feel like I am in any position to be preachy
about all of this, so I'm fine with this patch as is - please take of it
what you agree with/want to rework and we can leave the rest here as far
as I'm concerned.
--
Dominique