public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Marek Vasut <marek.vasut@mailbox.org>
To: Ralph Siemsen <ralph.siemsen@linaro.org>, u-boot@lists.denx.de
Cc: Andrew Davis <afd@ti.com>,
	Aswath Govindraju <a-govindraju@ti.com>,
	Bryan Brattlof <bb@ti.com>, Gowtham Tammana <g-tammana@ti.com>,
	Jagan Teki <jagan@edgeble.ai>,
	Kever Yang <kever.yang@rock-chips.com>,
	Nishanth Menon <nm@ti.com>, Suman Anna <s-anna@ti.com>,
	Vignesh Raghavendra <vigneshr@ti.com>
Subject: Re: [PATCH v4 05/10] ram: cadence: add driver for Cadence EDAC
Date: Mon, 17 Apr 2023 19:32:30 +0200	[thread overview]
Message-ID: <fa436ab2-afc7-ba09-e842-890ef0aff092@mailbox.org> (raw)
In-Reply-To: <20230308202653.1926303-6-ralph.siemsen@linaro.org>

On 3/8/23 21:26, Ralph Siemsen wrote:

[...]

> +#define FUNCCTRL	0x00
> +#define  FUNCCTRL_MASKSDLOFS	(0x18 << 16)
> +#define  FUNCCTRL_DVDDQ_1_5V	(1 << 8)
> +#define  FUNCCTRL_RESET_N	(1 << 0)
> +#define DLLCTRL		0x04
> +#define  DLLCTRL_ASDLLOCK	(1 << 26)
> +#define  DLLCTRL_MFSL_500MHz	(2 << 1)
> +#define  DLLCTRL_MDLLSTBY	(1 << 0)

Use BIT() macro where applicable.

> +#define ZQCALCTRL	0x08
> +#define  ZQCALCTRL_ZQCALEND	(1 << 30)
> +#define  ZQCALCTRL_ZQCALRSTB	(1 << 0)
> +#define ZQODTCTRL	0x0c
> +#define RDCTRL		0x10
> +#define RDTMG		0x14
> +#define FIFOINIT	0x18
> +#define  FIFOINIT_RDPTINITEXE	(1 << 8)
> +#define  FIFOINIT_WRPTINITEXE	(1 << 0)
> +#define OUTCTRL		0x1c
> +#define  OUTCTRL_ADCMDOE	(1 << 0)
> +#define WLCTRL1		0x40
> +#define  WLCTRL1_WLSTR		(1 << 24)
> +#define DQCALOFS1	0xe8
> +
> +/* DDR PHY setup */
> +void ddr_phy_init(struct cadence_ddr_info *priv, int ddr_type)
> +{
> +	u32 val;
> +
> +	/* Disable DDR Controller clock and FlexWAY connection */
> +	clk_disable(&priv->hclk_ddrc);
> +	clk_disable(&priv->clk_ddrc);
> +
> +	clk_rzn1_reset_state(&priv->hclk_ddrc, 0);
> +	clk_rzn1_reset_state(&priv->clk_ddrc, 0);
> +
> +	/* Enable DDR Controller clock and FlexWAY connection */
> +	clk_enable(&priv->clk_ddrc);
> +	clk_enable(&priv->hclk_ddrc);
> +
> +	/* DDR PHY Soft reset assert */
> +	ddrc_writel(FUNCCTRL_MASKSDLOFS | FUNCCTRL_DVDDQ_1_5V, FUNCCTRL);
> +
> +	clk_rzn1_reset_state(&priv->hclk_ddrc, 1);
> +	clk_rzn1_reset_state(&priv->clk_ddrc, 1);
> +
> +	/* DDR PHY setup */
> +	phy_writel(DLLCTRL_MFSL_500MHz | DLLCTRL_MDLLSTBY, DLLCTRL);
> +	phy_writel(0x00000182, ZQCALCTRL);
> +	if (ddr_type == RZN1_DDR3_DUAL_BANK)
> +		phy_writel(0xAB330031, ZQODTCTRL);
> +	else if (ddr_type == RZN1_DDR3_SINGLE_BANK)
> +		phy_writel(0xAB320051, ZQODTCTRL);
> +	else /* DDR2 */
> +		phy_writel(0xAB330071, ZQODTCTRL);
> +	phy_writel(0xB545B544, RDCTRL);
> +	phy_writel(0x000000B0, RDTMG);
> +	phy_writel(0x020A0806, OUTCTRL);
> +	if (ddr_type == RZN1_DDR3_DUAL_BANK)
> +		phy_writel(0x80005556, WLCTRL1);
> +	else
> +		phy_writel(0x80005C5D, WLCTRL1);
> +	phy_writel(0x00000101, FIFOINIT);
> +	phy_writel(0x00004545, DQCALOFS1);

Is there any macro which defines those magic bits in magic numbers ?
If so, please use them.

> +	/* Step 9 MDLL reset release */
> +	val = phy_readl(DLLCTRL);
> +	val &= ~DLLCTRL_MDLLSTBY;
> +	phy_writel(val, DLLCTRL);
> +
> +	/* Step 12 Soft reset release */
> +	val = phy_readl(FUNCCTRL);
> +	val |= FUNCCTRL_RESET_N;
> +	phy_writel(val, FUNCCTRL);
> +
> +	/* Step 13 FIFO pointer initialize */
> +	phy_writel(FIFOINIT_RDPTINITEXE | FIFOINIT_WRPTINITEXE, FIFOINIT);
> +
> +	/* Step 14 Execute ZQ Calibration */
> +	val = phy_readl(ZQCALCTRL);
> +	val |= ZQCALCTRL_ZQCALRSTB;
> +	phy_writel(val, ZQCALCTRL);
> +
> +	/* Step 15 Wait for 200us or more, or wait for DFIINITCOMPLETE to be "1" */
> +	while (!(phy_readl(DLLCTRL) & DLLCTRL_ASDLLOCK))
> +		;
> +	while (!(phy_readl(ZQCALCTRL) & ZQCALCTRL_ZQCALEND))
> +		;
> +
> +	/* Step 16 Enable Address and Command output */
> +	val = phy_readl(OUTCTRL);
> +	val |= OUTCTRL_ADCMDOE;
> +	phy_writel(val, OUTCTRL);
> +
> +	/* Step 17 Wait for 200us or more(from MRESETB=0) */
> +	udelay(200);
> +}

[...]

> +int rzn1_dram_init(struct cadence_ddr_info *priv)
> +{
> +	u32 version;
> +	u32 ddr_start_addr = 0;
> +
> +	ddr_phy_init(priv, RZN1_DDR3_SINGLE_BANK);
> +
> +	/*
> +	 * Override DDR PHY Interface (DFI) related settings
> +	 * DFI is the internal interface between the DDR controller and the DDR PHY.
> +	 * These settings are specific to the board and can't be known by the settings
> +	 * provided for each DDR model within the generated include.
> +	 */
> +	ddr_350_374_async[351 - 350] = 0x001e0000;
> +	ddr_350_374_async[352 - 350] = 0x1e680000;
> +	ddr_350_374_async[353 - 350] = 0x02000020;
> +	ddr_350_374_async[354 - 350] = 0x02000200;
> +	ddr_350_374_async[355 - 350] = 0x00000c30;
> +	ddr_350_374_async[356 - 350] = 0x00009808;
> +	ddr_350_374_async[357 - 350] = 0x020a0706;
> +	ddr_350_374_async[372 - 350] = 0x01000000;
> +
> +	/*
> +	 * On ES1.0 devices, the DDR start address that the DDR Controller sees
> +	 * is the physical address of the DDR. However, later devices changed it
> +	 * to be 0 in order to fix an issue with DDR out-of-range detection.
> +	 */
> +#define RZN1_SYSCTRL_REG_VERSION 412
> +	regmap_read(priv->syscon, RZN1_SYSCTRL_REG_VERSION, &version);
> +	if (version == 0x10)
> +		ddr_start_addr = RZN1_V_DDR_BASE;
> +
> +	/* DDR Controller is always in ASYNC mode */
> +	cdns_ddr_ctrl_init((void *)RZN1_DDR_BASE, 1,
> +			   ddr_00_87_async, ddr_350_374_async,
> +			   ddr_start_addr, CFG_SYS_SDRAM_SIZE,
> +			   priv->enable_ecc, priv->enable_8bit);
> +
> +	rzn1_ddr3_single_bank((void *)RZN1_DDR_BASE);

Can you obtain the DRAM base from DT ?

> +	cdns_ddr_set_diff_cs_delays((void *)RZN1_DDR_BASE, 2, 7, 2, 2);
> +	cdns_ddr_set_same_cs_delays((void *)RZN1_DDR_BASE, 0, 7, 0, 0);
> +	cdns_ddr_set_odt_times((void *)RZN1_DDR_BASE, 5, 6, 6, 0, 4);
> +	cdns_ddr_ctrl_start((void *)RZN1_DDR_BASE);
> +
> +	ddr_phy_enable_wl(priv);
> +
> +	if (priv->enable_ecc) {
> +		/*
> +		 * Any read before a write will trigger an ECC un-correctable error,
> +		 * causing a data abort. However, this is also true for any read with a
> +		 * size less than the AXI bus width. So, the only sensible solution is
> +		 * to write to all of DDR now and take the hit...
> +		 */
> +		memset((void *)RZN1_V_DDR_BASE, 0xff, CFG_SYS_SDRAM_SIZE);
> +	}
> +
> +	return 0;
> +}
> +
> +static int cadence_ddr_get_info(struct udevice *udev, struct ram_info *info)
> +{
> +	info->base = 0;
> +	info->size = gd->ram_size;
> +
> +	return 0;
> +}
> +
> +static struct ram_ops cadence_ddr_ops = {
> +	.get_info = cadence_ddr_get_info,
> +};
> +
> +static int cadence_ddr_probe(struct udevice *dev)
> +{
> +	struct cadence_ddr_info *priv = dev_get_priv(dev);
> +	int ret;
> +
> +	priv->ddrc = dev_remap_addr_name(dev, "ddrc");
> +	if (!priv->ddrc) {
> +		dev_err(dev, "No reg property for Cadence DDR CTRL\n");
> +		return -EINVAL;
> +	}
> +
> +	priv->phy = dev_remap_addr_name(dev, "phy");
> +	if (!priv->phy) {
> +		dev_err(dev, "No reg property for Cadence DDR PHY\n");
> +		return -EINVAL;
> +	}
> +
> +	ret = clk_get_by_name(dev, "clk_ddrc", &priv->clk_ddrc);
> +	if (ret) {
> +		dev_err(dev, "No clock for Cadence DDR\n");
> +		return ret;
> +	}
> +
> +	ret = clk_get_by_name(dev, "hclk_ddrc", &priv->hclk_ddrc);
> +	if (ret) {
> +		dev_err(dev, "No HCLK for Cadence DDR\n");
> +		return ret;
> +	}
> +
> +	priv->syscon = syscon_regmap_lookup_by_phandle(dev, "syscon");
> +	if (IS_ERR(priv->syscon)) {
> +		dev_err(dev, "No syscon node found\n");
> +		//return PTR_ERR(priv->syscon);

This shouldn't be commented out, right ?

> +	}
> +
> +	priv->enable_ecc = dev_read_bool(dev, "enable-ecc");
> +	priv->enable_8bit = dev_read_bool(dev, "enable-8bit");
> +
> +	rzn1_dram_init(priv);
> +
> +	return 0;
> +}
> +
> +static const struct udevice_id cadence_ddr_ids[] = {
> +	{ .compatible = "cadence,ddr-ctrl" },
> +	{ }
> +};
> +
> +U_BOOT_DRIVER(cadence_ddr) = {
> +	.name		= "cadence_ddr",
> +	.id		= UCLASS_RAM,
> +	.of_match	= cadence_ddr_ids,
> +	.ops		= &cadence_ddr_ops,
> +	.probe		= cadence_ddr_probe,
> +	.priv_auto	= sizeof(struct cadence_ddr_info),
> +	.flags		= DM_FLAG_PRE_RELOC,
> +};

[...]

  reply	other threads:[~2023-04-17 17:35 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-08 20:26 [PATCH v4 00/10] Renesas RZ/N1 SoC initial support Ralph Siemsen
2023-03-08 20:26 ` [PATCH v4 01/10] ARM: armv7: add non-SPL enable for Cortex SMPEN Ralph Siemsen
2023-04-17 17:04   ` Marek Vasut
2023-04-17 18:26     ` Ralph Siemsen
2023-04-17 20:21       ` Marek Vasut
2023-04-18 14:32         ` Ralph Siemsen
2023-04-18 19:35           ` Marek Vasut
2023-03-08 20:26 ` [PATCH v4 02/10] clk: renesas: prepare for non-RCAR clock drivers Ralph Siemsen
2023-04-17 17:02   ` Marek Vasut
2023-04-17 18:22     ` Ralph Siemsen
2023-04-17 20:33       ` Marek Vasut
2023-04-17 20:48         ` Ralph Siemsen
2023-04-17 22:24           ` Marek Vasut
2023-03-08 20:26 ` [PATCH v4 03/10] clk: renesas: add R906G032 driver Ralph Siemsen
2023-04-17 17:07   ` Marek Vasut
2023-04-17 18:29     ` Ralph Siemsen
2023-03-08 20:26 ` [PATCH v4 04/10] pinctrl: " Ralph Siemsen
2023-04-17 17:09   ` Marek Vasut
2023-03-08 20:26 ` [PATCH v4 05/10] ram: cadence: add driver for Cadence EDAC Ralph Siemsen
2023-04-17 17:32   ` Marek Vasut [this message]
2023-04-17 20:33     ` Ralph Siemsen
2023-03-08 20:26 ` [PATCH v4 06/10] dts: basic devicetree for Renesas RZ/N1 SoC Ralph Siemsen
2023-04-17 17:12   ` Marek Vasut
2023-04-17 18:33     ` Ralph Siemsen
2023-04-17 20:22       ` Marek Vasut
2023-03-08 20:26 ` [PATCH v4 07/10] ARM: rzn1: basic support " Ralph Siemsen
2023-04-17 17:15   ` Marek Vasut
2023-04-17 18:57     ` Ralph Siemsen
2023-04-17 20:30       ` Marek Vasut
2023-04-17 20:44         ` Ralph Siemsen
2023-04-17 22:23           ` Marek Vasut
2023-03-08 20:26 ` [PATCH v4 08/10] board: schneider: add RZN1 board support Ralph Siemsen
2023-04-17 17:18   ` Marek Vasut
2023-04-17 19:45     ` Ralph Siemsen
2023-04-17 20:27       ` Marek Vasut
2023-03-08 20:26 ` [PATCH v4 09/10] tools: spkgimage: add Renesas SPKG format Ralph Siemsen
2023-04-17 17:23   ` Marek Vasut
2023-04-17 20:17     ` Ralph Siemsen
2023-04-17 20:28       ` Marek Vasut
2023-03-08 20:26 ` [PATCH v4 10/10] doc: renesas: add Renesas board docs Ralph Siemsen
2023-04-17 17:28   ` Marek Vasut
2023-04-17 20:29     ` Ralph Siemsen
2023-04-17 20:34       ` Marek Vasut
2023-04-17 20:50         ` Ralph Siemsen

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=fa436ab2-afc7-ba09-e842-890ef0aff092@mailbox.org \
    --to=marek.vasut@mailbox.org \
    --cc=a-govindraju@ti.com \
    --cc=afd@ti.com \
    --cc=bb@ti.com \
    --cc=g-tammana@ti.com \
    --cc=jagan@edgeble.ai \
    --cc=kever.yang@rock-chips.com \
    --cc=nm@ti.com \
    --cc=ralph.siemsen@linaro.org \
    --cc=s-anna@ti.com \
    --cc=u-boot@lists.denx.de \
    --cc=vigneshr@ti.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox