All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ryan Chen <ryan_chen@aspeedtech.com>
To: Dylan Hung <dylan_hung@aspeedtech.com>,
	ChiaWei Wang <chiawei_wang@aspeedtech.com>,
	"joel@jms.id.au" <joel@jms.id.au>,
	"u-boot@lists.denx.de" <u-boot@lists.denx.de>
Cc: BMC-SW <BMC-SW@aspeedtech.com>
Subject: RE: [PATCH 2/3] ram: ast2600: Improve ddr4 timing and signal quality
Date: Thu, 24 Nov 2022 01:22:49 +0000	[thread overview]
Message-ID: <SEZPR06MB5269E920B3524DECFB6AE3B4F20F9@SEZPR06MB5269.apcprd06.prod.outlook.com> (raw)
In-Reply-To: <20221111073008.16364-3-dylan_hung@aspeedtech.com>

> -----Original Message-----
> From: Dylan Hung <dylan_hung@aspeedtech.com>
> Sent: Friday, November 11, 2022 3:30 PM
> To: Ryan Chen <ryan_chen@aspeedtech.com>; ChiaWei Wang
> <chiawei_wang@aspeedtech.com>; joel@jms.id.au; Dylan Hung
> <dylan_hung@aspeedtech.com>; u-boot@lists.denx.de
> Cc: BMC-SW <BMC-SW@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_hung@aspeedtech.com>

Review-by: Ryan Chen <ryan_chen@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	other threads:[~2022-11-24  1:23 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-11  7:30 [PATCH 0/3] Improve AST26x0 DDR4 timing and signal quality Dylan Hung
2022-11-11  7:30 ` [PATCH 1/3] ram: ast2600: Fix incorrect statement of the register polling Dylan Hung
2022-11-24  1:22   ` Ryan Chen
2022-11-24 21:33   ` Tom Rini
2022-11-11  7:30 ` [PATCH 2/3] ram: ast2600: Improve ddr4 timing and signal quality Dylan Hung
2022-11-24  1:22   ` Ryan Chen [this message]
2022-11-24 21:33   ` Tom Rini
2022-11-11  7:30 ` [PATCH 3/3] ram: ast2600: Align the RL and WL setting Dylan Hung
2022-11-24  1:23   ` Ryan Chen
2022-11-24 21:33   ` Tom Rini

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=SEZPR06MB5269E920B3524DECFB6AE3B4F20F9@SEZPR06MB5269.apcprd06.prod.outlook.com \
    --to=ryan_chen@aspeedtech.com \
    --cc=BMC-SW@aspeedtech.com \
    --cc=chiawei_wang@aspeedtech.com \
    --cc=dylan_hung@aspeedtech.com \
    --cc=joel@jms.id.au \
    --cc=u-boot@lists.denx.de \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.