From patchwork Thu Aug 11 07:58:48 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Lee Jones X-Patchwork-Id: 596646 Delivered-To: patch@linaro.org Received: by 2002:a05:7000:b345:0:0:0:0 with SMTP id w5csp667714maz; Thu, 11 Aug 2022 04:48:27 -0700 (PDT) X-Google-Smtp-Source: AA6agR4PWE+noALkqL7OUrB6dUP9dzk6IzpDz+530FrC13WQfeDVMIBfJ8XU3UrvE4/ICVjHqC7F X-Received: by 2002:a05:6638:328d:b0:342:ec2f:4960 with SMTP id f13-20020a056638328d00b00342ec2f4960mr9804425jav.19.1660218507706; Thu, 11 Aug 2022 04:48:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660218507; cv=none; d=google.com; s=arc-20160816; b=M/fnoo4yV94gzmG6V94t+CJ8ETTpdHR9EpmNnpVwCFOXRwPb92bf2BhoPdl4A1SW/t mvDl89xqU92U5x+lA69HG83POzp29vYogozYVi0/i34f86Rq0Nv9uAgo0FUe722YXnQU KUdRyDNQ5CYvkpF5KXiUUwqn6Vf+V0UhKrVKLNWOqdnxdOatRdpwqkhLvCINp/TtjzNW TcCuhn6Z9g4DBEeULvPMsUSPi87pfzvJAXip69hrb+Ig08RUZx8no5csjz8L8GKNjqas +UTJoAeQc1kRtjOK1xHynuDI3jhabTLNqeBtznkjEkyiBfregy3nX3i4mnCF8254Kxzl 5MHQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=onEE0EOcGjtS0GpZORXKOmcojH0HiMspGsBQVC02tfE=; b=hrK+J7RR0ByKO9Ts3SqIVhD+Z3umfa14PyPljXEtSGEet2lRGhCxPL/+nbb+7ldLSR gg+JBP7niNC57avFw3VTDowfqKak1+PDWfZF282PRMFNxmXqG3PcRT+25ccnZ3NT2roB 0xPlKQtRdZ8QjsQqpFeq0QXCaTvecOzg862QwHEQgQ68cFXLaDuNDgKkL6HQKrH3yQC1 w2WsvxUihVA/epQJapLC3o4FDgxWobiejDPgv8YSky6/QpeFzoRuJ4ieReLv0XhxbIm/ P5N+HhbvKtGJQmfNQna0Z3nWCN4nSj0zZGesDhaZq/MBH3gxrEPuPq+GsjDDfa3dyNp4 QVhg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=tQNVxoh9; spf=pass (google.com: domain of u-boot-bounces@lists.denx.de designates 2a01:238:438b:c500:173d:9f52:ddab:ee01 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from phobos.denx.de (phobos.denx.de. [2a01:238:438b:c500:173d:9f52:ddab:ee01]) by mx.google.com with ESMTPS id ct3-20020a056638488300b003434b7de75bsi2883007jab.158.2022.08.11.04.48.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Aug 2022 04:48:27 -0700 (PDT) Received-SPF: pass (google.com: domain of u-boot-bounces@lists.denx.de designates 2a01:238:438b:c500:173d:9f52:ddab:ee01 as permitted sender) client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=tQNVxoh9; spf=pass (google.com: domain of u-boot-bounces@lists.denx.de designates 2a01:238:438b:c500:173d:9f52:ddab:ee01 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 3C71084943; Thu, 11 Aug 2022 13:47:37 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="tQNVxoh9"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 9209C841D2; Thu, 11 Aug 2022 09:59:08 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.2 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 3FEE3841D2 for ; Thu, 11 Aug 2022 09:59:02 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=lee@kernel.org Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 3131761275; Thu, 11 Aug 2022 07:59:01 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0E573C43470; Thu, 11 Aug 2022 07:58:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1660204740; bh=H6R3SsuugGKQEqBMSwPhNSzMjYlbm/a1Qbe4xHaO4Mw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=tQNVxoh9Awpjq1eavSLjPNNFfQl1Okv1RDmbp7u2F07dgZ/WlSQrTQCwTArdKdSu8 GeNAxe5pAr8ukK+88mLfsgslISA+O5t00va18tVPsDfRtoMZ1dxtyxkGCdb/98y3A0 X/5tzuzGXQ0VvHZ23QNeqWJCXLfk7I5jx0bJFd0ukz/ylslzqPNbA/Z6vFjLPDiAY8 yGSTaCABGHqwPCWQvrF/l0XKa4OkOrFcXcE3MLiVZYUkaGn47B21uPon91SsyZ5gj2 CU1BHvrDvaJF/rvoAgCYucKsmj0Cm+qY3kEheid/xgfhvFLSP8lrMCoblNGNs60kKk tkhLT1u5ectYA== From: Lee Jones To: u-boot@lists.denx.de, sjg@chromium.org, philipp.tomsich@vrull.eu, kever.yang@rock-chips.com Cc: Lee Jones , YouMin Chen , Xavier Drudis Ferran Subject: [PATCH 3/3] ram: rk3399: Conduct memory training at 400MHz Date: Thu, 11 Aug 2022 08:58:48 +0100 Message-Id: <20220811075848.1791050-4-lee@kernel.org> X-Mailer: git-send-email 2.37.1.559.g78731f0fdb-goog In-Reply-To: <20220811075848.1791050-1-lee@kernel.org> References: <20220811075848.1791050-1-lee@kernel.org> MIME-Version: 1.0 X-Mailman-Approved-At: Thu, 11 Aug 2022 13:47:22 +0200 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.6 at phobos.denx.de X-Virus-Status: Clean Currently the default initialisation frequency is 50MHz. Although this does appear to be suitable for some LPDDR4 RAM chips, training at this low frequency has been seen to cause Column errors, leading to Capacity check errors on others. Here we force RAM initialisation to happen at 400MHz before ramping up to the final value running value of 800MHz after everything has been successfully configured. Link: https://lore.kernel.org/u-boot/Yo4v3jUeHXTovjOH@google.com/ Suggested-by: YouMin Chen Signed-off-by: Lee Jones Tested-by: Xavier Drudis Ferran Reviewed-by: Kever Yang Tested-by: Michal Suchánek --- drivers/ram/rockchip/sdram_rk3399.c | 36 +++++++++++++++++------------ 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/drivers/ram/rockchip/sdram_rk3399.c b/drivers/ram/rockchip/sdram_rk3399.c index 34d6c93f95..b05c5925d5 100644 --- a/drivers/ram/rockchip/sdram_rk3399.c +++ b/drivers/ram/rockchip/sdram_rk3399.c @@ -85,7 +85,7 @@ struct sdram_rk3399_ops { int (*data_training_first)(struct dram_info *dram, u32 channel, u8 rank, struct rk3399_sdram_params *sdram); int (*set_rate_index)(struct dram_info *dram, - struct rk3399_sdram_params *params); + struct rk3399_sdram_params *params, u32 ctl_fn); void (*modify_param)(const struct chan_info *chan, struct rk3399_sdram_params *params); struct rk3399_sdram_params * @@ -1644,7 +1644,8 @@ static int data_training_first(struct dram_info *dram, u32 channel, u8 rank, } static int switch_to_phy_index1(struct dram_info *dram, - struct rk3399_sdram_params *params) + struct rk3399_sdram_params *params, + u32 unused) { u32 channel; u32 *denali_phy; @@ -2539,26 +2540,25 @@ static int lpddr4_set_ctl(struct dram_info *dram, } static int lpddr4_set_rate(struct dram_info *dram, - struct rk3399_sdram_params *params) + struct rk3399_sdram_params *params, + u32 ctl_fn) { - u32 ctl_fn; u32 phy_fn; - for (ctl_fn = 0; ctl_fn < 2; ctl_fn++) { - phy_fn = lpddr4_get_phy_fn(params, ctl_fn); + phy_fn = lpddr4_get_phy_fn(params, ctl_fn); - lpddr4_set_phy(dram, params, phy_fn, &dfs_cfgs_lpddr4[ctl_fn]); - lpddr4_set_ctl(dram, params, ctl_fn, - dfs_cfgs_lpddr4[ctl_fn].base.ddr_freq); + lpddr4_set_phy(dram, params, phy_fn, &dfs_cfgs_lpddr4[ctl_fn]); + lpddr4_set_ctl(dram, params, ctl_fn, + dfs_cfgs_lpddr4[ctl_fn].base.ddr_freq); - if (IS_ENABLED(CONFIG_RAM_ROCKCHIP_DEBUG)) - printf("%s: change freq to %dMHz %d, %d\n", __func__, - dfs_cfgs_lpddr4[ctl_fn].base.ddr_freq / MHz, - ctl_fn, phy_fn); - } + if (IS_ENABLED(CONFIG_RAM_ROCKCHIP_DEBUG)) + printf("%s: change freq to %dMHz %d, %d\n", __func__, + dfs_cfgs_lpddr4[ctl_fn].base.ddr_freq / MHz, + ctl_fn, phy_fn); return 0; } + #endif /* CONFIG_RAM_RK3399_LPDDR4 */ /* CS0,n=1 @@ -2955,6 +2955,12 @@ static int sdram_init(struct dram_info *dram, params->ch[ch].cap_info.rank = rank; } +#if defined(CONFIG_RAM_RK3399_LPDDR4) + /* LPDDR4 needs to be trained at 400MHz */ + lpddr4_set_rate(dram, params, 0); + params->base.ddr_freq = dfs_cfgs_lpddr4[0].base.ddr_freq / MHz; +#endif + params->base.num_channels = 0; for (channel = 0; channel < 2; channel++) { const struct chan_info *chan = &dram->chan[channel]; @@ -3005,7 +3011,7 @@ static int sdram_init(struct dram_info *dram, params->base.stride = calculate_stride(params); dram_all_config(dram, params); - ret = dram->ops->set_rate_index(dram, params); + ret = dram->ops->set_rate_index(dram, params, 1); if (ret) return ret;