> On 30.11.2018, at 19:37, Mark Kettenis <[email protected]> wrote:
> 
>> From: Christoph Muellner <[email protected]>
>> Date: Mon, 19 Nov 2018 14:44:13 +0100
>> 
>> This patch sets the PLL of CPU cluster B (BPLL) to 600 MHz.
>> This decreases the boot time of Linux 4.19 by about 8%.
>> 
>> The 600 MHz are inspired by the 600 MHz used for LPLL initialization
>> (came in with commit 9f636a249c1).
>> 
>> Tested on RK3399-Q7 on Haikou base board.
> 
> Hi Christoph,
> 
> Philipp's reviewed-by reminded me that I wanted to check this diff to
> see whether it has the same bug as the firmware that came with my
> board.  Unfortunately I think it does...
> 
>> 
>> Signed-off-by: Christoph Muellner <[email protected]>
>> ---
>> arch/arm/include/asm/arch-rockchip/cru_rk3399.h | 22 +++++--
>> drivers/clk/rockchip/clk_rk3399.c               | 79 
>> ++++++++++++++++++++++---
>> 2 files changed, 88 insertions(+), 13 deletions(-)
>> 
>> diff --git a/arch/arm/include/asm/arch-rockchip/cru_rk3399.h 
>> b/arch/arm/include/asm/arch-rockchip/cru_rk3399.h
>> index b18de9f7c2e..15eeb9c4407 100644
>> --- a/arch/arm/include/asm/arch-rockchip/cru_rk3399.h
>> +++ b/arch/arm/include/asm/arch-rockchip/cru_rk3399.h
>> @@ -69,16 +69,21 @@ check_member(rk3399_cru, sdio1_con[1], 0x594);
>> #define MHz          1000000
>> #define KHz          1000
>> #define OSC_HZ               (24*MHz)
>> -#define APLL_HZ             (600*MHz)
>> +#define LPLL_HZ             (600*MHz)
>> +#define BPLL_HZ             (600*MHz)
>> #define GPLL_HZ              (594*MHz)
>> #define CPLL_HZ              (384*MHz)
>> #define PPLL_HZ              (676*MHz)
>> 
>> #define PMU_PCLK_HZ  (48*MHz)
>> 
>> -#define ACLKM_CORE_HZ       (300*MHz)
>> -#define ATCLK_CORE_HZ       (300*MHz)
>> -#define PCLK_DBG_HZ (100*MHz)
>> +#define ACLKM_CORE_L_HZ     (300*MHz)
>> +#define ATCLK_CORE_L_HZ     (300*MHz)
>> +#define PCLK_DBG_L_HZ       (100*MHz)
>> +
>> +#define ACLKM_CORE_B_HZ     (300*MHz)
>> +#define ATCLK_CORE_B_HZ     (300*MHz)
>> +#define PCLK_DBG_B_HZ       (100*MHz)
>> 
>> #define PERIHP_ACLK_HZ       (148500*KHz)
>> #define PERIHP_HCLK_HZ       (148500*KHz)
>> @@ -98,4 +103,13 @@ enum apll_l_frequencies {
>>      APLL_L_600_MHZ,
>> };
>> 
>> +enum apll_b_frequencies {
>> +    APLL_B_600_MHZ,
>> +};
>> +
>> +void rk3399_configure_cpu_l(struct rk3399_cru *cru,
>> +                        enum apll_l_frequencies apll_l_freq);
>> +void rk3399_configure_cpu_b(struct rk3399_cru *cru,
>> +                        enum apll_b_frequencies apll_b_freq);
>> +
>> #endif       /* __ASM_ARCH_CRU_RK3399_H_ */
>> diff --git a/drivers/clk/rockchip/clk_rk3399.c 
>> b/drivers/clk/rockchip/clk_rk3399.c
>> index 26faf88116b..0a8178466dc 100644
>> --- a/drivers/clk/rockchip/clk_rk3399.c
>> +++ b/drivers/clk/rockchip/clk_rk3399.c
>> @@ -61,6 +61,11 @@ static const struct pll_div *apll_l_cfgs[] = {
>>      [APLL_L_600_MHZ] = &apll_l_600_cfg,
>> };
>> 
>> +static const struct pll_div apll_b_600_cfg = PLL_DIVISORS(600*MHz, 1, 2, 1);
>> +static const struct pll_div *apll_b_cfgs[] = {
>> +    [APLL_B_600_MHZ] = &apll_b_600_cfg,
>> +};
>> +
>> enum {
>>      /* PLL_CON0 */
>>      PLL_FBDIV_MASK                  = 0xfff,
>> @@ -128,6 +133,24 @@ enum {
>>      ATCLK_CORE_L_DIV_SHIFT          = 0,
>>      ATCLK_CORE_L_DIV_MASK           = 0x1f << ATCLK_CORE_L_DIV_SHIFT,
>> 
>> +    /* CLKSEL_CON2 */
>> +    ACLKM_CORE_B_DIV_CON_SHIFT      = 8,
>> +    ACLKM_CORE_B_DIV_CON_MASK       = 0x1f << ACLKM_CORE_B_DIV_CON_SHIFT,
>> +    CLK_CORE_B_PLL_SEL_SHIFT        = 6,
>> +    CLK_CORE_B_PLL_SEL_MASK         = 3 << CLK_CORE_B_PLL_SEL_SHIFT,
>> +    CLK_CORE_B_PLL_SEL_ALPLL        = 0x0,
>> +    CLK_CORE_B_PLL_SEL_ABPLL        = 0x1,
>> +    CLK_CORE_B_PLL_SEL_DPLL         = 0x10,
>> +    CLK_CORE_B_PLL_SEL_GPLL         = 0x11,
>> +    CLK_CORE_B_DIV_MASK             = 0x1f,
>> +    CLK_CORE_B_DIV_SHIFT            = 0,
>> +
>> +    /* CLKSEL_CON3 */
>> +    PCLK_DBG_B_DIV_SHIFT            = 0x8,
>> +    PCLK_DBG_B_DIV_MASK             = 0x1f << PCLK_DBG_B_DIV_SHIFT,
>> +    ATCLK_CORE_B_DIV_SHIFT          = 0,
>> +    ATCLK_CORE_B_DIV_MASK           = 0x1f << ATCLK_CORE_B_DIV_SHIFT,
>> +
>>      /* CLKSEL_CON14 */
>>      PCLK_PERIHP_DIV_CON_SHIFT       = 12,
>>      PCLK_PERIHP_DIV_CON_MASK        = 0x7 << PCLK_PERIHP_DIV_CON_SHIFT,
>> @@ -395,25 +418,26 @@ static int pll_para_config(u32 freq_hz, struct pll_div 
>> *div)
>>      return 0;
>> }
>> 
>> -void rk3399_configure_cpu(struct rk3399_cru *cru,
>> -                      enum apll_l_frequencies apll_l_freq)
>> +void rk3399_configure_cpu_l(struct rk3399_cru *cru,
>> +                        enum apll_l_frequencies apll_l_freq)
>> {
>>      u32 aclkm_div;
>>      u32 pclk_dbg_div;
>>      u32 atclk_div;
>> 
>> +    /* Setup cluster L */
>>      rkclk_set_pll(&cru->apll_l_con[0], apll_l_cfgs[apll_l_freq]);
>> 
>> -    aclkm_div = APLL_HZ / ACLKM_CORE_HZ - 1;
>> -    assert((aclkm_div + 1) * ACLKM_CORE_HZ == APLL_HZ &&
>> +    aclkm_div = LPLL_HZ / ACLKM_CORE_L_HZ - 1;
>> +    assert((aclkm_div + 1) * ACLKM_CORE_L_HZ == LPLL_HZ &&
>>             aclkm_div < 0x1f);
>> 
>> -    pclk_dbg_div = APLL_HZ / PCLK_DBG_HZ - 1;
>> -    assert((pclk_dbg_div + 1) * PCLK_DBG_HZ == APLL_HZ &&
>> +    pclk_dbg_div = LPLL_HZ / PCLK_DBG_L_HZ - 1;
>> +    assert((pclk_dbg_div + 1) * PCLK_DBG_L_HZ == LPLL_HZ &&
>>             pclk_dbg_div < 0x1f);
>> 
>> -    atclk_div = APLL_HZ / ATCLK_CORE_HZ - 1;
>> -    assert((atclk_div + 1) * ATCLK_CORE_HZ == APLL_HZ &&
>> +    atclk_div = LPLL_HZ / ATCLK_CORE_L_HZ - 1;
>> +    assert((atclk_div + 1) * ATCLK_CORE_L_HZ == LPLL_HZ &&
>>             atclk_div < 0x1f);
>> 
>>      rk_clrsetreg(&cru->clksel_con[0],
>> @@ -428,6 +452,42 @@ void rk3399_configure_cpu(struct rk3399_cru *cru,
>>                   pclk_dbg_div << PCLK_DBG_L_DIV_SHIFT |
>>                   atclk_div << ATCLK_CORE_L_DIV_SHIFT);
>> }
>> +
>> +void rk3399_configure_cpu_b(struct rk3399_cru *cru,
>> +                        enum apll_b_frequencies apll_b_freq)
>> +{
>> +    u32 aclkm_div;
>> +    u32 pclk_dbg_div;
>> +    u32 atclk_div;
>> +
>> +    /* Setup cluster B */
>> +    rkclk_set_pll(&cru->apll_b_con[0], apll_b_cfgs[apll_b_freq]);
>> +
>> +    aclkm_div = BPLL_HZ / ACLKM_CORE_B_HZ - 1;
>> +    assert((aclkm_div + 1) * ACLKM_CORE_B_HZ == BPLL_HZ &&
>> +           aclkm_div < 0x1f);
>> +
>> +    pclk_dbg_div = BPLL_HZ / PCLK_DBG_B_HZ - 1;
>> +    assert((pclk_dbg_div + 1) * PCLK_DBG_B_HZ == BPLL_HZ &&
>> +           pclk_dbg_div < 0x1f);
>> +
>> +    atclk_div = BPLL_HZ / ATCLK_CORE_B_HZ - 1;
>> +    assert((atclk_div + 1) * ATCLK_CORE_B_HZ == BPLL_HZ &&
>> +           atclk_div < 0x1f);
>> +
>> +    rk_clrsetreg(&cru->clksel_con[2],
>> +                 ACLKM_CORE_B_DIV_CON_MASK | CLK_CORE_B_PLL_SEL_MASK |
>> +                 CLK_CORE_B_DIV_MASK,
>> +                 aclkm_div << ACLKM_CORE_B_DIV_CON_SHIFT |
>> +                 CLK_CORE_B_PLL_SEL_ALPLL << CLK_CORE_B_PLL_SEL_SHIFT |
>> +                 0 << CLK_CORE_B_DIV_SHIFT);
> 
> ...since this sets the parent of the CPU clock for the B cluster to
> LPLL.  I'm pretty sure you should use CLK_CORE_B_PLL_SEL_ABPLL here.

Hi Mark,

you are indeed right here (I just double checked with the TRM).
I guess I never encountered a problem, because Linux sets this right later on
(before clocking LPLL up). Anyways, we want to run from BPLL after setting it 
up.

Thanks,
Christoph



> 
> With LPLL as the parent, running OpenBSD on the board didn't work very
> well since changing the clock of the L cluster would also change the
> clock of the B cluster, but without changing the voltage of the B
> cluster...
> 
>> +
>> +    rk_clrsetreg(&cru->clksel_con[3],
>> +                 PCLK_DBG_B_DIV_MASK | ATCLK_CORE_B_DIV_MASK,
>> +                 pclk_dbg_div << PCLK_DBG_B_DIV_SHIFT |
>> +                 atclk_div << ATCLK_CORE_B_DIV_SHIFT);
>> +}
>> +
>> #define I2C_CLK_REG_MASK(bus) \
>>                      (I2C_DIV_CON_MASK << \
>>                      CLK_I2C ##bus## _DIV_CON_SHIFT | \
>> @@ -1026,7 +1086,8 @@ static void rkclk_init(struct rk3399_cru *cru)
>>      u32 hclk_div;
>>      u32 pclk_div;
>> 
>> -    rk3399_configure_cpu(cru, APLL_L_600_MHZ);
>> +    rk3399_configure_cpu_l(cru, APLL_L_600_MHZ);
>> +    rk3399_configure_cpu_b(cru, APLL_B_600_MHZ);
>>      /*
>>       * some cru registers changed by bootrom, we'd better reset them to
>>       * reset/default values described in TRM to avoid confusion in kernel.
>> -- 
>> 2.11.0
>> 
>> _______________________________________________
>> U-Boot mailing list
>> [email protected]
>> https://lists.denx.de/listinfo/u-boot

_______________________________________________
U-Boot mailing list
[email protected]
https://lists.denx.de/listinfo/u-boot

Reply via email to