The SpacemiT K3 SoC integrates two DDR controllers, each paired with a Synopsys DDR PHY, supporting LPDDR4X and LPDDR5 memory. Add an SPL RAM driver with initial support for LPDDR5 to configure both controllers and PHYs, run training, and report the combined capacity through the RAM uclass.
The board code must read the DDR part number from EEPROM and populate the driver's platform data before probing the device. The driver uses this part number to select the corresponding memory profile. Preserve the vendor register tables, part-specific overrides and PHY write sequence. Package the PMU IMEM firmware as an external binary through binman. Signed-off-by: Junhui Liu <[email protected]> --- drivers/ram/Kconfig | 1 + drivers/ram/Makefile | 1 + drivers/ram/spacemit/Kconfig | 6 + drivers/ram/spacemit/Makefile | 3 + drivers/ram/spacemit/k3/Makefile | 9 + drivers/ram/spacemit/k3/k3_ddr.c | 134 ++ drivers/ram/spacemit/k3/k3_ddr.h | 169 +++ drivers/ram/spacemit/k3/k3_ddr_ctrl.c | 73 ++ drivers/ram/spacemit/k3/k3_ddr_lpddr5.c | 538 ++++++++ drivers/ram/spacemit/k3/k3_ddr_lpddr5_tables.c | 1668 ++++++++++++++++++++++++ drivers/ram/spacemit/k3/k3_ddr_phy.c | 149 +++ drivers/ram/spacemit/k3/k3_ddr_profile.c | 54 + include/soc/spacemit/k3-ddr.h | 13 + 13 files changed, 2818 insertions(+) diff --git a/drivers/ram/Kconfig b/drivers/ram/Kconfig index acd6d9cfd6a..d3a4c6f8d27 100644 --- a/drivers/ram/Kconfig +++ b/drivers/ram/Kconfig @@ -145,6 +145,7 @@ source "drivers/ram/octeon/Kconfig" source "drivers/ram/renesas/Kconfig" source "drivers/ram/rockchip/Kconfig" source "drivers/ram/sifive/Kconfig" +source "drivers/ram/spacemit/Kconfig" source "drivers/ram/stm32mp1/Kconfig" source "drivers/ram/starfive/Kconfig" source "drivers/ram/sunxi/Kconfig" diff --git a/drivers/ram/Makefile b/drivers/ram/Makefile index 82afd5fcbcc..e9c2674206c 100644 --- a/drivers/ram/Makefile +++ b/drivers/ram/Makefile @@ -21,6 +21,7 @@ obj-$(CONFIG_IMXRT_SDRAM) += imxrt_sdram.o obj-$(CONFIG_RAM_SIFIVE) += sifive/ ifdef CONFIG_XPL_BUILD +obj-$(CONFIG_SPL_SPACEMIT_K3_DDR) += spacemit/ obj-$(CONFIG_SPL_STARFIVE_DDR) += starfive/ endif diff --git a/drivers/ram/spacemit/Kconfig b/drivers/ram/spacemit/Kconfig new file mode 100644 index 00000000000..8f45c96220c --- /dev/null +++ b/drivers/ram/spacemit/Kconfig @@ -0,0 +1,6 @@ +config SPL_SPACEMIT_K3_DDR + bool "SpacemiT K3 DDR controller support" + depends on SPL_RAM && SPACEMIT_K3 + select SPL_BINMAN_SYMBOLS + help + This enables DDR support for SpacemiT K3 platforms. diff --git a/drivers/ram/spacemit/Makefile b/drivers/ram/spacemit/Makefile new file mode 100644 index 00000000000..0db2546cf16 --- /dev/null +++ b/drivers/ram/spacemit/Makefile @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +obj-$(CONFIG_SPL_SPACEMIT_K3_DDR) += k3/ diff --git a/drivers/ram/spacemit/k3/Makefile b/drivers/ram/spacemit/k3/Makefile new file mode 100644 index 00000000000..9cf82d34f68 --- /dev/null +++ b/drivers/ram/spacemit/k3/Makefile @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +obj-y += k3_ddr.o +obj-y += k3_ddr_ctrl.o +obj-y += k3_ddr_phy.o +obj-y += k3_ddr_profile.o + +obj-y += k3_ddr_lpddr5.o +obj-y += k3_ddr_lpddr5_tables.o diff --git a/drivers/ram/spacemit/k3/k3_ddr.c b/drivers/ram/spacemit/k3/k3_ddr.c new file mode 100644 index 00000000000..9c1e8d513be --- /dev/null +++ b/drivers/ram/spacemit/k3/k3_ddr.c @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (C) 2026 Junhui Liu <[email protected]> + */ + +#include <binman_sym.h> +#include <dm.h> +#include <dm/device_compat.h> +#include <dm/ofnode.h> +#include <errno.h> +#include <linux/sizes.h> +#include <ram.h> +#include <soc/spacemit/k3-ddr.h> +#include <spl.h> + +#include "k3_ddr.h" + +struct k3_ddr_priv { + struct k3_ddr ddr; + struct ram_info info; +}; + +binman_sym_declare(ulong, u_boot_spl, image_pos); +binman_sym_declare(ulong, lpddr5_imem, image_pos); +binman_sym_declare(ulong, lpddr5_imem, size); + +static int k3_ddr_get_firmware(struct k3_ddr *ddr) +{ + ulong fw_pos = binman_sym(ulong, lpddr5_imem, image_pos); + ulong spl_pos = binman_sym(ulong, u_boot_spl, image_pos); + ulong size = binman_sym(ulong, lpddr5_imem, size); + + if (!BINMAN_SYMS_OK) + return -ENOENT; + + if (!size || size > K3_PHY_PMU_IMEM_SIZE * sizeof(u16)) + return -EINVAL; + + ddr->imem_fw = (const u8 *)(CONFIG_SPL_TEXT_BASE + fw_pos - spl_pos); + ddr->imem_fw_size = size; + + return 0; +} + +static int k3_ddr_get_info(struct udevice *dev, struct ram_info *info) +{ + struct k3_ddr_priv *priv = dev_get_priv(dev); + + *info = priv->info; + + return 0; +} + +static int k3_ddr_probe(struct udevice *dev) +{ + struct k3_ddr_priv *priv = dev_get_priv(dev); + struct k3_ddr_plat *plat = dev_get_plat(dev); + const char *part_number = plat->part_number; + struct ofnode_phandle_args apmu_args; + fdt_addr_t addr; + int i, ret; + + priv->ddr.dev = dev; + + for (i = 0; i < K3_DDR_NUM_CHANNELS; i++) { + priv->ddr.ctrl[i] = dev_read_addr_index_ptr(dev, i); + if (!priv->ddr.ctrl[i]) + return -EINVAL; + + priv->ddr.cfg[i] = priv->ddr.ctrl[i] + K3_DDR_CFG_OFFSET; + priv->ddr.phy[i] = priv->ddr.ctrl[i] + K3_DDR_PHY_OFFSET; + } + + ret = dev_read_phandle_with_args(dev, "spacemit,apmu", NULL, 1, 0, &apmu_args); + if (ret) + return ret; + + addr = ofnode_get_addr(apmu_args.node); + if (addr == FDT_ADDR_T_NONE) + return -EINVAL; + + priv->ddr.apmu = (void __iomem *)addr; + priv->ddr.apmu_offset = apmu_args.args[0]; + + if (!part_number[0]) { + dev_err(dev, "DDR part number not configured\n"); + return -EINVAL; + } + + priv->ddr.profile = k3_ddr_find_profile(part_number); + if (!priv->ddr.profile) { + dev_err(dev, "unsupported DDR part: %s\n", part_number); + return -EOPNOTSUPP; + } + + ret = k3_ddr_get_firmware(&priv->ddr); + if (ret) { + dev_err(dev, "invalid or missing DDR PMU firmware: %d\n", ret); + return ret; + } + + debug("DDR: %s, %u MiB/channel, %u ranks, x%u\n", part_number, + priv->ddr.profile->part_size_mb, priv->ddr.profile->ranks, + priv->ddr.profile->device_width); + + ret = k3_ddr_lpddr5_init(&priv->ddr); + if (ret) + return ret; + + priv->info.base = 0x100000000ULL; + priv->info.size = (phys_size_t)priv->ddr.profile->part_size_mb * + K3_DDR_NUM_CHANNELS * SZ_1M; + + return 0; +} + +static const struct ram_ops k3_ddr_ops = { + .get_info = k3_ddr_get_info, +}; + +static const struct udevice_id k3_ddr_ids[] = { + { .compatible = "spacemit,k3-ddrc" }, + { /* sentinel */ } +}; + +U_BOOT_DRIVER(spacemit_k3_ddr) = { + .name = "spacemit_k3_ddr", + .id = UCLASS_RAM, + .of_match = k3_ddr_ids, + .probe = k3_ddr_probe, + .ops = &k3_ddr_ops, + .priv_auto = sizeof(struct k3_ddr_priv), + .plat_auto = sizeof(struct k3_ddr_plat), +}; diff --git a/drivers/ram/spacemit/k3/k3_ddr.h b/drivers/ram/spacemit/k3/k3_ddr.h new file mode 100644 index 00000000000..78d2d6b3e2c --- /dev/null +++ b/drivers/ram/spacemit/k3/k3_ddr.h @@ -0,0 +1,169 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2026 Junhui Liu <[email protected]> + */ + +#ifndef _SPACEMIT_K3_DDR_H_ +#define _SPACEMIT_K3_DDR_H_ + +#include <linux/bitops.h> +#include <linux/kernel.h> +#include <linux/types.h> + +#define K3_DDR_NUM_CHANNELS 2 +#define K3_DDR_REG_TIMEOUT_US 100000 + +/* PHY PMU memory bases and sizes are in 16-bit CSR words. */ +#define K3_PHY_PMU_IMEM_BASE 0x50000 +#define K3_PHY_PMU_IMEM_SIZE 0x8000 +#define K3_PHY_PMU_DMEM_BASE 0x58000 +#define K3_PHY_PMU_DMEM_SIZE 0x8000 + +#define K3_DDR_PHY_OFFSET 0x800000 +#define K3_DDR_CFG_OFFSET 0x600000 + +#define K3_DDR_SWCTL 0x10c80 +#define K3_DDR_SWSTAT 0x10c84 +#define K3_DDR_PWRCTL 0x10180 + +#define K3_DDR_CFG_PLL_SWCR2 0x0c +#define K3_DDR_PLLA_SWCR2_MMD_EN BIT(22) +#define K3_DDR_PLLA_SWCR2_EN BIT(16) +#define K3_DDR_PLLA_SWCR2_OUT_EN GENMASK(7, 0) + +#define K3_DDR_CFG_PLL_STATUS 0x1c +#define K3_DDR_CFG_PLL_LOCK BIT(0) + +#define K3_DDR_CFG_CLK_CTRL 0x18 +#define K3_DDR_CFG_CLK_FC BIT(25) +#define K3_DDR_CFG_CLK_SEL GENMASK(21, 19) +#define K3_DDR_CFG_CLK_DIV GENMASK(18, 16) +#define K3_DDR_CFG_CLK_EN BIT(0) + +#define K3_DDR_PHY_CFG_OP GENMASK(31, 24) +#define K3_DDR_PHY_CFG_ADDR GENMASK(23, 0) + +#define K3_DDR_PHY_CFG_SINGLE 0 +#define K3_DDR_PHY_CFG_RANGE 1 + +#define K3_DDR_PHY_SKIP BIT(0) + +struct k3_ddr_phy_cfg { + /* Bits [31:24] encode the operation. Bits [23:0] hold the PHY CSR address. */ + u32 opaddr; + union { + u16 value; + struct { + const u16 *values; + u16 count; + } range; + }; +}; + +#define K3_DDR_PHY_WRITE_SINGLE(_csr, _value) \ +{ \ + .opaddr = (_csr) | (K3_DDR_PHY_CFG_SINGLE << 24), \ + .value = (_value), \ +} + +#define K3_DDR_PHY_WRITE_RANGE(_csr, _values) \ +{ \ + .opaddr = (_csr) | (K3_DDR_PHY_CFG_RANGE << 24), \ + .range = { \ + .values = (_values), \ + .count = ARRAY_SIZE(_values), \ + }, \ +} + +struct k3_ddr_phy_table { + const struct k3_ddr_phy_cfg *cfg; + size_t count; +}; + +struct k3_ddr_phy_override { + u32 csr; + u16 value; + u16 flags; +}; + +struct k3_ddr_phy_overrides { + const struct k3_ddr_phy_override *regs; + size_t count; +}; + +enum k3_ddr_phy_odt { + K3_DDR_PHY_R_OFF = 0, + K3_DDR_PHY_R_120 = 0x08, + K3_DDR_PHY_R_60 = 0x0c, + K3_DDR_PHY_R_40 = 0x0e, + K3_DDR_PHY_R_30 = 0x0f, +}; + +enum k3_ddr_odt { + K3_DDR_R_OFF = 0, + K3_DDR_R_240, + K3_DDR_R_120, + K3_DDR_R_80, + K3_DDR_R_60, + K3_DDR_R_48, + K3_DDR_R_40, +}; + +struct k3_ddr_io_para { + u8 write_ds; + u8 rx_odt; + u8 pdds; + u8 dq_odt; + u8 ca_odt; + u8 nt_odt; + u8 soc_odt; +}; + +struct k3_ddr_profile { + const char *part_number; + u32 part_size_mb; + u8 ranks; + u8 device_width; +}; + +struct k3_ddr { + struct udevice *dev; + const struct k3_ddr_profile *profile; + + void __iomem *ctrl[K3_DDR_NUM_CHANNELS]; + void __iomem *cfg[K3_DDR_NUM_CHANNELS]; + void __iomem *phy[K3_DDR_NUM_CHANNELS]; + + void __iomem *apmu; + u32 apmu_offset; + + const u8 *imem_fw; + size_t imem_fw_size; +}; + +extern const struct k3_ddr_phy_table k3_ddr_lpddr5_phy_init_table; +extern const struct k3_ddr_phy_table k3_ddr_lpddr5_pre_train_table; +extern const struct k3_ddr_phy_table k3_ddr_lpddr5_post_train_table; + +extern const struct k3_ddr_phy_overrides k3_ddr_lpddr5_pre_srank_x16_overrides; +extern const struct k3_ddr_phy_overrides k3_ddr_lpddr5_pre_drank_x16_overrides; +extern const struct k3_ddr_phy_overrides k3_ddr_lpddr5_post_srank_x16_overrides; +extern const struct k3_ddr_phy_overrides k3_ddr_lpddr5_post_drank_x16_overrides; + +int k3_ddr_clock_init(struct k3_ddr *ddr, unsigned int channel); +void k3_ddr_start_sw_done(struct k3_ddr *ddr, unsigned int channel); +int k3_ddr_wait_sw_done_ack(struct k3_ddr *ddr, unsigned int channel); +void k3_ddr_configure_sar(struct k3_ddr *ddr, unsigned int channel); + +void k3_phy_write(struct k3_ddr *ddr, unsigned int channel, u32 csr, u16 value); +int k3_ddr_phy_load_imem(struct k3_ddr *ddr, unsigned int channel); +void k3_ddr_phy_zero_dmem(struct k3_ddr *ddr, unsigned int channel); +void k3_ddr_phy_start_pmu(struct k3_ddr *ddr, unsigned int channel); +void k3_ddr_phy_halt_pmu(struct k3_ddr *ddr, unsigned int channel); +int k3_ddr_phy_wait_training(struct k3_ddr *ddr, unsigned int channel); + +const struct k3_ddr_profile *k3_ddr_find_profile(const char *part_number); + +int k3_ddr_lpddr5_init(struct k3_ddr *ddr); + +#endif /* _SPACEMIT_K3_DDR_H_ */ diff --git a/drivers/ram/spacemit/k3/k3_ddr_ctrl.c b/drivers/ram/spacemit/k3/k3_ddr_ctrl.c new file mode 100644 index 00000000000..fca7176643d --- /dev/null +++ b/drivers/ram/spacemit/k3/k3_ddr_ctrl.c @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (C) 2025 SpacemiT + * Copyright (C) 2026 Junhui Liu <[email protected]> + */ + +#include <asm/io.h> +#include <linux/bitfield.h> +#include <linux/bitops.h> +#include <linux/iopoll.h> + +#include "k3_ddr.h" + +#define K3_DDR_SARBASE(n) (0x200c0 + (n) * 8) +#define K3_DDR_SARSIZE(n) (0x200c4 + (n) * 8) + +int k3_ddr_clock_init(struct k3_ddr *ddr, unsigned int channel) +{ + void __iomem *cfg = ddr->cfg[channel]; + u32 value; + int ret; + + setbits_le32(cfg + K3_DDR_CFG_PLL_SWCR2, K3_DDR_PLLA_SWCR2_OUT_EN | K3_DDR_PLLA_SWCR2_EN | + K3_DDR_PLLA_SWCR2_MMD_EN); + ret = readl_poll_timeout(cfg + K3_DDR_CFG_PLL_STATUS, value, value & K3_DDR_CFG_PLL_LOCK, + K3_DDR_REG_TIMEOUT_US); + if (ret) + return ret; + + clrsetbits_le32(cfg + K3_DDR_CFG_CLK_CTRL, K3_DDR_CFG_CLK_SEL | K3_DDR_CFG_CLK_DIV, + FIELD_PREP(K3_DDR_CFG_CLK_SEL, 2)); + + setbits_le32(cfg + K3_DDR_CFG_CLK_CTRL, K3_DDR_CFG_CLK_FC); + ret = readl_poll_timeout(cfg + K3_DDR_CFG_CLK_CTRL, value, !(value & K3_DDR_CFG_CLK_FC), + K3_DDR_REG_TIMEOUT_US); + if (ret) + return ret; + + setbits_le32(cfg + K3_DDR_CFG_CLK_CTRL, K3_DDR_CFG_CLK_EN); + + return 0; +} + +void k3_ddr_start_sw_done(struct k3_ddr *ddr, unsigned int channel) +{ + writel(0, ddr->ctrl[channel] + K3_DDR_SWCTL); +} + +int k3_ddr_wait_sw_done_ack(struct k3_ddr *ddr, unsigned int channel) +{ + void __iomem *ctrl = ddr->ctrl[channel]; + u32 value; + + writel(1, ctrl + K3_DDR_SWCTL); + + return readl_poll_timeout(ctrl + K3_DDR_SWSTAT, value, value & BIT(0), + K3_DDR_REG_TIMEOUT_US); +} + +void k3_ddr_configure_sar(struct k3_ddr *ddr, unsigned int channel) +{ + void __iomem *ctrl = ddr->ctrl[channel]; + u32 region_blocks; + int region; + + /* Four equal SARs (System Address Regions), in units of 256 MiB. */ + region_blocks = ddr->profile->part_size_mb / 4 / 256; + + for (region = 0; region < 4; region++) { + writel(8 + region_blocks * region, ctrl + K3_DDR_SARBASE(region)); + writel(region_blocks - 1, ctrl + K3_DDR_SARSIZE(region)); + } +} diff --git a/drivers/ram/spacemit/k3/k3_ddr_lpddr5.c b/drivers/ram/spacemit/k3/k3_ddr_lpddr5.c new file mode 100644 index 00000000000..b881191f29d --- /dev/null +++ b/drivers/ram/spacemit/k3/k3_ddr_lpddr5.c @@ -0,0 +1,538 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * SpacemiT K3 LPDDR5 initialization + * + * Copyright (C) 2025 SpacemiT + * Copyright (C) 2026 Junhui Liu <[email protected]> + */ + +#include <asm/io.h> +#include <dm.h> +#include <dm/device_compat.h> +#include <linux/bitfield.h> +#include <linux/errno.h> +#include <linux/iopoll.h> +#include <linux/sizes.h> + +#include "k3_ddr.h" + +#define K3_DDR_STAT 0x10014 +#define K3_DDR_RFSHCTL0 0x10208 +#define K3_DDR_ZQCTL0 0x10280 +#define K3_DDR_ZQCTL2 0x10288 +#define K3_DDR_DFIUPD0 0x10508 +#define K3_DDR_DFIMISC 0x10510 +#define K3_DDR_DFISTAT 0x10514 +#define K3_DDR_OPCTRL1 0x10b84 +#define K3_DDR_INITTMG0 0x10d00 + +#define K3_DDR_ADDRMAP(n) (0x30000 + (n) * 4) + +#define K3_PHY_MB_MR3 0x58031 +#define K3_PHY_MB_MR11 0x58035 +#define K3_PHY_MB_MR17 0x58041 +#define K3_PHY_MB_MR41 0x58065 +#define K3_PHY_MB_DISABLE_2D 0x58067 + +static const struct k3_ddr_io_para k3_ddr_lpddr5_io_para = { + .write_ds = K3_DDR_PHY_R_30, + .rx_odt = K3_DDR_PHY_R_60, + .pdds = K3_DDR_R_40, + .dq_odt = K3_DDR_R_60, + .ca_odt = K3_DDR_R_80, + .nt_odt = K3_DDR_R_OFF, + .soc_odt = K3_DDR_R_OFF, +}; + +static void k3_lpddr5_configure_controller(struct k3_ddr *ddr, unsigned int channel) +{ + const struct k3_ddr_profile *profile = ddr->profile; + void __iomem *ctrl = ddr->ctrl[channel]; + bool x8 = profile->device_width == 8; + + writel(profile->ranks > 1 ? 0x03080008 : 0x01080008, ctrl + 0x00010000); + clrsetbits_le32(ddr->apmu + ddr->apmu_offset, GENMASK(31, 24), + FIELD_PREP(GENMASK(31, 24), readl(ctrl + 0x00010000) & 0xff)); + + writel(0x00000000, ctrl + 0x00010008); + writel(0x00010005, ctrl + 0x00010510); + writel(0x70000000, ctrl + 0x00010518); + writel(0x00000000, ctrl + 0x00010208); + + if (profile->ranks == 1) + writel(0x010003f3, ctrl + 0x00010200); + else + writel(0x00000361, ctrl + 0x00010200); + + writel(0x00000000, ctrl + 0x00010280); + writel(0x0a000100, ctrl + 0x00010220); + writel(0x00000000, ctrl + 0x00010224); + writel(0x00000000, ctrl + 0x00010288); + writel(0x80012010, ctrl + 0x00010380); + writel(0x00000020, ctrl + 0x00010100); + writel(x8 ? 0x0000000f : 0x00000005, ctrl + 0x00010104); + writel(x8 ? 0x0000000f : 0x00000005, ctrl + 0x00010108); + writel(0x00000000, ctrl + 0x00010118); + writel(0x0000000f, ctrl + 0x00010c90); + writel(0x00000000, ctrl + 0x00010b80); + writel(0x00400040, ctrl + 0x00010300); + writel(0x00002000, ctrl + 0x00010384); + writel(0x04040208, ctrl + 0x0001038c); + writel(0x08400810, ctrl + 0x00010390); + writel(0x00100000, ctrl + 0x00010500); + writel(0xc0000000, ctrl + 0x00010508); + writel(0x00000000, ctrl + 0x00010ca0); + writel(0x00000001, ctrl + 0x00010c80); + writel(0x80008200, ctrl + 0x00010f00); + writel(0x00110011, ctrl + 0x00010580); + writel(0x00000000, ctrl + 0x00010ca4); + writel(0x00000000, ctrl + 0x00010308); + writel(0x0000003f, ctrl + 0x0001018c); + writel(0x00000003, ctrl + 0x00010184); + writel(0x00000001, ctrl + 0x00010114); + writel(0x00000000, ctrl + 0x00010128); + writel(0x00000001, ctrl + 0x00010c94); + writel(0x00000003, ctrl + 0x00010b84); + writel(0x00000011, ctrl + 0x00010180); + writel(0x00020002, ctrl + 0x00010d00); + writel(0x00000100, ctrl + 0x00010010); + writel(0x00000000, ctrl + 0x00010084); + writel(0x00000000, ctrl + 0x00010284); + writel(0x00000000, ctrl + 0x00010b8c); + writel(0x00000000, ctrl + 0x00010b98); + writel(0x71a4000d, ctrl + 0x000005a8); + writel(0x00000000, ctrl + 0x000005a0); + writel(0x00000300, ctrl + 0x000005a4); + writel(0x00000004, ctrl + 0x000005b0); + writel(0x00000001, ctrl + 0x00000d00); + writel(0xe000012c, ctrl + 0x000005b4); +} + +static void k3_lpddr5_configure_parameters(struct k3_ddr *ddr, unsigned int channel) +{ + bool x8 = ddr->profile->device_width == 8; + void __iomem *ctrl = ddr->ctrl[channel]; + + writel(x8 ? 0x29103622 : 0x28103622, ctrl + 0x00000000); + writel(0x00100630, ctrl + 0x00000004); + writel(x8 ? 0x09121219 : 0x09111117, ctrl + 0x00000008); + writel(x8 ? 0x000c2230 : 0x000c212f, ctrl + 0x0000000c); + writel(0x0f04040f, ctrl + 0x00000010); + writel(0x02040c09, ctrl + 0x00000014); + writel(0x00000012, ctrl + 0x00000018); + writel(0x00c90003, ctrl + 0x0000001c); + writel(x8 ? 0x00020412 : 0x00020410, ctrl + 0x00000024); + writel(0x00030000, ctrl + 0x00000030); + writel(0x0c100002, ctrl + 0x00000034); + writel(0x002000e6, ctrl + 0x00000038); + writel(x8 ? 0x0010170e : 0x000f160e, ctrl + 0x00000060); + writel(x8 ? 0x00002906 : 0x00002806, ctrl + 0x00000064); + writel(x8 ? 0x001a1419 : 0x00191318, ctrl + 0x00000078); + writel(0x00030408, ctrl + 0x00000080); + writel(0xc03f0c34, ctrl + 0x00000600); + writel(0x00e00070, ctrl + 0x00000604); + writel(0x06480000, ctrl + 0x00000608); + writel(0x3f000000, ctrl + 0x0000060c); + writel(0x00000000, ctrl + 0x00000610); + writel(0x001804d7, ctrl + 0x00000800); + writel(0x02800100, ctrl + 0x00000804); + writel(0x00400010, ctrl + 0x00000d0c); + writel(0x0f00007f, ctrl + 0x00000c84); + writel(0x00000000, ctrl + 0x00000b80); + writel(0x1024100a, ctrl + 0x00000b04); + writel(0x00000033, ctrl + 0x00000b08); + writel(0x00800000, ctrl + 0x00000b00); + writel(0x00000e12, ctrl + 0x00000d04); + writel(x8 ? 0x0343021f : 0x033f021f, ctrl + 0x00000580); + writel(0x00080303, ctrl + 0x00000584); + writel(x8 ? 0x0018431f : 0x00183f1f, ctrl + 0x00000588); + writel(x8 ? 0x1c0c0403 : 0x180c0403, ctrl + 0x00000590); + writel(0x0410000f, ctrl + 0x00000594); + writel(0x00000000, ctrl + 0x00000500); + writel(0x00000000, ctrl + 0x00000504); + writel(0x00000000, ctrl + 0x00000508); + writel(0x00000000, ctrl + 0x0000050c); + writel(0x009d0009, ctrl + 0x0000005c); + writel(0x00000000, ctrl + 0x00000c00); + writel(0x00010001, ctrl + 0x000005ac); + writel(0x12c00147, ctrl + 0x000005b8); + writel(0x00000070, ctrl + 0x00000a80); + writel(x8 ? 0x0000160a : 0x0000150b, ctrl + 0x00000d08); + writel(0x0f000001, ctrl + 0x00000c80); + writel(0x0f00007f, ctrl + 0x00000c88); + writel(0x00000098, ctrl + 0x00000650); + writel(0x002faf09, ctrl + 0x00000d30); + writel(0x180009c5, ctrl + 0x00000d34); +} + +static void k3_lpddr5_configure_ports(struct k3_ddr *ddr, unsigned int channel) +{ + void __iomem *ctrl = ddr->ctrl[channel]; + + writel(0x00000000, ctrl + 0x00020000); + writel(0x0000501f, ctrl + 0x00020004); + writel(0x0000501f, ctrl + 0x00021004); + writel(0x0000501f, ctrl + 0x00022004); + writel(0x0000501f, ctrl + 0x00023004); + writel(0x0000501f, ctrl + 0x00024004); + writel(0x0000501f, ctrl + 0x00020008); + writel(0x0000501f, ctrl + 0x00021008); + writel(0x0000501f, ctrl + 0x00022008); + writel(0x0000501f, ctrl + 0x00023008); + writel(0x0000501f, ctrl + 0x00024008); + writel(0x00000000, ctrl + 0x00020090); + writel(0x00000000, ctrl + 0x00021090); + writel(0x00000000, ctrl + 0x00022090); + writel(0x00000000, ctrl + 0x00023090); + writel(0x00000000, ctrl + 0x00024090); + writel(0x00000000, ctrl + 0x00020094); + writel(0x00000000, ctrl + 0x00021094); + writel(0x00000000, ctrl + 0x00022094); + writel(0x00000000, ctrl + 0x00023094); + writel(0x00000000, ctrl + 0x00024094); + writel(0x00000000, ctrl + 0x00020098); + writel(0x00000000, ctrl + 0x00021098); + writel(0x00000000, ctrl + 0x00022098); + writel(0x00000000, ctrl + 0x00023098); + writel(0x00000000, ctrl + 0x00024098); + writel(0x00000e00, ctrl + 0x0002009c); + writel(0x00000e00, ctrl + 0x0002109c); + writel(0x00000e00, ctrl + 0x0002209c); + writel(0x00000e00, ctrl + 0x0002309c); + writel(0x00000e00, ctrl + 0x0002409c); + writel(0x00000000, ctrl + 0x000200a0); + writel(0x00000000, ctrl + 0x000210a0); + writel(0x00000000, ctrl + 0x000220a0); + writel(0x00000000, ctrl + 0x000230a0); + writel(0x00000000, ctrl + 0x000240a0); +} + +static int k3_lpddr5_configure_addrmap(struct k3_ddr *ddr, unsigned int channel) +{ + const struct k3_ddr_profile *profile = ddr->profile; + void __iomem *ctrl = ddr->ctrl[channel]; + u32 cs_map, addrmap7; + u32 addrmap12 = 0; + + switch (profile->part_size_mb) { + case SZ_4G / SZ_1M: + cs_map = 0x0000003f; + addrmap7 = 0x1f1f0808; + break; + case SZ_8G / SZ_1M: + cs_map = 0x00000018; + addrmap7 = 0x1f1f0808; + break; + case (SZ_8G + SZ_4G) / SZ_1M: + cs_map = 0x00000019; + addrmap7 = 0x1f080808; + /* Exclude the unused quarter of the 16 GiB address range. */ + addrmap12 = 0x00000004; + break; + case SZ_16G / SZ_1M: + cs_map = 0x00000019; + addrmap7 = 0x1f080808; + break; + default: + return -EOPNOTSUPP; + } + + writel(cs_map, ctrl + K3_DDR_ADDRMAP(1)); + writel(0x003f0903, ctrl + K3_DDR_ADDRMAP(3)); + writel(0x00000101, ctrl + K3_DDR_ADDRMAP(4)); + writel(0x1f030303, ctrl + K3_DDR_ADDRMAP(5)); + writel(0x03030300, ctrl + K3_DDR_ADDRMAP(6)); + writel(addrmap7, ctrl + K3_DDR_ADDRMAP(7)); + writel(0x08080808, ctrl + K3_DDR_ADDRMAP(8)); + writel(0x08080808, ctrl + K3_DDR_ADDRMAP(9)); + writel(0x08080808, ctrl + K3_DDR_ADDRMAP(10)); + writel(0x00000808, ctrl + K3_DDR_ADDRMAP(11)); + writel(addrmap12, ctrl + K3_DDR_ADDRMAP(12)); + + return 0; +} + +static int k3_lpddr5_controller_pre_train(struct k3_ddr *ddr, unsigned int channel) +{ + void __iomem *ctrl = ddr->ctrl[channel]; + int ret; + + writel(0x00000002, ctrl + K3_DDR_OPCTRL1); + writel(0xc0020002, ctrl + K3_DDR_INITTMG0); + writel(0x00000811, ctrl + K3_DDR_PWRCTL); + writel(0x00000800, ctrl + K3_DDR_PWRCTL); + writel(0x00000001, ctrl + K3_DDR_RFSHCTL0); + + setbits_le32(ddr->cfg[channel] + K3_DDR_CFG_CLK_CTRL, BIT(22)); + setbits_le32(ddr->cfg[channel] + K3_DDR_CFG_CLK_CTRL, BIT(1)); + + writel(0x80000000, ctrl + K3_DDR_ZQCTL0); + writel(0xc000012c, ctrl + 0x000005b4); + + k3_ddr_start_sw_done(ddr, channel); + writel(0x00000001, ctrl + K3_DDR_ZQCTL2); + ret = k3_ddr_wait_sw_done_ack(ddr, channel); + if (ret) + return ret; + + k3_ddr_start_sw_done(ddr, channel); + writel(0x00010014, ctrl + K3_DDR_DFIMISC); + ret = k3_ddr_wait_sw_done_ack(ddr, channel); + if (ret) + return ret; + + writel(0x00000000, ctrl + K3_DDR_RFSHCTL0); + + return 0; +} + +static int k3_lpddr5_ctrl_init(struct k3_ddr *ddr, unsigned int channel) +{ + int ret; + + ret = k3_ddr_clock_init(ddr, channel); + if (ret) + return ret; + + k3_lpddr5_configure_controller(ddr, channel); + k3_lpddr5_configure_parameters(ddr, channel); + k3_lpddr5_configure_ports(ddr, channel); + k3_ddr_configure_sar(ddr, channel); + + ret = k3_lpddr5_configure_addrmap(ddr, channel); + if (ret) + return ret; + + return k3_lpddr5_controller_pre_train(ddr, channel); +} + +static u16 k3_lpddr5_phy_io_value(bool x8, u32 csr, u16 value) +{ + const struct k3_ddr_io_para *io = &k3_ddr_lpddr5_io_para; + u32 reg_offset = csr & 0xfff; + u32 reg_base = csr & ~0xfff; + + if (reg_base >= 0x10000 && reg_base <= 0x13000) { + switch (reg_offset) { + case 0x40: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + return io->write_ds | (io->write_ds << 8); + } + } + + if ((reg_base == 0x30000 || reg_base == 0x31000) && + reg_offset >= 0x40 && reg_offset <= 0x43) + return io->write_ds | (io->write_ds << 8); + + if (reg_base >= 0x10000 && reg_base <= 0x13000) { + switch (reg_offset) { + case 0x48: + case 0x4a: + case 0x4b: + case 0x4c: + case 0x4d: + return io->rx_odt << 8; + } + } + + if (csr == K3_PHY_MB_MR3 || csr == K3_PHY_MB_MR3 + 1) + return io->pdds | (io->pdds << 8); + + if (csr == K3_PHY_MB_MR11 || csr == K3_PHY_MB_MR11 + 1) { + value = io->dq_odt | (io->ca_odt << 4); + value |= (io->nt_odt != K3_DDR_R_OFF) << 3; + return value | (value << 8); + } + + if (csr == K3_PHY_MB_MR17 || csr == K3_PHY_MB_MR17 + 1) { + value = BIT(3) | BIT(5); + value |= io->soc_odt | (io->soc_odt << 8); + value |= (x8 << 7) | (x8 << 15); + return value; + } + + if (csr == K3_PHY_MB_MR41 || csr == K3_PHY_MB_MR41 + 1) { + value = io->nt_odt << 5; + return value | (value << 8); + } + + /* Always enable 2D training (0) for supported LPDDR5 profiles. */ + if (csr == K3_PHY_MB_DISABLE_2D) + return 0; + + return value; +} + +static void k3_lpddr5_phy_write_cfg(struct k3_ddr *ddr, unsigned int channel, + const struct k3_ddr_phy_table *table, + const struct k3_ddr_phy_overrides *overrides) +{ + const struct k3_ddr_phy_override *regs = overrides->regs; + bool x8 = ddr->profile->device_width == 8; + const struct k3_ddr_phy_cfg *cfg; + const u16 *values; + u32 base, csr; + int i, j, k; + int count; + u16 value; + + for (i = 0; i < table->count; i++) { + cfg = &table->cfg[i]; + base = FIELD_GET(K3_DDR_PHY_CFG_ADDR, cfg->opaddr); + + if (FIELD_GET(K3_DDR_PHY_CFG_OP, cfg->opaddr) == K3_DDR_PHY_CFG_RANGE) { + values = cfg->range.values; + count = cfg->range.count; + } else { + values = &cfg->value; + count = 1; + } + + for (j = 0; j < count; j++) { + value = values[j]; + csr = base + j; + + for (k = 0; k < overrides->count; k++) { + if (regs[k].csr == csr) + break; + } + + if (k < overrides->count) { + if (regs[k].flags & K3_DDR_PHY_SKIP) + continue; + + value = regs[k].value; + } + + value = k3_lpddr5_phy_io_value(x8, csr, value); + + k3_phy_write(ddr, channel, csr, value); + } + } +} + +static int k3_lpddr5_phy_train(struct k3_ddr *ddr, unsigned int channel) +{ + const struct k3_ddr_profile *profile = ddr->profile; + struct k3_ddr_phy_overrides post = {}; + struct k3_ddr_phy_overrides pre = {}; + int ret; + + if (profile->device_width == 16) { + if (profile->ranks == 1) { + pre = k3_ddr_lpddr5_pre_srank_x16_overrides; + post = k3_ddr_lpddr5_post_srank_x16_overrides; + } else { + pre = k3_ddr_lpddr5_pre_drank_x16_overrides; + post = k3_ddr_lpddr5_post_drank_x16_overrides; + } + } + + k3_lpddr5_phy_write_cfg(ddr, channel, &k3_ddr_lpddr5_phy_init_table, &pre); + + ret = k3_ddr_phy_load_imem(ddr, channel); + if (ret) + return ret; + + k3_ddr_phy_zero_dmem(ddr, channel); + k3_lpddr5_phy_write_cfg(ddr, channel, &k3_ddr_lpddr5_pre_train_table, &pre); + + setbits_le32(ddr->ctrl[channel] + K3_DDR_PWRCTL, BIT(11)); + + k3_ddr_phy_start_pmu(ddr, channel); + ret = k3_ddr_phy_wait_training(ddr, channel); + k3_ddr_phy_halt_pmu(ddr, channel); + if (ret) + return ret; + + k3_lpddr5_phy_write_cfg(ddr, channel, &k3_ddr_lpddr5_post_train_table, &post); + + return 0; +} + +static int k3_lpddr5_ctrl_enable(struct k3_ddr *ddr, unsigned int channel) +{ + void __iomem *ctrl = ddr->ctrl[channel]; + int port, ret; + u32 value; + + k3_ddr_start_sw_done(ddr, channel); + writel(0x00010034, ctrl + K3_DDR_DFIMISC); + ret = k3_ddr_wait_sw_done_ack(ddr, channel); + if (ret) + return ret; + + ret = readl_poll_timeout(ctrl + K3_DDR_DFISTAT, value, value & BIT(0), + K3_DDR_REG_TIMEOUT_US); + if (ret) + return ret; + + k3_ddr_start_sw_done(ddr, channel); + writel(0x00010015, ctrl + K3_DDR_DFIMISC); + ret = k3_ddr_wait_sw_done_ack(ddr, channel); + if (ret) + return ret; + + writel(0, ctrl + K3_DDR_PWRCTL); + + ret = readl_poll_timeout(ctrl + K3_DDR_STAT, value, (value & GENMASK(1, 0)) == 1, + K3_DDR_REG_TIMEOUT_US); + if (ret) + return ret; + + k3_ddr_start_sw_done(ddr, channel); + writel(0xc0000000, ctrl + K3_DDR_DFIUPD0); + ret = k3_ddr_wait_sw_done_ack(ddr, channel); + if (ret) + return ret; + + writel(0, ctrl + K3_DDR_ZQCTL0); + + k3_ddr_start_sw_done(ddr, channel); + writel(0, ctrl + K3_DDR_ZQCTL2); + ret = k3_ddr_wait_sw_done_ack(ddr, channel); + if (ret) + return ret; + + writel(0, ctrl + K3_DDR_RFSHCTL0); + writel(0x10, ctrl + K3_DDR_PWRCTL); + writel(0xe000012c, ctrl + 0x5b4); + writel(0, ctrl + K3_DDR_OPCTRL1); + + for (port = 0; port < 5; port++) + writel(1, ctrl + 0x20090 + port * 0x1000); + + return 0; +} + +int k3_ddr_lpddr5_init(struct k3_ddr *ddr) +{ + unsigned int channel; + int ret; + + for (channel = 0; channel < K3_DDR_NUM_CHANNELS; channel++) { + ret = k3_lpddr5_ctrl_init(ddr, channel); + if (ret) { + dev_err(ddr->dev, "channel %u controller init failed: %d\n", channel, ret); + return ret; + } + + ret = k3_lpddr5_phy_train(ddr, channel); + if (ret) { + dev_err(ddr->dev, "channel %u PHY training failed: %d\n", channel, ret); + return ret; + } + + ret = k3_lpddr5_ctrl_enable(ddr, channel); + if (ret) { + dev_err(ddr->dev, "channel %u controller enable failed: %d\n", + channel, ret); + return ret; + } + } + + return 0; +} diff --git a/drivers/ram/spacemit/k3/k3_ddr_lpddr5_tables.c b/drivers/ram/spacemit/k3/k3_ddr_lpddr5_tables.c new file mode 100644 index 00000000000..b096c7050d0 --- /dev/null +++ b/drivers/ram/spacemit/k3/k3_ddr_lpddr5_tables.c @@ -0,0 +1,1668 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (C) 2025 SpacemiT + * Copyright (C) 2026 Junhui Liu <[email protected]> + */ + +#include <linux/kernel.h> + +#include "k3_ddr.h" + +static const struct k3_ddr_phy_cfg lp5_phy_init_cfg[] = { + K3_DDR_PHY_WRITE_SINGLE(0x20060, 0x0002), + K3_DDR_PHY_WRITE_SINGLE(0x200a5, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0xd0036, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x200bd, 0x00ff), + K3_DDR_PHY_WRITE_SINGLE(0x20300, 0x0808), + K3_DDR_PHY_WRITE_SINGLE(0x20303, 0x0009), + K3_DDR_PHY_WRITE_SINGLE(0x20302, 0x0026), + K3_DDR_PHY_WRITE_SINGLE(0x20328, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x20301, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x2030b, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x300a7, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x310a7, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x300ae, 0x0080), + K3_DDR_PHY_WRITE_SINGLE(0x300ad, 0x0080), + K3_DDR_PHY_WRITE_SINGLE(0x300ac, 0x0080), + K3_DDR_PHY_WRITE_SINGLE(0x310ae, 0x0080), + K3_DDR_PHY_WRITE_SINGLE(0x310ad, 0x0080), + K3_DDR_PHY_WRITE_SINGLE(0x310ac, 0x0080), + K3_DDR_PHY_WRITE_SINGLE(0xc0086, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x2011b, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x100a3, 0x0b33), + K3_DDR_PHY_WRITE_SINGLE(0x110a3, 0x0b33), + K3_DDR_PHY_WRITE_SINGLE(0x120a3, 0x0b33), + K3_DDR_PHY_WRITE_SINGLE(0x130a3, 0x0b33), + K3_DDR_PHY_WRITE_SINGLE(0xc00f1, 0x6000), + K3_DDR_PHY_WRITE_SINGLE(0xc00f2, 0x00a9), + K3_DDR_PHY_WRITE_SINGLE(0xc00f3, 0x8000), + K3_DDR_PHY_WRITE_SINGLE(0xc00f4, 0x0005), + K3_DDR_PHY_WRITE_SINGLE(0xc00f5, 0x4000), + K3_DDR_PHY_WRITE_SINGLE(0xc00f6, 0x0002), + K3_DDR_PHY_WRITE_SINGLE(0xc00f7, 0xf000), + K3_DDR_PHY_WRITE_SINGLE(0xc00f9, 0x6000), + K3_DDR_PHY_WRITE_SINGLE(0xc00fa, 0x00a9), + K3_DDR_PHY_WRITE_SINGLE(0xc00fb, 0x8000), + K3_DDR_PHY_WRITE_SINGLE(0xc00fd, 0x4000), + K3_DDR_PHY_WRITE_SINGLE(0xc00ff, 0xf000), + K3_DDR_PHY_WRITE_SINGLE(0x908ff, 0x000f), + K3_DDR_PHY_WRITE_SINGLE(0x10093, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x11093, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x12093, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x13093, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x20051, 0x0003), +}; + +const struct k3_ddr_phy_table k3_ddr_lpddr5_phy_init_table = { + .cfg = lp5_phy_init_cfg, + .count = ARRAY_SIZE(lp5_phy_init_cfg), +}; + +static const u16 lp5_pre_training_table_54[] = { + 0x0100, 0x0000, 0x0030, 0x1900, 0x0004, 0x0004, 0x0000, 0x0000, + 0x125f, 0x0004, 0x0000, 0x0001, 0x0000, 0x8b00, 0x000f, 0x0000, + 0x0000, 0x0000, 0x0310, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, + 0x0003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb0b0, 0xb0b0, 0xbbbb, + 0xbbbb, 0x0606, 0x0606, 0x5858, 0x5858, 0x3434, 0x3434, 0x2727, + 0x2727, 0x0000, 0x0000, 0x2828, 0x2828, 0x2828, 0x2828, 0x0000, + 0x0000, 0x2e2e, 0x2e2e, 0x0d0d, 0x0d0d, 0x0000, 0x0000, 0x0202, + 0x0202, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4040, 0x4040, 0x4040, 0x4040, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x002e, 0x0050, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0001, 0x4b00, 0x0043, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0500, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x6745, 0x00f2, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0e0c, 0x180f, + 0x001e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1210, 0x0201, 0x1403, 0x1c0a, 0x2e29, 0x0b11, 0x150d, 0x1916, + 0x0e0c, 0x180f, 0x131e, 0x0000, 0x0000, 0x0003, 0x0000, 0x0001, + 0x0000, 0x0002, 0x0000, 0x0009, 0x0006, 0x0008, 0x0002, 0x0005, + 0x0024, 0x0010, 0x0026, 0x0012, 0x004e, 0x0050, 0x0012, 0x0186, + 0x0187, 0x000a, 0x0017, 0x0015, 0x004e, 0x000d, 0x006e, 0x0002, + 0x0001, 0x0060, 0x0007, 0x0000, 0x0011, 0x0007, 0x0000, 0x005a, + 0x002a, 0x0060, 0x005e, 0x0028, 0x005c, 0x0062, 0x0020, 0x0064, + 0x0066, 0x000c, 0x00d9, 0x00af, 0x00ad, 0x0000, 0x0015, 0x0016, + 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0005, 0x000b, 0x0007, + 0x0028, 0x0215, 0x000a, 0x0085, 0x0004, 0x0004, 0x0001, 0x0001, + 0x0001, 0x0003, 0x0004, 0x0215, 0x042b, 0x0085, 0x010b, 0x0004, + 0x0006, 0x0000, 0x0002, 0x0002, 0x0003, 0x0005, 0x042b, 0x0640, + 0x010b, 0x0190, 0x0006, 0x0008, 0x0001, 0x0003, 0x0002, 0x0004, + 0x0006, 0x0640, 0x0855, 0x0190, 0x0215, 0x0008, 0x000a, 0x0002, + 0x0004, 0x0003, 0x0004, 0x0007, 0x0855, 0x0abe, 0x0215, 0x02b0, + 0x0008, 0x000e, 0x0001, 0x0007, 0x0004, 0x0004, 0x0008, 0x0abe, + 0x0c80, 0x02b0, 0x0320, 0x000a, 0x0010, 0x0003, 0x0009, 0x0004, + 0x0004, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0028, 0x0215, 0x0005, 0x0043, + 0x0002, 0x0002, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0215, + 0x042b, 0x0043, 0x0085, 0x0002, 0x0003, 0x0000, 0x0001, 0x0001, + 0x0002, 0x0003, 0x042b, 0x0640, 0x0085, 0x00c8, 0x0003, 0x0004, + 0x0001, 0x0002, 0x0001, 0x0002, 0x0003, 0x0640, 0x0855, 0x00c8, + 0x010b, 0x0004, 0x0005, 0x0001, 0x0002, 0x0002, 0x0002, 0x0004, + 0x0855, 0x0abe, 0x010b, 0x0158, 0x0004, 0x0007, 0x0001, 0x0004, + 0x0002, 0x0002, 0x0004, 0x0abe, 0x0c80, 0x0158, 0x0190, 0x0005, + 0x0008, 0x0002, 0x0005, 0x0002, 0x0002, 0x0004, 0x0c80, 0x0e95, + 0x0190, 0x01d3, 0x0006, 0x0009, 0x0002, 0x0005, 0x0003, 0x0002, + 0x0005, 0x0e95, 0x10ab, 0x01d3, 0x0215, 0x0006, 0x000b, 0x0002, + 0x0007, 0x0003, 0x0002, 0x0005, 0x10ab, 0x12c0, 0x0215, 0x0258, + 0x0007, 0x000c, 0x0003, 0x0008, 0x0003, 0x0002, 0x0005, 0x12c0, + 0x157c, 0x0258, 0x02b0, 0x0008, 0x000e, 0x0003, 0x0009, 0x0004, + 0x0002, 0x0006, 0x157c, 0x1770, 0x02b0, 0x02ee, 0x0009, 0x000f, + 0x0004, 0x000a, 0x0004, 0x0002, 0x0006, 0x1770, 0x1900, 0x02ee, + 0x0320, 0x0009, 0x0010, 0x0004, 0x000b, 0x0004, 0x0002, 0x0006, + 0x0028, 0x0215, 0x000a, 0x0085, 0x0006, 0x0006, 0x0006, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0006, 0x0007, 0x0215, 0x042b, 0x0085, + 0x010b, 0x0008, 0x0008, 0x0008, 0x0000, 0x0000, 0x0000, 0x0002, + 0x0007, 0x0009, 0x042b, 0x0640, 0x010b, 0x0190, 0x000a, 0x000a, + 0x000c, 0x0001, 0x0001, 0x0003, 0x0002, 0x0008, 0x000a, 0x0640, + 0x0855, 0x0190, 0x0215, 0x000c, 0x000e, 0x000e, 0x0002, 0x0004, + 0x0004, 0x0003, 0x0008, 0x000b, 0x0855, 0x0abe, 0x0215, 0x02b0, + 0x0010, 0x0010, 0x0012, 0x0003, 0x0003, 0x0005, 0x0004, 0x000a, + 0x000e, 0x0abe, 0x0c80, 0x02b0, 0x0320, 0x0012, 0x0014, 0x0014, + 0x0005, 0x0007, 0x0007, 0x0004, 0x000a, 0x000e, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0028, 0x0215, 0x0005, 0x0043, + 0x0003, 0x0003, 0x0003, 0x0000, 0x0000, 0x0000, 0x0001, 0x0003, + 0x0004, 0x0215, 0x042b, 0x0043, 0x0085, 0x0004, 0x0004, 0x0004, + 0x0000, 0x0000, 0x0000, 0x0001, 0x0004, 0x0005, 0x042b, 0x0640, + 0x0085, 0x00c8, 0x0005, 0x0005, 0x0005, 0x0001, 0x0001, 0x0002, + 0x0001, 0x0004, 0x0005, 0x0640, 0x0855, 0x00c8, 0x010b, 0x0006, + 0x0007, 0x0007, 0x0001, 0x0002, 0x0002, 0x0002, 0x0004, 0x0006, + 0x0855, 0x0abe, 0x010b, 0x0158, 0x0008, 0x0008, 0x0009, 0x0002, + 0x0002, 0x0003, 0x0002, 0x0005, 0x0007, 0x0abe, 0x0c80, 0x0158, + 0x0190, 0x0009, 0x000a, 0x000a, 0x0003, 0x0004, 0x0004, 0x0002, + 0x0005, 0x0007, 0x0c80, 0x0e95, 0x0190, 0x01d3, 0x000a, 0x000b, + 0x000c, 0x0003, 0x0004, 0x0005, 0x0003, 0x0005, 0x0008, 0x0e95, + 0x10ab, 0x01d3, 0x0215, 0x000c, 0x000d, 0x000e, 0x0004, 0x0005, + 0x0006, 0x0003, 0x0006, 0x0009, 0x10ab, 0x12c0, 0x0215, 0x0258, + 0x000d, 0x000e, 0x000f, 0x0005, 0x0006, 0x0007, 0x0003, 0x0006, + 0x0009, 0x12c0, 0x157c, 0x0258, 0x02b0, 0x000f, 0x0010, 0x0011, + 0x0006, 0x0007, 0x0008, 0x0004, 0x0006, 0x000a, 0x157c, 0x1770, + 0x02b0, 0x02ee, 0x0010, 0x0011, 0x0013, 0x0006, 0x0007, 0x0009, + 0x0004, 0x0007, 0x000b, 0x1770, 0x1900, 0x02ee, 0x0320, 0x0011, + 0x0012, 0x0014, 0x0007, 0x0008, 0x000a, 0x0004, 0x0007, 0x000b, + 0x0607, 0x0405, 0x0203, 0x0001, 0x0a09, 0x0c0b, 0x0e0d, 0x000f, + 0x008b, 0x0001, +}; + +static const struct k3_ddr_phy_cfg lp5_pre_train_cfg[] = { + K3_DDR_PHY_WRITE_SINGLE(0x90802, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x2004c, 0x2e8f), + K3_DDR_PHY_WRITE_SINGLE(0x2004d, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x20002, 0x0002), + K3_DDR_PHY_WRITE_SINGLE(0x20000, 0x0002), + K3_DDR_PHY_WRITE_SINGLE(0x90801, 0x004d), + K3_DDR_PHY_WRITE_SINGLE(0x90809, 0x7000), + K3_DDR_PHY_WRITE_SINGLE(0x1005e, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x10060, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x10062, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x10064, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x1005f, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x10061, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x10063, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x10065, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x1105e, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x11060, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x11062, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x11064, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x1105f, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x11061, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x11063, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x11065, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x1205e, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x12060, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x12062, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x12064, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x1205f, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x12061, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x12063, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x12065, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x1305e, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x13060, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x13062, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x13064, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x1305f, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x13061, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x13063, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x13065, 0x0366), + K3_DDR_PHY_WRITE_SINGLE(0x10005, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x1000b, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x11005, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x1100b, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x12005, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x1200b, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x13005, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x1300b, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x20007, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x20013, 0x002c), + K3_DDR_PHY_WRITE_SINGLE(0x30038, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x30039, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x3003a, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x31038, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x31039, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x3103a, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x10038, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x1003a, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x11038, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x1103a, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x12038, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x1203a, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x13038, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x1303a, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x1003b, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x1103b, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x1203b, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x1303b, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x10009, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x10037, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x11009, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x11037, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x12009, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x12037, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x13009, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x13037, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x10004, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x10003, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x11004, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x11003, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x12004, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x12003, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x13004, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x13003, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x20004, 0x0320), + K3_DDR_PHY_WRITE_SINGLE(0x30050, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x30051, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x30052, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x30053, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x31050, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x31051, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x31052, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x31053, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1004e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1004f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x10050, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x10051, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1014e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1014f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x10150, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x10151, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1024e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1024f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x10250, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x10251, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1034e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1034f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x10350, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x10351, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1044e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1044f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x10450, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x10451, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1054e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1054f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x10550, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x10551, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1064e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1064f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x10650, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x10651, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1074e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1074f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x10750, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x10751, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1084e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1084f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x10850, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x10851, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1104e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1104f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x11050, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x11051, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1114e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1114f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x11150, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x11151, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1124e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1124f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x11250, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x11251, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1134e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1134f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x11350, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x11351, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1144e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1144f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x11450, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x11451, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1154e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1154f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x11550, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x11551, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1164e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1164f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x11650, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x11651, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1174e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1174f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x11750, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x11751, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1184e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1184f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x11850, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x11851, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1204e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1204f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x12050, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x12051, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1214e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1214f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x12150, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x12151, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1224e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1224f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x12250, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x12251, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1234e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1234f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x12350, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x12351, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1244e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1244f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x12450, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x12451, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1254e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1254f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x12550, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x12551, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1264e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1264f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x12650, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x12651, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1274e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1274f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x12750, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x12751, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1284e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1284f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x12850, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x12851, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1304e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1304f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x13050, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x13051, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1314e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1314f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x13150, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x13151, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1324e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1324f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x13250, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x13251, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1334e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1334f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x13350, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x13351, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1344e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1344f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x13450, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x13451, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1354e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1354f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x13550, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x13551, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1364e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1364f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x13650, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x13651, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1374e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1374f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x13750, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x13751, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1384e, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x1384f, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x13850, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x13851, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x30030, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x30031, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x30035, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x31030, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x31031, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x31035, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x10030, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x10035, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x10036, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x11030, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x11035, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x11036, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x12030, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x12035, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x12036, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x13030, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x13035, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x13036, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x3003c, 0x0005), + K3_DDR_PHY_WRITE_SINGLE(0x3103c, 0x0005), + K3_DDR_PHY_WRITE_SINGLE(0x1003c, 0x0005), + K3_DDR_PHY_WRITE_SINGLE(0x1003d, 0x0005), + K3_DDR_PHY_WRITE_SINGLE(0x1003e, 0x0005), + K3_DDR_PHY_WRITE_SINGLE(0x1103c, 0x0005), + K3_DDR_PHY_WRITE_SINGLE(0x1103d, 0x0005), + K3_DDR_PHY_WRITE_SINGLE(0x1103e, 0x0005), + K3_DDR_PHY_WRITE_SINGLE(0x1203c, 0x0005), + K3_DDR_PHY_WRITE_SINGLE(0x1203d, 0x0005), + K3_DDR_PHY_WRITE_SINGLE(0x1203e, 0x0005), + K3_DDR_PHY_WRITE_SINGLE(0x1303c, 0x0005), + K3_DDR_PHY_WRITE_SINGLE(0x1303d, 0x0005), + K3_DDR_PHY_WRITE_SINGLE(0x1303e, 0x0005), + K3_DDR_PHY_WRITE_SINGLE(0x20003, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x20001, 0x1122), + K3_DDR_PHY_WRITE_SINGLE(0x20009, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x20008, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x200d9, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x30eef, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x31eef, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x20014, 0x1300), + K3_DDR_PHY_WRITE_SINGLE(0x9080a, 0x1300), + K3_DDR_PHY_WRITE_SINGLE(0x10040, 0x0c0c), + K3_DDR_PHY_WRITE_SINGLE(0x10042, 0x0c0c), + K3_DDR_PHY_WRITE_SINGLE(0x9080d, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x10043, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x10044, 0x0c0c), + K3_DDR_PHY_WRITE_SINGLE(0x10045, 0x0c0c), + K3_DDR_PHY_WRITE_SINGLE(0x11040, 0x0c0c), + K3_DDR_PHY_WRITE_SINGLE(0x11042, 0x0c0c), + K3_DDR_PHY_WRITE_SINGLE(0x9080d, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x11043, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x11044, 0x0c0c), + K3_DDR_PHY_WRITE_SINGLE(0x11045, 0x0c0c), + K3_DDR_PHY_WRITE_SINGLE(0x12040, 0x0c0c), + K3_DDR_PHY_WRITE_SINGLE(0x12042, 0x0c0c), + K3_DDR_PHY_WRITE_SINGLE(0x9080d, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x12043, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x12044, 0x0c0c), + K3_DDR_PHY_WRITE_SINGLE(0x12045, 0x0c0c), + K3_DDR_PHY_WRITE_SINGLE(0x13040, 0x0c0c), + K3_DDR_PHY_WRITE_SINGLE(0x13042, 0x0c0c), + K3_DDR_PHY_WRITE_SINGLE(0x9080d, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x13043, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x13044, 0x0c0c), + K3_DDR_PHY_WRITE_SINGLE(0x13045, 0x0c0c), + K3_DDR_PHY_WRITE_SINGLE(0x30040, 0x0e0e), + K3_DDR_PHY_WRITE_SINGLE(0x30041, 0x0e0e), + K3_DDR_PHY_WRITE_SINGLE(0x30042, 0x0e0e), + K3_DDR_PHY_WRITE_SINGLE(0x30043, 0x0e0e), + K3_DDR_PHY_WRITE_SINGLE(0x30330, 0x0033), + K3_DDR_PHY_WRITE_SINGLE(0x31040, 0x0e0e), + K3_DDR_PHY_WRITE_SINGLE(0x31041, 0x0e0e), + K3_DDR_PHY_WRITE_SINGLE(0x31042, 0x0e0e), + K3_DDR_PHY_WRITE_SINGLE(0x31043, 0x0e0e), + K3_DDR_PHY_WRITE_SINGLE(0x31330, 0x0033), + K3_DDR_PHY_WRITE_SINGLE(0x20331, 0x0033), + K3_DDR_PHY_WRITE_SINGLE(0x10048, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x1004a, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x1004b, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x1004c, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x1004d, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x11048, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x1104a, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x1104b, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x1104c, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x1104d, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x12048, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x1204a, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x1204b, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x1204c, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x1204d, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x13048, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x1304a, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x1304b, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x1304c, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x1304d, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x30048, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x30049, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x3004a, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x3004b, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x31048, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x31049, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x3104a, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x3104b, 0x0c00), + K3_DDR_PHY_WRITE_SINGLE(0x30033, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x30034, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x3002e, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x31033, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x31034, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x3102e, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x10033, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x1002e, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x1002f, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x11033, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x1102e, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x1102f, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x12033, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x1202e, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x1202f, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x13033, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x1302e, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x1302f, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x20015, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x90806, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x100e8, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x100e9, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x110e8, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x110e9, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x120e8, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x120e9, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x130e8, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x130e9, 0x0035), + K3_DDR_PHY_WRITE_SINGLE(0x10001, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x11001, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x12001, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x13001, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x20012, 0xa1a1), + K3_DDR_PHY_WRITE_SINGLE(0x20017, 0x0040), + K3_DDR_PHY_WRITE_SINGLE(0x2000a, 0x0040), + K3_DDR_PHY_WRITE_SINGLE(0x20186, 0x00a1), + K3_DDR_PHY_WRITE_SINGLE(0x20187, 0x0040), + K3_DDR_PHY_WRITE_SINGLE(0x20010, 0x005a), + K3_DDR_PHY_WRITE_SINGLE(0x20011, 0x006f), + K3_DDR_PHY_WRITE_SINGLE(0x9080b, 0x002f), + K3_DDR_PHY_WRITE_SINGLE(0x9080c, 0x006f), + K3_DDR_PHY_WRITE_SINGLE(0x100a5, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x110a5, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x120a5, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x130a5, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x10014, 0x3232), + K3_DDR_PHY_WRITE_SINGLE(0x11014, 0x3232), + K3_DDR_PHY_WRITE_SINGLE(0x12014, 0x3232), + K3_DDR_PHY_WRITE_SINGLE(0x13014, 0x3232), + K3_DDR_PHY_WRITE_SINGLE(0x1000f, 0x1086), + K3_DDR_PHY_WRITE_SINGLE(0x1100f, 0x1086), + K3_DDR_PHY_WRITE_SINGLE(0x1200f, 0x1086), + K3_DDR_PHY_WRITE_SINGLE(0x1300f, 0x1086), + K3_DDR_PHY_WRITE_SINGLE(0x20035, 0x100c), + K3_DDR_PHY_WRITE_SINGLE(0x20036, 0x100c), + K3_DDR_PHY_WRITE_SINGLE(0x20037, 0x041c), + K3_DDR_PHY_WRITE_SINGLE(0x20037, 0x045c), + K3_DDR_PHY_WRITE_SINGLE(0x20038, 0x1b20), + K3_DDR_PHY_WRITE_SINGLE(0x20039, 0x101c), + K3_DDR_PHY_WRITE_SINGLE(0x2003a, 0x101c), + K3_DDR_PHY_WRITE_SINGLE(0x2003b, 0x042c), + K3_DDR_PHY_WRITE_SINGLE(0x2003c, 0x2f30), + K3_DDR_PHY_WRITE_SINGLE(0x2003d, 0x1004), + K3_DDR_PHY_WRITE_SINGLE(0x2003e, 0x1004), + K3_DDR_PHY_WRITE_SINGLE(0x2003f, 0x0414), + K3_DDR_PHY_WRITE_SINGLE(0x20040, 0x1318), + K3_DDR_PHY_WRITE_SINGLE(0x2002c, 0x0843), + K3_DDR_PHY_WRITE_SINGLE(0x2002d, 0x0843), + K3_DDR_PHY_WRITE_SINGLE(0x20030, 0x0843), + K3_DDR_PHY_WRITE_SINGLE(0x2002e, 0x081f), + K3_DDR_PHY_WRITE_SINGLE(0x2002f, 0x081f), + K3_DDR_PHY_WRITE_SINGLE(0x2000c, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x2001b, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x10007, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x11007, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x12007, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x13007, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0xc0080, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0xd0000, 0x0000), + K3_DDR_PHY_WRITE_RANGE(K3_PHY_PMU_DMEM_BASE, lp5_pre_training_table_54), +}; + +const struct k3_ddr_phy_table k3_ddr_lpddr5_pre_train_table = { + .cfg = lp5_pre_train_cfg, + .count = ARRAY_SIZE(lp5_pre_train_cfg), +}; + +static const struct k3_ddr_phy_override lp5_pre_srank_x16_override[] = { + {0x300ae, 0x0280, 0}, + {0x300ad, 0x0280, 0}, + {0x300ac, 0x0280, 0}, + {0x310ae, 0x0280, 0}, + {0x310ad, 0x0280, 0}, + {0x310ac, 0x0280, 0}, + {0x100a3, 0x0911, 0}, + {0x110a3, 0x091d, 0}, + {0x120a3, 0x0911, 0}, + {0x130a3, 0x091d, 0}, + {0x1005f, 0, K3_DDR_PHY_SKIP}, + {0x10061, 0, K3_DDR_PHY_SKIP}, + {0x10063, 0, K3_DDR_PHY_SKIP}, + {0x10065, 0, K3_DDR_PHY_SKIP}, + {0x1105f, 0, K3_DDR_PHY_SKIP}, + {0x11061, 0, K3_DDR_PHY_SKIP}, + {0x11063, 0, K3_DDR_PHY_SKIP}, + {0x11065, 0, K3_DDR_PHY_SKIP}, + {0x1205f, 0, K3_DDR_PHY_SKIP}, + {0x12061, 0, K3_DDR_PHY_SKIP}, + {0x12063, 0, K3_DDR_PHY_SKIP}, + {0x12065, 0, K3_DDR_PHY_SKIP}, + {0x1305f, 0, K3_DDR_PHY_SKIP}, + {0x13061, 0, K3_DDR_PHY_SKIP}, + {0x13063, 0, K3_DDR_PHY_SKIP}, + {0x13065, 0, K3_DDR_PHY_SKIP}, + {0x20039, 0x1018, 0}, + {0x2003a, 0x1018, 0}, + {0x2003b, 0x0428, 0}, + {0x2003c, 0x2f2c, 0}, + {0x2002c, 0x083f, 0}, + {0x2002d, 0x083f, 0}, + {0x20030, 0x083f, 0}, + {0x5800e, 0x0000, 0}, + {0x58012, 0x0110, 0}, + {0x58020, 0x0001, 0}, + {0x58081, 0x4300, 0}, + {0x58082, 0x003f, 0}, +}; + +const struct k3_ddr_phy_overrides k3_ddr_lpddr5_pre_srank_x16_overrides = { + .regs = lp5_pre_srank_x16_override, + .count = ARRAY_SIZE(lp5_pre_srank_x16_override), +}; + +static const struct k3_ddr_phy_override lp5_pre_drank_x16_override[] = { + {0x110a3, 0x0b3f, 0}, + {0x130a3, 0x0b3f, 0}, + {0x20039, 0x1018, 0}, + {0x2003a, 0x1018, 0}, + {0x2003b, 0x0428, 0}, + {0x2003c, 0x2f2c, 0}, + {0x2002c, 0x083f, 0}, + {0x2002d, 0x083f, 0}, + {0x20030, 0x083f, 0}, + {0x5800e, 0x0000, 0}, + {0x58081, 0x4300, 0}, + {0x58082, 0x003f, 0}, +}; + +const struct k3_ddr_phy_overrides k3_ddr_lpddr5_pre_drank_x16_overrides = { + .regs = lp5_pre_drank_x16_override, + .count = ARRAY_SIZE(lp5_pre_drank_x16_override), +}; + +static const u16 lp5_post_training_table_2[] = { + 0xc9d8, 0x0000, 0x0000, 0x0000, 0xc008, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc958, 0x0000, 0x0000, 0x0000, 0xc688, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc0d8, 0x0000, 0x0000, 0x0000, 0xd848, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc158, 0x0000, 0x0000, 0x0000, 0xddc8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc1d8, 0x0000, 0x0000, 0x0000, 0xc308, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc558, 0x0000, 0x0000, 0x0000, 0xec08, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc5d8, 0x0000, 0x0000, 0x0000, 0xda08, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x48d8, 0x0000, 0x0000, 0x0000, 0x5708, 0x0000, 0x0000, 0x0000, + 0x88d8, 0x0000, 0x0000, 0x0000, 0x9708, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xca58, 0x0000, 0x0000, 0x0000, 0xc108, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xcb58, 0x0000, 0x0000, 0x0000, 0xc008, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xd4d8, 0x0000, 0x0000, 0x0000, 0xc008, 0x0000, 0x0000, 0x0000, +}; + +static const u16 lp5_post_training_table_16[] = { + 0xc028, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc858, 0x0000, 0x0000, 0x0010, 0xe088, 0x0000, 0x0000, 0x0010, + 0xe038, 0x0000, 0x0000, 0x0010, 0xc858, 0x0000, 0x0000, 0x0010, + 0xc088, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc028, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc858, 0x0000, 0x0000, 0x0010, 0xe208, 0x0000, 0x0000, 0x0010, + 0xe038, 0x0000, 0x0000, 0x0010, 0xc858, 0x0000, 0x0000, 0x0010, + 0xc208, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0xce58, 0x0000, 0x0000, 0x0010, 0xc208, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc370, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc040, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0010, + 0xd2d8, 0x0000, 0x0000, 0x0010, 0xe008, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x5b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc0f0, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0xcfd8, 0x0000, 0x0000, 0x0010, 0xc008, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xd058, 0x0000, 0x0000, 0x0010, 0xc008, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xd0d8, 0x0000, 0x0000, 0x0010, 0xc088, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xd158, 0x0000, 0x0000, 0x0010, 0xc008, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x5b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x402c, 0x0d00, 0x0001, 0x0400, 0x4050, 0x0800, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0400, 0x4050, 0x0803, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7f00, 0x0000, 0x0000, 0x0000, 0x0400, + 0x407c, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0001, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x802c, 0x0d00, 0x0001, 0x0410, 0x8050, 0x0800, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0400, 0x8050, 0x0803, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x7f00, 0x0000, 0x0000, 0x0000, 0x0400, + 0x807c, 0x0000, 0x0000, 0x0410, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0001, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x402c, 0x0d00, 0x0001, 0x0000, 0x4050, 0x0800, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4050, 0x0803, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4050, 0x0800, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6b00, 0x0000, 0x0000, 0x0000, 0x0400, + 0x0000, 0x0000, 0x0000, 0x0000, 0x407c, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4b00, 0x0000, 0x0000, 0x0000, 0x1800, + 0x0000, 0x0000, 0x0000, 0x0000, 0x802c, 0x0d00, 0x0001, 0x0010, + 0x8050, 0x0800, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8050, 0x0803, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8050, 0x0800, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6b00, 0x0000, 0x0000, 0x0000, 0x0400, + 0x807c, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7b00, 0x0000, 0x0000, 0x0000, 0x2000, + 0x402c, 0x0d00, 0x0001, 0x0000, 0x5198, 0x0803, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5218, 0x0803, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6b00, 0x0000, 0x0000, 0x0000, 0x0400, + 0x407c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x802c, 0x0d00, 0x0001, 0x0010, + 0x9198, 0x0803, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x9218, 0x0803, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x6b00, 0x0000, 0x0000, 0x0000, 0x0400, + 0x0000, 0x0000, 0x0000, 0x0000, 0x807c, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0b00, 0x0000, 0x0000, 0x0000, 0x0400, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x401c, 0x00d0, 0x0001, 0x0000, 0x4060, 0x0084, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0b00, 0x0000, 0x0000, 0x0000, 0x0800, + 0x407c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0001, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x402c, 0x0d00, 0x0001, 0x0000, + 0x4020, 0x0803, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0800, + 0x0000, 0x0000, 0x0000, 0x0000, 0x407c, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x801c, 0x00d0, 0x0001, 0x0010, 0x8060, 0x0084, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x0b00, 0x0000, 0x0000, 0x0000, 0x0800, + 0x807c, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0001, 0x0010, + 0x0000, 0x0000, 0x0000, 0x0000, 0x802c, 0x0d00, 0x0001, 0x0010, + 0x8020, 0x0803, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0800, + 0x0000, 0x0000, 0x0000, 0x0000, 0x807c, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x402c, 0x0d00, 0x0001, 0x0000, 0x4050, 0x0803, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4050, 0x0803, 0x0000, 0x5a00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4050, 0x0803, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6b00, 0x0000, 0x0000, 0x0000, 0x0400, + 0x407c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, + 0x5758, 0x0000, 0x0000, 0x0000, 0x4208, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x401c, 0x00d0, 0x0001, 0x0000, + 0x4060, 0x0084, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x407c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0001, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x402c, 0x0d00, 0x0001, 0x0000, + 0x4020, 0x0803, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0800, + 0x0000, 0x0000, 0x0000, 0x0000, 0x407c, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5758, 0x0000, 0x0000, 0x0000, 0x4008, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x802c, 0x0d00, 0x0001, 0x0010, 0x8050, 0x0803, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x1b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8050, 0x0803, 0x0000, 0x5a10, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8050, 0x0803, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6b00, 0x0000, 0x0000, 0x0000, 0x0400, + 0x807c, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, + 0x9758, 0x0000, 0x0000, 0x0010, 0x8208, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x4b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x801c, 0x00d0, 0x0001, 0x0010, + 0x8060, 0x0084, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x807c, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0001, 0x0010, + 0x0000, 0x0000, 0x0000, 0x0000, 0x802c, 0x0d00, 0x0001, 0x0010, + 0x8020, 0x0803, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0800, + 0x0000, 0x0000, 0x0000, 0x0000, 0x807c, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8000, 0x0000, 0x0001, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x9758, 0x0000, 0x0000, 0x0010, 0x8008, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc068, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0xd2d8, 0x0000, 0x0000, 0x0010, 0xe008, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x5b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc0f0, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0xcfd8, 0x0000, 0x0000, 0x0010, 0xc008, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xd058, 0x0000, 0x0000, 0x0010, 0xc008, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xd0d8, 0x0000, 0x0000, 0x0010, 0xc088, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xd158, 0x0000, 0x0000, 0x0010, 0xc008, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x5b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x402c, 0x0d00, 0x0001, 0x0400, 0x4050, 0x0800, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0400, 0x4050, 0x0803, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6f00, 0x0000, 0x0000, 0x0000, 0x0400, + 0x407c, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0001, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x802c, 0x0d00, 0x0001, 0x0410, 0x8050, 0x0800, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x0400, 0x8050, 0x0803, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x6f00, 0x0000, 0x0000, 0x0000, 0x0400, + 0x807c, 0x0000, 0x0000, 0x0410, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0001, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x402c, 0x0d00, 0x0001, 0x0000, 0x4050, 0x0800, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4050, 0x0803, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4050, 0x0800, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4b00, 0x0000, 0x0000, 0x0000, 0x0400, + 0x0000, 0x0000, 0x0000, 0x0000, 0x407c, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4b00, 0x0000, 0x0000, 0x0000, 0x1800, + 0x0000, 0x0000, 0x0000, 0x0000, 0x802c, 0x0d00, 0x0001, 0x0010, + 0x8050, 0x0800, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8050, 0x0803, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8050, 0x0800, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4b00, 0x0000, 0x0000, 0x0000, 0x0400, + 0x807c, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5b00, 0x0000, 0x0000, 0x0000, 0x2000, + 0x402c, 0x0d00, 0x0001, 0x0000, 0x5198, 0x0803, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5218, 0x0803, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4b00, 0x0000, 0x0000, 0x0000, 0x0400, + 0x407c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x802c, 0x0d00, 0x0001, 0x0010, + 0x9198, 0x0803, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x9218, 0x0803, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x4b00, 0x0000, 0x0000, 0x0000, 0x0400, + 0x0000, 0x0000, 0x0000, 0x0000, 0x807c, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0b00, 0x0000, 0x0000, 0x0000, 0x0400, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x401c, 0x00d0, 0x0001, 0x0000, 0x4060, 0x0084, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0b00, 0x0000, 0x0000, 0x0000, 0x0800, + 0x407c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0001, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x402c, 0x0d00, 0x0001, 0x0000, + 0x4020, 0x0803, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0800, + 0x0000, 0x0000, 0x0000, 0x0000, 0x407c, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x801c, 0x00d0, 0x0001, 0x0010, 0x8060, 0x0084, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x0b00, 0x0000, 0x0000, 0x0000, 0x0800, + 0x807c, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0001, 0x0010, + 0x0000, 0x0000, 0x0000, 0x0000, 0x802c, 0x0d00, 0x0001, 0x0010, + 0x8020, 0x0803, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0800, + 0x0000, 0x0000, 0x0000, 0x0000, 0x807c, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x402c, 0x0d00, 0x0001, 0x0000, 0x4050, 0x0803, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4050, 0x0803, 0x0000, 0x5a00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4050, 0x0803, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4b00, 0x0000, 0x0000, 0x0000, 0x0400, + 0x407c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, + 0x5758, 0x0000, 0x0000, 0x0000, 0x4208, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x401c, 0x00d0, 0x0001, 0x0000, + 0x4060, 0x0084, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x407c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0001, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x402c, 0x0d00, 0x0001, 0x0000, + 0x4020, 0x0803, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0800, + 0x0000, 0x0000, 0x0000, 0x0000, 0x407c, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5758, 0x0000, 0x0000, 0x0000, 0x4008, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x802c, 0x0d00, 0x0001, 0x0010, 0x8050, 0x0803, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8050, 0x0803, 0x0000, 0x5a10, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8050, 0x0803, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4b00, 0x0000, 0x0000, 0x0000, 0x0400, + 0x807c, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, + 0x9758, 0x0000, 0x0000, 0x0010, 0x8208, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x4b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x801c, 0x00d0, 0x0001, 0x0010, + 0x8060, 0x0084, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x807c, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0001, 0x0010, + 0x0000, 0x0000, 0x0000, 0x0000, 0x802c, 0x0d00, 0x0001, 0x0010, + 0x8020, 0x0803, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0800, + 0x0000, 0x0000, 0x0000, 0x0000, 0x807c, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8000, 0x0000, 0x0001, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, + 0x9758, 0x0000, 0x0000, 0x0010, 0x8008, 0x0000, 0x0000, 0x0010, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc068, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +static const u16 lp5_post_training_table_17[] = { + 0x0010, 0x0400, 0x080e, 0x000b, 0x0480, 0x0809, 0x0009, 0x0308, + 0x0c09, 0x0028, 0x8160, 0x087c, 0x0098, 0x0820, 0x0c7e, 0x0002, + 0x0001, 0x0078, 0x000a, 0x0370, 0x0839, 0x0018, 0x8160, 0x083c, + 0x0009, 0x0150, 0x0839, 0x0070, 0x0392, 0x0039, 0x0078, 0x039a, + 0x0039, 0x0e09, 0x0100, 0x0839, 0x0002, 0x0001, 0x0038, 0x0000, + 0x0100, 0x0839, 0x0000, 0x0398, 0x0839, 0x0e19, 0x0100, 0x0839, + 0x0002, 0x0001, 0x0038, 0x0000, 0x0100, 0x0839, 0x0000, 0x0390, + 0x0839, 0x0078, 0x039a, 0x0039, 0x0e29, 0x0100, 0x0839, 0x0002, + 0x0001, 0x0038, 0x0000, 0x0100, 0x0839, 0x0070, 0x0392, 0x0039, + 0x0018, 0x8160, 0x08bc, 0x0008, 0x013a, 0x00b9, 0x024b, 0x0100, + 0x08b9, 0x0002, 0x0001, 0x00b8, 0x0000, 0x0100, 0x08b9, 0x0020, + 0x0004, 0x00b8, 0x0020, 0x0004, 0x00b8, 0x0005, 0x0000, 0x00b8, + 0x0479, 0xc7f8, 0x08bc, 0x0000, 0x0000, 0x00b8, 0x0000, 0x00a8, + 0x08b9, 0x0009, 0xc9c0, 0x0cbc, 0x0000, 0x0000, 0x00b8, 0x025b, + 0x0100, 0x0cb9, 0x0020, 0x0004, 0x00b8, 0x0020, 0x0004, 0x00b8, + 0x0020, 0x0004, 0x00b8, 0x0020, 0x0004, 0x00b8, 0x0010, 0x0400, + 0x089e, 0x0008, 0x0370, 0x0839, 0x033b, 0x0100, 0x08b9, 0x0000, + 0x0100, 0x08b9, 0x023b, 0x0100, 0x0c99, 0x0002, 0x0150, 0x0839, + 0x1800, 0x8660, 0x0839, 0x0000, 0x02a0, 0x0809, 0x0008, 0x1880, + 0x0839, 0x0008, 0x82b0, 0x0838, 0x0018, 0x00e0, 0x0809, 0x0000, + 0x00e0, 0x0869, 0x000f, 0x07c0, 0x0839, 0x000a, 0x0510, 0x0839, + 0x000a, 0x0700, 0x0849, 0x000a, 0x0700, 0x0859, 0x000a, 0x0708, + 0x0859, 0x0002, 0x0708, 0x0849, 0x0ff8, 0x8410, 0x0839, 0x7ff8, + 0x8498, 0x0838, 0x0010, 0x8160, 0x083c, 0x0000, 0x07c8, 0x0809, + 0x0000, 0x0001, 0x0008, 0x0000, 0x045a, 0x0089, 0x0000, 0x8018, + 0x0808, 0x0000, 0x8020, 0x0808, 0x0479, 0xc7f8, 0x080c, 0x0000, + 0x0000, 0x0008, 0x0000, 0x8018, 0x0808, 0x0000, 0x8020, 0x0808, + 0x0009, 0xc9c0, 0x0c0c, 0x0000, 0x00a8, 0x08c9, 0x0029, 0x8160, + 0x087c, 0x00b8, 0x0820, 0x0c7e, 0x0001, 0x0000, 0x0078, 0x0000, + 0x0001, 0x0078, 0x00d8, 0x0820, 0x0c7e, 0x0001, 0x0000, 0x0078, + 0x0000, 0x0001, 0x0078, 0x00f8, 0x0820, 0x0c7e, 0x0001, 0x0000, + 0x0078, 0x0000, 0x0001, 0x0078, 0x0000, 0x0700, 0x0849, 0x0000, + 0x0618, 0x0809, 0x3ff8, 0x84b8, 0x0808, 0x0000, 0x0000, 0x0008, + 0x0008, 0xc870, 0x0c0c, 0x0018, 0x0710, 0x0849, 0x0000, 0x0004, + 0x0048, 0x0000, 0x0004, 0x0048, 0x0010, 0x0710, 0x0849, 0x0000, + 0x0004, 0x0048, 0x0000, 0x0710, 0x0849, 0x0000, 0x0004, 0x0048, + 0x0000, 0x0004, 0x0018, 0x0000, 0x0004, 0x0018, 0x0000, 0x0004, + 0x0018, 0x0000, 0x8410, 0x0809, 0x0000, 0x8498, 0x0808, 0x0005, + 0x0510, 0x0809, 0x0198, 0x1000, 0x0809, 0x0009, 0x03c0, 0x0809, + 0x0010, 0x0510, 0x0809, 0x0000, 0x03c0, 0x0809, 0x0018, 0x0004, + 0x0008, 0x0002, 0x0510, 0x0809, 0x0002, 0x1000, 0x0809, 0x0068, + 0x801a, 0x0008, 0x0068, 0x8022, 0x0008, 0x0479, 0xc7f8, 0x080c, + 0x0000, 0x0000, 0x0008, 0x0068, 0x801a, 0x0008, 0x0068, 0x8022, + 0x0008, 0x0009, 0xc9c0, 0x0c0c, 0x0000, 0xc870, 0x0c0c, 0x0000, + 0x02a0, 0x0809, 0x0010, 0x8160, 0x089c, 0x0002, 0x07c8, 0x0809, + 0x0000, 0x0001, 0x0008, 0x0040, 0x1932, 0x0129, 0x000a, 0xc140, + 0x080c, 0x0098, 0x193a, 0x0129, 0x0090, 0x1932, 0x0329, 0x0090, + 0x193a, 0x0329, 0x0088, 0x1882, 0x0009, 0x0000, 0xc140, 0x080c, + 0x0010, 0x0400, 0x080e, 0x000b, 0x0370, 0x0809, 0x023b, 0x0100, + 0x0cf9, 0x0000, 0x02a0, 0x0809, 0x7800, 0x8660, 0x0809, 0x000d, + 0x07c0, 0x0809, 0x0000, 0x82b0, 0x0818, 0x0000, 0x82b0, 0x0868, + 0x0002, 0x07c8, 0x0a09, 0x0008, 0x0508, 0x0939, 0x0005, 0x07c0, + 0x0809, 0x0008, 0x82b0, 0x0868, 0x0008, 0x82b0, 0x0818, 0x0008, + 0x82b0, 0x0888, 0x0010, 0x0510, 0x0809, 0x0000, 0x00a8, 0x08c9, + 0x0009, 0x1900, 0x0d39, 0x0000, 0x0508, 0x0939, 0x0002, 0x07c8, + 0x0829, 0x000a, 0x03c8, 0x0c29, 0x0199, 0x03d0, 0x0c19, 0x0003, + 0x0000, 0x0018, 0x0038, 0x0004, 0x0018, 0x0199, 0x03d0, 0x0c09, + 0x0000, 0x0000, 0x0008, 0x0009, 0x0150, 0x0809, 0x0009, 0xc800, + 0x0c0c, 0x0018, 0x8160, 0x08cc, 0x0008, 0x013a, 0x00c9, 0x024b, + 0x0100, 0x08c9, 0x0002, 0x0001, 0x00c8, 0x0000, 0x0100, 0x08c9, + 0x0020, 0x0004, 0x00c8, 0x0020, 0x0004, 0x00c8, 0x0005, 0x0000, + 0x00c8, 0x0479, 0xc7f8, 0x08cc, 0x0000, 0x0000, 0x00c8, 0x0030, + 0x00aa, 0x00c9, 0x0009, 0xc9c0, 0x0ccc, 0x0000, 0x0000, 0x00c8, + 0x0479, 0xc7f8, 0x08bc, 0x0000, 0x0000, 0x00b8, 0x0030, 0x00aa, + 0x00b9, 0x0009, 0xc9c0, 0x0cbc, 0x0000, 0x0000, 0x00b8, 0x025b, + 0x0100, 0x0cc9, 0x0020, 0x0004, 0x00c8, 0x0020, 0x0004, 0x00c8, + 0x0020, 0x0004, 0x00a8, 0x0004, 0x0000, 0x00c8, 0x0009, 0xc800, + 0x0c6c, 0x026f, 0x0100, 0x0c19, 0x0008, 0x0004, 0x0018, 0x027f, + 0x0100, 0x0c19, 0x0479, 0xc7f8, 0x080c, 0x0000, 0x0000, 0x0008, + 0x0058, 0x008a, 0x0009, 0x0009, 0xc9c0, 0x0c0c, 0x0000, 0x0000, + 0x0008, 0x0018, 0x8160, 0x086c, 0x1008, 0x853b, 0x0868, 0x0c00, + 0x8588, 0x0868, 0x0008, 0x85a8, 0x0868, 0x0008, 0x85c8, 0x0868, + 0x0000, 0x8050, 0x0868, 0x0060, 0x0138, 0x0869, 0x0018, 0x8510, + 0x0868, 0x0018, 0x02c8, 0x0869, 0x0010, 0x8520, 0x0868, 0x1ff8, + 0x85d8, 0x0c68, 0x0000, 0xfdf0, 0x0868, 0x0008, 0x85f0, 0x0868, + 0x0008, 0xa5f0, 0x0868, 0x0298, 0x0100, 0x0869, 0x0002, 0x0001, + 0x0068, 0x0000, 0x0100, 0x0869, 0x0000, 0x85f0, 0x0868, 0x0000, + 0xa5f0, 0x0868, 0x033b, 0x0100, 0x08c9, 0x0000, 0x0100, 0x08c9, + 0x1ff8, 0x85d8, 0x0c68, 0x0008, 0x8df0, 0x0868, 0x0008, 0xadf0, + 0x0868, 0x02a8, 0x0100, 0x0869, 0x0002, 0x0001, 0x0068, 0x0000, + 0x0100, 0x0869, 0x0000, 0x8df0, 0x0868, 0x0000, 0xadf0, 0x0868, + 0x0010, 0x02c8, 0x0869, 0x0028, 0x0004, 0x0068, 0x000a, 0x0500, + 0x0c69, 0x0000, 0x8520, 0x0868, 0x0008, 0x8530, 0x0868, 0x02ba, + 0x0100, 0x0869, 0x0002, 0x0001, 0x0068, 0x0002, 0x0100, 0x0869, + 0x0000, 0x8530, 0x0868, 0x0000, 0x8510, 0x0868, 0x0000, 0x02c8, + 0x0869, 0x0008, 0x8050, 0x0868, 0x0030, 0x0004, 0x0068, 0x0008, + 0x8520, 0x0868, 0x0000, 0x8328, 0x086b, 0x02ca, 0x0100, 0x0869, + 0x0002, 0x0001, 0x0068, 0x0004, 0x0100, 0x0869, 0x0ff8, 0x8328, + 0x086b, 0x0009, 0x0500, 0x0c29, 0x0000, 0x8520, 0x0868, 0x0008, + 0x03c8, 0x0c29, 0x0000, 0x0150, 0x0809, 0x0002, 0x0370, 0x0809, + 0x0000, 0x0400, 0x080e, 0x0020, 0x82b0, 0x0808, 0x0479, 0xc7f8, + 0x080c, 0x0000, 0x0000, 0x0008, 0x0060, 0x008a, 0x0009, 0x0009, + 0xc9c0, 0x0c0c, 0x0000, 0x0000, 0x0008, 0x0008, 0x02a0, 0x0809, + 0x0048, 0xc822, 0x000c, 0x0048, 0xcc32, 0x000c, 0x0009, 0xc800, + 0x0c0c, 0x0000, 0x8168, 0x080c, 0x000a, 0xc140, 0x092c, 0x0088, + 0x1932, 0x0129, 0x0088, 0x193a, 0x0129, 0x0000, 0xc140, 0x092c, + 0x0008, 0x0300, 0x0819, 0x0010, 0x8160, 0x080c, 0x0008, 0x07c8, + 0x0931, 0x0008, 0x0000, 0x0008, 0x0008, 0x1880, 0x0809, 0x0010, + 0x8160, 0x080c, 0x1800, 0x8660, 0x0809, 0x4000, 0x8668, 0x0809, + 0x000f, 0x07c0, 0x0809, 0x0000, 0x02a0, 0x0809, 0x0008, 0x0618, + 0x0809, 0x0000, 0x84b8, 0x0808, 0x0ff8, 0x8410, 0x0809, 0x7ff8, + 0x8498, 0x0808, 0x0000, 0x07c8, 0x0809, 0x0008, 0x8168, 0x080c, + 0x0000, 0x0001, 0x0008, 0x0000, 0x0004, 0x0008, 0x0000, 0x0004, + 0x0008, 0x0018, 0x0300, 0x0809, 0x0000, 0x0480, 0x0809, 0x0008, + 0x0510, 0x0809, 0x7800, 0x8660, 0x0809, 0x0008, 0x07c8, 0x0801, + 0x0010, 0x0400, 0x080e, 0x0008, 0x0150, 0x0809, 0x0009, 0x0370, + 0x0809, 0x0018, 0x8160, 0x080c, 0x0008, 0xc800, 0x0c0c, 0x0008, + 0xc888, 0x0c04, 0x0020, 0x8302, 0x000b, 0x0018, 0x8582, 0x0008, + 0x9000, 0x8539, 0x0808, 0x0000, 0x8588, 0x0808, 0x0040, 0x85c8, + 0x0808, 0x0000, 0xfdf0, 0x0808, 0x0800, 0xc5f0, 0x0808, 0x1ff8, + 0xfdd8, 0x0c08, 0x0018, 0xfda8, 0x0808, 0x0040, 0x8520, 0x08d8, + 0x0080, 0x8520, 0x08e8, 0x030a, 0x0100, 0x08d9, 0x032a, 0x0100, + 0x08e9, 0x0000, 0x0001, 0x0008, 0x0000, 0x0100, 0x0809, 0x1ff8, + 0xfdd8, 0x0c08, 0x0008, 0xfda8, 0x0808, 0x0140, 0x8520, 0x08d8, + 0x0180, 0x8520, 0x08e8, 0x030a, 0x0100, 0x08d9, 0x032a, 0x0100, + 0x08e9, 0x0000, 0x0001, 0x0008, 0x0000, 0x0100, 0x0809, 0x0009, + 0x0500, 0x0c09, 0x0010, 0x82b0, 0x0808, 0x0000, 0x8520, 0x0808, + 0x0008, 0x03c8, 0x0c09, 0x0000, 0x0150, 0x0809, 0x0002, 0x0370, + 0x0809, 0x0000, 0x0400, 0x080e, 0x0008, 0xc848, 0x0c0c, 0x0000, + 0xc890, 0x0804, 0x0020, 0x8302, 0x000b, 0x0018, 0x8582, 0x0008, + 0x0000, 0x82b0, 0x0808, 0x1000, 0x8539, 0x0808, 0x0000, 0x8588, + 0x0808, 0x0040, 0x85c8, 0x0808, 0x07f8, 0xfdf0, 0x0808, 0x0800, + 0xc5f0, 0x0808, 0x0080, 0x8088, 0x080b, 0x1ff8, 0xfdd8, 0x0c08, + 0x0018, 0xfda8, 0x0808, 0x0200, 0x8520, 0x08d8, 0x0400, 0x8520, + 0x08e8, 0x02da, 0x0100, 0x08d9, 0x02ea, 0x0100, 0x08e9, 0x0002, + 0x0001, 0x0008, 0x0000, 0x0100, 0x0809, 0x1ff8, 0xfdd8, 0x0c08, + 0x0008, 0xfda8, 0x0808, 0x0a00, 0x8520, 0x08d8, 0x0c00, 0x8520, + 0x08e8, 0x02da, 0x0100, 0x08d9, 0x02ea, 0x0100, 0x08e9, 0x0000, + 0x0001, 0x0008, 0x0000, 0x0100, 0x0809, 0x0009, 0x0500, 0x0c09, + 0x0010, 0x82b0, 0x0808, 0x0000, 0x8520, 0x0808, 0x0008, 0x03c8, + 0x0c09, 0x0000, 0x0150, 0x0809, 0x0002, 0x0370, 0x0809, 0x0000, + 0x0400, 0x080e, 0x0008, 0xc848, 0x0c0c, 0x0000, 0xc890, 0x0804, + 0x1008, 0x853b, 0x0808, 0x0c00, 0x8588, 0x0808, 0x0008, 0x85a8, + 0x0808, 0x0008, 0x85c8, 0x0808, 0x0060, 0x0138, 0x0809, 0x0018, + 0x00c8, 0x0809, 0x0000, 0x00a4, 0x0809, 0x0000, 0x8510, 0x0808, + 0x02fa, 0x0100, 0x08d9, 0x031a, 0x0100, 0x08e9, 0x0002, 0x0001, + 0x0008, 0x0002, 0x0100, 0x0809, 0x0202, 0x8510, 0x0c08, 0x0050, + 0x00a2, 0x0009, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0008, + 0x0000, 0x0000, 0x0008, 0x0000, 0x00c8, 0x0809, 0x000b, 0x0508, + 0x0809, 0x0008, 0x1900, 0x0c09, 0x0002, 0x0000, 0x0008, 0x0000, + 0x0508, 0x0809, 0x0009, 0x0500, 0x0c09, 0x0010, 0x82b0, 0x0808, + 0x0000, 0x8520, 0x0808, 0x0008, 0x03c8, 0x0c09, 0x0000, 0x0150, + 0x0809, 0x0002, 0x0370, 0x0809, 0x0000, 0x0400, 0x080e, 0x0008, + 0xc848, 0x0c0c, 0x0000, 0xc890, 0x0804, 0x0020, 0x8302, 0x000b, + 0x0018, 0x8582, 0x0008, 0x1000, 0x8539, 0x0808, 0x0000, 0x8588, + 0x0808, 0x0040, 0x85c8, 0x0808, 0x0008, 0xfdf0, 0x0808, 0x0080, + 0x8088, 0x080b, 0x0000, 0x03b8, 0x0869, 0x1ff8, 0xfdd8, 0x0c08, + 0x0018, 0xfda8, 0x0808, 0x0040, 0x8520, 0x08d8, 0x0080, 0x8520, + 0x08e8, 0x02da, 0x0100, 0x08d9, 0x02ea, 0x0100, 0x08e9, 0x0002, + 0x0001, 0x0008, 0x0000, 0x0100, 0x0809, 0x1ff8, 0xfdd8, 0x0c08, + 0x0008, 0xfda8, 0x0808, 0x0140, 0x8520, 0x08d8, 0x0180, 0x8520, + 0x08e8, 0x02da, 0x0100, 0x08d9, 0x02ea, 0x0100, 0x08e9, 0x0000, + 0x0001, 0x0008, 0x0000, 0x0100, 0x0809, 0x0009, 0x0500, 0x0c09, + 0x0010, 0x82b0, 0x0808, 0x0000, 0x8520, 0x0808, 0x0008, 0x03c8, + 0x0c09, 0x0000, +}; + +static const u16 lp5_post_training_table_23[] = { + 0xc9d8, 0x0000, 0x0000, 0x0000, 0xc008, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc958, 0x0000, 0x0000, 0x0000, 0xc688, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc0d8, 0x0000, 0x0000, 0x0000, 0xd848, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc158, 0x0000, 0x0000, 0x0000, 0xddc8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc1d8, 0x0000, 0x0000, 0x0000, 0xc308, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc558, 0x0000, 0x0000, 0x0000, 0xec08, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xc5d8, 0x0000, 0x0000, 0x0000, 0xda08, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0x48d8, 0x0000, 0x0000, 0x0000, 0x5708, 0x0000, 0x0000, 0x0000, + 0x88d8, 0x0000, 0x0000, 0x0000, 0x9708, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xca58, 0x0000, 0x0000, 0x0000, 0xc108, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xcb58, 0x0000, 0x0000, 0x0000, 0xc008, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b00, 0x0000, 0x0000, 0x0000, 0x0000, + 0xd4d8, 0x0000, 0x0000, 0x0000, 0xc008, 0x0000, 0x0000, 0x0000, +}; + +static const struct k3_ddr_phy_cfg lp5_post_train_cfg[] = { + K3_DDR_PHY_WRITE_SINGLE(0x908f0, 0x0065), + K3_DDR_PHY_WRITE_SINGLE(0x908f1, 0x012c), + K3_DDR_PHY_WRITE_SINGLE(0x908f2, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x908f3, 0x0058), + K3_DDR_PHY_WRITE_SINGLE(0x908f4, 0x0014), + K3_DDR_PHY_WRITE_SINGLE(0x908f5, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x908f6, 0x00b0), + K3_DDR_PHY_WRITE_SINGLE(0x908f7, 0x0000), + K3_DDR_PHY_WRITE_RANGE(0x41008, lp5_post_training_table_2), + K3_DDR_PHY_WRITE_SINGLE(0x20015, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x3004a, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x3004b, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x3104a, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x3104b, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x2004c, 0x2c0f), + K3_DDR_PHY_WRITE_SINGLE(0x2004d, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x20041, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x90802, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x20045, 0x0002), + K3_DDR_PHY_WRITE_SINGLE(0x10057, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x11057, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x12057, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x13057, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x1000f, 0x1089), + K3_DDR_PHY_WRITE_SINGLE(0x1100f, 0x1089), + K3_DDR_PHY_WRITE_SINGLE(0x1200f, 0x1089), + K3_DDR_PHY_WRITE_SINGLE(0x1300f, 0x1089), + K3_DDR_PHY_WRITE_SINGLE(0x90803, 0x0004), + K3_DDR_PHY_WRITE_SINGLE(0x90804, 0x0082), + K3_DDR_PHY_WRITE_SINGLE(0x90805, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x90903, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x9090b, 0x0002), + K3_DDR_PHY_WRITE_SINGLE(0x90811, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x90812, 0xff00), + K3_DDR_PHY_WRITE_SINGLE(0x20072, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x9080e, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x20073, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0x9080f, 0x0003), + K3_DDR_PHY_WRITE_SINGLE(0xd0000, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x41000, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x41001, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x41002, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x41003, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x41004, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x41005, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x41006, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x41007, 0x0000), + K3_DDR_PHY_WRITE_RANGE(0x41388, lp5_post_training_table_16), + K3_DDR_PHY_WRITE_RANGE(0x9002e, lp5_post_training_table_17), + K3_DDR_PHY_WRITE_SINGLE(0x90500, 0x0150), + K3_DDR_PHY_WRITE_SINGLE(0x90501, 0x0809), + K3_DDR_PHY_WRITE_SINGLE(0x90502, 0x0002), + K3_DDR_PHY_WRITE_SINGLE(0x90503, 0x0370), + K3_DDR_PHY_WRITE_SINGLE(0x90504, 0x0809), + K3_DDR_PHY_WRITE_SINGLE(0x90505, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x90506, 0x0400), + K3_DDR_PHY_WRITE_SINGLE(0x90507, 0x080e), + K3_DDR_PHY_WRITE_SINGLE(0x90508, 0x0008), + K3_DDR_PHY_WRITE_SINGLE(0x90509, 0xc848), + K3_DDR_PHY_WRITE_SINGLE(0x9050a, 0x0c0c), + K3_DDR_PHY_WRITE_SINGLE(0x9050b, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x9050c, 0xc890), + K3_DDR_PHY_WRITE_SINGLE(0x9050d, 0x0804), + K3_DDR_PHY_WRITE_SINGLE(0xd00e7, 0x0600), + K3_DDR_PHY_WRITE_SINGLE(0x9001c, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x90020, 0x0075), + K3_DDR_PHY_WRITE_SINGLE(0x90024, 0x0080), + K3_DDR_PHY_WRITE_SINGLE(0x90025, 0x002a), + K3_DDR_PHY_WRITE_SINGLE(0x90026, 0x002a), + K3_DDR_PHY_WRITE_SINGLE(0x9002b, 0x0103), + K3_DDR_PHY_WRITE_SINGLE(0x90708, 0x0118), + K3_DDR_PHY_WRITE_SINGLE(0x90700, 0x013e), + K3_DDR_PHY_WRITE_SINGLE(0x90701, 0x0160), + K3_DDR_PHY_WRITE_SINGLE(0x90702, 0x017f), + K3_DDR_PHY_WRITE_SINGLE(0x90703, 0x011e), + K3_DDR_PHY_WRITE_SINGLE(0x90704, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x90705, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x90706, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x90707, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x2018a, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x20124, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x2018b, 0x0016), + K3_DDR_PHY_WRITE_SINGLE(0x20125, 0x0039), + K3_DDR_PHY_WRITE_SINGLE(0x2018c, 0x004e), + K3_DDR_PHY_WRITE_SINGLE(0x20126, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x2018d, 0x0016), + K3_DDR_PHY_WRITE_SINGLE(0x20127, 0x0039), + K3_DDR_PHY_WRITE_SINGLE(0x2018e, 0x004e), + K3_DDR_PHY_WRITE_SINGLE(0x20128, 0x0017), + K3_DDR_PHY_WRITE_SINGLE(0x2018f, 0x0027), + K3_DDR_PHY_WRITE_SINGLE(0x20129, 0x004f), + K3_DDR_PHY_WRITE_SINGLE(0x20190, 0x005f), + K3_DDR_PHY_WRITE_SINGLE(0x2012a, 0x0017), + K3_DDR_PHY_WRITE_SINGLE(0x20191, 0x0027), + K3_DDR_PHY_WRITE_SINGLE(0x2012b, 0x004f), + K3_DDR_PHY_WRITE_SINGLE(0x20192, 0x005f), + K3_DDR_PHY_WRITE_SINGLE(0x2012c, 0x0028), + K3_DDR_PHY_WRITE_SINGLE(0x20193, 0x0038), + K3_DDR_PHY_WRITE_SINGLE(0x2012d, 0x0060), + K3_DDR_PHY_WRITE_SINGLE(0x20194, 0x0070), + K3_DDR_PHY_WRITE_SINGLE(0x2012e, 0x0028), + K3_DDR_PHY_WRITE_SINGLE(0x20195, 0x0038), + K3_DDR_PHY_WRITE_SINGLE(0x2012f, 0x0060), + K3_DDR_PHY_WRITE_SINGLE(0x20196, 0x0070), + K3_DDR_PHY_WRITE_SINGLE(0x20130, 0x0080), + K3_DDR_PHY_WRITE_SINGLE(0x20197, 0x0080), + K3_DDR_PHY_WRITE_SINGLE(0x20131, 0x0080), + K3_DDR_PHY_WRITE_SINGLE(0x20198, 0x0080), + K3_DDR_PHY_WRITE_SINGLE(0x20132, 0x0080), + K3_DDR_PHY_WRITE_SINGLE(0x20199, 0x0080), + K3_DDR_PHY_WRITE_SINGLE(0x20133, 0x0080), + K3_DDR_PHY_WRITE_SINGLE(0x2019a, 0x0080), + K3_DDR_PHY_WRITE_SINGLE(0x20134, 0x0071), + K3_DDR_PHY_WRITE_SINGLE(0x2019b, 0x0074), + K3_DDR_PHY_WRITE_SINGLE(0x20135, 0x0077), + K3_DDR_PHY_WRITE_SINGLE(0x2019c, 0x007a), + K3_DDR_PHY_WRITE_SINGLE(0x20136, 0x0071), + K3_DDR_PHY_WRITE_SINGLE(0x2019d, 0x0074), + K3_DDR_PHY_WRITE_SINGLE(0x20137, 0x0077), + K3_DDR_PHY_WRITE_SINGLE(0x2019e, 0x007a), + K3_DDR_PHY_WRITE_SINGLE(0x20138, 0x0075), + K3_DDR_PHY_WRITE_SINGLE(0x2019f, 0x0076), + K3_DDR_PHY_WRITE_SINGLE(0x20139, 0x007b), + K3_DDR_PHY_WRITE_SINGLE(0x201a0, 0x007c), + K3_DDR_PHY_WRITE_SINGLE(0x2013a, 0x0075), + K3_DDR_PHY_WRITE_SINGLE(0x201a1, 0x0076), + K3_DDR_PHY_WRITE_SINGLE(0x2013b, 0x007b), + K3_DDR_PHY_WRITE_SINGLE(0x201a2, 0x007c), + K3_DDR_PHY_WRITE_SINGLE(0x2013c, 0x007d), + K3_DDR_PHY_WRITE_SINGLE(0x201a3, 0x007e), + K3_DDR_PHY_WRITE_SINGLE(0x2013d, 0x007d), + K3_DDR_PHY_WRITE_SINGLE(0x201a4, 0x007e), + K3_DDR_PHY_WRITE_SINGLE(0x2013e, 0x007d), + K3_DDR_PHY_WRITE_SINGLE(0x201a5, 0x007e), + K3_DDR_PHY_WRITE_SINGLE(0x2013f, 0x007d), + K3_DDR_PHY_WRITE_SINGLE(0x201a6, 0x007e), + K3_DDR_PHY_WRITE_SINGLE(0x20140, 0x007f), + K3_DDR_PHY_WRITE_SINGLE(0x201a7, 0x007f), + K3_DDR_PHY_WRITE_SINGLE(0x20141, 0x007f), + K3_DDR_PHY_WRITE_SINGLE(0x201a8, 0x007f), + K3_DDR_PHY_WRITE_SINGLE(0x20142, 0x007f), + K3_DDR_PHY_WRITE_SINGLE(0x201a9, 0x007f), + K3_DDR_PHY_WRITE_SINGLE(0x20143, 0x007f), + K3_DDR_PHY_WRITE_SINGLE(0x201aa, 0x007f), + K3_DDR_PHY_WRITE_SINGLE(0x20144, 0x0080), + K3_DDR_PHY_WRITE_SINGLE(0x201ab, 0x007f), + K3_DDR_PHY_WRITE_SINGLE(0x20145, 0x0080), + K3_DDR_PHY_WRITE_SINGLE(0x201ac, 0x007f), + K3_DDR_PHY_WRITE_SINGLE(0x20146, 0x0080), + K3_DDR_PHY_WRITE_SINGLE(0x201ad, 0x007f), + K3_DDR_PHY_WRITE_SINGLE(0x20147, 0x0080), + K3_DDR_PHY_WRITE_SINGLE(0x201ae, 0x007f), + K3_DDR_PHY_WRITE_SINGLE(0x20148, 0x0081), + K3_DDR_PHY_WRITE_SINGLE(0x201af, 0x0093), + K3_DDR_PHY_WRITE_SINGLE(0x20149, 0x0081), + K3_DDR_PHY_WRITE_SINGLE(0x201b0, 0x0093), + K3_DDR_PHY_WRITE_SINGLE(0x2014a, 0x010a), + K3_DDR_PHY_WRITE_SINGLE(0x201b1, 0x011b), + K3_DDR_PHY_WRITE_SINGLE(0x2014b, 0x010a), + K3_DDR_PHY_WRITE_SINGLE(0x201b2, 0x011b), + K3_DDR_PHY_WRITE_SINGLE(0x2014c, 0x0094), + K3_DDR_PHY_WRITE_SINGLE(0x201b3, 0x009b), + K3_DDR_PHY_WRITE_SINGLE(0x2014d, 0x0094), + K3_DDR_PHY_WRITE_SINGLE(0x201b4, 0x009b), + K3_DDR_PHY_WRITE_SINGLE(0x2014e, 0x011c), + K3_DDR_PHY_WRITE_SINGLE(0x201b5, 0x0122), + K3_DDR_PHY_WRITE_SINGLE(0x2014f, 0x011c), + K3_DDR_PHY_WRITE_SINGLE(0x201b6, 0x0122), + K3_DDR_PHY_WRITE_SINGLE(0x20150, 0x009c), + K3_DDR_PHY_WRITE_SINGLE(0x201b7, 0x00af), + K3_DDR_PHY_WRITE_SINGLE(0x20151, 0x009c), + K3_DDR_PHY_WRITE_SINGLE(0x201b8, 0x00af), + K3_DDR_PHY_WRITE_SINGLE(0x20152, 0x0123), + K3_DDR_PHY_WRITE_SINGLE(0x201b9, 0x0132), + K3_DDR_PHY_WRITE_SINGLE(0x20153, 0x0123), + K3_DDR_PHY_WRITE_SINGLE(0x201ba, 0x0132), + K3_DDR_PHY_WRITE_SINGLE(0x20154, 0x00b0), + K3_DDR_PHY_WRITE_SINGLE(0x201bb, 0x00c0), + K3_DDR_PHY_WRITE_SINGLE(0x20155, 0x00b0), + K3_DDR_PHY_WRITE_SINGLE(0x201bc, 0x00c0), + K3_DDR_PHY_WRITE_SINGLE(0x20156, 0x0133), + K3_DDR_PHY_WRITE_SINGLE(0x201bd, 0x0143), + K3_DDR_PHY_WRITE_SINGLE(0x20157, 0x0133), + K3_DDR_PHY_WRITE_SINGLE(0x201be, 0x0143), + K3_DDR_PHY_WRITE_SINGLE(0x20158, 0x00c1), + K3_DDR_PHY_WRITE_SINGLE(0x201bf, 0x00ca), + K3_DDR_PHY_WRITE_SINGLE(0x20159, 0x00c1), + K3_DDR_PHY_WRITE_SINGLE(0x201c0, 0x00ca), + K3_DDR_PHY_WRITE_SINGLE(0x2015a, 0x0144), + K3_DDR_PHY_WRITE_SINGLE(0x201c1, 0x014d), + K3_DDR_PHY_WRITE_SINGLE(0x2015b, 0x0144), + K3_DDR_PHY_WRITE_SINGLE(0x201c2, 0x014d), + K3_DDR_PHY_WRITE_SINGLE(0x2015c, 0x00cb), + K3_DDR_PHY_WRITE_SINGLE(0x201c3, 0x00d4), + K3_DDR_PHY_WRITE_SINGLE(0x2015d, 0x00cb), + K3_DDR_PHY_WRITE_SINGLE(0x201c4, 0x00d4), + K3_DDR_PHY_WRITE_SINGLE(0x2015e, 0x014e), + K3_DDR_PHY_WRITE_SINGLE(0x201c5, 0x0157), + K3_DDR_PHY_WRITE_SINGLE(0x2015f, 0x014e), + K3_DDR_PHY_WRITE_SINGLE(0x201c6, 0x0157), + K3_DDR_PHY_WRITE_SINGLE(0x20160, 0x00d5), + K3_DDR_PHY_WRITE_SINGLE(0x201c7, 0x00df), + K3_DDR_PHY_WRITE_SINGLE(0x20161, 0x00d5), + K3_DDR_PHY_WRITE_SINGLE(0x201c8, 0x00df), + K3_DDR_PHY_WRITE_SINGLE(0x20162, 0x0158), + K3_DDR_PHY_WRITE_SINGLE(0x201c9, 0x0161), + K3_DDR_PHY_WRITE_SINGLE(0x20163, 0x0158), + K3_DDR_PHY_WRITE_SINGLE(0x201ca, 0x0161), + K3_DDR_PHY_WRITE_SINGLE(0x20164, 0x00e0), + K3_DDR_PHY_WRITE_SINGLE(0x201cb, 0x00ee), + K3_DDR_PHY_WRITE_SINGLE(0x20165, 0x00e0), + K3_DDR_PHY_WRITE_SINGLE(0x201cc, 0x00ee), + K3_DDR_PHY_WRITE_SINGLE(0x20166, 0x0162), + K3_DDR_PHY_WRITE_SINGLE(0x201cd, 0x0170), + K3_DDR_PHY_WRITE_SINGLE(0x20167, 0x0162), + K3_DDR_PHY_WRITE_SINGLE(0x201ce, 0x0170), + K3_DDR_PHY_WRITE_SINGLE(0x20168, 0x00ef), + K3_DDR_PHY_WRITE_SINGLE(0x201cf, 0x00f9), + K3_DDR_PHY_WRITE_SINGLE(0x20169, 0x00ef), + K3_DDR_PHY_WRITE_SINGLE(0x201d0, 0x00f9), + K3_DDR_PHY_WRITE_SINGLE(0x2016a, 0x0171), + K3_DDR_PHY_WRITE_SINGLE(0x201d1, 0x017a), + K3_DDR_PHY_WRITE_SINGLE(0x2016b, 0x0171), + K3_DDR_PHY_WRITE_SINGLE(0x201d2, 0x017a), + K3_DDR_PHY_WRITE_SINGLE(0x2016c, 0x00fa), + K3_DDR_PHY_WRITE_SINGLE(0x201d3, 0x0108), + K3_DDR_PHY_WRITE_SINGLE(0x2016d, 0x00fa), + K3_DDR_PHY_WRITE_SINGLE(0x201d4, 0x0108), + K3_DDR_PHY_WRITE_SINGLE(0x2016e, 0x017b), + K3_DDR_PHY_WRITE_SINGLE(0x201d5, 0x0189), + K3_DDR_PHY_WRITE_SINGLE(0x2016f, 0x017b), + K3_DDR_PHY_WRITE_SINGLE(0x201d6, 0x0189), + K3_DDR_PHY_WRITE_SINGLE(0x20170, 0x0109), + K3_DDR_PHY_WRITE_SINGLE(0x201d7, 0x0109), + K3_DDR_PHY_WRITE_SINGLE(0x20171, 0x0109), + K3_DDR_PHY_WRITE_SINGLE(0x201d8, 0x0109), + K3_DDR_PHY_WRITE_SINGLE(0x20172, 0x018a), + K3_DDR_PHY_WRITE_SINGLE(0x201d9, 0x018a), + K3_DDR_PHY_WRITE_SINGLE(0x20173, 0x018a), + K3_DDR_PHY_WRITE_SINGLE(0x201da, 0x018a), + K3_DDR_PHY_WRITE_SINGLE(0x41613, 0x0b00), + K3_DDR_PHY_WRITE_SINGLE(0x41617, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x4163b, 0x0b00), + K3_DDR_PHY_WRITE_SINGLE(0x4163f, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x41663, 0x0b00), + K3_DDR_PHY_WRITE_SINGLE(0x41667, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x4168b, 0x0b00), + K3_DDR_PHY_WRITE_SINGLE(0x4168f, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x41723, 0x0b00), + K3_DDR_PHY_WRITE_SINGLE(0x41727, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x4174b, 0x0b00), + K3_DDR_PHY_WRITE_SINGLE(0x4174f, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x417f3, 0x0b00), + K3_DDR_PHY_WRITE_SINGLE(0x417f7, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x4181b, 0x0b00), + K3_DDR_PHY_WRITE_SINGLE(0x4181f, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x41a2b, 0x6b00), + K3_DDR_PHY_WRITE_SINGLE(0x41a2f, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x41a53, 0x3b00), + K3_DDR_PHY_WRITE_SINGLE(0x41a57, 0x0800), + K3_DDR_PHY_WRITE_SINGLE(0x41a7b, 0x6b00), + K3_DDR_PHY_WRITE_SINGLE(0x41a7f, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x41aa3, 0x3b00), + K3_DDR_PHY_WRITE_SINGLE(0x41aa7, 0x0800), + K3_DDR_PHY_WRITE_SINGLE(0x41b33, 0x6b00), + K3_DDR_PHY_WRITE_SINGLE(0x41b37, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x41b5b, 0x3b00), + K3_DDR_PHY_WRITE_SINGLE(0x41b5f, 0x0800), + K3_DDR_PHY_WRITE_SINGLE(0x41bfb, 0x6b00), + K3_DDR_PHY_WRITE_SINGLE(0x41bff, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x41c23, 0x3b00), + K3_DDR_PHY_WRITE_SINGLE(0x41c27, 0x0800), + K3_DDR_PHY_WRITE_RANGE(0x41008, lp5_post_training_table_23), + K3_DDR_PHY_WRITE_SINGLE(0xc0001, 0x5061), + K3_DDR_PHY_WRITE_SINGLE(0xc0002, 0x7098), + K3_DDR_PHY_WRITE_SINGLE(0xc0003, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0xc0000, 0xbedc), + K3_DDR_PHY_WRITE_SINGLE(0xc0006, 0xb0db), + K3_DDR_PHY_WRITE_SINGLE(0xc0007, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x9070c, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x9070d, 0x07ff), + K3_DDR_PHY_WRITE_SINGLE(0x9070e, 0x0668), + K3_DDR_PHY_WRITE_SINGLE(0x90c13, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x9070f, 0x7910), + K3_DDR_PHY_WRITE_SINGLE(0x90710, 0x355e), + K3_DDR_PHY_WRITE_SINGLE(0x90711, 0xcbb5), + K3_DDR_PHY_WRITE_SINGLE(0x90713, 0xffff), + K3_DDR_PHY_WRITE_SINGLE(0x90714, 0x0710), + K3_DDR_PHY_WRITE_SINGLE(0x90715, 0x7800), + K3_DDR_PHY_WRITE_SINGLE(0x90c12, 0xff10), + K3_DDR_PHY_WRITE_SINGLE(0x90712, 0x2ee8), + K3_DDR_PHY_WRITE_SINGLE(0x90716, 0xffdf), + K3_DDR_PHY_WRITE_SINGLE(0x90717, 0x6f10), + K3_DDR_PHY_WRITE_SINGLE(0x90718, 0x6f10), + K3_DDR_PHY_WRITE_SINGLE(0x90719, 0x2868), + K3_DDR_PHY_WRITE_SINGLE(0x9071a, 0x2868), + K3_DDR_PHY_WRITE_SINGLE(0x9071b, 0xfeef), + K3_DDR_PHY_WRITE_SINGLE(0x90904, 0xe400), + K3_DDR_PHY_WRITE_SINGLE(0x90986, 0xe400), + K3_DDR_PHY_WRITE_SINGLE(0x90920, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x90921, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x90922, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x90923, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x90924, 0xff00), + K3_DDR_PHY_WRITE_SINGLE(0x90925, 0xff00), + K3_DDR_PHY_WRITE_SINGLE(0x90926, 0xff00), + K3_DDR_PHY_WRITE_SINGLE(0x90927, 0xff00), + K3_DDR_PHY_WRITE_SINGLE(0x90930, 0x4000), + K3_DDR_PHY_WRITE_SINGLE(0x90931, 0x2000), + K3_DDR_PHY_WRITE_SINGLE(0x90932, 0xff00), + K3_DDR_PHY_WRITE_SINGLE(0x90933, 0xff00), + K3_DDR_PHY_WRITE_SINGLE(0x9090a, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x9090c, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x9090d, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x200f0, 0x27f7), + K3_DDR_PHY_WRITE_SINGLE(0x200f1, 0x2108), + K3_DDR_PHY_WRITE_SINGLE(0x200f2, 0x2108), + K3_DDR_PHY_WRITE_SINGLE(0x100b9, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x100b1, 0x0180), + K3_DDR_PHY_WRITE_SINGLE(0x100ba, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x100a2, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x100b5, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x110b9, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x110b1, 0x0180), + K3_DDR_PHY_WRITE_SINGLE(0x110ba, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x110a2, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x110b5, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x120b9, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x120b1, 0x0180), + K3_DDR_PHY_WRITE_SINGLE(0x120ba, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x120a2, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x120b5, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x130b9, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x130b1, 0x0180), + K3_DDR_PHY_WRITE_SINGLE(0x130ba, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x130a2, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0x130b5, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x70024, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70025, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70026, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70027, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70028, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70029, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x7002a, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x7002b, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70124, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70125, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70126, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70127, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70128, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70129, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x7012a, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x7012b, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70224, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70225, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70226, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70227, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70228, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70229, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x7022a, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x7022b, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70324, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70325, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70326, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70327, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70328, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70329, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x7032a, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x7032b, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70424, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70425, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70426, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70427, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70428, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70429, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x7042a, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x7042b, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70524, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70525, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70526, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70527, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70528, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70529, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x7052a, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x7052b, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70624, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70625, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70626, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70627, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70628, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70629, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x7062a, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x7062b, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70724, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70725, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70726, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70727, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70728, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70729, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x7072a, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x7072b, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70824, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70825, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70826, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70827, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70828, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70829, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x7082a, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x7082b, 0x5a3c), + K3_DDR_PHY_WRITE_SINGLE(0x70065, 0x01ff), + K3_DDR_PHY_WRITE_SINGLE(0x2007e, 0x0033), + K3_DDR_PHY_WRITE_SINGLE(0x200ef, 0xffff), + K3_DDR_PHY_WRITE_SINGLE(0x90910, 0x0002), + K3_DDR_PHY_WRITE_SINGLE(0x20310, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0x20311, 0x0001), + K3_DDR_PHY_WRITE_SINGLE(0xc0080, 0x0002), + K3_DDR_PHY_WRITE_SINGLE(0xd0003, 0x0000), + K3_DDR_PHY_WRITE_SINGLE(0xd0000, 0x0001), +}; + +const struct k3_ddr_phy_table k3_ddr_lpddr5_post_train_table = { + .cfg = lp5_post_train_cfg, + .count = ARRAY_SIZE(lp5_post_train_cfg), +}; + +static const struct k3_ddr_phy_override lp5_post_srank_x16_override[] = { + {0x20072, 0x0001, 0}, + {0x9080e, 0x0001, 0}, + {0x20073, 0x0001, 0}, + {0x9080f, 0x0001, 0}, + {0x41a53, 0x2b00, 0}, + {0x41aa3, 0x2b00, 0}, + {0x41b5b, 0x2b00, 0}, + {0x41c23, 0x2b00, 0}, + {0x41a53, 0x2b00, 0}, + {0x41aa3, 0x2b00, 0}, + {0x41b5b, 0x2b00, 0}, + {0x41c23, 0x2b00, 0}, + {0x9090d, 0x0000, 0}, + {0x2007e, 0x0011, 0}, +}; + +const struct k3_ddr_phy_overrides k3_ddr_lpddr5_post_srank_x16_overrides = { + .regs = lp5_post_srank_x16_override, + .count = ARRAY_SIZE(lp5_post_srank_x16_override), +}; + +static const struct k3_ddr_phy_override lp5_post_drank_x16_override[] = { + {0x41a53, 0x2b00, 0}, + {0x41aa3, 0x2b00, 0}, + {0x41b5b, 0x2b00, 0}, + {0x41c23, 0x2b00, 0}, + {0x41a53, 0x2b00, 0}, + {0x41aa3, 0x2b00, 0}, + {0x41b5b, 0x2b00, 0}, + {0x41c23, 0x2b00, 0}, +}; + +const struct k3_ddr_phy_overrides k3_ddr_lpddr5_post_drank_x16_overrides = { + .regs = lp5_post_drank_x16_override, + .count = ARRAY_SIZE(lp5_post_drank_x16_override), +}; diff --git a/drivers/ram/spacemit/k3/k3_ddr_phy.c b/drivers/ram/spacemit/k3/k3_ddr_phy.c new file mode 100644 index 00000000000..9361ed8ae20 --- /dev/null +++ b/drivers/ram/spacemit/k3/k3_ddr_phy.c @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (C) 2026 Junhui Liu <[email protected]> + */ + +#include <asm/io.h> +#include <errno.h> +#include <linux/iopoll.h> + +#include "k3_ddr.h" + +#define K3_PHY_MICRO_MUX_SEL 0xd0000 +#define K3_PHY_MICRO_RESET 0xd0099 + +#define K3_PHY_UCT_SHADOW_REGS 0xd0004 +#define K3_PHY_UCT_EMPTY BIT(0) +#define K3_PHY_DCT_WRITE_PROT 0xd0031 +#define K3_PHY_UCT_WRITE_ONLY_SHADOW 0xd0032 + +#define K3_PHY_MSG_STREAM 0x08 +#define K3_PHY_MSG_COMPLETE 0x07 +#define K3_PHY_MSG_ERROR 0xff + +#define K3_PHY_MSG_TIMEOUT_US 10000000 + +void k3_phy_write(struct k3_ddr *ddr, unsigned int channel, u32 csr, u16 value) +{ + writel(value, ddr->phy[channel] + csr * sizeof(u32)); +} + +static u16 k3_phy_read(struct k3_ddr *ddr, unsigned int channel, u32 csr) +{ + return readl(ddr->phy[channel] + csr * sizeof(u32)); +} + +int k3_ddr_phy_load_imem(struct k3_ddr *ddr, unsigned int channel) +{ + const u16 *firmware = (const u16 *)ddr->imem_fw; + size_t words; + int i; + + if (channel >= K3_DDR_NUM_CHANNELS || !firmware || ddr->imem_fw_size % sizeof(u16)) + return -EINVAL; + + words = ddr->imem_fw_size / sizeof(u16); + + for (i = 0; i < words; i++) + k3_phy_write(ddr, channel, K3_PHY_PMU_IMEM_BASE + i, le16_to_cpu(firmware[i])); + + return 0; +} + +void k3_ddr_phy_zero_dmem(struct k3_ddr *ddr, unsigned int channel) +{ + u32 csr; + + k3_phy_write(ddr, channel, K3_PHY_MICRO_MUX_SEL, 0); + + for (csr = K3_PHY_PMU_DMEM_BASE; csr < K3_PHY_PMU_DMEM_BASE + K3_PHY_PMU_DMEM_SIZE; csr++) + k3_phy_write(ddr, channel, csr, 0); +} + +void k3_ddr_phy_start_pmu(struct k3_ddr *ddr, unsigned int channel) +{ + k3_phy_write(ddr, channel, K3_PHY_MICRO_MUX_SEL, 1); + + k3_phy_write(ddr, channel, K3_PHY_MICRO_RESET, 9); + k3_phy_write(ddr, channel, K3_PHY_MICRO_RESET, 1); + k3_phy_write(ddr, channel, K3_PHY_MICRO_RESET, 0); +} + +void k3_ddr_phy_halt_pmu(struct k3_ddr *ddr, unsigned int channel) +{ + k3_phy_write(ddr, channel, K3_PHY_MICRO_RESET, 1); + + k3_phy_write(ddr, channel, K3_PHY_MICRO_MUX_SEL, 0); +} + +static int k3_phy_wait_mailbox(struct k3_ddr *ddr, unsigned int channel, bool empty) +{ + u16 value; + + return read_poll_timeout(k3_phy_read, value, !!(value & K3_PHY_UCT_EMPTY) == empty, + 1, K3_PHY_MSG_TIMEOUT_US, ddr, channel, K3_PHY_UCT_SHADOW_REGS); +} + +static int k3_phy_ack_message(struct k3_ddr *ddr, unsigned int channel) +{ + int ret; + + k3_phy_write(ddr, channel, K3_PHY_DCT_WRITE_PROT, 0); + + ret = k3_phy_wait_mailbox(ddr, channel, true); + if (ret) + return ret; + + k3_phy_write(ddr, channel, K3_PHY_DCT_WRITE_PROT, 1); + + return 0; +} + +int k3_ddr_phy_wait_training(struct k3_ddr *ddr, unsigned int channel) +{ + u8 message_id; + u16 message; + int i, ret; + u16 count; + + if (channel >= K3_DDR_NUM_CHANNELS) + return -EINVAL; + + do { + ret = k3_phy_wait_mailbox(ddr, channel, false); + if (ret) + return ret; + + message = k3_phy_read(ddr, channel, K3_PHY_UCT_WRITE_ONLY_SHADOW); + message_id = message & 0xff; + + ret = k3_phy_ack_message(ddr, channel); + if (ret) + return ret; + + if (message_id != K3_PHY_MSG_STREAM) + continue; + + ret = k3_phy_wait_mailbox(ddr, channel, false); + if (ret) + return ret; + + count = k3_phy_read(ddr, channel, K3_PHY_UCT_WRITE_ONLY_SHADOW); + + ret = k3_phy_ack_message(ddr, channel); + if (ret) + return ret; + + for (i = 0; i < count; i++) { + ret = k3_phy_wait_mailbox(ddr, channel, false); + if (ret) + return ret; + + ret = k3_phy_ack_message(ddr, channel); + if (ret) + return ret; + } + } while (message_id != K3_PHY_MSG_COMPLETE && message_id != K3_PHY_MSG_ERROR); + + return message_id == K3_PHY_MSG_COMPLETE ? 0 : -EIO; +} diff --git a/drivers/ram/spacemit/k3/k3_ddr_profile.c b/drivers/ram/spacemit/k3/k3_ddr_profile.c new file mode 100644 index 00000000000..22ff4829968 --- /dev/null +++ b/drivers/ram/spacemit/k3/k3_ddr_profile.c @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (C) 2025 SpacemiT + * Copyright (C) 2026 Junhui Liu <[email protected]> + */ + +#include <linux/kernel.h> +#include <linux/string.h> + +#include "k3_ddr.h" + +static const struct k3_ddr_profile k3_ddr_profiles[] = { + { + .part_number = "MT62F1G32D2DS", + .part_size_mb = 4096, + .ranks = 1, + .device_width = 16, + }, + { + .part_number = "MT62F2G32D4DS", + .part_size_mb = 8192, + .ranks = 2, + .device_width = 16, + }, + { + .part_number = "RS3G32LG5D8FDB", + .part_size_mb = 12288, + .ranks = 2, + .device_width = 8, + }, + { + .part_number = "MT62F4G32D8DV", + .part_size_mb = 16384, + .ranks = 2, + .device_width = 8, + }, +}; + +const struct k3_ddr_profile *k3_ddr_find_profile(const char *part_number) +{ + int i; + + if (!part_number || !*part_number) + return NULL; + + for (i = 0; i < ARRAY_SIZE(k3_ddr_profiles); i++) { + const struct k3_ddr_profile *profile = &k3_ddr_profiles[i]; + + if (!strcmp(part_number, profile->part_number)) + return &k3_ddr_profiles[i]; + } + + return NULL; +} diff --git a/include/soc/spacemit/k3-ddr.h b/include/soc/spacemit/k3-ddr.h new file mode 100644 index 00000000000..f89fe33a87b --- /dev/null +++ b/include/soc/spacemit/k3-ddr.h @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* Copyright (C) 2026 Junhui Liu <[email protected]> */ + +#ifndef _SOC_SPACEMIT_K3_DDR_H_ +#define _SOC_SPACEMIT_K3_DDR_H_ + +#define K3_DDR_PART_NUMBER_LEN 32 + +struct k3_ddr_plat { + char part_number[K3_DDR_PART_NUMBER_LEN]; +}; + +#endif /* _SOC_SPACEMIT_K3_DDR_H_ */ -- 2.56.0
