summaryrefslogtreecommitdiffstats
path: root/arch/arm/boards/nxp-imx8mn-evk
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/boards/nxp-imx8mn-evk')
-rw-r--r--arch/arm/boards/nxp-imx8mn-evk/board.c24
-rw-r--r--arch/arm/boards/nxp-imx8mn-evk/ddr4-timing.c530
-rw-r--r--arch/arm/boards/nxp-imx8mn-evk/flash-header-imx8mn-evk.imxcfg3
-rw-r--r--arch/arm/boards/nxp-imx8mn-evk/lowlevel.c172
-rw-r--r--arch/arm/boards/nxp-imx8mn-evk/lpddr4-timing.c406
5 files changed, 71 insertions, 1064 deletions
diff --git a/arch/arm/boards/nxp-imx8mn-evk/board.c b/arch/arm/boards/nxp-imx8mn-evk/board.c
index 3c478d5f70..3e90ba284c 100644
--- a/arch/arm/boards/nxp-imx8mn-evk/board.c
+++ b/arch/arm/boards/nxp-imx8mn-evk/board.c
@@ -5,10 +5,11 @@
#include <bootsource.h>
#include <common.h>
+#include <deep-probe.h>
#include <init.h>
#include <linux/phy.h>
#include <linux/sizes.h>
-#include <mach/bbu.h>
+#include <mach/imx/bbu.h>
#include <envfs.h>
#define PHY_ID_AR8031 0x004dd074
@@ -30,14 +31,11 @@ static int ar8031_phy_fixup(struct phy_device *phydev)
return 0;
}
-static int nxp_imx8mn_evk_init(void)
+static int imx8mn_evk_probe(struct device *dev)
{
int emmc_bbu_flag = 0;
int sd_bbu_flag = 0;
- if (!of_machine_is_compatible("fsl,imx8mn-evk"))
- return 0;
-
if (bootsource_get() == BOOTSOURCE_MMC) {
if (bootsource_get_instance() == 2) {
of_device_enable_path("/chosen/environment-emmc");
@@ -53,10 +51,24 @@ static int nxp_imx8mn_evk_init(void)
imx8m_bbu_internal_mmc_register_handler("SD", "/dev/mmc1.barebox", sd_bbu_flag);
imx8m_bbu_internal_mmcboot_register_handler("eMMC", "/dev/mmc2", emmc_bbu_flag);
+ imx8m_bbu_internal_flexspi_nor_register_handler("QSPI", "/dev/m25p0.barebox", 0);
phy_register_fixup_for_uid(PHY_ID_AR8031, AR_PHY_ID_MASK,
ar8031_phy_fixup);
return 0;
}
-coredevice_initcall(nxp_imx8mn_evk_init);
+
+static const struct of_device_id imx8mn_evk_of_match[] = {
+ { .compatible = "fsl,imx8mn-evk" },
+ { .compatible = "fsl,imx8mn-ddr4-evk" },
+ { /* sentinel */ },
+};
+BAREBOX_DEEP_PROBE_ENABLE(imx8mn_evk_of_match);
+
+static struct driver imx8mn_evkboard_driver = {
+ .name = "board-imx8mn-evk",
+ .probe = imx8mn_evk_probe,
+ .of_compatible = DRV_OF_COMPAT(imx8mn_evk_of_match),
+};
+coredevice_platform_driver(imx8mn_evkboard_driver);
diff --git a/arch/arm/boards/nxp-imx8mn-evk/ddr4-timing.c b/arch/arm/boards/nxp-imx8mn-evk/ddr4-timing.c
index 7ce371384e..626d7e1c08 100644
--- a/arch/arm/boards/nxp-imx8mn-evk/ddr4-timing.c
+++ b/arch/arm/boards/nxp-imx8mn-evk/ddr4-timing.c
@@ -210,533 +210,6 @@ static struct dram_cfg_param ddr_ddrphy_cfg[] = {
{ 0x2002c, 0x0 },
};
-/* ddr phy trained csr */
-static struct dram_cfg_param ddr_ddrphy_trained_csr[] = {
- {0x0200b2, 0x0},
- {0x1200b2, 0x0},
- {0x2200b2, 0x0},
- {0x0200cb, 0x0},
- {0x010043, 0x0},
- {0x110043, 0x0},
- {0x210043, 0x0},
- {0x010143, 0x0},
- {0x110143, 0x0},
- {0x210143, 0x0},
- {0x011043, 0x0},
- {0x111043, 0x0},
- {0x211043, 0x0},
- {0x011143, 0x0},
- {0x111143, 0x0},
- {0x211143, 0x0},
- {0x000080, 0x0},
- {0x100080, 0x0},
- {0x200080, 0x0},
- {0x001080, 0x0},
- {0x101080, 0x0},
- {0x201080, 0x0},
- {0x002080, 0x0},
- {0x102080, 0x0},
- {0x202080, 0x0},
- {0x003080, 0x0},
- {0x103080, 0x0},
- {0x203080, 0x0},
- {0x004080, 0x0},
- {0x104080, 0x0},
- {0x204080, 0x0},
- {0x005080, 0x0},
- {0x105080, 0x0},
- {0x205080, 0x0},
- {0x006080, 0x0},
- {0x106080, 0x0},
- {0x206080, 0x0},
- {0x007080, 0x0},
- {0x107080, 0x0},
- {0x207080, 0x0},
- {0x008080, 0x0},
- {0x108080, 0x0},
- {0x208080, 0x0},
- {0x009080, 0x0},
- {0x109080, 0x0},
- {0x209080, 0x0},
- {0x010080, 0x0},
- {0x110080, 0x0},
- {0x210080, 0x0},
- {0x010180, 0x0},
- {0x110180, 0x0},
- {0x210180, 0x0},
- {0x010081, 0x0},
- {0x110081, 0x0},
- {0x210081, 0x0},
- {0x010181, 0x0},
- {0x110181, 0x0},
- {0x210181, 0x0},
- {0x010082, 0x0},
- {0x110082, 0x0},
- {0x210082, 0x0},
- {0x010182, 0x0},
- {0x110182, 0x0},
- {0x210182, 0x0},
- {0x010083, 0x0},
- {0x110083, 0x0},
- {0x210083, 0x0},
- {0x010183, 0x0},
- {0x110183, 0x0},
- {0x210183, 0x0},
- {0x011080, 0x0},
- {0x111080, 0x0},
- {0x211080, 0x0},
- {0x011180, 0x0},
- {0x111180, 0x0},
- {0x211180, 0x0},
- {0x011081, 0x0},
- {0x111081, 0x0},
- {0x211081, 0x0},
- {0x011181, 0x0},
- {0x111181, 0x0},
- {0x211181, 0x0},
- {0x011082, 0x0},
- {0x111082, 0x0},
- {0x211082, 0x0},
- {0x011182, 0x0},
- {0x111182, 0x0},
- {0x211182, 0x0},
- {0x011083, 0x0},
- {0x111083, 0x0},
- {0x211083, 0x0},
- {0x011183, 0x0},
- {0x111183, 0x0},
- {0x211183, 0x0},
- {0x0100d0, 0x0},
- {0x1100d0, 0x0},
- {0x2100d0, 0x0},
- {0x0101d0, 0x0},
- {0x1101d0, 0x0},
- {0x2101d0, 0x0},
- {0x0100d1, 0x0},
- {0x1100d1, 0x0},
- {0x2100d1, 0x0},
- {0x0101d1, 0x0},
- {0x1101d1, 0x0},
- {0x2101d1, 0x0},
- {0x0100d2, 0x0},
- {0x1100d2, 0x0},
- {0x2100d2, 0x0},
- {0x0101d2, 0x0},
- {0x1101d2, 0x0},
- {0x2101d2, 0x0},
- {0x0100d3, 0x0},
- {0x1100d3, 0x0},
- {0x2100d3, 0x0},
- {0x0101d3, 0x0},
- {0x1101d3, 0x0},
- {0x2101d3, 0x0},
- {0x0110d0, 0x0},
- {0x1110d0, 0x0},
- {0x2110d0, 0x0},
- {0x0111d0, 0x0},
- {0x1111d0, 0x0},
- {0x2111d0, 0x0},
- {0x0110d1, 0x0},
- {0x1110d1, 0x0},
- {0x2110d1, 0x0},
- {0x0111d1, 0x0},
- {0x1111d1, 0x0},
- {0x2111d1, 0x0},
- {0x0110d2, 0x0},
- {0x1110d2, 0x0},
- {0x2110d2, 0x0},
- {0x0111d2, 0x0},
- {0x1111d2, 0x0},
- {0x2111d2, 0x0},
- {0x0110d3, 0x0},
- {0x1110d3, 0x0},
- {0x2110d3, 0x0},
- {0x0111d3, 0x0},
- {0x1111d3, 0x0},
- {0x2111d3, 0x0},
- {0x010068, 0x0},
- {0x010168, 0x0},
- {0x010268, 0x0},
- {0x010368, 0x0},
- {0x010468, 0x0},
- {0x010568, 0x0},
- {0x010668, 0x0},
- {0x010768, 0x0},
- {0x010868, 0x0},
- {0x010069, 0x0},
- {0x010169, 0x0},
- {0x010269, 0x0},
- {0x010369, 0x0},
- {0x010469, 0x0},
- {0x010569, 0x0},
- {0x010669, 0x0},
- {0x010769, 0x0},
- {0x010869, 0x0},
- {0x01006a, 0x0},
- {0x01016a, 0x0},
- {0x01026a, 0x0},
- {0x01036a, 0x0},
- {0x01046a, 0x0},
- {0x01056a, 0x0},
- {0x01066a, 0x0},
- {0x01076a, 0x0},
- {0x01086a, 0x0},
- {0x01006b, 0x0},
- {0x01016b, 0x0},
- {0x01026b, 0x0},
- {0x01036b, 0x0},
- {0x01046b, 0x0},
- {0x01056b, 0x0},
- {0x01066b, 0x0},
- {0x01076b, 0x0},
- {0x01086b, 0x0},
- {0x011068, 0x0},
- {0x011168, 0x0},
- {0x011268, 0x0},
- {0x011368, 0x0},
- {0x011468, 0x0},
- {0x011568, 0x0},
- {0x011668, 0x0},
- {0x011768, 0x0},
- {0x011868, 0x0},
- {0x011069, 0x0},
- {0x011169, 0x0},
- {0x011269, 0x0},
- {0x011369, 0x0},
- {0x011469, 0x0},
- {0x011569, 0x0},
- {0x011669, 0x0},
- {0x011769, 0x0},
- {0x011869, 0x0},
- {0x01106a, 0x0},
- {0x01116a, 0x0},
- {0x01126a, 0x0},
- {0x01136a, 0x0},
- {0x01146a, 0x0},
- {0x01156a, 0x0},
- {0x01166a, 0x0},
- {0x01176a, 0x0},
- {0x01186a, 0x0},
- {0x01106b, 0x0},
- {0x01116b, 0x0},
- {0x01126b, 0x0},
- {0x01136b, 0x0},
- {0x01146b, 0x0},
- {0x01156b, 0x0},
- {0x01166b, 0x0},
- {0x01176b, 0x0},
- {0x01186b, 0x0},
- {0x01008c, 0x0},
- {0x11008c, 0x0},
- {0x21008c, 0x0},
- {0x01018c, 0x0},
- {0x11018c, 0x0},
- {0x21018c, 0x0},
- {0x01008d, 0x0},
- {0x11008d, 0x0},
- {0x21008d, 0x0},
- {0x01018d, 0x0},
- {0x11018d, 0x0},
- {0x21018d, 0x0},
- {0x01008e, 0x0},
- {0x11008e, 0x0},
- {0x21008e, 0x0},
- {0x01018e, 0x0},
- {0x11018e, 0x0},
- {0x21018e, 0x0},
- {0x01008f, 0x0},
- {0x11008f, 0x0},
- {0x21008f, 0x0},
- {0x01018f, 0x0},
- {0x11018f, 0x0},
- {0x21018f, 0x0},
- {0x01108c, 0x0},
- {0x11108c, 0x0},
- {0x21108c, 0x0},
- {0x01118c, 0x0},
- {0x11118c, 0x0},
- {0x21118c, 0x0},
- {0x01108d, 0x0},
- {0x11108d, 0x0},
- {0x21108d, 0x0},
- {0x01118d, 0x0},
- {0x11118d, 0x0},
- {0x21118d, 0x0},
- {0x01108e, 0x0},
- {0x11108e, 0x0},
- {0x21108e, 0x0},
- {0x01118e, 0x0},
- {0x11118e, 0x0},
- {0x21118e, 0x0},
- {0x01108f, 0x0},
- {0x11108f, 0x0},
- {0x21108f, 0x0},
- {0x01118f, 0x0},
- {0x11118f, 0x0},
- {0x21118f, 0x0},
- {0x0100c0, 0x0},
- {0x1100c0, 0x0},
- {0x2100c0, 0x0},
- {0x0101c0, 0x0},
- {0x1101c0, 0x0},
- {0x2101c0, 0x0},
- {0x0102c0, 0x0},
- {0x1102c0, 0x0},
- {0x2102c0, 0x0},
- {0x0103c0, 0x0},
- {0x1103c0, 0x0},
- {0x2103c0, 0x0},
- {0x0104c0, 0x0},
- {0x1104c0, 0x0},
- {0x2104c0, 0x0},
- {0x0105c0, 0x0},
- {0x1105c0, 0x0},
- {0x2105c0, 0x0},
- {0x0106c0, 0x0},
- {0x1106c0, 0x0},
- {0x2106c0, 0x0},
- {0x0107c0, 0x0},
- {0x1107c0, 0x0},
- {0x2107c0, 0x0},
- {0x0108c0, 0x0},
- {0x1108c0, 0x0},
- {0x2108c0, 0x0},
- {0x0100c1, 0x0},
- {0x1100c1, 0x0},
- {0x2100c1, 0x0},
- {0x0101c1, 0x0},
- {0x1101c1, 0x0},
- {0x2101c1, 0x0},
- {0x0102c1, 0x0},
- {0x1102c1, 0x0},
- {0x2102c1, 0x0},
- {0x0103c1, 0x0},
- {0x1103c1, 0x0},
- {0x2103c1, 0x0},
- {0x0104c1, 0x0},
- {0x1104c1, 0x0},
- {0x2104c1, 0x0},
- {0x0105c1, 0x0},
- {0x1105c1, 0x0},
- {0x2105c1, 0x0},
- {0x0106c1, 0x0},
- {0x1106c1, 0x0},
- {0x2106c1, 0x0},
- {0x0107c1, 0x0},
- {0x1107c1, 0x0},
- {0x2107c1, 0x0},
- {0x0108c1, 0x0},
- {0x1108c1, 0x0},
- {0x2108c1, 0x0},
- {0x0100c2, 0x0},
- {0x1100c2, 0x0},
- {0x2100c2, 0x0},
- {0x0101c2, 0x0},
- {0x1101c2, 0x0},
- {0x2101c2, 0x0},
- {0x0102c2, 0x0},
- {0x1102c2, 0x0},
- {0x2102c2, 0x0},
- {0x0103c2, 0x0},
- {0x1103c2, 0x0},
- {0x2103c2, 0x0},
- {0x0104c2, 0x0},
- {0x1104c2, 0x0},
- {0x2104c2, 0x0},
- {0x0105c2, 0x0},
- {0x1105c2, 0x0},
- {0x2105c2, 0x0},
- {0x0106c2, 0x0},
- {0x1106c2, 0x0},
- {0x2106c2, 0x0},
- {0x0107c2, 0x0},
- {0x1107c2, 0x0},
- {0x2107c2, 0x0},
- {0x0108c2, 0x0},
- {0x1108c2, 0x0},
- {0x2108c2, 0x0},
- {0x0100c3, 0x0},
- {0x1100c3, 0x0},
- {0x2100c3, 0x0},
- {0x0101c3, 0x0},
- {0x1101c3, 0x0},
- {0x2101c3, 0x0},
- {0x0102c3, 0x0},
- {0x1102c3, 0x0},
- {0x2102c3, 0x0},
- {0x0103c3, 0x0},
- {0x1103c3, 0x0},
- {0x2103c3, 0x0},
- {0x0104c3, 0x0},
- {0x1104c3, 0x0},
- {0x2104c3, 0x0},
- {0x0105c3, 0x0},
- {0x1105c3, 0x0},
- {0x2105c3, 0x0},
- {0x0106c3, 0x0},
- {0x1106c3, 0x0},
- {0x2106c3, 0x0},
- {0x0107c3, 0x0},
- {0x1107c3, 0x0},
- {0x2107c3, 0x0},
- {0x0108c3, 0x0},
- {0x1108c3, 0x0},
- {0x2108c3, 0x0},
- {0x0110c0, 0x0},
- {0x1110c0, 0x0},
- {0x2110c0, 0x0},
- {0x0111c0, 0x0},
- {0x1111c0, 0x0},
- {0x2111c0, 0x0},
- {0x0112c0, 0x0},
- {0x1112c0, 0x0},
- {0x2112c0, 0x0},
- {0x0113c0, 0x0},
- {0x1113c0, 0x0},
- {0x2113c0, 0x0},
- {0x0114c0, 0x0},
- {0x1114c0, 0x0},
- {0x2114c0, 0x0},
- {0x0115c0, 0x0},
- {0x1115c0, 0x0},
- {0x2115c0, 0x0},
- {0x0116c0, 0x0},
- {0x1116c0, 0x0},
- {0x2116c0, 0x0},
- {0x0117c0, 0x0},
- {0x1117c0, 0x0},
- {0x2117c0, 0x0},
- {0x0118c0, 0x0},
- {0x1118c0, 0x0},
- {0x2118c0, 0x0},
- {0x0110c1, 0x0},
- {0x1110c1, 0x0},
- {0x2110c1, 0x0},
- {0x0111c1, 0x0},
- {0x1111c1, 0x0},
- {0x2111c1, 0x0},
- {0x0112c1, 0x0},
- {0x1112c1, 0x0},
- {0x2112c1, 0x0},
- {0x0113c1, 0x0},
- {0x1113c1, 0x0},
- {0x2113c1, 0x0},
- {0x0114c1, 0x0},
- {0x1114c1, 0x0},
- {0x2114c1, 0x0},
- {0x0115c1, 0x0},
- {0x1115c1, 0x0},
- {0x2115c1, 0x0},
- {0x0116c1, 0x0},
- {0x1116c1, 0x0},
- {0x2116c1, 0x0},
- {0x0117c1, 0x0},
- {0x1117c1, 0x0},
- {0x2117c1, 0x0},
- {0x0118c1, 0x0},
- {0x1118c1, 0x0},
- {0x2118c1, 0x0},
- {0x0110c2, 0x0},
- {0x1110c2, 0x0},
- {0x2110c2, 0x0},
- {0x0111c2, 0x0},
- {0x1111c2, 0x0},
- {0x2111c2, 0x0},
- {0x0112c2, 0x0},
- {0x1112c2, 0x0},
- {0x2112c2, 0x0},
- {0x0113c2, 0x0},
- {0x1113c2, 0x0},
- {0x2113c2, 0x0},
- {0x0114c2, 0x0},
- {0x1114c2, 0x0},
- {0x2114c2, 0x0},
- {0x0115c2, 0x0},
- {0x1115c2, 0x0},
- {0x2115c2, 0x0},
- {0x0116c2, 0x0},
- {0x1116c2, 0x0},
- {0x2116c2, 0x0},
- {0x0117c2, 0x0},
- {0x1117c2, 0x0},
- {0x2117c2, 0x0},
- {0x0118c2, 0x0},
- {0x1118c2, 0x0},
- {0x2118c2, 0x0},
- {0x0110c3, 0x0},
- {0x1110c3, 0x0},
- {0x2110c3, 0x0},
- {0x0111c3, 0x0},
- {0x1111c3, 0x0},
- {0x2111c3, 0x0},
- {0x0112c3, 0x0},
- {0x1112c3, 0x0},
- {0x2112c3, 0x0},
- {0x0113c3, 0x0},
- {0x1113c3, 0x0},
- {0x2113c3, 0x0},
- {0x0114c3, 0x0},
- {0x1114c3, 0x0},
- {0x2114c3, 0x0},
- {0x0115c3, 0x0},
- {0x1115c3, 0x0},
- {0x2115c3, 0x0},
- {0x0116c3, 0x0},
- {0x1116c3, 0x0},
- {0x2116c3, 0x0},
- {0x0117c3, 0x0},
- {0x1117c3, 0x0},
- {0x2117c3, 0x0},
- {0x0118c3, 0x0},
- {0x1118c3, 0x0},
- {0x2118c3, 0x0},
- {0x010020, 0x0},
- {0x110020, 0x0},
- {0x210020, 0x0},
- {0x011020, 0x0},
- {0x111020, 0x0},
- {0x211020, 0x0},
- {0x02007d, 0x0},
- {0x12007d, 0x0},
- {0x22007d, 0x0},
- {0x010040, 0x0},
- {0x010140, 0x0},
- {0x010240, 0x0},
- {0x010340, 0x0},
- {0x010440, 0x0},
- {0x010540, 0x0},
- {0x010640, 0x0},
- {0x010740, 0x0},
- {0x010840, 0x0},
- {0x010030, 0x0},
- {0x010130, 0x0},
- {0x010230, 0x0},
- {0x010330, 0x0},
- {0x010430, 0x0},
- {0x010530, 0x0},
- {0x010630, 0x0},
- {0x010730, 0x0},
- {0x010830, 0x0},
- {0x011040, 0x0},
- {0x011140, 0x0},
- {0x011240, 0x0},
- {0x011340, 0x0},
- {0x011440, 0x0},
- {0x011540, 0x0},
- {0x011640, 0x0},
- {0x011740, 0x0},
- {0x011840, 0x0},
- {0x011030, 0x0},
- {0x011130, 0x0},
- {0x011230, 0x0},
- {0x011330, 0x0},
- {0x011430, 0x0},
- {0x011530, 0x0},
- {0x011630, 0x0},
- {0x011730, 0x0},
- {0x011830, 0x0},
-};
-
/* P0 message block paremeter for training firmware */
static struct dram_cfg_param ddr_fsp0_cfg[] = {
{ 0xd0000, 0x0 },
@@ -1040,15 +513,12 @@ static struct dram_fsp_msg ddr_dram_fsp_msg[] = {
/* ddr timing config params */
struct dram_timing_info imx8mn_evk_ddr4_timing = {
- .dram_type = DRAM_TYPE_DDR4,
.ddrc_cfg = ddr_ddrc_cfg,
.ddrc_cfg_num = ARRAY_SIZE(ddr_ddrc_cfg),
.ddrphy_cfg = ddr_ddrphy_cfg,
.ddrphy_cfg_num = ARRAY_SIZE(ddr_ddrphy_cfg),
.fsp_msg = ddr_dram_fsp_msg,
.fsp_msg_num = ARRAY_SIZE(ddr_dram_fsp_msg),
- .ddrphy_trained_csr = ddr_ddrphy_trained_csr,
- .ddrphy_trained_csr_num = ARRAY_SIZE(ddr_ddrphy_trained_csr),
.ddrphy_pie = ddr_phy_pie,
.ddrphy_pie_num = ARRAY_SIZE(ddr_phy_pie),
.fsp_table = { 2400, 1066, },
diff --git a/arch/arm/boards/nxp-imx8mn-evk/flash-header-imx8mn-evk.imxcfg b/arch/arm/boards/nxp-imx8mn-evk/flash-header-imx8mn-evk.imxcfg
index 27a2138e43..f47ea08266 100644
--- a/arch/arm/boards/nxp-imx8mn-evk/flash-header-imx8mn-evk.imxcfg
+++ b/arch/arm/boards/nxp-imx8mn-evk/flash-header-imx8mn-evk.imxcfg
@@ -5,3 +5,6 @@ soc imx8mn
loadaddr 0x912000
max_load_size 0x3f000
ivtofs 0x0
+
+#include <mach/imx/flexspi-imx8mp-cfg.h>
+#include <mach/imx/habv4-imx8-gencsf.h>
diff --git a/arch/arm/boards/nxp-imx8mn-evk/lowlevel.c b/arch/arm/boards/nxp-imx8mn-evk/lowlevel.c
index de53213ebc..a1a501b1d9 100644
--- a/arch/arm/boards/nxp-imx8mn-evk/lowlevel.c
+++ b/arch/arm/boards/nxp-imx8mn-evk/lowlevel.c
@@ -1,29 +1,30 @@
// SPDX-License-Identifier: GPL-2.0
#include <io.h>
+#include <image-metadata.h>
#include <common.h>
#include <debug_ll.h>
+#include <mach/imx/debug_ll.h>
#include <firmware.h>
#include <asm/mmu.h>
#include <asm/cache.h>
#include <asm/sections.h>
#include <asm/barebox-arm.h>
#include <asm/barebox-arm-head.h>
-#include <i2c/i2c-early.h>
+#include <pbl/i2c.h>
+#include <pbl/pmic.h>
#include <linux/sizes.h>
-#include <mach/atf.h>
-#include <mach/xload.h>
-#include <mach/esdctl.h>
-#include <mach/generic.h>
-#include <mach/imx8mn-regs.h>
-#include <mach/iomux-mx8mn.h>
-#include <mach/imx8m-ccm-regs.h>
+#include <mach/imx/atf.h>
+#include <mach/imx/xload.h>
+#include <mach/imx/esdctl.h>
+#include <mach/imx/generic.h>
+#include <mach/imx/imx8mn-regs.h>
+#include <mach/imx/iomux-mx8mn.h>
+#include <mach/imx/imx8m-ccm-regs.h>
#include <mfd/pca9450.h>
#include <mfd/bd71837.h>
#include <soc/imx8m/ddr.h>
-extern char __dtb_z_imx8mn_evk_start[];
-
static void setup_uart(void)
{
void __iomem *uart = IOMEM(MX8M_UART2_BASE_ADDR);
@@ -38,108 +39,50 @@ static void setup_uart(void)
putc_ll('>');
}
-static void pmic_reg_write(void *i2c, int addr, int reg, uint8_t val)
-{
- int ret;
- u8 buf[32];
- struct i2c_msg msgs[] = {
- {
- .addr = addr,
- .buf = buf,
- },
- };
-
- buf[0] = reg;
- buf[1] = val;
-
- msgs[0].len = 2;
-
- ret = i2c_fsl_xfer(i2c, msgs, ARRAY_SIZE(msgs));
- if (ret != 1)
- pr_err("Failed to write to pmic@%x: %d\n", addr, ret);
-}
-
-static int power_init_board_pca9450(void *i2c, int addr)
-{
- u8 buf[1];
- struct i2c_msg msgs[] = {
- {
- .addr = addr,
- .buf = buf,
- .flags = I2C_M_RD,
- .len = 1,
- },
- };
-
- if (i2c_fsl_xfer(i2c, msgs, 1) != 1)
- return -ENODEV;
-
+static struct pmic_config pca9450_cfg[] = {
/* BUCKxOUT_DVS0/1 control BUCK123 output */
- pmic_reg_write(i2c, addr, PCA9450_BUCK123_DVS, 0x29);
-
+ { PCA9450_BUCK123_DVS, 0x29 },
/*
* increase VDD_SOC to typical value 0.95V before first
* DRAM access, set DVS1 to 0.85v for suspend.
* Enable DVS control through PMIC_STBY_REQ and
* set B1_ENMODE=1 (ON by PMIC_ON_REQ=H)
*/
- pmic_reg_write(i2c, addr, PCA9450_BUCK1OUT_DVS0, 0x1C);
-
+ { PCA9450_BUCK1OUT_DVS0, 0x1C },
/* Set DVS1 to 0.85v for suspend */
/* Enable DVS control through PMIC_STBY_REQ and set B1_ENMODE=1 (ON by PMIC_ON_REQ=H) */
- pmic_reg_write(i2c, addr, PCA9450_BUCK1OUT_DVS1, 0x14);
- pmic_reg_write(i2c, addr, PCA9450_BUCK1CTRL, 0x59);
-
+ { PCA9450_BUCK1OUT_DVS1, 0x14 },
+ { PCA9450_BUCK1CTRL, 0x59 },
/* set VDD_SNVS_0V8 from default 0.85V */
- pmic_reg_write(i2c, addr, PCA9450_LDO2CTRL, 0xC0);
-
+ { PCA9450_LDO2CTRL, 0xC0 },
/* enable LDO4 to 1.2v */
- pmic_reg_write(i2c, addr, PCA9450_LDO4CTRL, 0x44);
-
+ { PCA9450_LDO4CTRL, 0x44 },
/* set WDOG_B_CFG to cold reset */
- pmic_reg_write(i2c, addr, PCA9450_RESET_CTRL, 0xA1);
+ { PCA9450_RESET_CTRL, 0xA1 },
+};
- return 0;
-}
-
-static int power_init_board_bd71837(void *i2c, int addr)
-{
+static struct pmic_config bd71837_cfg[] = {
/* decrease RESET key long push time from the default 10s to 10ms */
- pmic_reg_write(i2c, addr, BD718XX_PWRONCONFIG1, 0x0);
-
+ { BD718XX_PWRONCONFIG1, 0x0 },
/* unlock the PMIC regs */
- pmic_reg_write(i2c, addr, BD718XX_REGLOCK, 0x1);
-
+ { BD718XX_REGLOCK, 0x1 },
/* Set VDD_ARM to typical value 0.85v for 1.2Ghz */
- pmic_reg_write(i2c, addr, BD718XX_BUCK2_VOLT_RUN, 0xf);
-
+ { BD718XX_BUCK2_VOLT_RUN, 0xf },
/* Set VDD_SOC/VDD_DRAM to typical value 0.85v for nominal mode */
- pmic_reg_write(i2c, addr, BD718XX_BUCK1_VOLT_RUN, 0xf);
-
+ { BD718XX_BUCK1_VOLT_RUN, 0xf },
/* Set VDD_SOC 0.85v for suspend */
- pmic_reg_write(i2c, addr, BD718XX_BUCK1_VOLT_SUSP, 0xf);
-
- /* increase NVCC_DRAM_1V2 to 1.2v for DDR4
- * */
- pmic_reg_write(i2c, addr, BD718XX_4TH_NODVS_BUCK_CTRL, 0x28);
-
+ { BD718XX_BUCK1_VOLT_SUSP, 0xf },
+ /* increase NVCC_DRAM_1V2 to 1.2v for DDR4 */
+ { BD718XX_4TH_NODVS_BUCK_CTRL, 0x28 },
/* lock the PMIC regs */
- pmic_reg_write(i2c, addr, BD718XX_REGLOCK, 0x11);
-
- return 0;
-}
+ { BD718XX_REGLOCK, 0x11 },
+};
extern struct dram_timing_info imx8mn_evk_ddr4_timing, imx8mn_evk_lpddr4_timing;
static void start_atf(void)
{
- struct dram_timing_info *dram_timing = &imx8mn_evk_lpddr4_timing;
- size_t bl31_size;
- const u8 *bl31;
- enum bootsource src;
- void *i2c;
- int instance;
- int ret;
+ struct pbl_i2c *i2c;
/*
* If we are in EL3 we are running for the first time and need to
@@ -149,48 +92,24 @@ static void start_atf(void)
if (current_el() != 3)
return;
+ imx8mn_early_clock_init();
+
imx8mn_setup_pad(IMX8MN_PAD_I2C1_SCL__I2C1_SCL);
imx8mn_setup_pad(IMX8MN_PAD_I2C1_SDA__I2C1_SDA);
- imx8mn_early_clock_init();
imx8m_ccgr_clock_enable(IMX8M_CCM_CCGR_I2C1);
i2c = imx8m_i2c_early_init(IOMEM(MX8MN_I2C1_BASE_ADDR));
- ret = power_init_board_pca9450(i2c, 0x25);
- if (ret) {
- power_init_board_bd71837(i2c, 0x4b);
- dram_timing = &imx8mn_evk_ddr4_timing;
+ if (i2c_dev_probe(i2c, 0x25, true) == 0) {
+ pmic_configure(i2c, 0x25, pca9450_cfg, ARRAY_SIZE(pca9450_cfg));
+ imx8mn_ddr_init(&imx8mn_evk_lpddr4_timing, DRAM_TYPE_LPDDR4);
+ } else {
+ pmic_configure(i2c, 0x4b, bd71837_cfg, ARRAY_SIZE(bd71837_cfg));
+ imx8mn_ddr_init(&imx8mn_evk_ddr4_timing, DRAM_TYPE_DDR4);
}
- imx8mn_ddr_init(dram_timing);
-
- imx8mn_get_boot_source(&src, &instance);
- switch (src) {
- case BOOTSOURCE_MMC:
- imx8mn_esdhc_load_image(instance, false);
- break;
- default:
- printf("Unhandled bootsource BOOTSOURCE_%d\n", src);
- hang();
- }
-
- /*
- * On completion the TF-A will jump to MX8M_ATF_BL33_BASE_ADDR
- * in EL2. Copy the image there, but replace the PBL part of
- * that image with ourselves. On a high assurance boot only the
- * currently running code is validated and contains the checksum
- * for the piggy data, so we need to ensure that we are running
- * the same code in DRAM.
- */
- memcpy((void *)MX8M_ATF_BL33_BASE_ADDR,
- __image_start, barebox_pbl_size);
-
- get_builtin_firmware(imx8mn_bl31_bin, &bl31, &bl31_size);
-
- imx8mn_atf_load_bl31(bl31, bl31_size);
-
- /* not reached */
+ imx8mn_load_and_start_image_via_tfa();
}
/*
@@ -211,14 +130,23 @@ static void start_atf(void)
*/
static __noreturn noinline void nxp_imx8mn_evk_start(void)
{
+ extern char __dtb_z_imx8mn_evk_start[], __dtb_z_imx8mn_ddr4_evk_start[];
+ void *fdt;
+
setup_uart();
start_atf();
+ /* Check if we configured DDR4 in EL3 */
+ if (readl(MX8M_DDRC_CTL_BASE_ADDR) & BIT(4))
+ fdt = __dtb_z_imx8mn_ddr4_evk_start;
+ else
+ fdt = __dtb_z_imx8mn_evk_start;
+
/*
* Standard entry we hit once we initialized both DDR and ATF
*/
- imx8mn_barebox_entry(__dtb_z_imx8mn_evk_start);
+ imx8mn_barebox_entry(fdt);
}
ENTRY_FUNCTION(start_nxp_imx8mn_evk, r0, r1, r2)
diff --git a/arch/arm/boards/nxp-imx8mn-evk/lpddr4-timing.c b/arch/arm/boards/nxp-imx8mn-evk/lpddr4-timing.c
index c53bcc705d..902c607a82 100644
--- a/arch/arm/boards/nxp-imx8mn-evk/lpddr4-timing.c
+++ b/arch/arm/boards/nxp-imx8mn-evk/lpddr4-timing.c
@@ -278,409 +278,6 @@ static struct dram_cfg_param ddr_ddrphy_cfg[] = {
{0x000d0000, 0x00000001},
};
-/* ddr phy trained csr */
-static struct dram_cfg_param ddr_ddrphy_trained_csr[] = {
- {0x0200b2, 0x0},
- {0x1200b2, 0x0},
- {0x2200b2, 0x0},
- {0x0200cb, 0x0},
- {0x010043, 0x0},
- {0x110043, 0x0},
- {0x210043, 0x0},
- {0x010143, 0x0},
- {0x110143, 0x0},
- {0x210143, 0x0},
- {0x011043, 0x0},
- {0x111043, 0x0},
- {0x211043, 0x0},
- {0x011143, 0x0},
- {0x111143, 0x0},
- {0x211143, 0x0},
- {0x000080, 0x0},
- {0x100080, 0x0},
- {0x200080, 0x0},
- {0x001080, 0x0},
- {0x101080, 0x0},
- {0x201080, 0x0},
- {0x002080, 0x0},
- {0x102080, 0x0},
- {0x202080, 0x0},
- {0x003080, 0x0},
- {0x103080, 0x0},
- {0x203080, 0x0},
- {0x004080, 0x0},
- {0x104080, 0x0},
- {0x204080, 0x0},
- {0x005080, 0x0},
- {0x105080, 0x0},
- {0x205080, 0x0},
- {0x006080, 0x0},
- {0x106080, 0x0},
- {0x206080, 0x0},
- {0x007080, 0x0},
- {0x107080, 0x0},
- {0x207080, 0x0},
- {0x008080, 0x0},
- {0x108080, 0x0},
- {0x208080, 0x0},
- {0x009080, 0x0},
- {0x109080, 0x0},
- {0x209080, 0x0},
- {0x010080, 0x0},
- {0x110080, 0x0},
- {0x210080, 0x0},
- {0x010180, 0x0},
- {0x110180, 0x0},
- {0x210180, 0x0},
- {0x011080, 0x0},
- {0x111080, 0x0},
- {0x211080, 0x0},
- {0x011180, 0x0},
- {0x111180, 0x0},
- {0x211180, 0x0},
- {0x010081, 0x0},
- {0x110081, 0x0},
- {0x210081, 0x0},
- {0x010181, 0x0},
- {0x110181, 0x0},
- {0x210181, 0x0},
- {0x011081, 0x0},
- {0x111081, 0x0},
- {0x211081, 0x0},
- {0x011181, 0x0},
- {0x111181, 0x0},
- {0x211181, 0x0},
- {0x0100d0, 0x0},
- {0x1100d0, 0x0},
- {0x2100d0, 0x0},
- {0x0101d0, 0x0},
- {0x1101d0, 0x0},
- {0x2101d0, 0x0},
- {0x0110d0, 0x0},
- {0x1110d0, 0x0},
- {0x2110d0, 0x0},
- {0x0111d0, 0x0},
- {0x1111d0, 0x0},
- {0x2111d0, 0x0},
- {0x0100d1, 0x0},
- {0x1100d1, 0x0},
- {0x2100d1, 0x0},
- {0x0101d1, 0x0},
- {0x1101d1, 0x0},
- {0x2101d1, 0x0},
- {0x0110d1, 0x0},
- {0x1110d1, 0x0},
- {0x2110d1, 0x0},
- {0x0111d1, 0x0},
- {0x1111d1, 0x0},
- {0x2111d1, 0x0},
- {0x010068, 0x0},
- {0x010168, 0x0},
- {0x010268, 0x0},
- {0x010368, 0x0},
- {0x010468, 0x0},
- {0x010568, 0x0},
- {0x010668, 0x0},
- {0x010768, 0x0},
- {0x010868, 0x0},
- {0x011068, 0x0},
- {0x011168, 0x0},
- {0x011268, 0x0},
- {0x011368, 0x0},
- {0x011468, 0x0},
- {0x011568, 0x0},
- {0x011668, 0x0},
- {0x011768, 0x0},
- {0x011868, 0x0},
- {0x010069, 0x0},
- {0x010169, 0x0},
- {0x010269, 0x0},
- {0x010369, 0x0},
- {0x010469, 0x0},
- {0x010569, 0x0},
- {0x010669, 0x0},
- {0x010769, 0x0},
- {0x010869, 0x0},
- {0x011069, 0x0},
- {0x011169, 0x0},
- {0x011269, 0x0},
- {0x011369, 0x0},
- {0x011469, 0x0},
- {0x011569, 0x0},
- {0x011669, 0x0},
- {0x011769, 0x0},
- {0x011869, 0x0},
- {0x01008c, 0x0},
- {0x11008c, 0x0},
- {0x21008c, 0x0},
- {0x01018c, 0x0},
- {0x11018c, 0x0},
- {0x21018c, 0x0},
- {0x01108c, 0x0},
- {0x11108c, 0x0},
- {0x21108c, 0x0},
- {0x01118c, 0x0},
- {0x11118c, 0x0},
- {0x21118c, 0x0},
- {0x01008d, 0x0},
- {0x11008d, 0x0},
- {0x21008d, 0x0},
- {0x01018d, 0x0},
- {0x11018d, 0x0},
- {0x21018d, 0x0},
- {0x01108d, 0x0},
- {0x11108d, 0x0},
- {0x21108d, 0x0},
- {0x01118d, 0x0},
- {0x11118d, 0x0},
- {0x21118d, 0x0},
- {0x0100c0, 0x0},
- {0x1100c0, 0x0},
- {0x2100c0, 0x0},
- {0x0101c0, 0x0},
- {0x1101c0, 0x0},
- {0x2101c0, 0x0},
- {0x0102c0, 0x0},
- {0x1102c0, 0x0},
- {0x2102c0, 0x0},
- {0x0103c0, 0x0},
- {0x1103c0, 0x0},
- {0x2103c0, 0x0},
- {0x0104c0, 0x0},
- {0x1104c0, 0x0},
- {0x2104c0, 0x0},
- {0x0105c0, 0x0},
- {0x1105c0, 0x0},
- {0x2105c0, 0x0},
- {0x0106c0, 0x0},
- {0x1106c0, 0x0},
- {0x2106c0, 0x0},
- {0x0107c0, 0x0},
- {0x1107c0, 0x0},
- {0x2107c0, 0x0},
- {0x0108c0, 0x0},
- {0x1108c0, 0x0},
- {0x2108c0, 0x0},
- {0x0110c0, 0x0},
- {0x1110c0, 0x0},
- {0x2110c0, 0x0},
- {0x0111c0, 0x0},
- {0x1111c0, 0x0},
- {0x2111c0, 0x0},
- {0x0112c0, 0x0},
- {0x1112c0, 0x0},
- {0x2112c0, 0x0},
- {0x0113c0, 0x0},
- {0x1113c0, 0x0},
- {0x2113c0, 0x0},
- {0x0114c0, 0x0},
- {0x1114c0, 0x0},
- {0x2114c0, 0x0},
- {0x0115c0, 0x0},
- {0x1115c0, 0x0},
- {0x2115c0, 0x0},
- {0x0116c0, 0x0},
- {0x1116c0, 0x0},
- {0x2116c0, 0x0},
- {0x0117c0, 0x0},
- {0x1117c0, 0x0},
- {0x2117c0, 0x0},
- {0x0118c0, 0x0},
- {0x1118c0, 0x0},
- {0x2118c0, 0x0},
- {0x0100c1, 0x0},
- {0x1100c1, 0x0},
- {0x2100c1, 0x0},
- {0x0101c1, 0x0},
- {0x1101c1, 0x0},
- {0x2101c1, 0x0},
- {0x0102c1, 0x0},
- {0x1102c1, 0x0},
- {0x2102c1, 0x0},
- {0x0103c1, 0x0},
- {0x1103c1, 0x0},
- {0x2103c1, 0x0},
- {0x0104c1, 0x0},
- {0x1104c1, 0x0},
- {0x2104c1, 0x0},
- {0x0105c1, 0x0},
- {0x1105c1, 0x0},
- {0x2105c1, 0x0},
- {0x0106c1, 0x0},
- {0x1106c1, 0x0},
- {0x2106c1, 0x0},
- {0x0107c1, 0x0},
- {0x1107c1, 0x0},
- {0x2107c1, 0x0},
- {0x0108c1, 0x0},
- {0x1108c1, 0x0},
- {0x2108c1, 0x0},
- {0x0110c1, 0x0},
- {0x1110c1, 0x0},
- {0x2110c1, 0x0},
- {0x0111c1, 0x0},
- {0x1111c1, 0x0},
- {0x2111c1, 0x0},
- {0x0112c1, 0x0},
- {0x1112c1, 0x0},
- {0x2112c1, 0x0},
- {0x0113c1, 0x0},
- {0x1113c1, 0x0},
- {0x2113c1, 0x0},
- {0x0114c1, 0x0},
- {0x1114c1, 0x0},
- {0x2114c1, 0x0},
- {0x0115c1, 0x0},
- {0x1115c1, 0x0},
- {0x2115c1, 0x0},
- {0x0116c1, 0x0},
- {0x1116c1, 0x0},
- {0x2116c1, 0x0},
- {0x0117c1, 0x0},
- {0x1117c1, 0x0},
- {0x2117c1, 0x0},
- {0x0118c1, 0x0},
- {0x1118c1, 0x0},
- {0x2118c1, 0x0},
- {0x010020, 0x0},
- {0x110020, 0x0},
- {0x210020, 0x0},
- {0x011020, 0x0},
- {0x111020, 0x0},
- {0x211020, 0x0},
- {0x020072, 0x0},
- {0x020073, 0x0},
- {0x020074, 0x0},
- {0x0100aa, 0x0},
- {0x0110aa, 0x0},
- {0x020010, 0x0},
- {0x120010, 0x0},
- {0x220010, 0x0},
- {0x020011, 0x0},
- {0x120011, 0x0},
- {0x220011, 0x0},
- {0x0100ae, 0x0},
- {0x1100ae, 0x0},
- {0x2100ae, 0x0},
- {0x0100af, 0x0},
- {0x1100af, 0x0},
- {0x2100af, 0x0},
- {0x0110ae, 0x0},
- {0x1110ae, 0x0},
- {0x2110ae, 0x0},
- {0x0110af, 0x0},
- {0x1110af, 0x0},
- {0x2110af, 0x0},
- {0x020020, 0x0},
- {0x120020, 0x0},
- {0x220020, 0x0},
- {0x0100a0, 0x0},
- {0x0100a1, 0x0},
- {0x0100a2, 0x0},
- {0x0100a3, 0x0},
- {0x0100a4, 0x0},
- {0x0100a5, 0x0},
- {0x0100a6, 0x0},
- {0x0100a7, 0x0},
- {0x0110a0, 0x0},
- {0x0110a1, 0x0},
- {0x0110a2, 0x0},
- {0x0110a3, 0x0},
- {0x0110a4, 0x0},
- {0x0110a5, 0x0},
- {0x0110a6, 0x0},
- {0x0110a7, 0x0},
- {0x02007c, 0x0},
- {0x12007c, 0x0},
- {0x22007c, 0x0},
- {0x02007d, 0x0},
- {0x12007d, 0x0},
- {0x22007d, 0x0},
- {0x0400fd, 0x0},
- {0x0400c0, 0x0},
- {0x090201, 0x0},
- {0x190201, 0x0},
- {0x290201, 0x0},
- {0x090202, 0x0},
- {0x190202, 0x0},
- {0x290202, 0x0},
- {0x090203, 0x0},
- {0x190203, 0x0},
- {0x290203, 0x0},
- {0x090204, 0x0},
- {0x190204, 0x0},
- {0x290204, 0x0},
- {0x090205, 0x0},
- {0x190205, 0x0},
- {0x290205, 0x0},
- {0x090206, 0x0},
- {0x190206, 0x0},
- {0x290206, 0x0},
- {0x090207, 0x0},
- {0x190207, 0x0},
- {0x290207, 0x0},
- {0x090208, 0x0},
- {0x190208, 0x0},
- {0x290208, 0x0},
- {0x010062, 0x0},
- {0x010162, 0x0},
- {0x010262, 0x0},
- {0x010362, 0x0},
- {0x010462, 0x0},
- {0x010562, 0x0},
- {0x010662, 0x0},
- {0x010762, 0x0},
- {0x010862, 0x0},
- {0x011062, 0x0},
- {0x011162, 0x0},
- {0x011262, 0x0},
- {0x011362, 0x0},
- {0x011462, 0x0},
- {0x011562, 0x0},
- {0x011662, 0x0},
- {0x011762, 0x0},
- {0x011862, 0x0},
- {0x020077, 0x0},
- {0x010001, 0x0},
- {0x011001, 0x0},
- {0x010040, 0x0},
- {0x010140, 0x0},
- {0x010240, 0x0},
- {0x010340, 0x0},
- {0x010440, 0x0},
- {0x010540, 0x0},
- {0x010640, 0x0},
- {0x010740, 0x0},
- {0x010840, 0x0},
- {0x010030, 0x0},
- {0x010130, 0x0},
- {0x010230, 0x0},
- {0x010330, 0x0},
- {0x010430, 0x0},
- {0x010530, 0x0},
- {0x010630, 0x0},
- {0x010730, 0x0},
- {0x010830, 0x0},
- {0x011040, 0x0},
- {0x011140, 0x0},
- {0x011240, 0x0},
- {0x011340, 0x0},
- {0x011440, 0x0},
- {0x011540, 0x0},
- {0x011640, 0x0},
- {0x011740, 0x0},
- {0x011840, 0x0},
- {0x011030, 0x0},
- {0x011130, 0x0},
- {0x011230, 0x0},
- {0x011330, 0x0},
- {0x011430, 0x0},
- {0x011530, 0x0},
- {0x011630, 0x0},
- {0x011730, 0x0},
- {0x011830, 0x0},
-};
-
/* P0 message block paremeter for training firmware */
static struct dram_cfg_param ddr_fsp0_cfg[] = {
{0x000d0000, 0x00000000},
@@ -1576,15 +1173,12 @@ static struct dram_fsp_msg ddr_dram_fsp_msg[] = {
/* ddr timing config params */
struct dram_timing_info imx8mn_evk_lpddr4_timing = {
- .dram_type = DRAM_TYPE_LPDDR4,
.ddrc_cfg = ddr_ddrc_cfg,
.ddrc_cfg_num = ARRAY_SIZE(ddr_ddrc_cfg),
.ddrphy_cfg = ddr_ddrphy_cfg,
.ddrphy_cfg_num = ARRAY_SIZE(ddr_ddrphy_cfg),
.fsp_msg = ddr_dram_fsp_msg,
.fsp_msg_num = ARRAY_SIZE(ddr_dram_fsp_msg),
- .ddrphy_trained_csr = ddr_ddrphy_trained_csr,
- .ddrphy_trained_csr_num = ARRAY_SIZE(ddr_ddrphy_trained_csr),
.ddrphy_pie = ddr_phy_pie,
.ddrphy_pie_num = ARRAY_SIZE(ddr_phy_pie),
.fsp_table = { 3200, 400, 100, },