U-Boot
Threads by month
- ----- 2025 -----
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2000 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
March 2021
- 196 participants
- 648 discussions

[PATCH V2] ARM: imx: Include u-boot.img in u-boot-with-spl.imx if OF_SEPARATE=y
by Marek Vasut 01 Mar '21
by Marek Vasut 01 Mar '21
01 Mar '21
The u-boot-with-spl.imx is a concatenation of SPL and u-boot.uim.
The u-boot.uim is u-boot.bin wrapped in uImage. In case OF_SEPARATE
is enabled, the u-boot.bin does not contain control DT for U-Boot,
and so u-boot.uim does not contain the DT, and so u-boot-with-spl.imx
does not contain the DT, and a system where u-boot-with-spl.imx is
written to offset 1024B to the start of storage no longer boots, as
it is missing DT.
In case OF_SEPARATE is enabled, u-boot.img contains both u-boot.bin
and the necessary DTs. Therefore, use u-boot.img instead of u-boot.uim
to generate u-boot-with-spl.imx when OF_SEPARATE is enabled.
Tested-by: Fabio Estevam <festevam(a)gmail.com>
Signed-off-by: Marek Vasut <marex(a)denx.de>
Cc: Christoph Niedermaier <cniedermaier(a)dh-electronics.de>
Cc: Fabio Estevam <festevam(a)gmail.com>
Cc: Peng Fan <peng.fan(a)nxp.com>
Cc: Simon Glass <sjg(a)chromium.org>
Cc: Stefano Babic <sbabic(a)denx.de>
Cc: Ye Li <ye.li(a)nxp.com>
Cc: uboot-imx <uboot-imx(a)nxp.com>
---
V2: Swap the u-boot.uim <-> u-boot.img in the conditional so this would
match the patch which Fabio originally tested
---
arch/arm/mach-imx/Makefile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
index 1aa26a50ad8..e6b4654cd35 100644
--- a/arch/arm/mach-imx/Makefile
+++ b/arch/arm/mach-imx/Makefile
@@ -202,10 +202,10 @@ append = cat $(filter-out $< $(PHONY), $^) >> $@
quiet_cmd_pad_cat = CAT $@
cmd_pad_cat = $(cmd_objcopy) && $(append) || rm -f $@
-u-boot-with-spl.imx: SPL u-boot.uim FORCE
+u-boot-with-spl.imx: SPL $(if $(CONFIG_OF_SEPARATE),u-boot.img,u-boot.uim) FORCE
$(call if_changed,pad_cat)
-u-boot-with-nand-spl.imx: spl/u-boot-nand-spl.imx u-boot.uim FORCE
+u-boot-with-nand-spl.imx: spl/u-boot-nand-spl.imx $(if $(CONFIG_OF_SEPARATE),u-boot.img,u-boot.uim) FORCE
$(call if_changed,pad_cat)
quiet_cmd_u-boot-nand-spl_imx = GEN $@
--
2.29.2
5
11
A TrueType font for U-Boot should fulfill the following requirements:
* mono spaced
* support full code page 437
* easily readable
Unfortunately none of the fonts provided with U-Boot fulfills all of these
requirements.
Let's add the DejaVu Mono font. To reduce the code size the characters are
limited to code page 437.
Signed-off-by: Heinrich Schuchardt <xypron.glpk(a)gmx.de>
---
v2:
add two symbols used by GRUB
add the FontForge script used to generate the reduce font
---
Licenses/dejavu_font_license.txt | 187 ++++++++++++++++++++
drivers/video/console_truetype.c | 4 +
drivers/video/fonts/437.ff | 263 ++++++++++++++++++++++++++++
drivers/video/fonts/Kconfig | 10 +-
drivers/video/fonts/Makefile | 1 +
drivers/video/fonts/dejavu_mono.ttf | Bin 0 -> 41104 bytes
6 files changed, 464 insertions(+), 1 deletion(-)
create mode 100644 Licenses/dejavu_font_license.txt
create mode 100755 drivers/video/fonts/437.ff
create mode 100644 drivers/video/fonts/dejavu_mono.ttf
diff --git a/Licenses/dejavu_font_license.txt b/Licenses/dejavu_font_license.txt
new file mode 100644
index 0000000000..8d71958606
--- /dev/null
+++ b/Licenses/dejavu_font_license.txt
@@ -0,0 +1,187 @@
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
+
+
+Bitstream Vera Fonts Copyright
+------------------------------
+
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is
+a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated
+documentation files (the "Font Software"), to reproduce and distribute the
+Font Software, including without limitation the rights to use, copy, merge,
+publish, distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to the
+following conditions:
+
+The above copyright and trademark notices and this permission notice shall
+be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional glyphs or characters may be added to the Fonts, only if the fonts
+are renamed to names not containing either the words "Bitstream" or the word
+"Vera".
+
+This License becomes null and void to the extent applicable to Fonts or Font
+Software that has been modified and is distributed under the "Bitstream
+Vera" names.
+
+The Font Software may be sold as part of a larger software package but no
+copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
+ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE
+FONT SOFTWARE.
+
+Except as contained in this notice, the names of Gnome, the Gnome
+Foundation, and Bitstream Inc., shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this Font Software
+without prior written authorization from the Gnome Foundation or Bitstream
+Inc., respectively. For further information, contact: fonts at gnome dot
+org.
+
+Arev Fonts Copyright
+------------------------------
+
+Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the fonts accompanying this license ("Fonts") and
+associated documentation files (the "Font Software"), to reproduce
+and distribute the modifications to the Bitstream Vera Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be included in all copies of one or more of the Font Software
+typefaces.
+
+The Font Software may be modified, altered, or added to, and in
+particular the designs of glyphs or characters in the Fonts may be
+modified and additional glyphs or characters may be added to the
+Fonts, only if the fonts are renamed to names not containing either
+the words "Tavmjong Bah" or the word "Arev".
+
+This License becomes null and void to the extent applicable to Fonts
+or Font Software that has been modified and is distributed under the
+"Tavmjong Bah Arev" names.
+
+The Font Software may be sold as part of a larger software package but
+no copy of one or more of the Font Software typefaces may be sold by
+itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
+TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+Except as contained in this notice, the name of Tavmjong Bah shall not
+be used in advertising or otherwise to promote the sale, use or other
+dealings in this Font Software without prior written authorization
+from Tavmjong Bah. For further information, contact: tavmjong @ free
+. fr.
+
+TeX Gyre DJV Math
+-----------------
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+
+Math extensions done by B. Jackowski, P. Strzelczyk and P. Pianowski
+(on behalf of TeX users groups) are in public domain.
+
+Letters imported from Euler Fraktur from AMSfonts are (c) American
+Mathematical Society (see below).
+Bitstream Vera Fonts Copyright
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera
+is a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license (“Fonts”) and associated
+documentation
+files (the “Font Software”), to reproduce and distribute the Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute,
+and/or sell copies of the Font Software, and to permit persons to whom
+the Font Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be
+included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional
+glyphs or characters may be added to the Fonts, only if the fonts are
+renamed
+to names not containing either the words “Bitstream” or the word “Vera”.
+
+This License becomes null and void to the extent applicable to Fonts or
+Font Software
+that has been modified and is distributed under the “Bitstream Vera”
+names.
+
+The Font Software may be sold as part of a larger software package but
+no copy
+of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION
+BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL,
+SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN
+ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR
+INABILITY TO USE
+THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
+Except as contained in this notice, the names of GNOME, the GNOME
+Foundation,
+and Bitstream Inc., shall not be used in advertising or otherwise to promote
+the sale, use or other dealings in this Font Software without prior written
+authorization from the GNOME Foundation or Bitstream Inc., respectively.
+For further information, contact: fonts at gnome dot org.
+
+AMSFonts (v. 2.2) copyright
+
+The PostScript Type 1 implementation of the AMSFonts produced by and
+previously distributed by Blue Sky Research and Y&Y, Inc. are now freely
+available for general use. This has been accomplished through the
+cooperation
+of a consortium of scientific publishers with Blue Sky Research and Y&Y.
+Members of this consortium include:
+
+Elsevier Science IBM Corporation Society for Industrial and Applied
+Mathematics (SIAM) Springer-Verlag American Mathematical Society (AMS)
+
+In order to assure the authenticity of these fonts, copyright will be
+held by
+the American Mathematical Society. This is not meant to restrict in any way
+the legitimate use of the fonts, such as (but not limited to) electronic
+distribution of documents containing these fonts, inclusion of these fonts
+into other public domain or commercial font collections or computer
+applications, use of the outline data to create derivative fonts and/or
+faces, etc. However, the AMS does require that the AMS copyright notice be
+removed from any derivative versions of the fonts which have been altered in
+any way. In addition, to ensure the fidelity of TeX documents using Computer
+Modern fonts, Professor Donald Knuth, creator of the Computer Modern faces,
+has requested that any alterations which yield different font metrics be
+given a different name.
+
+$Id$
diff --git a/drivers/video/console_truetype.c b/drivers/video/console_truetype.c
index 293b3a5ef4..b9caf2dd0c 100644
--- a/drivers/video/console_truetype.c
+++ b/drivers/video/console_truetype.c
@@ -490,6 +490,7 @@ FONT_DECL(nimbus_sans_l_regular);
FONT_DECL(ankacoder_c75_r);
FONT_DECL(rufscript010);
FONT_DECL(cantoraone_regular);
+FONT_DECL(dejavu_mono);
static struct font_info font_table[] = {
#ifdef CONFIG_CONSOLE_TRUETYPE_NIMBUS
@@ -503,6 +504,9 @@ static struct font_info font_table[] = {
#endif
#ifdef CONFIG_CONSOLE_TRUETYPE_CANTORAONE
FONT_ENTRY(cantoraone_regular),
+#endif
+#ifdef CONFIG_CONSOLE_TRUETYPE_DEJAVU
+ FONT_ENTRY(dejavu_mono),
#endif
{} /* sentinel */
};
diff --git a/drivers/video/fonts/437.ff b/drivers/video/fonts/437.ff
new file mode 100755
index 0000000000..065709a218
--- /dev/null
+++ b/drivers/video/fonts/437.ff
@@ -0,0 +1,263 @@
+#!/usr/bin/fontforge
+# SPDX-License-Identifier: GPL-2.0+
+#
+# This script uses FontForge to strip unused symbols from a TrueType font.
+# Only symbols in code page 437 and two glyphs used by GRUB are left in.
+#
+# Usage
+#
+# ./437.ff <font_in> <font_out.ttf>
+#
+# e.g.
+#
+# ./437.ff dejavu-fonts-2.37/src/DejaVuSansMono.sfd dejavu_mono.ttf
+
+Print()
+Print("Strip unused symbols from TrueType font")
+if ($argc != 3)
+ Print()
+ Print("Usage:")
+ Print($0, " <font_in> <font_out.ttf>")
+ return
+endif
+
+Print("Loading ", $1)
+Open($1)
+
+# Code page 437
+SelectMore("u0020")
+SelectMore("u0021")
+SelectMore("u0022")
+SelectMore("u0023")
+SelectMore("u0024")
+SelectMore("u0025")
+SelectMore("u0026")
+SelectMore("u0027")
+SelectMore("u0028")
+SelectMore("u0029")
+SelectMore("u002a")
+SelectMore("u002b")
+SelectMore("u002c")
+SelectMore("u002d")
+SelectMore("u002e")
+SelectMore("u002f")
+SelectMore("u0030")
+SelectMore("u0031")
+SelectMore("u0032")
+SelectMore("u0033")
+SelectMore("u0034")
+SelectMore("u0035")
+SelectMore("u0036")
+SelectMore("u0037")
+SelectMore("u0038")
+SelectMore("u0039")
+SelectMore("u003a")
+SelectMore("u003b")
+SelectMore("u003c")
+SelectMore("u003d")
+SelectMore("u003e")
+SelectMore("u003f")
+SelectMore("u0040")
+SelectMore("u0041")
+SelectMore("u0042")
+SelectMore("u0043")
+SelectMore("u0044")
+SelectMore("u0045")
+SelectMore("u0046")
+SelectMore("u0047")
+SelectMore("u0048")
+SelectMore("u0049")
+SelectMore("u004a")
+SelectMore("u004b")
+SelectMore("u004c")
+SelectMore("u004d")
+SelectMore("u004e")
+SelectMore("u004f")
+SelectMore("u0050")
+SelectMore("u0051")
+SelectMore("u0052")
+SelectMore("u0053")
+SelectMore("u0054")
+SelectMore("u0055")
+SelectMore("u0056")
+SelectMore("u0057")
+SelectMore("u0058")
+SelectMore("u0059")
+SelectMore("u005a")
+SelectMore("u005b")
+SelectMore("u005c")
+SelectMore("u005d")
+SelectMore("u005e")
+SelectMore("u005f")
+SelectMore("u0060")
+SelectMore("u0061")
+SelectMore("u0062")
+SelectMore("u0063")
+SelectMore("u0064")
+SelectMore("u0065")
+SelectMore("u0066")
+SelectMore("u0067")
+SelectMore("u0068")
+SelectMore("u0069")
+SelectMore("u006a")
+SelectMore("u006b")
+SelectMore("u006c")
+SelectMore("u006d")
+SelectMore("u006e")
+SelectMore("u006f")
+SelectMore("u0070")
+SelectMore("u0071")
+SelectMore("u0072")
+SelectMore("u0073")
+SelectMore("u0074")
+SelectMore("u0075")
+SelectMore("u0076")
+SelectMore("u0077")
+SelectMore("u0078")
+SelectMore("u0079")
+SelectMore("u007a")
+SelectMore("u007b")
+SelectMore("u007c")
+SelectMore("u007d")
+SelectMore("u007e")
+SelectMore("u00c7")
+SelectMore("u00fc")
+SelectMore("u00e9")
+SelectMore("u00e2")
+SelectMore("u00e4")
+SelectMore("u00e0")
+SelectMore("u00e5")
+SelectMore("u00e7")
+SelectMore("u00ea")
+SelectMore("u00eb")
+SelectMore("u00e8")
+SelectMore("u00ef")
+SelectMore("u00ee")
+SelectMore("u00ec")
+SelectMore("u00c4")
+SelectMore("u00c5")
+SelectMore("u00c9")
+SelectMore("u00e6")
+SelectMore("u00c6")
+SelectMore("u00f4")
+SelectMore("u00f6")
+SelectMore("u00f2")
+SelectMore("u00fb")
+SelectMore("u00f9")
+SelectMore("u00ff")
+SelectMore("u00d6")
+SelectMore("u00dc")
+SelectMore("u00a2")
+SelectMore("u00a3")
+SelectMore("u00a5")
+SelectMore("u20a7")
+SelectMore("u0192")
+SelectMore("u00e1")
+SelectMore("u00ed")
+SelectMore("u00f3")
+SelectMore("u00fa")
+SelectMore("u00f1")
+SelectMore("u00d1")
+SelectMore("u00aa")
+SelectMore("u00ba")
+SelectMore("u00bf")
+SelectMore("u2310")
+SelectMore("u00ac")
+SelectMore("u00bd")
+SelectMore("u00bc")
+SelectMore("u00a1")
+SelectMore("u00ab")
+SelectMore("u00bb")
+SelectMore("u2591")
+SelectMore("u2592")
+SelectMore("u2593")
+SelectMore("u2502")
+SelectMore("u2524")
+SelectMore("u2561")
+SelectMore("u2562")
+SelectMore("u2556")
+SelectMore("u2555")
+SelectMore("u2563")
+SelectMore("u2551")
+SelectMore("u2557")
+SelectMore("u255d")
+SelectMore("u255c")
+SelectMore("u255b")
+SelectMore("u2510")
+SelectMore("u2514")
+SelectMore("u2534")
+SelectMore("u252c")
+SelectMore("u251c")
+SelectMore("u2500")
+SelectMore("u253c")
+SelectMore("u255e")
+SelectMore("u255f")
+SelectMore("u255a")
+SelectMore("u2554")
+SelectMore("u2569")
+SelectMore("u2566")
+SelectMore("u2560")
+SelectMore("u2550")
+SelectMore("u256c")
+SelectMore("u2567")
+SelectMore("u2568")
+SelectMore("u2564")
+SelectMore("u2565")
+SelectMore("u2559")
+SelectMore("u2558")
+SelectMore("u2552")
+SelectMore("u2553")
+SelectMore("u256b")
+SelectMore("u256a")
+SelectMore("u2518")
+SelectMore("u250c")
+SelectMore("u2588")
+SelectMore("u2584")
+SelectMore("u258c")
+SelectMore("u2590")
+SelectMore("u2580")
+SelectMore("u03b1")
+SelectMore("u00df")
+SelectMore("u0393")
+SelectMore("u03c0")
+SelectMore("u03a3")
+SelectMore("u03c3")
+SelectMore("u00b5")
+SelectMore("u03c4")
+SelectMore("u03a6")
+SelectMore("u0398")
+SelectMore("u03a9")
+SelectMore("u03b4")
+SelectMore("u221e")
+SelectMore("u03c6")
+SelectMore("u03b5")
+SelectMore("u2229")
+SelectMore("u2261")
+SelectMore("u00b1")
+SelectMore("u2265")
+SelectMore("u2264")
+SelectMore("u2320")
+SelectMore("u2321")
+SelectMore("u00f7")
+SelectMore("u2248")
+SelectMore("u00b0")
+SelectMore("u2219")
+SelectMore("u00b7")
+SelectMore("u221a")
+SelectMore("u207f")
+SelectMore("u00b2")
+SelectMore("u25a0")
+SelectMore("u00a0")
+
+# Characters used by GRUB
+
+# BLACK UP-POINTING TRIANGLE
+SelectMore("u25b2")
+# BLACK DOWN-POINTING TRIANGLE
+SelectMore("u25bc")
+
+SelectInvert()
+DetachAndRemoveGlyphs()
+
+Print("Saving ", $2)
+Generate($2)
diff --git a/drivers/video/fonts/Kconfig b/drivers/video/fonts/Kconfig
index c692fa9602..f0cc963fb6 100644
--- a/drivers/video/fonts/Kconfig
+++ b/drivers/video/fonts/Kconfig
@@ -7,7 +7,6 @@ menu "TrueType Fonts"
config CONSOLE_TRUETYPE_NIMBUS
bool "Nimbus Sans Regular"
depends on CONSOLE_TRUETYPE
- default y
help
Nimbus Sans L is a version of Nimbus Sans using Adobe font sources.
It was designed in 1987. A subset of Nimbus Sans L were released
@@ -49,4 +48,13 @@ config CONSOLE_TRUETYPE_CANTORAONE
License: SIL Open Font Licence
http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL
+config CONSOLE_TRUETYPE_DEJAVU
+ bool "DejaVu Sans Mono Regular"
+ depends on CONSOLE_TRUETYPE
+ default y
+ help
+ This mono spaced font contains all code page 437 characters.
+ From https://sourceforge.net/projects/dejavu/
+ License: DejaVu Font License
+
endmenu
diff --git a/drivers/video/fonts/Makefile b/drivers/video/fonts/Makefile
index 4fca120b73..1111f92a2c 100644
--- a/drivers/video/fonts/Makefile
+++ b/drivers/video/fonts/Makefile
@@ -7,3 +7,4 @@ obj-$(CONFIG_CONSOLE_TRUETYPE_NIMBUS) += nimbus_sans_l_regular.o
obj-$(CONFIG_CONSOLE_TRUETYPE_ANKACODER) += ankacoder_c75_r.o
obj-$(CONFIG_CONSOLE_TRUETYPE_RUFSCRIPT) += rufscript010.o
obj-$(CONFIG_CONSOLE_TRUETYPE_CANTORAONE) += cantoraone_regular.o
+obj-$(CONFIG_CONSOLE_TRUETYPE_DEJAVU) += dejavu_mono.o
diff --git a/drivers/video/fonts/dejavu_mono.ttf b/drivers/video/fonts/dejavu_mono.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..2d03f87ebabfd3750d85390dd696e360540aaafe
GIT binary patch
literal 41104
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
literal 0
HcmV?d00001
--
2.30.1
1
0

01 Mar '21
This patchset adds initial support for the ESPRESSOBin-Ultra board from
Globalscale Technologies, Inc.
The board is based on the 64-bit dual-core Marvell Armada 3720 SoC.
Peripherals:
- 5 Gigabit Ethernet ports (WAN has PoE, up to 30W, Topaz 6341 switch)
- RTC clock (PCF8563)
- USB 3.0 port
- USB 2.0 port
- 4x LED
- UART over Micro-USB
- M.2 slot (2280)
- Mini PCI-E slot
Additionally support for importing Marvell hw_info formatted environments
is added to fully support the board.
Luka Kovacic (3):
cmd: mvebu: Implement the Marvell hw_info command
arm: mvebu: mvebu_armada-37xx: Define the loadaddr environment
variable
arm: mvebu: Initial ESPRESSOBin-Ultra board support
arch/arm/dts/Makefile | 1 +
.../arm/dts/armada-3720-espressobin-ultra.dts | 202 ++++++++++++
board/Marvell/mvebu_armada-37xx/MAINTAINERS | 8 +
board/Marvell/mvebu_armada-37xx/board.c | 92 +++++-
cmd/mvebu/Kconfig | 23 ++
cmd/mvebu/Makefile | 1 +
cmd/mvebu/hw_info.c | 312 ++++++++++++++++++
.../mvebu_espressobin-ultra-88f3720_defconfig | 92 ++++++
include/configs/mvebu_armada-37xx.h | 1 +
lib/hashtable.c | 2 +-
10 files changed, 727 insertions(+), 7 deletions(-)
create mode 100644 arch/arm/dts/armada-3720-espressobin-ultra.dts
create mode 100644 cmd/mvebu/hw_info.c
create mode 100644 configs/mvebu_espressobin-ultra-88f3720_defconfig
--
2.20.1
5
19
Hello - this is my first message to this list, so I apologize in advance if
I've got some of the customs wrong in doing so. I have searched prior
messages and am running a very recent build
(commit 08cca188c120b8337600091c94dc0e211cd03e10) which incorporates all of
the patches relating to similar issues from what I can tell. My
environment is running yocto dunfell on kernel 5.4.85.
When I take a stock 2GB CM4 module (empty EMMC, latest EEPROM) and boot via
pcie/xhci (USB VL805-based PCIE card on CM4IO board) U-Boot initializes the
USB device, finds and runs the U-Boot script, and starts the kernel.
However when I take a stock 4GB CM4 module (also empty EMMC, latest EEPROM)
I get errors - see console output for both scenarios below.
CM4-2GB Successful Boot:
DRAM: 1.9 GiB
RPI Compute Module 4 (0xb03140)
MMC: mmcnr@7e300000: 1, emmc2@7e340000: 0
In: serial
Out: serial
Err: serial
Net: eth0: ethernet@7d580000
PCIe BRCM: link up, 5.0 Gbps x1 (SSC)
starting USB...
Bus usb@7e980000: USB DWC2
Bus xhci_pci: Register 5000420 NbrPorts 5
Starting the controller
USB XHCI 1.00
scanning bus usb@7e980000 for devces... 1 USB Device(s) found
scanning bus xhci_pci for devices... 3 USB Device(s) found
scanning usb for storage devices... 1 Storage Device(s) found
Device 0: Vendor: USB Rev: 1.00 Prod: SanDisk 3.2Gen1
Tye: Removable Hard Disk
Capacity: 29340.0 MB = 28.6 GB (60088320 x 512)
... is now current device
Scanning usb 0:1...
Found U-Boot script /boot.scr
616 bytes read in 2 ms (300.8 KiB/s)
## Exeuting script at 02400000
Scanning mmc usb devices 0 1 2
Failed to load 'resin-image-flasher'
24 bytes read in 13 ms (1000 Bytes/s)
Card did not respond to voltage select! : -110
Can't set block device
Can't set block devic
24 bytes read in 4 ms (5.9 KiB/s)
Found resin flasher on usb 0
Loading resinOS_uEnv.txt from usb device 0 partition 1
0 bytes read in 3 ms (0 Bytes/s)
Import resinOS_uEnv.txt in environmen
Loading extra_uEnv.txt from usb device 0 partition 1
0 bytes read in 2 ms (0 Bytes/s)
Import extra_uEnv.txt in environment
Loading bootcount.env from us device 0 partition 1
Failed to load 'bootcount.env'
No bootcount.env file. Setting bootcount=0 in environment
24 bytes read in 4 ms (5.9 KiB/s)
12468223 bytes read in 112 ms (106.2 MiB/s)
Uncompressed size: 28365312 = 0x1B0D200
## Flattened Device ree blob at 2eff4100
Booting using the fdt blob at 0x2eff4100
Using Device Tree in place at 000000002eff4100, end 00000002f002f80
Starting kernel ...
CM4-4GB Unsuccessful Boot:
U-Boot 2021.04-rc2 (Feb 26 2021 - 20:11:08 +0000)
DRAM: 3.8 GiB
RPI Compute Module 4 (0xc03140)
MMC: mmcnr@7e300000: 1, emmc2@7e340000: 0
In: serial
Out: serial
Err: serial
Net: eth0: ethernet@7d580000
PCIe BRCM: link up, 5.0 Gbps x1 (SSC)
starting USB...
Bus usb@7e980000: USB DWC2
Bus xhci_pci: Register 5000420 NbrPorts 5
Starting the controller
Port not available.
scanning bus usb@7e980000 for devices... 1 USB Device(s) found
scanning usb for storag devices... 0 Storage Device(s) found
"Synchronous Abort" handler, esr 0x96000004
elr: 000000000009c320 lr : 0000000000092090 (reloc)
elr: 000000037c76320 lr : 0000000037c6c090
x0 : d519b040aa010000 x1 : 000000000000005c
x2 : 0000000000800000 x3 : 0000000037cd340
x4 : b900080152b00000 x5 : 000000000000005c
x6 : 0000000037cd3460 x7 : b900080152afff90
x8 : 0000000000000000 x9 : 000000000000008
x10: 000000000000ad84 x11: 0000000037849d8c
x12: 000000000000ad88 x13: 0000000037849dd8
x14: 000000003789ef0 x15: 0000000000000002
x16: 0000000037c78438 x17: 0000000000000000
x18: 0000000037855d90 x19: 0000000000000070
x20 0000000037cd2ea0 x21: 0000000000000000
x22: 000000000000000b x23: 00000000ffffffff
x24: 0000000000000000 x25: 000000007ce4e64
x26: 0000000037cbe3fe x27: 0000000037cc777b
x28: 0000000000000064 x29: 0000000037849460
Code: eb03005f 54ffff3 f9400ca4 17ffffe0 (f9400404)
Resetting CPU ...
resetting ...
The closest issue I found in searching the mailing list was this one:
https://lists.denx.de/pipermail/u-boot/2020-December/435143.html
But I believe these patches are already applied in the version that I am
running. Does anyone have any idea what could be causing this? When I
limit the 4GB module to use only 3GB of ram (via total_mem=3072 in
config.txt) it works, but obviously this is just a workaround and not an
actual solution.
I posted this same issue to the RPI forums, and an RPI engineer noted the
following which may help to pinpoint the issue:
It's more likely to be related to how u-boot configures the inbound address
window (BAR2) depending on the memory configuration. In the latest
releases, the firmware patches device-tree to set this @ 16GB. I don't know
if u-boot reads this, it's free to ignore it.
IIRC this has to be multiple of the SDRAM size because the bus address
matching just masks off bits and 16GB is the maximum size that the bus
could support. Previously, the firmware used to do something like pick the
smallest multiple of SDRAM size.
Picking older/newer versions of the firmware may help to verify but u-boot
should override the number if it wants something else.
This recent FW change allows the Pi4 R6 VLI FW loading (not relevant on
CM4) to pickup the BAR2 configuration from the chain-loader / host OS by
reading from the PCIe registers. That might have been a blocker for u-boot
in the past.
1
0
Add i.MX8QM qmx8 congatec board support
U-Boot 2021.04-rc1-00070-gcc181a2ad4 (Feb 19 2021 - 13:15:49 +0100)
CPU: NXP i.MX8QM RevB A53 at 1200 MHz
Model: Congatec QMX8 Qseven series
Board: conga-QMX8
Build: SCFW 494c97f3, SECO-FW d7523fe8, ATF 09c5cc9
Boot: SD2
DRAM: 6 GiB
MMC: FSL_SDHC: 0, FSL_SDHC: 1, FSL_SDHC: 2
Loading Environment from MMC... *** Warning - bad CRC, using default environment
In: serial@5a060000
Out: serial@5a060000
Err: serial@5a060000
switch to partitions #0, OK
mmc2 is current device
Net:
Error: ethernet@5b040000 address not set.
No ethernet found.
Hit any key to stop autoboot: 0
Signed-off-by: Oliver Graute <oliver.graute(a)kococonnector.com>
Cc: Stefano Babic <sbabic(a)denx.de>
Cc: Fabio Estevam <festevam(a)gmail.com>
Cc: Peng Fan <peng.fan(a)nxp.com>
Cc: Simon Glass <sjg(a)chromium.org>
Cc: Ye Li <ye.li(a)nxp.com>
Cc: uboot-imx <uboot-imx(a)nxp.com>
---
These changes are based on this vendor tree:
git.congatec.com/imx8_early_access/imx8_uboot_internal.git
Changes for v5:
- fixed checkpatch errors
- fixed some checkpatch warnings
Changes for v4:
- fixed missing DTS file in MAINTAINERS
- replaced bd_t with struct bd_info
- replaced README with imx8qm-dmsse20-a1.rst
- move CMD_FUSE to Kconfig
- replaced power_domain_lookup_name with imx8_power_domain_lookup_name
Changes for v3:
- include log.h
- include delay.h
- improved README
- set phy register to six
- Remove 'fdt_high' and 'initrd_high' environment variables
- set CONFIG_SYS_BOOTMAPSZ to 256MB
- increased CONFIG_SYS_FSL_USDHC_NUM to 3
Changes for v2:
- added USDHC3_BASE_ADDR
- replaced CONFIG_FSL_ESDHC with CONFIG_FSL_ESDHC_IMX
- set CONFIG_FEC_MXC_PHYADDR to -1
- moved CONFIG_ENV_SIZE and CONFIG_ENV_OFFSET to defconfig
arch/arm/dts/Makefile | 1 +
arch/arm/dts/imx8qm-cgtqmx8.dts | 404 ++++++++++++++++++++++++
arch/arm/mach-imx/imx8/Kconfig | 7 +
board/congatec/cgtqmx8/Kconfig | 14 +
board/congatec/cgtqmx8/MAINTAINERS | 7 +
board/congatec/cgtqmx8/Makefile | 11 +
board/congatec/cgtqmx8/cgtqmx8.c | 456 ++++++++++++++++++++++++++++
board/congatec/cgtqmx8/imximage.cfg | 21 ++
board/congatec/cgtqmx8/spl.c | 77 +++++
board/congatec/common/Kconfig | 48 +++
board/congatec/common/Makefile | 23 ++
board/congatec/common/mmc.c | 50 +++
configs/cgtqmx8_defconfig | 86 ++++++
doc/board/congatec/cgtqmx8.rst | 70 +++++
doc/board/congatec/index.rst | 9 +
include/configs/cgtqmx8.h | 181 +++++++++++
16 files changed, 1465 insertions(+)
create mode 100644 arch/arm/dts/imx8qm-cgtqmx8.dts
create mode 100644 board/congatec/cgtqmx8/Kconfig
create mode 100644 board/congatec/cgtqmx8/MAINTAINERS
create mode 100644 board/congatec/cgtqmx8/Makefile
create mode 100644 board/congatec/cgtqmx8/cgtqmx8.c
create mode 100644 board/congatec/cgtqmx8/imximage.cfg
create mode 100644 board/congatec/cgtqmx8/spl.c
create mode 100644 board/congatec/common/Kconfig
create mode 100644 board/congatec/common/Makefile
create mode 100644 board/congatec/common/mmc.c
create mode 100644 configs/cgtqmx8_defconfig
create mode 100644 doc/board/congatec/cgtqmx8.rst
create mode 100644 doc/board/congatec/index.rst
create mode 100644 include/configs/cgtqmx8.h
diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index 858b79ac97..23f5a59a08 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -773,6 +773,7 @@ dtb-$(CONFIG_ARCH_MX7ULP) += imx7ulp-com.dtb \
dtb-$(CONFIG_ARCH_IMX8) += \
fsl-imx8qm-apalis.dtb \
fsl-imx8qm-mek.dtb \
+ imx8qm-cgtqmx8.dtb \
imx8qm-rom7720-a1.dtb \
fsl-imx8qxp-ai_ml.dtb \
fsl-imx8qxp-colibri.dtb \
diff --git a/arch/arm/dts/imx8qm-cgtqmx8.dts b/arch/arm/dts/imx8qm-cgtqmx8.dts
new file mode 100644
index 0000000000..555c357f6f
--- /dev/null
+++ b/arch/arm/dts/imx8qm-cgtqmx8.dts
@@ -0,0 +1,404 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2016 Freescale Semiconductor, Inc.
+ * Copyright 2017 NXP
+ * Copyright 2017 congatec AG
+ * Copyright (C) 2019 Oliver Graute <oliver.graute(a)kococonnector.com>
+ */
+
+/dts-v1/;
+
+/* First 128KB is for PSCI ATF. */
+/memreserve/ 0x80000000 0x00020000;
+
+#include "fsl-imx8qm.dtsi"
+
+/ {
+ model = "Congatec QMX8 Qseven series";
+ compatible = "fsl,imx8qm-qmx8", "fsl,imx8qm";
+
+ chosen {
+ bootargs = "console=ttyLP0,115200 earlycon=lpuart32,0x5a060000,115200";
+ stdout-path = &lpuart0;
+ };
+
+ regulators {
+ compatible = "simple-bus";
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ reg_usdhc2_vmmc: usdhc2_vmmc {
+ compatible = "regulator-fixed";
+ regulator-name = "sw-3p3-sd1";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ gpio = <&gpio4 7 GPIO_ACTIVE_HIGH>;
+ enable-active-high;
+ off-on-delay-us = <3000>;
+ };
+
+ reg_usdhc3_vmmc: usdhc3_vmmc {
+ compatible = "regulator-fixed";
+ regulator-name = "sw-3p3-sd2";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ gpio = <&gpio4 9 GPIO_ACTIVE_HIGH>;
+ enable-active-high;
+ off-on-delay-us = <3000>;
+ };
+ };
+};
+
+&fec1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_fec1>;
+ phy-mode = "rgmii";
+ phy-handle = <ðphy0>;
+ fsl,magic-packet;
+ fsl,rgmii_txc_dly;
+ fsl,rgmii_rxc_dly;
+ status = "okay";
+
+ mdio {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ ethphy0: ethernet-phy@6 {
+ compatible = "ethernet-phy-ieee802.3-c22";
+ reg = <6>;
+ at803x,eee-disabled;
+ at803x,vddio-1p8v;
+ };
+ };
+};
+
+&gpio2 {
+ status = "okay";
+};
+
+&gpio5 {
+ status = "okay";
+};
+
+&i2c0 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_lpi2c0>;
+ clock-frequency = <100000>;
+ status = "okay";
+
+ rtc_ext: m41t62@68 {
+ compatible = "st,m41t62";
+ reg = <0x68>;
+ };
+};
+
+&i2c1 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ clock-frequency = <100000>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_lpi2c1>;
+ status = "okay";
+
+ wm8904: wm8904@1a {
+ compatible = "wlf,wm8904";
+ reg = <0x1a>;
+
+ clocks = <&clk IMX8QM_AUD_MCLKOUT0>;
+ clock-names = "mclk";
+ wlf,shared-lrclk;
+ /* power-domains = <&pd_mclk_out0>; */
+
+ assigned-clocks = <&clk IMX8QM_AUD_PLL0_DIV>,
+ <&clk IMX8QM_AUD_ACM_AUD_PLL_CLK0_DIV>,
+ <&clk IMX8QM_AUD_ACM_AUD_REC_CLK0_DIV>,
+ <&clk IMX8QM_AUD_MCLKOUT0>;
+
+ assigned-clock-rates = <786432000>, <49152000>, <24576000>;
+ };
+};
+
+&iomuxc {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_hog>;
+
+ imx8qm-qmx8 {
+
+ pinctrl_hog: hoggrp{
+ fsl,pins = <
+ SC_P_M40_GPIO0_01_LSIO_GPIO0_IO09 0x00000021
+ SC_P_USB_SS3_TC1_LSIO_GPIO4_IO04 0x00000021
+ SC_P_M40_GPIO0_00_LSIO_GPIO0_IO08 0x00000021
+ SC_P_ESAI1_SCKT_LSIO_GPIO2_IO07 0x00000021
+ SC_P_SPDIF0_TX_LSIO_GPIO2_IO15 0x00000021
+ SC_P_FLEXCAN1_RX_LSIO_GPIO3_IO31 0x00000021
+ SC_P_ESAI1_TX0_LSIO_GPIO2_IO08 0x00000021
+ SC_P_FLEXCAN1_TX_LSIO_GPIO4_IO00 0x00000021
+ SC_P_ESAI1_TX1_LSIO_GPIO2_IO09 0x00000021
+ >;
+ };
+
+ pinctrl_fec1: fec1grp {
+ fsl,pins = <
+ SC_P_ENET0_MDC_CONN_ENET0_MDC 0x06000020
+ SC_P_ENET0_MDIO_CONN_ENET0_MDIO 0x06000020
+ SC_P_ENET0_RGMII_TX_CTL_CONN_ENET0_RGMII_TX_CTL 0x06000020
+ SC_P_ENET0_RGMII_TXC_CONN_ENET0_RGMII_TXC 0x06000020
+ SC_P_ENET0_RGMII_TXD0_CONN_ENET0_RGMII_TXD0 0x06000020
+ SC_P_ENET0_RGMII_TXD1_CONN_ENET0_RGMII_TXD1 0x06000020
+ SC_P_ENET0_RGMII_TXD2_CONN_ENET0_RGMII_TXD2 0x06000020
+ SC_P_ENET0_RGMII_TXD3_CONN_ENET0_RGMII_TXD3 0x06000020
+ SC_P_ENET0_RGMII_RXC_CONN_ENET0_RGMII_RXC 0x06000020
+ SC_P_ENET0_RGMII_RX_CTL_CONN_ENET0_RGMII_RX_CTL 0x06000020
+ SC_P_ENET0_RGMII_RXD0_CONN_ENET0_RGMII_RXD0 0x06000020
+ SC_P_ENET0_RGMII_RXD1_CONN_ENET0_RGMII_RXD1 0x06000020
+ SC_P_ENET0_RGMII_RXD2_CONN_ENET0_RGMII_RXD2 0x06000020
+ SC_P_ENET0_RGMII_RXD3_CONN_ENET0_RGMII_RXD3 0x06000020
+ >;
+ };
+
+ pinctrl_lpi2c0: lpi2c0grp {
+ fsl,pins = <
+ SC_P_HDMI_TX0_TS_SCL_DMA_I2C0_SCL 0xc600004c
+ SC_P_HDMI_TX0_TS_SDA_DMA_I2C0_SDA 0xc600004c
+ >;
+ };
+
+ pinctrl_lpi2c1: lpi2c1grp {
+ fsl,pins = <
+ SC_P_GPT0_CLK_DMA_I2C1_SCL 0xc600004c
+ SC_P_GPT0_CAPTURE_DMA_I2C1_SDA 0xc600004c
+ >;
+ };
+
+ pinctrl_lpuart0: lpuart0grp {
+ fsl,pins = <
+ SC_P_UART0_RX_DMA_UART0_RX 0x06000020
+ SC_P_UART0_TX_DMA_UART0_TX 0x06000020
+ >;
+ };
+
+ pinctrl_lpuart1: lpuart1grp {
+ fsl,pins = <
+ SC_P_UART1_RX_DMA_UART1_RX 0x06000020
+ SC_P_UART1_TX_DMA_UART1_TX 0x06000020
+ SC_P_UART1_CTS_B_DMA_UART1_CTS_B 0x06000020
+ SC_P_UART1_RTS_B_DMA_UART1_RTS_B 0x06000020
+ >;
+ };
+
+ pinctrl_lpuart3: lpuart3grp {
+ fsl,pins = <
+ SC_P_M41_GPIO0_00_DMA_UART3_RX 0x06000020
+ SC_P_M41_GPIO0_01_DMA_UART3_TX 0x06000020
+ >;
+ };
+
+ pinctrl_mlb: mlbgrp {
+ fsl,pins = <
+ SC_P_MLB_SIG_CONN_MLB_SIG 0x21
+ SC_P_MLB_CLK_CONN_MLB_CLK 0x21
+ SC_P_MLB_DATA_CONN_MLB_DATA 0x21
+ >;
+ };
+
+ pinctrl_isl29023: isl29023grp {
+ fsl,pins = <
+ SC_P_ADC_IN2_LSIO_GPIO3_IO20 0x00000021
+ >;
+ };
+
+ pinctrl_usdhc1: usdhc1grp {
+ fsl,pins = <
+ SC_P_EMMC0_CLK_CONN_EMMC0_CLK 0x06000041
+ SC_P_EMMC0_CMD_CONN_EMMC0_CMD 0x00000021
+ SC_P_EMMC0_DATA0_CONN_EMMC0_DATA0 0x00000021
+ SC_P_EMMC0_DATA1_CONN_EMMC0_DATA1 0x00000021
+ SC_P_EMMC0_DATA2_CONN_EMMC0_DATA2 0x00000021
+ SC_P_EMMC0_DATA3_CONN_EMMC0_DATA3 0x00000021
+ SC_P_EMMC0_DATA4_CONN_EMMC0_DATA4 0x00000021
+ SC_P_EMMC0_DATA5_CONN_EMMC0_DATA5 0x00000021
+ SC_P_EMMC0_DATA6_CONN_EMMC0_DATA6 0x00000021
+ SC_P_EMMC0_DATA7_CONN_EMMC0_DATA7 0x00000021
+ SC_P_EMMC0_STROBE_CONN_EMMC0_STROBE 0x00000041
+ SC_P_EMMC0_RESET_B_CONN_EMMC0_RESET_B 0x00000021
+ >;
+ };
+
+ pinctrl_usdhc1_100mhz: usdhc1grp100mhz {
+ fsl,pins = <
+ SC_P_EMMC0_CLK_CONN_EMMC0_CLK 0x06000040
+ SC_P_EMMC0_CMD_CONN_EMMC0_CMD 0x00000020
+ SC_P_EMMC0_DATA0_CONN_EMMC0_DATA0 0x00000020
+ SC_P_EMMC0_DATA1_CONN_EMMC0_DATA1 0x00000020
+ SC_P_EMMC0_DATA2_CONN_EMMC0_DATA2 0x00000020
+ SC_P_EMMC0_DATA3_CONN_EMMC0_DATA3 0x00000020
+ SC_P_EMMC0_DATA4_CONN_EMMC0_DATA4 0x00000020
+ SC_P_EMMC0_DATA5_CONN_EMMC0_DATA5 0x00000020
+ SC_P_EMMC0_DATA6_CONN_EMMC0_DATA6 0x00000020
+ SC_P_EMMC0_DATA7_CONN_EMMC0_DATA7 0x00000020
+ SC_P_EMMC0_STROBE_CONN_EMMC0_STROBE 0x00000040
+ SC_P_EMMC0_RESET_B_CONN_EMMC0_RESET_B 0x00000020
+ >;
+ };
+
+ pinctrl_usdhc1_200mhz: usdhc1grp200mhz {
+ fsl,pins = <
+ SC_P_EMMC0_CLK_CONN_EMMC0_CLK 0x06000040
+ SC_P_EMMC0_CMD_CONN_EMMC0_CMD 0x00000020
+ SC_P_EMMC0_DATA0_CONN_EMMC0_DATA0 0x00000020
+ SC_P_EMMC0_DATA1_CONN_EMMC0_DATA1 0x00000020
+ SC_P_EMMC0_DATA2_CONN_EMMC0_DATA2 0x00000020
+ SC_P_EMMC0_DATA3_CONN_EMMC0_DATA3 0x00000020
+ SC_P_EMMC0_DATA4_CONN_EMMC0_DATA4 0x00000020
+ SC_P_EMMC0_DATA5_CONN_EMMC0_DATA5 0x00000020
+ SC_P_EMMC0_DATA6_CONN_EMMC0_DATA6 0x00000020
+ SC_P_EMMC0_DATA7_CONN_EMMC0_DATA7 0x00000020
+ SC_P_EMMC0_STROBE_CONN_EMMC0_STROBE 0x00000040
+ SC_P_EMMC0_RESET_B_CONN_EMMC0_RESET_B 0x00000020
+ >;
+ };
+
+ pinctrl_usdhc2_gpio: usdhc2grpgpio {
+ fsl,pins = <
+ SC_P_USDHC1_DATA6_LSIO_GPIO5_IO21 0x00000021
+ SC_P_USDHC1_DATA7_LSIO_GPIO5_IO22 0x00000021
+ SC_P_USDHC1_RESET_B_LSIO_GPIO4_IO07 0x00000021
+ >;
+ };
+
+ pinctrl_usdhc2: usdhc2grp {
+ fsl,pins = <
+ SC_P_USDHC1_CLK_CONN_USDHC1_CLK 0x06000041
+ SC_P_USDHC1_CMD_CONN_USDHC1_CMD 0x00000021
+ SC_P_USDHC1_DATA0_CONN_USDHC1_DATA0 0x00000021
+ SC_P_USDHC1_DATA1_CONN_USDHC1_DATA1 0x00000021
+ SC_P_USDHC1_DATA2_CONN_USDHC1_DATA2 0x00000021
+ SC_P_USDHC1_DATA3_CONN_USDHC1_DATA3 0x00000021
+ SC_P_USDHC1_VSELECT_CONN_USDHC1_VSELECT 0x00000021
+ >;
+ };
+
+ pinctrl_usdhc2_100mhz: usdhc2grp100mhz {
+ fsl,pins = <
+ SC_P_USDHC1_CLK_CONN_USDHC1_CLK 0x06000040
+ SC_P_USDHC1_CMD_CONN_USDHC1_CMD 0x00000020
+ SC_P_USDHC1_DATA0_CONN_USDHC1_DATA0 0x00000020
+ SC_P_USDHC1_DATA1_CONN_USDHC1_DATA1 0x00000020
+ SC_P_USDHC1_DATA2_CONN_USDHC1_DATA2 0x00000020
+ SC_P_USDHC1_DATA3_CONN_USDHC1_DATA3 0x00000020
+ SC_P_USDHC1_VSELECT_CONN_USDHC1_VSELECT 0x00000020
+ >;
+ };
+
+ pinctrl_usdhc2_200mhz: usdhc2grp200mhz {
+ fsl,pins = <
+ SC_P_USDHC1_CLK_CONN_USDHC1_CLK 0x06000040
+ SC_P_USDHC1_CMD_CONN_USDHC1_CMD 0x00000020
+ SC_P_USDHC1_DATA0_CONN_USDHC1_DATA0 0x00000020
+ SC_P_USDHC1_DATA1_CONN_USDHC1_DATA1 0x00000020
+ SC_P_USDHC1_DATA2_CONN_USDHC1_DATA2 0x00000020
+ SC_P_USDHC1_DATA3_CONN_USDHC1_DATA3 0x00000020
+ SC_P_USDHC1_VSELECT_CONN_USDHC1_VSELECT 0x00000020
+ >;
+ };
+
+ pinctrl_usdhc3_gpio: usdhc3grpgpio {
+ fsl,pins = <
+ SC_P_USDHC2_RESET_B_LSIO_GPIO4_IO09 0x00000021
+ SC_P_USDHC2_CD_B_LSIO_GPIO4_IO12 0x00000021
+ >;
+ };
+
+ pinctrl_usdhc3: usdhc3grp {
+ fsl,pins = <
+ SC_P_USDHC2_CLK_CONN_USDHC2_CLK 0x06000041
+ SC_P_USDHC2_CMD_CONN_USDHC2_CMD 0x00000021
+ SC_P_USDHC2_DATA0_CONN_USDHC2_DATA0 0x00000021
+ SC_P_USDHC2_DATA1_CONN_USDHC2_DATA1 0x00000021
+ SC_P_USDHC2_DATA2_CONN_USDHC2_DATA2 0x00000021
+ SC_P_USDHC2_DATA3_CONN_USDHC2_DATA3 0x00000021
+ SC_P_USDHC2_VSELECT_CONN_USDHC2_VSELECT 0x00000021
+ >;
+ };
+
+ pinctrl_usdhc3_100mhz: usdhc3grp100mhz {
+ fsl,pins = <
+ SC_P_USDHC2_CLK_CONN_USDHC2_CLK 0x06000040
+ SC_P_USDHC2_CMD_CONN_USDHC2_CMD 0x00000020
+ SC_P_USDHC2_DATA0_CONN_USDHC2_DATA0 0x00000020
+ SC_P_USDHC2_DATA1_CONN_USDHC2_DATA1 0x00000020
+ SC_P_USDHC2_DATA2_CONN_USDHC2_DATA2 0x00000020
+ SC_P_USDHC2_DATA3_CONN_USDHC2_DATA3 0x00000020
+ SC_P_USDHC2_VSELECT_CONN_USDHC2_VSELECT 0x00000020
+ >;
+ };
+
+ pinctrl_usdhc3_200mhz: usdhc3grp200mhz {
+ fsl,pins = <
+ SC_P_USDHC2_CLK_CONN_USDHC2_CLK 0x06000040
+ SC_P_USDHC2_CMD_CONN_USDHC2_CMD 0x00000020
+ SC_P_USDHC2_DATA0_CONN_USDHC2_DATA0 0x00000020
+ SC_P_USDHC2_DATA1_CONN_USDHC2_DATA1 0x00000020
+ SC_P_USDHC2_DATA2_CONN_USDHC2_DATA2 0x00000020
+ SC_P_USDHC2_DATA3_CONN_USDHC2_DATA3 0x00000020
+ SC_P_USDHC2_VSELECT_CONN_USDHC2_VSELECT 0x00000020
+ >;
+ };
+ };
+};
+
+&lpuart0 { /* console */
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_lpuart0>;
+ status = "okay";
+};
+
+&lpuart1 { /* Q7 connector */
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_lpuart1>;
+ status = "okay";
+};
+
+&pd_dma_lpuart0 {
+ debug_console;
+};
+
+&usdhc1 {
+ pinctrl-names = "default", "state_100mhz", "state_200mhz";
+ pinctrl-0 = <&pinctrl_usdhc1>;
+ pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
+ pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
+ bus-width = <8>;
+ non-removable;
+ status = "okay";
+};
+
+&usdhc2 {
+ pinctrl-names = "default", "state_100mhz", "state_200mhz";
+ pinctrl-0 = <&pinctrl_usdhc2>, <&pinctrl_usdhc2_gpio>;
+ pinctrl-1 = <&pinctrl_usdhc2_100mhz>, <&pinctrl_usdhc2_gpio>;
+ pinctrl-2 = <&pinctrl_usdhc2_200mhz>, <&pinctrl_usdhc2_gpio>;
+ bus-width = <4>;
+ cd-gpios = <&gpio5 22 GPIO_ACTIVE_LOW>;
+ wp-gpios = <&gpio5 21 GPIO_ACTIVE_HIGH>;
+ vmmc-supply = <®_usdhc2_vmmc>;
+ fsl,tuning-start-tap = <20>;
+ fsl,tuning-step= <2>;
+ status = "okay";
+};
+
+&usdhc3 {
+ pinctrl-names = "default", "state_100mhz", "state_200mhz";
+ pinctrl-0 = <&pinctrl_usdhc3>, <&pinctrl_usdhc3_gpio>;
+ pinctrl-1 = <&pinctrl_usdhc3_100mhz>, <&pinctrl_usdhc3_gpio>;
+ pinctrl-2 = <&pinctrl_usdhc3_200mhz>, <&pinctrl_usdhc3_gpio>;
+ bus-width = <4>;
+ cd-gpios = <&gpio4 12 GPIO_ACTIVE_LOW>;
+ vmmc-supply = <®_usdhc3_vmmc>;
+ fsl,tuning-start-tap = <20>;
+ fsl,tuning-step= <2>;
+ status = "okay";
+};
diff --git a/arch/arm/mach-imx/imx8/Kconfig b/arch/arm/mach-imx/imx8/Kconfig
index 04b9729109..6728d23b6b 100644
--- a/arch/arm/mach-imx/imx8/Kconfig
+++ b/arch/arm/mach-imx/imx8/Kconfig
@@ -85,6 +85,12 @@ config TARGET_IMX8QM_MEK
select BOARD_LATE_INIT
select IMX8QM
+config TARGET_CONGA_QMX8
+ bool "Support congatec conga-QMX8 board"
+ select BOARD_LATE_INIT
+ select SUPPORT_SPL
+ select IMX8QM
+
config TARGET_IMX8QM_ROM7720_A1
bool "Support i.MX8QM ROM-7720-A1"
select BOARD_LATE_INIT
@@ -100,6 +106,7 @@ endchoice
source "board/freescale/imx8qm_mek/Kconfig"
source "board/freescale/imx8qxp_mek/Kconfig"
+source "board/congatec/cgtqmx8/Kconfig"
source "board/advantech/imx8qm_rom7720_a1/Kconfig"
source "board/toradex/apalis-imx8/Kconfig"
source "board/toradex/colibri-imx8x/Kconfig"
diff --git a/board/congatec/cgtqmx8/Kconfig b/board/congatec/cgtqmx8/Kconfig
new file mode 100644
index 0000000000..7273039261
--- /dev/null
+++ b/board/congatec/cgtqmx8/Kconfig
@@ -0,0 +1,14 @@
+if TARGET_CONGA_QMX8
+
+config SYS_BOARD
+ default "cgtqmx8"
+
+config SYS_VENDOR
+ default "congatec"
+
+config SYS_CONFIG_NAME
+ default "cgtqmx8"
+
+source "board/congatec/common/Kconfig"
+
+endif
diff --git a/board/congatec/cgtqmx8/MAINTAINERS b/board/congatec/cgtqmx8/MAINTAINERS
new file mode 100644
index 0000000000..53bc0f93b7
--- /dev/null
+++ b/board/congatec/cgtqmx8/MAINTAINERS
@@ -0,0 +1,7 @@
+i.MX8QM CGTQMX8 BOARD
+M: Oliver Graute <oliver.graute(a)kococonnector.com>
+S: Maintained
+F: board/congatec/cgtqmx8/
+F: arch/arm/dts/imx8qm-cgtqmx8.dts
+F: include/configs/cgtqmx8.h
+F: configs/cgtqmx8_defconfig
diff --git a/board/congatec/cgtqmx8/Makefile b/board/congatec/cgtqmx8/Makefile
new file mode 100644
index 0000000000..4b59dbb6bc
--- /dev/null
+++ b/board/congatec/cgtqmx8/Makefile
@@ -0,0 +1,11 @@
+#
+# Copyright 2017 NXP
+#
+# SPDX-License-Identifier: GPL-2.0+
+#
+
+obj-y += cgtqmx8.o
+
+ifdef CONFIG_SPL_BUILD
+obj-y += spl.o
+endif
diff --git a/board/congatec/cgtqmx8/cgtqmx8.c b/board/congatec/cgtqmx8/cgtqmx8.c
new file mode 100644
index 0000000000..9f7eb6f666
--- /dev/null
+++ b/board/congatec/cgtqmx8/cgtqmx8.c
@@ -0,0 +1,456 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2018 congatec AG
+ * Copyright (C) 2019 Oliver Graute <oliver.graute(a)kococonnector.com>
+ */
+#include <common.h>
+#include <errno.h>
+#include <linux/libfdt.h>
+#include <fsl_esdhc.h>
+#include <init.h>
+
+#include <asm/io.h>
+#include <asm/gpio.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/sci/sci.h>
+#include <asm/arch/imx8-pins.h>
+#include <usb.h>
+#include <asm/arch/iomux.h>
+#include <asm/arch/sys_proto.h>
+#include <linux/delay.h>
+#include <power-domain.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define ESDHC_PAD_CTRL ((SC_PAD_CONFIG_NORMAL << PADRING_CONFIG_SHIFT) | \
+ (SC_PAD_ISO_OFF << PADRING_LPCONFIG_SHIFT) | \
+ (SC_PAD_28FDSOI_DSE_DV_HIGH << PADRING_DSE_SHIFT) | \
+ (SC_PAD_28FDSOI_PS_PU << PADRING_PULL_SHIFT))
+
+#define ESDHC_CLK_PAD_CTRL ((SC_PAD_CONFIG_OUT_IN << PADRING_CONFIG_SHIFT) | \
+ (SC_PAD_ISO_OFF << PADRING_LPCONFIG_SHIFT) | \
+ (SC_PAD_28FDSOI_DSE_DV_HIGH << PADRING_DSE_SHIFT) | \
+ (SC_PAD_28FDSOI_PS_PU << PADRING_PULL_SHIFT))
+
+#define ENET_INPUT_PAD_CTRL ((SC_PAD_CONFIG_OD_IN << PADRING_CONFIG_SHIFT) | \
+ (SC_PAD_ISO_OFF << PADRING_LPCONFIG_SHIFT) | \
+ (SC_PAD_28FDSOI_DSE_18V_10MA << PADRING_DSE_SHIFT) | \
+ (SC_PAD_28FDSOI_PS_PU << PADRING_PULL_SHIFT))
+
+#define ENET_NORMAL_PAD_CTRL ((SC_PAD_CONFIG_NORMAL << PADRING_CONFIG_SHIFT) | \
+ (SC_PAD_ISO_OFF << PADRING_LPCONFIG_SHIFT) | \
+ (SC_PAD_28FDSOI_DSE_18V_10MA << PADRING_DSE_SHIFT) | \
+ (SC_PAD_28FDSOI_PS_PU << PADRING_PULL_SHIFT))
+
+#define FSPI_PAD_CTRL ((SC_PAD_CONFIG_NORMAL << PADRING_CONFIG_SHIFT) | \
+ (SC_PAD_ISO_OFF << PADRING_LPCONFIG_SHIFT) | \
+ (SC_PAD_28FDSOI_DSE_DV_HIGH << PADRING_DSE_SHIFT) | \
+ (SC_PAD_28FDSOI_PS_PU << PADRING_PULL_SHIFT))
+
+#define GPIO_PAD_CTRL ((SC_PAD_CONFIG_NORMAL << PADRING_CONFIG_SHIFT) | \
+ (SC_PAD_ISO_OFF << PADRING_LPCONFIG_SHIFT) | \
+ (SC_PAD_28FDSOI_DSE_DV_HIGH << PADRING_DSE_SHIFT) | \
+ (SC_PAD_28FDSOI_PS_PU << PADRING_PULL_SHIFT))
+
+#define I2C_PAD_CTRL ((SC_PAD_CONFIG_OUT_IN << PADRING_CONFIG_SHIFT) | \
+ (SC_PAD_ISO_OFF << PADRING_LPCONFIG_SHIFT) | \
+ (SC_PAD_28FDSOI_DSE_DV_LOW << PADRING_DSE_SHIFT) | \
+ (SC_PAD_28FDSOI_PS_PU << PADRING_PULL_SHIFT))
+
+#define UART_PAD_CTRL ((SC_PAD_CONFIG_OUT_IN << PADRING_CONFIG_SHIFT) | \
+ (SC_PAD_ISO_OFF << PADRING_LPCONFIG_SHIFT) | \
+ (SC_PAD_28FDSOI_DSE_DV_HIGH << PADRING_DSE_SHIFT) | \
+ (SC_PAD_28FDSOI_PS_PU << PADRING_PULL_SHIFT))
+
+static iomux_cfg_t uart0_pads[] = {
+ SC_P_UART0_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
+ SC_P_UART0_TX | MUX_PAD_CTRL(UART_PAD_CTRL),
+};
+
+static void setup_iomux_uart(void)
+{
+ imx8_iomux_setup_multiple_pads(uart0_pads, ARRAY_SIZE(uart0_pads));
+}
+
+int board_early_init_f(void)
+{
+ /* sc_ipc_t ipcHndl = 0; */
+ sc_err_t scierr = 0;
+
+ /* When start u-boot in XEN VM, directly return */
+ /* if (IS_ENABLED(CONFIG_XEN)) */
+ /* return 0; */
+
+ /* ipcHndl = gd->arch.ipc_channel_handle; */
+
+ /* Power up UART0, this is very early while power domain is not working */
+ scierr = sc_pm_set_resource_power_mode(-1, SC_R_UART_0, SC_PM_PW_MODE_ON);
+ if (scierr != SC_ERR_NONE)
+ return 0;
+
+ /* Set UART0 clock root to 80 MHz */
+ sc_pm_clock_rate_t rate = 80000000;
+
+ scierr = sc_pm_set_clock_rate(-1, SC_R_UART_0, 2, &rate);
+ if (scierr != SC_ERR_NONE)
+ return 0;
+
+ /* Enable UART0 clock root */
+ scierr = sc_pm_clock_enable(-1, SC_R_UART_0, 2, true, false);
+ if (scierr != SC_ERR_NONE)
+ return 0;
+
+ setup_iomux_uart();
+
+ return 0;
+}
+
+#if IS_ENABLED(CONFIG_FSL_ESDHC_IMX)
+
+#define USDHC1_CD_GPIO IMX_GPIO_NR(5, 22)
+#define USDHC2_CD_GPIO IMX_GPIO_NR(4, 12)
+
+static struct fsl_esdhc_cfg usdhc_cfg[CONFIG_SYS_FSL_USDHC_NUM] = {
+ {USDHC1_BASE_ADDR, 0, 8},
+ {USDHC2_BASE_ADDR, 0, 4},
+ {USDHC3_BASE_ADDR, 0, 4},
+};
+
+static iomux_cfg_t emmc0[] = {
+ SC_P_EMMC0_CLK | MUX_PAD_CTRL(ESDHC_CLK_PAD_CTRL),
+ SC_P_EMMC0_CMD | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_EMMC0_DATA0 | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_EMMC0_DATA1 | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_EMMC0_DATA2 | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_EMMC0_DATA3 | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_EMMC0_DATA4 | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_EMMC0_DATA5 | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_EMMC0_DATA6 | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_EMMC0_DATA7 | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_EMMC0_RESET_B | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_EMMC0_STROBE | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+};
+
+static iomux_cfg_t usdhc1_sd[] = {
+ SC_P_USDHC1_CLK | MUX_PAD_CTRL(ESDHC_CLK_PAD_CTRL),
+ SC_P_USDHC1_CMD | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_USDHC1_DATA0 | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_USDHC1_DATA1 | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_USDHC1_DATA2 | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_USDHC1_DATA3 | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_USDHC1_DATA6 | MUX_MODE_ALT(2) | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_USDHC1_DATA7 | MUX_MODE_ALT(3) | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_USDHC1_RESET_B | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_USDHC1_VSELECT | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+};
+
+static iomux_cfg_t usdhc2_sd[] = {
+ SC_P_USDHC2_CLK | MUX_PAD_CTRL(ESDHC_CLK_PAD_CTRL),
+ SC_P_USDHC2_CMD | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_USDHC2_DATA0 | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_USDHC2_DATA1 | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_USDHC2_DATA2 | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_USDHC2_DATA3 | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_USDHC2_RESET_B | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_USDHC2_VSELECT | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_USDHC2_WP | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+ SC_P_USDHC2_CD_B | MUX_MODE_ALT(3) | MUX_PAD_CTRL(ESDHC_PAD_CTRL),
+};
+
+int board_mmc_init(struct bd_info *bis)
+{
+ int i, ret;
+ struct power_domain pd;
+
+ /*
+ * According to the board_mmc_init() the following map is done:
+ * (U-Boot device node) (Physical Port)
+ * mmc0 (onboard eMMC) USDHC1
+ * mmc1 (external SD card) USDHC2
+ * mmc2 (onboard µSD) USDHC3
+ */
+ for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
+ switch (i) {
+ case 0:
+ /* onboard eMMC */
+ if (!imx8_power_domain_lookup_name("conn_sdhc0", &pd))
+ power_domain_on(&pd);
+
+ imx8_iomux_setup_multiple_pads(emmc0, ARRAY_SIZE(emmc0));
+ init_clk_usdhc(0);
+ usdhc_cfg[i].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
+ break;
+ case 1:
+ /* external SD card */
+ if (!imx8_power_domain_lookup_name("conn_sdhc1", &pd))
+ power_domain_on(&pd);
+
+ imx8_iomux_setup_multiple_pads(usdhc1_sd, ARRAY_SIZE(usdhc1_sd));
+ init_clk_usdhc(1);
+ usdhc_cfg[i].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
+ gpio_request(USDHC1_CD_GPIO, "sd1_cd");
+ gpio_direction_input(USDHC1_CD_GPIO);
+ break;
+ case 2:
+ /* onboard µSD */
+ if (!imx8_power_domain_lookup_name("conn_sdhc2", &pd))
+ power_domain_on(&pd);
+
+ imx8_iomux_setup_multiple_pads(usdhc2_sd, ARRAY_SIZE(usdhc2_sd));
+ init_clk_usdhc(2);
+ usdhc_cfg[i].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
+ gpio_request(USDHC2_CD_GPIO, "sd2_cd");
+ gpio_direction_input(USDHC2_CD_GPIO);
+ break;
+ default:
+ printf("Warning: you configured more USDHC controllers"
+ "(%d) than supported by the board\n", i + 1);
+ return 0;
+ }
+ ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
+ if (ret) {
+ printf("Warning: failed to initialize mmc dev %d\n", i);
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
+int board_mmc_getcd(struct mmc *mmc)
+{
+ struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
+ int ret = 0;
+
+ switch (cfg->esdhc_base) {
+ case USDHC1_BASE_ADDR:
+ ret = 1;
+ break;
+ case USDHC2_BASE_ADDR:
+ ret = !gpio_get_value(USDHC1_CD_GPIO);
+ break;
+ case USDHC3_BASE_ADDR:
+ ret = !gpio_get_value(USDHC2_CD_GPIO);
+ break;
+ }
+
+ return ret;
+}
+
+#endif /* CONFIG_FSL_ESDHC_IMX */
+
+#if (IS_ENABLED(CONFIG_FEC_MXC))
+
+#include <miiphy.h>
+
+static iomux_cfg_t pad_enet0[] = {
+ SC_P_ENET0_RGMII_RX_CTL | MUX_PAD_CTRL(ENET_INPUT_PAD_CTRL),
+ SC_P_ENET0_RGMII_RXD0 | MUX_PAD_CTRL(ENET_INPUT_PAD_CTRL),
+ SC_P_ENET0_RGMII_RXD1 | MUX_PAD_CTRL(ENET_INPUT_PAD_CTRL),
+ SC_P_ENET0_RGMII_RXD2 | MUX_PAD_CTRL(ENET_INPUT_PAD_CTRL),
+ SC_P_ENET0_RGMII_RXD3 | MUX_PAD_CTRL(ENET_INPUT_PAD_CTRL),
+ SC_P_ENET0_RGMII_RXC | MUX_PAD_CTRL(ENET_INPUT_PAD_CTRL),
+ SC_P_ENET0_RGMII_TX_CTL | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
+ SC_P_ENET0_RGMII_TXD0 | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
+ SC_P_ENET0_RGMII_TXD1 | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
+ SC_P_ENET0_RGMII_TXD2 | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
+ SC_P_ENET0_RGMII_TXD3 | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
+ SC_P_ENET0_RGMII_TXC | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
+ SC_P_ENET0_MDC | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
+ SC_P_ENET0_MDIO | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
+};
+
+static void setup_iomux_fec(void)
+{
+ imx8_iomux_setup_multiple_pads(pad_enet0, ARRAY_SIZE(pad_enet0));
+}
+
+static void enet_device_phy_reset(void)
+{
+ gpio_set_value(FEC0_RESET, 0);
+ udelay(50);
+ gpio_set_value(FEC0_RESET, 1);
+
+ /* The board has a long delay for this reset to become stable */
+ mdelay(200);
+}
+
+int board_eth_init(struct bd_info *bis)
+{
+ setup_iomux_fec();
+
+ return 0;
+}
+
+int board_phy_config(struct phy_device *phydev)
+{
+ phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x1f);
+ phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x8);
+
+ phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x00);
+ phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x82ee);
+ phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x05);
+ phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x100);
+
+ if (phydev->drv->config)
+ phydev->drv->config(phydev);
+
+ return 0;
+}
+
+static int setup_fec(void)
+{
+ /* Reset ENET PHY */
+ enet_device_phy_reset();
+
+ return 0;
+}
+#endif
+
+#ifdef CONFIG_MXC_GPIO
+
+#define LVDS_ENABLE IMX_GPIO_NR(1, 6)
+#define BKL_ENABLE IMX_GPIO_NR(1, 7)
+
+static iomux_cfg_t board_gpios[] = {
+ SC_P_LVDS0_I2C0_SCL | MUX_MODE_ALT(3) | MUX_PAD_CTRL(GPIO_PAD_CTRL),
+ SC_P_LVDS0_I2C0_SDA | MUX_MODE_ALT(3) | MUX_PAD_CTRL(GPIO_PAD_CTRL),
+ SC_P_ESAI1_FST | MUX_MODE_ALT(3) | MUX_PAD_CTRL(GPIO_PAD_CTRL),
+};
+
+static void board_gpio_init(void)
+{
+ imx8_iomux_setup_multiple_pads(board_gpios, ARRAY_SIZE(board_gpios));
+
+ /* enable LVDS */
+ gpio_request(LVDS_ENABLE, "lvds_enable");
+ gpio_direction_output(LVDS_ENABLE, 1);
+
+ /* enable backlight */
+ gpio_request(BKL_ENABLE, "bkl_enable");
+ gpio_direction_output(BKL_ENABLE, 1);
+
+ /* ethernet reset */
+ gpio_request(FEC0_RESET, "enet0_reset");
+ gpio_direction_output(FEC0_RESET, 1);
+}
+#endif
+
+int checkboard(void)
+{
+ puts("Board: conga-QMX8\n");
+
+ build_info();
+ print_bootinfo();
+
+ return 0;
+}
+
+int board_init(void)
+{
+ if (IS_ENABLED(CONFIG_XEN))
+ return 0;
+
+#ifdef CONFIG_MXC_GPIO
+ board_gpio_init();
+#endif
+
+#if (IS_ENABLED(CONFIG_FEC_MXC))
+ setup_fec();
+#endif
+
+ return 0;
+}
+
+void detail_board_ddr_info(void)
+{
+ puts("\nDDR ");
+}
+
+/*
+ * Board specific reset that is system reset.
+ */
+void reset_cpu(ulong addr)
+{
+ /* TODO */
+}
+
+#ifdef CONFIG_OF_BOARD_SETUP
+int ft_board_setup(void *blob, struct bd_info *bd)
+{
+ return 0;
+}
+#endif
+
+int board_mmc_get_env_dev(int devno)
+{
+ /* Use EMMC */
+ if (IS_ENABLED(CONFIG_XEN))
+ return 0;
+
+ return devno;
+}
+
+int mmc_map_to_kernel_blk(int dev_no)
+{
+ /* Use EMMC */
+ if (IS_ENABLED(CONFIG_XEN))
+ return 0;
+
+ return dev_no;
+}
+
+extern u32 _end_ofs;
+int board_late_init(void)
+{
+#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
+ env_set("board_name", "QMX8");
+ env_set("board_rev", "iMX8QM");
+#endif
+
+ env_set("sec_boot", "no");
+#ifdef CONFIG_AHAB_BOOT
+ env_set("sec_boot", "yes");
+#endif
+
+#ifdef CONFIG_ENV_IS_IN_MMC
+ board_late_mmc_env_init();
+#endif
+
+#ifdef IMX_LOAD_HDMI_FIMRWARE
+ char *end_of_uboot;
+ char command[256];
+
+ end_of_uboot = (char *)(ulong)(CONFIG_SYS_TEXT_BASE + _end_ofs
+ + fdt_totalsize(gd->fdt_blob));
+ end_of_uboot += 9;
+
+ /* load hdmitxfw.bin and hdmirxfw.bin*/
+ memcpy(IMX_HDMI_FIRMWARE_LOAD_ADDR, end_of_uboot,
+ IMX_HDMITX_FIRMWARE_SIZE + IMX_HDMIRX_FIRMWARE_SIZE);
+
+ sprintf(command, "hdp load 0x%x", IMX_HDMI_FIRMWARE_LOAD_ADDR);
+ run_command(command, 0);
+
+ sprintf(command, "hdprx load 0x%x",
+ IMX_HDMI_FIRMWARE_LOAD_ADDR + IMX_HDMITX_FIRMWARE_SIZE);
+ run_command(command, 0);
+#endif
+
+ return 0;
+}
+
+#ifdef CONFIG_FSL_FASTBOOT
+#ifdef CONFIG_ANDROID_RECOVERY
+int is_recovery_key_pressing(void)
+{
+ return 0; /*TODO*/
+}
+#endif /*CONFIG_ANDROID_RECOVERY*/
+#endif /*CONFIG_FSL_FASTBOOT*/
+
+/* Only Enable USB3 resources currently */
+int board_usb_init(int index, enum usb_init_type init)
+{
+ return 0;
+}
diff --git a/board/congatec/cgtqmx8/imximage.cfg b/board/congatec/cgtqmx8/imximage.cfg
new file mode 100644
index 0000000000..e324c7ca37
--- /dev/null
+++ b/board/congatec/cgtqmx8/imximage.cfg
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2018 NXP
+ */
+
+#define __ASSEMBLY__
+
+/* Boot from SD, sector size 0x400 */
+BOOT_FROM SD 0x400
+/* SoC type IMX8QM */
+SOC_TYPE IMX8QM
+/* Append seco container image */
+APPEND mx8qm-ahab-container.img
+/* Create the 2nd container */
+CONTAINER
+/* Add scfw image with exec attribute */
+IMAGE SCU mx8qm-val-scfw-tcm.bin
+/* Add ATF image with exec attribute */
+IMAGE A35 bl31.bin 0x80000000
+/* Add U-Boot image with load attribute */
+DATA A35 u-boot-dtb.bin 0x80020000
diff --git a/board/congatec/cgtqmx8/spl.c b/board/congatec/cgtqmx8/spl.c
new file mode 100644
index 0000000000..2a5d4c1bcd
--- /dev/null
+++ b/board/congatec/cgtqmx8/spl.c
@@ -0,0 +1,77 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2018 NXP
+ *
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <init.h>
+#include <log.h>
+#include <spl.h>
+#include <dm/uclass.h>
+#include <dm/device.h>
+#include <dm/uclass-internal.h>
+#include <dm/device-internal.h>
+#include <dm/lists.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+void spl_board_init(void)
+{
+ struct udevice *dev;
+ int offset;
+
+ uclass_find_first_device(UCLASS_MISC, &dev);
+
+ for (; dev; uclass_find_next_device(&dev)) {
+ if (device_probe(dev))
+ continue;
+ }
+
+ offset = fdt_node_offset_by_compatible(gd->fdt_blob, -1, "nxp,imx8-pd");
+ while (offset != -FDT_ERR_NOTFOUND) {
+ lists_bind_fdt(gd->dm_root, offset_to_ofnode(offset),
+ NULL, true);
+ offset = fdt_node_offset_by_compatible(gd->fdt_blob, offset,
+ "nxp,imx8-pd");
+ }
+
+ uclass_find_first_device(UCLASS_POWER_DOMAIN, &dev);
+
+ for (; dev; uclass_find_next_device(&dev)) {
+ if (device_probe(dev))
+ continue;
+ }
+
+ arch_cpu_init();
+
+ board_early_init_f();
+
+ timer_init();
+
+ preloader_console_init();
+
+ puts("Normal Boot\n");
+}
+
+#if (IS_ENABLED(CONFIG_SPL_LOAD_FIT))
+int board_fit_config_name_match(const char *name)
+{
+ /* Just empty function now - can't decide what to choose */
+ debug("%s: %s\n", __func__, name);
+
+ return 0;
+}
+#endif
+
+void board_init_f(ulong dummy)
+{
+ /* Clear global data */
+ memset((void *)gd, 0, sizeof(gd_t));
+
+ /* Clear the BSS. */
+ memset(__bss_start, 0, __bss_end - __bss_start);
+
+ board_init_r(NULL, 0);
+}
diff --git a/board/congatec/common/Kconfig b/board/congatec/common/Kconfig
new file mode 100644
index 0000000000..5c205bd830
--- /dev/null
+++ b/board/congatec/common/Kconfig
@@ -0,0 +1,48 @@
+if !ARCH_IMX8M && !ARCH_IMX8
+
+config CHAIN_OF_TRUST
+ depends on !FIT_SIGNATURE && SECURE_BOOT
+ imply CMD_BLOB
+ imply CMD_HASH if ARM
+ select FSL_CAAM
+ select SPL_BOARD_INIT if (ARM && SPL)
+ select SHA_HW_ACCEL
+ select SHA_PROG_HW_ACCEL
+ select ENV_IS_NOWHERE
+ select CMD_EXT4 if ARM
+ select CMD_EXT4_WRITE if ARM
+ bool
+ default y
+
+config CMD_ESBC_VALIDATE
+ bool "Enable the 'esbc_validate' and 'esbc_halt' commands"
+ default y if CHAIN_OF_TRUST
+ help
+ This option enables two commands used for secure booting:
+
+ esbc_validate - validate signature using RSA verification
+ esbc_halt - put the core in spin loop (Secure Boot Only)
+
+endif
+
+config VOL_MONITOR_LTC3882_READ
+ depends on VID
+ bool "Enable the LTC3882 voltage monitor read"
+ default n
+ help
+ This option enables LTC3882 voltage monitor read
+ functionality. It is used by common VID driver.
+
+config VOL_MONITOR_LTC3882_SET
+ depends on VID
+ bool "Enable the LTC3882 voltage monitor set"
+ default n
+ help
+ This option enables LTC3882 voltage monitor set
+ functionality. It is used by common VID driver.
+
+config USB_TCPC
+ bool "USB Typec port controller simple driver"
+ default n
+ help
+ Enable USB type-c port controller (TCPC) driver
diff --git a/board/congatec/common/Makefile b/board/congatec/common/Makefile
new file mode 100644
index 0000000000..d4ddfbf971
--- /dev/null
+++ b/board/congatec/common/Makefile
@@ -0,0 +1,23 @@
+#
+# (C) Copyright 2006
+# Wolfgang Denk, DENX Software Engineering, wd(a)denx.de.
+#
+# SPDX-License-Identifier: GPL-2.0+
+#
+
+MINIMAL=
+
+ifdef CONFIG_SPL_BUILD
+ifdef CONFIG_SPL_INIT_MINIMAL
+MINIMAL=y
+endif
+endif
+
+ifdef MINIMAL
+# necessary to create built-in.o
+obj- := __dummy__.o
+else
+
+obj-y += mmc.o
+
+endif
diff --git a/board/congatec/common/mmc.c b/board/congatec/common/mmc.c
new file mode 100644
index 0000000000..bd0277c2b6
--- /dev/null
+++ b/board/congatec/common/mmc.c
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2016 Freescale Semiconductor, Inc.
+ * Copyright 2018 NXP
+ *
+ */
+#include <common.h>
+#include <asm/arch/sys_proto.h>
+#include <linux/errno.h>
+#include <asm/io.h>
+#include <env.h>
+#include <command.h>
+#include <stdbool.h>
+#include <mmc.h>
+
+static int check_mmc_autodetect(void)
+{
+ char *autodetect_str = env_get("mmcautodetect");
+
+ if ((autodetect_str) && (strcmp(autodetect_str, "yes") == 0))
+ return 1;
+
+ return 0;
+}
+
+/* This should be defined for each board */
+__weak int mmc_map_to_kernel_blk(int dev_no)
+{
+ return dev_no;
+}
+
+void board_late_mmc_env_init(void)
+{
+ char cmd[32];
+ char mmcblk[32];
+ u32 dev_no = mmc_get_env_dev();
+
+ if (!check_mmc_autodetect())
+ return;
+
+ env_set_ulong("mmcdev", dev_no);
+
+ /* Set mmcblk env */
+ sprintf(mmcblk, "/dev/mmcblk%dp2 rootwait rw",
+ mmc_map_to_kernel_blk(dev_no));
+ env_set("mmcroot", mmcblk);
+
+ sprintf(cmd, "mmc dev %d", dev_no);
+ run_command(cmd, 0);
+}
diff --git a/configs/cgtqmx8_defconfig b/configs/cgtqmx8_defconfig
new file mode 100644
index 0000000000..238e421601
--- /dev/null
+++ b/configs/cgtqmx8_defconfig
@@ -0,0 +1,86 @@
+CONFIG_ARM=y
+CONFIG_SPL_SYS_ICACHE_OFF=y
+CONFIG_SPL_SYS_DCACHE_OFF=y
+CONFIG_ARCH_IMX8=y
+CONFIG_SYS_TEXT_BASE=0x80020000
+CONFIG_SPL_GPIO_SUPPORT=y
+CONFIG_SPL_LIBCOMMON_SUPPORT=y
+CONFIG_SPL_LIBGENERIC_SUPPORT=y
+CONFIG_TARGET_CONGA_QMX8=y
+CONFIG_SPL_MMC_SUPPORT=y
+CONFIG_SPL_SERIAL_SUPPORT=y
+CONFIG_SPL_DRIVERS_MISC_SUPPORT=y
+CONFIG_NR_DRAM_BANKS=3
+CONFIG_SPL=y
+CONFIG_FIT=y
+CONFIG_SPL_LOAD_FIT=y
+CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-imx/mkimage_fit_atf.sh"
+CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/congatec/cgtqmx8/imximage.cfg"
+CONFIG_BOOTDELAY=3
+CONFIG_IMX_BOOTAUX=y
+CONFIG_LOG=y
+CONFIG_SPL_BOARD_INIT=y
+CONFIG_HUSH_PARSER=y
+CONFIG_SPL_SEPARATE_BSS=y
+CONFIG_SPL_POWER_SUPPORT=y
+CONFIG_SPL_POWER_DOMAIN=y
+CONFIG_SPL_WATCHDOG_SUPPORT=y
+CONFIG_CMD_CPU=y
+# CONFIG_BOOTM_NETBSD is not set
+# CONFIG_CMD_IMPORTENV is not set
+CONFIG_CMD_CLK=y
+CONFIG_CMD_DM=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_MII=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_FAT=y
+CONFIG_CMD_FUSE=y
+CONFIG_SPL_OF_CONTROL=y
+CONFIG_DEFAULT_DEVICE_TREE="imx8qm-cgtqmx8"
+CONFIG_ENV_IS_IN_MMC=y
+CONFIG_ENV_SIZE=0x1000
+CONFIG_ENV_OFFSET=0x400000
+CONFIG_SPL_DM=y
+CONFIG_SPL_CLK=y
+CONFIG_CLK_IMX8=y
+CONFIG_CPU=y
+CONFIG_DM_GPIO=y
+CONFIG_MXC_GPIO=y
+CONFIG_DM_PCA953X=y
+CONFIG_DM_I2C=y
+CONFIG_SYS_I2C_IMX_LPI2C=y
+CONFIG_I2C_MUX=y
+CONFIG_I2C_MUX_PCA954x=y
+CONFIG_MISC=y
+CONFIG_DM_MMC=y
+CONFIG_FSL_USDHC=y
+CONFIG_PHYLIB=y
+CONFIG_PHY_ADDR_ENABLE=y
+CONFIG_PHY_ATHEROS=y
+CONFIG_DM_ETH=y
+CONFIG_PHY_GIGE=y
+CONFIG_FEC_MXC_SHARE_MDIO=y
+CONFIG_FEC_MXC_MDIO_BASE=0x5B040000
+CONFIG_FEC_MXC=y
+CONFIG_MII=y
+CONFIG_PINCTRL=y
+CONFIG_SPL_PINCTRL=y
+CONFIG_PINCTRL_IMX8=y
+CONFIG_POWER_DOMAIN=y
+CONFIG_IMX8_POWER_DOMAIN=y
+CONFIG_DM_REGULATOR=y
+CONFIG_SPL_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_DM_REGULATOR_GPIO=y
+CONFIG_SPL_DM_REGULATOR_GPIO=y
+CONFIG_DM_SERIAL=y
+CONFIG_FSL_LPUART=y
+CONFIG_SPL_TINY_MEMSET=y
+# CONFIG_EFI_LOADER is not set
+CONFIG_SYS_MMCSD_FS_BOOT_PARTITION=0
+CONFIG_SYS_MMC_ENV_PART=0
+CONFIG_SYS_MMC_ENV_DEV=1
diff --git a/doc/board/congatec/cgtqmx8.rst b/doc/board/congatec/cgtqmx8.rst
new file mode 100644
index 0000000000..bccdef2f16
--- /dev/null
+++ b/doc/board/congatec/cgtqmx8.rst
@@ -0,0 +1,70 @@
+.. SPDX-License-Identifier: GPL-2.0+
+
+U-Boot for the Congatec conga-QMX8 board
+========================================
+
+Quick Start
+-----------
+
+- Build the ARM Trusted firmware binary
+- Get scfw_tcm.bin and ahab-container.img
+- Get imx-mkimage
+- Build U-Boot
+- Build imx-mkimage
+- Flash the binary into the SD card
+- Boot
+
+Get and Build the ARM Trusted firmware
+--------------------------------------
+
+.. code-block:: bash
+
+ $ git clone https://source.codeaurora.org/external/imx/imx-atf
+ $ cd imx-atf/
+ $ git checkout origin/imx_4.14.78_1.0.0_ga -b imx_4.14.78_1.0.0_ga
+ $ make PLAT=imx8qm bl31
+
+Get scfw_tcm.bin and ahab-container.img
+---------------------------------------
+
+.. code-block:: bash
+
+ $ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/imx-sc-firmware-1.1.bin
+ $ chmod +x imx-sc-firmware-1.1.bin
+ $ ./imx-sc-firmware-1.1.bin
+ $ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.0.bin
+ $ chmod +x firmware-imx-8.0.bin
+ $ ./firmware-imx-8.0.bin
+
+Or use this to avoid running random scripts from the internet,
+but note that you must agree to the license the script displays:
+
+.. code-block:: bash
+
+ $ dd if=imx-sc-firmware-1.1.bin of=imx-sc-firmware-1.1.tar.bz2 bs=37185 skip=1
+ $ tar -xf imx-sc-firmware-1.1.tar.bz2
+ $ cp imx-sc-firmware-1.1/mx8qx-val-scfw-tcm.bin $(builddir)
+
+ $ dd if=firmware-imx-8.0.bin of=firmware-imx-8.0.tar.bz2 bs=37180 skip=1
+ $ tar -xf firmware-imx-8.0.tar.bz2
+ $ cp firmware-imx-8.0/firmware/seco/mx8qm-ahab-container.img $(builddir)
+
+Build U-Boot
+------------
+
+.. code-block:: bash
+
+ $ export ATF_LOAD_ADDR=0x80000000
+ $ export BL33_LOAD_ADDR=0x80020000
+ $ make cgtqmx8_defconfig
+ $ make u-boot.bin
+ $ make flash.bin
+
+Flash the binary into the SD card
+---------------------------------
+
+Burn the flash.bin binary to SD card offset 32KB:
+
+.. code-block:: bash
+
+ $ sudo dd if=flash.bin of=/dev/sd[x] bs=1k seek=32 conv=fsync
diff --git a/doc/board/congatec/index.rst b/doc/board/congatec/index.rst
new file mode 100644
index 0000000000..cc57b36b2e
--- /dev/null
+++ b/doc/board/congatec/index.rst
@@ -0,0 +1,9 @@
+.. SPDX-License-Identifier: GPL-2.0+
+
+Congatec
+========
+
+.. toctree::
+ :maxdepth: 2
+
+ cgtqmx8.rst
diff --git a/include/configs/cgtqmx8.h b/include/configs/cgtqmx8.h
new file mode 100644
index 0000000000..15c50279ad
--- /dev/null
+++ b/include/configs/cgtqmx8.h
@@ -0,0 +1,181 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2017-2018 NXP
+ * Copyright 2018 congatec AG
+ *
+ */
+
+#ifndef __CGTQMX8_H
+#define __CGTQMX8_H
+
+#include <linux/sizes.h>
+#include <asm/arch/imx-regs.h>
+
+#ifdef CONFIG_SPL_BUILD
+#define CONFIG_SPL_TEXT_BASE 0x0
+#define CONFIG_SPL_MAX_SIZE (124 * 1024)
+#define CONFIG_SYS_MONITOR_LEN (1024 * 1024)
+#define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
+#define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR 0x800
+
+#define CONFIG_SPL_LDSCRIPT "arch/arm/cpu/armv8/u-boot-spl.lds"
+#define CONFIG_SPL_STACK 0x013E000
+#define CONFIG_SPL_BSS_START_ADDR 0x00128000
+#define CONFIG_SPL_BSS_MAX_SIZE 0x1000 /* 4 KB */
+#define CONFIG_SYS_SPL_MALLOC_START 0x00120000
+#define CONFIG_SYS_SPL_MALLOC_SIZE 0x3000 /* 12 KB */
+#define CONFIG_SERIAL_LPUART_BASE 0x5a060000
+#define CONFIG_MALLOC_F_ADDR 0x00120000
+
+#define CONFIG_SPL_RAW_IMAGE_ARM_TRUSTED_FIRMWARE
+
+#define CONFIG_SPL_ABORT_ON_RAW_IMAGE
+
+#define CONFIG_OF_EMBED
+#endif
+
+#define CONFIG_REMAKE_ELF
+
+#define CONFIG_BOARD_EARLY_INIT_F
+
+/* Flat Device Tree Definitions */
+#define CONFIG_OF_BOARD_SETUP
+
+#define CONFIG_SYS_BOOTMAPSZ (256 << 20)
+#define CONFIG_SYS_FSL_ESDHC_ADDR 0
+#define USDHC1_BASE_ADDR 0x5B010000
+#define USDHC2_BASE_ADDR 0x5B020000
+#define USDHC3_BASE_ADDR 0x5B030000
+#define CONFIG_SUPPORT_EMMC_BOOT /* eMMC specific */
+
+#define CONFIG_ENV_OVERWRITE
+
+#define CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
+
+/* Boot M4 */
+#define M4_BOOT_ENV \
+ "m4_0_image=m4_0.bin\0" \
+ "m4_1_image=m4_1.bin\0" \
+ "loadm4image_0=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${m4_0_image}\0" \
+ "loadm4image_1=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${m4_1_image}\0" \
+ "m4boot_0=run loadm4image_0; dcache flush; bootaux ${loadaddr} 0\0" \
+ "m4boot_1=run loadm4image_1; dcache flush; bootaux ${loadaddr} 1\0" \
+
+#ifdef CONFIG_NAND_BOOT
+#define MFG_NAND_PARTITION "mtdparts=gpmi-nand:128m(boot),32m(kernel),16m(dtb),8m(misc),-(rootfs) "
+#else
+#define MFG_NAND_PARTITION ""
+#endif
+#define FEC0_RESET IMX_GPIO_NR(2, 5)
+#define FEC0_PDOMAIN "conn_enet0"
+
+#define CONFIG_MFG_ENV_SETTINGS \
+ "mfgtool_args=setenv bootargs console=${console},${baudrate} " \
+ "rdinit=/linuxrc " \
+ "g_mass_storage.stall=0 g_mass_storage.removable=1 " \
+ "g_mass_storage.idVendor=0x066F g_mass_storage.idProduct=0x37FF "\
+ "g_mass_storage.iSerialNumber=\"\" "\
+ MFG_NAND_PARTITION \
+ "clk_ignore_unused "\
+ "\0" \
+ "initrd_addr=0x83800000\0" \
+ "bootcmd_mfg=run mfgtool_args;booti ${loadaddr} ${initrd_addr} ${fdt_addr};\0" \
+
+/* Initial environment variables */
+#define CONFIG_EXTRA_ENV_SETTINGS \
+ CONFIG_MFG_ENV_SETTINGS \
+ M4_BOOT_ENV \
+ "script=boot.scr\0" \
+ "image=Image\0" \
+ "panel=NULL\0" \
+ "console=ttyLP0\0" \
+ "fdt_addr=0x83000000\0" \
+ "boot_fdt=try\0" \
+ "fdt_file=imx8qm-cgt-qmx8.dtb\0" \
+ "mmcdev=" __stringify(CONFIG_SYS_MMC_ENV_DEV) "\0" \
+ "mmcpart=" __stringify(CONFIG_SYS_MMC_IMG_LOAD_PART) "\0" \
+ "mmcroot=" CONFIG_MMCROOT " rootwait rw\0" \
+ "mmcautodetect=yes\0" \
+ "mmcargs=setenv bootargs console=${console},${baudrate} root=${mmcroot} earlycon\0 " \
+ "loadbootscript=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};\0" \
+ "bootscript=echo Running bootscript from mmc ...; " \
+ "source\0" \
+ "loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}\0" \
+ "loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}\0" \
+ "mmcboot=echo Booting from mmc ...; " \
+ "run mmcargs; " \
+ "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
+ "if run loadfdt; then " \
+ "booti ${loadaddr} - ${fdt_addr}; " \
+ "else " \
+ "echo WARN: Cannot load the DT; " \
+ "fi; " \
+ "else " \
+ "echo wait for boot; " \
+ "fi;\0" \
+ "netargs=setenv bootargs console=${console},${baudrate} " \
+ "root=/dev/nfs " \
+ "ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp rw earlycon\0" \
+ "netboot=echo Booting from net ...; " \
+ "run netargs; " \
+ "if test ${ip_dyn} = yes; then " \
+ "setenv get_cmd dhcp; " \
+ "else " \
+ "setenv get_cmd tftp; " \
+ "fi; " \
+ "${get_cmd} ${loadaddr} ${image}; " \
+ "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
+ "if ${get_cmd} ${fdt_addr} ${fdt_file}; then " \
+ "booti ${loadaddr} - ${fdt_addr}; " \
+ "else " \
+ "echo WARN: Cannot load the DT; " \
+ "fi; " \
+ "else " \
+ "booti; " \
+ "fi;\0"
+
+#define CONFIG_BOOTCOMMAND \
+ "mmc dev ${mmcdev}; if mmc rescan; then " \
+ "if run loadbootscript; then " \
+ "run bootscript; " \
+ "else " \
+ "if run loadimage; then " \
+ "run mmcboot; " \
+ "else run netboot; " \
+ "fi; " \
+ "fi; " \
+ "else booti ${loadaddr} - ${fdt_addr}; fi"
+
+/* Link Definitions */
+#define CONFIG_LOADADDR 0x80280000
+
+#define CONFIG_SYS_LOAD_ADDR CONFIG_LOADADDR
+
+#define CONFIG_SYS_INIT_SP_ADDR 0x80200000
+
+#define CONFIG_SYS_MMC_IMG_LOAD_PART 1
+
+#define CONFIG_MMCROOT "/dev/mmcblk1p2" /* USDHC2 */
+#define CONFIG_SYS_FSL_USDHC_NUM 3
+
+/* Size of malloc() pool */
+#define CONFIG_SYS_MALLOC_LEN ((CONFIG_ENV_SIZE + (32 * 1024)) * 1024)
+
+#define CONFIG_SYS_SDRAM_BASE 0x80000000
+#define PHYS_SDRAM_1 0x80000000
+#define PHYS_SDRAM_2 0x880000000
+#define PHYS_SDRAM_1_SIZE 0x80000000 /* 2 GB */
+#define PHYS_SDRAM_2_SIZE 0x100000000 /* 4 GB */
+
+/* Serial */
+#define CONFIG_BAUDRATE 115200
+
+/* Generic Timer Definitions */
+#define COUNTER_FREQUENCY 8000000 /* 8MHz */
+
+/* Networking */
+#define CONFIG_FEC_MXC_PHYADDR -1
+#define CONFIG_FEC_XCV_TYPE RGMII
+#define FEC_QUIRK_ENET_MAC
+
+#endif /* __CGTQMX8_H */
--
2.17.1
2
3

[PATCH u-boot-dm + u-boot-spi v3 00/11] Support SPI NORs and OF partitions in `mtd list`
by Marek Behún 01 Mar '21
by Marek Behún 01 Mar '21
01 Mar '21
Hello,
this is v3 of patchset that adds support for U-Boot to parse MTD
partitions from device-tree, and also improves support for SPI NOR
access via the `mtd` command.
Changes since v2:
- addressed Pali's comments in patch that adds partition parsing (4/7 in
this version): no check for whether the `compatible` property is
present in a partition node and added comment explaining mask flags)
- added 4 more patches:
1) adding ofnode_get_path() function
2) printing OF path in `mtd list`
3) in `mtd read <name> ...`, <name> can now also be DM's device name
or OF path
4) the fact from 3) is added to `mtd help`
Changes since v1:
- added tests of ofnode_get_addr_size_index() and
ofnode_get_addr_size_index_notrans() as requested by Simon
- the last patch now probes SPI NORs in both versions of
mtd_probe_devices(), that is when MTDPARTS is enabled or disabled
Marek
Cc: Jagan Teki <jagan(a)amarulasolutions.com>
Cc: Priyanka Jain <priyanka.jain(a)nxp.com>
Cc: Simon Glass <sjg(a)chromium.org>
Cc: Heiko Schocher <hs(a)denx.de>
Cc: Jagan Teki <jagan(a)amarulasolutions.com>
Cc: Patrick Delaunay <patrick.delaunay(a)st.com>
Cc: Patrice CHOTARD <patrice.chotard(a)foss.st.com>
Cc: Miquel Raynal <miquel.raynal(a)bootlin.com>
Marek Behún (11):
dm: core: add test for ofnode_get_addr_size_index()
dm: core: add non-translating version of ofnode_get_addr_size_index()
dm: core: add ofnode_get_path()
mtd: add support for parsing partitions defined in OF
mtd: spi-nor: allow registering multiple MTDs when DM is enabled
mtd: spi-nor: fill-in mtd->dev member
mtd: remove mtd_probe() function
mtd: probe SPI NOR devices in mtd_probe_devices()
cmd: mtd: print device OF path in listing
mtd: compare also with OF path and device name in get_mtd_device_nm()
cmd: mtd: expand <name> argument definition in command help
cmd/mtd.c | 11 ++-
drivers/core/ofnode.c | 44 ++++++++++-
drivers/mtd/mtd-uclass.c | 15 ----
drivers/mtd/mtd_uboot.c | 129 ++++++++++++++++++++-------------
drivers/mtd/mtdcore.c | 29 ++++++++
drivers/mtd/mtdpart.c | 63 ++++++++++++++++
drivers/mtd/spi/sf_internal.h | 4 +-
drivers/mtd/spi/sf_mtd.c | 19 ++++-
drivers/mtd/spi/sf_probe.c | 6 +-
drivers/mtd/spi/spi-nor-core.c | 1 +
drivers/mtd/spi/spi-nor-tiny.c | 1 +
include/dm/ofnode.h | 27 +++++++
include/linux/mtd/mtd.h | 9 +++
include/mtd.h | 1 -
test/dm/ofnode.c | 50 +++++++++++++
15 files changed, 334 insertions(+), 75 deletions(-)
--
2.26.2
6
23

[PATCH] usb: dwc2: change compatible st, stm32mp1-hsotg to st, stm32mp15-hsotg
by Patrick Delaunay 01 Mar '21
by Patrick Delaunay 01 Mar '21
01 Mar '21
The Linux kernel v5.7-rc1 introduced the compatible "st,stm32mp15-hsotg".
See Linux kernel commit d49850110434 ("dt-bindings: usb: dwc2: add
support for STM32MP15 SoCs USB OTG HS and FS")
This patch updates the supported compatible in DWC2 driver,
removes the add-on done in U-Boot dtsi and keeps the compatible
defined in SOC dtsi arch/arm/dts/stm32mp151.dtsi:
usbotg_hs: usb-otg@49000000 {
compatible = "st,stm32mp15-hsotg", "snps,dwc2";
reg = <0x49000000 0x10000>;
...
};
Signed-off-by: Patrick Delaunay <patrick.delaunay(a)foss.st.com>
---
arch/arm/dts/stm32mp15-u-boot.dtsi | 3 ---
drivers/usb/gadget/dwc2_udc_otg.c | 2 +-
2 files changed, 1 insertion(+), 4 deletions(-)
diff --git a/arch/arm/dts/stm32mp15-u-boot.dtsi b/arch/arm/dts/stm32mp15-u-boot.dtsi
index d0aa5eabe5..43a7909978 100644
--- a/arch/arm/dts/stm32mp15-u-boot.dtsi
+++ b/arch/arm/dts/stm32mp15-u-boot.dtsi
@@ -228,6 +228,3 @@
resets = <&rcc UART8_R>;
};
-&usbotg_hs {
- compatible = "st,stm32mp1-hsotg", "snps,dwc2";
-};
diff --git a/drivers/usb/gadget/dwc2_udc_otg.c b/drivers/usb/gadget/dwc2_udc_otg.c
index e3871e381e..ecac80fc11 100644
--- a/drivers/usb/gadget/dwc2_udc_otg.c
+++ b/drivers/usb/gadget/dwc2_udc_otg.c
@@ -1176,7 +1176,7 @@ static int dwc2_udc_otg_remove(struct udevice *dev)
static const struct udevice_id dwc2_udc_otg_ids[] = {
{ .compatible = "snps,dwc2" },
{ .compatible = "brcm,bcm2835-usb" },
- { .compatible = "st,stm32mp1-hsotg",
+ { .compatible = "st,stm32mp15-hsotg",
.data = (ulong)dwc2_set_stm32mp1_hsotg_params },
{},
};
--
2.17.1
5
9

01 Mar '21
There is a second lpddr configuration with 2GB of RAM, but this requires
different RAM timings, so in addition to adding the timing file, a
separate defconfig is necessary.
Signed-off-by: Adam Ford <aford173(a)gmail.com>
diff --git a/board/beacon/imx8mn/Kconfig b/board/beacon/imx8mn/Kconfig
index 6ed17c00d8..2bcfb25cf8 100644
--- a/board/beacon/imx8mn/Kconfig
+++ b/board/beacon/imx8mn/Kconfig
@@ -13,6 +13,10 @@ config IMX8MN_FORCE_NOM_SOC
bool "Force to use nominal mode for SOC and ARM"
default n
+config IMX8MN_BEACON_2GB_LPDDR
+ bool "Enable 2GB LPDDR"
+ default n
+
source "board/freescale/common/Kconfig"
endif
diff --git a/board/beacon/imx8mn/MAINTAINERS b/board/beacon/imx8mn/MAINTAINERS
index 4e3fc713a0..4805cb255c 100644
--- a/board/beacon/imx8mn/MAINTAINERS
+++ b/board/beacon/imx8mn/MAINTAINERS
@@ -4,3 +4,4 @@ S: Maintained
F: board/beacon/imx8mn/
F: include/configs/imx8mn_beacon.h
F: configs/imx8mn_beacon_defconfig
+F: configs/imx8mn_beacon_2g_defconfig
diff --git a/board/beacon/imx8mn/Makefile b/board/beacon/imx8mn/Makefile
index 9e842de42f..d620ccb772 100644
--- a/board/beacon/imx8mn/Makefile
+++ b/board/beacon/imx8mn/Makefile
@@ -8,6 +8,9 @@ obj-y += imx8mn_beacon.o
obj-y += ../../freescale/common/
ifdef CONFIG_SPL_BUILD
obj-y += spl.o
-obj-$(CONFIG_IMX8M_LPDDR4) += lpddr4_timing.o
-obj-$(CONFIG_IMX8M_DDR4) += ddr4_timing.o
+ifdef CONFIG_IMX8MN_BEACON_2GB_LPDDR
+obj-y += lpddr4_2g_timing.o
+else
+obj-y += lpddr4_timing.o
+endif
endif
diff --git a/board/beacon/imx8mn/lpddr4_2g_timing.c b/board/beacon/imx8mn/lpddr4_2g_timing.c
new file mode 100644
index 0000000000..3c32d804a1
--- /dev/null
+++ b/board/beacon/imx8mn/lpddr4_2g_timing.c
@@ -0,0 +1,1440 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2019 NXP
+ *
+ * Generated code from MX8M_DDR_tool
+ * Align with uboot-imx_v2018.03_4.14.78_1.0.0_ga
+ */
+
+#include <linux/kernel.h>
+#include <asm/arch/ddr.h>
+
+struct dram_cfg_param ddr_ddrc_cfg[] = {
+ /** Initialize DDRC registers **/
+ { 0x3d400304, 0x1 },
+ { 0x3d400030, 0x1 },
+ { 0x3d400000, 0xa3080020 },
+ { 0x3d400020, 0x202 },
+ { 0x3d400024, 0x3e800 },
+ { 0x3d400064, 0x3000e0 },
+ { 0x3d4000d0, 0xc003061c },
+ { 0x3d4000d4, 0x9e0000 },
+ { 0x3d4000dc, 0xd4002d },
+ { 0x3d4000e0, 0x310000 },
+ { 0x3d4000e8, 0x66004d },
+ { 0x3d4000ec, 0x16004d },
+ { 0x3d400100, 0x1a200d22 },
+ { 0x3d400104, 0x60633 },
+ { 0x3d40010c, 0xc0c000 },
+ { 0x3d400110, 0xf04080f },
+ { 0x3d400114, 0x2040c0c },
+ { 0x3d400118, 0x1010007 },
+ { 0x3d40011c, 0x401 },
+ { 0x3d400130, 0x20600 },
+ { 0x3d400134, 0xc100002 },
+ { 0x3d400138, 0xe6 },
+ { 0x3d400144, 0xa00050 },
+ { 0x3d400180, 0x3200018 },
+ { 0x3d400184, 0x28061a8 },
+ { 0x3d400188, 0x0 },
+ { 0x3d400190, 0x497820a },
+ { 0x3d400194, 0x80303 },
+ { 0x3d4001b4, 0x170a },
+ { 0x3d4001a0, 0xe0400018 },
+ { 0x3d4001a4, 0xdf00e4 },
+ { 0x3d4001a8, 0x80000000 },
+ { 0x3d4001b0, 0x11 },
+ { 0x3d4001c0, 0x1 },
+ { 0x3d4001c4, 0x1 },
+ { 0x3d4000f4, 0xc99 },
+ { 0x3d400108, 0x70e1617 },
+ { 0x3d400200, 0x17 },
+ { 0x3d40020c, 0x0 },
+ { 0x3d400210, 0x1f1f },
+ { 0x3d400204, 0x80808 },
+ { 0x3d400214, 0x7070707 },
+ { 0x3d400218, 0x7070707 },
+ { 0x3d400250, 0x29001701 },
+ { 0x3d400254, 0x2c },
+ { 0x3d40025c, 0x4000030 },
+ { 0x3d400264, 0x900093e7 },
+ { 0x3d40026c, 0x2005574 },
+ { 0x3d400400, 0x111 },
+ { 0x3d400408, 0x72ff },
+ { 0x3d400494, 0x2100e07 },
+ { 0x3d400498, 0x620096 },
+ { 0x3d40049c, 0x1100e07 },
+ { 0x3d4004a0, 0xc8012c },
+ { 0x3d402020, 0x0 },
+ { 0x3d402024, 0x7d00 },
+ { 0x3d402050, 0x20d040 },
+ { 0x3d402064, 0x6001c },
+ { 0x3d4020dc, 0x840000 },
+ { 0x3d4020e0, 0x310000 },
+ { 0x3d4020e8, 0x66004d },
+ { 0x3d4020ec, 0x16004d },
+ { 0x3d402100, 0xa040105 },
+ { 0x3d402104, 0x30407 },
+ { 0x3d402108, 0x203060b },
+ { 0x3d40210c, 0x505000 },
+ { 0x3d402110, 0x2040202 },
+ { 0x3d402114, 0x2030202 },
+ { 0x3d402118, 0x1010004 },
+ { 0x3d40211c, 0x301 },
+ { 0x3d402130, 0x20300 },
+ { 0x3d402134, 0xa100002 },
+ { 0x3d402138, 0x1d },
+ { 0x3d402144, 0x14000a },
+ { 0x3d402180, 0x640004 },
+ { 0x3d402190, 0x3818200 },
+ { 0x3d402194, 0x80303 },
+ { 0x3d4021b4, 0x100 },
+ { 0x3d4020f4, 0xc99 },
+ { 0x3d403020, 0x0 },
+ { 0x3d403024, 0x1f40 },
+ { 0x3d403050, 0x20d040 },
+ { 0x3d403064, 0x30007 },
+ { 0x3d4030dc, 0x840000 },
+ { 0x3d4030e0, 0x310000 },
+ { 0x3d4030e8, 0x66004d },
+ { 0x3d4030ec, 0x16004d },
+ { 0x3d403100, 0xa010102 },
+ { 0x3d403104, 0x30404 },
+ { 0x3d403108, 0x203060b },
+ { 0x3d40310c, 0x505000 },
+ { 0x3d403110, 0x2040202 },
+ { 0x3d403114, 0x2030202 },
+ { 0x3d403118, 0x1010004 },
+ { 0x3d40311c, 0x301 },
+ { 0x3d403130, 0x20300 },
+ { 0x3d403134, 0xa100002 },
+ { 0x3d403138, 0x8 },
+ { 0x3d403144, 0x50003 },
+ { 0x3d403180, 0x190004 },
+ { 0x3d403190, 0x3818200 },
+ { 0x3d403194, 0x80303 },
+ { 0x3d4031b4, 0x100 },
+ { 0x3d4030f4, 0xc99 },
+ { 0x3d400028, 0x0 },
+};
+
+/* PHY Initialize Configuration */
+struct dram_cfg_param ddr_ddrphy_cfg[] = {
+ { 0x100a0, 0x0 },
+ { 0x100a1, 0x1 },
+ { 0x100a2, 0x3 },
+ { 0x100a3, 0x2 },
+ { 0x100a4, 0x4 },
+ { 0x100a5, 0x5 },
+ { 0x100a6, 0x7 },
+ { 0x100a7, 0x6 },
+ { 0x110a0, 0x0 },
+ { 0x110a1, 0x1 },
+ { 0x110a2, 0x2 },
+ { 0x110a3, 0x3 },
+ { 0x110a4, 0x5 },
+ { 0x110a5, 0x4 },
+ { 0x110a6, 0x6 },
+ { 0x110a7, 0x7 },
+ { 0x1005f, 0x1ff },
+ { 0x1015f, 0x1ff },
+ { 0x1105f, 0x1ff },
+ { 0x1115f, 0x1ff },
+ { 0x11005f, 0x1ff },
+ { 0x11015f, 0x1ff },
+ { 0x11105f, 0x1ff },
+ { 0x11115f, 0x1ff },
+ { 0x21005f, 0x1ff },
+ { 0x21015f, 0x1ff },
+ { 0x21105f, 0x1ff },
+ { 0x21115f, 0x1ff },
+ { 0x55, 0x1ff },
+ { 0x1055, 0x1ff },
+ { 0x2055, 0x1ff },
+ { 0x3055, 0x1ff },
+ { 0x4055, 0x1ff },
+ { 0x5055, 0x1ff },
+ { 0x6055, 0x1ff },
+ { 0x7055, 0x1ff },
+ { 0x8055, 0x1ff },
+ { 0x9055, 0x1ff },
+ { 0x200c5, 0x19 },
+ { 0x1200c5, 0x7 },
+ { 0x2200c5, 0x7 },
+ { 0x2002e, 0x2 },
+ { 0x12002e, 0x2 },
+ { 0x22002e, 0x2 },
+ { 0x90204, 0x0 },
+ { 0x190204, 0x0 },
+ { 0x290204, 0x0 },
+ { 0x20024, 0x1a3 },
+ { 0x2003a, 0x2 },
+ { 0x120024, 0x1a3 },
+ { 0x2003a, 0x2 },
+ { 0x220024, 0x1a3 },
+ { 0x2003a, 0x2 },
+ { 0x20056, 0x3 },
+ { 0x120056, 0x3 },
+ { 0x220056, 0x3 },
+ { 0x1004d, 0xe00 },
+ { 0x1014d, 0xe00 },
+ { 0x1104d, 0xe00 },
+ { 0x1114d, 0xe00 },
+ { 0x11004d, 0xe00 },
+ { 0x11014d, 0xe00 },
+ { 0x11104d, 0xe00 },
+ { 0x11114d, 0xe00 },
+ { 0x21004d, 0xe00 },
+ { 0x21014d, 0xe00 },
+ { 0x21104d, 0xe00 },
+ { 0x21114d, 0xe00 },
+ { 0x10049, 0xeba },
+ { 0x10149, 0xeba },
+ { 0x11049, 0xeba },
+ { 0x11149, 0xeba },
+ { 0x110049, 0xeba },
+ { 0x110149, 0xeba },
+ { 0x111049, 0xeba },
+ { 0x111149, 0xeba },
+ { 0x210049, 0xeba },
+ { 0x210149, 0xeba },
+ { 0x211049, 0xeba },
+ { 0x211149, 0xeba },
+ { 0x43, 0x63 },
+ { 0x1043, 0x63 },
+ { 0x2043, 0x63 },
+ { 0x3043, 0x63 },
+ { 0x4043, 0x63 },
+ { 0x5043, 0x63 },
+ { 0x6043, 0x63 },
+ { 0x7043, 0x63 },
+ { 0x8043, 0x63 },
+ { 0x9043, 0x63 },
+ { 0x20018, 0x1 },
+ { 0x20075, 0x4 },
+ { 0x20050, 0x0 },
+ { 0x20008, 0x320 },
+ { 0x120008, 0x64 },
+ { 0x220008, 0x19 },
+ { 0x20088, 0x9 },
+ { 0x200b2, 0xdc },
+ { 0x10043, 0x5a1 },
+ { 0x10143, 0x5a1 },
+ { 0x11043, 0x5a1 },
+ { 0x11143, 0x5a1 },
+ { 0x1200b2, 0xdc },
+ { 0x110043, 0x5a1 },
+ { 0x110143, 0x5a1 },
+ { 0x111043, 0x5a1 },
+ { 0x111143, 0x5a1 },
+ { 0x2200b2, 0xdc },
+ { 0x210043, 0x5a1 },
+ { 0x210143, 0x5a1 },
+ { 0x211043, 0x5a1 },
+ { 0x211143, 0x5a1 },
+ { 0x200fa, 0x1 },
+ { 0x1200fa, 0x1 },
+ { 0x2200fa, 0x1 },
+ { 0x20019, 0x1 },
+ { 0x120019, 0x1 },
+ { 0x220019, 0x1 },
+ { 0x200f0, 0x660 },
+ { 0x200f1, 0x0 },
+ { 0x200f2, 0x4444 },
+ { 0x200f3, 0x8888 },
+ { 0x200f4, 0x5665 },
+ { 0x200f5, 0x0 },
+ { 0x200f6, 0x0 },
+ { 0x200f7, 0xf000 },
+ { 0x20025, 0x0 },
+ { 0x2002d, 0x0 },
+ { 0x12002d, 0x0 },
+ { 0x22002d, 0x0 },
+ { 0x2005b, 0x7529 },
+ { 0x2005c, 0x0 },
+ { 0x200c7, 0x21 },
+ { 0x200ca, 0x24 },
+ { 0x200cc, 0x1f7 },
+ { 0x1200c7, 0x21 },
+ { 0x1200ca, 0x24 },
+ { 0x1200cc, 0x1f7 },
+ { 0x2200c7, 0x21 },
+ { 0x2200ca, 0x24 },
+ { 0x2200cc, 0x1f7 },
+ { 0x2007d, 0x212 },
+ { 0x12007d, 0x212 },
+ { 0x22007d, 0x212 },
+ { 0x2007c, 0x61 },
+ { 0x12007c, 0x61 },
+ { 0x22007c, 0x61 },
+ { 0x1004a, 0x500 },
+ { 0x1104a, 0x500 },
+ { 0x2002c, 0x0 },
+};
+
+/* ddr phy trained csr */
+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 */
+struct dram_cfg_param ddr_fsp0_cfg[] = {
+ { 0xd0000, 0x0 },
+ { 0x54003, 0xc80 },
+ { 0x54004, 0x2 },
+ { 0x54005, 0x2228 },
+ { 0x54006, 0x11 },
+ { 0x54008, 0x131f },
+ { 0x54009, 0xc8 },
+ { 0x5400b, 0x2 },
+ { 0x5400f, 0x100 },
+ { 0x54012, 0x310 },
+ { 0x54019, 0x2dd4 },
+ { 0x5401a, 0x31 },
+ { 0x5401b, 0x4d66 },
+ { 0x5401c, 0x4d00 },
+ { 0x5401e, 0x16 },
+ { 0x5401f, 0x2dd4 },
+ { 0x54020, 0x31 },
+ { 0x54021, 0x4d66 },
+ { 0x54022, 0x4d00 },
+ { 0x54024, 0x16 },
+ { 0x54032, 0xd400 },
+ { 0x54033, 0x312d },
+ { 0x54034, 0x6600 },
+ { 0x54035, 0x4d },
+ { 0x54036, 0x4d },
+ { 0x54037, 0x1600 },
+ { 0x54038, 0xd400 },
+ { 0x54039, 0x312d },
+ { 0x5403a, 0x6600 },
+ { 0x5403b, 0x4d },
+ { 0x5403c, 0x4d },
+ { 0x5403d, 0x1600 },
+ { 0xd0000, 0x1 },
+};
+
+/* P1 message block paremeter for training firmware */
+struct dram_cfg_param ddr_fsp1_cfg[] = {
+ { 0xd0000, 0x0 },
+ { 0x54002, 0x101 },
+ { 0x54003, 0x190 },
+ { 0x54004, 0x2 },
+ { 0x54005, 0x2228 },
+ { 0x54006, 0x11 },
+ { 0x54008, 0x121f },
+ { 0x54009, 0xc8 },
+ { 0x5400b, 0x2 },
+ { 0x5400f, 0x100 },
+ { 0x54012, 0x310 },
+ { 0x54019, 0x84 },
+ { 0x5401a, 0x31 },
+ { 0x5401b, 0x4d66 },
+ { 0x5401c, 0x4d00 },
+ { 0x5401e, 0x16 },
+ { 0x5401f, 0x84 },
+ { 0x54020, 0x31 },
+ { 0x54021, 0x4d66 },
+ { 0x54022, 0x4d00 },
+ { 0x54024, 0x16 },
+ { 0x54032, 0x8400 },
+ { 0x54033, 0x3100 },
+ { 0x54034, 0x6600 },
+ { 0x54035, 0x4d },
+ { 0x54036, 0x4d },
+ { 0x54037, 0x1600 },
+ { 0x54038, 0x8400 },
+ { 0x54039, 0x3100 },
+ { 0x5403a, 0x6600 },
+ { 0x5403b, 0x4d },
+ { 0x5403c, 0x4d },
+ { 0x5403d, 0x1600 },
+ { 0xd0000, 0x1 },
+};
+
+/* P2 message block paremeter for training firmware */
+struct dram_cfg_param ddr_fsp2_cfg[] = {
+ { 0xd0000, 0x0 },
+ { 0x54002, 0x102 },
+ { 0x54003, 0x64 },
+ { 0x54004, 0x2 },
+ { 0x54005, 0x2228 },
+ { 0x54006, 0x11 },
+ { 0x54008, 0x121f },
+ { 0x54009, 0xc8 },
+ { 0x5400b, 0x2 },
+ { 0x5400f, 0x100 },
+ { 0x54012, 0x310 },
+ { 0x54019, 0x84 },
+ { 0x5401a, 0x31 },
+ { 0x5401b, 0x4d66 },
+ { 0x5401c, 0x4d00 },
+ { 0x5401e, 0x16 },
+ { 0x5401f, 0x84 },
+ { 0x54020, 0x31 },
+ { 0x54021, 0x4d66 },
+ { 0x54022, 0x4d00 },
+ { 0x54024, 0x16 },
+ { 0x54032, 0x8400 },
+ { 0x54033, 0x3100 },
+ { 0x54034, 0x6600 },
+ { 0x54035, 0x4d },
+ { 0x54036, 0x4d },
+ { 0x54037, 0x1600 },
+ { 0x54038, 0x8400 },
+ { 0x54039, 0x3100 },
+ { 0x5403a, 0x6600 },
+ { 0x5403b, 0x4d },
+ { 0x5403c, 0x4d },
+ { 0x5403d, 0x1600 },
+ { 0xd0000, 0x1 },
+};
+
+/* P0 2D message block paremeter for training firmware */
+struct dram_cfg_param ddr_fsp0_2d_cfg[] = {
+ { 0xd0000, 0x0 },
+ { 0x54003, 0xc80 },
+ { 0x54004, 0x2 },
+ { 0x54005, 0x2228 },
+ { 0x54006, 0x11 },
+ { 0x54008, 0x61 },
+ { 0x54009, 0xc8 },
+ { 0x5400b, 0x2 },
+ { 0x5400d, 0x100 },
+ { 0x5400f, 0x100 },
+ { 0x54010, 0x1f7f },
+ { 0x54012, 0x310 },
+ { 0x54019, 0x2dd4 },
+ { 0x5401a, 0x31 },
+ { 0x5401b, 0x4d66 },
+ { 0x5401c, 0x4d00 },
+ { 0x5401e, 0x16 },
+ { 0x5401f, 0x2dd4 },
+ { 0x54020, 0x31 },
+ { 0x54021, 0x4d66 },
+ { 0x54022, 0x4d00 },
+ { 0x54024, 0x16 },
+ { 0x54032, 0xd400 },
+ { 0x54033, 0x312d },
+ { 0x54034, 0x6600 },
+ { 0x54035, 0x4d },
+ { 0x54036, 0x4d },
+ { 0x54037, 0x1600 },
+ { 0x54038, 0xd400 },
+ { 0x54039, 0x312d },
+ { 0x5403a, 0x6600 },
+ { 0x5403b, 0x4d },
+ { 0x5403c, 0x4d },
+ { 0x5403d, 0x1600 },
+ { 0xd0000, 0x1 },
+};
+
+/* DRAM PHY init engine image */
+struct dram_cfg_param ddr_phy_pie[] = {
+ { 0xd0000, 0x0 },
+ { 0x90000, 0x10 },
+ { 0x90001, 0x400 },
+ { 0x90002, 0x10e },
+ { 0x90003, 0x0 },
+ { 0x90004, 0x0 },
+ { 0x90005, 0x8 },
+ { 0x90029, 0xb },
+ { 0x9002a, 0x480 },
+ { 0x9002b, 0x109 },
+ { 0x9002c, 0x8 },
+ { 0x9002d, 0x448 },
+ { 0x9002e, 0x139 },
+ { 0x9002f, 0x8 },
+ { 0x90030, 0x478 },
+ { 0x90031, 0x109 },
+ { 0x90032, 0x0 },
+ { 0x90033, 0xe8 },
+ { 0x90034, 0x109 },
+ { 0x90035, 0x2 },
+ { 0x90036, 0x10 },
+ { 0x90037, 0x139 },
+ { 0x90038, 0xb },
+ { 0x90039, 0x7c0 },
+ { 0x9003a, 0x139 },
+ { 0x9003b, 0x44 },
+ { 0x9003c, 0x633 },
+ { 0x9003d, 0x159 },
+ { 0x9003e, 0x14f },
+ { 0x9003f, 0x630 },
+ { 0x90040, 0x159 },
+ { 0x90041, 0x47 },
+ { 0x90042, 0x633 },
+ { 0x90043, 0x149 },
+ { 0x90044, 0x4f },
+ { 0x90045, 0x633 },
+ { 0x90046, 0x179 },
+ { 0x90047, 0x8 },
+ { 0x90048, 0xe0 },
+ { 0x90049, 0x109 },
+ { 0x9004a, 0x0 },
+ { 0x9004b, 0x7c8 },
+ { 0x9004c, 0x109 },
+ { 0x9004d, 0x0 },
+ { 0x9004e, 0x1 },
+ { 0x9004f, 0x8 },
+ { 0x90050, 0x0 },
+ { 0x90051, 0x45a },
+ { 0x90052, 0x9 },
+ { 0x90053, 0x0 },
+ { 0x90054, 0x448 },
+ { 0x90055, 0x109 },
+ { 0x90056, 0x40 },
+ { 0x90057, 0x633 },
+ { 0x90058, 0x179 },
+ { 0x90059, 0x1 },
+ { 0x9005a, 0x618 },
+ { 0x9005b, 0x109 },
+ { 0x9005c, 0x40c0 },
+ { 0x9005d, 0x633 },
+ { 0x9005e, 0x149 },
+ { 0x9005f, 0x8 },
+ { 0x90060, 0x4 },
+ { 0x90061, 0x48 },
+ { 0x90062, 0x4040 },
+ { 0x90063, 0x633 },
+ { 0x90064, 0x149 },
+ { 0x90065, 0x0 },
+ { 0x90066, 0x4 },
+ { 0x90067, 0x48 },
+ { 0x90068, 0x40 },
+ { 0x90069, 0x633 },
+ { 0x9006a, 0x149 },
+ { 0x9006b, 0x10 },
+ { 0x9006c, 0x4 },
+ { 0x9006d, 0x18 },
+ { 0x9006e, 0x0 },
+ { 0x9006f, 0x4 },
+ { 0x90070, 0x78 },
+ { 0x90071, 0x549 },
+ { 0x90072, 0x633 },
+ { 0x90073, 0x159 },
+ { 0x90074, 0xd49 },
+ { 0x90075, 0x633 },
+ { 0x90076, 0x159 },
+ { 0x90077, 0x94a },
+ { 0x90078, 0x633 },
+ { 0x90079, 0x159 },
+ { 0x9007a, 0x441 },
+ { 0x9007b, 0x633 },
+ { 0x9007c, 0x149 },
+ { 0x9007d, 0x42 },
+ { 0x9007e, 0x633 },
+ { 0x9007f, 0x149 },
+ { 0x90080, 0x1 },
+ { 0x90081, 0x633 },
+ { 0x90082, 0x149 },
+ { 0x90083, 0x0 },
+ { 0x90084, 0xe0 },
+ { 0x90085, 0x109 },
+ { 0x90086, 0xa },
+ { 0x90087, 0x10 },
+ { 0x90088, 0x109 },
+ { 0x90089, 0x9 },
+ { 0x9008a, 0x3c0 },
+ { 0x9008b, 0x149 },
+ { 0x9008c, 0x9 },
+ { 0x9008d, 0x3c0 },
+ { 0x9008e, 0x159 },
+ { 0x9008f, 0x18 },
+ { 0x90090, 0x10 },
+ { 0x90091, 0x109 },
+ { 0x90092, 0x0 },
+ { 0x90093, 0x3c0 },
+ { 0x90094, 0x109 },
+ { 0x90095, 0x18 },
+ { 0x90096, 0x4 },
+ { 0x90097, 0x48 },
+ { 0x90098, 0x18 },
+ { 0x90099, 0x4 },
+ { 0x9009a, 0x58 },
+ { 0x9009b, 0xb },
+ { 0x9009c, 0x10 },
+ { 0x9009d, 0x109 },
+ { 0x9009e, 0x1 },
+ { 0x9009f, 0x10 },
+ { 0x900a0, 0x109 },
+ { 0x900a1, 0x5 },
+ { 0x900a2, 0x7c0 },
+ { 0x900a3, 0x109 },
+ { 0x40000, 0x811 },
+ { 0x40020, 0x880 },
+ { 0x40040, 0x0 },
+ { 0x40060, 0x0 },
+ { 0x40001, 0x4008 },
+ { 0x40021, 0x83 },
+ { 0x40041, 0x4f },
+ { 0x40061, 0x0 },
+ { 0x40002, 0x4040 },
+ { 0x40022, 0x83 },
+ { 0x40042, 0x51 },
+ { 0x40062, 0x0 },
+ { 0x40003, 0x811 },
+ { 0x40023, 0x880 },
+ { 0x40043, 0x0 },
+ { 0x40063, 0x0 },
+ { 0x40004, 0x720 },
+ { 0x40024, 0xf },
+ { 0x40044, 0x1740 },
+ { 0x40064, 0x0 },
+ { 0x40005, 0x16 },
+ { 0x40025, 0x83 },
+ { 0x40045, 0x4b },
+ { 0x40065, 0x0 },
+ { 0x40006, 0x716 },
+ { 0x40026, 0xf },
+ { 0x40046, 0x2001 },
+ { 0x40066, 0x0 },
+ { 0x40007, 0x716 },
+ { 0x40027, 0xf },
+ { 0x40047, 0x2800 },
+ { 0x40067, 0x0 },
+ { 0x40008, 0x716 },
+ { 0x40028, 0xf },
+ { 0x40048, 0xf00 },
+ { 0x40068, 0x0 },
+ { 0x40009, 0x720 },
+ { 0x40029, 0xf },
+ { 0x40049, 0x1400 },
+ { 0x40069, 0x0 },
+ { 0x4000a, 0xe08 },
+ { 0x4002a, 0xc15 },
+ { 0x4004a, 0x0 },
+ { 0x4006a, 0x0 },
+ { 0x4000b, 0x625 },
+ { 0x4002b, 0x15 },
+ { 0x4004b, 0x0 },
+ { 0x4006b, 0x0 },
+ { 0x4000c, 0x4028 },
+ { 0x4002c, 0x80 },
+ { 0x4004c, 0x0 },
+ { 0x4006c, 0x0 },
+ { 0x4000d, 0xe08 },
+ { 0x4002d, 0xc1a },
+ { 0x4004d, 0x0 },
+ { 0x4006d, 0x0 },
+ { 0x4000e, 0x625 },
+ { 0x4002e, 0x1a },
+ { 0x4004e, 0x0 },
+ { 0x4006e, 0x0 },
+ { 0x4000f, 0x4040 },
+ { 0x4002f, 0x80 },
+ { 0x4004f, 0x0 },
+ { 0x4006f, 0x0 },
+ { 0x40010, 0x2604 },
+ { 0x40030, 0x15 },
+ { 0x40050, 0x0 },
+ { 0x40070, 0x0 },
+ { 0x40011, 0x708 },
+ { 0x40031, 0x5 },
+ { 0x40051, 0x0 },
+ { 0x40071, 0x2002 },
+ { 0x40012, 0x8 },
+ { 0x40032, 0x80 },
+ { 0x40052, 0x0 },
+ { 0x40072, 0x0 },
+ { 0x40013, 0x2604 },
+ { 0x40033, 0x1a },
+ { 0x40053, 0x0 },
+ { 0x40073, 0x0 },
+ { 0x40014, 0x708 },
+ { 0x40034, 0xa },
+ { 0x40054, 0x0 },
+ { 0x40074, 0x2002 },
+ { 0x40015, 0x4040 },
+ { 0x40035, 0x80 },
+ { 0x40055, 0x0 },
+ { 0x40075, 0x0 },
+ { 0x40016, 0x60a },
+ { 0x40036, 0x15 },
+ { 0x40056, 0x1200 },
+ { 0x40076, 0x0 },
+ { 0x40017, 0x61a },
+ { 0x40037, 0x15 },
+ { 0x40057, 0x1300 },
+ { 0x40077, 0x0 },
+ { 0x40018, 0x60a },
+ { 0x40038, 0x1a },
+ { 0x40058, 0x1200 },
+ { 0x40078, 0x0 },
+ { 0x40019, 0x642 },
+ { 0x40039, 0x1a },
+ { 0x40059, 0x1300 },
+ { 0x40079, 0x0 },
+ { 0x4001a, 0x4808 },
+ { 0x4003a, 0x880 },
+ { 0x4005a, 0x0 },
+ { 0x4007a, 0x0 },
+ { 0x900a4, 0x0 },
+ { 0x900a5, 0x790 },
+ { 0x900a6, 0x11a },
+ { 0x900a7, 0x8 },
+ { 0x900a8, 0x7aa },
+ { 0x900a9, 0x2a },
+ { 0x900aa, 0x10 },
+ { 0x900ab, 0x7b2 },
+ { 0x900ac, 0x2a },
+ { 0x900ad, 0x0 },
+ { 0x900ae, 0x7c8 },
+ { 0x900af, 0x109 },
+ { 0x900b0, 0x10 },
+ { 0x900b1, 0x10 },
+ { 0x900b2, 0x109 },
+ { 0x900b3, 0x10 },
+ { 0x900b4, 0x2a8 },
+ { 0x900b5, 0x129 },
+ { 0x900b6, 0x8 },
+ { 0x900b7, 0x370 },
+ { 0x900b8, 0x129 },
+ { 0x900b9, 0xa },
+ { 0x900ba, 0x3c8 },
+ { 0x900bb, 0x1a9 },
+ { 0x900bc, 0xc },
+ { 0x900bd, 0x408 },
+ { 0x900be, 0x199 },
+ { 0x900bf, 0x14 },
+ { 0x900c0, 0x790 },
+ { 0x900c1, 0x11a },
+ { 0x900c2, 0x8 },
+ { 0x900c3, 0x4 },
+ { 0x900c4, 0x18 },
+ { 0x900c5, 0xe },
+ { 0x900c6, 0x408 },
+ { 0x900c7, 0x199 },
+ { 0x900c8, 0x8 },
+ { 0x900c9, 0x8568 },
+ { 0x900ca, 0x108 },
+ { 0x900cb, 0x18 },
+ { 0x900cc, 0x790 },
+ { 0x900cd, 0x16a },
+ { 0x900ce, 0x8 },
+ { 0x900cf, 0x1d8 },
+ { 0x900d0, 0x169 },
+ { 0x900d1, 0x10 },
+ { 0x900d2, 0x8558 },
+ { 0x900d3, 0x168 },
+ { 0x900d4, 0x70 },
+ { 0x900d5, 0x788 },
+ { 0x900d6, 0x16a },
+ { 0x900d7, 0x1ff8 },
+ { 0x900d8, 0x85a8 },
+ { 0x900d9, 0x1e8 },
+ { 0x900da, 0x50 },
+ { 0x900db, 0x798 },
+ { 0x900dc, 0x16a },
+ { 0x900dd, 0x60 },
+ { 0x900de, 0x7a0 },
+ { 0x900df, 0x16a },
+ { 0x900e0, 0x8 },
+ { 0x900e1, 0x8310 },
+ { 0x900e2, 0x168 },
+ { 0x900e3, 0x8 },
+ { 0x900e4, 0xa310 },
+ { 0x900e5, 0x168 },
+ { 0x900e6, 0xa },
+ { 0x900e7, 0x408 },
+ { 0x900e8, 0x169 },
+ { 0x900e9, 0x6e },
+ { 0x900ea, 0x0 },
+ { 0x900eb, 0x68 },
+ { 0x900ec, 0x0 },
+ { 0x900ed, 0x408 },
+ { 0x900ee, 0x169 },
+ { 0x900ef, 0x0 },
+ { 0x900f0, 0x8310 },
+ { 0x900f1, 0x168 },
+ { 0x900f2, 0x0 },
+ { 0x900f3, 0xa310 },
+ { 0x900f4, 0x168 },
+ { 0x900f5, 0x1ff8 },
+ { 0x900f6, 0x85a8 },
+ { 0x900f7, 0x1e8 },
+ { 0x900f8, 0x68 },
+ { 0x900f9, 0x798 },
+ { 0x900fa, 0x16a },
+ { 0x900fb, 0x78 },
+ { 0x900fc, 0x7a0 },
+ { 0x900fd, 0x16a },
+ { 0x900fe, 0x68 },
+ { 0x900ff, 0x790 },
+ { 0x90100, 0x16a },
+ { 0x90101, 0x8 },
+ { 0x90102, 0x8b10 },
+ { 0x90103, 0x168 },
+ { 0x90104, 0x8 },
+ { 0x90105, 0xab10 },
+ { 0x90106, 0x168 },
+ { 0x90107, 0xa },
+ { 0x90108, 0x408 },
+ { 0x90109, 0x169 },
+ { 0x9010a, 0x58 },
+ { 0x9010b, 0x0 },
+ { 0x9010c, 0x68 },
+ { 0x9010d, 0x0 },
+ { 0x9010e, 0x408 },
+ { 0x9010f, 0x169 },
+ { 0x90110, 0x0 },
+ { 0x90111, 0x8b10 },
+ { 0x90112, 0x168 },
+ { 0x90113, 0x0 },
+ { 0x90114, 0xab10 },
+ { 0x90115, 0x168 },
+ { 0x90116, 0x0 },
+ { 0x90117, 0x1d8 },
+ { 0x90118, 0x169 },
+ { 0x90119, 0x80 },
+ { 0x9011a, 0x790 },
+ { 0x9011b, 0x16a },
+ { 0x9011c, 0x18 },
+ { 0x9011d, 0x7aa },
+ { 0x9011e, 0x6a },
+ { 0x9011f, 0xa },
+ { 0x90120, 0x0 },
+ { 0x90121, 0x1e9 },
+ { 0x90122, 0x8 },
+ { 0x90123, 0x8080 },
+ { 0x90124, 0x108 },
+ { 0x90125, 0xf },
+ { 0x90126, 0x408 },
+ { 0x90127, 0x169 },
+ { 0x90128, 0xc },
+ { 0x90129, 0x0 },
+ { 0x9012a, 0x68 },
+ { 0x9012b, 0x9 },
+ { 0x9012c, 0x0 },
+ { 0x9012d, 0x1a9 },
+ { 0x9012e, 0x0 },
+ { 0x9012f, 0x408 },
+ { 0x90130, 0x169 },
+ { 0x90131, 0x0 },
+ { 0x90132, 0x8080 },
+ { 0x90133, 0x108 },
+ { 0x90134, 0x8 },
+ { 0x90135, 0x7aa },
+ { 0x90136, 0x6a },
+ { 0x90137, 0x0 },
+ { 0x90138, 0x8568 },
+ { 0x90139, 0x108 },
+ { 0x9013a, 0xb7 },
+ { 0x9013b, 0x790 },
+ { 0x9013c, 0x16a },
+ { 0x9013d, 0x1f },
+ { 0x9013e, 0x0 },
+ { 0x9013f, 0x68 },
+ { 0x90140, 0x8 },
+ { 0x90141, 0x8558 },
+ { 0x90142, 0x168 },
+ { 0x90143, 0xf },
+ { 0x90144, 0x408 },
+ { 0x90145, 0x169 },
+ { 0x90146, 0xd },
+ { 0x90147, 0x0 },
+ { 0x90148, 0x68 },
+ { 0x90149, 0x0 },
+ { 0x9014a, 0x408 },
+ { 0x9014b, 0x169 },
+ { 0x9014c, 0x0 },
+ { 0x9014d, 0x8558 },
+ { 0x9014e, 0x168 },
+ { 0x9014f, 0x8 },
+ { 0x90150, 0x3c8 },
+ { 0x90151, 0x1a9 },
+ { 0x90152, 0x3 },
+ { 0x90153, 0x370 },
+ { 0x90154, 0x129 },
+ { 0x90155, 0x20 },
+ { 0x90156, 0x2aa },
+ { 0x90157, 0x9 },
+ { 0x90158, 0x0 },
+ { 0x90159, 0x400 },
+ { 0x9015a, 0x10e },
+ { 0x9015b, 0x8 },
+ { 0x9015c, 0xe8 },
+ { 0x9015d, 0x109 },
+ { 0x9015e, 0x0 },
+ { 0x9015f, 0x8140 },
+ { 0x90160, 0x10c },
+ { 0x90161, 0x10 },
+ { 0x90162, 0x8138 },
+ { 0x90163, 0x10c },
+ { 0x90164, 0x8 },
+ { 0x90165, 0x7c8 },
+ { 0x90166, 0x101 },
+ { 0x90167, 0x8 },
+ { 0x90168, 0x448 },
+ { 0x90169, 0x109 },
+ { 0x9016a, 0xf },
+ { 0x9016b, 0x7c0 },
+ { 0x9016c, 0x109 },
+ { 0x9016d, 0x0 },
+ { 0x9016e, 0xe8 },
+ { 0x9016f, 0x109 },
+ { 0x90170, 0x47 },
+ { 0x90171, 0x630 },
+ { 0x90172, 0x109 },
+ { 0x90173, 0x8 },
+ { 0x90174, 0x618 },
+ { 0x90175, 0x109 },
+ { 0x90176, 0x8 },
+ { 0x90177, 0xe0 },
+ { 0x90178, 0x109 },
+ { 0x90179, 0x0 },
+ { 0x9017a, 0x7c8 },
+ { 0x9017b, 0x109 },
+ { 0x9017c, 0x8 },
+ { 0x9017d, 0x8140 },
+ { 0x9017e, 0x10c },
+ { 0x9017f, 0x0 },
+ { 0x90180, 0x1 },
+ { 0x90181, 0x8 },
+ { 0x90182, 0x8 },
+ { 0x90183, 0x4 },
+ { 0x90184, 0x8 },
+ { 0x90185, 0x8 },
+ { 0x90186, 0x7c8 },
+ { 0x90187, 0x101 },
+ { 0x90006, 0x0 },
+ { 0x90007, 0x0 },
+ { 0x90008, 0x8 },
+ { 0x90009, 0x0 },
+ { 0x9000a, 0x0 },
+ { 0x9000b, 0x0 },
+ { 0xd00e7, 0x400 },
+ { 0x90017, 0x0 },
+ { 0x9001f, 0x29 },
+ { 0x90026, 0x6a },
+ { 0x400d0, 0x0 },
+ { 0x400d1, 0x101 },
+ { 0x400d2, 0x105 },
+ { 0x400d3, 0x107 },
+ { 0x400d4, 0x10f },
+ { 0x400d5, 0x202 },
+ { 0x400d6, 0x20a },
+ { 0x400d7, 0x20b },
+ { 0x2003a, 0x2 },
+ { 0x2000b, 0x64 },
+ { 0x2000c, 0xc8 },
+ { 0x2000d, 0x7d0 },
+ { 0x2000e, 0x2c },
+ { 0x12000b, 0xc },
+ { 0x12000c, 0x19 },
+ { 0x12000d, 0xfa },
+ { 0x12000e, 0x10 },
+ { 0x22000b, 0x3 },
+ { 0x22000c, 0x6 },
+ { 0x22000d, 0x3e },
+ { 0x22000e, 0x10 },
+ { 0x9000c, 0x0 },
+ { 0x9000d, 0x173 },
+ { 0x9000e, 0x60 },
+ { 0x9000f, 0x6110 },
+ { 0x90010, 0x2152 },
+ { 0x90011, 0xdfbd },
+ { 0x90012, 0x2060 },
+ { 0x90013, 0x6152 },
+ { 0x20010, 0x5a },
+ { 0x20011, 0x3 },
+ { 0x120010, 0x5a },
+ { 0x120011, 0x3 },
+ { 0x220010, 0x5a },
+ { 0x220011, 0x3 },
+ { 0x40080, 0xe0 },
+ { 0x40081, 0x12 },
+ { 0x40082, 0xe0 },
+ { 0x40083, 0x12 },
+ { 0x40084, 0xe0 },
+ { 0x40085, 0x12 },
+ { 0x140080, 0xe0 },
+ { 0x140081, 0x12 },
+ { 0x140082, 0xe0 },
+ { 0x140083, 0x12 },
+ { 0x140084, 0xe0 },
+ { 0x140085, 0x12 },
+ { 0x240080, 0xe0 },
+ { 0x240081, 0x12 },
+ { 0x240082, 0xe0 },
+ { 0x240083, 0x12 },
+ { 0x240084, 0xe0 },
+ { 0x240085, 0x12 },
+ { 0x400fd, 0xf },
+ { 0x10011, 0x1 },
+ { 0x10012, 0x1 },
+ { 0x10013, 0x180 },
+ { 0x10018, 0x1 },
+ { 0x10002, 0x6209 },
+ { 0x100b2, 0x1 },
+ { 0x101b4, 0x1 },
+ { 0x102b4, 0x1 },
+ { 0x103b4, 0x1 },
+ { 0x104b4, 0x1 },
+ { 0x105b4, 0x1 },
+ { 0x106b4, 0x1 },
+ { 0x107b4, 0x1 },
+ { 0x108b4, 0x1 },
+ { 0x11011, 0x1 },
+ { 0x11012, 0x1 },
+ { 0x11013, 0x180 },
+ { 0x11018, 0x1 },
+ { 0x11002, 0x6209 },
+ { 0x110b2, 0x1 },
+ { 0x111b4, 0x1 },
+ { 0x112b4, 0x1 },
+ { 0x113b4, 0x1 },
+ { 0x114b4, 0x1 },
+ { 0x115b4, 0x1 },
+ { 0x116b4, 0x1 },
+ { 0x117b4, 0x1 },
+ { 0x118b4, 0x1 },
+ { 0x20089, 0x1 },
+ { 0x20088, 0x19 },
+ { 0xc0080, 0x2 },
+ { 0xd0000, 0x1 }
+};
+
+struct dram_fsp_msg ddr_dram_fsp_msg[] = {
+ {
+ /* P0 3200mts 1D */
+ .drate = 3200,
+ .fw_type = FW_1D_IMAGE,
+ .fsp_cfg = ddr_fsp0_cfg,
+ .fsp_cfg_num = ARRAY_SIZE(ddr_fsp0_cfg),
+ },
+ {
+ /* P1 400mts 1D */
+ .drate = 400,
+ .fw_type = FW_1D_IMAGE,
+ .fsp_cfg = ddr_fsp1_cfg,
+ .fsp_cfg_num = ARRAY_SIZE(ddr_fsp1_cfg),
+ },
+ {
+ /* P2 100mts 1D */
+ .drate = 100,
+ .fw_type = FW_1D_IMAGE,
+ .fsp_cfg = ddr_fsp2_cfg,
+ .fsp_cfg_num = ARRAY_SIZE(ddr_fsp2_cfg),
+ },
+ {
+ /* P0 3200mts 2D */
+ .drate = 3200,
+ .fw_type = FW_2D_IMAGE,
+ .fsp_cfg = ddr_fsp0_2d_cfg,
+ .fsp_cfg_num = ARRAY_SIZE(ddr_fsp0_2d_cfg),
+ },
+};
+
+/* ddr timing config params */
+struct dram_timing_info dram_timing = {
+ .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, },
+};
diff --git a/configs/imx8mn_beacon_2g_defconfig b/configs/imx8mn_beacon_2g_defconfig
new file mode 100644
index 0000000000..58b8e49486
--- /dev/null
+++ b/configs/imx8mn_beacon_2g_defconfig
@@ -0,0 +1,133 @@
+CONFIG_ARM=y
+CONFIG_ARCH_IMX8M=y
+CONFIG_SYS_TEXT_BASE=0x40200000
+CONFIG_SPL_GPIO_SUPPORT=y
+CONFIG_SPL_LIBCOMMON_SUPPORT=y
+CONFIG_SPL_LIBGENERIC_SUPPORT=y
+CONFIG_SYS_MALLOC_F_LEN=0x10000
+CONFIG_NR_DRAM_BANKS=1
+CONFIG_SYS_MEMTEST_START=0x40000000
+CONFIG_SYS_MEMTEST_END=0x44000000
+CONFIG_ENV_SIZE=0x2000
+CONFIG_ENV_OFFSET=0xFFFFDE00
+CONFIG_SYS_I2C_MXC_I2C1=y
+CONFIG_SYS_I2C_MXC_I2C2=y
+CONFIG_SYS_I2C_MXC_I2C3=y
+CONFIG_DM_GPIO=y
+CONFIG_SPL_TEXT_BASE=0x912000
+CONFIG_TARGET_IMX8MN_BEACON=y
+CONFIG_IMX8MN_BEACON_2GB_LPDDR=y
+CONFIG_SPL_SERIAL_SUPPORT=y
+CONFIG_SPL_DRIVERS_MISC_SUPPORT=y
+CONFIG_SPL_SYS_MALLOC_F_LEN=0x2000
+CONFIG_SPL=y
+CONFIG_SPL_IMX_ROMAPI_LOADADDR=0x48000000
+CONFIG_DEFAULT_DEVICE_TREE="imx8mn-beacon-kit"
+CONFIG_FIT=y
+CONFIG_FIT_EXTERNAL_OFFSET=0x3000
+CONFIG_SPL_LOAD_FIT=y
+CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-imx/mkimage_fit_atf.sh"
+CONFIG_OF_SYSTEM_SETUP=y
+CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/imx8m/imximage-8mn-lpddr4.cfg"
+CONFIG_DEFAULT_FDT_FILE="imx8mn-beacon-kit.dtb"
+CONFIG_ARCH_MISC_INIT=y
+CONFIG_SPL_BOARD_INIT=y
+CONFIG_SPL_BOOTROM_SUPPORT=y
+CONFIG_SPL_SEPARATE_BSS=y
+CONFIG_SPL_I2C_SUPPORT=y
+CONFIG_SPL_POWER_SUPPORT=y
+CONFIG_HUSH_PARSER=y
+CONFIG_SYS_PROMPT="u-boot=> "
+# CONFIG_BOOTM_NETBSD is not set
+# CONFIG_CMD_EXPORTENV is not set
+# CONFIG_CMD_IMPORTENV is not set
+CONFIG_CMD_ERASEENV=y
+# CONFIG_CMD_CRC32 is not set
+CONFIG_CMD_MEMTEST=y
+CONFIG_CMD_CLK=y
+CONFIG_CMD_FUSE=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_PART=y
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_MII=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_REGULATOR=y
+CONFIG_CMD_EXT2=y
+CONFIG_CMD_EXT4=y
+CONFIG_CMD_EXT4_WRITE=y
+CONFIG_CMD_FAT=y
+CONFIG_OF_CONTROL=y
+CONFIG_SPL_OF_CONTROL=y
+CONFIG_OF_SPL_REMOVE_PROPS="interrupt-parent interrupts"
+CONFIG_ENV_IS_IN_MMC=y
+CONFIG_SYS_RELOC_GD_ENV_ADDR=y
+CONFIG_SYS_MMC_ENV_DEV=2
+CONFIG_SYS_MMC_ENV_PART=2
+CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
+CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_SPL_DM=y
+CONFIG_REGMAP=y
+CONFIG_SYSCON=y
+CONFIG_SPL_CLK_COMPOSITE_CCF=y
+CONFIG_CLK_COMPOSITE_CCF=y
+CONFIG_SPL_CLK_IMX8MN=y
+CONFIG_CLK_IMX8MN=y
+CONFIG_USB_FUNCTION_FASTBOOT=y
+CONFIG_FASTBOOT_BUF_ADDR=0x42800000
+CONFIG_FASTBOOT_BUF_SIZE=0x40000000
+CONFIG_FASTBOOT_FLASH=y
+CONFIG_FASTBOOT_FLASH_MMC_DEV=0
+CONFIG_MXC_GPIO=y
+CONFIG_DM_PCA953X=y
+CONFIG_DM_I2C=y
+CONFIG_SYS_I2C_MXC=y
+CONFIG_DM_MMC=y
+CONFIG_SUPPORT_EMMC_BOOT=y
+CONFIG_MMC_IO_VOLTAGE=y
+CONFIG_MMC_UHS_SUPPORT=y
+CONFIG_MMC_HS400_ES_SUPPORT=y
+CONFIG_MMC_HS400_SUPPORT=y
+CONFIG_FSL_USDHC=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_SF_DEFAULT_MODE=0
+CONFIG_SF_DEFAULT_SPEED=40000000
+CONFIG_SPI_FLASH_BAR=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_PHYLIB=y
+CONFIG_PHY_ATHEROS=y
+CONFIG_DM_ETH=y
+CONFIG_PHY_GIGE=y
+CONFIG_FEC_MXC=y
+CONFIG_MII=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_IMX8M=y
+CONFIG_DM_PMIC=y
+# CONFIG_SPL_PMIC_CHILDREN is not set
+CONFIG_DM_PMIC_BD71837=y
+CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_BD71837=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_DM_REGULATOR_GPIO=y
+CONFIG_DM_RESET=y
+CONFIG_DM_SERIAL=y
+# CONFIG_SPL_DM_SERIAL is not set
+CONFIG_MXC_UART=y
+CONFIG_SPI=y
+CONFIG_DM_SPI=y
+CONFIG_SYSRESET=y
+CONFIG_SYSRESET_PSCI=y
+CONFIG_DM_THERMAL=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+# CONFIG_SPL_DM_USB is not set
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_MANUFACTURER="FSL"
+CONFIG_USB_GADGET_VENDOR_NUM=0x0525
+CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
+CONFIG_CI_UDC=y
+CONFIG_SDP_LOADADDR=0x0
+CONFIG_OF_LIBFDT_OVERLAY=y
diff --git a/include/configs/imx8mn_beacon.h b/include/configs/imx8mn_beacon.h
index 7a247cc560..9ce60fd51b 100644
--- a/include/configs/imx8mn_beacon.h
+++ b/include/configs/imx8mn_beacon.h
@@ -126,7 +126,11 @@
#define CONFIG_SYS_SDRAM_BASE 0x40000000
#define PHYS_SDRAM 0x40000000
+#if CONFIG_IS_ENABLED(IMX8MN_BEACON_2GB_LPDDR)
+#define PHYS_SDRAM_SIZE 0x80000000 /* 2GB DDR */
+#else
#define PHYS_SDRAM_SIZE 0x40000000 /* 1GB DDR */
+#endif
#define CONFIG_MXC_UART_BASE UART2_BASE_ADDR
--
2.17.1
2
1
Add a compatible for i.MX51 so that i.MX51 can use this driver
via driver model.
Signed-off-by: Fabio Estevam <festevam(a)gmail.com>
---
drivers/mmc/fsl_esdhc_imx.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/mmc/fsl_esdhc_imx.c b/drivers/mmc/fsl_esdhc_imx.c
index 8ac859797f04..827a6f113f3b 100644
--- a/drivers/mmc/fsl_esdhc_imx.c
+++ b/drivers/mmc/fsl_esdhc_imx.c
@@ -1705,6 +1705,7 @@ static struct esdhc_soc_data usdhc_imx8qm_data = {
};
static const struct udevice_id fsl_esdhc_ids[] = {
+ { .compatible = "fsl,imx51-esdhc", },
{ .compatible = "fsl,imx53-esdhc", },
{ .compatible = "fsl,imx6ul-usdhc", },
{ .compatible = "fsl,imx6sx-usdhc", },
--
2.25.1
4
9

[PATCH 1/2] ARM: imx6: mx6sabre-common: Replace fatload with FS_GENERIC load
by Marek Vasut 01 Mar '21
by Marek Vasut 01 Mar '21
01 Mar '21
Replace filesystem specific fatload command with a filesystem agnostic
load command, so the board can boot from e.g. ext4 too.
Signed-off-by: Marek Vasut <marex(a)denx.de>
Cc: Fabio Estevam <festevam(a)gmail.com>
Cc: Peng Fan <peng.fan(a)nxp.com>
Cc: Stefano Babic <sbabic(a)denx.de>
Cc: Ye Li <ye.li(a)nxp.com>
Cc: uboot-imx <uboot-imx(a)nxp.com>
---
include/configs/mx6sabre_common.h | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/include/configs/mx6sabre_common.h b/include/configs/mx6sabre_common.h
index 93d00a4dc3c..735532955fd 100644
--- a/include/configs/mx6sabre_common.h
+++ b/include/configs/mx6sabre_common.h
@@ -73,11 +73,11 @@
"mmcargs=setenv bootargs console=${console},${baudrate} " \
"root=PARTUUID=${uuid} rootwait rw\0" \
"loadbootscript=" \
- "fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};\0" \
+ "load mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};\0" \
"bootscript=echo Running bootscript from mmc ...; " \
"source\0" \
- "loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}\0" \
- "loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdtfile}\0" \
+ "loadimage=load mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}\0" \
+ "loadfdt=load mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdtfile}\0" \
"mmcboot=echo Booting from mmc ...; " \
"run finduuid; " \
"run mmcargs; " \
--
2.29.2
3
5