[PATCH] clk: zynq: Fix EMIO clock use detection for gem0

Michal Simek michal.simek at amd.com
Mon Apr 29 10:59:50 CEST 2024



On 4/25/24 17:18, Ondřej Jirman wrote:
> On Thu, Apr 25, 2024 at 12:59:29PM GMT, Michal Simek wrote:
>>> Well, it doesn't help that the code is almost all refering to CLK_CTRL while
>>> actually accessing gem1_rclk_ctrl in the struct.
>>>
>>> In any case it can't detect the case when sourcing the clock from EMIO and
>>> not one of the PLLs, apparently.
>>>
>>> The failure I'm talking about is here in zynq_gem.c:
>>>
>>>           ret = clk_get_rate(&priv->tx_clk);
>>>           if (ret != clk_rate) {
>>>                   ret = clk_set_rate(&priv->tx_clk, clk_rate);
>>>                   if (IS_ERR_VALUE(ret)) {
>>>                           dev_err(dev, "failed to set tx clock rate %ld\n", clk_rate);
>>>                           return ret;
>>>                   }
>>>           }
>>>
>>> And all I get is "failed to set tx clock rate" from U-Boot and no ethernet.
>>
>> Zynq is quite a old device but I expect you have external clock out of chip
>> or you generate it in PL. For that you need to describe it.
>>
>> How does your DT looks like for external clocks?
> 
> The situation is that RX/TX clocks just come from outside
> https://megous.com/dl/tmp/af9e7c9e8d51781b.png via PL. 25MHz clock is
> generated by the PHY.
> 
> I solved it eventually.
> 
> I described the PHY generated clock as a fixed-clock node, and added a
> reference to it under &clkc as a source for "gem0_emio_clk".
> 
>    https://megous.com/git/u-boot/tree/arch/arm/dts/zynq-ebaz-megi.dts?h=v2024.07#n26
> 
> Zynq clk code seems to fetch gem0_emio_clk from DT for the purpose of
> determining the clk rate for gem0 in emio mode:
> 
>    https://elixir.bootlin.com/u-boot/latest/source/drivers/clk/clk_zynq.c#L524
>    https://elixir.bootlin.com/u-boot/latest/source/drivers/clk/clk_zynq.c#L280
> 
> This got rid of the "failed to set tx clock rate" error. Thank you for the hint.
> 
> 
> BTW, I managed to get the .bit file loaded via SPL only with a SPL patch:
> 
>    https://megous.com/git/u-boot/commit/?h=v2024.07&id=c1403bd080bc517c9dc6f507ee12b62fa85153bc
> 
> It's similar to how it's done in:
> 
>    https://elixir.bootlin.com/u-boot/latest/source/boot/image-board.c#L677
> 
> fpga_load() function doesn't work with .bit file I get from Vivado but
> fpga_loadbitstream() one does. SPL doesn't call it, though. Is that by design?
> Should I be converting .bit file to something else usable by fpga_load()
> somehow?

Yes there was limitation or missing detection which fpga format is supported.

> 
> I'd like to load bitstream in SPL from FIT because U-Boot proper may already
> need some PL logic activated for ethernet to work there. Also it's one less
> file on the /boot filesystem to worry about. :)

I think you have two options.
1. convert your bitstream in bit format to bin format
2. Extend SPL code to support both formats.

I would go with option 1 but patches for option 2 are definitely welcome.

Thanks,
Michal



More information about the U-Boot mailing list