> -----Original Message-----
> From: Dylan Hung <dylan_h...@aspeedtech.com>
> Sent: Friday, November 11, 2022 3:30 PM
> To: Ryan Chen <ryan_c...@aspeedtech.com>; ChiaWei Wang
> <chiawei_w...@aspeedtech.com>; j...@jms.id.au; Dylan Hung
> <dylan_h...@aspeedtech.com>; u-boot@lists.denx.de
> Cc: BMC-SW <bmc...@aspeedtech.com>
> Subject: [PATCH 2/3] ram: ast2600: Improve ddr4 timing and signal quality
> 
> Adjust the following settings to get better timing and signal quality.
> 
> 1. write DQS/DQ delay
> - 1e6e2304[0]
> - 1e6e2304[15:8]
> 
> 2. read DQS/DQ delay
> - 0x1e6e0298[0]
> - 0x1e6e0298[15:8]
> 
> 3. CLK/CA timing
> - 0x1e6e01a8[31]
> 
> 4. Read and write termination
> - change RTT_ROM from 40 ohm to 48 ohm (MR1[10:8])
> - change RTT_PARK from disable to 48 ohm (MR5[8:6])
> - change RTT_WR from 120 ohm to disable (MR2[11:9])
> - change PHY ODT from 40 ohm to 80 ohm (0x1e6e0130[10:8])
> 
> Note1: Both DDR-PHY and DDR controller have their own registers for DDR4
> Mode Registers (MR0~MR6).  This patch introduces macros to synchronize the
> MR value on both sides.
> 
> Note2: the waveform meansurement can be found in item #21 of Aspeed
> AST26x0 Application note (AP note).
> 
> Signed-off-by: Dylan Hung <dylan_h...@aspeedtech.com>

Review-by: Ryan Chen <ryan_c...@aspeedtech.com>
> ---
>  drivers/ram/aspeed/sdram_ast2600.c | 163 ++++++++++++++++++++++++-----
>  1 file changed, 138 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/ram/aspeed/sdram_ast2600.c
> b/drivers/ram/aspeed/sdram_ast2600.c
> index b09232a30413..bda02d062900 100644
> --- a/drivers/ram/aspeed/sdram_ast2600.c
> +++ b/drivers/ram/aspeed/sdram_ast2600.c
> @@ -20,6 +20,119 @@
>  #define DDR_PHY_TBL_CHG_ADDR            0xaeeddeea
>  #define DDR_PHY_TBL_END                 0xaeededed
> 
> +/**
> + * phyr030[18:16] - Ron PU (PHY side)
> + * phyr030[14:12] - Ron PD (PHY side)
> + *   b'000 : disable
> + *   b'001 : 240 ohm
> + *   b'010 : 120 ohm
> + *   b'011 : 80 ohm
> + *   b'100 : 60 ohm
> + *   b'101 : 48 ohm
> + *   b'110 : 40 ohm
> + *   b'111 : 34 ohm (default)
> + */
> +#define PHY_RON                              ((0x7 << 16) | (0x7 << 12))
> +
> +/**
> + * phyr030[10:8] - ODT configuration (PHY side)
> + *   b'000 : ODT disabled
> + *   b'001 : 240 ohm
> + *   b'010 : 120 ohm
> + *   b'011 : 80 ohm (default)
> + *   b'100 : 60 ohm
> + *   b'101 : 48 ohm
> + *   b'110 : 40 ohm
> + *   b'111 : 34 ohm
> + */
> +#define PHY_ODT                              (0x3 << 8)
> +
> +/**
> + * MR1[2:1] output driver impedance
> + *   b'00 : 34 ohm (default)
> + *   b'01 : 48 ohm
> + */
> +#define DRAM_RON                     (0x0 << 1)
> +
> +/**
> + * DRAM ODT - synchronous ODT mode
> + *   RTT_WR: disable
> + *   RTT_NOM = RTT_PARK
> + *
> + * MR1[10:8] RTT_NOM
> + *   b'000 : RTT_NOM disable
> + *   b'001 : 60 ohm
> + *   b'010 : 120 ohm
> + *   b'011 : 40 ohm
> + *   b'100 : 240 ohm
> + *   b'101 : 48 ohm  (default)
> + *   b'110 : 80 ohm
> + *   b'111 : 34 ohm
> + *
> + * MR5[8:6] RTT_PARK
> + *   b'000 : RTT_PARK disable
> + *   b'001 : 60 ohm
> + *   b'010 : 120 ohm
> + *   b'011 : 40 ohm
> + *   b'100 : 240 ohm
> + *   b'101 : 48 ohm  (default)
> + *   b'110 : 80 ohm
> + *   b'111 : 34 ohm
> + *
> + * MR2[11:9] RTT_WR
> + *   b'000 : Dynamic ODT off  (default)
> + *   b'001 : 120 ohm
> + *   b'010 : 240 ohm
> + *   b'011 : Hi-Z
> + *   b'100 : 80 ohm
> + */
> +#define RTT_WR                               (0x0 << 9)
> +#define RTT_NOM                              (0x5 << 8)
> +#define RTT_PARK                     (0x5 << 6)
> +
> +/**
> + * MR6[6] VrefDQ training range
> + *   b'0 : range 1
> + *   b'1 : range 2 (default)
> + */
> +#define VREFDQ_RANGE_2                       BIT(6)
> +
> +/**
> + * Latency setting:
> + * AL = PL = 0 (hardware fixed setting)
> + * -> WL = AL + CWL + PL = CWL
> + * -> RL = AL + CL + PL = CL
> + */
> +#define CONFIG_WL                    9
> +#define CONFIG_RL                    12
> +#define T_RDDATA_EN                  ((CONFIG_RL - 2) << 8)
> +#define T_PHY_WRLAT                  (CONFIG_WL - 2)
> +
> +/* MR0 */
> +#define MR0_CL_12                    (BIT(4) | BIT(2))
> +#define MR0_WR12_RTP6                        BIT(9)
> +#define MR0_DLL_RESET                        BIT(8)
> +#define MR0_VAL                              (MR0_CL_12 | MR0_WR12_RTP6 |
> MR0_DLL_RESET)
> +
> +/* MR1 */
> +#define MR1_VAL                              (0x0001 | RTT_NOM | DRAM_RON)
> +
> +/* MR2 */
> +#define MR2_CWL_9                    0
> +#define MR2_VAL                              (0x0000 | RTT_WR | MR2_CWL_9)
> +
> +/* MR3 ~ MR6 */
> +#define MR3_VAL                              0x0000
> +#define MR4_VAL                              0x0000
> +#define MR5_VAL                              (0x0400 | RTT_PARK)
> +#define MR6_VAL                              0x0400
> +
> +/**
> + * The offset value applied to the DDR PHY write data eye training
> +result
> + * to fine-tune the write DQ/DQS alignment  */
> +#define WR_DATA_EYE_OFFSET           (0x10 << 8)
> +
>  #if defined(CONFIG_ASPEED_DDR4_800)
>  u32 ast2600_sdramphy_config[165] = {
>       0x1e6e0100,     // start address
> @@ -35,7 +148,7 @@ u32 ast2600_sdramphy_config[165] = {
>       0x20000000,     // phyr024
>       0x00000008,     // phyr028
>       0x00000000,     // phyr02c
> -     0x00077600,     // phyr030
> +     (PHY_RON | PHY_ODT),    /* phyr030 */
>       0x00000000,     // phyr034
>       0x00000000,     // phyr038
>       0x20000000,     // phyr03c
> @@ -44,18 +157,18 @@ u32 ast2600_sdramphy_config[165] = {
>       0x00002f07,     // phyr048
>       0x00003080,     // phyr04c
>       0x04000000,     // phyr050
> -     0x00000200,     // phyr054
> -     0x03140201,     // phyr058
> -     0x04800000,     // phyr05c
> -     0x0800044e,     // phyr060
> +     ((MR3_VAL << 16) | MR2_VAL),    /* phyr054 */
> +     ((MR0_VAL << 16) | MR1_VAL),    /* phyr058 */
> +     ((MR5_VAL << 16) | MR4_VAL),    /* phyr05c */
> +     ((0x0800 << 16) | MR6_VAL | VREFDQ_RANGE_2 | 0xe), /* phyr060 */
>       0x00000000,     // phyr064
>       0x00180008,     // phyr068
>       0x00e00400,     // phyr06c
>       0x00140206,     // phyr070
>       0x1d4c0000,     // phyr074
> -     0x493e0107,     // phyr078
> +     (0x493e0100 | T_PHY_WRLAT),     /* phyr078 */
>       0x08060404,     // phyr07c
> -     0x90000a00,     // phyr080
> +     (0x90000000 | T_RDDATA_EN),     /* phyr080 */
>       0x06420618,     // phyr084
>       0x00001002,     // phyr088
>       0x05701016,     // phyr08c
> @@ -94,7 +207,7 @@ u32 ast2600_sdramphy_config[165] = {
>       0x20202020,     // phyr09c
>       0x20202020,     // phyr0a0
>       0x00002020,     // phyr0a4
> -     0x80000000,     // phyr0a8
> +     0x00000000,     /* phyr0a8 */
>       0x00000001,     // phyr0ac
>       0xaeeddeea,     // change address
>       0x1e6e0318,     // new address
> @@ -154,7 +267,7 @@ u32 ast2600_sdramphy_config[165] = {
>       0x20202020,     // phyr170
>       0xaeeddeea,     // change address
>       0x1e6e0298,     // new address
> -     0x20200800,     // phyr198
> +     0x20200000,     /* phyr198 */
>       0x20202020,     // phyr19c
>       0x20202020,     // phyr1a0
>       0x20202020,     // phyr1a4
> @@ -177,7 +290,7 @@ u32 ast2600_sdramphy_config[165] = {
>       0x00002020,     // phyr1e8
>       0xaeeddeea,     // change address
>       0x1e6e0304,     // new address
> -     0x00000800,     // phyr204
> +     (0x00000001 | WR_DATA_EYE_OFFSET), /* phyr204 */
>       0xaeeddeea,     // change address
>       0x1e6e027c,     // new address
>       0x4e400000,     // phyr17c
> @@ -203,7 +316,7 @@ u32 ast2600_sdramphy_config[165] = {
>       0x20000000,     // phyr024
>       0x00000008,     // phyr028
>       0x00000000,     // phyr02c
> -     0x00077600,     // phyr030
> +     (PHY_RON | PHY_ODT),    /* phyr030 */
>       0x00000000,     // phyr034
>       0x00000000,     // phyr038
>       0x20000000,     // phyr03c
> @@ -212,18 +325,18 @@ u32 ast2600_sdramphy_config[165] = {
>       0x00002f07,     // phyr048
>       0x00003080,     // phyr04c
>       0x04000000,     // phyr050
> -     0x00000200,     // phyr054
> -     0x03140501,     // phyr058-rtt:40
> -     0x04800000,     // phyr05c
> -     0x0800044e,     // phyr060
> +     ((MR3_VAL << 16) | MR2_VAL),    /* phyr054 */
> +     ((MR0_VAL << 16) | MR1_VAL),    /* phyr058 */
> +     ((MR5_VAL << 16) | MR4_VAL),    /* phyr05c */
> +     ((0x0800 << 16) | MR6_VAL | VREFDQ_RANGE_2 | 0xe), /* phyr060 */
>       0x00000000,     // phyr064
>       0x00180008,     // phyr068
>       0x00e00400,     // phyr06c
>       0x00140206,     // phyr070
>       0x1d4c0000,     // phyr074
> -     0x493e0107,     // phyr078
> +     (0x493e0100 | T_PHY_WRLAT),     /* phyr078 */
>       0x08060404,     // phyr07c
> -     0x90000a00,     // phyr080
> +     (0x90000000 | T_RDDATA_EN),     /* phyr080 */
>       0x06420c30,     // phyr084
>       0x00001002,     // phyr088
>       0x05701016,     // phyr08c
> @@ -256,13 +369,13 @@ u32 ast2600_sdramphy_config[165] = {
>       0x00000000,     // phyr200
>       0xaeeddeea,     // change address
>       0x1e6e0194,     // new address
> -     0x801112e0,     // phyr094 - bit12=1,15=0,- write window is ok
> +     0x801112e0,     // phyr094
>       0xaeeddeea,     // change address
>       0x1e6e019c,     // new address
>       0x20202020,     // phyr09c
>       0x20202020,     // phyr0a0
>       0x00002020,     // phyr0a4
> -     0x80000000,     // phyr0a8
> +     0x00000000,     /* phyr0a8 */
>       0x00000001,     // phyr0ac
>       0xaeeddeea,     // change address
>       0x1e6e0318,     // new address
> @@ -322,7 +435,7 @@ u32 ast2600_sdramphy_config[165] = {
>       0x20202020,     // phyr170
>       0xaeeddeea,     // change address
>       0x1e6e0298,     // new address
> -     0x20200800,     // phyr198
> +     0x20200000,     /* phyr198 */
>       0x20202020,     // phyr19c
>       0x20202020,     // phyr1a0
>       0x20202020,     // phyr1a4
> @@ -345,7 +458,7 @@ u32 ast2600_sdramphy_config[165] = {
>       0x00002020,     // phyr1e8
>       0xaeeddeea,     // change address
>       0x1e6e0304,     // new address
> -     0x00000800,     // phyr204
> +     (0x00000001 | WR_DATA_EYE_OFFSET), /* phyr204 */
>       0xaeeddeea,     // change address
>       0x1e6e027c,     // new address
>       0x4e400000,     // phyr17c
> @@ -388,10 +501,10 @@ u32 ast2600_sdramphy_config[165] = {
>   * AC timing and SDRAM mode register setting
>   * for real chip are derived from the model GDDR4-1600
>   */
> -#define DDR4_MR01_MODE       0x03010510
> -#define DDR4_MR23_MODE       0x00000000
> -#define DDR4_MR45_MODE       0x04000000
> -#define DDR4_MR6_MODE        0x00000400
> +#define DDR4_MR01_MODE       ((MR1_VAL << 16) | MR0_VAL)
> +#define DDR4_MR23_MODE       ((MR3_VAL << 16) | MR2_VAL)
> +#define DDR4_MR45_MODE       ((MR5_VAL << 16) | MR4_VAL)
> +#define DDR4_MR6_MODE        MR6_VAL
>  #define DDR4_TRFC_1600       0x467299f1
>  #define DDR4_TRFC_1333       0x3a5f80c9
>  #define DDR4_TRFC_800        0x23394c78
> --
> 2.25.1

Reply via email to