[{"id":1768836,"web_url":"http://patchwork.ozlabs.org/comment/1768836/","msgid":"<VI1PR04MB2078B8342CC2D93D22791F3A9A6F0@VI1PR04MB2078.eurprd04.prod.outlook.com>","list_archive_url":null,"date":"2017-09-14T21:02:35","subject":"Re: [U-Boot] [RESEND PATCH v3 1/7] armv8: lsch3: Add serdes and DDR\n\tvoltage setup","submitter":{"id":67822,"url":"http://patchwork.ozlabs.org/api/people/67822/","name":"York Sun","email":"york.sun@nxp.com"},"content":"You have a lot of magic numbers and delays. See inline comments.\n\nOn 09/03/2017 11:24 PM, Rajesh Bhagat wrote:\n> Adds SERDES voltage and reset SERDES lanes API and makes\n> enable/disable DDR controller support 0.9V API common.\n> \n> Signed-off-by: Ashish Kumar <Ashish.Kumar@nxp.com>\n> Signed-off-by: Rajesh Bhagat <rajesh.bhagat@nxp.com>\n> ---\n> Changes in v3:\n>   Restructured LS1088A VID support to use common VID driver\n>   Cosmetic review comments fixed\n>   Added __iomem for accessing registers\n> \n> Changes in v2:\n>   Checkpatch errors fixed\n> \n>   .../cpu/armv8/fsl-layerscape/fsl_lsch3_serdes.c    | 274 +++++++++++++++++++++\n>   arch/arm/cpu/armv8/fsl-layerscape/soc.c            |  34 +--\n>   .../include/asm/arch-fsl-layerscape/fsl_serdes.h   |   2 +-\n>   .../include/asm/arch-fsl-layerscape/immap_lsch3.h  |  34 +++\n>   arch/arm/include/asm/arch-fsl-layerscape/soc.h     |   1 +\n>   5 files changed, 327 insertions(+), 18 deletions(-)\n> \n> diff --git a/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch3_serdes.c b/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch3_serdes.c\n> index 179cac6..39f2cdf 100644\n> --- a/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch3_serdes.c\n> +++ b/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch3_serdes.c\n> @@ -158,6 +158,280 @@ void serdes_init(u32 sd, u32 sd_addr, u32 rcwsr, u32 sd_prctl_mask,\n>   \tserdes_prtcl_map[NONE] = 1;\n>   }\n>   \n> +__weak int get_serdes_volt(void)\n> +{\n> +\treturn -1;\n> +}\n> +\n> +__weak int set_serdes_volt(int svdd)\n> +{\n> +\treturn -1;\n> +}\n> +\n> +int setup_serdes_volt(u32 svdd)\n> +{\n> +\tstruct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);\n> +\tstruct ccsr_serdes __iomem *serdes1_base;\n> +\tu32 cfg_rcwsrds1 = gur_in32(&gur->rcwsr[FSL_CHASSIS3_SRDS1_REGSR - 1]);\n> +#ifdef CONFIG_SYS_FSL_SRDS_2\n> +\tstruct ccsr_serdes __iomem *serdes2_base;\n> +\tu32 cfg_rcwsrds2 = gur_in32(&gur->rcwsr[FSL_CHASSIS3_SRDS2_REGSR - 1]);\n> +#endif\n> +\tu32 cfg_tmp, reg = 0;\n> +\tint svdd_cur, svdd_tar;\n> +\tint ret = 1;\n> +\tint i;\n> +\n> +\t/* Only support switch SVDD to 900mV */\n> +\tif (svdd != 900)\n> +\t\treturn -1;\n> +\n> +\t/* Scale up to the LTC resolution is 1/4096V */\n> +\tsvdd = (svdd * 4096) / 1000;\n> +\n> +\tsvdd_tar = svdd;\n> +\tsvdd_cur = get_serdes_volt();\n> +\tif (svdd_cur < 0)\n> +\t\treturn -EINVAL;\n> +\n> +\tdebug(\"%s: current SVDD: %x; target SVDD: %x\\n\",\n> +\t      __func__, svdd_cur, svdd_tar);\n> +\tif (svdd_cur == svdd_tar)\n> +\t\treturn 0;\n> +\n> +\tserdes1_base = (void *)CONFIG_SYS_FSL_LSCH3_SERDES_ADDR;\n> +#ifdef CONFIG_SYS_FSL_SRDS_2\n> +\tserdes2_base =  (void *)(CONFIG_SYS_FSL_LSCH3_SERDES_ADDR + 0x10000);\n> +#endif\n> +\n> +\t/* Put the all enabled lanes in reset */\n> +#ifdef CONFIG_SYS_FSL_SRDS_1\n> +\tcfg_tmp = cfg_rcwsrds1 & FSL_CHASSIS3_SRDS1_PRTCL_MASK;\n> +\tcfg_tmp >>= FSL_CHASSIS3_SRDS1_PRTCL_SHIFT;\n> +\n> +\tfor (i = 0; i < 4 && cfg_tmp & (0xf << (3 - i)); i++) {\n> +\t\treg = in_le32(&serdes1_base->lane[i].gcr0);\n> +\t\treg &= 0xFF9FFFFF;\n> +\t\tout_le32(&serdes1_base->lane[i].gcr0, reg);\n> +\t}\n> +#endif\n\nPlease use local macros instead of magic numbers here and below.\n\n> +\n> +#ifdef CONFIG_SYS_FSL_SRDS_2\n> +\tcfg_tmp = cfg_rcwsrds2 & FSL_CHASSIS3_SRDS2_PRTCL_MASK;\n> +\tcfg_tmp >>= FSL_CHASSIS3_SRDS2_PRTCL_SHIFT;\n> +\n> +\tfor (i = 0; i < 4 && cfg_tmp & (0xf << (3 - i)); i++) {\n> +\t\treg = in_le32(&serdes2_base->lane[i].gcr0);\n> +\t\treg &= 0xFF9FFFFF;\n> +\t\tout_le32(&serdes2_base->lane[i].gcr0, reg);\n> +\t}\n> +#endif\n> +\n> +\t/* Put the all enabled PLL in reset */\n> +#ifdef CONFIG_SYS_FSL_SRDS_1\n> +\tcfg_tmp = cfg_rcwsrds1 & 0x3;\n> +\tfor (i = 0; i < 2 && !(cfg_tmp & (0x1 << (1 - i))); i++) {\n> +\t\treg = in_le32(&serdes1_base->bank[i].rstctl);\n> +\t\treg &= 0xFFFFFFBF;\n> +\t\treg |= 0x10000000;\n> +\t\tout_le32(&serdes1_base->bank[i].rstctl, reg);\n> +\t}\n> +\tudelay(1);\n> +\n> +\treg = in_le32(&serdes1_base->bank[i].rstctl);\n> +\treg &= 0xFFFFFF1F;\n> +\tout_le32(&serdes1_base->bank[i].rstctl, reg);\n> +#endif\n> +\n> +#ifdef CONFIG_SYS_FSL_SRDS_2\n> +\tcfg_tmp = cfg_rcwsrds1 & 0xC;\n> +\tcfg_tmp >>= 2;\n> +\tfor (i = 0; i < 2 && !(cfg_tmp & (0x1 << (1 - i))); i++) {\n> +\t\treg = in_le32(&serdes2_base->bank[i].rstctl);\n> +\t\treg &= 0xFFFFFFBF;\n> +\t\treg |= 0x10000000;\n> +\t\tout_le32(&serdes2_base->bank[i].rstctl, reg);\n> +\t}\n> +\tudelay(1);\n\nWhat's this delay for?\n\n> +\n> +\treg = in_le32(&serdes2_base->bank[i].rstctl);\n> +\treg &= 0xFFFFFF1F;\n> +\tout_le32(&serdes2_base->bank[i].rstctl, reg);\n> +#endif\n> +\n> +\t/* Put the Rx/Tx calibration into reset */\n> +#ifdef CONFIG_SYS_FSL_SRDS_1\n> +\treg = in_le32(&serdes1_base->srdstcalcr);\n> +\treg &= 0xF7FFFFFF;\n> +\tout_le32(&serdes1_base->srdstcalcr, reg);\n> +\treg = in_le32(&serdes1_base->srdsrcalcr);\n> +\treg &= 0xF7FFFFFF;\n> +\tout_le32(&serdes1_base->srdsrcalcr, reg);\n> +#endif\n> +\n> +#ifdef CONFIG_SYS_FSL_SRDS_2\n> +\treg = in_le32(&serdes2_base->srdstcalcr);\n> +\treg &= 0xF7FFFFFF;\n> +\tout_le32(&serdes2_base->srdstcalcr, reg);\n> +\treg = in_le32(&serdes2_base->srdsrcalcr);\n> +\treg &= 0xF7FFFFFF;\n> +\tout_le32(&serdes2_base->srdsrcalcr, reg);\n> +#endif\n> +\n> +\tret = set_serdes_volt(svdd);\n> +\tif (ret < 0) {\n> +\t\tprintf(\"could not change SVDD\\n\");\n> +\t\tret = -1;\n> +\t}\n> +\n> +\t/* For each PLL that’s not disabled via RCW enable the SERDES */\n> +#ifdef CONFIG_SYS_FSL_SRDS_1\n> +\tcfg_tmp = cfg_rcwsrds1 & 0x3;\n> +\tfor (i = 0; i < 2 && !(cfg_tmp & (0x1 << (1 - i))); i++) {\n> +\t\treg = in_le32(&serdes1_base->bank[i].rstctl);\n> +\t\treg |= 0x00000020;\n> +\t\tout_le32(&serdes1_base->bank[i].rstctl, reg);\n> +\t\tudelay(1);\n\nWhy delay here?\n\n> +\n> +\t\treg = in_le32(&serdes1_base->bank[i].rstctl);\n> +\t\treg |= 0x00000080;\n> +\t\tout_le32(&serdes1_base->bank[i].rstctl, reg);\n> +\t\tudelay(1);\n\nHere.\n\n> +\t\t/* Take the Rx/Tx calibration out of reset */\n> +\t\tif (!(cfg_tmp == 0x3 && i == 1)) {\n> +\t\t\tudelay(1);\n> +\t\t\treg = in_le32(&serdes1_base->srdstcalcr);\n> +\t\t\treg |= 0x08000000;\n> +\t\t\tout_le32(&serdes1_base->srdstcalcr, reg);\n> +\t\t\treg = in_le32(&serdes1_base->srdsrcalcr);\n> +\t\t\treg |= 0x08000000;\n> +\t\t\tout_le32(&serdes1_base->srdsrcalcr, reg);\n> +\t\t}\n> +\t\tudelay(1);\n\nWhy delay here?\n\n> +\t}\n> +#endif\n> +#ifdef CONFIG_SYS_FSL_SRDS_2\n> +\tcfg_tmp = cfg_rcwsrds1 & 0xC;\n> +\tcfg_tmp >>= 2;\n> +\tfor (i = 0; i < 2 && !(cfg_tmp & (0x1 << (1 - i))); i++) {\n> +\t\treg = in_le32(&serdes2_base->bank[i].rstctl);\n> +\t\treg |= 0x00000020;\n> +\t\tout_le32(&serdes2_base->bank[i].rstctl, reg);\n> +\t\tudelay(1);\n> +\n> +\t\treg = in_le32(&serdes2_base->bank[i].rstctl);\n> +\t\treg |= 0x00000080;\n> +\t\tout_le32(&serdes2_base->bank[i].rstctl, reg);\n> +\t\tudelay(1);\n> +\n> +\t\t/* Take the Rx/Tx calibration out of reset */\n> +\t\tif (!(cfg_tmp == 0x3 && i == 1)) {\n> +\t\t\tudelay(1);\n> +\t\t\treg = in_le32(&serdes2_base->srdstcalcr);\n> +\t\t\treg |= 0x08000000;\n> +\t\t\tout_le32(&serdes2_base->srdstcalcr, reg);\n> +\t\t\treg = in_le32(&serdes2_base->srdsrcalcr);\n> +\t\t\treg |= 0x08000000;\n> +\t\t\tout_le32(&serdes2_base->srdsrcalcr, reg);\n> +\t\t}\n> +\t\tudelay(1);\n> +\t}\n> +#endif\n\nYou have many duplicated code. Use functions or macros.\n\n> +\n> +\t/* Wait for at atleast 625us, ensure the PLLs being reset are locked */\n> +\tudelay(800);\n\nYou said 625us, but using 800.\n\n> +\n> +#ifdef CONFIG_SYS_FSL_SRDS_1\n> +\tcfg_tmp = cfg_rcwsrds1 & 0x3;\n> +\tfor (i = 0; i < 2 && !(cfg_tmp & (0x1 << (1 - i))); i++) {\n> +\t\t/* if the PLL is not locked, set RST_ERR */\n> +\t\treg = in_le32(&serdes1_base->bank[i].pllcr0);\n> +\t\tif (!((reg >> 23) & 0x1)) {\n> +\t\t\treg = in_le32(&serdes1_base->bank[i].rstctl);\n> +\t\t\treg |= 0x20000000;\n> +\t\t\tout_le32(&serdes1_base->bank[i].rstctl, reg);\n> +\t\t} else {\n> +\t\t\tudelay(1);\n> +\t\t\treg = in_le32(&serdes1_base->bank[i].rstctl);\n> +\t\t\treg &= 0xFFFFFFEF;\n> +\t\t\treg |= 0x00000040;\n> +\t\t\tout_le32(&serdes1_base->bank[i].rstctl, reg);\n> +\t\t\tudelay(1);\n> +\t\t}\n> +\t}\n> +#endif\n> +\n> +#ifdef CONFIG_SYS_FSL_SRDS_2\n> +\tcfg_tmp = cfg_rcwsrds1 & 0xC;\n> +\tcfg_tmp >>= 2;\n> +\n> +\tfor (i = 0; i < 2 && !(cfg_tmp & (0x1 << (1 - i))); i++) {\n> +\t\treg = in_le32(&serdes2_base->bank[i].pllcr0);\n> +\t\tif (!((reg >> 23) & 0x1)) {\n> +\t\t\treg = in_le32(&serdes2_base->bank[i].rstctl);\n> +\t\t\treg |= 0x20000000;\n> +\t\t\tout_le32(&serdes2_base->bank[i].rstctl, reg);\n> +\t\t} else {\n> +\t\t\tudelay(1);\n> +\t\t\treg = in_le32(&serdes2_base->bank[i].rstctl);\n> +\t\t\treg &= 0xFFFFFFEF;\n> +\t\t\treg |= 0x00000040;\n> +\t\t\tout_le32(&serdes2_base->bank[i].rstctl, reg);\n> +\t\t\tudelay(1);\n> +\t\t}\n> +\t}\n> +#endif\n> +\t/* Take the all enabled lanes out of reset */\n> +#ifdef CONFIG_SYS_FSL_SRDS_1\n> +\tcfg_tmp = cfg_rcwsrds1 & FSL_CHASSIS3_SRDS1_PRTCL_MASK;\n> +\tcfg_tmp >>= FSL_CHASSIS3_SRDS1_PRTCL_SHIFT;\n> +\n> +\tfor (i = 0; i < 4 && cfg_tmp & (0xf << (3 - i)); i++) {\n> +\t\treg = in_le32(&serdes1_base->lane[i].gcr0);\n> +\t\treg |= 0x00600000;\n> +\t\tout_le32(&serdes1_base->lane[i].gcr0, reg);\n> +\t}\n> +#endif\n> +#ifdef CONFIG_SYS_FSL_SRDS_2\n> +\tcfg_tmp = cfg_rcwsrds2 & FSL_CHASSIS3_SRDS2_PRTCL_MASK;\n> +\tcfg_tmp >>= FSL_CHASSIS3_SRDS2_PRTCL_SHIFT;\n> +\n> +\tfor (i = 0; i < 4 && cfg_tmp & (0xf << (3 - i)); i++) {\n> +\t\treg = in_le32(&serdes2_base->lane[i].gcr0);\n> +\t\treg |= 0x00600000;\n> +\t\tout_le32(&serdes2_base->lane[i].gcr0, reg);\n> +\t}\n> +#endif\n> +\n> +\t/* For each PLL being reset, and achieved PLL lock set RST_DONE */\n> +#ifdef CONFIG_SYS_FSL_SRDS_1\n> +\tcfg_tmp = cfg_rcwsrds1 & 0x3;\n> +\tfor (i = 0; i < 2; i++) {\n> +\t\treg = in_le32(&serdes1_base->bank[i].pllcr0);\n> +\t\tif (!(cfg_tmp & (0x1 << (1 - i))) && ((reg >> 23) & 0x1)) {\n> +\t\t\treg = in_le32(&serdes1_base->bank[i].rstctl);\n> +\t\t\treg |= 0x40000000;\n> +\t\t\tout_le32(&serdes1_base->bank[i].rstctl, reg);\n> +\t\t}\n> +\t}\n> +#endif\n> +#ifdef CONFIG_SYS_FSL_SRDS_2\n> +\tcfg_tmp = cfg_rcwsrds1 & 0xC;\n> +\tcfg_tmp >>= 2;\n> +\n> +\tfor (i = 0; i < 2; i++) {\n> +\t\treg = in_le32(&serdes2_base->bank[i].pllcr0);\n> +\t\tif (!(cfg_tmp & (0x1 << (1 - i))) && ((reg >> 23) & 0x1)) {\n> +\t\t\treg = in_le32(&serdes2_base->bank[i].rstctl);\n> +\t\t\treg |= 0x40000000;\n> +\t\t\tout_le32(&serdes2_base->bank[i].rstctl, reg);\n> +\t\t}\n> +\t}\n> +#endif\n> +\n> +\treturn ret;\n> +}\n> +\n>   void fsl_serdes_init(void)\n>   {\n>   #if defined(CONFIG_FSL_MC_ENET) && !defined(CONFIG_SPL_BUILD)\n> diff --git a/arch/arm/cpu/armv8/fsl-layerscape/soc.c b/arch/arm/cpu/armv8/fsl-layerscape/soc.c\n> index 83e2871..4e96c7b 100644\n> --- a/arch/arm/cpu/armv8/fsl-layerscape/soc.c\n> +++ b/arch/arm/cpu/armv8/fsl-layerscape/soc.c\n> @@ -404,23 +404,6 @@ static int setup_core_volt(u32 vdd)\n>   \treturn board_setup_core_volt(vdd);\n>   }\n>   \n> -#ifdef CONFIG_SYS_FSL_DDR\n> -static void ddr_enable_0v9_volt(bool en)\n> -{\n> -\tstruct ccsr_ddr __iomem *ddr = (void *)CONFIG_SYS_FSL_DDR_ADDR;\n> -\tu32 tmp;\n> -\n> -\ttmp = ddr_in32(&ddr->ddr_cdr1);\n> -\n> -\tif (en)\n> -\t\ttmp |= DDR_CDR1_V0PT9_EN;\n> -\telse\n> -\t\ttmp &= ~DDR_CDR1_V0PT9_EN;\n> -\n> -\tddr_out32(&ddr->ddr_cdr1, tmp);\n> -}\n> -#endif\n> -\n>   int setup_chip_volt(void)\n>   {\n>   \tint vdd;\n> @@ -485,6 +468,23 @@ void fsl_lsch2_early_init_f(void)\n>   }\n>   #endif\n>   \n> +#ifdef CONFIG_SYS_FSL_DDR\n> +void ddr_enable_0v9_volt(bool en)\n> +{\n> +\tstruct ccsr_ddr __iomem *ddr = (void *)CONFIG_SYS_FSL_DDR_ADDR;\n> +\tu32 tmp;\n> +\n> +\ttmp = ddr_in32(&ddr->ddr_cdr1);\n> +\n> +\tif (en)\n> +\t\ttmp |= DDR_CDR1_V0PT9_EN;\n> +\telse\n> +\t\ttmp &= ~DDR_CDR1_V0PT9_EN;\n> +\n> +\tddr_out32(&ddr->ddr_cdr1, tmp);\n> +}\n> +#endif\n> +\n\n\nI lost track. When do you use 0.9v for DDR?\n\nYork","headers":{"Return-Path":"<u-boot-bounces@lists.denx.de>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=lists.denx.de\n\t(client-ip=81.169.180.215; helo=lists.denx.de;\n\tenvelope-from=u-boot-bounces@lists.denx.de;\n\treceiver=<UNKNOWN>)","ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=nxp.com header.i=@nxp.com header.b=\"h1R80S9U\";\n\tdkim-atps=neutral","spf=none (sender IP is )\n\tsmtp.mailfrom=york.sun@nxp.com; "],"Received":["from lists.denx.de (dione.denx.de [81.169.180.215])\n\tby ozlabs.org (Postfix) with ESMTP id 3xtWFj1XDfz9s7h\n\tfor <incoming@patchwork.ozlabs.org>;\n\tFri, 15 Sep 2017 07:02:49 +1000 (AEST)","by lists.denx.de (Postfix, from userid 105)\n\tid DC0B6C21EC1; Thu, 14 Sep 2017 21:02:44 +0000 (UTC)","from lists.denx.de (localhost [IPv6:::1])\n\tby lists.denx.de (Postfix) with ESMTP id 6A099C21D5B;\n\tThu, 14 Sep 2017 21:02:40 +0000 (UTC)","by lists.denx.de (Postfix, from userid 105)\n\tid 69395C21D5B; Thu, 14 Sep 2017 21:02:39 +0000 (UTC)","from EUR01-DB5-obe.outbound.protection.outlook.com\n\t(mail-db5eur01on0076.outbound.protection.outlook.com [104.47.2.76])\n\tby lists.denx.de (Postfix) with ESMTPS id B8286C21C6D\n\tfor <u-boot@lists.denx.de>; Thu, 14 Sep 2017 21:02:38 +0000 (UTC)","from VI1PR04MB2078.eurprd04.prod.outlook.com (10.166.43.18) by\n\tVI1PR04MB0912.eurprd04.prod.outlook.com (10.161.106.20) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id\n\t15.20.35.12; Thu, 14 Sep 2017 21:02:36 +0000","from VI1PR04MB2078.eurprd04.prod.outlook.com\n\t([fe80::6943:4a49:ab20:5920]) by\n\tVI1PR04MB2078.eurprd04.prod.outlook.com\n\t([fe80::6943:4a49:ab20:5920%13]) with mapi id 15.20.0056.010;\n\tThu, 14 Sep 2017 21:02:36 +0000"],"X-Spam-Checker-Version":"SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de","X-Spam-Level":"","X-Spam-Status":"No, score=-0.0 required=5.0 tests=RCVD_IN_DNSWL_NONE,\n\tRCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,SPF_HELO_PASS,T_DKIM_INVALID\n\tautolearn=unavailable autolearn_force=no version=3.4.0","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version;\n\tbh=XdbdDJ3hOSc3SDPBJWF1Ts5zA3AYNdIhH/V//fV7+VM=;\n\tb=h1R80S9U1mx7jTtPD9PUt99aa+j+2C67W+ErUPSJ6fXIu9oa4dGPvfWX1l20WJ6eB0tcuXv7xKQW8yXZOo0uPCwiic5fWs7Kn3ml0NKRBksi9fT3npP+U/Nk8mOYMt6hDNpKeT/vlxJ+/slJquO/rUgYlmVC+rIpGlrNDFWmGt8=","From":"York Sun <york.sun@nxp.com>","To":"Rajesh Bhagat <rajesh.bhagat@nxp.com>, \"u-boot@lists.denx.de\"\n\t<u-boot@lists.denx.de>","Thread-Topic":"[RESEND PATCH v3 1/7] armv8: lsch3: Add serdes and DDR voltage\n\tsetup","Thread-Index":"AQHTJUZuPDgctigpGkiN3/yWxKY1hA==","Date":"Thu, 14 Sep 2017 21:02:35 +0000","Message-ID":"<VI1PR04MB2078B8342CC2D93D22791F3A9A6F0@VI1PR04MB2078.eurprd04.prod.outlook.com>","References":"<1504506242-31430-1-git-send-email-rajesh.bhagat@nxp.com>\n\t<1504506242-31430-2-git-send-email-rajesh.bhagat@nxp.com>","Accept-Language":"en-US","Content-Language":"en-US","X-MS-Has-Attach":"","X-MS-TNEF-Correlator":"","authentication-results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=lists.denx.de\n\t(client-ip=81.169.180.215; helo=lists.denx.de;\n\tenvelope-from=u-boot-bounces@lists.denx.de;\n\treceiver=<UNKNOWN>)","ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=nxp.com header.i=@nxp.com header.b=\"h1R80S9U\";\n\tdkim-atps=neutral","spf=none (sender IP is )\n\tsmtp.mailfrom=york.sun@nxp.com; "],"x-originating-ip":"[192.88.168.1]","x-ms-publictraffictype":"Email","x-microsoft-exchange-diagnostics":"1; VI1PR04MB0912;\n\t6:D8KEHgpDlGBgmfwkmjw4SVeyXQxBA1G3c8/5/k4y/eiSJeD8U2h5yHJTsQY8VDLRKszfo6biCTKdIfgTR6JL/MWs4xcp+vQiYlGxp9zQcACjUFKQJsKa/KqguI+O5hfbifbTJrVihyIO34hIcgPK5AQ1wl5DB4SOFTKYNMXkKfXSBRYOuWwiR7Kc8f4dT+E/Ve5zXJKr/uERP9WyATSKZn3nE6il6l/e4orDhs+0C6aJcBP/3j+9CHN6R9WEDCMIae5+Xsq2yqgGH2ipkqpxxsTXvVP04D0viLfMP5TX2s9OhlWVn3DhtHps0S2Zabx0Ca0ClFOKKV1732D8h8CamA==;\n\t5:4nAtjE5YebjAVK91df+P3zwkRZOfO2kL2S+2j+rly6i06Pn0QNIoqEd3RlkI6MwZTPcZ+sa/F9vbPrg5n6YngKV5Dj/4fE6zvStdXWnqpfZQBPvYSQfT8W/QteiWBxwR6OtHcIzyu0paemqMdhgIhg==;\n\t24:9OWjeOq2e0Mm1TaVlJHp8SYQJqE9RpPMkXAFqa0IS6tctWppuqswav7vFyM2qaDfKMuDteSvz9cU+VtW7i3cBouP/KmQFiV6xpJRl4u/36w=;\n\t7:vsODMsmJlcwuUygCzE/2BHf0v0P6nTKjC4F6CyBuWFJSJl/+63wFNjoPvwJT9nDV+OQYDP53LtKqpHVJ9uOECtb9bmFC1jvoxHpnwg7vG6Rd81Pt1tCGlM2nGUElKeMh0esuiDrDnvkGceTS/zYdILjBnZJA3wz/rX8S5nF16bmzU3tnT9rIxSd605snKGK0E4O5fqa7Y2VW4Z0ic0uzfOXH7eTEPeV5b9KQunbfAbU=","x-ms-exchange-antispam-srfa-diagnostics":"SSOS;SSOR;","x-forefront-antispam-report":"SFV:SKI; SCL:-1; SFV:NSPM;\n\tSFS:(10009020)(6009001)(376002)(39860400002)(346002)(189002)(199003)(377454003)(24454002)(4326008)(7696004)(5660300001)(305945005)(68736007)(74316002)(229853002)(575784001)(86362001)(54906002)(99286003)(2501003)(6246003)(97736004)(55016002)(66066001)(53546010)(105586002)(7736002)(189998001)(316002)(5250100002)(2900100001)(106356001)(33656002)(9686003)(6436002)(50986999)(8936002)(2906002)(25786009)(43066003)(3450700001)(3660700001)(6506006)(3280700002)(101416001)(8676002)(14454004)(81156014)(81166006)(53936002)(6116002)(3846002)(54356999)(76176999)(102836003)(478600001)(217873001);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR04MB0912;\n\tH:VI1PR04MB2078.eurprd04.prod.outlook.com; FPR:; SPF:None;\n\tPTR:InfoNoRecords; MX:1; A:1; LANG:en; ","x-ms-office365-filtering-correlation-id":"3ba807b6-873e-4d50-243b-08d4fbb3ed03","x-ms-office365-filtering-ht":"Tenant","x-microsoft-antispam":"UriScan:; BCL:0; PCL:0;\n\tRULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(48565401081)(300000503095)(300135400095)(2017052603199)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);\n\tSRVR:VI1PR04MB0912; ","x-ms-traffictypediagnostic":"VI1PR04MB0912:","x-exchange-antispam-report-test":"UriScan:(185117386973197);","x-microsoft-antispam-prvs":"<VI1PR04MB091226454E0413788378BBCD9A6F0@VI1PR04MB0912.eurprd04.prod.outlook.com>","x-exchange-antispam-report-cfa-test":"BCL:0; PCL:0;\n\tRULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(8121501046)(5005006)(3002001)(10201501046)(93006095)(93001095)(100000703101)(100105400095)(6055026)(6041248)(20161123560025)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123562025)(20161123555025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);\n\tSRVR:VI1PR04MB0912; BCL:0; PCL:0;\n\tRULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);\n\tSRVR:VI1PR04MB0912; ","x-forefront-prvs":"0430FA5CB7","received-spf":"None (protection.outlook.com: nxp.com does not designate\n\tpermitted sender hosts)","spamdiagnosticoutput":"1:99","spamdiagnosticmetadata":"NSPM","MIME-Version":"1.0","X-OriginatorOrg":"nxp.com","X-MS-Exchange-CrossTenant-originalarrivaltime":"14 Sep 2017 21:02:35.9268\n\t(UTC)","X-MS-Exchange-CrossTenant-fromentityheader":"Hosted","X-MS-Exchange-CrossTenant-id":"686ea1d3-bc2b-4c6f-a92c-d99c5c301635","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"VI1PR04MB0912","Subject":"Re: [U-Boot] [RESEND PATCH v3 1/7] armv8: lsch3: Add serdes and DDR\n\tvoltage setup","X-BeenThere":"u-boot@lists.denx.de","X-Mailman-Version":"2.1.18","Precedence":"list","List-Id":"U-Boot discussion <u-boot.lists.denx.de>","List-Unsubscribe":"<https://lists.denx.de/options/u-boot>,\n\t<mailto:u-boot-request@lists.denx.de?subject=unsubscribe>","List-Archive":"<http://lists.denx.de/pipermail/u-boot/>","List-Post":"<mailto:u-boot@lists.denx.de>","List-Help":"<mailto:u-boot-request@lists.denx.de?subject=help>","List-Subscribe":"<https://lists.denx.de/listinfo/u-boot>,\n\t<mailto:u-boot-request@lists.denx.de?subject=subscribe>","Reply-To":"York Sun <york.sun@nxp.com>","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"u-boot-bounces@lists.denx.de","Sender":"\"U-Boot\" <u-boot-bounces@lists.denx.de>"}},{"id":1769896,"web_url":"http://patchwork.ozlabs.org/comment/1769896/","msgid":"<HE1PR0401MB2331BCB6982B57DE451FE9B3E3630@HE1PR0401MB2331.eurprd04.prod.outlook.com>","list_archive_url":null,"date":"2017-09-18T06:57:43","subject":"Re: [U-Boot] [RESEND PATCH v3 1/7] armv8: lsch3: Add serdes and DDR\n\tvoltage setup","submitter":{"id":68498,"url":"http://patchwork.ozlabs.org/api/people/68498/","name":"Rajesh Bhagat","email":"rajesh.bhagat@nxp.com"},"content":"> -----Original Message-----\n> From: York Sun\n> Sent: Friday, September 15, 2017 2:33 AM\n> To: Rajesh Bhagat <rajesh.bhagat@nxp.com>; u-boot@lists.denx.de\n> Cc: Prabhakar Kushwaha <prabhakar.kushwaha@nxp.com>; Ashish Kumar\n> <ashish.kumar@nxp.com>\n> Subject: Re: [RESEND PATCH v3 1/7] armv8: lsch3: Add serdes and DDR voltage\n> setup\n> \n> You have a lot of magic numbers and delays. See inline comments.\n> \n> On 09/03/2017 11:24 PM, Rajesh Bhagat wrote:\n> > Adds SERDES voltage and reset SERDES lanes API and makes\n> > enable/disable DDR controller support 0.9V API common.\n> >\n> > Signed-off-by: Ashish Kumar <Ashish.Kumar@nxp.com>\n> > Signed-off-by: Rajesh Bhagat <rajesh.bhagat@nxp.com>\n> > ---\n> > Changes in v3:\n> >   Restructured LS1088A VID support to use common VID driver\n> >   Cosmetic review comments fixed\n> >   Added __iomem for accessing registers\n> >\n> > Changes in v2:\n> >   Checkpatch errors fixed\n> >\n> >   .../cpu/armv8/fsl-layerscape/fsl_lsch3_serdes.c    | 274\n> +++++++++++++++++++++\n> >   arch/arm/cpu/armv8/fsl-layerscape/soc.c            |  34 +--\n> >   .../include/asm/arch-fsl-layerscape/fsl_serdes.h   |   2 +-\n> >   .../include/asm/arch-fsl-layerscape/immap_lsch3.h  |  34 +++\n> >   arch/arm/include/asm/arch-fsl-layerscape/soc.h     |   1 +\n> >   5 files changed, 327 insertions(+), 18 deletions(-)\n> >\n> > diff --git a/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch3_serdes.c\n> > b/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch3_serdes.c\n> > index 179cac6..39f2cdf 100644\n> > --- a/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch3_serdes.c\n> > +++ b/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch3_serdes.c\n> > @@ -158,6 +158,280 @@ void serdes_init(u32 sd, u32 sd_addr, u32 rcwsr, u32\n> sd_prctl_mask,\n> >   \tserdes_prtcl_map[NONE] = 1;\n> >   }\n> >\n> > +__weak int get_serdes_volt(void)\n> > +{\n> > +\treturn -1;\n> > +}\n> > +\n> > +__weak int set_serdes_volt(int svdd)\n> > +{\n> > +\treturn -1;\n> > +}\n> > +\n> > +int setup_serdes_volt(u32 svdd)\n> > +{\n> > +\tstruct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);\n> > +\tstruct ccsr_serdes __iomem *serdes1_base;\n> > +\tu32 cfg_rcwsrds1 = gur_in32(&gur->rcwsr[FSL_CHASSIS3_SRDS1_REGSR -\n> > +1]); #ifdef CONFIG_SYS_FSL_SRDS_2\n> > +\tstruct ccsr_serdes __iomem *serdes2_base;\n> > +\tu32 cfg_rcwsrds2 = gur_in32(&gur->rcwsr[FSL_CHASSIS3_SRDS2_REGSR -\n> > +1]); #endif\n> > +\tu32 cfg_tmp, reg = 0;\n> > +\tint svdd_cur, svdd_tar;\n> > +\tint ret = 1;\n> > +\tint i;\n> > +\n> > +\t/* Only support switch SVDD to 900mV */\n> > +\tif (svdd != 900)\n> > +\t\treturn -1;\n> > +\n> > +\t/* Scale up to the LTC resolution is 1/4096V */\n> > +\tsvdd = (svdd * 4096) / 1000;\n> > +\n> > +\tsvdd_tar = svdd;\n> > +\tsvdd_cur = get_serdes_volt();\n> > +\tif (svdd_cur < 0)\n> > +\t\treturn -EINVAL;\n> > +\n> > +\tdebug(\"%s: current SVDD: %x; target SVDD: %x\\n\",\n> > +\t      __func__, svdd_cur, svdd_tar);\n> > +\tif (svdd_cur == svdd_tar)\n> > +\t\treturn 0;\n> > +\n> > +\tserdes1_base = (void *)CONFIG_SYS_FSL_LSCH3_SERDES_ADDR;\n> > +#ifdef CONFIG_SYS_FSL_SRDS_2\n> > +\tserdes2_base =  (void *)(CONFIG_SYS_FSL_LSCH3_SERDES_ADDR +\n> > +0x10000); #endif\n> > +\n> > +\t/* Put the all enabled lanes in reset */ #ifdef\n> > +CONFIG_SYS_FSL_SRDS_1\n> > +\tcfg_tmp = cfg_rcwsrds1 & FSL_CHASSIS3_SRDS1_PRTCL_MASK;\n> > +\tcfg_tmp >>= FSL_CHASSIS3_SRDS1_PRTCL_SHIFT;\n> > +\n> > +\tfor (i = 0; i < 4 && cfg_tmp & (0xf << (3 - i)); i++) {\n> > +\t\treg = in_le32(&serdes1_base->lane[i].gcr0);\n> > +\t\treg &= 0xFF9FFFFF;\n> > +\t\tout_le32(&serdes1_base->lane[i].gcr0, reg);\n> > +\t}\n> > +#endif\n> \n> Please use local macros instead of magic numbers here and below.\n> \n\nWill take care in v3 \n\n> > +\n> > +#ifdef CONFIG_SYS_FSL_SRDS_2\n> > +\tcfg_tmp = cfg_rcwsrds2 & FSL_CHASSIS3_SRDS2_PRTCL_MASK;\n> > +\tcfg_tmp >>= FSL_CHASSIS3_SRDS2_PRTCL_SHIFT;\n> > +\n> > +\tfor (i = 0; i < 4 && cfg_tmp & (0xf << (3 - i)); i++) {\n> > +\t\treg = in_le32(&serdes2_base->lane[i].gcr0);\n> > +\t\treg &= 0xFF9FFFFF;\n> > +\t\tout_le32(&serdes2_base->lane[i].gcr0, reg);\n> > +\t}\n> > +#endif\n> > +\n> > +\t/* Put the all enabled PLL in reset */ #ifdef CONFIG_SYS_FSL_SRDS_1\n> > +\tcfg_tmp = cfg_rcwsrds1 & 0x3;\n> > +\tfor (i = 0; i < 2 && !(cfg_tmp & (0x1 << (1 - i))); i++) {\n> > +\t\treg = in_le32(&serdes1_base->bank[i].rstctl);\n> > +\t\treg &= 0xFFFFFFBF;\n> > +\t\treg |= 0x10000000;\n> > +\t\tout_le32(&serdes1_base->bank[i].rstctl, reg);\n> > +\t}\n> > +\tudelay(1);\n> > +\n> > +\treg = in_le32(&serdes1_base->bank[i].rstctl);\n> > +\treg &= 0xFFFFFF1F;\n> > +\tout_le32(&serdes1_base->bank[i].rstctl, reg); #endif\n> > +\n> > +#ifdef CONFIG_SYS_FSL_SRDS_2\n> > +\tcfg_tmp = cfg_rcwsrds1 & 0xC;\n> > +\tcfg_tmp >>= 2;\n> > +\tfor (i = 0; i < 2 && !(cfg_tmp & (0x1 << (1 - i))); i++) {\n> > +\t\treg = in_le32(&serdes2_base->bank[i].rstctl);\n> > +\t\treg &= 0xFFFFFFBF;\n> > +\t\treg |= 0x10000000;\n> > +\t\tout_le32(&serdes2_base->bank[i].rstctl, reg);\n> > +\t}\n> > +\tudelay(1);\n> \n> What's this delay for?\n> \n\nThese delays are part of SERDES reset requirements, each step of \nSERDES reset requires some delay to be added.\n\n> > +\n> > +\treg = in_le32(&serdes2_base->bank[i].rstctl);\n> > +\treg &= 0xFFFFFF1F;\n> > +\tout_le32(&serdes2_base->bank[i].rstctl, reg); #endif\n> > +\n> > +\t/* Put the Rx/Tx calibration into reset */ #ifdef\n> > +CONFIG_SYS_FSL_SRDS_1\n> > +\treg = in_le32(&serdes1_base->srdstcalcr);\n> > +\treg &= 0xF7FFFFFF;\n> > +\tout_le32(&serdes1_base->srdstcalcr, reg);\n> > +\treg = in_le32(&serdes1_base->srdsrcalcr);\n> > +\treg &= 0xF7FFFFFF;\n> > +\tout_le32(&serdes1_base->srdsrcalcr, reg); #endif\n> > +\n> > +#ifdef CONFIG_SYS_FSL_SRDS_2\n> > +\treg = in_le32(&serdes2_base->srdstcalcr);\n> > +\treg &= 0xF7FFFFFF;\n> > +\tout_le32(&serdes2_base->srdstcalcr, reg);\n> > +\treg = in_le32(&serdes2_base->srdsrcalcr);\n> > +\treg &= 0xF7FFFFFF;\n> > +\tout_le32(&serdes2_base->srdsrcalcr, reg); #endif\n> > +\n> > +\tret = set_serdes_volt(svdd);\n> > +\tif (ret < 0) {\n> > +\t\tprintf(\"could not change SVDD\\n\");\n> > +\t\tret = -1;\n> > +\t}\n> > +\n> > +\t/* For each PLL that's not disabled via RCW enable the SERDES */\n> > +#ifdef CONFIG_SYS_FSL_SRDS_1\n> > +\tcfg_tmp = cfg_rcwsrds1 & 0x3;\n> > +\tfor (i = 0; i < 2 && !(cfg_tmp & (0x1 << (1 - i))); i++) {\n> > +\t\treg = in_le32(&serdes1_base->bank[i].rstctl);\n> > +\t\treg |= 0x00000020;\n> > +\t\tout_le32(&serdes1_base->bank[i].rstctl, reg);\n> > +\t\tudelay(1);\n> \n> Why delay here?\n> \n> > +\n> > +\t\treg = in_le32(&serdes1_base->bank[i].rstctl);\n> > +\t\treg |= 0x00000080;\n> > +\t\tout_le32(&serdes1_base->bank[i].rstctl, reg);\n> > +\t\tudelay(1);\n> \n> Here.\n> \n> > +\t\t/* Take the Rx/Tx calibration out of reset */\n> > +\t\tif (!(cfg_tmp == 0x3 && i == 1)) {\n> > +\t\t\tudelay(1);\n> > +\t\t\treg = in_le32(&serdes1_base->srdstcalcr);\n> > +\t\t\treg |= 0x08000000;\n> > +\t\t\tout_le32(&serdes1_base->srdstcalcr, reg);\n> > +\t\t\treg = in_le32(&serdes1_base->srdsrcalcr);\n> > +\t\t\treg |= 0x08000000;\n> > +\t\t\tout_le32(&serdes1_base->srdsrcalcr, reg);\n> > +\t\t}\n> > +\t\tudelay(1);\n> \n> Why delay here?\n> \n> > +\t}\n> > +#endif\n> > +#ifdef CONFIG_SYS_FSL_SRDS_2\n> > +\tcfg_tmp = cfg_rcwsrds1 & 0xC;\n> > +\tcfg_tmp >>= 2;\n> > +\tfor (i = 0; i < 2 && !(cfg_tmp & (0x1 << (1 - i))); i++) {\n> > +\t\treg = in_le32(&serdes2_base->bank[i].rstctl);\n> > +\t\treg |= 0x00000020;\n> > +\t\tout_le32(&serdes2_base->bank[i].rstctl, reg);\n> > +\t\tudelay(1);\n> > +\n> > +\t\treg = in_le32(&serdes2_base->bank[i].rstctl);\n> > +\t\treg |= 0x00000080;\n> > +\t\tout_le32(&serdes2_base->bank[i].rstctl, reg);\n> > +\t\tudelay(1);\n> > +\n> > +\t\t/* Take the Rx/Tx calibration out of reset */\n> > +\t\tif (!(cfg_tmp == 0x3 && i == 1)) {\n> > +\t\t\tudelay(1);\n> > +\t\t\treg = in_le32(&serdes2_base->srdstcalcr);\n> > +\t\t\treg |= 0x08000000;\n> > +\t\t\tout_le32(&serdes2_base->srdstcalcr, reg);\n> > +\t\t\treg = in_le32(&serdes2_base->srdsrcalcr);\n> > +\t\t\treg |= 0x08000000;\n> > +\t\t\tout_le32(&serdes2_base->srdsrcalcr, reg);\n> > +\t\t}\n> > +\t\tudelay(1);\n> > +\t}\n> > +#endif\n> \n> You have many duplicated code. Use functions or macros.\n> \n\nWill take care in v3\n\n> > +\n> > +\t/* Wait for at atleast 625us, ensure the PLLs being reset are locked */\n> > +\tudelay(800);\n> \n> You said 625us, but using 800.\n> \n\nIt says atleast 625us, and delay is added for 800us. Again the SERDES requirement\nstates this. \n\n> > +\n> > +#ifdef CONFIG_SYS_FSL_SRDS_1\n> > +\tcfg_tmp = cfg_rcwsrds1 & 0x3;\n> > +\tfor (i = 0; i < 2 && !(cfg_tmp & (0x1 << (1 - i))); i++) {\n> > +\t\t/* if the PLL is not locked, set RST_ERR */\n> > +\t\treg = in_le32(&serdes1_base->bank[i].pllcr0);\n> > +\t\tif (!((reg >> 23) & 0x1)) {\n> > +\t\t\treg = in_le32(&serdes1_base->bank[i].rstctl);\n> > +\t\t\treg |= 0x20000000;\n> > +\t\t\tout_le32(&serdes1_base->bank[i].rstctl, reg);\n> > +\t\t} else {\n> > +\t\t\tudelay(1);\n> > +\t\t\treg = in_le32(&serdes1_base->bank[i].rstctl);\n> > +\t\t\treg &= 0xFFFFFFEF;\n> > +\t\t\treg |= 0x00000040;\n> > +\t\t\tout_le32(&serdes1_base->bank[i].rstctl, reg);\n> > +\t\t\tudelay(1);\n> > +\t\t}\n> > +\t}\n> > +#endif\n> > +\n> > +#ifdef CONFIG_SYS_FSL_SRDS_2\n> > +\tcfg_tmp = cfg_rcwsrds1 & 0xC;\n> > +\tcfg_tmp >>= 2;\n> > +\n> > +\tfor (i = 0; i < 2 && !(cfg_tmp & (0x1 << (1 - i))); i++) {\n> > +\t\treg = in_le32(&serdes2_base->bank[i].pllcr0);\n> > +\t\tif (!((reg >> 23) & 0x1)) {\n> > +\t\t\treg = in_le32(&serdes2_base->bank[i].rstctl);\n> > +\t\t\treg |= 0x20000000;\n> > +\t\t\tout_le32(&serdes2_base->bank[i].rstctl, reg);\n> > +\t\t} else {\n> > +\t\t\tudelay(1);\n> > +\t\t\treg = in_le32(&serdes2_base->bank[i].rstctl);\n> > +\t\t\treg &= 0xFFFFFFEF;\n> > +\t\t\treg |= 0x00000040;\n> > +\t\t\tout_le32(&serdes2_base->bank[i].rstctl, reg);\n> > +\t\t\tudelay(1);\n> > +\t\t}\n> > +\t}\n> > +#endif\n> > +\t/* Take the all enabled lanes out of reset */ #ifdef\n> > +CONFIG_SYS_FSL_SRDS_1\n> > +\tcfg_tmp = cfg_rcwsrds1 & FSL_CHASSIS3_SRDS1_PRTCL_MASK;\n> > +\tcfg_tmp >>= FSL_CHASSIS3_SRDS1_PRTCL_SHIFT;\n> > +\n> > +\tfor (i = 0; i < 4 && cfg_tmp & (0xf << (3 - i)); i++) {\n> > +\t\treg = in_le32(&serdes1_base->lane[i].gcr0);\n> > +\t\treg |= 0x00600000;\n> > +\t\tout_le32(&serdes1_base->lane[i].gcr0, reg);\n> > +\t}\n> > +#endif\n> > +#ifdef CONFIG_SYS_FSL_SRDS_2\n> > +\tcfg_tmp = cfg_rcwsrds2 & FSL_CHASSIS3_SRDS2_PRTCL_MASK;\n> > +\tcfg_tmp >>= FSL_CHASSIS3_SRDS2_PRTCL_SHIFT;\n> > +\n> > +\tfor (i = 0; i < 4 && cfg_tmp & (0xf << (3 - i)); i++) {\n> > +\t\treg = in_le32(&serdes2_base->lane[i].gcr0);\n> > +\t\treg |= 0x00600000;\n> > +\t\tout_le32(&serdes2_base->lane[i].gcr0, reg);\n> > +\t}\n> > +#endif\n> > +\n> > +\t/* For each PLL being reset, and achieved PLL lock set RST_DONE */\n> > +#ifdef CONFIG_SYS_FSL_SRDS_1\n> > +\tcfg_tmp = cfg_rcwsrds1 & 0x3;\n> > +\tfor (i = 0; i < 2; i++) {\n> > +\t\treg = in_le32(&serdes1_base->bank[i].pllcr0);\n> > +\t\tif (!(cfg_tmp & (0x1 << (1 - i))) && ((reg >> 23) & 0x1)) {\n> > +\t\t\treg = in_le32(&serdes1_base->bank[i].rstctl);\n> > +\t\t\treg |= 0x40000000;\n> > +\t\t\tout_le32(&serdes1_base->bank[i].rstctl, reg);\n> > +\t\t}\n> > +\t}\n> > +#endif\n> > +#ifdef CONFIG_SYS_FSL_SRDS_2\n> > +\tcfg_tmp = cfg_rcwsrds1 & 0xC;\n> > +\tcfg_tmp >>= 2;\n> > +\n> > +\tfor (i = 0; i < 2; i++) {\n> > +\t\treg = in_le32(&serdes2_base->bank[i].pllcr0);\n> > +\t\tif (!(cfg_tmp & (0x1 << (1 - i))) && ((reg >> 23) & 0x1)) {\n> > +\t\t\treg = in_le32(&serdes2_base->bank[i].rstctl);\n> > +\t\t\treg |= 0x40000000;\n> > +\t\t\tout_le32(&serdes2_base->bank[i].rstctl, reg);\n> > +\t\t}\n> > +\t}\n> > +#endif\n> > +\n> > +\treturn ret;\n> > +}\n> > +\n> >   void fsl_serdes_init(void)\n> >   {\n> >   #if defined(CONFIG_FSL_MC_ENET) && !defined(CONFIG_SPL_BUILD) diff\n> > --git a/arch/arm/cpu/armv8/fsl-layerscape/soc.c\n> > b/arch/arm/cpu/armv8/fsl-layerscape/soc.c\n> > index 83e2871..4e96c7b 100644\n> > --- a/arch/arm/cpu/armv8/fsl-layerscape/soc.c\n> > +++ b/arch/arm/cpu/armv8/fsl-layerscape/soc.c\n> > @@ -404,23 +404,6 @@ static int setup_core_volt(u32 vdd)\n> >   \treturn board_setup_core_volt(vdd);\n> >   }\n> >\n> > -#ifdef CONFIG_SYS_FSL_DDR\n> > -static void ddr_enable_0v9_volt(bool en) -{\n> > -\tstruct ccsr_ddr __iomem *ddr = (void *)CONFIG_SYS_FSL_DDR_ADDR;\n> > -\tu32 tmp;\n> > -\n> > -\ttmp = ddr_in32(&ddr->ddr_cdr1);\n> > -\n> > -\tif (en)\n> > -\t\ttmp |= DDR_CDR1_V0PT9_EN;\n> > -\telse\n> > -\t\ttmp &= ~DDR_CDR1_V0PT9_EN;\n> > -\n> > -\tddr_out32(&ddr->ddr_cdr1, tmp);\n> > -}\n> > -#endif\n> > -\n> >   int setup_chip_volt(void)\n> >   {\n> >   \tint vdd;\n> > @@ -485,6 +468,23 @@ void fsl_lsch2_early_init_f(void)\n> >   }\n> >   #endif\n> >\n> > +#ifdef CONFIG_SYS_FSL_DDR\n> > +void ddr_enable_0v9_volt(bool en)\n> > +{\n> > +\tstruct ccsr_ddr __iomem *ddr = (void *)CONFIG_SYS_FSL_DDR_ADDR;\n> > +\tu32 tmp;\n> > +\n> > +\ttmp = ddr_in32(&ddr->ddr_cdr1);\n> > +\n> > +\tif (en)\n> > +\t\ttmp |= DDR_CDR1_V0PT9_EN;\n> > +\telse\n> > +\t\ttmp &= ~DDR_CDR1_V0PT9_EN;\n> > +\n> > +\tddr_out32(&ddr->ddr_cdr1, tmp);\n> > +}\n> > +#endif\n> > +\n> \n> \n> I lost track. When do you use 0.9v for DDR?\n> \n\nWhen core voltage is set to 0.9v, it requires setting up the DDR controller \nwith 0.9 v setting. Prior to this patch, this code was used only in chasis2. \nMaking it non-static to use in chasis3 architecture also. \n\t\n> York","headers":{"Return-Path":"<u-boot-bounces@lists.denx.de>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=lists.denx.de\n\t(client-ip=81.169.180.215; helo=lists.denx.de;\n\tenvelope-from=u-boot-bounces@lists.denx.de;\n\treceiver=<UNKNOWN>)","ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=nxp.com header.i=@nxp.com header.b=\"Qcf+U9Hs\";\n\tdkim-atps=neutral","spf=none (sender IP is )\n\tsmtp.mailfrom=rajesh.bhagat@nxp.com; "],"Received":["from lists.denx.de (dione.denx.de [81.169.180.215])\n\tby ozlabs.org (Postfix) with ESMTP id 3xwcK44sMKz9s7G\n\tfor <incoming@patchwork.ozlabs.org>;\n\tMon, 18 Sep 2017 16:57:59 +1000 (AEST)","by lists.denx.de (Postfix, from userid 105)\n\tid 27E04C21D70; Mon, 18 Sep 2017 06:57:53 +0000 (UTC)","from lists.denx.de (localhost [IPv6:::1])\n\tby lists.denx.de (Postfix) with ESMTP id A631AC21D57;\n\tMon, 18 Sep 2017 06:57:48 +0000 (UTC)","by lists.denx.de (Postfix, from userid 105)\n\tid 18A42C21D57; Mon, 18 Sep 2017 06:57:47 +0000 (UTC)","from EUR01-HE1-obe.outbound.protection.outlook.com\n\t(mail-he1eur01on0040.outbound.protection.outlook.com [104.47.0.40])\n\tby lists.denx.de (Postfix) with ESMTPS id 90A05C21D19\n\tfor <u-boot@lists.denx.de>; Mon, 18 Sep 2017 06:57:46 +0000 (UTC)","from HE1PR0401MB2331.eurprd04.prod.outlook.com (10.168.32.150) by\n\tHE1PR0401MB2649.eurprd04.prod.outlook.com (10.168.148.142) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.56.11;\n\tMon, 18 Sep 2017 06:57:44 +0000","from HE1PR0401MB2331.eurprd04.prod.outlook.com\n\t([fe80::90de:cc59:7cc7:d792]) by\n\tHE1PR0401MB2331.eurprd04.prod.outlook.com\n\t([fe80::90de:cc59:7cc7:d792%17]) with mapi id 15.20.0056.016;\n\tMon, 18 Sep 2017 06:57:43 +0000"],"X-Spam-Checker-Version":"SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de","X-Spam-Level":"","X-Spam-Status":"No, score=-0.0 required=5.0 tests=RCVD_IN_DNSWL_NONE,\n\tRCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,SPF_HELO_PASS,T_DKIM_INVALID\n\tautolearn=unavailable autolearn_force=no version=3.4.0","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version;\n\tbh=da4JMHHe8Uh2jOOFxMZ0lfPaIDvosGzZu9oJxwDo1hw=;\n\tb=Qcf+U9Hs+RpQVQHWOiGjCdQpzx9DMG1IUBlMT2PK2Z2Y+rgotYfTLksrVEJ8AYro6HUFIpAf4krM5yaEKU/OA7uUk5cSmD3eMnVLuSWzppp+MYltqiQNzxfaSLa2QWbEkgTsg198Czbf1LjqpoRHOhYIjBJW18RqJytoEnJF+L4=","From":"Rajesh Bhagat <rajesh.bhagat@nxp.com>","To":"York Sun <york.sun@nxp.com>,\n\t\"u-boot@lists.denx.de\" <u-boot@lists.denx.de>","Thread-Topic":"[RESEND PATCH v3 1/7] armv8: lsch3: Add serdes and DDR voltage\n\tsetup","Thread-Index":"AQHTLZzKqqjoU6r7y0qOiqf7Qvz+/6K6GubQ","Date":"Mon, 18 Sep 2017 06:57:43 +0000","Message-ID":"<HE1PR0401MB2331BCB6982B57DE451FE9B3E3630@HE1PR0401MB2331.eurprd04.prod.outlook.com>","References":"<1504506242-31430-1-git-send-email-rajesh.bhagat@nxp.com>\n\t<1504506242-31430-2-git-send-email-rajesh.bhagat@nxp.com>\n\t<VI1PR04MB2078B8342CC2D93D22791F3A9A6F0@VI1PR04MB2078.eurprd04.prod.outlook.com>","In-Reply-To":"<VI1PR04MB2078B8342CC2D93D22791F3A9A6F0@VI1PR04MB2078.eurprd04.prod.outlook.com>","Accept-Language":"en-US","Content-Language":"en-US","X-MS-Has-Attach":"","X-MS-TNEF-Correlator":"","authentication-results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=lists.denx.de\n\t(client-ip=81.169.180.215; helo=lists.denx.de;\n\tenvelope-from=u-boot-bounces@lists.denx.de;\n\treceiver=<UNKNOWN>)","ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=nxp.com header.i=@nxp.com header.b=\"Qcf+U9Hs\";\n\tdkim-atps=neutral","spf=none (sender IP is )\n\tsmtp.mailfrom=rajesh.bhagat@nxp.com; "],"x-originating-ip":"[192.88.169.1]","x-ms-publictraffictype":"Email","x-microsoft-exchange-diagnostics":"1; HE1PR0401MB2649;\n\t6:rmnOuFMjmjpHgQK+PVunGnGdCiC376kageQqI1rywaq8rdNgj8Z4BrNwl+VkHT/B/2nZmgV+wK2r8qIxOi+lAQw1C6a+aLSsbbVDLEySCBmt+wGkBWllGxmJVXoQAXDLNsVYpN7wmBG7QKRLnGSwgMth4PkyKoHdyS6MQizuiG5Lh4Wkb2ZqvX0UGzKZhy7uuVrSpUVBu+NozBOqucsF/+mez04b2qJINcKJVVHEcOxbMXwJsLPWsR5KMPRJllxatappGhzXYUBgRAdlVbrMXGHzds2D7dbBuY8NmWWfLr21Yq8th9QXHol75awqtKQCa35nML0366CeUe97k0y9HQ==;\n\t5:LhZx9/kZmsLKZQO5oT4CEAVzhQb3idapnPo2QbLb8DXhWvSudEaJWjuJdZXzQN5wgw/0p1dcsz5JYr2kjm03t9i6TKb/JurQaw7X5XdP4kyEU6tit49nc9l+iEdbbllDnG5xMdTYBES2DfjmExQSrw==;\n\t24:Vy834q09h3BzUmzfRA6cCW8H2rkooxnKAjqGyi66poUPTTBuestzXWbSj1DAwbJSe1kr31o2krMgauDEZzAhdcrqRq2hVKBjn8tIgKEoguU=;\n\t7:+TlLtCYiJtvSfUn+7GbpImZYP5DHAsPx8hf9nxdVUHJC9DPhmmMk6/THhvFoEwuKS4/mTnzHCVMoJjCBbdWkxNJsjdBNDv9Po7k+k1nX3eLP3J2lUQarX9t9D5NiUtQuNa19C4ogy5kDTGilH76LZk9NqcOtMRiKPrrIUYp5y3J5DMLhtmEEtWFr1mrVhexE/qtpEXsPytDnhKmOyXl0slccEkCjUijVCiWRDj3zBLs=","x-ms-exchange-antispam-srfa-diagnostics":"SSOS;SSOR;","x-forefront-antispam-report":"SFV:SKI; SCL:-1; SFV:NSPM;\n\tSFS:(10009020)(6009001)(346002)(376002)(39860400002)(13464003)(24454002)(199003)(189002)(377454003)(43544003)(9686003)(97736004)(102836003)(81166006)(81156014)(3846002)(316002)(6506006)(6116002)(6246003)(33656002)(74316002)(2906002)(54906002)(8676002)(55016002)(99286003)(229853002)(14454004)(101416001)(2950100002)(105586002)(106356001)(68736007)(50986999)(54356999)(76176999)(478600001)(7696004)(8936002)(25786009)(86362001)(575784001)(5660300001)(2900100001)(53936002)(66066001)(7736002)(3280700002)(305945005)(53546010)(3660700001)(2501003)(4326008)(6436002)(189998001)(5250100002)(217873001);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:HE1PR0401MB2649;\n\tH:HE1PR0401MB2331.eurprd04.prod.outlook.com; FPR:; SPF:None;\n\tPTR:InfoNoRecords; A:1; MX:1; LANG:en; ","x-ms-office365-filtering-correlation-id":"12abcc4a-f8ae-4ed9-2fb6-08d4fe628f83","x-ms-office365-filtering-ht":"Tenant","x-microsoft-antispam":"UriScan:; BCL:0; PCL:0;\n\tRULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(48565401081)(300000503095)(300135400095)(2017052603199)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);\n\tSRVR:HE1PR0401MB2649; ","x-ms-traffictypediagnostic":"HE1PR0401MB2649:","x-exchange-antispam-report-test":"UriScan:(185117386973197)(16074681357397);","x-microsoft-antispam-prvs":"<HE1PR0401MB2649C8BC25449CF44F7AB797E3630@HE1PR0401MB2649.eurprd04.prod.outlook.com>","x-exchange-antispam-report-cfa-test":"BCL:0; PCL:0;\n\tRULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(3002001)(10201501046)(93006095)(93001095)(100000703101)(100105400095)(6055026)(6041248)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(20161123562025)(20161123564025)(20161123555025)(20161123558100)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);\n\tSRVR:HE1PR0401MB2649; BCL:0; PCL:0;\n\tRULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);\n\tSRVR:HE1PR0401MB2649; ","x-forefront-prvs":"04347F8039","received-spf":"None (protection.outlook.com: nxp.com does not designate\n\tpermitted sender hosts)","spamdiagnosticoutput":"1:99","spamdiagnosticmetadata":"NSPM","MIME-Version":"1.0","X-OriginatorOrg":"nxp.com","X-MS-Exchange-CrossTenant-originalarrivaltime":"18 Sep 2017 06:57:43.2196\n\t(UTC)","X-MS-Exchange-CrossTenant-fromentityheader":"Hosted","X-MS-Exchange-CrossTenant-id":"686ea1d3-bc2b-4c6f-a92c-d99c5c301635","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"HE1PR0401MB2649","Subject":"Re: [U-Boot] [RESEND PATCH v3 1/7] armv8: lsch3: Add serdes and DDR\n\tvoltage setup","X-BeenThere":"u-boot@lists.denx.de","X-Mailman-Version":"2.1.18","Precedence":"list","List-Id":"U-Boot discussion <u-boot.lists.denx.de>","List-Unsubscribe":"<https://lists.denx.de/options/u-boot>,\n\t<mailto:u-boot-request@lists.denx.de?subject=unsubscribe>","List-Archive":"<http://lists.denx.de/pipermail/u-boot/>","List-Post":"<mailto:u-boot@lists.denx.de>","List-Help":"<mailto:u-boot-request@lists.denx.de?subject=help>","List-Subscribe":"<https://lists.denx.de/listinfo/u-boot>,\n\t<mailto:u-boot-request@lists.denx.de?subject=subscribe>","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"u-boot-bounces@lists.denx.de","Sender":"\"U-Boot\" <u-boot-bounces@lists.denx.de>"}}]