From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,MSGID_FROM_MTA_HEADER,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9A7CDC11F64 for ; Tue, 29 Jun 2021 02:07:35 +0000 (UTC) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2307461CAF for ; Tue, 29 Jun 2021 02:07:35 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2307461CAF Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=oss.nxp.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 54048831A0; Tue, 29 Jun 2021 04:01:53 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=oss.nxp.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="V4YXjAmI"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 833C28314A; Tue, 29 Jun 2021 04:01:11 +0200 (CEST) Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05on20604.outbound.protection.outlook.com [IPv6:2a01:111:f400:7d00::604]) (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 7BA0E8313A for ; Tue, 29 Jun 2021 04:01:05 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=oss.nxp.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=peng.fan@oss.nxp.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=eY+F959rybv5r/dtPo3xpGsY8BeLhwmjtLGePZFovSg5MYPWhxJ202ucwFeKQ5K9JCBzJwEiCGwfgVYPW10uW0jnj160p2AGu7L142py9FemW0gHi1O07WOY9vng2NiW9AX2V8F4Tb42ujAV4AfoUWF0rmLD07lY5VuZRv/tcOpiPfqdORCai/VtLqrvnPYTfMB8NoAAq7Woc4sle6Pp130/+ud1eshTFe6GnEExl86RBaXXran+6pspfYKIKXZ2cPYeZqKAlNxKdKeIOgVJ/rdeEAbggDgnL1wjYpmLMUpjTzvvf9nwJeSj2TkQcMNVQbOIYuNTReXiLHFqPjMe6Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=UaWTBpX7RavH4CG/IC2mB+s2zVr2i4YqLnWaH8DCrGQ=; b=Qq3vwzogpaKwZqHxBwvEG/h240bWj6xAFgPjzOHTKBlf95TJOF8k4QMS8lfW1LyJSo4k6TryifHPLp/2RIep6Y9HprLaobKnMYiAOvu5ctrnvrZo/N15PvP4/L4V7cdKZSWzh2z7IKTCu6u1mvRI+6a0SkXOiHPtKN/bhiKstacOUuhsE9fKNb/B0RI4Bv516sKUTYzOSMn3pJBQCGsUrR3bVQ5k+tVYv6uiJg9AlNHJ4D2Op5QqS/eOVaVM5jYeVUVue6rLo8GAxN5fqjr3moO92s94SBx/z8C71hxpO7FtBihr8sMJv5cpa05vIKIGE/F//7AcQI103UD4NkHjSw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector2-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=UaWTBpX7RavH4CG/IC2mB+s2zVr2i4YqLnWaH8DCrGQ=; b=V4YXjAmIptCrt6UD4Mw9ISnNfWSD4QeDMKCRb8zBKsgB+XGR6N6fWl3iLocQ7pzqMg+dFsqwiCHCxxVqsGJ974Ijn/96J0263UXFyD+ZFF3jAGoVhuv1CfgK5wPMNhHWygYZnfUpFpt6pmcrf0YGHnWE1yxJU1pTDd2AfA5/cKA= Authentication-Results: denx.de; dkim=none (message not signed) header.d=none;denx.de; dmarc=none action=none header.from=oss.nxp.com; Received: from DB6PR0402MB2760.eurprd04.prod.outlook.com (2603:10a6:4:a1::14) by DB3PR0402MB3657.eurprd04.prod.outlook.com (2603:10a6:8:b::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4264.20; Tue, 29 Jun 2021 02:01:03 +0000 Received: from DB6PR0402MB2760.eurprd04.prod.outlook.com ([fe80::c445:d742:eb76:86dd]) by DB6PR0402MB2760.eurprd04.prod.outlook.com ([fe80::c445:d742:eb76:86dd%9]) with mapi id 15.20.4264.026; Tue, 29 Jun 2021 02:01:03 +0000 From: "Peng Fan (OSS)" To: sbabic@denx.de, festevam@gmail.com Cc: uboot-imx@nxp.com, u-boot@lists.denx.de, Ye Li Subject: [PATCH V2 44/46] ddr: Add DDR driver for iMX8ULP Date: Tue, 29 Jun 2021 10:32:38 +0800 Message-Id: <20210629023240.22394-45-peng.fan@oss.nxp.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210629023240.22394-1-peng.fan@oss.nxp.com> References: <20210629023240.22394-1-peng.fan@oss.nxp.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [119.31.174.71] X-ClientProxiedBy: SG2PR06CA0088.apcprd06.prod.outlook.com (2603:1096:3:14::14) To DB6PR0402MB2760.eurprd04.prod.outlook.com (2603:10a6:4:a1::14) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from linux-1xn6.ap.freescale.net (119.31.174.71) by SG2PR06CA0088.apcprd06.prod.outlook.com (2603:1096:3:14::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4264.19 via Frontend Transport; Tue, 29 Jun 2021 02:01:01 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 371975be-7f3e-47b7-137d-08d93aa1c009 X-MS-TrafficTypeDiagnostic: DB3PR0402MB3657: X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:6790; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 38TW65vXrbMURmwM2j/t2wNQqaZQkl+u0M8fc8jCDx7Gf2JofzHcKY2UsDBh/aXpytcrWsqH4GqbbsvtXTU6V46CwIKYWgHqWwex4WCU5+GPFoohp774kc07m/JsFWpF1VrnHQ1lZphvTFnspLP474gm65eeWDV17d1ndXUvPnMWNoY9ySOFLiaS00g96Am6iGnTxnYpgo/lFD6WXt4gUq65cV02WnSBOKD0ltOOokZEjcLSAQuIAc6eosYLvHYVBTZ9nIvv+4gWTkseCj+AIDRX+tksxL++p5RqjtGnHW+s5G2YbgTo9AAWBwvvGOsp21e6itX2z1p+XjTJfI3M/TccDkysX8XFpU0ShnbLOKRrwRMcChNcKyb0Y1OCK5hhQlazI3rioJ9Chzsc5kiiwnYP8bD5nxKMi2uP2B9gyCDK8XGEyA4WZHwNNRsRZEjD08eEVY65gfcrLBxwHLB3cVvr9U9oqmYDZY09ugzQ9RTu6XFIs9JBHTYyVqratBc5toauz1/5LZcXyIh/DXKOz7tqN+VSsvJ0gRtWo94M6tL5JP1Vxxa2H/RIxn8XPDYqkVAbxszvozad4Ht3q9TIqPKsWlYDVpCnF31L1QeHmT5++oAWNOeFf7hhE34ugsFEFx9XOH8H0TYqm1AlWxTZc1Zrz2UxaJnZ1Jj9gxESnWaZWpuZwmBnr+eu6tdi08N4auLFpf+oN/dmiHqglR80Ln/zCFfArz1mdtgt+9XF9oQ= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DB6PR0402MB2760.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(366004)(39860400002)(136003)(396003)(346002)(376002)(478600001)(26005)(83380400001)(6506007)(38350700002)(66946007)(5660300002)(66476007)(66556008)(38100700002)(6486002)(2906002)(16526019)(8676002)(52116002)(6512007)(4326008)(6666004)(956004)(186003)(8936002)(86362001)(316002)(2616005)(1076003)(32563001); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?80zrLtjWDKgF+Qgwz3TBjmWhn992ztllBSCdtF3fdWQ5dQnlDr9sgjjMun0V?= =?us-ascii?Q?uLjuQOD5xdUjm7s8Vy8+oFJu/tXkDowNpQAfdu3wvms5WXzlw4hS30OijNhu?= =?us-ascii?Q?AoXopBrxGSJvWDELCI57GcipFCymbpz6D4z07q/HcJwuyIGTXEKdUk+H05/n?= =?us-ascii?Q?118vXZzSqn26vcpfoz5d/5v06HAgDa9A6aAlfs/LDAghBo3ram30G83paX4B?= =?us-ascii?Q?8vXwHAwobhsqwO8IcU5+P0CORQWzvYsQ6Y7E7zwDYbQFMW7zLhlPYz63AVkJ?= =?us-ascii?Q?e8HfhZAdE9lvsbwf58m45EViMXzqRODXdDtLpK/LFkc+8H0fiPKwqL0wUOuk?= =?us-ascii?Q?UQMiG03LUnBMujgvwEnX5pK/0mCZHPSva765aCFoSW/tq7RKo1qBiLCERl+V?= =?us-ascii?Q?nVHie6ZdjReYm+gJV8824tLwe1EPrwrcwxrDdYwAHjRWL9XeiNyXgxhVS9VI?= =?us-ascii?Q?qxTiPBAzWdWoCY3MquJteSmk/xgUrSrklB71M3i+R04Rto9SsRMOSI6h+Hfk?= =?us-ascii?Q?/9E1TQXkPGUKfc8YAUn0bGkvnQ6b1RCfC1FW4aHipeVg8f9aHuJ1V97WFXe+?= =?us-ascii?Q?eXEhxNMj5mwEt0ZGmoDHAT9ayzPA/1QXrQHggDfGnqmGgWFeCo9K1uWVZt4S?= =?us-ascii?Q?Ky9+pskD+88/Ec2RakJAgGpedwKEYo6a8u4K3tcOD6qjrzn7SOo4F/M6oxGB?= =?us-ascii?Q?N90PPzOT4U7OjoTjJaPcFNzD/omJzfMp7HDagKf4c3jp76PRGQ7na1myXg6I?= =?us-ascii?Q?Cg6eRHzOJ++Dqm23erZIncbIKTt+yjvrl7Mf5uYGkSwxrYYKeXj90oF5F7rD?= =?us-ascii?Q?oBYYrolkfvi+QykzypFr8xv+d927LhLTboQ1CvzBubIDt1FiGS3xRb5EAZ9l?= =?us-ascii?Q?ooK0WMLPnPZe5sBmt/375OdMlOXwLXEEqAh4F1lqury+kr9Ufiq2lVjXYU78?= =?us-ascii?Q?NLinPOIMvRmTCxF41eLxi0W0y+y857RkqAP8/UMlxNtvUlF42RCL4YkxmhSu?= =?us-ascii?Q?HJyNyxCLCvUkJpAw/l+SP9b2+OohehQrnbGZ28FNfZJKaOtWIvo0GI724WAO?= =?us-ascii?Q?K7EEOON9K8sI7ExCIsI2mcvOuvMOgMklTha68aSPDW4Pecdkpp4V77cVGOz9?= =?us-ascii?Q?xVJ6GXsT0CFBt7UVWpk521y5NBuctc1g8TGq6hs3VaBn0yRX3W9wws8tsxtU?= =?us-ascii?Q?xI0LyhGRSgKf8x5Kjg8FxRLT4PaYLaMB7qzZRjAEwXrqS6/oylZShNdkzBQj?= =?us-ascii?Q?qlND0CFlXPnRXXazGiN4XnndtLUfWW6KOrsgL+ao4b1ht7T5Khi7PWIE0VIW?= =?us-ascii?Q?W5dXqrZ7Hh3JWLJagihHhseX?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 371975be-7f3e-47b7-137d-08d93aa1c009 X-MS-Exchange-CrossTenant-AuthSource: DB6PR0402MB2760.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Jun 2021 02:01:03.8840 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: I2+ZyD0fwvlI1xF1BfMq/ZtLY1SLVYpqasKk+opQN+9AjnhsiXEQy4BiA+ILuWA5TMhe0JmNiXxT/I6MyFAJYg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB3PR0402MB3657 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 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.2 at phobos.denx.de X-Virus-Status: Clean From: Ye Li Add iMX8ULP DDR initialization driver which loads the DDR timing parameters and executes the training procedure. When enabling IMX8ULP_DRAM_PHY_PLL_BYPASS, using PHY PLL bypass mode to do DDR init Signed-off-by: Ye Li --- drivers/Makefile | 1 + drivers/ddr/imx/Kconfig | 1 + drivers/ddr/imx/imx8ulp/Kconfig | 11 ++ drivers/ddr/imx/imx8ulp/Makefile | 9 ++ drivers/ddr/imx/imx8ulp/ddr_init.c | 217 +++++++++++++++++++++++++++++ 5 files changed, 239 insertions(+) create mode 100644 drivers/ddr/imx/imx8ulp/Kconfig create mode 100644 drivers/ddr/imx/imx8ulp/Makefile create mode 100644 drivers/ddr/imx/imx8ulp/ddr_init.c diff --git a/drivers/Makefile b/drivers/Makefile index 3510daba29..7533ac6aa0 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -45,6 +45,7 @@ obj-$(CONFIG_ARMADA_38X) += ddr/marvell/a38x/ obj-$(CONFIG_ARMADA_XP) += ddr/marvell/axp/ obj-$(CONFIG_$(SPL_)ALTERA_SDRAM) += ddr/altera/ obj-$(CONFIG_ARCH_IMX8M) += ddr/imx/imx8m/ +obj-$(CONFIG_IMX8ULP_DRAM) += ddr/imx/imx8ulp/ obj-$(CONFIG_SPL_POWER_SUPPORT) += power/ power/pmic/ obj-$(CONFIG_SPL_POWER_SUPPORT) += power/regulator/ obj-$(CONFIG_SPL_POWER_DOMAIN) += power/domain/ diff --git a/drivers/ddr/imx/Kconfig b/drivers/ddr/imx/Kconfig index 7e06fb2f7d..179f34530d 100644 --- a/drivers/ddr/imx/Kconfig +++ b/drivers/ddr/imx/Kconfig @@ -1 +1,2 @@ source "drivers/ddr/imx/imx8m/Kconfig" +source "drivers/ddr/imx/imx8ulp/Kconfig" diff --git a/drivers/ddr/imx/imx8ulp/Kconfig b/drivers/ddr/imx/imx8ulp/Kconfig new file mode 100644 index 0000000000..e56062a1d0 --- /dev/null +++ b/drivers/ddr/imx/imx8ulp/Kconfig @@ -0,0 +1,11 @@ +menu "i.MX8ULP DDR controllers" + depends on ARCH_IMX8ULP + +config IMX8ULP_DRAM + bool "imx8m dram" + +config IMX8ULP_DRAM_PHY_PLL_BYPASS + bool "Enable the DDR PHY PLL bypass mode, so PHY clock is from DDR_CLK " + depends on IMX8ULP_DRAM + +endmenu diff --git a/drivers/ddr/imx/imx8ulp/Makefile b/drivers/ddr/imx/imx8ulp/Makefile new file mode 100644 index 0000000000..7f44a92180 --- /dev/null +++ b/drivers/ddr/imx/imx8ulp/Makefile @@ -0,0 +1,9 @@ +# +# Copyright 2021 NXP +# +# SPDX-License-Identifier: GPL-2.0+ +# + +ifdef CONFIG_SPL_BUILD +obj-$(CONFIG_IMX8ULP_DRAM) += ddr_init.o +endif diff --git a/drivers/ddr/imx/imx8ulp/ddr_init.c b/drivers/ddr/imx/imx8ulp/ddr_init.c new file mode 100644 index 0000000000..16aaf56103 --- /dev/null +++ b/drivers/ddr/imx/imx8ulp/ddr_init.c @@ -0,0 +1,217 @@ +// SPDX-License-Identifier: GPL-2.0+ OR MIT +/* + * Copyright 2021 NXP + */ +#include +#include +#include +#include +#include + +#define DENALI_CTL_00 (DDR_CTL_BASE_ADDR + 4 * 0) +#define CTL_START 0x1 + +#define DENALI_CTL_03 (DDR_CTL_BASE_ADDR + 4 * 3) +#define DENALI_CTL_197 (DDR_CTL_BASE_ADDR + 4 * 197) +#define DENALI_CTL_250 (DDR_CTL_BASE_ADDR + 4 * 250) +#define DENALI_CTL_251 (DDR_CTL_BASE_ADDR + 4 * 251) +#define DENALI_CTL_266 (DDR_CTL_BASE_ADDR + 4 * 266) +#define DFI_INIT_COMPLETE 0x2 + +#define DENALI_CTL_614 (DDR_CTL_BASE_ADDR + 4 * 614) +#define DENALI_CTL_615 (DDR_CTL_BASE_ADDR + 4 * 615) + +#define DENALI_PI_00 (DDR_PI_BASE_ADDR + 4 * 0) +#define PI_START 0x1 + +#define DENALI_PI_04 (DDR_PI_BASE_ADDR + 4 * 4) +#define DENALI_PI_11 (DDR_PI_BASE_ADDR + 4 * 11) +#define DENALI_PI_12 (DDR_PI_BASE_ADDR + 4 * 12) +#define DENALI_CTL_23 (DDR_CTL_BASE_ADDR + 4 * 23) +#define DENALI_CTL_25 (DDR_CTL_BASE_ADDR + 4 * 25) + +#define DENALI_PHY_1624 (DDR_PHY_BASE_ADDR + 4 * 1624) +#define DENALI_PHY_1537 (DDR_PHY_BASE_ADDR + 4 * 1537) +#define PHY_FREQ_SEL_MULTICAST_EN(X) ((X) << 8) +#define PHY_FREQ_SEL_INDEX(X) ((X) << 16) + +#define DENALI_PHY_1547 (DDR_PHY_BASE_ADDR + 4 * 1547) +#define DENALI_PHY_1555 (DDR_PHY_BASE_ADDR + 4 * 1555) +#define DENALI_PHY_1564 (DDR_PHY_BASE_ADDR + 4 * 1564) +#define DENALI_PHY_1565 (DDR_PHY_BASE_ADDR + 4 * 1565) + +static void ddr_enable_pll_bypass(void) +{ + u32 reg_val; + + /* PI_INIT_LVL_EN=0x0 (DENALI_PI_04) */ + reg_val = readl(DENALI_PI_04) & ~0x1; + writel(reg_val, DENALI_PI_04); + + /* PI_FREQ_MAP=0x1 (DENALI_PI_12) */ + writel(0x1, DENALI_PI_12); + + /* PI_INIT_WORK_FREQ=0x0 (DENALI_PI_11) */ + reg_val = readl(DENALI_PI_11) & ~(0x1f << 8); + writel(reg_val, DENALI_PI_11); + + /* DFIBUS_FREQ_INIT=0x0 (DENALI_CTL_23) */ + reg_val = readl(DENALI_CTL_23) & ~(0x3 << 24); + writel(reg_val, DENALI_CTL_23); + + /* PHY_LP4_BOOT_DISABLE=0x0 (DENALI_PHY_1547) */ + reg_val = readl(DENALI_PHY_1547) & ~(0x1 << 8); + writel(reg_val, DENALI_PHY_1547); + + /* PHY_PLL_BYPASS=0x1 (DENALI_PHY_1624) */ + reg_val = readl(DENALI_PHY_1624) | 0x1; + writel(reg_val, DENALI_PHY_1624); + + /* PHY_LP4_BOOT_PLL_BYPASS to 0x1 (DENALI_PHY_1555) */ + reg_val = readl(DENALI_PHY_1555) | 0x1; + writel(reg_val, DENALI_PHY_1555); + + /* FREQ_CHANGE_TYPE_F0 = 0x0/FREQ_CHANGE_TYPE_F1 = 0x1/FREQ_CHANGE_TYPE_F2 = 0x2 */ + reg_val = 0x020100; + writel(reg_val, DENALI_CTL_25); +} + +int ddr_calibration(unsigned int fsp_table[3]) +{ + u32 reg_val; + u32 int_status_init, phy_freq_req, phy_freq_type; + u32 lock_0, lock_1, lock_2; + u32 freq_chg_pt, freq_chg_cnt; + + if (IS_ENABLED(CONFIG_IMX8ULP_DRAM_PHY_PLL_BYPASS)) { + ddr_enable_pll_bypass(); + freq_chg_cnt = 0; + freq_chg_pt = 0; + } else { + reg_val = readl(DENALI_CTL_250); + if (((reg_val >> 16) & 0x3) == 1) + freq_chg_cnt = 2; + else + freq_chg_cnt = 3; + + reg_val = readl(DENALI_PI_12); + if (reg_val == 0x3) { + freq_chg_pt = 1; + } else if (reg_val == 0x7) { + freq_chg_pt = 2; + } else { + printf("frequency map(0x%x) is wrong, please check!\r\n", reg_val); + return -1; + } + } + + /* Assert PI_START parameter and then assert START parameter in Controller. */ + reg_val = readl(DENALI_PI_00) | PI_START; + writel(reg_val, DENALI_PI_00); + + reg_val = readl(DENALI_CTL_00) | CTL_START; + writel(reg_val, DENALI_CTL_00); + + /* Poll for init_done_bit in Controller interrupt status register (INT_STATUS_INIT) */ + do { + if (!freq_chg_cnt) { + int_status_init = (readl(DENALI_CTL_266) >> 8) & 0xff; + /* DDR subsystem is ready for traffic. */ + if (int_status_init & DFI_INIT_COMPLETE) { + debug("complete\n"); + break; + } + } + + /* + * During leveling, PHY will request for freq change and SoC clock logic + * should provide requested frequency + * Polling SIM LPDDR_CTRL2 Bit phy_freq_chg_req until be 1'b1 + */ + reg_val = readl(AVD_SIM_LPDDR_CTRL2); + phy_freq_req = (reg_val >> 7) & 0x1; + + if (phy_freq_req) { + phy_freq_type = reg_val & 0x1F; + if (phy_freq_type == 0x00) { + debug("Poll for freq_chg_req on SIM register and change to F0 frequency.\n"); + set_ddr_clk(fsp_table[phy_freq_type] >> 1); + + /* Write 1'b1 at LPDDR_CTRL2 bit phy_freq_cfg_ack */ + reg_val = readl(AVD_SIM_LPDDR_CTRL2); + writel(reg_val | (0x1 << 6), AVD_SIM_LPDDR_CTRL2); + } else if (phy_freq_type == 0x01) { + debug("Poll for freq_chg_req on SIM register and change to F1 frequency.\n"); + set_ddr_clk(fsp_table[phy_freq_type] >> 1); + + /* Write 1'b1 at LPDDR_CTRL2 bit phy_freq_cfg_ack */ + reg_val = readl(AVD_SIM_LPDDR_CTRL2); + writel(reg_val | (0x1 << 6), AVD_SIM_LPDDR_CTRL2); + if (freq_chg_pt == 1) + freq_chg_cnt--; + } else if (phy_freq_type == 0x02) { + debug("Poll for freq_chg_req on SIM register and change to F2 frequency.\n"); + set_ddr_clk(fsp_table[phy_freq_type] >> 1); + + /* Write 1'b1 at LPDDR_CTRL2 bit phy_freq_cfg_ack */ + reg_val = readl(AVD_SIM_LPDDR_CTRL2); + writel(reg_val | (0x1 << 6), AVD_SIM_LPDDR_CTRL2); + if (freq_chg_pt == 2) + freq_chg_cnt--; + } + reg_val = readl(AVD_SIM_LPDDR_CTRL2); + } + } while (1); + + /* Check PLL lock status */ + lock_0 = readl(DENALI_PHY_1564) & 0xffff; + lock_1 = (readl(DENALI_PHY_1564) >> 16) & 0xffff; + lock_2 = readl(DENALI_PHY_1565) & 0xffff; + + if ((lock_0 & 0x3) != 0x3 || (lock_1 & 0x3) != 0x3 || (lock_2 & 0x3) != 0x3) { + debug("De-Skew PLL failed to lock\n"); + debug("lock_0=0x%x, lock_1=0x%x, lock_2=0x%x\n", lock_0, lock_1, lock_2); + return -1; + } + + debug("De-Skew PLL is locked and ready\n"); + return 0; +} + +int ddr_init(struct dram_timing_info2 *dram_timing) +{ + int i; + + if (IS_ENABLED(CONFIG_IMX8ULP_DRAM_PHY_PLL_BYPASS)) { + /* Use PLL bypass for boot freq */ + /* Since PLL can't generate the double freq, Need ddr clock to generate it. */ + set_ddr_clk(dram_timing->fsp_table[0]); /* Set to boot freq */ + setbits_le32(AVD_SIM_BASE_ADDR, 0x1); /* SIM_DDR_CTRL_DIV2_EN */ + } else { + set_ddr_clk(dram_timing->fsp_table[0] >> 1); /* Set to boot freq */ + clrbits_le32(AVD_SIM_BASE_ADDR, 0x1); /* SIM_DDR_CTRL_DIV2_EN */ + } + + /* Initialize CTL registers */ + for (i = 0; i < dram_timing->ctl_cfg_num; i++) + writel(dram_timing->ctl_cfg[i].val, (ulong)dram_timing->ctl_cfg[i].reg); + + /* Initialize PI registers */ + for (i = 0; i < dram_timing->pi_cfg_num; i++) + writel(dram_timing->pi_cfg[i].val, (ulong)dram_timing->pi_cfg[i].reg); + + /* Write PHY regiters for all 3 frequency points (48Mhz/384Mhz/528Mhz): f1_index=0 */ + writel(PHY_FREQ_SEL_MULTICAST_EN(1) | PHY_FREQ_SEL_INDEX(0), DENALI_PHY_1537); + for (i = 0; i < dram_timing->phy_f1_cfg_num; i++) + writel(dram_timing->phy_f1_cfg[i].val, (ulong)dram_timing->phy_f1_cfg[i].reg); + + /* Write PHY regiters for freqency point 2 (528Mhz): f2_index=1 */ + writel(PHY_FREQ_SEL_MULTICAST_EN(0) | PHY_FREQ_SEL_INDEX(1), DENALI_PHY_1537); + for (i = 0; i < dram_timing->phy_f2_cfg_num; i++) + writel(dram_timing->phy_f2_cfg[i].val, (ulong)dram_timing->phy_f2_cfg[i].reg); + + /* Re-enable MULTICAST mode */ + writel(PHY_FREQ_SEL_MULTICAST_EN(1) | PHY_FREQ_SEL_INDEX(0), DENALI_PHY_1537); + + return ddr_calibration(dram_timing->fsp_table); +} -- 2.30.0