Hello! Thanks for this DDR4 patch. I have a few comments below, mostly about adding dead/removed code.
On Friday 13 January 2023 16:38:55 Tony Dinh wrote: > This syncs drivers/ddr/marvell/a38x/ with the master branch of repository > https://github.com/MarvellEmbeddedProcessors/mv-ddr-marvell.git > > up to the commit "mv_ddr: a3700: Use the right size for memset to not > overflow" > d5acc10c287e40cc2feeb28710b92e45c93c702c > > This patch was created by following steps: > > 1. Replace all a38x files in U-Boot tree by files from upstream github > Marvell mv-ddr-marvell repository. > > 2. Run following command to omit portions not relevant for a38x, ddr3, > and ddr4: > > files=drivers/ddr/marvell/a38x/* > sed 's/#if defined(CONFIG_ARMADA_38X) || > defined(CONFIG_ARMADA_39X)/#ifdef TRUE/' -i $files > unifdef -m -UMV_DDR -UMV_DDR_ATF -UCONFIG_APN806 \ > -UCONFIG_MC_STATIC -UCONFIG_MC_STATIC_PRINT -UCONFIG_PHY_STATIC \ > -UCONFIG_PHY_STATIC_PRINT -UCONFIG_CUSTOMER_BOARD_SUPPORT \ > -UCONFIG_A3700 -UA3900 -UA80X0 -UA70X0 -DTRUE $files marvell/a38x/ subdir contains only a38x code. Moreover all a39x stubs were already removed from u-boot (it was never complete): https://source.denx.de/u-boot/u-boot/-/commit/15942805b7efe47e186d8b30ec378666561ad1f9 So do not re-introduce CONFIG_ARMADA_39X code. Instead run unifdef with additional args: -DCONFIG_ARMADA_38X -UCONFIG_ARMADA_39X And with that, additional 'sed' and -DTRUE is not needed at all. It was needed only as a hack for simulating logical OR: defined(A) || defined(B) Also I see there CONFIG_64BIT checks. I think that CONFIG_64BIT code is not relevant for 32-bit A38x, so I would suggest to eliminate it with unifdef -UCONFIG_64BIT. > 3. Manually change license to SPDX-License-Identifier > (upstream license in upstream github repository contains long license > texts and U-Boot is using just SPDX-License-Identifier. There are still some license comment style changes (// vs /* ... */). > After applying this patch, a38x ddr3 ddr4 code in upstream Marvell github > repository and in U-Boot would be fully identical. So in future applying > above steps could be used to sync code again. > > The only change in this patch are: > - Removal of common board_topology_map code using ifdefs in mv_ddr_brd.c > - Some fixes with include files. > - Some basic type defines (original from ATF headers) in mv_ddr_plat.c > > Reference: > "ddr: marvell: a38x: Sync code with Marvell mv-ddr-marvell repository" > > https://source.denx.de/u-boot/u-boot/-/commit/107c3391b95bcc2ba09a876da4fa0c31b6c1e460 > > Signed-off-by: Tony Dinh <mibo...@gmail.com> > --- > > drivers/ddr/marvell/a38x/Makefile | 8 + > drivers/ddr/marvell/a38x/ddr3_debug.c | 120 + > drivers/ddr/marvell/a38x/ddr3_init.c | 25 + > drivers/ddr/marvell/a38x/ddr3_init.h | 14 + > drivers/ddr/marvell/a38x/ddr3_logging_def.h | 29 +- > drivers/ddr/marvell/a38x/ddr3_training.c | 135 + > drivers/ddr/marvell/a38x/ddr3_training_bist.c | 12 + > .../a38x/ddr3_training_centralization.c | 6 + > drivers/ddr/marvell/a38x/ddr3_training_db.c | 278 ++ > drivers/ddr/marvell/a38x/ddr3_training_ip.h | 17 + > .../ddr/marvell/a38x/ddr3_training_ip_db.h | 156 +- > .../marvell/a38x/ddr3_training_ip_engine.c | 147 +- > .../ddr/marvell/a38x/ddr3_training_ip_flow.h | 7 +- > .../ddr/marvell/a38x/ddr3_training_leveling.c | 139 +- > drivers/ddr/marvell/a38x/ddr_init.c | 8 + > drivers/ddr/marvell/a38x/ddr_mv_wrapper.h | 47 + > drivers/ddr/marvell/a38x/dram_if.c | 31 + > drivers/ddr/marvell/a38x/mv_ddr4_mpr_pda_if.c | 674 +++++ > drivers/ddr/marvell/a38x/mv_ddr4_mpr_pda_if.h | 59 + > drivers/ddr/marvell/a38x/mv_ddr4_training.c | 571 ++++ > drivers/ddr/marvell/a38x/mv_ddr4_training.h | 32 + > .../a38x/mv_ddr4_training_calibration.c | 2340 +++++++++++++++++ > .../a38x/mv_ddr4_training_calibration.h | 26 + > .../ddr/marvell/a38x/mv_ddr4_training_db.c | 545 ++++ > .../marvell/a38x/mv_ddr4_training_leveling.c | 441 ++++ > .../marvell/a38x/mv_ddr4_training_leveling.h | 11 + > drivers/ddr/marvell/a38x/mv_ddr_brd.c | 82 + > drivers/ddr/marvell/a38x/mv_ddr_init.c | 60 + > drivers/ddr/marvell/a38x/mv_ddr_init.h | 11 + > drivers/ddr/marvell/a38x/mv_ddr_mrs.c | 248 ++ > drivers/ddr/marvell/a38x/mv_ddr_mrs.h | 83 + > drivers/ddr/marvell/a38x/mv_ddr_plat.c | 257 ++ > drivers/ddr/marvell/a38x/mv_ddr_plat.h | 11 + > drivers/ddr/marvell/a38x/mv_ddr_regs.h | 59 + > drivers/ddr/marvell/a38x/mv_ddr_static.c | 12 + > drivers/ddr/marvell/a38x/mv_ddr_static.h | 11 + > drivers/ddr/marvell/a38x/mv_ddr_sys_env_lib.h | 7 + > drivers/ddr/marvell/a38x/mv_ddr_topology.h | 72 + > 38 files changed, 6786 insertions(+), 5 deletions(-) > create mode 100644 drivers/ddr/marvell/a38x/ddr_init.c > create mode 100644 drivers/ddr/marvell/a38x/ddr_mv_wrapper.h > create mode 100644 drivers/ddr/marvell/a38x/dram_if.c > create mode 100644 drivers/ddr/marvell/a38x/mv_ddr4_mpr_pda_if.c > create mode 100644 drivers/ddr/marvell/a38x/mv_ddr4_mpr_pda_if.h > create mode 100644 drivers/ddr/marvell/a38x/mv_ddr4_training.c > create mode 100644 drivers/ddr/marvell/a38x/mv_ddr4_training.h > create mode 100644 drivers/ddr/marvell/a38x/mv_ddr4_training_calibration.c > create mode 100644 drivers/ddr/marvell/a38x/mv_ddr4_training_calibration.h > create mode 100644 drivers/ddr/marvell/a38x/mv_ddr4_training_db.c > create mode 100644 drivers/ddr/marvell/a38x/mv_ddr4_training_leveling.c > create mode 100644 drivers/ddr/marvell/a38x/mv_ddr4_training_leveling.h > create mode 100644 drivers/ddr/marvell/a38x/mv_ddr_brd.c > create mode 100644 drivers/ddr/marvell/a38x/mv_ddr_init.c > create mode 100644 drivers/ddr/marvell/a38x/mv_ddr_init.h > create mode 100644 drivers/ddr/marvell/a38x/mv_ddr_mrs.c > create mode 100644 drivers/ddr/marvell/a38x/mv_ddr_mrs.h > create mode 100644 drivers/ddr/marvell/a38x/mv_ddr_static.c > create mode 100644 drivers/ddr/marvell/a38x/mv_ddr_static.h > ... > diff --git a/drivers/ddr/marvell/a38x/ddr_init.c > b/drivers/ddr/marvell/a38x/ddr_init.c > new file mode 100644 > index 0000000000..871ff0c926 > --- /dev/null > +++ b/drivers/ddr/marvell/a38x/ddr_init.c > @@ -0,0 +1,8 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) Marvell International Ltd. and its affiliates > + */ > + > +#include "ddr3_init.h" > + > +/* U-BOOT MARVELL 2013.01 SUPPORT */ For sure this ddr_init.c file is not needed as it is empty. > diff --git a/drivers/ddr/marvell/a38x/ddr_mv_wrapper.h > b/drivers/ddr/marvell/a38x/ddr_mv_wrapper.h > new file mode 100644 > index 0000000000..13241c17f4 > --- /dev/null > +++ b/drivers/ddr/marvell/a38x/ddr_mv_wrapper.h > @@ -0,0 +1,47 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) Marvell International Ltd. and its affiliates > + */ > + > +#ifndef _DDR_MV_WRAPPER_H > +#define _DDR_MV_WRAPPER_H > + > +#define INTER_REGS_BASE 0xd0000000 > + > +#include "mv_os.h" > +#include "printf.h" > +#include "mvUart.h" > +#include "util.h" > + > +typedef unsigned long long uint64_t; > +typedef uint64_t uintptr_t; > + > +static inline void mmio_write_64(uintptr_t addr, uint64_t value) > +{ > +} > + > +static inline uint64_t mmio_read_64(uintptr_t addr) > +{ > + return (uint64_t)0; > +} > + > +/* u-boot/tools/marvell/bin_hdr/platform/utils/printf.c */ > +#define printf mvPrintf > + > +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) > +#define reg_write MV_REG_WRITE > +#define reg_read MV_REG_READ > +#define reg_bit_set MV_REG_BIT_SET > + > +/* uboot/tools/marvell/bin_hdr/platform/drivers/mv_time.c */ > +void mdelay(unsigned long); > + > +/* TODO: Check if LE/BE support is needed */ > +#define MV_MEMIO_LE32_WRITE2(data,addr) \ > + MV_MEMIO32_WRITE(addr, MV_32BIT_LE_FAST(data)) > +#define writel MV_MEMIO_LE32_WRITE2 > +#define readl MV_MEMIO_LE32_READ > +#define writeq mmio_write_64 > +#define readq mmio_read_64 > + > +#endif /* _DDR_MV_WRAPPER_H */ This file looks unusable as both mmio_write_64() and mmio_read_64() are unimplemented. Instead ddr_ml_wrapper.h should be used. > diff --git a/drivers/ddr/marvell/a38x/dram_if.c > b/drivers/ddr/marvell/a38x/dram_if.c > new file mode 100644 > index 0000000000..872a7820b6 > --- /dev/null > +++ b/drivers/ddr/marvell/a38x/dram_if.c > @@ -0,0 +1,31 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) Marvell International Ltd. and its affiliates > + */ > + > +#include "ddr_ml_wrapper.h" > + > +#include "mv_ddr_init.h" > +#include "mv_ddr_plat.h" > +#include "mv_ddr_topology.h" > + > +int dram_init(void) > +{ > + return mv_ddr_init(); > +} > + > +void dram_mmap_config(void) > +{ > + mv_ddr_mmap_config(); > +} > + > +unsigned long long dram_iface_mem_sz_get(void) > +{ > + /* > + * call mv_ddr_pre_config to update topology > + * prior to mv_ddr_mem_sz_get call > + */ > + mv_ddr_pre_config(); > + > + return mv_ddr_mem_sz_get(); > +} This file seems to not be needed too as none of these functions are called. ... > diff --git a/drivers/ddr/marvell/a38x/mv_ddr_brd.c > b/drivers/ddr/marvell/a38x/mv_ddr_brd.c > new file mode 100644 > index 0000000000..4cf3db5425 > --- /dev/null > +++ b/drivers/ddr/marvell/a38x/mv_ddr_brd.c > @@ -0,0 +1,82 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) Marvell International Ltd. and its affiliates > + */ > + > +#include "ddr3_init.h" > + > +/* > + * Define the DDR layout / topology here in the board file. This will > + * be used by the DDR3 init code in the SPL U-Boot version to configure > + * the DDR3 controller. > + */ > + > +#if defined(CONFIG_DDR4) > +#define SPEED_BIN_DDR_DB_68XX SPEED_BIN_DDR_2400R > +#define BUS_WIDTH_DB_68XX MV_DDR_DEV_WIDTH_16BIT > +#else /* CONFIG_DDR4 */ > +#define SPEED_BIN_DDR_DB_68XX SPEED_BIN_DDR_1866L > +#define BUS_WIDTH_DB_68XX MV_DDR_DEV_WIDTH_8BIT > +#endif /* CONFIG_DDR4 */ > + > +/* > + * board_topology_map and mv_ddr_topology_map_get() > + * should be defined in each board file. > + * > + */ > + > +#if 0 > +/* Marvell board - Board_ID = DB_68XX_ID = 1 (DDR3/4)*/ > +static struct mv_ddr_topology_map board_topology_map = { > + DEBUG_LEVEL_ERROR, > + 0x1, /* active interfaces */ > + /* cs_mask, mirror, dqs_swap, ck_swap X PUPs */ > + { { { {0x3, 0x2, 0, 0}, > + {0x3, 0x2, 0, 0}, > + {0x3, 0x2, 0, 0}, > + {0x3, 0x2, 0, 0}, > + {0x3, 0x2, 0, 0} }, > + SPEED_BIN_DDR_DB_68XX, /* speed_bin */ > + BUS_WIDTH_DB_68XX, /* sdram device width */ > + MV_DDR_DIE_CAP_4GBIT, /* die capacity */ > + MV_DDR_FREQ_SAR, /* frequency */ > + 0, 0, /* cas_l, cas_wl */ > + MV_DDR_TEMP_LOW} }, /* temperature */ > + BUS_MASK_32BIT, /* subphys mask */ > + MV_DDR_CFG_DEFAULT, /* ddr configuration data source */ > + { {0} }, /* raw spd data */ > + {0} /* timing parameters */ > +}; > +/* #else */ > + > +/* Marvell board - Board_ID = DB_GP_68XX_ID = 4 */ > +static struct mv_ddr_topology_map board_topology_map = { > + DEBUG_LEVEL_ERROR, > + 0x1, /* active interfaces */ > + /* cs_mask, mirror, dqs_swap, ck_swap X PUPs */ > + { { { {0x1, 0, 0, 0}, > + {0x1, 0, 0, 0}, > + {0x1, 0, 0, 0}, > + {0x1, 0, 0, 0}, > + {0x1, 0, 0, 0} }, > + SPEED_BIN_DDR_DB_68XX, /* speed_bin */ > + BUS_WIDTH_DB_68XX, /* sdram device width */ > + MV_DDR_DIE_CAP_4GBIT, /* die capacity */ > + MV_DDR_FREQ_SAR, /* frequency */ > + 0, 0, /* cas_l cas_wl */ > + MV_DDR_TEMP_LOW} }, /* temperature */ > + BUS_MASK_32BIT, /* subphys mask */ > + MV_DDR_CFG_DEFAULT, /* ddr configuration data source */ > + NOT_COMBINED, /* ddr twin-die combined*/ > + { {0} }, /* raw spd data */ > + {0} /* timing parameters */ > +}; > +#endif /* 0 */ > + > +#if 0 > +struct mv_ddr_topology_map *mv_ddr_topology_map_get(void) > +{ > + /* Return the board topology as defined in the board code */ > + return &board_topology_map; > +} > +#endif This file has all code commented. Also topology file is defined in u-boot board directory. So file seems to not be needed too. > diff --git a/drivers/ddr/marvell/a38x/mv_ddr_init.c > b/drivers/ddr/marvell/a38x/mv_ddr_init.c > new file mode 100644 > index 0000000000..e544ba87e5 > --- /dev/null > +++ b/drivers/ddr/marvell/a38x/mv_ddr_init.c > @@ -0,0 +1,60 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) Marvell International Ltd. and its affiliates > + */ > + > +/* TODO: need this wrapper block for ddr_topology_def.h resolution */ > +#include "ddr_ml_wrapper.h" > + > +#include "mv_ddr_common.h" > +#include "mv_ddr_topology.h" > +#include "mv_ddr_plat.h" > +#include "ddr_topology_def.h" > +#include "dram_if.h" > + > +int mv_ddr_init(void) > +{ > + /* print mv_ddr version */ > + mv_ddr_ver_print(); > + > + /* preliminary mv_ddr configuration */ > + if (mv_ddr_pre_config()) { > + printf("error: %s failed\n", __func__); > + return -1; > + } > + > + /* remap overlapping dram region to the top */ > + if (mv_ddr_mc_remap() != 0) > + return -1; > + > + /* mv_ddr_mc */ > + if (mv_ddr_mc_config()) { > + printf("error: %s failed\n", __func__); > + return -1; > + } > + > + > + if (mv_ddr_phy_config()) { > + printf("error: %s failed\n", __func__); > +#if defined(T9130) > + reg_write(0x6f0084, 0x0); > +#endif > + return -1; > + } > + > + > + if (mv_ddr_mc_ena()) { > + printf("error: %s failed\n", __func__); > + return -1; > + } > + > + /* post mv_ddr configuration */ > + if (mv_ddr_post_config()) { > + printf("error: %s failed\n", __func__); > + return -1; > + } > + > + printf("mv_ddr: completed successfully\n"); > + > + return 0; > +} Function mv_ddr_init() is not called, so whole mv_ddr_init.c file is not needed. > diff --git a/drivers/ddr/marvell/a38x/mv_ddr_init.h > b/drivers/ddr/marvell/a38x/mv_ddr_init.h > new file mode 100644 > index 0000000000..76fb20770f > --- /dev/null > +++ b/drivers/ddr/marvell/a38x/mv_ddr_init.h > @@ -0,0 +1,11 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) Marvell International Ltd. and its affiliates > + */ > + > +#ifndef _MV_DDR_INIT_H > +#define _MV_DDR_INIT_H > + > +int mv_ddr_init(void); > + > +#endif /* _MV_DDR_INIT_H */ Same for header file. > diff --git a/drivers/ddr/marvell/a38x/mv_ddr_mrs.c > b/drivers/ddr/marvell/a38x/mv_ddr_mrs.c > new file mode 100644 > index 0000000000..55be36308b > --- /dev/null > +++ b/drivers/ddr/marvell/a38x/mv_ddr_mrs.c > @@ -0,0 +1,248 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) Marvell International Ltd. and its affiliates > + */ > + > +#include "ddr_ml_wrapper.h" > +#include "mv_ddr_plat.h" > + > +/* > + * Based on Proposed DDR4 Full spec update (79-4B), Item No. 1716.78C > + */ > + > +/* MR0 WR (Write Recovery) and RTP (read to precharge), [13, 11:9] bits */ > +#define MV_DDR_MR0_WR10_RTP5 0x0 /* 0b00_0000_0000_0000 */ > +#define MV_DDR_MR0_WR12_RTP6 0x200 /* 0b00_0010_0000_0000 */ > +#define MV_DDR_MR0_WR14_RTP7 0x400 /* 0b00_0100_0000_0000 */ > +#define MV_DDR_MR0_WR16_RTP8 0x600 /* 0b00_0110_0000_0000 */ > +#define MV_DDR_MR0_WR18_RTP9 0x800 /* 0b00_1000_0000_0000 */ > +#define MV_DDR_MR0_WR20_RTP10 0xa00 /* 0b00_1010_0000_0000 */ > +#define MV_DDR_MR0_WR24_RTP12 0xc00 /* 0b00_1100_0000_0000 */ > +#define MV_DDR_MR0_WR22_RTP11 0xe00 /* 0b00_1110_0000_0000 */ > +#define MV_DDR_MR0_WR26_RTP13 0x2000 /* 0b10_0000_0000_0000 */ > + > +int mv_ddr_mr0_wr_get(unsigned int wr, unsigned int *mr0_wr) > +{ > + switch (wr) { > + case 10: > + *mr0_wr = MV_DDR_MR0_WR10_RTP5; > + break; > + case 12: > + *mr0_wr = MV_DDR_MR0_WR12_RTP6; > + break; > + case 14: > + *mr0_wr = MV_DDR_MR0_WR14_RTP7; > + break; > + case 16: > + *mr0_wr = MV_DDR_MR0_WR16_RTP8; > + break; > + case 18: > + *mr0_wr = MV_DDR_MR0_WR18_RTP9; > + break; > + case 20: > + *mr0_wr = MV_DDR_MR0_WR20_RTP10; > + break; > + case 24: > + *mr0_wr = MV_DDR_MR0_WR24_RTP12; > + break; > + case 22: > + *mr0_wr = MV_DDR_MR0_WR22_RTP11; > + break; > + case 26: > + *mr0_wr = MV_DDR_MR0_WR26_RTP13; > + break; > + default: > + printf("error: %s: unsupported t_wr value found\n", __func__); > + return -1; > + } > + > + return 0; > +} > + > +/* MR0 CL, [12, 6:4, 2] bits */ > +#define MV_DDR_MR0_CL9 0x0 /* 0b0_0000_0000_0000 */ > +#define MV_DDR_MR0_CL10 0x4 /* 0b0_0000_0000_0100 */ > +#define MV_DDR_MR0_CL11 0x10 /* 0b0_0000_0001_0000 */ > +#define MV_DDR_MR0_CL12 0x14 /* 0b0_0000_0001_0100 */ > +#define MV_DDR_MR0_CL13 0x20 /* 0b0_0000_0010_0000 */ > +#define MV_DDR_MR0_CL14 0x24 /* 0b0_0000_0010_0100 */ > +#define MV_DDR_MR0_CL15 0x30 /* 0b0_0000_0011_0000 */ > +#define MV_DDR_MR0_CL16 0x34 /* 0b0_0000_0011_0100 */ > +#define MV_DDR_MR0_CL18 0x40 /* 0b0_0000_0100_0000 */ > +#define MV_DDR_MR0_CL20 0x44 /* 0b0_0000_0100_0100 */ > +#define MV_DDR_MR0_CL22 0x50 /* 0b0_0000_0101_0000 */ > +#define MV_DDR_MR0_CL24 0x54 /* 0b0_0000_0101_0100 */ > +#define MV_DDR_MR0_CL23 0x60 /* 0b0_0000_0110_0000 */ > +#define MV_DDR_MR0_CL17 0x64 /* 0b0_0000_0110_0100 */ > +#define MV_DDR_MR0_CL19 0x70 /* 0b0_0000_0111_0000 */ > +#define MV_DDR_MR0_CL21 0x74 /* 0b0_0000_0111_0100 */ > +#define MV_DDR_MR0_CL25 0x1000 /* 0b1_0000_0000_0000 */ > +#define MV_DDR_MR0_CL26 0x1004 /* 0b1_0000_0000_0100 */ > +#define MV_DDR_MR0_CL27 0x1010 /* 0b1_0000_0001_0000 */ > +#define MV_DDR_MR0_CL28 0x1014 /* 0b1_0000_0001_0100 */ > +#define MV_DDR_MR0_CL29 0x1020 /* 0b1_0000_0010_0000 */ > +#define MV_DDR_MR0_CL30 0x1024 /* 0b1_0000_0010_0100 */ > +#define MV_DDR_MR0_CL31 0x1030 /* 0b1_0000_0011_0000 */ > +#define MV_DDR_MR0_CL32 0x1034 /* 0b1_0000_0011_0100 */ > + > +int mv_ddr_mr0_cl_get(unsigned int cl, unsigned int *mr0_cl) > +{ > + switch (cl) { > + case 9: > + *mr0_cl = MV_DDR_MR0_CL9; > + break; > + case 10: > + *mr0_cl = MV_DDR_MR0_CL10; > + break; > + case 11: > + *mr0_cl = MV_DDR_MR0_CL11; > + break; > + case 12: > + *mr0_cl = MV_DDR_MR0_CL12; > + break; > + case 13: > + *mr0_cl = MV_DDR_MR0_CL13; > + break; > + case 14: > + *mr0_cl = MV_DDR_MR0_CL14; > + break; > + case 15: > + *mr0_cl = MV_DDR_MR0_CL15; > + break; > + case 16: > + *mr0_cl = MV_DDR_MR0_CL16; > + break; > + case 18: > + *mr0_cl = MV_DDR_MR0_CL18; > + break; > + case 20: > + *mr0_cl = MV_DDR_MR0_CL20; > + break; > + case 22: > + *mr0_cl = MV_DDR_MR0_CL22; > + break; > + case 24: > + *mr0_cl = MV_DDR_MR0_CL24; > + break; > + case 23: > + *mr0_cl = MV_DDR_MR0_CL23; > + break; > + case 17: > + *mr0_cl = MV_DDR_MR0_CL17; > + break; > + case 19: > + *mr0_cl = MV_DDR_MR0_CL19; > + break; > + case 21: > + *mr0_cl = MV_DDR_MR0_CL21; > + break; > + case 25: > + *mr0_cl = MV_DDR_MR0_CL25; > + break; > + case 26: > + *mr0_cl = MV_DDR_MR0_CL26; > + break; > + case 27: > + *mr0_cl = MV_DDR_MR0_CL27; > + break; > + case 28: > + *mr0_cl = MV_DDR_MR0_CL28; > + break; > + case 29: > + *mr0_cl = MV_DDR_MR0_CL29; > + break; > + case 30: > + *mr0_cl = MV_DDR_MR0_CL30; > + break; > + case 31: > + *mr0_cl = MV_DDR_MR0_CL31; > + break; > + case 32: > + *mr0_cl = MV_DDR_MR0_CL32; > + break; > + default: > + printf("error: %s: unsupported cl value found\n", __func__); > + return -1; > + } > + > + return 0; > +} > + > +/* MR2 CWL, [5:3] bits */ > +#define MV_DDR_MR2_CWL9 0x0 /* 0b0000_0000 */ > +#define MV_DDR_MR2_CWL10 0x8 /* 0b0000_1000 */ > +#define MV_DDR_MR2_CWL11 0x10 /* 0b0001_0000 */ > +#define MV_DDR_MR2_CWL12 0x18 /* 0b0001_1000 */ > +#define MV_DDR_MR2_CWL14 0x20 /* 0b0010_0000 */ > +#define MV_DDR_MR2_CWL16 0x28 /* 0b0010_1000 */ > +#define MV_DDR_MR2_CWL18 0x30 /* 0b0011_0000 */ > +#define MV_DDR_MR2_CWL20 0x38 /* 0b0011_1000 */ > + > +int mv_ddr_mr2_cwl_get(unsigned int cwl, unsigned int *mr2_cwl) > +{ > + switch (cwl) { > + case 9: > + *mr2_cwl = MV_DDR_MR2_CWL9; > + break; > + case 10: > + *mr2_cwl = MV_DDR_MR2_CWL10; > + break; > + case 11: > + *mr2_cwl = MV_DDR_MR2_CWL11; > + break; > + case 12: > + *mr2_cwl = MV_DDR_MR2_CWL12; > + break; > + case 14: > + *mr2_cwl = MV_DDR_MR2_CWL14; > + break; > + case 16: > + *mr2_cwl = MV_DDR_MR2_CWL16; > + break; > + case 18: > + *mr2_cwl = MV_DDR_MR2_CWL18; > + break; > + case 20: > + *mr2_cwl = MV_DDR_MR2_CWL20; > + break; > + default: > + printf("error: %s: unsupported cwl value found\n", __func__); > + return -1; > + } > + > + return 0; > +} > + > +/* MR6 tCCD_L, [12:10] bits */ > +#define MV_DDR_MR6_TCCDL_OFFS 10 > +#define MV_DDR_MR6_TCCDL_MASK 0x7 > +#define MV_DDR_MR6_TCCDL4 0x0 > +#define MV_DDR_MR6_TCCDL5 0x1 > +#define MV_DDR_MR6_TCCDL6 0x2 > +#define MV_DDR_MR6_TCCDL7 0x3 > +#define MV_DDR_MR6_TCCDL8 0x4 > +int mv_ddr_mr6_tccdl_get(unsigned int tccdl, unsigned int *mr6_tccdl) > +{ > + switch (tccdl) { > + case 4: > + *mr6_tccdl = MV_DDR_MR6_TCCDL4 << MV_DDR_MR6_TCCDL_OFFS; > + break; > + case 5: > + *mr6_tccdl = MV_DDR_MR6_TCCDL5 << MV_DDR_MR6_TCCDL_OFFS; > + break; > + case 6: > + *mr6_tccdl = MV_DDR_MR6_TCCDL6 << MV_DDR_MR6_TCCDL_OFFS; > + break; > + case 7: > + *mr6_tccdl = MV_DDR_MR6_TCCDL7 << MV_DDR_MR6_TCCDL_OFFS; > + break; > + case 8: > + *mr6_tccdl = MV_DDR_MR6_TCCDL8 << MV_DDR_MR6_TCCDL_OFFS; > + break; > + default: > + printf("error: %s: unsupported t_ccd_l value found\n", > __func__); > + return -1; > + } > + > + return 0; > +} This file seems to be unused for a38x too. > diff --git a/drivers/ddr/marvell/a38x/mv_ddr_mrs.h > b/drivers/ddr/marvell/a38x/mv_ddr_mrs.h > new file mode 100644 > index 0000000000..92295159c7 > --- /dev/null > +++ b/drivers/ddr/marvell/a38x/mv_ddr_mrs.h > @@ -0,0 +1,83 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) Marvell International Ltd. and its affiliates > + */ > + > +#ifndef _MV_DDR_MRS_H > +#define _MV_DDR_MRS_H > + > +/* > + * Based on Proposed DDR4 Full spec update (79-4B), Item No. 1716.78C > + */ > + > +/* MR1 DIC, [2:1] bits */ > +#define MV_DDR_MR1_DIC_OFFS 1 > + > +/* MR1 RTT_NOM, [10:8] bits */ > +#define MV_DDR_MR1_RTT_NOM_OFFS 8 > +#define MV_DDR_MR1_RTT_NOM_MASK 0x7 > +#define MV_DDR_MR1_RTT_NOM_DISABLE 0x0 /* 0b000_0000_0000 */ > +#define MV_DDR_MR1_RTT_NOM_RZQ_DIV4 0x100 /* 0b001_0000_0000; 60-Ohm */ > +#define MV_DDR_MR1_RTT_NOM_RZQ_DIV2 0x200 /* 0b010_0000_0000; 120-Ohm */ > +#define MV_DDR_MR1_RTT_NOM_RZQ_DIV6 0x300 /* 0b011_0000_0000; 40-Ohm */ > +#define MV_DDR_MR1_RTT_NOM_RZQ_DIV1 0x400 /* 0b100_0000_0000; 240-Ohm */ > +#define MV_DDR_MR1_RTT_NOM_RZQ_DIV5 0x500 /* 0b101_0000_0000; 48-Ohm */ > +#define MV_DDR_MR1_RTT_NOM_RZQ_DIV3 0x600 /* 0b110_0000_0000; 80-Ohm */ > +#define MV_DDR_MR1_RTT_NOM_RZQ_DIV7 0x700 /* 0b111_0000_0000; 34-Ohm */ > + > +/* MR2 RTT_WR, [11:9] bits */ > +#define MV_DDR_MR2_RTT_WR_OFFS 9 > +#define MV_DDR_MR2_RTT_WR_MASK 0x7 > +#define MV_DDR_MR2_RTT_WR_DYN_ODT_OFF 0x0 /* 0b0000_0000_0000 */ > +#define MV_DDR_MR2_RTT_WR_RZQ_DIV2 0x200 /* 0b0010_0000_0000; 120-Ohm */ > +#define MV_DDR_MR2_RTT_WR_RZQ_DIV1 0x400 /* 0b0100_0000_0000; 240-Ohm */ > +#define MV_DDR_MR2_RTT_WR_HIZ 0x600 /* 0b0110_0000_0000 */ > +#define MV_DDR_MR2_RTT_WR_RZQ_DIV3 0x800 /* 0b1000_0000_0000; 80-Ohm */ > + > +/* MR5 ODT Input Buffer during Power Down mode, bit 5 */ > +#define MV_DDR_MR5_PD_ODT_IBUF_OFFS 5 > +#define MV_DDR_MR5_PD_ODT_IBUF_MASK 0x1 > +#define MV_DDR_MR5_PD_ODT_IBUF_ENA 0 > +#define MV_DDR_MR5_PD_ODT_IBUF_DIS 1 > + > +/* MR5 Data Mask, bit 10 */ > +#define MV_DDR_MR5_DM_OFFS 10 > +#define MV_DDR_MR5_DM_MASK 0x1 > +#define MV_DDR_MR5_DM_ENA 1 > +#define MV_DDR_MR5_DM_DIS 0 > + > +/* MR5 RTT_PARK, [8:6] bits */ > +#define MV_DDR_MR5_RTT_PARK_OFFS 6 > +#define MV_DDR_MR5_RTT_PARK_MASK 0x7 > +#define MV_DDR_MR5_RTT_PARK_DISABLE 0x0 /* 0b0_0000_0000 */ > +#define MV_DDR_MR5_RTT_PARK_RZQ_DIV4 0x40 /* 0b0_0100_0000; 60-Ohm */ > +#define MV_DDR_MR5_RTT_PARK_RZQ_DIV2 0x80 /* 0b0_1000_0000; 120-Ohm */ > +#define MV_DDR_MR5_RTT_PARK_RZQ_DIV6 0xc0 /* 0b0_1100_0000; 40-Ohm */ > +#define MV_DDR_MR5_RTT_PARK_RZQ_DIV1 0x100 /* 0b1_0000_0000; 240-Ohm */ > +#define MV_DDR_MR5_RTT_PARK_RZQ_DIV5 0x140 /* 0b1_0100_0000; 48-Ohm */ > +#define MV_DDR_MR5_RTT_PARK_RZQ_DIV3 0x180 /* 0b1_1000_0000; 80-Ohm */ > +#define MV_DDR_MR5_RTT_PARK_RZQ_DIV7 0x1c0 /* 0b1_1100_0000; 34-Ohm */ > + > +/* MR6 VrefDQ Training Enable, bit 7 */ > +#define MV_DDR_MR6_VREFDQ_TRNG_ENA_OFFS 7 > +#define MV_DDR_MR6_VREFDQ_TRNG_ENA_MASK 0x1 > +#define MV_DDR_MR6_VREFDQ_TRNG_ENA 1 /* training mode */ > +#define MV_DDR_MR6_VREFDQ_TRNG_DIS 0 /* normal operation mode */ > + > +/* MR6 VrefDQ Training Range, bit 6 */ > +#define MV_DDR_MR6_VREFDQ_TRNG_RNG_OFFS 6 > +#define MV_DDR_MR6_VREFDQ_TRNG_RNG_MASK 0x1 > +#define MV_DDR_MR6_VREFDQ_TRNG_RNG1 0 /* range 1 */ > +#define MV_DDR_MR6_VREFDQ_TRNG_RNG2 1 /* range 2 */ > + > +/* MR6 VrefDQ Training Range Values, [5:0] bits */ > +#define MV_DDR_MR6_VREFDQ_TRNG_VAL_OFFS 0 > +#define MV_DDR_MR6_VREFDQ_TRNG_VAL_MASK 0x3f > +#define MV_DDR_MR6_VREFDQ_TRNG_VAL 0x9 /* range 1: 65.85%; range 2: > 50.85% */ > + > +int mv_ddr_mr0_wr_get(unsigned int wr, unsigned int *mr0_wr); > +int mv_ddr_mr0_cl_get(unsigned int cl, unsigned int *mr0_cl); > +int mv_ddr_mr2_cwl_get(unsigned int cwl, unsigned int *mr2_cwl); > +int mv_ddr_mr6_tccdl_get(unsigned int tccdl, unsigned int *mr6_tccdl); > + > +#endif /* _MV_DDR_MRS_H */ And also header file. ... > diff --git a/drivers/ddr/marvell/a38x/mv_ddr_static.c > b/drivers/ddr/marvell/a38x/mv_ddr_static.c > new file mode 100644 > index 0000000000..269e62c213 > --- /dev/null > +++ b/drivers/ddr/marvell/a38x/mv_ddr_static.c > @@ -0,0 +1,12 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) Marvell International Ltd. and its affiliates > + */ > + > +#include "mv_ddr_static.h" > +#include "ddr3_training_ip_def.h" > + > + > + > + > + This file is empty. > diff --git a/drivers/ddr/marvell/a38x/mv_ddr_static.h > b/drivers/ddr/marvell/a38x/mv_ddr_static.h > new file mode 100644 > index 0000000000..b5c131963e > --- /dev/null > +++ b/drivers/ddr/marvell/a38x/mv_ddr_static.h > @@ -0,0 +1,11 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) Marvell International Ltd. and its affiliates > + */ > + > +#ifndef _MV_DDR_STATIC_H > +#define _MV_DDR_STATIC_H > + > + > + > +#endif /* _MV_DDR_STATIC_H */ And header file too.