[U-Boot] [PATCH v3 01/18] ram: rk3399: Handle data training return types
Kever Yang
kever.yang at rock-chips.com
Tue Jul 16 07:36:19 UTC 2019
On 2019/7/16 上午2:28, Jagan Teki wrote:
> data trainings calls like ca, wl, rg, rl, wdql have proper
> return types with -EIO and the return type missed to handle
> in data_training function.
>
> This patch, add proper return type checks along with useful
> debug statement on each data training calls.
>
> Incidentally this would help to prevent the sdram initialization
> hang for single channel dram and when the code is trying to
> initialize second channel with proper return type of relevant
> data training call might failed.
>
> Signed-off-by: Jagan Teki <jagan at amarulasolutions.com>
Reviewed-by: Kever Yang <Kever.yang at rock-chips.com>
Thanks,
- Kever
> ---
> drivers/ram/rockchip/sdram_rk3399.c | 50 ++++++++++++++++++++++-------
> 1 file changed, 38 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/ram/rockchip/sdram_rk3399.c b/drivers/ram/rockchip/sdram_rk3399.c
> index 492b0975dd..e9c0fdf2d4 100644
> --- a/drivers/ram/rockchip/sdram_rk3399.c
> +++ b/drivers/ram/rockchip/sdram_rk3399.c
> @@ -887,6 +887,7 @@ static int data_training(const struct chan_info *chan, u32 channel,
> u32 training_flag)
> {
> u32 *denali_phy = chan->publ->denali_phy;
> + int ret;
>
> /* PHY_927 PHY_PAD_DQS_DRIVE RPULL offset_22 */
> setbits_le32(&denali_phy[927], (1 << 22));
> @@ -907,24 +908,49 @@ static int data_training(const struct chan_info *chan, u32 channel,
> }
>
> /* ca training(LPDDR4,LPDDR3 support) */
> - if ((training_flag & PI_CA_TRAINING) == PI_CA_TRAINING)
> - data_training_ca(chan, channel, params);
> + if ((training_flag & PI_CA_TRAINING) == PI_CA_TRAINING) {
> + ret = data_training_ca(chan, channel, params);
> + if (ret < 0) {
> + debug("%s: data training ca failed\n", __func__);
> + return ret;
> + }
> + }
>
> /* write leveling(LPDDR4,LPDDR3,DDR3 support) */
> - if ((training_flag & PI_WRITE_LEVELING) == PI_WRITE_LEVELING)
> - data_training_wl(chan, channel, params);
> + if ((training_flag & PI_WRITE_LEVELING) == PI_WRITE_LEVELING) {
> + ret = data_training_wl(chan, channel, params);
> + if (ret < 0) {
> + debug("%s: data training wl failed\n", __func__);
> + return ret;
> + }
> + }
>
> /* read gate training(LPDDR4,LPDDR3,DDR3 support) */
> - if ((training_flag & PI_READ_GATE_TRAINING) == PI_READ_GATE_TRAINING)
> - data_training_rg(chan, channel, params);
> + if ((training_flag & PI_READ_GATE_TRAINING) == PI_READ_GATE_TRAINING) {
> + ret = data_training_rg(chan, channel, params);
> + if (ret < 0) {
> + debug("%s: data training rg failed\n", __func__);
> + return ret;
> + }
> + }
>
> /* read leveling(LPDDR4,LPDDR3,DDR3 support) */
> - if ((training_flag & PI_READ_LEVELING) == PI_READ_LEVELING)
> - data_training_rl(chan, channel, params);
> + if ((training_flag & PI_READ_LEVELING) == PI_READ_LEVELING) {
> + ret = data_training_rl(chan, channel, params);
> + if (ret < 0) {
> + debug("%s: data training rl failed\n", __func__);
> + return ret;
> + }
> + }
>
> /* wdq leveling(LPDDR4 support) */
> - if ((training_flag & PI_WDQ_LEVELING) == PI_WDQ_LEVELING)
> - data_training_wdql(chan, channel, params);
> + if ((training_flag & PI_WDQ_LEVELING) == PI_WDQ_LEVELING) {
> + ret = data_training_wdql(chan, channel, params);
> + if (ret < 0) {
> + debug("%s: data training wdql failed\n", __func__);
> + return ret;
> + }
> + }
>
> /* PHY_927 PHY_PAD_DQS_DRIVE RPULL offset_22 */
> clrbits_le32(&denali_phy[927], (1 << 22));
> @@ -1062,7 +1088,7 @@ static int switch_to_phy_index1(struct dram_info *dram,
> clrsetbits_le32(&denali_phy[896], (0x3 << 8) | 1, 1 << 8);
> ret = data_training(&dram->chan[channel], channel,
> params, PI_FULL_TRAINING);
> - if (ret) {
> + if (ret < 0) {
> debug("index1 training failed\n");
> return ret;
> }
> @@ -1108,7 +1134,7 @@ static int sdram_init(struct dram_info *dram,
> udelay(10);
>
> if (data_training(chan, channel, params, PI_FULL_TRAINING)) {
> - printf("SDRAM initialization failed, reset\n");
> + printf("%s: data training failed\n", __func__);
> return -EIO;
> }
>
More information about the U-Boot
mailing list