[U-Boot] [PATCH 14/15] drivers: ddr: introduce DDR driver for i.MX8M
Troy Kisky
troy.kisky at boundarydevices.com
Fri Nov 9 18:52:57 UTC 2018
On 11/9/2018 1:17 AM, Peng Fan wrote:
> Introduce DDR driver for i.MX8M. The driver will be used by SPL to
> initialze DDR PHY and DDR Controller.
>
> Signed-off-by: Peng Fan <peng.fan at nxp.com>
> ---
> arch/arm/include/asm/arch-imx8m/ddr.h | 575 ++++++++++++++++++++++++++++++++++
> drivers/Makefile | 1 +
> drivers/ddr/Kconfig | 1 +
> drivers/ddr/imx/Kconfig | 1 +
> drivers/ddr/imx/imx8m/Kconfig | 22 ++
> drivers/ddr/imx/imx8m/Makefile | 11 +
> drivers/ddr/imx/imx8m/ddr4_init.c | 113 +++++++
> drivers/ddr/imx/imx8m/ddrphy_train.c | 87 +++++
> drivers/ddr/imx/imx8m/ddrphy_utils.c | 186 +++++++++++
> drivers/ddr/imx/imx8m/helper.c | 171 ++++++++++
> drivers/ddr/imx/imx8m/lpddr4_init.c | 188 +++++++++++
> 11 files changed, 1356 insertions(+)
> create mode 100644 drivers/ddr/imx/Kconfig
> create mode 100644 drivers/ddr/imx/imx8m/Kconfig
> create mode 100644 drivers/ddr/imx/imx8m/Makefile
> create mode 100644 drivers/ddr/imx/imx8m/ddr4_init.c
> create mode 100644 drivers/ddr/imx/imx8m/ddrphy_train.c
> create mode 100644 drivers/ddr/imx/imx8m/ddrphy_utils.c
> create mode 100644 drivers/ddr/imx/imx8m/helper.c
> create mode 100644 drivers/ddr/imx/imx8m/lpddr4_init.c
>
> diff --git a/arch/arm/include/asm/arch-imx8m/ddr.h b/arch/arm/include/asm/arch-imx8m/ddr.h
> index 1a5cbabdaf..c7da3017ba 100644
> --- a/arch/arm/include/asm/arch-imx8m/ddr.h
> +++ b/arch/arm/include/asm/arch-imx8m/ddr.h
> @@ -6,6 +6,10 @@
> #ifndef __ASM_ARCH_IMX8M_DDR_H
> #define __ASM_ARCH_IMX8M_DDR_H
>
> +#include <asm/io.h>
> +#include <asm/types.h>
> +#include <asm/arch/ddr.h>
> +
> #define DDRC_DDR_SS_GPR0 0x3d000000
> #define DDRC_IPS_BASE_ADDR_0 0x3f400000
> #define IP2APB_DDRPHY_IPS_BASE_ADDR(X) (0x3c000000 + (X * 0x2000000))
> @@ -352,4 +356,575 @@ enum msg_response {
> TRAIN_FAIL = 0xff,
> };
>
> +#define DDRC_MSTR_0 0x3d400000
> +#define DDRC_STAT_0 0x3d400004
> +#define DDRC_MSTR1_0 0x3d400008
Looks like this should be a structure
> +/**********************/
> +#define DDRC_MSTR(X) (DDRC_IPS_BASE_ADDR(X) + 0x00)
> +#define DDRC_STAT(X) (DDRC_IPS_BASE_ADDR(X) + 0x04)
> +#define DDRC_MSTR1(X) (DDRC_IPS_BASE_ADDR(X) + 0x08)
Same structure
> +#define DDRC_ADVECCINDEX(X) (DDRC_IPS_BASE_ADDR(X) + 0x3)
> +#define DDRC_ADVECCSTAT(X) (DDRC_IPS_BASE_ADDR(X) + 0x3)
> +#define DDRC_ECCPOISONPAT0(X) (DDRC_IPS_BASE_ADDR(X) + 0x3)
> +#define DDRC_ECCPOISONPAT1(X) (DDRC_IPS_BASE_ADDR(X) + 0x3)
> +#define DDRC_ECCPOISONPAT2(X) (DDRC_IPS_BASE_ADDR(X) + 0x3)
> +#define DDRC_HIFCTL(X) (DDRC_IPS_BASE_ADDR(X) + 0x3)
Are they really the same address ???
> +#define DRC_PERF_MON_BASE_ADDR(X) (0x3d800000 + ((X) * 0x2000000))
> +#define DRC_PERF_MON_CNT0_CTL(X) (DRC_PERF_MON_BASE_ADDR(X) + 0x0)
> +#define DRC_PERF_MON_CNT1_CTL(X) (DRC_PERF_MON_BASE_ADDR(X) + 0x4)
> +#define DRC_PERF_MON_CNT2_CTL(X) (DRC_PERF_MON_BASE_ADDR(X) + 0x8)
> +#define DRC_PERF_MON_CNT3_CTL(X) (DRC_PERF_MON_BASE_ADDR(X) + 0xC)
Structure
> +void ddrphy_init_set_dfi_clk(unsigned int drate)
> +{
> + switch (drate) {
> + case 3200:
> + dram_pll_init(DRAM_PLL_OUT_800M);
> + dram_disable_bypass();
> + break;
Maybe drate can be changed to a Hz freq instead of MHZ
if (drate > 400M) {
dram_pll_init(drate/4);
dram_disable_bypass();
} else {
dram_enable_bypass(drate);
}
More information about the U-Boot
mailing list