* [PATCH 01/10] Platform/NXP: Library to provide helper functions.
2017-11-07 14:42 [PATCH 00/10] edk2-platforms/Platform/NXP Meenakshi Aggarwal
@ 2017-11-07 14:42 ` Meenakshi Aggarwal
2017-11-13 12:06 ` Ard Biesheuvel
2017-11-13 13:14 ` Leif Lindholm
2017-11-07 14:42 ` [PATCH 02/10] Platform/NXP: Add support for system reset library Meenakshi Aggarwal
` (9 subsequent siblings)
10 siblings, 2 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-07 14:42 UTC (permalink / raw)
To: ard.biesheuvel, leif.lindholm, michael.d.kinney, edk2-devel
UtilsLib provide helper functions which will be needed
by NXP SoCs Library and Drivers.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
---
Platform/NXP/Include/Library/Utils.h | 137 ++++++++++++++++++++++++++++++++
Platform/NXP/Library/UtilsLib/Utils.c | 97 ++++++++++++++++++++++
Platform/NXP/Library/UtilsLib/Utils.inf | 30 +++++++
3 files changed, 264 insertions(+)
create mode 100644 Platform/NXP/Include/Library/Utils.h
create mode 100644 Platform/NXP/Library/UtilsLib/Utils.c
create mode 100644 Platform/NXP/Library/UtilsLib/Utils.inf
diff --git a/Platform/NXP/Include/Library/Utils.h b/Platform/NXP/Include/Library/Utils.h
new file mode 100644
index 0000000..8920e4d
--- /dev/null
+++ b/Platform/NXP/Include/Library/Utils.h
@@ -0,0 +1,137 @@
+/** Utils.h
+ Header defining the General Purpose Utilities
+
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __UTILS_H__
+#define __UTILS_H__
+
+/*
+ * Divide positive or negative dividend by positive divisor and round
+ * to closest UINTNeger. Result is undefined for negative divisors and
+ * for negative dividends if the divisor variable type is unsigned.
+ */
+#define DIV_ROUND_CLOSEST(X, Divisor)( \
+{ \
+ typeof(X) __X = X; \
+ typeof(Divisor) __D = Divisor; \
+ (((typeof(X))-1) > 0 || \
+ ((typeof(Divisor))-1) > 0 || (__X) > 0) ? \
+ (((__X) + ((__D) / 2)) / (__D)) : \
+ (((__X) - ((__D) / 2)) / (__D)); \
+} \
+)
+
+/*
+ * HammingWeight32: returns the hamming weight (i.e. the number
+ * of bits set) of a 32-bit word
+ */
+STATIC
+inline
+UINTN
+HammingWeight32 (
+ IN UINTN W
+ )
+{
+ UINTN Res;
+
+ Res = (W & 0x55555555) + ((W >> 1) & 0x55555555);
+ Res = (Res & 0x33333333) + ((Res >> 2) & 0x33333333);
+ Res = (Res & 0x0F0F0F0F) + ((Res >> 4) & 0x0F0F0F0F);
+ Res = (Res & 0x00FF00FF) + ((Res >> 8) & 0x00FF00FF);
+
+ return (Res & 0x0000FFFF) + ((Res >> 16) & 0x0000FFFF);
+}
+
+STATIC
+inline
+UINTN
+CpuMaskNext (
+ IN UINTN Cpu,
+ IN UINTN Mask
+ )
+{
+ for (Cpu++; !((1 << Cpu) & Mask); Cpu++)
+ ;
+
+ return Cpu;
+}
+
+#define ForEachCpu(Iter, Cpu, NumCpus, Mask) \
+ for (Iter = 0, Cpu = CpuMaskNext(-1, Mask); \
+ Iter < NumCpus; \
+ Iter++, Cpu = CpuMaskNext(Cpu, Mask)) \
+
+/**
+ Find last (most-significant) bit set
+
+ @param X : the word to search
+
+ Note Fls(0) = 0, Fls(1) = 1, Fls(0x80000000) = 32.
+
+**/
+STATIC
+inline
+INT32
+GenericFls (
+ IN INT32 X
+ )
+{
+ INT32 R = 32;
+
+ if (!X)
+ return 0;
+
+ if (!(X & 0xffff0000u)) {
+ X <<= 16;
+ R -= 16;
+ }
+ if (!(X & 0xff000000u)) {
+ X <<= 8;
+ R -= 8;
+ }
+ if (!(X & 0xf0000000u)) {
+ X <<= 4;
+ R -= 4;
+ }
+ if (!(X & 0xc0000000u)) {
+ X <<= 2;
+ R -= 2;
+ }
+ if (!(X & 0x80000000u)) {
+ X <<= 1;
+ R -= 1;
+ }
+
+ return R;
+}
+
+/*
+ * PrINT32 Sizes As "Xxx KiB", "Xxx.Y KiB", "Xxx MiB", "Xxx.Y MiB",
+ * Xxx GiB, Xxx.Y GiB, Etc As Needed; Allow for Optional Trailing String
+ * (Like "\n")
+ */
+VOID
+PrintSize (
+ IN UINT64 Size,
+ IN CONST INT8 *S
+ );
+
+/* Function to convert a frequency to MHz */
+CHAR8 *StringToMHz (
+ CHAR8 *Buf,
+ UINT32 Size,
+ UINT64 Hz
+ );
+
+#endif
diff --git a/Platform/NXP/Library/UtilsLib/Utils.c b/Platform/NXP/Library/UtilsLib/Utils.c
new file mode 100644
index 0000000..4f5a15c
--- /dev/null
+++ b/Platform/NXP/Library/UtilsLib/Utils.c
@@ -0,0 +1,97 @@
+/** Utils.c
+
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Library/DebugLib.h>
+#include <Library/PrintLib.h>
+#include <Library/Utils.h>
+
+/* Function to convert a frequency to MHz */
+CHAR8 *
+StringToMHz (
+ IN CHAR8 *Buf,
+ IN UINT32 Size,
+ IN UINT64 Hz
+ )
+{
+ UINT64 L;
+ UINT64 M;
+ UINT64 N;
+
+ N = DIV_ROUND_CLOSEST(Hz, 1000) / 1000L;
+ L = AsciiSPrint (Buf, Size, "%ld", N);
+
+ Hz -= N * 1000000L;
+ M = DIV_ROUND_CLOSEST(Hz, 1000L);
+
+ if (M != 0) {
+ AsciiSPrint (Buf + L, Size, ".%03ld", M);
+ }
+
+ return (Buf);
+}
+
+/*
+ * PrINT32 Sizes As "Xxx KiB", "Xxx.Y KiB", "Xxx MiB", "Xxx.Y MiB",
+ * Xxx GiB, Xxx.Y GiB, Etc As Needed; Allow for Optional Trailing String
+ * (Like "\n")
+ */
+VOID
+PrintSize (
+ IN UINT64 Size,
+ IN CONST INT8 *S
+ )
+{
+ UINT64 M;
+ UINT64 N;
+ UINT64 F;
+ UINT64 D;
+ CHAR8 C;
+ UINT32 I;
+ INT8 Names[6] = {'E', 'P', 'T', 'G', 'M', 'K'};
+
+ M = 0;
+ D = 10 * ARRAY_SIZE(Names);
+ C = 0;
+
+ for (I = 0; I < ARRAY_SIZE(Names); I++, D -= 10) {
+ if (Size >> D) {
+ C = Names[I];
+ break;
+ }
+ }
+
+ if (!C) {
+ DEBUG((DEBUG_ERROR, "%Ld Bytes,\n %a", Size, S));
+ return;
+ }
+
+ N = Size >> D;
+ F = Size & ((1ULL << D) - 1);
+
+ /* if There'S A Remainder, Deal With It */
+ if (F) {
+ M = (10ULL * F + (1ULL << (D - 1))) >> D;
+
+ if (M >= 10) {
+ M -= 10;
+ N += 1;
+ }
+ }
+
+ DEBUG((DEBUG_ERROR, "%Ld", N));
+ if (M) {
+ DEBUG((DEBUG_ERROR, ".%Ld", M));
+ }
+ DEBUG((DEBUG_ERROR, " %ciB, %a ", C, S));
+}
diff --git a/Platform/NXP/Library/UtilsLib/Utils.inf b/Platform/NXP/Library/UtilsLib/Utils.inf
new file mode 100644
index 0000000..9901445
--- /dev/null
+++ b/Platform/NXP/Library/UtilsLib/Utils.inf
@@ -0,0 +1,30 @@
+# @Utils.inf
+
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = UtilsLib
+ FILE_GUID = 0985d4e8-5a41-40cf-ad12-2ad5d35e817f
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = UtilsLib
+
+[Packages]
+ MdePkg/MdePkg.dec
+ edk2-platforms/Platform/NXP/NxpQoriqLs.dec
+
+[LibraryClasses]
+ PrintLib
+
+[Sources.common]
+ Utils.c
--
1.9.1
^ permalink raw reply related [flat|nested] 39+ messages in thread
* Re: [PATCH 01/10] Platform/NXP: Library to provide helper functions.
2017-11-07 14:42 ` [PATCH 01/10] Platform/NXP: Library to provide helper functions Meenakshi Aggarwal
@ 2017-11-13 12:06 ` Ard Biesheuvel
2017-11-14 5:15 ` Meenakshi Aggarwal
2017-11-13 13:14 ` Leif Lindholm
1 sibling, 1 reply; 39+ messages in thread
From: Ard Biesheuvel @ 2017-11-13 12:06 UTC (permalink / raw)
To: Meenakshi Aggarwal
Cc: Leif Lindholm, Kinney, Michael D, edk2-devel@lists.01.org,
Udit Kumar, Varun Sethi
On 7 November 2017 at 14:42, Meenakshi Aggarwal
<meenakshi.aggarwal@nxp.com> wrote:
> UtilsLib provide helper functions which will be needed
> by NXP SoCs Library and Drivers.
>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> ---
> Platform/NXP/Include/Library/Utils.h | 137 ++++++++++++++++++++++++++++++++
> Platform/NXP/Library/UtilsLib/Utils.c | 97 ++++++++++++++++++++++
> Platform/NXP/Library/UtilsLib/Utils.inf | 30 +++++++
> 3 files changed, 264 insertions(+)
> create mode 100644 Platform/NXP/Include/Library/Utils.h
> create mode 100644 Platform/NXP/Library/UtilsLib/Utils.c
> create mode 100644 Platform/NXP/Library/UtilsLib/Utils.inf
>
> diff --git a/Platform/NXP/Include/Library/Utils.h b/Platform/NXP/Include/Library/Utils.h
> new file mode 100644
> index 0000000..8920e4d
> --- /dev/null
> +++ b/Platform/NXP/Include/Library/Utils.h
> @@ -0,0 +1,137 @@
> +/** Utils.h
> + Header defining the General Purpose Utilities
> +
> + Copyright 2017 NXP
> +
> + This program and the accompanying materials
> + are licensed and made available under the terms and conditions of the BSD License
> + which accompanies this distribution. The full text of the license may be found at
> + http://opensource.org/licenses/bsd-license.php
> +
> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#ifndef __UTILS_H__
> +#define __UTILS_H__
> +
> +/*
> + * Divide positive or negative dividend by positive divisor and round
> + * to closest UINTNeger. Result is undefined for negative divisors and
Search/replace error
> + * for negative dividends if the divisor variable type is unsigned.
> + */
> +#define DIV_ROUND_CLOSEST(X, Divisor)( \
> +{ \
> + typeof(X) __X = X; \
> + typeof(Divisor) __D = Divisor; \
> + (((typeof(X))-1) > 0 || \
> + ((typeof(Divisor))-1) > 0 || (__X) > 0) ? \
> + (((__X) + ((__D) / 2)) / (__D)) : \
> + (((__X) - ((__D) / 2)) / (__D)); \
> +} \
> +)
> +
Which patch uses this function?
> +/*
> + * HammingWeight32: returns the hamming weight (i.e. the number
> + * of bits set) of a 32-bit word
> + */
> +STATIC
> +inline
> +UINTN
> +HammingWeight32 (
> + IN UINTN W
> + )
> +{
> + UINTN Res;
> +
> + Res = (W & 0x55555555) + ((W >> 1) & 0x55555555);
> + Res = (Res & 0x33333333) + ((Res >> 2) & 0x33333333);
> + Res = (Res & 0x0F0F0F0F) + ((Res >> 4) & 0x0F0F0F0F);
> + Res = (Res & 0x00FF00FF) + ((Res >> 8) & 0x00FF00FF);
> +
> + return (Res & 0x0000FFFF) + ((Res >> 16) & 0x0000FFFF);
> +}
> +
Please move this into the patch that uses it.
> +STATIC
> +inline
> +UINTN
> +CpuMaskNext (
> + IN UINTN Cpu,
> + IN UINTN Mask
> + )
> +{
> + for (Cpu++; !((1 << Cpu) & Mask); Cpu++)
> + ;
> +
> + return Cpu;
> +}
> +
> +#define ForEachCpu(Iter, Cpu, NumCpus, Mask) \
> + for (Iter = 0, Cpu = CpuMaskNext(-1, Mask); \
> + Iter < NumCpus; \
> + Iter++, Cpu = CpuMaskNext(Cpu, Mask)) \
> +
Same here
> +/**
> + Find last (most-significant) bit set
> +
> + @param X : the word to search
> +
> + Note Fls(0) = 0, Fls(1) = 1, Fls(0x80000000) = 32.
> +
> +**/
> +STATIC
> +inline
> +INT32
> +GenericFls (
> + IN INT32 X
> + )
> +{
> + INT32 R = 32;
> +
> + if (!X)
> + return 0;
> +
> + if (!(X & 0xffff0000u)) {
> + X <<= 16;
> + R -= 16;
> + }
> + if (!(X & 0xff000000u)) {
> + X <<= 8;
> + R -= 8;
> + }
> + if (!(X & 0xf0000000u)) {
> + X <<= 4;
> + R -= 4;
> + }
> + if (!(X & 0xc0000000u)) {
> + X <<= 2;
> + R -= 2;
> + }
> + if (!(X & 0x80000000u)) {
> + X <<= 1;
> + R -= 1;
> + }
> +
> + return R;
> +}
> +
Which patch uses this function?
> +/*
> + * PrINT32 Sizes As "Xxx KiB", "Xxx.Y KiB", "Xxx MiB", "Xxx.Y MiB",
Search/replace error.
> + * Xxx GiB, Xxx.Y GiB, Etc As Needed; Allow for Optional Trailing String
> + * (Like "\n")
> + */
> +VOID
> +PrintSize (
> + IN UINT64 Size,
> + IN CONST INT8 *S
> + );
> +
> +/* Function to convert a frequency to MHz */
> +CHAR8 *StringToMHz (
> + CHAR8 *Buf,
> + UINT32 Size,
> + UINT64 Hz
> + );
> +
Please move these into the patch that uses them.
> +#endif
> diff --git a/Platform/NXP/Library/UtilsLib/Utils.c b/Platform/NXP/Library/UtilsLib/Utils.c
> new file mode 100644
> index 0000000..4f5a15c
> --- /dev/null
> +++ b/Platform/NXP/Library/UtilsLib/Utils.c
> @@ -0,0 +1,97 @@
> +/** Utils.c
> +
> + Copyright 2017 NXP
> +
> + This program and the accompanying materials
> + are licensed and made available under the terms and conditions of the BSD License
> + which accompanies this distribution. The full text of the license may be found at
> + http://opensource.org/licenses/bsd-license.php
> +
> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#include <Library/DebugLib.h>
> +#include <Library/PrintLib.h>
> +#include <Library/Utils.h>
> +
> +/* Function to convert a frequency to MHz */
> +CHAR8 *
> +StringToMHz (
> + IN CHAR8 *Buf,
> + IN UINT32 Size,
> + IN UINT64 Hz
> + )
> +{
> + UINT64 L;
> + UINT64 M;
> + UINT64 N;
> +
> + N = DIV_ROUND_CLOSEST(Hz, 1000) / 1000L;
> + L = AsciiSPrint (Buf, Size, "%ld", N);
> +
> + Hz -= N * 1000000L;
> + M = DIV_ROUND_CLOSEST(Hz, 1000L);
> +
> + if (M != 0) {
> + AsciiSPrint (Buf + L, Size, ".%03ld", M);
> + }
> +
> + return (Buf);
> +}
> +
> +/*
> + * PrINT32 Sizes As "Xxx KiB", "Xxx.Y KiB", "Xxx MiB", "Xxx.Y MiB",
> + * Xxx GiB, Xxx.Y GiB, Etc As Needed; Allow for Optional Trailing String
> + * (Like "\n")
> + */
> +VOID
> +PrintSize (
> + IN UINT64 Size,
> + IN CONST INT8 *S
> + )
> +{
> + UINT64 M;
> + UINT64 N;
> + UINT64 F;
> + UINT64 D;
> + CHAR8 C;
> + UINT32 I;
> + INT8 Names[6] = {'E', 'P', 'T', 'G', 'M', 'K'};
> +
> + M = 0;
> + D = 10 * ARRAY_SIZE(Names);
> + C = 0;
> +
> + for (I = 0; I < ARRAY_SIZE(Names); I++, D -= 10) {
> + if (Size >> D) {
> + C = Names[I];
> + break;
> + }
> + }
> +
> + if (!C) {
> + DEBUG((DEBUG_ERROR, "%Ld Bytes,\n %a", Size, S));
> + return;
> + }
> +
> + N = Size >> D;
> + F = Size & ((1ULL << D) - 1);
> +
> + /* if There'S A Remainder, Deal With It */
> + if (F) {
> + M = (10ULL * F + (1ULL << (D - 1))) >> D;
> +
> + if (M >= 10) {
> + M -= 10;
> + N += 1;
> + }
> + }
> +
> + DEBUG((DEBUG_ERROR, "%Ld", N));
> + if (M) {
> + DEBUG((DEBUG_ERROR, ".%Ld", M));
> + }
> + DEBUG((DEBUG_ERROR, " %ciB, %a ", C, S));
> +}
Why DEBUG_ERROR ? Don't use that for DEBUG code, and in general,
adding DEBUG () to a library should be done with care. (It may break
DXE_RUNTIME_DRIVER modules called by the OS)
> diff --git a/Platform/NXP/Library/UtilsLib/Utils.inf b/Platform/NXP/Library/UtilsLib/Utils.inf
> new file mode 100644
> index 0000000..9901445
> --- /dev/null
> +++ b/Platform/NXP/Library/UtilsLib/Utils.inf
> @@ -0,0 +1,30 @@
> +# @Utils.inf
> +
> +# Copyright 2017 NXP
> +#
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD License
> +# which accompanies this distribution. The full text of the license may be found at
> +# http://opensource.org/licenses/bsd-license.php
> +#
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +#
> +
> +[Defines]
> + INF_VERSION = 0x00010005
Should be 0x0001001A
> + BASE_NAME = UtilsLib
> + FILE_GUID = 0985d4e8-5a41-40cf-ad12-2ad5d35e817f
> + MODULE_TYPE = BASE
> + VERSION_STRING = 1.0
> + LIBRARY_CLASS = UtilsLib
> +
> +[Packages]
> + MdePkg/MdePkg.dec
> + edk2-platforms/Platform/NXP/NxpQoriqLs.dec
Please drop the edk2-platforms prefix, and add it to your PACKAGES_PATH
> +
> +[LibraryClasses]
> + PrintLib
> +
> +[Sources.common]
> + Utils.c
> --
> 1.9.1
>
^ permalink raw reply [flat|nested] 39+ messages in thread
* Re: [PATCH 01/10] Platform/NXP: Library to provide helper functions.
2017-11-13 12:06 ` Ard Biesheuvel
@ 2017-11-14 5:15 ` Meenakshi Aggarwal
0 siblings, 0 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-14 5:15 UTC (permalink / raw)
To: Ard Biesheuvel
Cc: Leif Lindholm, Kinney, Michael D, edk2-devel@lists.01.org,
Udit Kumar, Varun Sethi
> -----Original Message-----
> From: Ard Biesheuvel [mailto:ard.biesheuvel@linaro.org]
> Sent: Monday, November 13, 2017 5:36 PM
> To: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> Cc: Leif Lindholm <leif.lindholm@linaro.org>; Kinney, Michael D
> <michael.d.kinney@intel.com>; edk2-devel@lists.01.org; Udit Kumar
> <udit.kumar@nxp.com>; Varun Sethi <V.Sethi@nxp.com>
> Subject: Re: [PATCH 01/10] Platform/NXP: Library to provide helper
> functions.
>
> On 7 November 2017 at 14:42, Meenakshi Aggarwal
> <meenakshi.aggarwal@nxp.com> wrote:
> > UtilsLib provide helper functions which will be needed by NXP SoCs
> > Library and Drivers.
> >
> > Contributed-under: TianoCore Contribution Agreement 1.1
> > Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> > ---
> > Platform/NXP/Include/Library/Utils.h | 137
> ++++++++++++++++++++++++++++++++
> > Platform/NXP/Library/UtilsLib/Utils.c | 97 ++++++++++++++++++++++
> > Platform/NXP/Library/UtilsLib/Utils.inf | 30 +++++++
> > 3 files changed, 264 insertions(+)
> > create mode 100644 Platform/NXP/Include/Library/Utils.h
> > create mode 100644 Platform/NXP/Library/UtilsLib/Utils.c
> > create mode 100644 Platform/NXP/Library/UtilsLib/Utils.inf
> >
> > diff --git a/Platform/NXP/Include/Library/Utils.h
> > b/Platform/NXP/Include/Library/Utils.h
> > new file mode 100644
> > index 0000000..8920e4d
> > --- /dev/null
> > +++ b/Platform/NXP/Include/Library/Utils.h
> > @@ -0,0 +1,137 @@
> > +/** Utils.h
> > + Header defining the General Purpose Utilities
> > +
> > + Copyright 2017 NXP
> > +
> > + This program and the accompanying materials are licensed and made
> > + available under the terms and conditions of the BSD License which
> > + accompanies this distribution. The full text of the license may be
> > + found at
> > +
> > +
> https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> > + ensource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.a
> > +
> ggarwal%40nxp.com%7C1545c29d59ad4644c38b08d52a8eee10%7C686ea1d3
> bc2b4
> > +
> c6fa92cd99c5c301635%7C0%7C0%7C636461715737869891&sdata=bpbipNI3z%
> 2Fm
> > + tF2NTn%2BLELYBfv1C38FPfM14aph2%2BRKA%3D&reserved=0
> > +
> > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > + BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +
> > +**/
> > +
> > +#ifndef __UTILS_H__
> > +#define __UTILS_H__
> > +
> > +/*
> > + * Divide positive or negative dividend by positive divisor and round
> > + * to closest UINTNeger. Result is undefined for negative divisors
> > +and
>
> Search/replace error
>
OK, will do this
> > + * for negative dividends if the divisor variable type is unsigned.
> > + */
> > +#define DIV_ROUND_CLOSEST(X, Divisor)( \
> > +{ \
> > + typeof(X) __X = X; \
> > + typeof(Divisor) __D = Divisor; \
> > + (((typeof(X))-1) > 0 || \
> > + ((typeof(Divisor))-1) > 0 || (__X) > 0) ? \
> > + (((__X) + ((__D) / 2)) / (__D)) : \
> > + (((__X) - ((__D) / 2)) / (__D)); \
> > +} \
> > +)
> > +
>
> Which patch uses this function?
>
This function is used by StringToMHz() function, which is used by SocLib.
> > +/*
> > + * HammingWeight32: returns the hamming weight (i.e. the number
> > + * of bits set) of a 32-bit word
> > + */
> > +STATIC
> > +inline
> > +UINTN
> > +HammingWeight32 (
> > + IN UINTN W
> > + )
> > +{
> > + UINTN Res;
> > +
> > + Res = (W & 0x55555555) + ((W >> 1) & 0x55555555); Res = (Res &
> > + 0x33333333) + ((Res >> 2) & 0x33333333); Res = (Res & 0x0F0F0F0F) +
> > + ((Res >> 4) & 0x0F0F0F0F); Res = (Res & 0x00FF00FF) + ((Res >> 8) &
> > + 0x00FF00FF);
> > +
> > + return (Res & 0x0000FFFF) + ((Res >> 16) & 0x0000FFFF); }
> > +
>
> Please move this into the patch that uses it.
>
OK
> > +STATIC
> > +inline
> > +UINTN
> > +CpuMaskNext (
> > + IN UINTN Cpu,
> > + IN UINTN Mask
> > + )
> > +{
> > + for (Cpu++; !((1 << Cpu) & Mask); Cpu++)
> > + ;
> > +
> > + return Cpu;
> > +}
> > +
> > +#define ForEachCpu(Iter, Cpu, NumCpus, Mask) \
> > + for (Iter = 0, Cpu = CpuMaskNext(-1, Mask); \
> > + Iter < NumCpus; \
> > + Iter++, Cpu = CpuMaskNext(Cpu, Mask)) \
> > +
>
> Same here
>
> > +/**
> > + Find last (most-significant) bit set
> > +
> > + @param X : the word to search
> > +
> > + Note Fls(0) = 0, Fls(1) = 1, Fls(0x80000000) = 32.
> > +
> > +**/
> > +STATIC
> > +inline
> > +INT32
> > +GenericFls (
> > + IN INT32 X
> > + )
> > +{
> > + INT32 R = 32;
> > +
> > + if (!X)
> > + return 0;
> > +
> > + if (!(X & 0xffff0000u)) {
> > + X <<= 16;
> > + R -= 16;
> > + }
> > + if (!(X & 0xff000000u)) {
> > + X <<= 8;
> > + R -= 8;
> > + }
> > + if (!(X & 0xf0000000u)) {
> > + X <<= 4;
> > + R -= 4;
> > + }
> > + if (!(X & 0xc0000000u)) {
> > + X <<= 2;
> > + R -= 2;
> > + }
> > + if (!(X & 0x80000000u)) {
> > + X <<= 1;
> > + R -= 1;
> > + }
> > +
> > + return R;
> > +}
> > +
>
> Which patch uses this function?
>
This function will be used by our next set of patches.
I will add this in the next set of patch which are using this function and remove from here.
> > +/*
> > + * PrINT32 Sizes As "Xxx KiB", "Xxx.Y KiB", "Xxx MiB", "Xxx.Y MiB",
>
> Search/replace error.
>
> > + * Xxx GiB, Xxx.Y GiB, Etc As Needed; Allow for Optional Trailing
> > +String
> > + * (Like "\n")
> > + */
> > +VOID
> > +PrintSize (
> > + IN UINT64 Size,
> > + IN CONST INT8 *S
> > + );
> > +
> > +/* Function to convert a frequency to MHz */
> > +CHAR8 *StringToMHz (
> > + CHAR8 *Buf,
> > + UINT32 Size,
> > + UINT64 Hz
> > + );
> > +
>
> Please move these into the patch that uses them.
>
OK
> > +#endif
> > diff --git a/Platform/NXP/Library/UtilsLib/Utils.c
> > b/Platform/NXP/Library/UtilsLib/Utils.c
> > new file mode 100644
> > index 0000000..4f5a15c
> > --- /dev/null
> > +++ b/Platform/NXP/Library/UtilsLib/Utils.c
> > @@ -0,0 +1,97 @@
> > +/** Utils.c
> > +
> > + Copyright 2017 NXP
> > +
> > + This program and the accompanying materials are licensed and made
> > + available under the terms and conditions of the BSD License which
> > + accompanies this distribution. The full text of the license may be
> > + found at
> > +
> > +
> https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> > + ensource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.a
> > +
> ggarwal%40nxp.com%7C1545c29d59ad4644c38b08d52a8eee10%7C686ea1d3
> bc2b4
> > +
> c6fa92cd99c5c301635%7C0%7C0%7C636461715737869891&sdata=bpbipNI3z%
> 2Fm
> > + tF2NTn%2BLELYBfv1C38FPfM14aph2%2BRKA%3D&reserved=0
> > +
> > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > + BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +
> > +**/
> > +
> > +#include <Library/DebugLib.h>
> > +#include <Library/PrintLib.h>
> > +#include <Library/Utils.h>
> > +
> > +/* Function to convert a frequency to MHz */
> > +CHAR8 *
> > +StringToMHz (
> > + IN CHAR8 *Buf,
> > + IN UINT32 Size,
> > + IN UINT64 Hz
> > + )
> > +{
> > + UINT64 L;
> > + UINT64 M;
> > + UINT64 N;
> > +
> > + N = DIV_ROUND_CLOSEST(Hz, 1000) / 1000L; L = AsciiSPrint (Buf,
> > + Size, "%ld", N);
> > +
> > + Hz -= N * 1000000L;
> > + M = DIV_ROUND_CLOSEST(Hz, 1000L);
> > +
> > + if (M != 0) {
> > + AsciiSPrint (Buf + L, Size, ".%03ld", M); }
> > +
> > + return (Buf);
> > +}
> > +
> > +/*
> > + * PrINT32 Sizes As "Xxx KiB", "Xxx.Y KiB", "Xxx MiB", "Xxx.Y MiB",
> > + * Xxx GiB, Xxx.Y GiB, Etc As Needed; Allow for Optional Trailing
> > +String
> > + * (Like "\n")
> > + */
> > +VOID
> > +PrintSize (
> > + IN UINT64 Size,
> > + IN CONST INT8 *S
> > + )
> > +{
> > + UINT64 M;
> > + UINT64 N;
> > + UINT64 F;
> > + UINT64 D;
> > + CHAR8 C;
> > + UINT32 I;
> > + INT8 Names[6] = {'E', 'P', 'T', 'G', 'M', 'K'};
> > +
> > + M = 0;
> > + D = 10 * ARRAY_SIZE(Names);
> > + C = 0;
> > +
> > + for (I = 0; I < ARRAY_SIZE(Names); I++, D -= 10) {
> > + if (Size >> D) {
> > + C = Names[I];
> > + break;
> > + }
> > + }
> > +
> > + if (!C) {
> > + DEBUG((DEBUG_ERROR, "%Ld Bytes,\n %a", Size, S));
> > + return;
> > + }
> > +
> > + N = Size >> D;
> > + F = Size & ((1ULL << D) - 1);
> > +
> > + /* if There'S A Remainder, Deal With It */ if (F) {
> > + M = (10ULL * F + (1ULL << (D - 1))) >> D;
> > +
> > + if (M >= 10) {
> > + M -= 10;
> > + N += 1;
> > + }
> > + }
> > +
> > + DEBUG((DEBUG_ERROR, "%Ld", N));
> > + if (M) {
> > + DEBUG((DEBUG_ERROR, ".%Ld", M));
> > + }
> > + DEBUG((DEBUG_ERROR, " %ciB, %a ", C, S)); }
>
> Why DEBUG_ERROR ? Don't use that for DEBUG code, and in general, adding
> DEBUG () to a library should be done with care. (It may break
> DXE_RUNTIME_DRIVER modules called by the OS)
>
>
We are not using this function in DXE_RUNTIME_DRIVER.
We used DEBUG_ERROR because we need this information in both DEBUG and RELEASE build.
Please suggest alternate way to get this information in RELEASE build as well
> > diff --git a/Platform/NXP/Library/UtilsLib/Utils.inf
> > b/Platform/NXP/Library/UtilsLib/Utils.inf
> > new file mode 100644
> > index 0000000..9901445
> > --- /dev/null
> > +++ b/Platform/NXP/Library/UtilsLib/Utils.inf
> > @@ -0,0 +1,30 @@
> > +# @Utils.inf
> > +
> > +# Copyright 2017 NXP
> > +#
> > +# This program and the accompanying materials # are licensed and
> > +made available under the terms and conditions of the BSD License #
> > +which accompanies this distribution. The full text of the license
> > +may be found at #
> >
> +https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> e
> > +nsource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.agg
> >
> +arwal%40nxp.com%7C1545c29d59ad4644c38b08d52a8eee10%7C686ea1d3b
> c2b4c6f
> >
> +a92cd99c5c301635%7C0%7C0%7C636461715737869891&sdata=bpbipNI3z%2
> FmtF2N
> > +Tn%2BLELYBfv1C38FPfM14aph2%2BRKA%3D&reserved=0
> > +#
> > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > +BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +#
> > +
> > +[Defines]
> > + INF_VERSION = 0x00010005
>
> Should be 0x0001001A
OK
>
> > + BASE_NAME = UtilsLib
> > + FILE_GUID = 0985d4e8-5a41-40cf-ad12-2ad5d35e817f
> > + MODULE_TYPE = BASE
> > + VERSION_STRING = 1.0
> > + LIBRARY_CLASS = UtilsLib
> > +
> > +[Packages]
> > + MdePkg/MdePkg.dec
> > + edk2-platforms/Platform/NXP/NxpQoriqLs.dec
>
> Please drop the edk2-platforms prefix, and add it to your PACKAGES_PATH
>
OK, we will look into this.
> > +
> > +[LibraryClasses]
> > + PrintLib
> > +
> > +[Sources.common]
> > + Utils.c
> > --
> > 1.9.1
> >
^ permalink raw reply [flat|nested] 39+ messages in thread
* Re: [PATCH 01/10] Platform/NXP: Library to provide helper functions.
2017-11-07 14:42 ` [PATCH 01/10] Platform/NXP: Library to provide helper functions Meenakshi Aggarwal
2017-11-13 12:06 ` Ard Biesheuvel
@ 2017-11-13 13:14 ` Leif Lindholm
2017-11-14 5:52 ` Meenakshi Aggarwal
1 sibling, 1 reply; 39+ messages in thread
From: Leif Lindholm @ 2017-11-13 13:14 UTC (permalink / raw)
To: Meenakshi Aggarwal
Cc: ard.biesheuvel, michael.d.kinney, edk2-devel, udit.kumar, v.sethi
On Tue, Nov 07, 2017 at 08:12:07PM +0530, Meenakshi Aggarwal wrote:
> UtilsLib provide helper functions which will be needed
> by NXP SoCs Library and Drivers.
>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> ---
> Platform/NXP/Include/Library/Utils.h | 137 ++++++++++++++++++++++++++++++++
> Platform/NXP/Library/UtilsLib/Utils.c | 97 ++++++++++++++++++++++
> Platform/NXP/Library/UtilsLib/Utils.inf | 30 +++++++
> 3 files changed, 264 insertions(+)
> create mode 100644 Platform/NXP/Include/Library/Utils.h
> create mode 100644 Platform/NXP/Library/UtilsLib/Utils.c
> create mode 100644 Platform/NXP/Library/UtilsLib/Utils.inf
>
> diff --git a/Platform/NXP/Include/Library/Utils.h b/Platform/NXP/Include/Library/Utils.h
> new file mode 100644
> index 0000000..8920e4d
> --- /dev/null
> +++ b/Platform/NXP/Include/Library/Utils.h
> @@ -0,0 +1,137 @@
> +/** Utils.h
> + Header defining the General Purpose Utilities
> +
> + Copyright 2017 NXP
> +
> + This program and the accompanying materials
> + are licensed and made available under the terms and conditions of the BSD License
> + which accompanies this distribution. The full text of the license may be found at
> + http://opensource.org/licenses/bsd-license.php
> +
> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#ifndef __UTILS_H__
> +#define __UTILS_H__
> +
> +/*
> + * Divide positive or negative dividend by positive divisor and round
> + * to closest UINTNeger. Result is undefined for negative divisors and
> + * for negative dividends if the divisor variable type is unsigned.
> + */
> +#define DIV_ROUND_CLOSEST(X, Divisor)( \
> +{ \
> + typeof(X) __X = X; \
> + typeof(Divisor) __D = Divisor; \
> + (((typeof(X))-1) > 0 || \
> + ((typeof(Divisor))-1) > 0 || (__X) > 0) ? \
> + (((__X) + ((__D) / 2)) / (__D)) : \
> + (((__X) - ((__D) / 2)) / (__D)); \
> +} \
> +)
This function has been lifted verbatim from the Linux kernel, with the
inputs converted to upper case, at a date before commit 4f5901f5a6724
went in. include/linux/kernel.h does not contain an explicit license,
so falls under the Linux kernel default of GPLv2, which is not
compatible with the specified BSD license.
Please have a _very_ _close_ look at any other potential license
infelicities in the code.
> +
> +/*
> + * HammingWeight32: returns the hamming weight (i.e. the number
> + * of bits set) of a 32-bit word
> + */
> +STATIC
> +inline
> +UINTN
> +HammingWeight32 (
> + IN UINTN W
> + )
> +{
> + UINTN Res;
> +
> + Res = (W & 0x55555555) + ((W >> 1) & 0x55555555);
> + Res = (Res & 0x33333333) + ((Res >> 2) & 0x33333333);
> + Res = (Res & 0x0F0F0F0F) + ((Res >> 4) & 0x0F0F0F0F);
> + Res = (Res & 0x00FF00FF) + ((Res >> 8) & 0x00FF00FF);
> +
> + return (Res & 0x0000FFFF) + ((Res >> 16) & 0x0000FFFF);
> +}
This looks near-identical to an old version from linux lib/hweight.c.
/
Leif
> +
> +STATIC
> +inline
> +UINTN
> +CpuMaskNext (
> + IN UINTN Cpu,
> + IN UINTN Mask
> + )
> +{
> + for (Cpu++; !((1 << Cpu) & Mask); Cpu++)
> + ;
> +
> + return Cpu;
> +}
> +
> +#define ForEachCpu(Iter, Cpu, NumCpus, Mask) \
> + for (Iter = 0, Cpu = CpuMaskNext(-1, Mask); \
> + Iter < NumCpus; \
> + Iter++, Cpu = CpuMaskNext(Cpu, Mask)) \
> +
> +/**
> + Find last (most-significant) bit set
> +
> + @param X : the word to search
> +
> + Note Fls(0) = 0, Fls(1) = 1, Fls(0x80000000) = 32.
> +
> +**/
> +STATIC
> +inline
> +INT32
> +GenericFls (
> + IN INT32 X
> + )
> +{
> + INT32 R = 32;
> +
> + if (!X)
> + return 0;
> +
> + if (!(X & 0xffff0000u)) {
> + X <<= 16;
> + R -= 16;
> + }
> + if (!(X & 0xff000000u)) {
> + X <<= 8;
> + R -= 8;
> + }
> + if (!(X & 0xf0000000u)) {
> + X <<= 4;
> + R -= 4;
> + }
> + if (!(X & 0xc0000000u)) {
> + X <<= 2;
> + R -= 2;
> + }
> + if (!(X & 0x80000000u)) {
> + X <<= 1;
> + R -= 1;
> + }
> +
> + return R;
> +}
include/asm-generic/bitops/fls.h
/
Leif
> +
> +/*
> + * PrINT32 Sizes As "Xxx KiB", "Xxx.Y KiB", "Xxx MiB", "Xxx.Y MiB",
> + * Xxx GiB, Xxx.Y GiB, Etc As Needed; Allow for Optional Trailing String
> + * (Like "\n")
> + */
> +VOID
> +PrintSize (
> + IN UINT64 Size,
> + IN CONST INT8 *S
> + );
> +
> +/* Function to convert a frequency to MHz */
> +CHAR8 *StringToMHz (
> + CHAR8 *Buf,
> + UINT32 Size,
> + UINT64 Hz
> + );
> +
> +#endif
> diff --git a/Platform/NXP/Library/UtilsLib/Utils.c b/Platform/NXP/Library/UtilsLib/Utils.c
> new file mode 100644
> index 0000000..4f5a15c
> --- /dev/null
> +++ b/Platform/NXP/Library/UtilsLib/Utils.c
> @@ -0,0 +1,97 @@
> +/** Utils.c
> +
> + Copyright 2017 NXP
> +
> + This program and the accompanying materials
> + are licensed and made available under the terms and conditions of the BSD License
> + which accompanies this distribution. The full text of the license may be found at
> + http://opensource.org/licenses/bsd-license.php
> +
> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#include <Library/DebugLib.h>
> +#include <Library/PrintLib.h>
> +#include <Library/Utils.h>
> +
> +/* Function to convert a frequency to MHz */
> +CHAR8 *
> +StringToMHz (
> + IN CHAR8 *Buf,
> + IN UINT32 Size,
> + IN UINT64 Hz
> + )
> +{
> + UINT64 L;
> + UINT64 M;
> + UINT64 N;
> +
> + N = DIV_ROUND_CLOSEST(Hz, 1000) / 1000L;
> + L = AsciiSPrint (Buf, Size, "%ld", N);
> +
> + Hz -= N * 1000000L;
> + M = DIV_ROUND_CLOSEST(Hz, 1000L);
> +
> + if (M != 0) {
> + AsciiSPrint (Buf + L, Size, ".%03ld", M);
> + }
> +
> + return (Buf);
> +}
> +
> +/*
> + * PrINT32 Sizes As "Xxx KiB", "Xxx.Y KiB", "Xxx MiB", "Xxx.Y MiB",
> + * Xxx GiB, Xxx.Y GiB, Etc As Needed; Allow for Optional Trailing String
> + * (Like "\n")
> + */
> +VOID
> +PrintSize (
> + IN UINT64 Size,
> + IN CONST INT8 *S
> + )
> +{
> + UINT64 M;
> + UINT64 N;
> + UINT64 F;
> + UINT64 D;
> + CHAR8 C;
> + UINT32 I;
> + INT8 Names[6] = {'E', 'P', 'T', 'G', 'M', 'K'};
> +
> + M = 0;
> + D = 10 * ARRAY_SIZE(Names);
> + C = 0;
> +
> + for (I = 0; I < ARRAY_SIZE(Names); I++, D -= 10) {
> + if (Size >> D) {
> + C = Names[I];
> + break;
> + }
> + }
> +
> + if (!C) {
> + DEBUG((DEBUG_ERROR, "%Ld Bytes,\n %a", Size, S));
> + return;
> + }
> +
> + N = Size >> D;
> + F = Size & ((1ULL << D) - 1);
> +
> + /* if There'S A Remainder, Deal With It */
> + if (F) {
> + M = (10ULL * F + (1ULL << (D - 1))) >> D;
> +
> + if (M >= 10) {
> + M -= 10;
> + N += 1;
> + }
> + }
> +
> + DEBUG((DEBUG_ERROR, "%Ld", N));
> + if (M) {
> + DEBUG((DEBUG_ERROR, ".%Ld", M));
> + }
> + DEBUG((DEBUG_ERROR, " %ciB, %a ", C, S));
> +}
> diff --git a/Platform/NXP/Library/UtilsLib/Utils.inf b/Platform/NXP/Library/UtilsLib/Utils.inf
> new file mode 100644
> index 0000000..9901445
> --- /dev/null
> +++ b/Platform/NXP/Library/UtilsLib/Utils.inf
> @@ -0,0 +1,30 @@
> +# @Utils.inf
> +
> +# Copyright 2017 NXP
> +#
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD License
> +# which accompanies this distribution. The full text of the license may be found at
> +# http://opensource.org/licenses/bsd-license.php
> +#
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +#
> +
> +[Defines]
> + INF_VERSION = 0x00010005
> + BASE_NAME = UtilsLib
> + FILE_GUID = 0985d4e8-5a41-40cf-ad12-2ad5d35e817f
> + MODULE_TYPE = BASE
> + VERSION_STRING = 1.0
> + LIBRARY_CLASS = UtilsLib
> +
> +[Packages]
> + MdePkg/MdePkg.dec
> + edk2-platforms/Platform/NXP/NxpQoriqLs.dec
> +
> +[LibraryClasses]
> + PrintLib
> +
> +[Sources.common]
> + Utils.c
> --
> 1.9.1
>
^ permalink raw reply [flat|nested] 39+ messages in thread
* Re: [PATCH 01/10] Platform/NXP: Library to provide helper functions.
2017-11-13 13:14 ` Leif Lindholm
@ 2017-11-14 5:52 ` Meenakshi Aggarwal
0 siblings, 0 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-14 5:52 UTC (permalink / raw)
To: Leif Lindholm
Cc: ard.biesheuvel@linaro.org, michael.d.kinney@intel.com,
edk2-devel@lists.01.org, Udit Kumar, Varun Sethi
> -----Original Message-----
> From: Leif Lindholm [mailto:leif.lindholm@linaro.org]
> Sent: Monday, November 13, 2017 6:44 PM
> To: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> Cc: ard.biesheuvel@linaro.org; michael.d.kinney@intel.com; edk2-
> devel@lists.01.org; Udit Kumar <udit.kumar@nxp.com>; Varun Sethi
> <V.Sethi@nxp.com>
> Subject: Re: [PATCH 01/10] Platform/NXP: Library to provide helper
> functions.
>
> On Tue, Nov 07, 2017 at 08:12:07PM +0530, Meenakshi Aggarwal wrote:
> > UtilsLib provide helper functions which will be needed by NXP SoCs
> > Library and Drivers.
> >
> > Contributed-under: TianoCore Contribution Agreement 1.1
> > Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> > ---
> > Platform/NXP/Include/Library/Utils.h | 137
> ++++++++++++++++++++++++++++++++
> > Platform/NXP/Library/UtilsLib/Utils.c | 97 ++++++++++++++++++++++
> > Platform/NXP/Library/UtilsLib/Utils.inf | 30 +++++++
> > 3 files changed, 264 insertions(+)
> > create mode 100644 Platform/NXP/Include/Library/Utils.h
> > create mode 100644 Platform/NXP/Library/UtilsLib/Utils.c
> > create mode 100644 Platform/NXP/Library/UtilsLib/Utils.inf
> >
> > diff --git a/Platform/NXP/Include/Library/Utils.h
> > b/Platform/NXP/Include/Library/Utils.h
> > new file mode 100644
> > index 0000000..8920e4d
> > --- /dev/null
> > +++ b/Platform/NXP/Include/Library/Utils.h
> > @@ -0,0 +1,137 @@
> > +/** Utils.h
> > + Header defining the General Purpose Utilities
> > +
> > + Copyright 2017 NXP
> > +
> > + This program and the accompanying materials are licensed and made
> > + available under the terms and conditions of the BSD License which
> > + accompanies this distribution. The full text of the license may be
> > + found at
> > +
> > +
> https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> > + ensource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.a
> > +
> ggarwal%40nxp.com%7C6e1f439b12994a95303208d52a987203%7C686ea1d3b
> c2b4
> > +
> c6fa92cd99c5c301635%7C0%7C0%7C636461756611410167&sdata=6p6jnHOrzd
> eMT
> > + mSED4ktCktqavpmbIfZpPGGa2TyM0g%3D&reserved=0
> > +
> > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > + BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +
> > +**/
> > +
> > +#ifndef __UTILS_H__
> > +#define __UTILS_H__
> > +
> > +/*
> > + * Divide positive or negative dividend by positive divisor and round
> > + * to closest UINTNeger. Result is undefined for negative divisors
> > +and
> > + * for negative dividends if the divisor variable type is unsigned.
> > + */
> > +#define DIV_ROUND_CLOSEST(X, Divisor)( \
> > +{ \
> > + typeof(X) __X = X; \
> > + typeof(Divisor) __D = Divisor; \
> > + (((typeof(X))-1) > 0 || \
> > + ((typeof(Divisor))-1) > 0 || (__X) > 0) ? \
> > + (((__X) + ((__D) / 2)) / (__D)) : \
> > + (((__X) - ((__D) / 2)) / (__D)); \
> > +} \
> > +)
>
> This function has been lifted verbatim from the Linux kernel, with the inputs
> converted to upper case, at a date before commit 4f5901f5a6724 went in.
> include/linux/kernel.h does not contain an explicit license, so falls under the
> Linux kernel default of GPLv2, which is not compatible with the specified BSD
> license.
>
> Please have a _very_ _close_ look at any other potential license infelicities in
> the code.
>
OK, I will check all functions in this file.
> > +
> > +/*
> > + * HammingWeight32: returns the hamming weight (i.e. the number
> > + * of bits set) of a 32-bit word
> > + */
> > +STATIC
> > +inline
> > +UINTN
> > +HammingWeight32 (
> > + IN UINTN W
> > + )
> > +{
> > + UINTN Res;
> > +
> > + Res = (W & 0x55555555) + ((W >> 1) & 0x55555555); Res = (Res &
> > + 0x33333333) + ((Res >> 2) & 0x33333333); Res = (Res & 0x0F0F0F0F) +
> > + ((Res >> 4) & 0x0F0F0F0F); Res = (Res & 0x00FF00FF) + ((Res >> 8) &
> > + 0x00FF00FF);
> > +
> > + return (Res & 0x0000FFFF) + ((Res >> 16) & 0x0000FFFF); }
>
> This looks near-identical to an old version from linux lib/hweight.c.
>
> /
> Leif
>
> > +
> > +STATIC
> > +inline
> > +UINTN
> > +CpuMaskNext (
> > + IN UINTN Cpu,
> > + IN UINTN Mask
> > + )
> > +{
> > + for (Cpu++; !((1 << Cpu) & Mask); Cpu++)
> > + ;
> > +
> > + return Cpu;
> > +}
> > +
> > +#define ForEachCpu(Iter, Cpu, NumCpus, Mask) \
> > + for (Iter = 0, Cpu = CpuMaskNext(-1, Mask); \
> > + Iter < NumCpus; \
> > + Iter++, Cpu = CpuMaskNext(Cpu, Mask)) \
> > +
> > +/**
> > + Find last (most-significant) bit set
> > +
> > + @param X : the word to search
> > +
> > + Note Fls(0) = 0, Fls(1) = 1, Fls(0x80000000) = 32.
> > +
> > +**/
> > +STATIC
> > +inline
> > +INT32
> > +GenericFls (
> > + IN INT32 X
> > + )
> > +{
> > + INT32 R = 32;
> > +
> > + if (!X)
> > + return 0;
> > +
> > + if (!(X & 0xffff0000u)) {
> > + X <<= 16;
> > + R -= 16;
> > + }
> > + if (!(X & 0xff000000u)) {
> > + X <<= 8;
> > + R -= 8;
> > + }
> > + if (!(X & 0xf0000000u)) {
> > + X <<= 4;
> > + R -= 4;
> > + }
> > + if (!(X & 0xc0000000u)) {
> > + X <<= 2;
> > + R -= 2;
> > + }
> > + if (!(X & 0x80000000u)) {
> > + X <<= 1;
> > + R -= 1;
> > + }
> > +
> > + return R;
> > +}
>
> include/asm-generic/bitops/fls.h
>
> /
> Leif
>
> > +
> > +/*
> > + * PrINT32 Sizes As "Xxx KiB", "Xxx.Y KiB", "Xxx MiB", "Xxx.Y MiB",
> > + * Xxx GiB, Xxx.Y GiB, Etc As Needed; Allow for Optional Trailing
> > +String
> > + * (Like "\n")
> > + */
> > +VOID
> > +PrintSize (
> > + IN UINT64 Size,
> > + IN CONST INT8 *S
> > + );
> > +
> > +/* Function to convert a frequency to MHz */
> > +CHAR8 *StringToMHz (
> > + CHAR8 *Buf,
> > + UINT32 Size,
> > + UINT64 Hz
> > + );
> > +
> > +#endif
> > diff --git a/Platform/NXP/Library/UtilsLib/Utils.c
> > b/Platform/NXP/Library/UtilsLib/Utils.c
> > new file mode 100644
> > index 0000000..4f5a15c
> > --- /dev/null
> > +++ b/Platform/NXP/Library/UtilsLib/Utils.c
> > @@ -0,0 +1,97 @@
> > +/** Utils.c
> > +
> > + Copyright 2017 NXP
> > +
> > + This program and the accompanying materials are licensed and made
> > + available under the terms and conditions of the BSD License which
> > + accompanies this distribution. The full text of the license may be
> > + found at
> > +
> > +
> https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> > + ensource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.a
> > +
> ggarwal%40nxp.com%7C6e1f439b12994a95303208d52a987203%7C686ea1d3b
> c2b4
> > +
> c6fa92cd99c5c301635%7C0%7C0%7C636461756611410167&sdata=6p6jnHOrzd
> eMT
> > + mSED4ktCktqavpmbIfZpPGGa2TyM0g%3D&reserved=0
> > +
> > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > + BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +
> > +**/
> > +
> > +#include <Library/DebugLib.h>
> > +#include <Library/PrintLib.h>
> > +#include <Library/Utils.h>
> > +
> > +/* Function to convert a frequency to MHz */
> > +CHAR8 *
> > +StringToMHz (
> > + IN CHAR8 *Buf,
> > + IN UINT32 Size,
> > + IN UINT64 Hz
> > + )
> > +{
> > + UINT64 L;
> > + UINT64 M;
> > + UINT64 N;
> > +
> > + N = DIV_ROUND_CLOSEST(Hz, 1000) / 1000L; L = AsciiSPrint (Buf,
> > + Size, "%ld", N);
> > +
> > + Hz -= N * 1000000L;
> > + M = DIV_ROUND_CLOSEST(Hz, 1000L);
> > +
> > + if (M != 0) {
> > + AsciiSPrint (Buf + L, Size, ".%03ld", M); }
> > +
> > + return (Buf);
> > +}
> > +
> > +/*
> > + * PrINT32 Sizes As "Xxx KiB", "Xxx.Y KiB", "Xxx MiB", "Xxx.Y MiB",
> > + * Xxx GiB, Xxx.Y GiB, Etc As Needed; Allow for Optional Trailing
> > +String
> > + * (Like "\n")
> > + */
> > +VOID
> > +PrintSize (
> > + IN UINT64 Size,
> > + IN CONST INT8 *S
> > + )
> > +{
> > + UINT64 M;
> > + UINT64 N;
> > + UINT64 F;
> > + UINT64 D;
> > + CHAR8 C;
> > + UINT32 I;
> > + INT8 Names[6] = {'E', 'P', 'T', 'G', 'M', 'K'};
> > +
> > + M = 0;
> > + D = 10 * ARRAY_SIZE(Names);
> > + C = 0;
> > +
> > + for (I = 0; I < ARRAY_SIZE(Names); I++, D -= 10) {
> > + if (Size >> D) {
> > + C = Names[I];
> > + break;
> > + }
> > + }
> > +
> > + if (!C) {
> > + DEBUG((DEBUG_ERROR, "%Ld Bytes,\n %a", Size, S));
> > + return;
> > + }
> > +
> > + N = Size >> D;
> > + F = Size & ((1ULL << D) - 1);
> > +
> > + /* if There'S A Remainder, Deal With It */ if (F) {
> > + M = (10ULL * F + (1ULL << (D - 1))) >> D;
> > +
> > + if (M >= 10) {
> > + M -= 10;
> > + N += 1;
> > + }
> > + }
> > +
> > + DEBUG((DEBUG_ERROR, "%Ld", N));
> > + if (M) {
> > + DEBUG((DEBUG_ERROR, ".%Ld", M));
> > + }
> > + DEBUG((DEBUG_ERROR, " %ciB, %a ", C, S)); }
> > diff --git a/Platform/NXP/Library/UtilsLib/Utils.inf
> > b/Platform/NXP/Library/UtilsLib/Utils.inf
> > new file mode 100644
> > index 0000000..9901445
> > --- /dev/null
> > +++ b/Platform/NXP/Library/UtilsLib/Utils.inf
> > @@ -0,0 +1,30 @@
> > +# @Utils.inf
> > +
> > +# Copyright 2017 NXP
> > +#
> > +# This program and the accompanying materials # are licensed and
> > +made available under the terms and conditions of the BSD License #
> > +which accompanies this distribution. The full text of the license
> > +may be found at #
> >
> +https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> e
> > +nsource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.agg
> >
> +arwal%40nxp.com%7C6e1f439b12994a95303208d52a987203%7C686ea1d3bc
> 2b4c6f
> >
> +a92cd99c5c301635%7C0%7C0%7C636461756611410167&sdata=6p6jnHOrzde
> MTmSED
> > +4ktCktqavpmbIfZpPGGa2TyM0g%3D&reserved=0
> > +#
> > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > +BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +#
> > +
> > +[Defines]
> > + INF_VERSION = 0x00010005
> > + BASE_NAME = UtilsLib
> > + FILE_GUID = 0985d4e8-5a41-40cf-ad12-2ad5d35e817f
> > + MODULE_TYPE = BASE
> > + VERSION_STRING = 1.0
> > + LIBRARY_CLASS = UtilsLib
> > +
> > +[Packages]
> > + MdePkg/MdePkg.dec
> > + edk2-platforms/Platform/NXP/NxpQoriqLs.dec
> > +
> > +[LibraryClasses]
> > + PrintLib
> > +
> > +[Sources.common]
> > + Utils.c
> > --
> > 1.9.1
> >
^ permalink raw reply [flat|nested] 39+ messages in thread
* [PATCH 02/10] Platform/NXP: Add support for system reset library
2017-11-07 14:42 [PATCH 00/10] edk2-platforms/Platform/NXP Meenakshi Aggarwal
2017-11-07 14:42 ` [PATCH 01/10] Platform/NXP: Library to provide helper functions Meenakshi Aggarwal
@ 2017-11-07 14:42 ` Meenakshi Aggarwal
2017-11-13 12:09 ` Ard Biesheuvel
2017-11-07 14:42 ` [PATCH 03/10] Platform/NXP: Add support for Big Endian Mmio APIs Meenakshi Aggarwal
` (8 subsequent siblings)
10 siblings, 1 reply; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-07 14:42 UTC (permalink / raw)
To: ard.biesheuvel, leif.lindholm, michael.d.kinney, edk2-devel
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
---
.../NXP/Library/ResetSystemLib/ResetSystemLib.c | 96 ++++++++++++++++++++++
.../NXP/Library/ResetSystemLib/ResetSystemLib.inf | 33 ++++++++
2 files changed, 129 insertions(+)
create mode 100644 Platform/NXP/Library/ResetSystemLib/ResetSystemLib.c
create mode 100644 Platform/NXP/Library/ResetSystemLib/ResetSystemLib.inf
diff --git a/Platform/NXP/Library/ResetSystemLib/ResetSystemLib.c b/Platform/NXP/Library/ResetSystemLib/ResetSystemLib.c
new file mode 100644
index 0000000..897324a
--- /dev/null
+++ b/Platform/NXP/Library/ResetSystemLib/ResetSystemLib.c
@@ -0,0 +1,96 @@
+/** ResetSystemLib.c
+ Do a generic Cold Reset
+
+ Based on Reset system library implementation in
+ BeagleBoardPkg/Library/ResetSystemLib/ResetSystemLib.c
+
+ Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
+ Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Uefi.h>
+#include <IndustryStandard/ArmStdSmc.h>
+#include <Library/ArmLib.h>
+#include <Library/ArmSmcLib.h>
+#include <Library/CacheMaintenanceLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/IoLib.h>
+#include <Library/UefiLib.h>
+
+/**
+ Resets the entire platform.
+
+ @param ResetType : The type of reset to perform.
+ @param ResetStatus : The status code for the reset.
+ @param DataSize : The size, in bytes, of WatchdogData.
+ @param ResetData : For a ResetType of EfiResetCold, EfiResetWarm, or
+ EfiResetShutdown the data buffer starts with a Null-terminated
+ Unicode string, optionally followed by additional binary data.
+**/
+EFI_STATUS
+EFIAPI
+LibResetSystem (
+ IN EFI_RESET_TYPE ResetType,
+ IN EFI_STATUS ResetStatus,
+ IN UINTN DataSize,
+ IN CHAR16 *ResetData OPTIONAL
+ )
+{
+ ARM_SMC_ARGS ArmSmcArgs;
+
+ switch (ResetType) {
+ case EfiResetPlatformSpecific:
+ case EfiResetWarm:
+ // Map a warm reset into a cold reset
+ case EfiResetCold:
+ // Send a PSCI 0.2 SYSTEM_RESET command
+ ArmSmcArgs.Arg0 = ARM_SMC_ID_PSCI_SYSTEM_RESET;
+ break;
+ case EfiResetShutdown:
+ // Send a PSCI 0.2 SYSTEM_OFF command
+ ArmSmcArgs.Arg0 = ARM_SMC_ID_PSCI_SYSTEM_OFF;
+ break;
+ default:
+ ASSERT (FALSE);
+ return EFI_UNSUPPORTED;
+ }
+
+ ArmCallSmc (&ArmSmcArgs);
+
+ // We should never be here
+ DEBUG ((DEBUG_VERBOSE, "%a: PSCI failed in performing %d\n",
+ __FUNCTION__, ArmSmcArgs.Arg0));
+
+ CpuDeadLoop ();
+ return EFI_UNSUPPORTED;
+}
+
+/**
+ Initialize any infrastructure required for LibResetSystem () to function.
+
+ @param ImageHandle : The firmware allocated handle for the EFI image.
+ @param SystemTable : A pointer to the EFI System Table.
+
+ @retval EFI_SUCCESS : The constructor always returns EFI_SUCCESS.
+
+**/
+EFI_STATUS
+EFIAPI
+LibInitializeResetSystem (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ return EFI_SUCCESS;
+}
diff --git a/Platform/NXP/Library/ResetSystemLib/ResetSystemLib.inf b/Platform/NXP/Library/ResetSystemLib/ResetSystemLib.inf
new file mode 100644
index 0000000..c57fff8
--- /dev/null
+++ b/Platform/NXP/Library/ResetSystemLib/ResetSystemLib.inf
@@ -0,0 +1,33 @@
+# @ResetSystemLib.inf
+# Reset System lib to make it easy to port new platforms
+#
+# Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = ResetSystemLib
+ FILE_GUID = 781371a2-3fdd-41d4-96a1-7b34cbc9e895
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = EfiResetSystemLib
+
+[Sources.common]
+ ResetSystemLib.c
+
+[Packages]
+ ArmPkg/ArmPkg.dec
+ MdePkg/MdePkg.dec
+
+[LibraryClasses]
+ ArmSmcLib
+ BaseLib
--
1.9.1
^ permalink raw reply related [flat|nested] 39+ messages in thread
* Re: [PATCH 02/10] Platform/NXP: Add support for system reset library
2017-11-07 14:42 ` [PATCH 02/10] Platform/NXP: Add support for system reset library Meenakshi Aggarwal
@ 2017-11-13 12:09 ` Ard Biesheuvel
2017-11-14 5:19 ` Meenakshi Aggarwal
0 siblings, 1 reply; 39+ messages in thread
From: Ard Biesheuvel @ 2017-11-13 12:09 UTC (permalink / raw)
To: Meenakshi Aggarwal
Cc: Leif Lindholm, Kinney, Michael D, edk2-devel@lists.01.org,
Udit Kumar, Varun Sethi
On 7 November 2017 at 14:42, Meenakshi Aggarwal
<meenakshi.aggarwal@nxp.com> wrote:
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> ---
> .../NXP/Library/ResetSystemLib/ResetSystemLib.c | 96 ++++++++++++++++++++++
> .../NXP/Library/ResetSystemLib/ResetSystemLib.inf | 33 ++++++++
> 2 files changed, 129 insertions(+)
> create mode 100644 Platform/NXP/Library/ResetSystemLib/ResetSystemLib.c
> create mode 100644 Platform/NXP/Library/ResetSystemLib/ResetSystemLib.inf
>
Please drop this patch, and move your platform to
MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf,
using ArmPkg/Library/ArmSmcPsciResetSystemLib/ArmSmcPsciResetSystemLib.inf
as your ResetSystemLib implementation.
> diff --git a/Platform/NXP/Library/ResetSystemLib/ResetSystemLib.c b/Platform/NXP/Library/ResetSystemLib/ResetSystemLib.c
> new file mode 100644
> index 0000000..897324a
> --- /dev/null
> +++ b/Platform/NXP/Library/ResetSystemLib/ResetSystemLib.c
> @@ -0,0 +1,96 @@
> +/** ResetSystemLib.c
> + Do a generic Cold Reset
> +
> + Based on Reset system library implementation in
> + BeagleBoardPkg/Library/ResetSystemLib/ResetSystemLib.c
> +
> + Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
> + Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
> + Copyright 2017 NXP
> +
> + This program and the accompanying materials
> + are licensed and made available under the terms and conditions of the BSD License
> + which accompanies this distribution. The full text of the license may be found at
> + http://opensource.org/licenses/bsd-license.php
> +
> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#include <Uefi.h>
> +#include <IndustryStandard/ArmStdSmc.h>
> +#include <Library/ArmLib.h>
> +#include <Library/ArmSmcLib.h>
> +#include <Library/CacheMaintenanceLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/UefiLib.h>
> +
> +/**
> + Resets the entire platform.
> +
> + @param ResetType : The type of reset to perform.
> + @param ResetStatus : The status code for the reset.
> + @param DataSize : The size, in bytes, of WatchdogData.
> + @param ResetData : For a ResetType of EfiResetCold, EfiResetWarm, or
> + EfiResetShutdown the data buffer starts with a Null-terminated
> + Unicode string, optionally followed by additional binary data.
> +**/
> +EFI_STATUS
> +EFIAPI
> +LibResetSystem (
> + IN EFI_RESET_TYPE ResetType,
> + IN EFI_STATUS ResetStatus,
> + IN UINTN DataSize,
> + IN CHAR16 *ResetData OPTIONAL
> + )
> +{
> + ARM_SMC_ARGS ArmSmcArgs;
> +
> + switch (ResetType) {
> + case EfiResetPlatformSpecific:
> + case EfiResetWarm:
> + // Map a warm reset into a cold reset
> + case EfiResetCold:
> + // Send a PSCI 0.2 SYSTEM_RESET command
> + ArmSmcArgs.Arg0 = ARM_SMC_ID_PSCI_SYSTEM_RESET;
> + break;
> + case EfiResetShutdown:
> + // Send a PSCI 0.2 SYSTEM_OFF command
> + ArmSmcArgs.Arg0 = ARM_SMC_ID_PSCI_SYSTEM_OFF;
> + break;
> + default:
> + ASSERT (FALSE);
> + return EFI_UNSUPPORTED;
> + }
> +
> + ArmCallSmc (&ArmSmcArgs);
> +
> + // We should never be here
> + DEBUG ((DEBUG_VERBOSE, "%a: PSCI failed in performing %d\n",
> + __FUNCTION__, ArmSmcArgs.Arg0));
> +
> + CpuDeadLoop ();
> + return EFI_UNSUPPORTED;
> +}
> +
> +/**
> + Initialize any infrastructure required for LibResetSystem () to function.
> +
> + @param ImageHandle : The firmware allocated handle for the EFI image.
> + @param SystemTable : A pointer to the EFI System Table.
> +
> + @retval EFI_SUCCESS : The constructor always returns EFI_SUCCESS.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +LibInitializeResetSystem (
> + IN EFI_HANDLE ImageHandle,
> + IN EFI_SYSTEM_TABLE *SystemTable
> + )
> +{
> + return EFI_SUCCESS;
> +}
> diff --git a/Platform/NXP/Library/ResetSystemLib/ResetSystemLib.inf b/Platform/NXP/Library/ResetSystemLib/ResetSystemLib.inf
> new file mode 100644
> index 0000000..c57fff8
> --- /dev/null
> +++ b/Platform/NXP/Library/ResetSystemLib/ResetSystemLib.inf
> @@ -0,0 +1,33 @@
> +# @ResetSystemLib.inf
> +# Reset System lib to make it easy to port new platforms
> +#
> +# Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
> +# Copyright 2017 NXP
> +#
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD License
> +# which accompanies this distribution. The full text of the license may be found at
> +# http://opensource.org/licenses/bsd-license.php
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +#
> +#
> +
> +[Defines]
> + INF_VERSION = 0x00010005
> + BASE_NAME = ResetSystemLib
> + FILE_GUID = 781371a2-3fdd-41d4-96a1-7b34cbc9e895
> + MODULE_TYPE = BASE
> + VERSION_STRING = 1.0
> + LIBRARY_CLASS = EfiResetSystemLib
> +
> +[Sources.common]
> + ResetSystemLib.c
> +
> +[Packages]
> + ArmPkg/ArmPkg.dec
> + MdePkg/MdePkg.dec
> +
> +[LibraryClasses]
> + ArmSmcLib
> + BaseLib
> --
> 1.9.1
>
^ permalink raw reply [flat|nested] 39+ messages in thread
* Re: [PATCH 02/10] Platform/NXP: Add support for system reset library
2017-11-13 12:09 ` Ard Biesheuvel
@ 2017-11-14 5:19 ` Meenakshi Aggarwal
0 siblings, 0 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-14 5:19 UTC (permalink / raw)
To: Ard Biesheuvel
Cc: Leif Lindholm, Kinney, Michael D, edk2-devel@lists.01.org,
Udit Kumar, Varun Sethi
> -----Original Message-----
> From: Ard Biesheuvel [mailto:ard.biesheuvel@linaro.org]
> Sent: Monday, November 13, 2017 5:40 PM
> To: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> Cc: Leif Lindholm <leif.lindholm@linaro.org>; Kinney, Michael D
> <michael.d.kinney@intel.com>; edk2-devel@lists.01.org; Udit Kumar
> <udit.kumar@nxp.com>; Varun Sethi <V.Sethi@nxp.com>
> Subject: Re: [PATCH 02/10] Platform/NXP: Add support for system reset
> library
>
> On 7 November 2017 at 14:42, Meenakshi Aggarwal
> <meenakshi.aggarwal@nxp.com> wrote:
> > Contributed-under: TianoCore Contribution Agreement 1.1
> > Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> > ---
> > .../NXP/Library/ResetSystemLib/ResetSystemLib.c | 96
> ++++++++++++++++++++++
> > .../NXP/Library/ResetSystemLib/ResetSystemLib.inf | 33 ++++++++
> > 2 files changed, 129 insertions(+)
> > create mode 100644
> > Platform/NXP/Library/ResetSystemLib/ResetSystemLib.c
> > create mode 100644
> > Platform/NXP/Library/ResetSystemLib/ResetSystemLib.inf
> >
>
> Please drop this patch, and move your platform to
> MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntime
> Dxe.inf,
> using
> ArmPkg/Library/ArmSmcPsciResetSystemLib/ArmSmcPsciResetSystemLib.inf
> as your ResetSystemLib implementation.
>
OK, we will use same as both are based on PSCI calls.
> > diff --git a/Platform/NXP/Library/ResetSystemLib/ResetSystemLib.c
> > b/Platform/NXP/Library/ResetSystemLib/ResetSystemLib.c
> > new file mode 100644
> > index 0000000..897324a
> > --- /dev/null
> > +++ b/Platform/NXP/Library/ResetSystemLib/ResetSystemLib.c
> > @@ -0,0 +1,96 @@
> > +/** ResetSystemLib.c
> > + Do a generic Cold Reset
> > +
> > + Based on Reset system library implementation in
> > + BeagleBoardPkg/Library/ResetSystemLib/ResetSystemLib.c
> > +
> > + Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
> > + Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
> > + Copyright 2017 NXP
> > +
> > + This program and the accompanying materials are licensed and made
> > + available under the terms and conditions of the BSD License which
> > + accompanies this distribution. The full text of the license may be
> > + found at
> > +
> > +
> https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> > + ensource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.a
> > +
> ggarwal%40nxp.com%7C61e0e75526184abb5c3908d52a8f70f9%7C686ea1d3b
> c2b4
> > +
> c6fa92cd99c5c301635%7C0%7C0%7C636461717926249509&sdata=ofvOybKAa
> 64hI
> > + kl0oZuRk0p%2FopCIE0ueBk8yW5OkscQ%3D&reserved=0
> > +
> > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > + BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +
> > +**/
> > +
> > +#include <Uefi.h>
> > +#include <IndustryStandard/ArmStdSmc.h> #include <Library/ArmLib.h>
> > +#include <Library/ArmSmcLib.h> #include
> > +<Library/CacheMaintenanceLib.h> #include <Library/DebugLib.h>
> > +#include <Library/MemoryAllocationLib.h> #include <Library/IoLib.h>
> > +#include <Library/UefiLib.h>
> > +
> > +/**
> > + Resets the entire platform.
> > +
> > + @param ResetType : The type of reset to perform.
> > + @param ResetStatus : The status code for the reset.
> > + @param DataSize : The size, in bytes, of WatchdogData.
> > + @param ResetData : For a ResetType of EfiResetCold,
> EfiResetWarm, or
> > + EfiResetShutdown the data buffer starts with a Null-
> terminated
> > + Unicode string, optionally followed by additional binary
> data.
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +LibResetSystem (
> > + IN EFI_RESET_TYPE ResetType,
> > + IN EFI_STATUS ResetStatus,
> > + IN UINTN DataSize,
> > + IN CHAR16 *ResetData OPTIONAL
> > + )
> > +{
> > + ARM_SMC_ARGS ArmSmcArgs;
> > +
> > + switch (ResetType) {
> > + case EfiResetPlatformSpecific:
> > + case EfiResetWarm:
> > + // Map a warm reset into a cold reset case EfiResetCold:
> > + // Send a PSCI 0.2 SYSTEM_RESET command
> > + ArmSmcArgs.Arg0 = ARM_SMC_ID_PSCI_SYSTEM_RESET;
> > + break;
> > + case EfiResetShutdown:
> > + // Send a PSCI 0.2 SYSTEM_OFF command
> > + ArmSmcArgs.Arg0 = ARM_SMC_ID_PSCI_SYSTEM_OFF;
> > + break;
> > + default:
> > + ASSERT (FALSE);
> > + return EFI_UNSUPPORTED;
> > + }
> > +
> > + ArmCallSmc (&ArmSmcArgs);
> > +
> > + // We should never be here
> > + DEBUG ((DEBUG_VERBOSE, "%a: PSCI failed in performing %d\n",
> > + __FUNCTION__, ArmSmcArgs.Arg0));
> > +
> > + CpuDeadLoop ();
> > + return EFI_UNSUPPORTED;
> > +}
> > +
> > +/**
> > + Initialize any infrastructure required for LibResetSystem () to function.
> > +
> > + @param ImageHandle : The firmware allocated handle for the EFI
> image.
> > + @param SystemTable : A pointer to the EFI System Table.
> > +
> > + @retval EFI_SUCCESS : The constructor always returns EFI_SUCCESS.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +LibInitializeResetSystem (
> > + IN EFI_HANDLE ImageHandle,
> > + IN EFI_SYSTEM_TABLE *SystemTable
> > + )
> > +{
> > + return EFI_SUCCESS;
> > +}
> > diff --git a/Platform/NXP/Library/ResetSystemLib/ResetSystemLib.inf
> > b/Platform/NXP/Library/ResetSystemLib/ResetSystemLib.inf
> > new file mode 100644
> > index 0000000..c57fff8
> > --- /dev/null
> > +++ b/Platform/NXP/Library/ResetSystemLib/ResetSystemLib.inf
> > @@ -0,0 +1,33 @@
> > +# @ResetSystemLib.inf
> > +# Reset System lib to make it easy to port new platforms # #
> > +Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
> > +# Copyright 2017 NXP
> > +#
> > +# This program and the accompanying materials # are licensed and
> > +made available under the terms and conditions of the BSD License #
> > +which accompanies this distribution. The full text of the license may
> > +be found at #
> >
> +https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> e
> > +nsource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.agg
> >
> +arwal%40nxp.com%7C61e0e75526184abb5c3908d52a8f70f9%7C686ea1d3bc
> 2b4c6f
> >
> +a92cd99c5c301635%7C0%7C0%7C636461717926249509&sdata=ofvOybKAa64
> hIkl0o
> > +ZuRk0p%2FopCIE0ueBk8yW5OkscQ%3D&reserved=0
> > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > +BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +#
> > +#
> > +
> > +[Defines]
> > + INF_VERSION = 0x00010005
> > + BASE_NAME = ResetSystemLib
> > + FILE_GUID = 781371a2-3fdd-41d4-96a1-7b34cbc9e895
> > + MODULE_TYPE = BASE
> > + VERSION_STRING = 1.0
> > + LIBRARY_CLASS = EfiResetSystemLib
> > +
> > +[Sources.common]
> > + ResetSystemLib.c
> > +
> > +[Packages]
> > + ArmPkg/ArmPkg.dec
> > + MdePkg/MdePkg.dec
> > +
> > +[LibraryClasses]
> > + ArmSmcLib
> > + BaseLib
> > --
> > 1.9.1
> >
^ permalink raw reply [flat|nested] 39+ messages in thread
* [PATCH 03/10] Platform/NXP: Add support for Big Endian Mmio APIs
2017-11-07 14:42 [PATCH 00/10] edk2-platforms/Platform/NXP Meenakshi Aggarwal
2017-11-07 14:42 ` [PATCH 01/10] Platform/NXP: Library to provide helper functions Meenakshi Aggarwal
2017-11-07 14:42 ` [PATCH 02/10] Platform/NXP: Add support for system reset library Meenakshi Aggarwal
@ 2017-11-07 14:42 ` Meenakshi Aggarwal
2017-11-13 12:26 ` Ard Biesheuvel
2017-11-07 14:42 ` [PATCH 04/10] Platform/NXP : Add support for Watchdog driver Meenakshi Aggarwal
` (7 subsequent siblings)
10 siblings, 1 reply; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-07 14:42 UTC (permalink / raw)
To: ard.biesheuvel, leif.lindholm, michael.d.kinney, edk2-devel
This library add supports for BE read/write and other
MMIO helper function.
In this data swapped after reading from MMIO and before
write using MMIO.
It can be used by any module with BE address space.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
---
Platform/NXP/Include/Library/BeIoLib.h | 332 +++++++++++++++++++++++++
Platform/NXP/Library/BeIoLib/BeIoLib.c | 400 +++++++++++++++++++++++++++++++
Platform/NXP/Library/BeIoLib/BeIoLib.inf | 31 +++
3 files changed, 763 insertions(+)
create mode 100644 Platform/NXP/Include/Library/BeIoLib.h
create mode 100644 Platform/NXP/Library/BeIoLib/BeIoLib.c
create mode 100644 Platform/NXP/Library/BeIoLib/BeIoLib.inf
diff --git a/Platform/NXP/Include/Library/BeIoLib.h b/Platform/NXP/Include/Library/BeIoLib.h
new file mode 100644
index 0000000..209262d
--- /dev/null
+++ b/Platform/NXP/Include/Library/BeIoLib.h
@@ -0,0 +1,332 @@
+/** BeIoLib.h
+ *
+ * Copyright 2017 NXP
+ *
+ * This program and the accompanying materials
+ * are licensed and made available under the terms and conditions of the BSD License
+ * which accompanies this distribution. The full text of the license may be found at
+ * http://opensource.org/licenses/bsd-license.php
+ *
+ * HE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+ *
+ **/
+
+#ifndef __BE_IOLIB_H__
+#define __BE_IOLIB_H__
+
+#include <Base.h>
+
+/**
+ MmioRead8 for Big-Endian modules.
+
+ @param Address The MMIO register to read.
+
+ @return The value read.
+
+**/
+UINT8
+EFIAPI
+BeMmioRead8 (
+ IN UINTN Address
+ );
+
+/**
+ MmioRead16 for Big-Endian modules.
+
+ @param Address The MMIO register to read.
+
+ @return The value read.
+
+**/
+UINT16
+EFIAPI
+BeMmioRead16 (
+ IN UINTN Address
+ );
+
+/**
+ MmioRead32 for Big-Endian modules.
+
+ @param Address The MMIO register to read.
+
+ @return The value read.
+
+**/
+UINT32
+EFIAPI
+BeMmioRead32 (
+ IN UINTN Address
+ );
+
+/**
+ MmioRead64 for Big-Endian modules.
+
+ @param Address The MMIO register to read.
+
+ @return The value read.
+
+**/
+UINT64
+EFIAPI
+BeMmioRead64 (
+ IN UINTN Address
+ );
+
+/**
+ MmioWrite8 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param Value The value to write to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+BeMmioWrite8 (
+ IN UINTN Address,
+ IN UINT8 Value
+ );
+
+/**
+ MmioWrite16 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param Value The value to write to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+BeMmioWrite16 (
+ IN UINTN Address,
+ IN UINT16 Value
+ );
+
+/**
+ MmioWrite32 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param Value The value to write to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+BeMmioWrite32 (
+ IN UINTN Address,
+ IN UINT32 Value
+ );
+
+/**
+ MmioWrite64 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param Value The value to write to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+BeMmioWrite64 (
+ IN UINTN Address,
+ IN UINT64 Value
+ );
+
+/**
+ MmioAndThenOr8 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+ @param OrData The value to OR with the result of the AND operation.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+BeMmioAndThenOr8 (
+ IN UINTN Address,
+ IN UINT8 AndData,
+ IN UINT8 OrData
+ );
+
+/**
+ MmioAndThenOr16 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+ @param OrData The value to OR with the result of the AND operation.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+BeMmioAndThenOr16 (
+ IN UINTN Address,
+ IN UINT16 AndData,
+ IN UINT16 OrData
+ );
+
+/**
+ MmioAndThenOr32 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+ @param OrData The value to OR with the result of the AND operation.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+BeMmioAndThenOr32 (
+ IN UINTN Address,
+ IN UINT32 AndData,
+ IN UINT32 OrData
+ );
+
+/**
+ MmioAndThenOr64 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+ @param OrData The value to OR with the result of the AND operation.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+BeMmioAndThenOr64 (
+ IN UINTN Address,
+ IN UINT64 AndData,
+ IN UINT64 OrData
+ );
+
+/**
+ MmioOr8 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param OrData The value to OR with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+BeMmioOr8 (
+ IN UINTN Address,
+ IN UINT8 OrData
+ );
+
+/**
+ MmioOr16 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param OrData The value to OR with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+BeMmioOr16 (
+ IN UINTN Address,
+ IN UINT16 OrData
+ );
+
+/**
+ MmioOr32 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param OrData The value to OR with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+BeMmioOr32 (
+ IN UINTN Address,
+ IN UINT32 OrData
+ );
+
+/**
+ MmioOr64 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param OrData The value to OR with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+BeMmioOr64 (
+ IN UINTN Address,
+ IN UINT64 OrData
+ );
+
+/**
+ MmioAnd8 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+BeMmioAnd8 (
+ IN UINTN Address,
+ IN UINT8 AndData
+ );
+
+/**
+ MmioAnd16 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+BeMmioAnd16 (
+ IN UINTN Address,
+ IN UINT16 AndData
+ );
+
+/**
+ MmioAnd32 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+BeMmioAnd32 (
+ IN UINTN Address,
+ IN UINT32 AndData
+ );
+
+/**
+ MmioAnd64 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+BeMmioAnd64 (
+ IN UINTN Address,
+ IN UINT64 AndData
+ );
+
+#endif /* _BE_IOLIB_H */
diff --git a/Platform/NXP/Library/BeIoLib/BeIoLib.c b/Platform/NXP/Library/BeIoLib/BeIoLib.c
new file mode 100644
index 0000000..b4e7c90
--- /dev/null
+++ b/Platform/NXP/Library/BeIoLib/BeIoLib.c
@@ -0,0 +1,400 @@
+/** BeIoLib.c
+
+ Provide MMIO APIs for BE modules.
+
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Base.h>
+#include <Library/BaseLib.h>
+#include <Library/IoLib.h>
+
+/**
+ MmioRead8 for Big-Endian modules.
+
+ @param Address The MMIO register to read.
+
+ @return The value read.
+
+**/
+UINT8
+EFIAPI
+BeMmioRead8 (
+ IN UINTN Address
+ )
+{
+ return MmioRead8(Address);
+}
+
+/**
+ MmioRead16 for Big-Endian modules.
+
+ @param Address The MMIO register to read.
+
+ @return The value read.
+
+**/
+UINT16
+EFIAPI
+BeMmioRead16 (
+ IN UINTN Address
+ )
+{
+ return SwapBytes16(MmioRead16(Address));
+}
+
+/**
+ MmioRead32 for Big-Endian modules.
+
+ @param Address The MMIO register to read.
+
+ @return The value read.
+
+**/
+UINT32
+EFIAPI
+BeMmioRead32 (
+ IN UINTN Address
+ )
+{
+ return SwapBytes32(MmioRead32(Address));
+}
+
+/**
+ MmioRead64 for Big-Endian modules.
+
+ @param Address The MMIO register to read.
+
+ @return The value read.
+
+**/
+UINT64
+EFIAPI
+BeMmioRead64 (
+ IN UINTN Address
+ )
+{
+ return SwapBytes64(MmioRead64(Address));
+}
+
+/**
+ MmioWrite8 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param Value The value to write to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+BeMmioWrite8 (
+ IN UINTN Address,
+ IN UINT8 Value
+ )
+{
+ return MmioWrite8(Address, Value);
+}
+
+/**
+ MmioWrite16 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param Value The value to write to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+BeMmioWrite16 (
+ IN UINTN Address,
+ IN UINT16 Value
+ )
+{
+ return MmioWrite16(Address, SwapBytes16(Value));
+}
+
+/**
+ MmioWrite32 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param Value The value to write to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+BeMmioWrite32 (
+ IN UINTN Address,
+ IN UINT32 Value
+ )
+{
+ return MmioWrite32(Address, SwapBytes32(Value));
+}
+
+/**
+ MmioWrite64 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param Value The value to write to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+BeMmioWrite64 (
+ IN UINTN Address,
+ IN UINT64 Value
+ )
+{
+ return MmioWrite64(Address, SwapBytes64(Value));
+}
+
+/**
+ MmioAndThenOr8 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+ @param OrData The value to OR with the result of the AND operation.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+BeMmioAndThenOr8 (
+ IN UINTN Address,
+ IN UINT8 AndData,
+ IN UINT8 OrData
+ )
+{
+ return MmioAndThenOr8(Address, AndData, OrData);
+}
+
+/**
+ MmioAndThenOr16 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+ @param OrData The value to OR with the result of the AND operation.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+BeMmioAndThenOr16 (
+ IN UINTN Address,
+ IN UINT16 AndData,
+ IN UINT16 OrData
+ )
+{
+ AndData = SwapBytes16(AndData);
+ OrData = SwapBytes16(OrData);
+
+ return MmioAndThenOr16(Address, AndData, OrData);
+}
+
+/**
+ MmioAndThenOr32 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+ @param OrData The value to OR with the result of the AND operation.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+BeMmioAndThenOr32 (
+ IN UINTN Address,
+ IN UINT32 AndData,
+ IN UINT32 OrData
+ )
+{
+ AndData = SwapBytes32(AndData);
+ OrData = SwapBytes32(OrData);
+
+ return MmioAndThenOr32(Address, AndData, OrData);
+}
+
+/**
+ MmioAndThenOr64 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+ @param OrData The value to OR with the result of the AND operation.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+BeMmioAndThenOr64 (
+ IN UINTN Address,
+ IN UINT64 AndData,
+ IN UINT64 OrData
+ )
+{
+ AndData = SwapBytes64(AndData);
+ OrData = SwapBytes64(OrData);
+
+ return MmioAndThenOr64(Address, AndData, OrData);
+}
+
+/**
+ MmioOr8 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param OrData The value to OR with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+BeMmioOr8 (
+ IN UINTN Address,
+ IN UINT8 OrData
+ )
+{
+ return MmioOr8(Address, OrData);
+}
+
+/**
+ MmioOr16 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param OrData The value to OR with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+BeMmioOr16 (
+ IN UINTN Address,
+ IN UINT16 OrData
+ )
+{
+ return MmioOr16(Address, SwapBytes16(OrData));
+}
+
+/**
+ MmioOr32 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param OrData The value to OR with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+BeMmioOr32 (
+ IN UINTN Address,
+ IN UINT32 OrData
+ )
+{
+ return MmioOr32(Address, SwapBytes32(OrData));
+}
+
+/**
+ MmioOr64 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param OrData The value to OR with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+BeMmioOr64 (
+ IN UINTN Address,
+ IN UINT64 OrData
+ )
+{
+ return MmioOr64(Address, SwapBytes64(OrData));
+}
+
+/**
+ MmioAnd8 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+BeMmioAnd8 (
+ IN UINTN Address,
+ IN UINT8 AndData
+ )
+{
+ return MmioAnd8(Address, AndData);
+}
+
+/**
+ MmioAnd16 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+BeMmioAnd16 (
+ IN UINTN Address,
+ IN UINT16 AndData
+ )
+{
+ return MmioAnd16(Address, SwapBytes16(AndData));
+}
+
+/**
+ MmioAnd32 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+BeMmioAnd32 (
+ IN UINTN Address,
+ IN UINT32 AndData
+ )
+{
+ return MmioAnd32(Address, SwapBytes32(AndData));
+}
+
+/**
+ MmioAnd64 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+BeMmioAnd64 (
+ IN UINTN Address,
+ IN UINT64 AndData
+ )
+{
+ return MmioAnd64(Address, SwapBytes64(AndData));
+}
diff --git a/Platform/NXP/Library/BeIoLib/BeIoLib.inf b/Platform/NXP/Library/BeIoLib/BeIoLib.inf
new file mode 100644
index 0000000..ca64d8f
--- /dev/null
+++ b/Platform/NXP/Library/BeIoLib/BeIoLib.inf
@@ -0,0 +1,31 @@
+## @BeIoLib.inf
+
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = BeIoLib
+ FILE_GUID = 28d77333-77eb-4faf-8735-130e5eb3e343
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = BeIoLib
+
+[Packages]
+ MdeModulePkg/MdeModulePkg.dec
+ MdePkg/MdePkg.dec
+
+[LibraryClasses]
+ IoLib
+
+[Sources.common]
+ BeIoLib.c
--
1.9.1
^ permalink raw reply related [flat|nested] 39+ messages in thread
* Re: [PATCH 03/10] Platform/NXP: Add support for Big Endian Mmio APIs
2017-11-07 14:42 ` [PATCH 03/10] Platform/NXP: Add support for Big Endian Mmio APIs Meenakshi Aggarwal
@ 2017-11-13 12:26 ` Ard Biesheuvel
2017-11-14 4:10 ` Meenakshi Aggarwal
0 siblings, 1 reply; 39+ messages in thread
From: Ard Biesheuvel @ 2017-11-13 12:26 UTC (permalink / raw)
To: Meenakshi Aggarwal
Cc: Leif Lindholm, Kinney, Michael D, edk2-devel@lists.01.org,
Udit Kumar, Varun Sethi
On 7 November 2017 at 14:42, Meenakshi Aggarwal
<meenakshi.aggarwal@nxp.com> wrote:
> This library add supports for BE read/write and other
> MMIO helper function.
> In this data swapped after reading from MMIO and before
> write using MMIO.
> It can be used by any module with BE address space.
>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> ---
> Platform/NXP/Include/Library/BeIoLib.h | 332 +++++++++++++++++++++++++
> Platform/NXP/Library/BeIoLib/BeIoLib.c | 400 +++++++++++++++++++++++++++++++
> Platform/NXP/Library/BeIoLib/BeIoLib.inf | 31 +++
> 3 files changed, 763 insertions(+)
> create mode 100644 Platform/NXP/Include/Library/BeIoLib.h
> create mode 100644 Platform/NXP/Library/BeIoLib/BeIoLib.c
> create mode 100644 Platform/NXP/Library/BeIoLib/BeIoLib.inf
>
> diff --git a/Platform/NXP/Include/Library/BeIoLib.h b/Platform/NXP/Include/Library/BeIoLib.h
> new file mode 100644
> index 0000000..209262d
> --- /dev/null
> +++ b/Platform/NXP/Include/Library/BeIoLib.h
> @@ -0,0 +1,332 @@
> +/** BeIoLib.h
> + *
> + * Copyright 2017 NXP
> + *
> + * This program and the accompanying materials
> + * are licensed and made available under the terms and conditions of the BSD License
> + * which accompanies this distribution. The full text of the license may be found at
> + * http://opensource.org/licenses/bsd-license.php
> + *
> + * HE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
Missing T ^^^
> + * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> + *
> + **/
> +
> +#ifndef __BE_IOLIB_H__
> +#define __BE_IOLIB_H__
> +
> +#include <Base.h>
> +
> +/**
> + MmioRead8 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioRead8 (
> + IN UINTN Address
> + );
> +
> +/**
> + MmioRead16 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioRead16 (
> + IN UINTN Address
> + );
> +
> +/**
> + MmioRead32 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioRead32 (
> + IN UINTN Address
> + );
> +
> +/**
> + MmioRead64 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioRead64 (
> + IN UINTN Address
> + );
> +
> +/**
> + MmioWrite8 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioWrite8 (
> + IN UINTN Address,
> + IN UINT8 Value
> + );
> +
> +/**
> + MmioWrite16 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioWrite16 (
> + IN UINTN Address,
> + IN UINT16 Value
> + );
> +
> +/**
> + MmioWrite32 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioWrite32 (
> + IN UINTN Address,
> + IN UINT32 Value
> + );
> +
> +/**
> + MmioWrite64 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioWrite64 (
> + IN UINTN Address,
> + IN UINT64 Value
> + );
> +
> +/**
> + MmioAndThenOr8 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> + @param OrData The value to OR with the result of the AND operation.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioAndThenOr8 (
> + IN UINTN Address,
> + IN UINT8 AndData,
> + IN UINT8 OrData
> + );
> +
> +/**
> + MmioAndThenOr16 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> + @param OrData The value to OR with the result of the AND operation.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioAndThenOr16 (
> + IN UINTN Address,
> + IN UINT16 AndData,
> + IN UINT16 OrData
> + );
> +
> +/**
> + MmioAndThenOr32 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> + @param OrData The value to OR with the result of the AND operation.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioAndThenOr32 (
> + IN UINTN Address,
> + IN UINT32 AndData,
> + IN UINT32 OrData
> + );
> +
> +/**
> + MmioAndThenOr64 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> + @param OrData The value to OR with the result of the AND operation.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioAndThenOr64 (
> + IN UINTN Address,
> + IN UINT64 AndData,
> + IN UINT64 OrData
> + );
> +
> +/**
> + MmioOr8 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param OrData The value to OR with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioOr8 (
> + IN UINTN Address,
> + IN UINT8 OrData
> + );
> +
> +/**
> + MmioOr16 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param OrData The value to OR with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioOr16 (
> + IN UINTN Address,
> + IN UINT16 OrData
> + );
> +
> +/**
> + MmioOr32 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param OrData The value to OR with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioOr32 (
> + IN UINTN Address,
> + IN UINT32 OrData
> + );
> +
> +/**
> + MmioOr64 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param OrData The value to OR with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioOr64 (
> + IN UINTN Address,
> + IN UINT64 OrData
> + );
> +
> +/**
> + MmioAnd8 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioAnd8 (
> + IN UINTN Address,
> + IN UINT8 AndData
> + );
> +
> +/**
> + MmioAnd16 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioAnd16 (
> + IN UINTN Address,
> + IN UINT16 AndData
> + );
> +
> +/**
> + MmioAnd32 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioAnd32 (
> + IN UINTN Address,
> + IN UINT32 AndData
> + );
> +
> +/**
> + MmioAnd64 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioAnd64 (
> + IN UINTN Address,
> + IN UINT64 AndData
> + );
> +
> +#endif /* _BE_IOLIB_H */
> diff --git a/Platform/NXP/Library/BeIoLib/BeIoLib.c b/Platform/NXP/Library/BeIoLib/BeIoLib.c
> new file mode 100644
> index 0000000..b4e7c90
> --- /dev/null
> +++ b/Platform/NXP/Library/BeIoLib/BeIoLib.c
> @@ -0,0 +1,400 @@
> +/** BeIoLib.c
> +
> + Provide MMIO APIs for BE modules.
> +
> + Copyright 2017 NXP
> +
> + This program and the accompanying materials
> + are licensed and made available under the terms and conditions of the BSD License
> + which accompanies this distribution. The full text of the license may be found at
> + http://opensource.org/licenses/bsd-license.php
> +
> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#include <Base.h>
> +#include <Library/BaseLib.h>
> +#include <Library/IoLib.h>
> +
> +/**
> + MmioRead8 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioRead8 (
> + IN UINTN Address
> + )
> +{
> + return MmioRead8(Address);
Please put a space before (
> +}
> +
> +/**
> + MmioRead16 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioRead16 (
> + IN UINTN Address
> + )
> +{
> + return SwapBytes16(MmioRead16(Address));
and here (2x)
> +}
> +
> +/**
> + MmioRead32 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioRead32 (
> + IN UINTN Address
> + )
> +{
> + return SwapBytes32(MmioRead32(Address));
etc etc
> +}
> +
> +/**
> + MmioRead64 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioRead64 (
> + IN UINTN Address
> + )
> +{
> + return SwapBytes64(MmioRead64(Address));
> +}
> +
> +/**
> + MmioWrite8 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioWrite8 (
> + IN UINTN Address,
> + IN UINT8 Value
> + )
> +{
> + return MmioWrite8(Address, Value);
> +}
> +
> +/**
> + MmioWrite16 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioWrite16 (
> + IN UINTN Address,
> + IN UINT16 Value
> + )
> +{
> + return MmioWrite16(Address, SwapBytes16(Value));
> +}
> +
> +/**
> + MmioWrite32 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioWrite32 (
> + IN UINTN Address,
> + IN UINT32 Value
> + )
> +{
> + return MmioWrite32(Address, SwapBytes32(Value));
> +}
> +
> +/**
> + MmioWrite64 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioWrite64 (
> + IN UINTN Address,
> + IN UINT64 Value
> + )
> +{
> + return MmioWrite64(Address, SwapBytes64(Value));
> +}
> +
> +/**
> + MmioAndThenOr8 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> + @param OrData The value to OR with the result of the AND operation.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioAndThenOr8 (
> + IN UINTN Address,
> + IN UINT8 AndData,
> + IN UINT8 OrData
> + )
> +{
> + return MmioAndThenOr8(Address, AndData, OrData);
> +}
> +
> +/**
> + MmioAndThenOr16 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> + @param OrData The value to OR with the result of the AND operation.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioAndThenOr16 (
> + IN UINTN Address,
> + IN UINT16 AndData,
> + IN UINT16 OrData
> + )
> +{
> + AndData = SwapBytes16(AndData);
> + OrData = SwapBytes16(OrData);
> +
> + return MmioAndThenOr16(Address, AndData, OrData);
> +}
> +
> +/**
> + MmioAndThenOr32 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> + @param OrData The value to OR with the result of the AND operation.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioAndThenOr32 (
> + IN UINTN Address,
> + IN UINT32 AndData,
> + IN UINT32 OrData
> + )
> +{
> + AndData = SwapBytes32(AndData);
> + OrData = SwapBytes32(OrData);
> +
> + return MmioAndThenOr32(Address, AndData, OrData);
> +}
> +
> +/**
> + MmioAndThenOr64 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> + @param OrData The value to OR with the result of the AND operation.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioAndThenOr64 (
> + IN UINTN Address,
> + IN UINT64 AndData,
> + IN UINT64 OrData
> + )
> +{
> + AndData = SwapBytes64(AndData);
> + OrData = SwapBytes64(OrData);
> +
> + return MmioAndThenOr64(Address, AndData, OrData);
> +}
> +
> +/**
> + MmioOr8 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param OrData The value to OR with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioOr8 (
> + IN UINTN Address,
> + IN UINT8 OrData
> + )
> +{
> + return MmioOr8(Address, OrData);
> +}
> +
> +/**
> + MmioOr16 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param OrData The value to OR with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioOr16 (
> + IN UINTN Address,
> + IN UINT16 OrData
> + )
> +{
> + return MmioOr16(Address, SwapBytes16(OrData));
> +}
> +
> +/**
> + MmioOr32 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param OrData The value to OR with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioOr32 (
> + IN UINTN Address,
> + IN UINT32 OrData
> + )
> +{
> + return MmioOr32(Address, SwapBytes32(OrData));
> +}
> +
> +/**
> + MmioOr64 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param OrData The value to OR with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioOr64 (
> + IN UINTN Address,
> + IN UINT64 OrData
> + )
> +{
> + return MmioOr64(Address, SwapBytes64(OrData));
> +}
> +
> +/**
> + MmioAnd8 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioAnd8 (
> + IN UINTN Address,
> + IN UINT8 AndData
> + )
> +{
> + return MmioAnd8(Address, AndData);
> +}
> +
> +/**
> + MmioAnd16 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioAnd16 (
> + IN UINTN Address,
> + IN UINT16 AndData
> + )
> +{
> + return MmioAnd16(Address, SwapBytes16(AndData));
> +}
> +
> +/**
> + MmioAnd32 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioAnd32 (
> + IN UINTN Address,
> + IN UINT32 AndData
> + )
> +{
> + return MmioAnd32(Address, SwapBytes32(AndData));
> +}
> +
> +/**
> + MmioAnd64 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioAnd64 (
> + IN UINTN Address,
> + IN UINT64 AndData
> + )
> +{
> + return MmioAnd64(Address, SwapBytes64(AndData));
> +}
> diff --git a/Platform/NXP/Library/BeIoLib/BeIoLib.inf b/Platform/NXP/Library/BeIoLib/BeIoLib.inf
> new file mode 100644
> index 0000000..ca64d8f
> --- /dev/null
> +++ b/Platform/NXP/Library/BeIoLib/BeIoLib.inf
> @@ -0,0 +1,31 @@
> +## @BeIoLib.inf
> +
> +# Copyright 2017 NXP
> +#
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD License
> +# which accompanies this distribution. The full text of the license may be found at
> +# http://opensource.org/licenses/bsd-license.php
> +#
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +#
> +##
> +
> +[Defines]
> + INF_VERSION = 0x00010005
0x0001001A
> + BASE_NAME = BeIoLib
> + FILE_GUID = 28d77333-77eb-4faf-8735-130e5eb3e343
> + MODULE_TYPE = BASE
> + VERSION_STRING = 1.0
> + LIBRARY_CLASS = BeIoLib
> +
> +[Packages]
> + MdeModulePkg/MdeModulePkg.dec
> + MdePkg/MdePkg.dec
> +
> +[LibraryClasses]
> + IoLib
> +
> +[Sources.common]
> + BeIoLib.c
> --
> 1.9.1
>
^ permalink raw reply [flat|nested] 39+ messages in thread
* Re: [PATCH 03/10] Platform/NXP: Add support for Big Endian Mmio APIs
2017-11-13 12:26 ` Ard Biesheuvel
@ 2017-11-14 4:10 ` Meenakshi Aggarwal
0 siblings, 0 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-14 4:10 UTC (permalink / raw)
To: Ard Biesheuvel
Cc: Leif Lindholm, Kinney, Michael D, edk2-devel@lists.01.org,
Udit Kumar, Varun Sethi
> -----Original Message-----
> From: Ard Biesheuvel [mailto:ard.biesheuvel@linaro.org]
> Sent: Monday, November 13, 2017 5:56 PM
> To: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> Cc: Leif Lindholm <leif.lindholm@linaro.org>; Kinney, Michael D
> <michael.d.kinney@intel.com>; edk2-devel@lists.01.org; Udit Kumar
> <udit.kumar@nxp.com>; Varun Sethi <V.Sethi@nxp.com>
> Subject: Re: [PATCH 03/10] Platform/NXP: Add support for Big Endian Mmio
> APIs
>
> On 7 November 2017 at 14:42, Meenakshi Aggarwal
> <meenakshi.aggarwal@nxp.com> wrote:
> > This library add supports for BE read/write and other MMIO helper
> > function.
> > In this data swapped after reading from MMIO and before write using
> > MMIO.
> > It can be used by any module with BE address space.
> >
> > Contributed-under: TianoCore Contribution Agreement 1.1
> > Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> > ---
> > Platform/NXP/Include/Library/BeIoLib.h | 332
> +++++++++++++++++++++++++
> > Platform/NXP/Library/BeIoLib/BeIoLib.c | 400
> +++++++++++++++++++++++++++++++
> > Platform/NXP/Library/BeIoLib/BeIoLib.inf | 31 +++
> > 3 files changed, 763 insertions(+)
> > create mode 100644 Platform/NXP/Include/Library/BeIoLib.h
> > create mode 100644 Platform/NXP/Library/BeIoLib/BeIoLib.c
> > create mode 100644 Platform/NXP/Library/BeIoLib/BeIoLib.inf
> >
> > diff --git a/Platform/NXP/Include/Library/BeIoLib.h
> > b/Platform/NXP/Include/Library/BeIoLib.h
> > new file mode 100644
> > index 0000000..209262d
> > --- /dev/null
> > +++ b/Platform/NXP/Include/Library/BeIoLib.h
> > @@ -0,0 +1,332 @@
> > +/** BeIoLib.h
> > + *
> > + * Copyright 2017 NXP
> > + *
> > + * This program and the accompanying materials
> > + * are licensed and made available under the terms and conditions of
> > +the BSD License
> > + * which accompanies this distribution. The full text of the
> > +license may be found at
> > + *
> >
> +https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> e
> > +nsource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.agg
> >
> +arwal%40nxp.com%7Cd233bd96ea6c4c16416a08d52a91bdca%7C686ea1d3b
> c2b4c6f
> >
> +a92cd99c5c301635%7C0%7C0%7C636461727802004484&sdata=kL%2FOMen
> 61jeQlPG
> > +3YK2wA2oWgHFrykVMxLQcRNA63Ks%3D&reserved=0
> > + *
> > + * HE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > +BASIS,
>
> Missing T ^^^
>
Thanks for catching this.
> > + * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> > + *
> > + **/
> > +
> > +#ifndef __BE_IOLIB_H__
> > +#define __BE_IOLIB_H__
> > +
> > +#include <Base.h>
> > +
> > +/**
> > + MmioRead8 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to read.
> > +
> > + @return The value read.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +BeMmioRead8 (
> > + IN UINTN Address
> > + );
> > +
> > +/**
> > + MmioRead16 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to read.
> > +
> > + @return The value read.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +BeMmioRead16 (
> > + IN UINTN Address
> > + );
> > +
> > +/**
> > + MmioRead32 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to read.
> > +
> > + @return The value read.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +BeMmioRead32 (
> > + IN UINTN Address
> > + );
> > +
> > +/**
> > + MmioRead64 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to read.
> > +
> > + @return The value read.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +BeMmioRead64 (
> > + IN UINTN Address
> > + );
> > +
> > +/**
> > + MmioWrite8 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param Value The value to write to the MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +BeMmioWrite8 (
> > + IN UINTN Address,
> > + IN UINT8 Value
> > + );
> > +
> > +/**
> > + MmioWrite16 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param Value The value to write to the MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +BeMmioWrite16 (
> > + IN UINTN Address,
> > + IN UINT16 Value
> > + );
> > +
> > +/**
> > + MmioWrite32 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param Value The value to write to the MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +BeMmioWrite32 (
> > + IN UINTN Address,
> > + IN UINT32 Value
> > + );
> > +
> > +/**
> > + MmioWrite64 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param Value The value to write to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +BeMmioWrite64 (
> > + IN UINTN Address,
> > + IN UINT64 Value
> > + );
> > +
> > +/**
> > + MmioAndThenOr8 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > + @param OrData The value to OR with the result of the AND operation.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +BeMmioAndThenOr8 (
> > + IN UINTN Address,
> > + IN UINT8 AndData,
> > + IN UINT8 OrData
> > + );
> > +
> > +/**
> > + MmioAndThenOr16 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > + @param OrData The value to OR with the result of the AND operation.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +BeMmioAndThenOr16 (
> > + IN UINTN Address,
> > + IN UINT16 AndData,
> > + IN UINT16 OrData
> > + );
> > +
> > +/**
> > + MmioAndThenOr32 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > + @param OrData The value to OR with the result of the AND operation.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +BeMmioAndThenOr32 (
> > + IN UINTN Address,
> > + IN UINT32 AndData,
> > + IN UINT32 OrData
> > + );
> > +
> > +/**
> > + MmioAndThenOr64 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > + @param OrData The value to OR with the result of the AND operation.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +BeMmioAndThenOr64 (
> > + IN UINTN Address,
> > + IN UINT64 AndData,
> > + IN UINT64 OrData
> > + );
> > +
> > +/**
> > + MmioOr8 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param OrData The value to OR with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +BeMmioOr8 (
> > + IN UINTN Address,
> > + IN UINT8 OrData
> > + );
> > +
> > +/**
> > + MmioOr16 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param OrData The value to OR with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +BeMmioOr16 (
> > + IN UINTN Address,
> > + IN UINT16 OrData
> > + );
> > +
> > +/**
> > + MmioOr32 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param OrData The value to OR with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +BeMmioOr32 (
> > + IN UINTN Address,
> > + IN UINT32 OrData
> > + );
> > +
> > +/**
> > + MmioOr64 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param OrData The value to OR with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +BeMmioOr64 (
> > + IN UINTN Address,
> > + IN UINT64 OrData
> > + );
> > +
> > +/**
> > + MmioAnd8 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +BeMmioAnd8 (
> > + IN UINTN Address,
> > + IN UINT8 AndData
> > + );
> > +
> > +/**
> > + MmioAnd16 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +BeMmioAnd16 (
> > + IN UINTN Address,
> > + IN UINT16 AndData
> > + );
> > +
> > +/**
> > + MmioAnd32 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +BeMmioAnd32 (
> > + IN UINTN Address,
> > + IN UINT32 AndData
> > + );
> > +
> > +/**
> > + MmioAnd64 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +BeMmioAnd64 (
> > + IN UINTN Address,
> > + IN UINT64 AndData
> > + );
> > +
> > +#endif /* _BE_IOLIB_H */
> > diff --git a/Platform/NXP/Library/BeIoLib/BeIoLib.c
> > b/Platform/NXP/Library/BeIoLib/BeIoLib.c
> > new file mode 100644
> > index 0000000..b4e7c90
> > --- /dev/null
> > +++ b/Platform/NXP/Library/BeIoLib/BeIoLib.c
> > @@ -0,0 +1,400 @@
> > +/** BeIoLib.c
> > +
> > + Provide MMIO APIs for BE modules.
> > +
> > + Copyright 2017 NXP
> > +
> > + This program and the accompanying materials are licensed and made
> > + available under the terms and conditions of the BSD License which
> > + accompanies this distribution. The full text of the license may be
> > + found at
> > +
> > +
> https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> > + ensource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.a
> > +
> ggarwal%40nxp.com%7Cd233bd96ea6c4c16416a08d52a91bdca%7C686ea1d3
> bc2b4
> > +
> c6fa92cd99c5c301635%7C0%7C0%7C636461727802004484&sdata=kL%2FOMe
> n61je
> > + QlPG3YK2wA2oWgHFrykVMxLQcRNA63Ks%3D&reserved=0
> > +
> > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > + BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +
> > +**/
> > +
> > +#include <Base.h>
> > +#include <Library/BaseLib.h>
> > +#include <Library/IoLib.h>
> > +
> > +/**
> > + MmioRead8 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to read.
> > +
> > + @return The value read.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +BeMmioRead8 (
> > + IN UINTN Address
> > + )
> > +{
> > + return MmioRead8(Address);
>
> Please put a space before (
>
OK
> > +}
> > +
> > +/**
> > + MmioRead16 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to read.
> > +
> > + @return The value read.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +BeMmioRead16 (
> > + IN UINTN Address
> > + )
> > +{
> > + return SwapBytes16(MmioRead16(Address));
>
> and here (2x)
>
> > +}
> > +
> > +/**
> > + MmioRead32 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to read.
> > +
> > + @return The value read.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +BeMmioRead32 (
> > + IN UINTN Address
> > + )
> > +{
> > + return SwapBytes32(MmioRead32(Address));
>
> etc etc
>
> > +}
> > +
> > +/**
> > + MmioRead64 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to read.
> > +
> > + @return The value read.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +BeMmioRead64 (
> > + IN UINTN Address
> > + )
> > +{
> > + return SwapBytes64(MmioRead64(Address)); }
> > +
> > +/**
> > + MmioWrite8 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param Value The value to write to the MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +BeMmioWrite8 (
> > + IN UINTN Address,
> > + IN UINT8 Value
> > + )
> > +{
> > + return MmioWrite8(Address, Value);
> > +}
> > +
> > +/**
> > + MmioWrite16 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param Value The value to write to the MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +BeMmioWrite16 (
> > + IN UINTN Address,
> > + IN UINT16 Value
> > + )
> > +{
> > + return MmioWrite16(Address, SwapBytes16(Value)); }
> > +
> > +/**
> > + MmioWrite32 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param Value The value to write to the MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +BeMmioWrite32 (
> > + IN UINTN Address,
> > + IN UINT32 Value
> > + )
> > +{
> > + return MmioWrite32(Address, SwapBytes32(Value)); }
> > +
> > +/**
> > + MmioWrite64 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param Value The value to write to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +BeMmioWrite64 (
> > + IN UINTN Address,
> > + IN UINT64 Value
> > + )
> > +{
> > + return MmioWrite64(Address, SwapBytes64(Value)); }
> > +
> > +/**
> > + MmioAndThenOr8 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > + @param OrData The value to OR with the result of the AND operation.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +BeMmioAndThenOr8 (
> > + IN UINTN Address,
> > + IN UINT8 AndData,
> > + IN UINT8 OrData
> > + )
> > +{
> > + return MmioAndThenOr8(Address, AndData, OrData); }
> > +
> > +/**
> > + MmioAndThenOr16 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > + @param OrData The value to OR with the result of the AND operation.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +BeMmioAndThenOr16 (
> > + IN UINTN Address,
> > + IN UINT16 AndData,
> > + IN UINT16 OrData
> > + )
> > +{
> > + AndData = SwapBytes16(AndData);
> > + OrData = SwapBytes16(OrData);
> > +
> > + return MmioAndThenOr16(Address, AndData, OrData); }
> > +
> > +/**
> > + MmioAndThenOr32 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > + @param OrData The value to OR with the result of the AND operation.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +BeMmioAndThenOr32 (
> > + IN UINTN Address,
> > + IN UINT32 AndData,
> > + IN UINT32 OrData
> > + )
> > +{
> > + AndData = SwapBytes32(AndData);
> > + OrData = SwapBytes32(OrData);
> > +
> > + return MmioAndThenOr32(Address, AndData, OrData); }
> > +
> > +/**
> > + MmioAndThenOr64 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > + @param OrData The value to OR with the result of the AND operation.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +BeMmioAndThenOr64 (
> > + IN UINTN Address,
> > + IN UINT64 AndData,
> > + IN UINT64 OrData
> > + )
> > +{
> > + AndData = SwapBytes64(AndData);
> > + OrData = SwapBytes64(OrData);
> > +
> > + return MmioAndThenOr64(Address, AndData, OrData); }
> > +
> > +/**
> > + MmioOr8 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param OrData The value to OR with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +BeMmioOr8 (
> > + IN UINTN Address,
> > + IN UINT8 OrData
> > + )
> > +{
> > + return MmioOr8(Address, OrData);
> > +}
> > +
> > +/**
> > + MmioOr16 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param OrData The value to OR with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +BeMmioOr16 (
> > + IN UINTN Address,
> > + IN UINT16 OrData
> > + )
> > +{
> > + return MmioOr16(Address, SwapBytes16(OrData)); }
> > +
> > +/**
> > + MmioOr32 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param OrData The value to OR with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +BeMmioOr32 (
> > + IN UINTN Address,
> > + IN UINT32 OrData
> > + )
> > +{
> > + return MmioOr32(Address, SwapBytes32(OrData)); }
> > +
> > +/**
> > + MmioOr64 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param OrData The value to OR with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +BeMmioOr64 (
> > + IN UINTN Address,
> > + IN UINT64 OrData
> > + )
> > +{
> > + return MmioOr64(Address, SwapBytes64(OrData)); }
> > +
> > +/**
> > + MmioAnd8 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +BeMmioAnd8 (
> > + IN UINTN Address,
> > + IN UINT8 AndData
> > + )
> > +{
> > + return MmioAnd8(Address, AndData);
> > +}
> > +
> > +/**
> > + MmioAnd16 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +BeMmioAnd16 (
> > + IN UINTN Address,
> > + IN UINT16 AndData
> > + )
> > +{
> > + return MmioAnd16(Address, SwapBytes16(AndData)); }
> > +
> > +/**
> > + MmioAnd32 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +BeMmioAnd32 (
> > + IN UINTN Address,
> > + IN UINT32 AndData
> > + )
> > +{
> > + return MmioAnd32(Address, SwapBytes32(AndData)); }
> > +
> > +/**
> > + MmioAnd64 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +BeMmioAnd64 (
> > + IN UINTN Address,
> > + IN UINT64 AndData
> > + )
> > +{
> > + return MmioAnd64(Address, SwapBytes64(AndData)); }
> > diff --git a/Platform/NXP/Library/BeIoLib/BeIoLib.inf
> > b/Platform/NXP/Library/BeIoLib/BeIoLib.inf
> > new file mode 100644
> > index 0000000..ca64d8f
> > --- /dev/null
> > +++ b/Platform/NXP/Library/BeIoLib/BeIoLib.inf
> > @@ -0,0 +1,31 @@
> > +## @BeIoLib.inf
> > +
> > +# Copyright 2017 NXP
> > +#
> > +# This program and the accompanying materials # are licensed and
> > +made available under the terms and conditions of the BSD License #
> > +which accompanies this distribution. The full text of the license
> > +may be found at #
> >
> +https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> e
> > +nsource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.agg
> >
> +arwal%40nxp.com%7Cd233bd96ea6c4c16416a08d52a91bdca%7C686ea1d3b
> c2b4c6f
> >
> +a92cd99c5c301635%7C0%7C0%7C636461727802004484&sdata=kL%2FOMen
> 61jeQlPG
> > +3YK2wA2oWgHFrykVMxLQcRNA63Ks%3D&reserved=0
> > +#
> > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > +BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +#
> > +##
> > +
> > +[Defines]
> > + INF_VERSION = 0x00010005
>
> 0x0001001A
>
OK, will correct in all patches.
> > + BASE_NAME = BeIoLib
> > + FILE_GUID = 28d77333-77eb-4faf-8735-130e5eb3e343
> > + MODULE_TYPE = BASE
> > + VERSION_STRING = 1.0
> > + LIBRARY_CLASS = BeIoLib
> > +
> > +[Packages]
> > + MdeModulePkg/MdeModulePkg.dec
> > + MdePkg/MdePkg.dec
> > +
> > +[LibraryClasses]
> > + IoLib
> > +
> > +[Sources.common]
> > + BeIoLib.c
> > --
> > 1.9.1
> >
^ permalink raw reply [flat|nested] 39+ messages in thread
* [PATCH 04/10] Platform/NXP : Add support for Watchdog driver
2017-11-07 14:42 [PATCH 00/10] edk2-platforms/Platform/NXP Meenakshi Aggarwal
` (2 preceding siblings ...)
2017-11-07 14:42 ` [PATCH 03/10] Platform/NXP: Add support for Big Endian Mmio APIs Meenakshi Aggarwal
@ 2017-11-07 14:42 ` Meenakshi Aggarwal
2017-11-13 12:23 ` Ard Biesheuvel
2017-11-07 14:42 ` [PATCH 05/10] Platform/NXP : Add support for DUART library Meenakshi Aggarwal
` (6 subsequent siblings)
10 siblings, 1 reply; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-07 14:42 UTC (permalink / raw)
To: ard.biesheuvel, leif.lindholm, michael.d.kinney, edk2-devel
Installs watchdog timer arch protocol
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
---
Platform/NXP/Drivers/WatchDog/WatchDog.c | 386 ++++++++++++++++++++++++++
Platform/NXP/Drivers/WatchDog/WatchDog.h | 37 +++
Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf | 47 ++++
3 files changed, 470 insertions(+)
create mode 100644 Platform/NXP/Drivers/WatchDog/WatchDog.c
create mode 100644 Platform/NXP/Drivers/WatchDog/WatchDog.h
create mode 100644 Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf
diff --git a/Platform/NXP/Drivers/WatchDog/WatchDog.c b/Platform/NXP/Drivers/WatchDog/WatchDog.c
new file mode 100644
index 0000000..f257a1d
--- /dev/null
+++ b/Platform/NXP/Drivers/WatchDog/WatchDog.c
@@ -0,0 +1,386 @@
+/** WatchDog.c
+*
+* Based on Watchdog driver implemenation available in
+* ArmPlatformPkg/Drivers/SP805WatchdogDxe/SP805Watchdog.c
+*
+* Copyright (c) 2011-2013, ARM Limited. All rights reserved.
+* Copyright 2017 NXP
+*
+* This program and the accompanying materials
+* are licensed and made available under the terms and conditions of the BSD License
+* which accompanies this distribution. The full text of the license may be found at
+* http://opensource.org/licenses/bsd-license.php
+*
+* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#include <PiDxe.h>
+#include <Library/BaseLib.h>
+#include <Library/BeIoLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IoLib.h>
+#include <Library/PcdLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Protocol/WatchdogTimer.h>
+
+#include "WatchDog.h"
+
+EFI_EVENT EfiExitBootServicesEvent = (EFI_EVENT)NULL;
+
+UINT16
+EFIAPI
+WdogRead (
+ IN UINTN Address
+ )
+{
+ if (FixedPcdGetBool(PcdWdogBigEndian)) {
+ return BeMmioRead16(Address);
+ } else {
+ return MmioRead16(Address);
+ }
+}
+
+UINT16
+EFIAPI
+WdogWrite (
+ IN UINTN Address,
+ IN UINT16 Value
+ )
+{
+ if (FixedPcdGetBool(PcdWdogBigEndian)) {
+ return BeMmioWrite16(Address, Value);
+ } else {
+ return MmioWrite16(Address, Value);
+ }
+}
+
+STATIC
+VOID
+WdogPing (
+ VOID
+ )
+{
+ WdogWrite(PcdGet64(PcdWdog1BaseAddr) + WDOG_WSR_OFFSET,
+ WDOG_SERVICE_SEQ1);
+ WdogWrite(PcdGet64(PcdWdog1BaseAddr) + WDOG_WSR_OFFSET,
+ WDOG_SERVICE_SEQ2);
+}
+
+/**
+ Stop the Wdog watchdog timer from counting down.
+**/
+STATIC
+VOID
+WdogStop (
+ VOID
+ )
+{
+ // Watchdog cannot be disabled by software once started.
+ // At best, we can keep pinging the watchdog
+ WdogPing();
+}
+
+/**
+ Starts the Wdog counting down by feeding Service register with
+ desired pattern.
+ The count down will start from the value stored in the Load register,
+ not from the value where it was previously stopped.
+**/
+STATIC
+VOID
+WdogStart (
+ VOID
+ )
+{
+ /* Reload the timeout value */
+ WdogPing();
+}
+
+/**
+ On exiting boot services we must make sure the Wdog Watchdog Timer
+ is stopped.
+**/
+VOID
+EFIAPI
+ExitBootServicesEvent (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ WdogStop();
+}
+
+/**
+ This function registers the handler NotifyFunction so it is called every time
+ the watchdog timer expires. It also passes the amount of time since the last
+ handler call to the NotifyFunction.
+ If NotifyFunction is not NULL and a handler is not already registered,
+ then the new handler is registered and EFI_SUCCESS is returned.
+ If NotifyFunction is NULL, and a handler is already registered,
+ then that handler is unregistered.
+ If an attempt is made to register a handler when a handler is already registered,
+ then EFI_ALREADY_STARTED is returned.
+ If an attempt is made to unregister a handler when a handler is not registered,
+ then EFI_INVALID_PARAMETER is returned.
+
+ @param This The EFI_TIMER_ARCH_PROTOCOL instance.
+ @param NotifyFunction The function to call when a timer interrupt fires. This
+ function executes at TPL_HIGH_LEVEL. The DXE Core will
+ register a handler for the timer interrupt, so it can know
+ how much time has passed. This information is used to
+ signal timer based events. NULL will unregister the handler.
+
+ @retval EFI_SUCCESS The watchdog timer handler was registered.
+ @retval EFI_ALREADY_STARTED NotifyFunction is not NULL, and a handler is already
+ registered.
+ @retval EFI_INVALID_PARAMETER NotifyFunction is NULL, and a handler was not
+ previously registered.
+
+**/
+EFI_STATUS
+EFIAPI
+WdogRegisterHandler (
+ IN CONST EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
+ IN EFI_WATCHDOG_TIMER_NOTIFY NotifyFunction
+ )
+{
+ // ERROR: This function is not supported.
+ // The hardware watchdog will reset the board
+ return EFI_INVALID_PARAMETER;
+}
+
+/**
+
+ This function adjusts the period of timer interrupts to the value specified
+ by TimerPeriod. If the timer period is updated, then the selected timer
+ period is stored in EFI_TIMER.TimerPeriod, and EFI_SUCCESS is returned. If
+ the timer hardware is not programmable, then EFI_UNSUPPORTED is returned.
+ If an error occurs while attempting to update the timer period, then the
+ timer hardware will be put back in its state prior to this call, and
+ EFI_DEVICE_ERROR is returned. If TimerPeriod is 0, then the timer interrupt
+ is disabled. This is not the same as disabling the CPU's interrupts.
+ Instead, it must either turn off the timer hardware, or it must adjust the
+ interrupt controller so that a CPU interrupt is not generated when the timer
+ interrupt fires.
+
+ @param This The EFI_TIMER_ARCH_PROTOCOL instance.
+ @param TimerPeriod The rate to program the timer interrupt in 100 nS units. If
+ the timer hardware is not programmable, then EFI_UNSUPPORTED is
+ returned. If the timer is programmable, then the timer period
+ will be rounded up to the nearest timer period that is supported
+ by the timer hardware. If TimerPeriod is set to 0, then the
+ timer interrupts will be disabled.
+
+
+ @retval EFI_SUCCESS The timer period was changed.
+ @retval EFI_UNSUPPORTED The platform cannot change the period of the timer interrupt.
+ @retval EFI_DEVICE_ERROR The timer period could not be changed due to a device error.
+
+**/
+EFI_STATUS
+EFIAPI
+WdogSetTimerPeriod (
+ IN CONST EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
+ IN UINT64 TimerPeriod // In 100ns units
+ )
+{
+ EFI_STATUS Status;
+ UINT64 TimerPeriodInSec;
+ UINT16 Val;
+
+ Status = EFI_SUCCESS;
+
+ if (TimerPeriod == 0) {
+ // This is a watchdog stop request
+ WdogStop();
+ goto EXIT;
+ } else {
+ // Convert the TimerPeriod (in 100 ns unit) to an equivalent second value
+
+ TimerPeriodInSec = DivU64x32(TimerPeriod, NANO_SECOND_BASE);
+
+ // The registers in the Wdog are only 32 bits
+ if(TimerPeriodInSec > WT_MAX_TIME) {
+ // We could load the watchdog with the maximum supported value but
+ // if a smaller value was requested, this could have the watchdog
+ // triggering before it was intended.
+ // Better generate an error to let the caller know.
+ Status = EFI_DEVICE_ERROR;
+ goto EXIT;
+ }
+
+ // set the new timeout value in the WCR
+ Val = WdogRead(PcdGet64(PcdWdog1BaseAddr) + WDOG_WCR_OFFSET);
+ Val &= ~WDOG_WCR_WT;
+ // Convert the timeout value from Seconds to timer count
+ Val |= ((WD_COUNT(TimerPeriodInSec) & WD_COUNT_MASK) << 8);
+ WdogWrite(PcdGet64(PcdWdog1BaseAddr) + WDOG_WCR_OFFSET, Val);
+
+ // Start the watchdog
+ WdogStart();
+ }
+
+ EXIT:
+ return Status;
+}
+
+/**
+ This function retrieves the period of timer interrupts in 100 ns units,
+ returns that value in TimerPeriod, and returns EFI_SUCCESS. If TimerPeriod
+ is NULL, then EFI_INVALID_PARAMETER is returned. If a TimerPeriod of 0 is
+ returned, then the timer is currently disabled.
+
+ @param This The EFI_TIMER_ARCH_PROTOCOL instance.
+ @param TimerPeriod A pointer to the timer period to retrieve in 100 ns units. If
+ 0 is returned, then the timer is currently disabled.
+
+
+ @retval EFI_SUCCESS The timer period was returned in TimerPeriod.
+ @retval EFI_INVALID_PARAMETER TimerPeriod is NULL.
+
+**/
+EFI_STATUS
+EFIAPI
+WdogGetTimerPeriod (
+ IN CONST EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
+ OUT UINT64 *TimerPeriod
+ )
+{
+ EFI_STATUS Status;
+ UINT64 ReturnValue;
+ UINT16 Val;
+
+ Status = EFI_SUCCESS;
+
+ if (TimerPeriod == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ // Check if the watchdog is stopped
+ if ((WdogRead(PcdGet64(PcdWdog1BaseAddr) + WDOG_WCR_OFFSET)
+ & WDOG_WCR_WDE) == 0 ) {
+ // It is stopped, so return zero.
+ ReturnValue = 0;
+ } else {
+ // Convert the Watchdog ticks into equivalent TimerPeriod second value.
+ Val = (WdogRead(PcdGet64(PcdWdog1BaseAddr) + WDOG_WCR_OFFSET)
+ & WDOG_WCR_WT ) >> 8;
+ ReturnValue = WD_SEC(Val);
+ }
+
+ *TimerPeriod = ReturnValue;
+ return Status;
+}
+
+/**
+ Interface structure for the Watchdog Architectural Protocol.
+
+ @par Protocol Description:
+ This protocol provides a service to set the amount of time to wait
+ before firing the watchdog timer, and it also provides a service to
+ register a handler that is invoked when the watchdog timer fires.
+
+ @par When the watchdog timer fires, control will be passed to a handler
+ if one has been registered. If no handler has been registered,
+ or the registered handler returns, then the system will be
+ reset by calling the Runtime Service ResetSystem().
+
+ @param RegisterHandler
+ Registers a handler that will be called each time the
+ watchdogtimer interrupt fires. TimerPeriod defines the minimum
+ time between timer interrupts, so TimerPeriod will also
+ be the minimum time between calls to the registered
+ handler.
+ NOTE: If the watchdog resets the system in hardware, then
+ this function will not have any chance of executing.
+
+ @param SetTimerPeriod
+ Sets the period of the timer interrupt in 100 nS units.
+ This function is optional, and may return EFI_UNSUPPORTED.
+ If this function is supported, then the timer period will
+ be rounded up to the nearest supported timer period.
+
+ @param GetTimerPeriod
+ Retrieves the period of the timer interrupt in 100 nS units.
+
+**/
+EFI_WATCHDOG_TIMER_ARCH_PROTOCOL gWatchdogTimer = {
+ (EFI_WATCHDOG_TIMER_REGISTER_HANDLER) WdogRegisterHandler,
+ (EFI_WATCHDOG_TIMER_SET_TIMER_PERIOD) WdogSetTimerPeriod,
+ (EFI_WATCHDOG_TIMER_GET_TIMER_PERIOD) WdogGetTimerPeriod
+};
+
+/**
+ Initialize state information for the Watchdog Timer Architectural Protocol.
+
+ @param ImageHandle of the loaded driver
+ @param SystemTable Pointer to the System Table
+
+ @retval EFI_SUCCESS Protocol registered
+ @retval EFI_OUT_OF_RESOURCES Cannot allocate protocol data structure
+ @retval EFI_DEVICE_ERROR Hardware problems
+
+**/
+EFI_STATUS
+EFIAPI
+WdogInitialize (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EFI_STATUS Status;
+ EFI_HANDLE Handle;
+ UINT16 Val;
+
+
+ Val = WdogRead(PcdGet64(PcdWdog1BaseAddr) + WDOG_WCR_OFFSET);
+
+ Val &= ~WDOG_WCR_WT;
+
+ Val &= ~WDOG_WCR_WDE;
+
+ Val |= WD_COUNT(WT_MAX_TIME) & WD_COUNT_MASK;
+
+ WdogWrite(PcdGet64(PcdWdog1BaseAddr) + WDOG_WCR_OFFSET, Val);
+
+ Val |= WDOG_WCR_WDE;
+
+ //
+ // Make sure the Watchdog Timer Architectural Protocol
+ // has not been installed in the system yet.
+ // This will avoid conflicts with the universal watchdog
+ //
+ ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiWatchdogTimerArchProtocolGuid);
+
+ // Register for an ExitBootServicesEvent
+ Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY,
+ ExitBootServicesEvent, NULL, &EfiExitBootServicesEvent);
+ if (EFI_ERROR(Status)) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto EXIT;
+ }
+
+ // Install the Timer Architectural Protocol onto a new handle
+ Handle = NULL;
+ Status = gBS->InstallMultipleProtocolInterfaces(
+ &Handle,
+ &gEfiWatchdogTimerArchProtocolGuid, &gWatchdogTimer,
+ NULL
+ );
+ if (EFI_ERROR(Status)) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto EXIT;
+ }
+
+EXIT:
+ if(EFI_ERROR(Status)) {
+ // The watchdog failed to initialize
+ ASSERT(FALSE);
+ }
+
+ WdogPing();
+
+ return Status;
+}
diff --git a/Platform/NXP/Drivers/WatchDog/WatchDog.h b/Platform/NXP/Drivers/WatchDog/WatchDog.h
new file mode 100644
index 0000000..56ddbde
--- /dev/null
+++ b/Platform/NXP/Drivers/WatchDog/WatchDog.h
@@ -0,0 +1,37 @@
+/** WatchDog.h
+*
+* Copyright 2017 NXP
+*
+* This program and the accompanying materials
+* are licensed and made available under the terms and conditions of the BSD License
+* which accompanies this distribution. The full text of the license may be found at
+* http://opensource.org/licenses/bsd-license.php
+*
+* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#ifndef __WATCHDOG_H__
+#define __WATCHDOG_H__
+
+#define WDOG_SIZE 0x1000
+#define WDOG_WCR_OFFSET 0
+#define WDOG_WSR_OFFSET 2
+#define WDOG_WRSR_OFFSET 4
+#define WDOG_WICR_OFFSET 6
+#define WDOG_WCR_WT (0xFF << 8)
+#define WDOG_WCR_WDE (1 << 2)
+#define WDOG_SERVICE_SEQ1 0x5555
+#define WDOG_SERVICE_SEQ2 0xAAAA
+#define WDOG_WCR_WDZST 0x1
+#define WDOG_WCR_WRE (1 << 3) /* -> WDOG Reset Enable */
+
+#define WT_MAX_TIME 128
+#define WD_COUNT(Sec) (((Sec) * 2 - 1) << 8)
+#define WD_COUNT_MASK 0xff00
+#define WD_SEC(Cnt) (((Cnt) + 1) / 2)
+
+#define NANO_SECOND_BASE 10000000
+
+#endif //__WATCHDOG_H__
diff --git a/Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf b/Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf
new file mode 100644
index 0000000..4cf7d84
--- /dev/null
+++ b/Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf
@@ -0,0 +1,47 @@
+# WatchDog.inf
+#
+# Component description file for WatchDog module
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = WatchDogDxe
+ FILE_GUID = ebd705fb-fa92-46a7-b32b-7f566d944614
+ MODULE_TYPE = DXE_DRIVER
+ VERSION_STRING = 1.0
+ ENTRY_POINT = WdogInitialize
+
+[Sources.common]
+ WatchDog.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ edk2-platforms/Platform/NXP/NxpQoriqLs.dec
+
+[LibraryClasses]
+ BaseLib
+ BeIoLib
+ PcdLib
+ UefiBootServicesTableLib
+ UefiDriverEntryPoint
+
+[Pcd]
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog1BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdWdogBigEndian
+
+[Protocols]
+ gEfiWatchdogTimerArchProtocolGuid
+
+[Depex]
+ TRUE
--
1.9.1
^ permalink raw reply related [flat|nested] 39+ messages in thread
* Re: [PATCH 04/10] Platform/NXP : Add support for Watchdog driver
2017-11-07 14:42 ` [PATCH 04/10] Platform/NXP : Add support for Watchdog driver Meenakshi Aggarwal
@ 2017-11-13 12:23 ` Ard Biesheuvel
2017-11-14 5:36 ` Meenakshi Aggarwal
0 siblings, 1 reply; 39+ messages in thread
From: Ard Biesheuvel @ 2017-11-13 12:23 UTC (permalink / raw)
To: Meenakshi Aggarwal
Cc: Leif Lindholm, Kinney, Michael D, edk2-devel@lists.01.org,
Udit Kumar, Varun Sethi
On 7 November 2017 at 14:42, Meenakshi Aggarwal
<meenakshi.aggarwal@nxp.com> wrote:
> Installs watchdog timer arch protocol
>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> ---
> Platform/NXP/Drivers/WatchDog/WatchDog.c | 386 ++++++++++++++++++++++++++
> Platform/NXP/Drivers/WatchDog/WatchDog.h | 37 +++
> Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf | 47 ++++
> 3 files changed, 470 insertions(+)
> create mode 100644 Platform/NXP/Drivers/WatchDog/WatchDog.c
> create mode 100644 Platform/NXP/Drivers/WatchDog/WatchDog.h
> create mode 100644 Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf
>
> diff --git a/Platform/NXP/Drivers/WatchDog/WatchDog.c b/Platform/NXP/Drivers/WatchDog/WatchDog.c
> new file mode 100644
> index 0000000..f257a1d
> --- /dev/null
> +++ b/Platform/NXP/Drivers/WatchDog/WatchDog.c
> @@ -0,0 +1,386 @@
> +/** WatchDog.c
> +*
> +* Based on Watchdog driver implemenation available in
> +* ArmPlatformPkg/Drivers/SP805WatchdogDxe/SP805Watchdog.c
> +*
> +* Copyright (c) 2011-2013, ARM Limited. All rights reserved.
> +* Copyright 2017 NXP
> +*
> +* This program and the accompanying materials
> +* are licensed and made available under the terms and conditions of the BSD License
> +* which accompanies this distribution. The full text of the license may be found at
> +* http://opensource.org/licenses/bsd-license.php
> +*
> +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +#include <PiDxe.h>
> +#include <Library/BaseLib.h>
> +#include <Library/BeIoLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Protocol/WatchdogTimer.h>
> +
> +#include "WatchDog.h"
> +
STATIC please, and drop the redundant initializer.
> +EFI_EVENT EfiExitBootServicesEvent = (EFI_EVENT)NULL;
> +
STATIC
In general, any function that is not exported from the driver should
be STATIC, even if it is referenced from a protocol struct
> +UINT16
> +EFIAPI
> +WdogRead (
> + IN UINTN Address
> + )
> +{
> + if (FixedPcdGetBool(PcdWdogBigEndian)) {
In general, but I will mention it here: every function call or macro
invocation requires a space before (
> + return BeMmioRead16(Address);
> + } else {
> + return MmioRead16(Address);
> + }
> +}
> +
> +UINT16
> +EFIAPI
> +WdogWrite (
> + IN UINTN Address,
> + IN UINT16 Value
> + )
> +{
> + if (FixedPcdGetBool(PcdWdogBigEndian)) {
> + return BeMmioWrite16(Address, Value);
> + } else {
> + return MmioWrite16(Address, Value);
> + }
> +}
> +
> +STATIC
> +VOID
> +WdogPing (
> + VOID
> + )
> +{
> + WdogWrite(PcdGet64(PcdWdog1BaseAddr) + WDOG_WSR_OFFSET,
> + WDOG_SERVICE_SEQ1);
> + WdogWrite(PcdGet64(PcdWdog1BaseAddr) + WDOG_WSR_OFFSET,
> + WDOG_SERVICE_SEQ2);
> +}
> +
> +/**
> + Stop the Wdog watchdog timer from counting down.
> +**/
> +STATIC
> +VOID
> +WdogStop (
> + VOID
> + )
> +{
> + // Watchdog cannot be disabled by software once started.
> + // At best, we can keep pinging the watchdog
> + WdogPing();
How is this supposed to work when entering the OS?
> +}
> +
> +/**
> + Starts the Wdog counting down by feeding Service register with
> + desired pattern.
> + The count down will start from the value stored in the Load register,
> + not from the value where it was previously stopped.
> +**/
> +STATIC
> +VOID
> +WdogStart (
> + VOID
> + )
> +{
> + /* Reload the timeout value */
> + WdogPing();
> +}
> +
> +/**
> + On exiting boot services we must make sure the Wdog Watchdog Timer
> + is stopped.
> +**/
> +VOID
> +EFIAPI
> +ExitBootServicesEvent (
> + IN EFI_EVENT Event,
> + IN VOID *Context
> + )
> +{
> + WdogStop();
The comment above says this is impossible.
> +}
> +
> +/**
> + This function registers the handler NotifyFunction so it is called every time
> + the watchdog timer expires. It also passes the amount of time since the last
> + handler call to the NotifyFunction.
> + If NotifyFunction is not NULL and a handler is not already registered,
> + then the new handler is registered and EFI_SUCCESS is returned.
> + If NotifyFunction is NULL, and a handler is already registered,
> + then that handler is unregistered.
> + If an attempt is made to register a handler when a handler is already registered,
> + then EFI_ALREADY_STARTED is returned.
> + If an attempt is made to unregister a handler when a handler is not registered,
> + then EFI_INVALID_PARAMETER is returned.
> +
> + @param This The EFI_TIMER_ARCH_PROTOCOL instance.
> + @param NotifyFunction The function to call when a timer interrupt fires. This
> + function executes at TPL_HIGH_LEVEL. The DXE Core will
> + register a handler for the timer interrupt, so it can know
> + how much time has passed. This information is used to
> + signal timer based events. NULL will unregister the handler.
> +
> + @retval EFI_SUCCESS The watchdog timer handler was registered.
> + @retval EFI_ALREADY_STARTED NotifyFunction is not NULL, and a handler is already
> + registered.
> + @retval EFI_INVALID_PARAMETER NotifyFunction is NULL, and a handler was not
> + previously registered.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +WdogRegisterHandler (
> + IN CONST EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
> + IN EFI_WATCHDOG_TIMER_NOTIFY NotifyFunction
> + )
> +{
> + // ERROR: This function is not supported.
> + // The hardware watchdog will reset the board
> + return EFI_INVALID_PARAMETER;
Doesn't this violate the protocol? Why does it make sense to implement
the protocol based on this hardware?
> +}
> +
> +/**
> +
> + This function adjusts the period of timer interrupts to the value specified
> + by TimerPeriod. If the timer period is updated, then the selected timer
> + period is stored in EFI_TIMER.TimerPeriod, and EFI_SUCCESS is returned. If
> + the timer hardware is not programmable, then EFI_UNSUPPORTED is returned.
> + If an error occurs while attempting to update the timer period, then the
> + timer hardware will be put back in its state prior to this call, and
> + EFI_DEVICE_ERROR is returned. If TimerPeriod is 0, then the timer interrupt
> + is disabled. This is not the same as disabling the CPU's interrupts.
> + Instead, it must either turn off the timer hardware, or it must adjust the
> + interrupt controller so that a CPU interrupt is not generated when the timer
> + interrupt fires.
> +
> + @param This The EFI_TIMER_ARCH_PROTOCOL instance.
> + @param TimerPeriod The rate to program the timer interrupt in 100 nS units. If
> + the timer hardware is not programmable, then EFI_UNSUPPORTED is
> + returned. If the timer is programmable, then the timer period
> + will be rounded up to the nearest timer period that is supported
> + by the timer hardware. If TimerPeriod is set to 0, then the
> + timer interrupts will be disabled.
> +
> +
> + @retval EFI_SUCCESS The timer period was changed.
> + @retval EFI_UNSUPPORTED The platform cannot change the period of the timer interrupt.
> + @retval EFI_DEVICE_ERROR The timer period could not be changed due to a device error.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +WdogSetTimerPeriod (
> + IN CONST EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
> + IN UINT64 TimerPeriod // In 100ns units
> + )
> +{
> + EFI_STATUS Status;
> + UINT64 TimerPeriodInSec;
> + UINT16 Val;
> +
> + Status = EFI_SUCCESS;
> +
> + if (TimerPeriod == 0) {
> + // This is a watchdog stop request
> + WdogStop();
> + goto EXIT;
> + } else {
> + // Convert the TimerPeriod (in 100 ns unit) to an equivalent second value
> +
> + TimerPeriodInSec = DivU64x32(TimerPeriod, NANO_SECOND_BASE);
> +
> + // The registers in the Wdog are only 32 bits
> + if(TimerPeriodInSec > WT_MAX_TIME) {
> + // We could load the watchdog with the maximum supported value but
> + // if a smaller value was requested, this could have the watchdog
> + // triggering before it was intended.
> + // Better generate an error to let the caller know.
> + Status = EFI_DEVICE_ERROR;
> + goto EXIT;
> + }
> +
> + // set the new timeout value in the WCR
> + Val = WdogRead(PcdGet64(PcdWdog1BaseAddr) + WDOG_WCR_OFFSET);
> + Val &= ~WDOG_WCR_WT;
> + // Convert the timeout value from Seconds to timer count
> + Val |= ((WD_COUNT(TimerPeriodInSec) & WD_COUNT_MASK) << 8);
> + WdogWrite(PcdGet64(PcdWdog1BaseAddr) + WDOG_WCR_OFFSET, Val);
> +
> + // Start the watchdog
> + WdogStart();
> + }
> +
> + EXIT:
> + return Status;
> +}
> +
> +/**
> + This function retrieves the period of timer interrupts in 100 ns units,
> + returns that value in TimerPeriod, and returns EFI_SUCCESS. If TimerPeriod
> + is NULL, then EFI_INVALID_PARAMETER is returned. If a TimerPeriod of 0 is
> + returned, then the timer is currently disabled.
> +
> + @param This The EFI_TIMER_ARCH_PROTOCOL instance.
> + @param TimerPeriod A pointer to the timer period to retrieve in 100 ns units. If
> + 0 is returned, then the timer is currently disabled.
> +
> +
> + @retval EFI_SUCCESS The timer period was returned in TimerPeriod.
> + @retval EFI_INVALID_PARAMETER TimerPeriod is NULL.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +WdogGetTimerPeriod (
> + IN CONST EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
> + OUT UINT64 *TimerPeriod
> + )
> +{
> + EFI_STATUS Status;
> + UINT64 ReturnValue;
> + UINT16 Val;
> +
> + Status = EFI_SUCCESS;
> +
> + if (TimerPeriod == NULL) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + // Check if the watchdog is stopped
> + if ((WdogRead(PcdGet64(PcdWdog1BaseAddr) + WDOG_WCR_OFFSET)
> + & WDOG_WCR_WDE) == 0 ) {
> + // It is stopped, so return zero.
> + ReturnValue = 0;
> + } else {
> + // Convert the Watchdog ticks into equivalent TimerPeriod second value.
> + Val = (WdogRead(PcdGet64(PcdWdog1BaseAddr) + WDOG_WCR_OFFSET)
> + & WDOG_WCR_WT ) >> 8;
> + ReturnValue = WD_SEC(Val);
> + }
> +
> + *TimerPeriod = ReturnValue;
> + return Status;
> +}
> +
> +/**
> + Interface structure for the Watchdog Architectural Protocol.
> +
> + @par Protocol Description:
> + This protocol provides a service to set the amount of time to wait
> + before firing the watchdog timer, and it also provides a service to
> + register a handler that is invoked when the watchdog timer fires.
> +
> + @par When the watchdog timer fires, control will be passed to a handler
> + if one has been registered. If no handler has been registered,
> + or the registered handler returns, then the system will be
> + reset by calling the Runtime Service ResetSystem().
> +
> + @param RegisterHandler
> + Registers a handler that will be called each time the
> + watchdogtimer interrupt fires. TimerPeriod defines the minimum
> + time between timer interrupts, so TimerPeriod will also
> + be the minimum time between calls to the registered
> + handler.
> + NOTE: If the watchdog resets the system in hardware, then
> + this function will not have any chance of executing.
> +
> + @param SetTimerPeriod
> + Sets the period of the timer interrupt in 100 nS units.
> + This function is optional, and may return EFI_UNSUPPORTED.
> + If this function is supported, then the timer period will
> + be rounded up to the nearest supported timer period.
> +
> + @param GetTimerPeriod
> + Retrieves the period of the timer interrupt in 100 nS units.
> +
> +**/
> +EFI_WATCHDOG_TIMER_ARCH_PROTOCOL gWatchdogTimer = {
STATIC please
> + (EFI_WATCHDOG_TIMER_REGISTER_HANDLER) WdogRegisterHandler,
> + (EFI_WATCHDOG_TIMER_SET_TIMER_PERIOD) WdogSetTimerPeriod,
> + (EFI_WATCHDOG_TIMER_GET_TIMER_PERIOD) WdogGetTimerPeriod
The () casts shouldn't be necessary.
> +};
> +
> +/**
> + Initialize state information for the Watchdog Timer Architectural Protocol.
> +
> + @param ImageHandle of the loaded driver
> + @param SystemTable Pointer to the System Table
> +
> + @retval EFI_SUCCESS Protocol registered
> + @retval EFI_OUT_OF_RESOURCES Cannot allocate protocol data structure
> + @retval EFI_DEVICE_ERROR Hardware problems
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +WdogInitialize (
> + IN EFI_HANDLE ImageHandle,
> + IN EFI_SYSTEM_TABLE *SystemTable
> + )
> +{
> + EFI_STATUS Status;
> + EFI_HANDLE Handle;
> + UINT16 Val;
> +
> +
> + Val = WdogRead(PcdGet64(PcdWdog1BaseAddr) + WDOG_WCR_OFFSET);
> +
> + Val &= ~WDOG_WCR_WT;
> +
> + Val &= ~WDOG_WCR_WDE;
> +
> + Val |= WD_COUNT(WT_MAX_TIME) & WD_COUNT_MASK;
> +
> + WdogWrite(PcdGet64(PcdWdog1BaseAddr) + WDOG_WCR_OFFSET, Val);
> +
Can you use MmioAndThenOr16 () here?
> + Val |= WDOG_WCR_WDE;
> +
What is the purpose of this assignment?
> + //
> + // Make sure the Watchdog Timer Architectural Protocol
> + // has not been installed in the system yet.
> + // This will avoid conflicts with the universal watchdog
> + //
> + ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiWatchdogTimerArchProtocolGuid);
> +
> + // Register for an ExitBootServicesEvent
> + Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY,
> + ExitBootServicesEvent, NULL, &EfiExitBootServicesEvent);
> + if (EFI_ERROR(Status)) {
> + Status = EFI_OUT_OF_RESOURCES;
Why not return Status directly?
> + goto EXIT;
> + }
> +
> + // Install the Timer Architectural Protocol onto a new handle
> + Handle = NULL;
> + Status = gBS->InstallMultipleProtocolInterfaces(
> + &Handle,
> + &gEfiWatchdogTimerArchProtocolGuid, &gWatchdogTimer,
> + NULL
> + );
> + if (EFI_ERROR(Status)) {
> + Status = EFI_OUT_OF_RESOURCES;
Why not return Status directly?
> + goto EXIT;
> + }
> +
> +EXIT:
> + if(EFI_ERROR(Status)) {
> + // The watchdog failed to initialize
> + ASSERT(FALSE);
> + }
> +
> + WdogPing();
> +
> + return Status;
Please close the event and/or uninstall the protocol before returning
with an error.
> +}
> diff --git a/Platform/NXP/Drivers/WatchDog/WatchDog.h b/Platform/NXP/Drivers/WatchDog/WatchDog.h
> new file mode 100644
> index 0000000..56ddbde
> --- /dev/null
> +++ b/Platform/NXP/Drivers/WatchDog/WatchDog.h
> @@ -0,0 +1,37 @@
> +/** WatchDog.h
> +*
> +* Copyright 2017 NXP
> +*
> +* This program and the accompanying materials
> +* are licensed and made available under the terms and conditions of the BSD License
> +* which accompanies this distribution. The full text of the license may be found at
> +* http://opensource.org/licenses/bsd-license.php
> +*
> +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +#ifndef __WATCHDOG_H__
> +#define __WATCHDOG_H__
> +
> +#define WDOG_SIZE 0x1000
> +#define WDOG_WCR_OFFSET 0
> +#define WDOG_WSR_OFFSET 2
> +#define WDOG_WRSR_OFFSET 4
> +#define WDOG_WICR_OFFSET 6
> +#define WDOG_WCR_WT (0xFF << 8)
> +#define WDOG_WCR_WDE (1 << 2)
> +#define WDOG_SERVICE_SEQ1 0x5555
> +#define WDOG_SERVICE_SEQ2 0xAAAA
> +#define WDOG_WCR_WDZST 0x1
> +#define WDOG_WCR_WRE (1 << 3) /* -> WDOG Reset Enable */
> +
> +#define WT_MAX_TIME 128
> +#define WD_COUNT(Sec) (((Sec) * 2 - 1) << 8)
> +#define WD_COUNT_MASK 0xff00
> +#define WD_SEC(Cnt) (((Cnt) + 1) / 2)
> +
> +#define NANO_SECOND_BASE 10000000
> +
> +#endif //__WATCHDOG_H__
> diff --git a/Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf b/Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf
> new file mode 100644
> index 0000000..4cf7d84
> --- /dev/null
> +++ b/Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf
> @@ -0,0 +1,47 @@
> +# WatchDog.inf
> +#
> +# Component description file for WatchDog module
> +#
> +# Copyright 2017 NXP
> +#
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD License
> +# which accompanies this distribution. The full text of the license may be found at
> +# http://opensource.org/licenses/bsd-license.php
> +#
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +#
> +#
> +
> +[Defines]
> + INF_VERSION = 0x00010005
0x0001001A
> + BASE_NAME = WatchDogDxe
> + FILE_GUID = ebd705fb-fa92-46a7-b32b-7f566d944614
Please don't reuse the SP805WatchdogDxe GUID
> + MODULE_TYPE = DXE_DRIVER
> + VERSION_STRING = 1.0
> + ENTRY_POINT = WdogInitialize
> +
> +[Sources.common]
> + WatchDog.c
> +
> +[Packages]
> + MdePkg/MdePkg.dec
> + edk2-platforms/Platform/NXP/NxpQoriqLs.dec
> +
> +[LibraryClasses]
> + BaseLib
> + BeIoLib
> + PcdLib
> + UefiBootServicesTableLib
> + UefiDriverEntryPoint
> +
> +[Pcd]
> + gNxpQoriqLsTokenSpaceGuid.PcdWdog1BaseAddr
> + gNxpQoriqLsTokenSpaceGuid.PcdWdogBigEndian
> +
> +[Protocols]
> + gEfiWatchdogTimerArchProtocolGuid
> +
> +[Depex]
> + TRUE
> --
> 1.9.1
>
^ permalink raw reply [flat|nested] 39+ messages in thread
* Re: [PATCH 04/10] Platform/NXP : Add support for Watchdog driver
2017-11-13 12:23 ` Ard Biesheuvel
@ 2017-11-14 5:36 ` Meenakshi Aggarwal
0 siblings, 0 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-14 5:36 UTC (permalink / raw)
To: Ard Biesheuvel
Cc: Leif Lindholm, Kinney, Michael D, edk2-devel@lists.01.org,
Udit Kumar, Varun Sethi
> -----Original Message-----
> From: Ard Biesheuvel [mailto:ard.biesheuvel@linaro.org]
> Sent: Monday, November 13, 2017 5:53 PM
> To: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> Cc: Leif Lindholm <leif.lindholm@linaro.org>; Kinney, Michael D
> <michael.d.kinney@intel.com>; edk2-devel@lists.01.org; Udit Kumar
> <udit.kumar@nxp.com>; Varun Sethi <V.Sethi@nxp.com>
> Subject: Re: [PATCH 04/10] Platform/NXP : Add support for Watchdog driver
>
> On 7 November 2017 at 14:42, Meenakshi Aggarwal
> <meenakshi.aggarwal@nxp.com> wrote:
> > Installs watchdog timer arch protocol
> >
> > Contributed-under: TianoCore Contribution Agreement 1.1
> > Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> > ---
> > Platform/NXP/Drivers/WatchDog/WatchDog.c | 386
> ++++++++++++++++++++++++++
> > Platform/NXP/Drivers/WatchDog/WatchDog.h | 37 +++
> > Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf | 47 ++++
> > 3 files changed, 470 insertions(+)
> > create mode 100644 Platform/NXP/Drivers/WatchDog/WatchDog.c
> > create mode 100644 Platform/NXP/Drivers/WatchDog/WatchDog.h
> > create mode 100644 Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf
> >
> > diff --git a/Platform/NXP/Drivers/WatchDog/WatchDog.c
> > b/Platform/NXP/Drivers/WatchDog/WatchDog.c
> > new file mode 100644
> > index 0000000..f257a1d
> > --- /dev/null
> > +++ b/Platform/NXP/Drivers/WatchDog/WatchDog.c
> > @@ -0,0 +1,386 @@
> > +/** WatchDog.c
> > +*
> > +* Based on Watchdog driver implemenation available in
> > +* ArmPlatformPkg/Drivers/SP805WatchdogDxe/SP805Watchdog.c
> > +*
> > +* Copyright (c) 2011-2013, ARM Limited. All rights reserved.
> > +* Copyright 2017 NXP
> > +*
> > +* This program and the accompanying materials
> > +* are licensed and made available under the terms and conditions of
> > +the BSD License
> > +* which accompanies this distribution. The full text of the license
> > +may be found at
> > +*
> >
> +https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> e
> > +nsource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.agg
> >
> +arwal%40nxp.com%7Cfe03b552d02b478a923608d52a9150f8%7C686ea1d3bc
> 2b4c6f
> >
> +a92cd99c5c301635%7C0%7C0%7C636461725998922414&sdata=094m%2FkgX
> NuvwXRS
> > +Ewe%2Bke8do3KvWhW7PBAvMTy2O%2Fc4%3D&reserved=0
> > +*
> > +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > +BASIS,
> > +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> > +*
> > +**/
> > +
> > +#include <PiDxe.h>
> > +#include <Library/BaseLib.h>
> > +#include <Library/BeIoLib.h>
> > +#include <Library/DebugLib.h>
> > +#include <Library/IoLib.h>
> > +#include <Library/PcdLib.h>
> > +#include <Library/UefiBootServicesTableLib.h>
> > +#include <Protocol/WatchdogTimer.h>
> > +
> > +#include "WatchDog.h"
> > +
>
> STATIC please, and drop the redundant initializer.
OK, will correct this.
>
> > +EFI_EVENT EfiExitBootServicesEvent = (EFI_EVENT)NULL;
> > +
>
> STATIC
>
> In general, any function that is not exported from the driver should be
> STATIC, even if it is referenced from a protocol struct
OK, will correct in all patches.
>
> > +UINT16
> > +EFIAPI
> > +WdogRead (
> > + IN UINTN Address
> > + )
> > +{
> > + if (FixedPcdGetBool(PcdWdogBigEndian)) {
>
> In general, but I will mention it here: every function call or macro invocation
> requires a space before (
Will correct in all patches.
>
> > + return BeMmioRead16(Address);
> > + } else {
> > + return MmioRead16(Address);
> > + }
> > +}
> > +
> > +UINT16
> > +EFIAPI
> > +WdogWrite (
> > + IN UINTN Address,
> > + IN UINT16 Value
> > + )
> > +{
> > + if (FixedPcdGetBool(PcdWdogBigEndian)) {
> > + return BeMmioWrite16(Address, Value);
> > + } else {
> > + return MmioWrite16(Address, Value);
> > + }
> > +}
> > +
> > +STATIC
> > +VOID
> > +WdogPing (
> > + VOID
> > + )
> > +{
> > + WdogWrite(PcdGet64(PcdWdog1BaseAddr) + WDOG_WSR_OFFSET,
> > + WDOG_SERVICE_SEQ1);
> > + WdogWrite(PcdGet64(PcdWdog1BaseAddr) + WDOG_WSR_OFFSET,
> > + WDOG_SERVICE_SEQ2); }
> > +
> > +/**
> > + Stop the Wdog watchdog timer from counting down.
> > +**/
> > +STATIC
> > +VOID
> > +WdogStop (
> > + VOID
> > + )
> > +{
> > + // Watchdog cannot be disabled by software once started.
> > + // At best, we can keep pinging the watchdog
> > + WdogPing();
>
> How is this supposed to work when entering the OS?
Watchdog controller of LS1043 SoC cannot be stopped once enabled.
When linux boots , then on receiving ExitBootServices event, we are calling
WdogStop and here, we are pinging the watchdog i.e. reloading the watchdog
with the maximum value (128 seconds), this much time is sufficient for OS to boot.
>
> > +}
> > +
> > +/**
> > + Starts the Wdog counting down by feeding Service register with
> > + desired pattern.
> > + The count down will start from the value stored in the Load
> > +register,
> > + not from the value where it was previously stopped.
> > +**/
> > +STATIC
> > +VOID
> > +WdogStart (
> > + VOID
> > + )
> > +{
> > + /* Reload the timeout value */
> > + WdogPing();
> > +}
> > +
> > +/**
> > + On exiting boot services we must make sure the Wdog Watchdog Timer
> > + is stopped.
> > +**/
> > +VOID
> > +EFIAPI
> > +ExitBootServicesEvent (
> > + IN EFI_EVENT Event,
> > + IN VOID *Context
> > + )
> > +{
> > + WdogStop();
>
> The comment above says this is impossible.
>
Please refer above description for this.
> > +}
> > +
> > +/**
> > + This function registers the handler NotifyFunction so it is called
> > +every time
> > + the watchdog timer expires. It also passes the amount of time
> > +since the last
> > + handler call to the NotifyFunction.
> > + If NotifyFunction is not NULL and a handler is not already
> > +registered,
> > + then the new handler is registered and EFI_SUCCESS is returned.
> > + If NotifyFunction is NULL, and a handler is already registered,
> > + then that handler is unregistered.
> > + If an attempt is made to register a handler when a handler is
> > +already registered,
> > + then EFI_ALREADY_STARTED is returned.
> > + If an attempt is made to unregister a handler when a handler is not
> > +registered,
> > + then EFI_INVALID_PARAMETER is returned.
> > +
> > + @param This The EFI_TIMER_ARCH_PROTOCOL instance.
> > + @param NotifyFunction The function to call when a timer interrupt
> fires. This
> > + function executes at TPL_HIGH_LEVEL. The DXE Core will
> > + register a handler for the timer interrupt, so it can know
> > + how much time has passed. This information is used to
> > + signal timer based events. NULL will unregister the handler.
> > +
> > + @retval EFI_SUCCESS The watchdog timer handler was registered.
> > + @retval EFI_ALREADY_STARTED NotifyFunction is not NULL, and a
> handler is already
> > + registered.
> > + @retval EFI_INVALID_PARAMETER NotifyFunction is NULL, and a handler
> was not
> > + previously registered.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +WdogRegisterHandler (
> > + IN CONST EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
> > + IN EFI_WATCHDOG_TIMER_NOTIFY NotifyFunction
> > + )
> > +{
> > + // ERROR: This function is not supported.
> > + // The hardware watchdog will reset the board
> > + return EFI_INVALID_PARAMETER;
>
> Doesn't this violate the protocol? Why does it make sense to implement the
> protocol based on this hardware?
We have referred ArmPlatformPkg/Drivers/SP805WatchdogDxe/SP805Watchdog.c
Please suggest any user of this function.
>
> > +}
> > +
> > +/**
> > +
> > + This function adjusts the period of timer interrupts to the value
> > + specified by TimerPeriod. If the timer period is updated, then the
> > + selected timer period is stored in EFI_TIMER.TimerPeriod, and
> > + EFI_SUCCESS is returned. If the timer hardware is not programmable,
> then EFI_UNSUPPORTED is returned.
> > + If an error occurs while attempting to update the timer period,
> > + then the timer hardware will be put back in its state prior to this
> > + call, and EFI_DEVICE_ERROR is returned. If TimerPeriod is 0, then
> > + the timer interrupt is disabled. This is not the same as disabling the CPU's
> interrupts.
> > + Instead, it must either turn off the timer hardware, or it must
> > + adjust the interrupt controller so that a CPU interrupt is not
> > + generated when the timer interrupt fires.
> > +
> > + @param This The EFI_TIMER_ARCH_PROTOCOL instance.
> > + @param TimerPeriod The rate to program the timer interrupt in 100
> nS units. If
> > + the timer hardware is not programmable, then
> EFI_UNSUPPORTED is
> > + returned. If the timer is programmable, then the timer
> period
> > + will be rounded up to the nearest timer period that is
> supported
> > + by the timer hardware. If TimerPeriod is set to 0, then the
> > + timer interrupts will be disabled.
> > +
> > +
> > + @retval EFI_SUCCESS The timer period was changed.
> > + @retval EFI_UNSUPPORTED The platform cannot change the period
> of the timer interrupt.
> > + @retval EFI_DEVICE_ERROR The timer period could not be changed
> due to a device error.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +WdogSetTimerPeriod (
> > + IN CONST EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
> > + IN UINT64 TimerPeriod // In 100ns units
> > + )
> > +{
> > + EFI_STATUS Status;
> > + UINT64 TimerPeriodInSec;
> > + UINT16 Val;
> > +
> > + Status = EFI_SUCCESS;
> > +
> > + if (TimerPeriod == 0) {
> > + // This is a watchdog stop request
> > + WdogStop();
> > + goto EXIT;
> > + } else {
> > + // Convert the TimerPeriod (in 100 ns unit) to an equivalent
> > + second value
> > +
> > + TimerPeriodInSec = DivU64x32(TimerPeriod, NANO_SECOND_BASE);
> > +
> > + // The registers in the Wdog are only 32 bits
> > + if(TimerPeriodInSec > WT_MAX_TIME) {
> > + // We could load the watchdog with the maximum supported value but
> > + // if a smaller value was requested, this could have the watchdog
> > + // triggering before it was intended.
> > + // Better generate an error to let the caller know.
> > + Status = EFI_DEVICE_ERROR;
> > + goto EXIT;
> > + }
> > +
> > + // set the new timeout value in the WCR
> > + Val = WdogRead(PcdGet64(PcdWdog1BaseAddr) +
> WDOG_WCR_OFFSET);
> > + Val &= ~WDOG_WCR_WT;
> > + // Convert the timeout value from Seconds to timer count
> > + Val |= ((WD_COUNT(TimerPeriodInSec) & WD_COUNT_MASK) << 8);
> > + WdogWrite(PcdGet64(PcdWdog1BaseAddr) + WDOG_WCR_OFFSET,
> Val);
> > +
> > + // Start the watchdog
> > + WdogStart();
> > + }
> > +
> > + EXIT:
> > + return Status;
> > +}
> > +
> > +/**
> > + This function retrieves the period of timer interrupts in 100 ns
> > +units,
> > + returns that value in TimerPeriod, and returns EFI_SUCCESS. If
> > +TimerPeriod
> > + is NULL, then EFI_INVALID_PARAMETER is returned. If a TimerPeriod
> > +of 0 is
> > + returned, then the timer is currently disabled.
> > +
> > + @param This The EFI_TIMER_ARCH_PROTOCOL instance.
> > + @param TimerPeriod A pointer to the timer period to retrieve in 100
> ns units. If
> > + 0 is returned, then the timer is currently disabled.
> > +
> > +
> > + @retval EFI_SUCCESS The timer period was returned in
> TimerPeriod.
> > + @retval EFI_INVALID_PARAMETER TimerPeriod is NULL.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +WdogGetTimerPeriod (
> > + IN CONST EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
> > + OUT UINT64 *TimerPeriod
> > + )
> > +{
> > + EFI_STATUS Status;
> > + UINT64 ReturnValue;
> > + UINT16 Val;
> > +
> > + Status = EFI_SUCCESS;
> > +
> > + if (TimerPeriod == NULL) {
> > + return EFI_INVALID_PARAMETER;
> > + }
> > +
> > + // Check if the watchdog is stopped if
> > + ((WdogRead(PcdGet64(PcdWdog1BaseAddr) + WDOG_WCR_OFFSET)
> > + & WDOG_WCR_WDE) == 0 ) {
> > + // It is stopped, so return zero.
> > + ReturnValue = 0;
> > + } else {
> > + // Convert the Watchdog ticks into equivalent TimerPeriod second
> value.
> > + Val = (WdogRead(PcdGet64(PcdWdog1BaseAddr) +
> WDOG_WCR_OFFSET)
> > + & WDOG_WCR_WT ) >> 8;
> > + ReturnValue = WD_SEC(Val);
> > + }
> > +
> > + *TimerPeriod = ReturnValue;
> > + return Status;
> > +}
> > +
> > +/**
> > + Interface structure for the Watchdog Architectural Protocol.
> > +
> > + @par Protocol Description:
> > + This protocol provides a service to set the amount of time to wait
> > + before firing the watchdog timer, and it also provides a service to
> > + register a handler that is invoked when the watchdog timer fires.
> > +
> > + @par When the watchdog timer fires, control will be passed to a
> > + handler if one has been registered. If no handler has been
> > + registered, or the registered handler returns, then the system will
> > + be reset by calling the Runtime Service ResetSystem().
> > +
> > + @param RegisterHandler
> > + Registers a handler that will be called each time the
> > + watchdogtimer interrupt fires. TimerPeriod defines the minimum
> > + time between timer interrupts, so TimerPeriod will also be the
> > + minimum time between calls to the registered handler.
> > + NOTE: If the watchdog resets the system in hardware, then
> > + this function will not have any chance of executing.
> > +
> > + @param SetTimerPeriod
> > + Sets the period of the timer interrupt in 100 nS units.
> > + This function is optional, and may return EFI_UNSUPPORTED.
> > + If this function is supported, then the timer period will be
> > + rounded up to the nearest supported timer period.
> > +
> > + @param GetTimerPeriod
> > + Retrieves the period of the timer interrupt in 100 nS units.
> > +
> > +**/
> > +EFI_WATCHDOG_TIMER_ARCH_PROTOCOL gWatchdogTimer = {
>
> STATIC please
>
OK
>
> > + (EFI_WATCHDOG_TIMER_REGISTER_HANDLER) WdogRegisterHandler,
> > + (EFI_WATCHDOG_TIMER_SET_TIMER_PERIOD) WdogSetTimerPeriod,
> > + (EFI_WATCHDOG_TIMER_GET_TIMER_PERIOD) WdogGetTimerPeriod
>
> The () casts shouldn't be necessary.
>
OK
> > +};
> > +
> > +/**
> > + Initialize state information for the Watchdog Timer Architectural
> Protocol.
> > +
> > + @param ImageHandle of the loaded driver
> > + @param SystemTable Pointer to the System Table
> > +
> > + @retval EFI_SUCCESS Protocol registered
> > + @retval EFI_OUT_OF_RESOURCES Cannot allocate protocol data
> structure
> > + @retval EFI_DEVICE_ERROR Hardware problems
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +WdogInitialize (
> > + IN EFI_HANDLE ImageHandle,
> > + IN EFI_SYSTEM_TABLE *SystemTable
> > + )
> > +{
> > + EFI_STATUS Status;
> > + EFI_HANDLE Handle;
> > + UINT16 Val;
> > +
> > +
> > + Val = WdogRead(PcdGet64(PcdWdog1BaseAddr) +
> WDOG_WCR_OFFSET);
> > +
> > + Val &= ~WDOG_WCR_WT;
> > +
> > + Val &= ~WDOG_WCR_WDE;
> > +
> > + Val |= WD_COUNT(WT_MAX_TIME) & WD_COUNT_MASK;
> > +
> > + WdogWrite(PcdGet64(PcdWdog1BaseAddr) + WDOG_WCR_OFFSET,
> Val);
> > +
>
> Can you use MmioAndThenOr16 () here?
>
Yes, will update this.
> > + Val |= WDOG_WCR_WDE;
> > +
>
> What is the purpose of this assignment?
>
Ah.. will correct this.
> > + //
> > + // Make sure the Watchdog Timer Architectural Protocol // has not
> > + been installed in the system yet.
> > + // This will avoid conflicts with the universal watchdog //
> > + ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL,
> > + &gEfiWatchdogTimerArchProtocolGuid);
> > +
> > + // Register for an ExitBootServicesEvent Status = gBS->CreateEvent
> > + (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY,
> > + ExitBootServicesEvent, NULL,
> > + &EfiExitBootServicesEvent); if (EFI_ERROR(Status)) {
> > + Status = EFI_OUT_OF_RESOURCES;
>
> Why not return Status directly?
>
Will correct same.
> > + goto EXIT;
> > + }
> > +
> > + // Install the Timer Architectural Protocol onto a new handle
> > + Handle = NULL; Status = gBS->InstallMultipleProtocolInterfaces(
> > + &Handle,
> > + &gEfiWatchdogTimerArchProtocolGuid, &gWatchdogTimer,
> > + NULL
> > + );
> > + if (EFI_ERROR(Status)) {
> > + Status = EFI_OUT_OF_RESOURCES;
>
> Why not return Status directly?
>
> > + goto EXIT;
> > + }
> > +
> > +EXIT:
> > + if(EFI_ERROR(Status)) {
> > + // The watchdog failed to initialize
> > + ASSERT(FALSE);
> > + }
> > +
> > + WdogPing();
> > +
> > + return Status;
>
> Please close the event and/or uninstall the protocol before returning with an
> error.
>
OK
> > +}
> > diff --git a/Platform/NXP/Drivers/WatchDog/WatchDog.h
> > b/Platform/NXP/Drivers/WatchDog/WatchDog.h
> > new file mode 100644
> > index 0000000..56ddbde
> > --- /dev/null
> > +++ b/Platform/NXP/Drivers/WatchDog/WatchDog.h
> > @@ -0,0 +1,37 @@
> > +/** WatchDog.h
> > +*
> > +* Copyright 2017 NXP
> > +*
> > +* This program and the accompanying materials
> > +* are licensed and made available under the terms and conditions of
> > +the BSD License
> > +* which accompanies this distribution. The full text of the license
> > +may be found at
> > +*
> >
> +https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> e
> > +nsource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.agg
> >
> +arwal%40nxp.com%7Cfe03b552d02b478a923608d52a9150f8%7C686ea1d3bc
> 2b4c6f
> >
> +a92cd99c5c301635%7C0%7C0%7C636461725998922414&sdata=094m%2FkgX
> NuvwXRS
> > +Ewe%2Bke8do3KvWhW7PBAvMTy2O%2Fc4%3D&reserved=0
> > +*
> > +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > +BASIS,
> > +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> > +*
> > +**/
> > +
> > +#ifndef __WATCHDOG_H__
> > +#define __WATCHDOG_H__
> > +
> > +#define WDOG_SIZE 0x1000
> > +#define WDOG_WCR_OFFSET 0
> > +#define WDOG_WSR_OFFSET 2
> > +#define WDOG_WRSR_OFFSET 4
> > +#define WDOG_WICR_OFFSET 6
> > +#define WDOG_WCR_WT (0xFF << 8)
> > +#define WDOG_WCR_WDE (1 << 2)
> > +#define WDOG_SERVICE_SEQ1 0x5555
> > +#define WDOG_SERVICE_SEQ2 0xAAAA
> > +#define WDOG_WCR_WDZST 0x1
> > +#define WDOG_WCR_WRE (1 << 3) /* -> WDOG Reset Enable */
> > +
> > +#define WT_MAX_TIME 128
> > +#define WD_COUNT(Sec) (((Sec) * 2 - 1) << 8)
> > +#define WD_COUNT_MASK 0xff00
> > +#define WD_SEC(Cnt) (((Cnt) + 1) / 2)
> > +
> > +#define NANO_SECOND_BASE 10000000
> > +
> > +#endif //__WATCHDOG_H__
> > diff --git a/Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf
> > b/Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf
> > new file mode 100644
> > index 0000000..4cf7d84
> > --- /dev/null
> > +++ b/Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf
> > @@ -0,0 +1,47 @@
> > +# WatchDog.inf
> > +#
> > +# Component description file for WatchDog module # # Copyright
> > +2017 NXP # # This program and the accompanying materials # are
> > +licensed and made available under the terms and conditions of the BSD
> > +License # which accompanies this distribution. The full text of the
> > +license may be found at #
> >
> +https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> e
> > +nsource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.agg
> >
> +arwal%40nxp.com%7Cfe03b552d02b478a923608d52a9150f8%7C686ea1d3bc
> 2b4c6f
> >
> +a92cd99c5c301635%7C0%7C0%7C636461725998922414&sdata=094m%2FkgX
> NuvwXRS
> > +Ewe%2Bke8do3KvWhW7PBAvMTy2O%2Fc4%3D&reserved=0
> > +#
> > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > +BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +#
> > +#
> > +
> > +[Defines]
> > + INF_VERSION = 0x00010005
>
> 0x0001001A
>
OK
> > + BASE_NAME = WatchDogDxe
> > + FILE_GUID = ebd705fb-fa92-46a7-b32b-7f566d944614
>
> Please don't reuse the SP805WatchdogDxe GUID
>
OK
> > + MODULE_TYPE = DXE_DRIVER
> > + VERSION_STRING = 1.0
> > + ENTRY_POINT = WdogInitialize
> > +
> > +[Sources.common]
> > + WatchDog.c
> > +
> > +[Packages]
> > + MdePkg/MdePkg.dec
> > + edk2-platforms/Platform/NXP/NxpQoriqLs.dec
> > +
> > +[LibraryClasses]
> > + BaseLib
> > + BeIoLib
> > + PcdLib
> > + UefiBootServicesTableLib
> > + UefiDriverEntryPoint
> > +
> > +[Pcd]
> > + gNxpQoriqLsTokenSpaceGuid.PcdWdog1BaseAddr
> > + gNxpQoriqLsTokenSpaceGuid.PcdWdogBigEndian
> > +
> > +[Protocols]
> > + gEfiWatchdogTimerArchProtocolGuid
> > +
> > +[Depex]
> > + TRUE
> > --
> > 1.9.1
> >
^ permalink raw reply [flat|nested] 39+ messages in thread
* [PATCH 05/10] Platform/NXP : Add support for DUART library
2017-11-07 14:42 [PATCH 00/10] edk2-platforms/Platform/NXP Meenakshi Aggarwal
` (3 preceding siblings ...)
2017-11-07 14:42 ` [PATCH 04/10] Platform/NXP : Add support for Watchdog driver Meenakshi Aggarwal
@ 2017-11-07 14:42 ` Meenakshi Aggarwal
2017-11-13 12:28 ` Ard Biesheuvel
2017-11-07 14:42 ` [PATCH 06/10] Platform/NXP: Add support for I2c operations library Meenakshi Aggarwal
` (5 subsequent siblings)
10 siblings, 1 reply; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-07 14:42 UTC (permalink / raw)
To: ard.biesheuvel, leif.lindholm, michael.d.kinney, edk2-devel
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
---
Platform/NXP/Library/DUartPortLib/DUart.h | 128 ++++++++
Platform/NXP/Library/DUartPortLib/DUartPortLib.c | 334 +++++++++++++++++++++
Platform/NXP/Library/DUartPortLib/DUartPortLib.inf | 39 +++
3 files changed, 501 insertions(+)
create mode 100644 Platform/NXP/Library/DUartPortLib/DUart.h
create mode 100644 Platform/NXP/Library/DUartPortLib/DUartPortLib.c
create mode 100644 Platform/NXP/Library/DUartPortLib/DUartPortLib.inf
diff --git a/Platform/NXP/Library/DUartPortLib/DUart.h b/Platform/NXP/Library/DUartPortLib/DUart.h
new file mode 100644
index 0000000..907790b
--- /dev/null
+++ b/Platform/NXP/Library/DUartPortLib/DUart.h
@@ -0,0 +1,128 @@
+/** DUart.h
+* Header defining the DUART constants (Base addresses, sizes, flags)
+*
+* Based on Serial I/O Port library headers available in PL011Uart.h
+*
+* Copyright (c) 2011-2012, ARM Limited. All rights reserved.
+* Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
+* Copyright 2017 NXP
+*
+* This program and the accompanying materials
+* are licensed and made available under the terms and conditions of the BSD License
+* which accompanies this distribution. The full text of the license may be found at
+* http://opensource.org/licenses/bsd-license.php
+*
+* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#ifndef __DUART_H__
+#define __DUART_H__
+
+// FIFO Control Register
+#define DUART_FCR_FIFO_EN 0x01 /* Fifo enable */
+#define DUART_FCR_CLEAR_RCVR 0x02 /* Clear the RCVR FIFO */
+#define DUART_FCR_CLEAR_XMIT 0x04 /* Clear the XMIT FIFO */
+#define DUART_FCR_DMA_SELECT 0x08 /* For DMA applications */
+#define DUART_FCR_TRIGGER_MASK 0xC0 /* Mask for the FIFO trigger range */
+#define DUART_FCR_TRIGGER_1 0x00 /* Mask for trigger set at 1 */
+#define DUART_FCR_TRIGGER_4 0x40 /* Mask for trigger set at 4 */
+#define DUART_FCR_TRIGGER_8 0x80 /* Mask for trigger set at 8 */
+#define DUART_FCR_TRIGGER_14 0xC0 /* Mask for trigger set at 14 */
+#define DUART_FCR_RXSR 0x02 /* Receiver soft reset */
+#define DUART_FCR_TXSR 0x04 /* Transmitter soft reset */
+
+// Modem Control Register
+#define DUART_MCR_DTR 0x01 /* Reserved */
+#define DUART_MCR_RTS 0x02 /* RTS */
+#define DUART_MCR_OUT1 0x04 /* Reserved */
+#define DUART_MCR_OUT2 0x08 /* Reserved */
+#define DUART_MCR_LOOP 0x10 /* Enable loopback test mode */
+#define DUART_MCR_AFE 0x20 /* AFE (Auto Flow Control) */
+#define DUART_MCR_DMA_EN 0x04
+#define DUART_MCR_TX_DFR 0x08
+
+// Line Control Register
+/*
+* Note: if the word length is 5 bits (DUART_LCR_WLEN5), then setting
+* DUART_LCR_STOP will select 1.5 stop bits, not 2 stop bits.
+*/
+#define DUART_LCR_WLS_MSK 0x03 /* character length select mask */
+#define DUART_LCR_WLS_5 0x00 /* 5 bit character length */
+#define DUART_LCR_WLS_6 0x01 /* 6 bit character length */
+#define DUART_LCR_WLS_7 0x02 /* 7 bit character length */
+#define DUART_LCR_WLS_8 0x03 /* 8 bit character length */
+#define DUART_LCR_STB 0x04 /* # stop Bits, off=1, on=1.5 or 2) */
+#define DUART_LCR_PEN 0x08 /* Parity eneble */
+#define DUART_LCR_EPS 0x10 /* Even Parity Select */
+#define DUART_LCR_STKP 0x20 /* Stick Parity */
+#define DUART_LCR_SBRK 0x40 /* Set Break */
+#define DUART_LCR_BKSE 0x80 /* Bank select enable */
+#define DUART_LCR_DLAB 0x80 /* Divisor latch access bit */
+
+// Line Status Register
+#define DUART_LSR_DR 0x01 /* Data ready */
+#define DUART_LSR_OE 0x02 /* Overrun */
+#define DUART_LSR_PE 0x04 /* Parity error */
+#define DUART_LSR_FE 0x08 /* Framing error */
+#define DUART_LSR_BI 0x10 /* Break */
+#define DUART_LSR_THRE 0x20 /* Xmit holding register empty */
+#define DUART_LSR_TEMT 0x40 /* Xmitter empty */
+#define DUART_LSR_ERR 0x80 /* Error */
+
+// Modem Status Register
+#define DUART_MSR_DCTS 0x01 /* Delta CTS */
+#define DUART_MSR_DDSR 0x02 /* Reserved */
+#define DUART_MSR_TERI 0x04 /* Reserved */
+#define DUART_MSR_DDCD 0x08 /* Reserved */
+#define DUART_MSR_CTS 0x10 /* Clear to Send */
+#define DUART_MSR_DSR 0x20 /* Reserved */
+#define DUART_MSR_RI 0x40 /* Reserved */
+#define DUART_MSR_DCD 0x80 /* Reserved */
+
+// Interrupt Identification Register
+#define DUART_IIR_NO_INT 0x01 /* No interrupts pending */
+#define DUART_IIR_ID 0x06 /* Mask for the interrupt ID */
+#define DUART_IIR_MSI 0x00 /* Modem status interrupt */
+#define DUART_IIR_THRI 0x02 /* Transmitter holding register empty */
+#define DUART_IIR_RDI 0x04 /* Receiver data interrupt */
+#define DUART_IIR_RLSI 0x06 /* Receiver line status interrupt */
+
+// Interrupt Enable Register
+#define DUART_IER_MSI 0x08 /* Enable Modem status interrupt */
+#define DUART_IER_RLSI 0x04 /* Enable receiver line status interrupt */
+#define DUART_IER_THRI 0x02 /* Enable Transmitter holding register int. */
+#define DUART_IER_RDI 0x01 /* Enable receiver data interrupt */
+
+// LCR defaults
+#define DUART_LCR_8N1 0x03
+#define DUART_LCRVAL DUART_LCR_8N1 /* 8 data, 1 stop, no parity */
+#define DUART_MCRVAL (DUART_MCR_DTR | \
+ DUART_MCR_RTS) /* RTS/DTR */
+#define DUART_FCRVAL (DUART_FCR_FIFO_EN | \
+ DUART_FCR_RXSR | \
+ DUART_FCR_TXSR) /* Clear & enable FIFOs */
+
+#define URBR 0x0
+#define UTHR 0x0
+#define UDLB 0x0
+#define UDMB 0x1
+#define UIER 0x1
+#define UIIR 0x2
+#define UFCR 0x2
+#define UAFR 0x2
+#define ULCR 0x3
+#define UMCR 0x4
+#define ULSR 0x5
+#define UMSR 0x6
+#define USCR 0x7
+#define UDSR 0x10
+
+extern
+UINT32
+CalculateBaudDivisor (
+ IN UINT64 BaudRate
+ );
+
+#endif /* __DUART_H__ */
diff --git a/Platform/NXP/Library/DUartPortLib/DUartPortLib.c b/Platform/NXP/Library/DUartPortLib/DUartPortLib.c
new file mode 100644
index 0000000..99766d1
--- /dev/null
+++ b/Platform/NXP/Library/DUartPortLib/DUartPortLib.c
@@ -0,0 +1,334 @@
+/** DuartPortLib.c
+ DUART (NS16550) library functions
+
+ Based on Serial I/O Port library functions available in PL011SerialPortLib.c
+
+ Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
+ Copyright (c) 2012 - 2013, ARM Ltd. All rights reserved.<BR>
+ Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Base.h>
+#include <Library/IoLib.h>
+#include <Library/PcdLib.h>
+#include <Library/SerialPortLib.h>
+
+#include "DUart.h"
+
+STATIC CONST UINT32 mInvalidControlBits = (EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE | \
+ EFI_SERIAL_DATA_TERMINAL_READY);
+
+/**
+ Assert or deassert the control signals on a serial port.
+ The following control signals are set according their bit settings :
+ . Request to Send
+ . Data Terminal Ready
+
+ @param[in] Control The following bits are taken into account :
+ . EFI_SERIAL_REQUEST_TO_SEND : assert/deassert the
+ "Request To Send" control signal if this bit is
+ equal to one/zero.
+ . EFI_SERIAL_DATA_TERMINAL_READY : assert/deassert
+ the "Data Terminal Ready" control signal if this
+ bit is equal to one/zero.
+ . EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE : enable/disable
+ the hardware loopback if this bit is equal to
+ one/zero.
+ . EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE : not supported.
+ . EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE : enable/
+ disable the hardware flow control based on CTS (Clear
+ To Send) and RTS (Ready To Send) control signals.
+
+ @retval EFI_SUCCESS The new control bits were set on the device.
+ @retval EFI_UNSUPPORTED The device does not support this operation.
+
+**/
+EFI_STATUS
+EFIAPI
+SerialPortSetControl (
+ IN UINT32 Control
+ )
+{
+ UINT32 McrBits;
+ UINTN UartBase;
+
+ UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
+
+ if (Control & (mInvalidControlBits)) {
+ return EFI_UNSUPPORTED;
+ }
+
+ McrBits = MmioRead8 (UartBase + UMCR);
+
+ if (Control & EFI_SERIAL_REQUEST_TO_SEND) {
+ McrBits |= DUART_MCR_RTS;
+ } else {
+ McrBits &= ~DUART_MCR_RTS;
+ }
+
+ if (Control & EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE) {
+ McrBits |= DUART_MCR_LOOP;
+ } else {
+ McrBits &= ~DUART_MCR_LOOP;
+ }
+
+ if (Control & EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE) {
+ McrBits |= DUART_MCR_AFE;
+ } else {
+ McrBits &= ~DUART_MCR_AFE;
+ }
+
+ MmioWrite32 (UartBase + UMCR, McrBits);
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Retrieve the status of the control bits on a serial device.
+
+ @param[out] Control Status of the control bits on a serial device :
+
+ . EFI_SERIAL_DATA_CLEAR_TO_SEND,
+ EFI_SERIAL_DATA_SET_READY,
+ EFI_SERIAL_RING_INDICATE,
+ EFI_SERIAL_CARRIER_DETECT,
+ EFI_SERIAL_REQUEST_TO_SEND,
+ EFI_SERIAL_DATA_TERMINAL_READY
+ are all related to the DTE (Data Terminal Equipment)
+ and DCE (Data Communication Equipment) modes of
+ operation of the serial device.
+ . EFI_SERIAL_INPUT_BUFFER_EMPTY : equal to one if the
+ receive buffer is empty, 0 otherwise.
+ . EFI_SERIAL_OUTPUT_BUFFER_EMPTY : equal to one if the
+ transmit buffer is empty, 0 otherwise.
+ . EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE : equal to one if
+ the hardware loopback is enabled (the ouput feeds the
+ receive buffer), 0 otherwise.
+ . EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE : equal to one if
+ a loopback is accomplished by software, 0 otherwise.
+ . EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE : equal to
+ one if the hardware flow control based on CTS (Clear
+ To Send) and RTS (Ready To Send) control signals is
+ enabled, 0 otherwise.
+
+ @retval EFI_SUCCESS The control bits were read from the serial device.
+
+**/
+
+EFI_STATUS
+EFIAPI
+SerialPortGetControl (
+ OUT UINT32 *Control
+ )
+{
+ UINT32 MsrRegister;
+ UINT32 McrRegister;
+ UINT32 LsrRegister;
+ UINTN UartBase;
+
+ UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
+
+ MsrRegister = MmioRead8 (UartBase + UMSR);
+ McrRegister = MmioRead8 (UartBase + UMCR);
+ LsrRegister = MmioRead8 (UartBase + ULSR);
+
+ *Control = 0;
+
+ if ((MsrRegister & DUART_MSR_CTS) == DUART_MSR_CTS) {
+ *Control |= EFI_SERIAL_CLEAR_TO_SEND;
+ }
+
+ if ((McrRegister & DUART_MCR_RTS) == DUART_MCR_RTS) {
+ *Control |= EFI_SERIAL_REQUEST_TO_SEND;
+ }
+
+ if ((LsrRegister & DUART_LSR_TEMT) == DUART_LSR_TEMT) {
+ *Control |= EFI_SERIAL_OUTPUT_BUFFER_EMPTY;
+ }
+
+ if ((McrRegister & DUART_MCR_AFE) == DUART_MCR_AFE) {
+ *Control |= EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE;
+ }
+
+ if ((McrRegister & DUART_MCR_LOOP) == DUART_MCR_LOOP) {
+ *Control |= EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE;
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Programmed hardware of Serial port.
+
+ @return Always return EFI_SUCCESS.
+
+**/
+
+EFI_STATUS
+EFIAPI
+SerialPortInitialize (
+ VOID
+ )
+{
+ UINT64 BaudRate;
+ UINT32 BaudDivisor;
+ UINTN UartBase;
+
+ UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
+ BaudRate = (UINTN)PcdGet64 (PcdUartDefaultBaudRate);
+
+ BaudDivisor = CalculateBaudDivisor(BaudRate);
+
+ while (!(MmioRead8(UartBase + ULSR) & DUART_LSR_TEMT));
+
+ //
+ // Enable received data available interrupt, setup data format,
+ // setup baud divisor
+ //
+ MmioWrite8(UartBase + UIER, 0x1);
+ MmioWrite8(UartBase + ULCR, DUART_LCR_BKSE | DUART_LCRVAL);
+ MmioWrite8(UartBase + UDLB, 0);
+ MmioWrite8(UartBase + UDMB, 0);
+ MmioWrite8(UartBase + ULCR, DUART_LCRVAL);
+ MmioWrite8(UartBase + UMCR, DUART_MCRVAL);
+ MmioWrite8(UartBase + UFCR, DUART_FCRVAL);
+ MmioWrite8(UartBase + ULCR, DUART_LCR_BKSE | DUART_LCRVAL);
+ MmioWrite8(UartBase + UDLB, BaudDivisor & 0xff);
+ MmioWrite8(UartBase + UDMB, (BaudDivisor >> 8) & 0xff);
+ MmioWrite8(UartBase + ULCR, DUART_LCRVAL);
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Write data to serial device.
+
+ @param Buffer Point of data buffer which need to be written.
+ @param NumberOfBytes Number of output bytes which are cached in Buffer.
+
+ @retval 0 Write data failed.
+ @retval !0 Actual number of bytes written to serial device.
+
+**/
+UINTN
+EFIAPI
+SerialPortWrite (
+ IN UINT8 *Buffer,
+ IN UINTN NumberOfBytes
+ )
+{
+ UINT8 *Final;
+ UINTN UartBase;
+
+ Final = &Buffer[NumberOfBytes];
+ UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
+
+ while (Buffer < Final) {
+ while ((MmioRead8(UartBase + ULSR) & DUART_LSR_THRE) == 0);
+ MmioWrite8(UartBase + UTHR, *Buffer++);
+ }
+
+ return NumberOfBytes;
+}
+
+/**
+ Read data from serial device and save the data in buffer.
+
+ @param Buffer Point of data buffer which need to be written.
+ @param NumberOfBytes Number of output bytes which are cached in Buffer.
+
+ @retval 0 Read data failed.
+ @retval !0 Actual number of bytes read from serial device.
+
+**/
+UINTN
+EFIAPI
+SerialPortRead (
+ OUT UINT8 *Buffer,
+ IN UINTN NumberOfBytes
+ )
+{
+ UINTN Count;
+ UINTN UartBase;
+
+ UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
+
+ for (Count = 0; Count < NumberOfBytes; Count++, Buffer++) {
+ /*
+ * Loop while waiting for a new char(s) to arrive in the
+ * RxFIFO
+ */
+ while ((MmioRead8(UartBase + ULSR) & DUART_LSR_DR) == 0);
+
+ *Buffer = MmioRead8(UartBase + URBR);
+ }
+
+ return NumberOfBytes;
+}
+
+/**
+ Check to see if any data is available to be read from the debug device.
+
+ @retval EFI_SUCCESS At least one byte of data is available to be read
+ @retval EFI_NOT_READY No data is available to be read
+ @retval EFI_DEVICE_ERROR The serial device is not functioning properly
+
+**/
+BOOLEAN
+EFIAPI
+SerialPortPoll (
+ VOID
+ )
+{
+ UINTN UartBase;
+
+ UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
+
+ return ((MmioRead8 (UartBase + ULSR) & DUART_LSR_DR) != 0);
+}
+
+/**
+ Set new attributes to LS1043a.
+
+ @param BaudRate The baud rate of the serial device. If the baud rate is not supported,
+ the speed will be reduced down to the nearest supported one and the
+ variable's value will be updated accordingly.
+ @param ReceiveFifoDepth The number of characters the device will buffer on input. If the specified
+ value is not supported, the variable's value will be reduced down to the
+ nearest supported one.
+ @param Timeout If applicable, the number of microseconds the device will wait
+ before timing out a Read or a Write operation.
+ @param Parity If applicable, this is the EFI_PARITY_TYPE that is computed or checked
+ as each character is transmitted or received. If the device does not
+ support parity, the value is the default parity value.
+ @param DataBits The number of data bits in each character
+ @param StopBits If applicable, the EFI_STOP_BITS_TYPE number of stop bits per character.
+ If the device does not support stop bits, the value is the default stop
+ bit value.
+
+ @retval EFI_SUCCESS All attributes were set correctly on the serial device.
+
+**/
+EFI_STATUS
+EFIAPI
+SerialPortSetAttributes (
+ IN OUT UINT64 *BaudRate,
+ IN OUT UINT32 *ReceiveFifoDepth,
+ IN OUT UINT32 *Timeout,
+ IN OUT EFI_PARITY_TYPE *Parity,
+ IN OUT UINT8 *DataBits,
+ IN OUT EFI_STOP_BITS_TYPE *StopBits
+ )
+{
+ return SerialPortInitialize ();
+}
diff --git a/Platform/NXP/Library/DUartPortLib/DUartPortLib.inf b/Platform/NXP/Library/DUartPortLib/DUartPortLib.inf
new file mode 100644
index 0000000..ead8b40
--- /dev/null
+++ b/Platform/NXP/Library/DUartPortLib/DUartPortLib.inf
@@ -0,0 +1,39 @@
+# DUartPortLib.inf
+#
+# Component description file for DUartPortLib module
+#
+# Copyright (c) 2013, Freescale Ltd. All rights reserved.
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = DUartPortLib
+ FILE_GUID = 8ecefc8f-a2c4-4091-b80f-20f7aeb0567f
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = SerialPortLib
+
+[Sources.common]
+ DUartPortLib.c
+
+[LibraryClasses]
+ PcdLib
+ SocLib
+
+[Packages]
+ MdeModulePkg/MdeModulePkg.dec
+ MdePkg/MdePkg.dec
+
+[Pcd]
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase
+ gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate
--
1.9.1
^ permalink raw reply related [flat|nested] 39+ messages in thread
* Re: [PATCH 05/10] Platform/NXP : Add support for DUART library
2017-11-07 14:42 ` [PATCH 05/10] Platform/NXP : Add support for DUART library Meenakshi Aggarwal
@ 2017-11-13 12:28 ` Ard Biesheuvel
2017-11-14 4:12 ` Meenakshi Aggarwal
0 siblings, 1 reply; 39+ messages in thread
From: Ard Biesheuvel @ 2017-11-13 12:28 UTC (permalink / raw)
To: Meenakshi Aggarwal
Cc: Leif Lindholm, Kinney, Michael D, edk2-devel@lists.01.org,
Udit Kumar, Varun Sethi
On 7 November 2017 at 14:42, Meenakshi Aggarwal
<meenakshi.aggarwal@nxp.com> wrote:
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> ---
> Platform/NXP/Library/DUartPortLib/DUart.h | 128 ++++++++
> Platform/NXP/Library/DUartPortLib/DUartPortLib.c | 334 +++++++++++++++++++++
> Platform/NXP/Library/DUartPortLib/DUartPortLib.inf | 39 +++
> 3 files changed, 501 insertions(+)
> create mode 100644 Platform/NXP/Library/DUartPortLib/DUart.h
> create mode 100644 Platform/NXP/Library/DUartPortLib/DUartPortLib.c
> create mode 100644 Platform/NXP/Library/DUartPortLib/DUartPortLib.inf
>
> diff --git a/Platform/NXP/Library/DUartPortLib/DUart.h b/Platform/NXP/Library/DUartPortLib/DUart.h
> new file mode 100644
> index 0000000..907790b
> --- /dev/null
> +++ b/Platform/NXP/Library/DUartPortLib/DUart.h
> @@ -0,0 +1,128 @@
> +/** DUart.h
> +* Header defining the DUART constants (Base addresses, sizes, flags)
> +*
> +* Based on Serial I/O Port library headers available in PL011Uart.h
> +*
> +* Copyright (c) 2011-2012, ARM Limited. All rights reserved.
> +* Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
> +* Copyright 2017 NXP
> +*
> +* This program and the accompanying materials
> +* are licensed and made available under the terms and conditions of the BSD License
> +* which accompanies this distribution. The full text of the license may be found at
> +* http://opensource.org/licenses/bsd-license.php
> +*
> +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +#ifndef __DUART_H__
> +#define __DUART_H__
> +
> +// FIFO Control Register
> +#define DUART_FCR_FIFO_EN 0x01 /* Fifo enable */
> +#define DUART_FCR_CLEAR_RCVR 0x02 /* Clear the RCVR FIFO */
> +#define DUART_FCR_CLEAR_XMIT 0x04 /* Clear the XMIT FIFO */
> +#define DUART_FCR_DMA_SELECT 0x08 /* For DMA applications */
> +#define DUART_FCR_TRIGGER_MASK 0xC0 /* Mask for the FIFO trigger range */
> +#define DUART_FCR_TRIGGER_1 0x00 /* Mask for trigger set at 1 */
> +#define DUART_FCR_TRIGGER_4 0x40 /* Mask for trigger set at 4 */
> +#define DUART_FCR_TRIGGER_8 0x80 /* Mask for trigger set at 8 */
> +#define DUART_FCR_TRIGGER_14 0xC0 /* Mask for trigger set at 14 */
> +#define DUART_FCR_RXSR 0x02 /* Receiver soft reset */
> +#define DUART_FCR_TXSR 0x04 /* Transmitter soft reset */
> +
> +// Modem Control Register
> +#define DUART_MCR_DTR 0x01 /* Reserved */
> +#define DUART_MCR_RTS 0x02 /* RTS */
> +#define DUART_MCR_OUT1 0x04 /* Reserved */
> +#define DUART_MCR_OUT2 0x08 /* Reserved */
> +#define DUART_MCR_LOOP 0x10 /* Enable loopback test mode */
> +#define DUART_MCR_AFE 0x20 /* AFE (Auto Flow Control) */
> +#define DUART_MCR_DMA_EN 0x04
> +#define DUART_MCR_TX_DFR 0x08
> +
> +// Line Control Register
> +/*
> +* Note: if the word length is 5 bits (DUART_LCR_WLEN5), then setting
> +* DUART_LCR_STOP will select 1.5 stop bits, not 2 stop bits.
> +*/
> +#define DUART_LCR_WLS_MSK 0x03 /* character length select mask */
> +#define DUART_LCR_WLS_5 0x00 /* 5 bit character length */
> +#define DUART_LCR_WLS_6 0x01 /* 6 bit character length */
> +#define DUART_LCR_WLS_7 0x02 /* 7 bit character length */
> +#define DUART_LCR_WLS_8 0x03 /* 8 bit character length */
> +#define DUART_LCR_STB 0x04 /* # stop Bits, off=1, on=1.5 or 2) */
> +#define DUART_LCR_PEN 0x08 /* Parity eneble */
> +#define DUART_LCR_EPS 0x10 /* Even Parity Select */
> +#define DUART_LCR_STKP 0x20 /* Stick Parity */
> +#define DUART_LCR_SBRK 0x40 /* Set Break */
> +#define DUART_LCR_BKSE 0x80 /* Bank select enable */
> +#define DUART_LCR_DLAB 0x80 /* Divisor latch access bit */
> +
> +// Line Status Register
> +#define DUART_LSR_DR 0x01 /* Data ready */
> +#define DUART_LSR_OE 0x02 /* Overrun */
> +#define DUART_LSR_PE 0x04 /* Parity error */
> +#define DUART_LSR_FE 0x08 /* Framing error */
> +#define DUART_LSR_BI 0x10 /* Break */
> +#define DUART_LSR_THRE 0x20 /* Xmit holding register empty */
> +#define DUART_LSR_TEMT 0x40 /* Xmitter empty */
> +#define DUART_LSR_ERR 0x80 /* Error */
> +
> +// Modem Status Register
> +#define DUART_MSR_DCTS 0x01 /* Delta CTS */
> +#define DUART_MSR_DDSR 0x02 /* Reserved */
> +#define DUART_MSR_TERI 0x04 /* Reserved */
> +#define DUART_MSR_DDCD 0x08 /* Reserved */
> +#define DUART_MSR_CTS 0x10 /* Clear to Send */
> +#define DUART_MSR_DSR 0x20 /* Reserved */
> +#define DUART_MSR_RI 0x40 /* Reserved */
> +#define DUART_MSR_DCD 0x80 /* Reserved */
> +
> +// Interrupt Identification Register
> +#define DUART_IIR_NO_INT 0x01 /* No interrupts pending */
> +#define DUART_IIR_ID 0x06 /* Mask for the interrupt ID */
> +#define DUART_IIR_MSI 0x00 /* Modem status interrupt */
> +#define DUART_IIR_THRI 0x02 /* Transmitter holding register empty */
> +#define DUART_IIR_RDI 0x04 /* Receiver data interrupt */
> +#define DUART_IIR_RLSI 0x06 /* Receiver line status interrupt */
> +
> +// Interrupt Enable Register
> +#define DUART_IER_MSI 0x08 /* Enable Modem status interrupt */
> +#define DUART_IER_RLSI 0x04 /* Enable receiver line status interrupt */
> +#define DUART_IER_THRI 0x02 /* Enable Transmitter holding register int. */
> +#define DUART_IER_RDI 0x01 /* Enable receiver data interrupt */
> +
> +// LCR defaults
> +#define DUART_LCR_8N1 0x03
> +#define DUART_LCRVAL DUART_LCR_8N1 /* 8 data, 1 stop, no parity */
> +#define DUART_MCRVAL (DUART_MCR_DTR | \
> + DUART_MCR_RTS) /* RTS/DTR */
> +#define DUART_FCRVAL (DUART_FCR_FIFO_EN | \
> + DUART_FCR_RXSR | \
> + DUART_FCR_TXSR) /* Clear & enable FIFOs */
> +
> +#define URBR 0x0
> +#define UTHR 0x0
> +#define UDLB 0x0
> +#define UDMB 0x1
> +#define UIER 0x1
> +#define UIIR 0x2
> +#define UFCR 0x2
> +#define UAFR 0x2
> +#define ULCR 0x3
> +#define UMCR 0x4
> +#define ULSR 0x5
> +#define UMSR 0x6
> +#define USCR 0x7
> +#define UDSR 0x10
> +
> +extern
> +UINT32
> +CalculateBaudDivisor (
> + IN UINT64 BaudRate
> + );
> +
> +#endif /* __DUART_H__ */
> diff --git a/Platform/NXP/Library/DUartPortLib/DUartPortLib.c b/Platform/NXP/Library/DUartPortLib/DUartPortLib.c
> new file mode 100644
> index 0000000..99766d1
> --- /dev/null
> +++ b/Platform/NXP/Library/DUartPortLib/DUartPortLib.c
> @@ -0,0 +1,334 @@
> +/** DuartPortLib.c
> + DUART (NS16550) library functions
> +
> + Based on Serial I/O Port library functions available in PL011SerialPortLib.c
> +
> + Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
> + Copyright (c) 2012 - 2013, ARM Ltd. All rights reserved.<BR>
> + Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
> + Copyright 2017 NXP
> +
> + This program and the accompanying materials
> + are licensed and made available under the terms and conditions of the BSD License
> + which accompanies this distribution. The full text of the license may be found at
> + http://opensource.org/licenses/bsd-license.php
> +
> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#include <Base.h>
> +#include <Library/IoLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/SerialPortLib.h>
> +
> +#include "DUart.h"
> +
> +STATIC CONST UINT32 mInvalidControlBits = (EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE | \
> + EFI_SERIAL_DATA_TERMINAL_READY);
> +
> +/**
> + Assert or deassert the control signals on a serial port.
> + The following control signals are set according their bit settings :
> + . Request to Send
> + . Data Terminal Ready
> +
> + @param[in] Control The following bits are taken into account :
> + . EFI_SERIAL_REQUEST_TO_SEND : assert/deassert the
> + "Request To Send" control signal if this bit is
> + equal to one/zero.
> + . EFI_SERIAL_DATA_TERMINAL_READY : assert/deassert
> + the "Data Terminal Ready" control signal if this
> + bit is equal to one/zero.
> + . EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE : enable/disable
> + the hardware loopback if this bit is equal to
> + one/zero.
> + . EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE : not supported.
> + . EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE : enable/
> + disable the hardware flow control based on CTS (Clear
> + To Send) and RTS (Ready To Send) control signals.
> +
> + @retval EFI_SUCCESS The new control bits were set on the device.
> + @retval EFI_UNSUPPORTED The device does not support this operation.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +SerialPortSetControl (
> + IN UINT32 Control
> + )
> +{
> + UINT32 McrBits;
> + UINTN UartBase;
> +
> + UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
> +
> + if (Control & (mInvalidControlBits)) {
> + return EFI_UNSUPPORTED;
> + }
> +
> + McrBits = MmioRead8 (UartBase + UMCR);
> +
> + if (Control & EFI_SERIAL_REQUEST_TO_SEND) {
> + McrBits |= DUART_MCR_RTS;
> + } else {
> + McrBits &= ~DUART_MCR_RTS;
> + }
> +
> + if (Control & EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE) {
> + McrBits |= DUART_MCR_LOOP;
> + } else {
> + McrBits &= ~DUART_MCR_LOOP;
> + }
> +
> + if (Control & EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE) {
> + McrBits |= DUART_MCR_AFE;
> + } else {
> + McrBits &= ~DUART_MCR_AFE;
> + }
> +
> + MmioWrite32 (UartBase + UMCR, McrBits);
> +
> + return EFI_SUCCESS;
> +}
> +
> +/**
> + Retrieve the status of the control bits on a serial device.
> +
> + @param[out] Control Status of the control bits on a serial device :
> +
> + . EFI_SERIAL_DATA_CLEAR_TO_SEND,
> + EFI_SERIAL_DATA_SET_READY,
> + EFI_SERIAL_RING_INDICATE,
> + EFI_SERIAL_CARRIER_DETECT,
> + EFI_SERIAL_REQUEST_TO_SEND,
> + EFI_SERIAL_DATA_TERMINAL_READY
> + are all related to the DTE (Data Terminal Equipment)
> + and DCE (Data Communication Equipment) modes of
> + operation of the serial device.
> + . EFI_SERIAL_INPUT_BUFFER_EMPTY : equal to one if the
> + receive buffer is empty, 0 otherwise.
> + . EFI_SERIAL_OUTPUT_BUFFER_EMPTY : equal to one if the
> + transmit buffer is empty, 0 otherwise.
> + . EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE : equal to one if
> + the hardware loopback is enabled (the ouput feeds the
> + receive buffer), 0 otherwise.
> + . EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE : equal to one if
> + a loopback is accomplished by software, 0 otherwise.
> + . EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE : equal to
> + one if the hardware flow control based on CTS (Clear
> + To Send) and RTS (Ready To Send) control signals is
> + enabled, 0 otherwise.
> +
> + @retval EFI_SUCCESS The control bits were read from the serial device.
> +
> +**/
> +
> +EFI_STATUS
> +EFIAPI
> +SerialPortGetControl (
> + OUT UINT32 *Control
> + )
> +{
> + UINT32 MsrRegister;
> + UINT32 McrRegister;
> + UINT32 LsrRegister;
> + UINTN UartBase;
> +
> + UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
> +
> + MsrRegister = MmioRead8 (UartBase + UMSR);
> + McrRegister = MmioRead8 (UartBase + UMCR);
> + LsrRegister = MmioRead8 (UartBase + ULSR);
> +
> + *Control = 0;
> +
> + if ((MsrRegister & DUART_MSR_CTS) == DUART_MSR_CTS) {
> + *Control |= EFI_SERIAL_CLEAR_TO_SEND;
> + }
> +
> + if ((McrRegister & DUART_MCR_RTS) == DUART_MCR_RTS) {
> + *Control |= EFI_SERIAL_REQUEST_TO_SEND;
> + }
> +
> + if ((LsrRegister & DUART_LSR_TEMT) == DUART_LSR_TEMT) {
> + *Control |= EFI_SERIAL_OUTPUT_BUFFER_EMPTY;
> + }
> +
> + if ((McrRegister & DUART_MCR_AFE) == DUART_MCR_AFE) {
> + *Control |= EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE;
> + }
> +
> + if ((McrRegister & DUART_MCR_LOOP) == DUART_MCR_LOOP) {
> + *Control |= EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE;
> + }
> +
> + return EFI_SUCCESS;
> +}
> +
> +/**
> + Programmed hardware of Serial port.
> +
> + @return Always return EFI_SUCCESS.
> +
> +**/
> +
> +EFI_STATUS
> +EFIAPI
> +SerialPortInitialize (
> + VOID
> + )
> +{
> + UINT64 BaudRate;
> + UINT32 BaudDivisor;
> + UINTN UartBase;
> +
> + UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
> + BaudRate = (UINTN)PcdGet64 (PcdUartDefaultBaudRate);
> +
> + BaudDivisor = CalculateBaudDivisor(BaudRate);
> +
> + while (!(MmioRead8(UartBase + ULSR) & DUART_LSR_TEMT));
> +
> + //
> + // Enable received data available interrupt, setup data format,
> + // setup baud divisor
> + //
> + MmioWrite8(UartBase + UIER, 0x1);
> + MmioWrite8(UartBase + ULCR, DUART_LCR_BKSE | DUART_LCRVAL);
> + MmioWrite8(UartBase + UDLB, 0);
> + MmioWrite8(UartBase + UDMB, 0);
> + MmioWrite8(UartBase + ULCR, DUART_LCRVAL);
> + MmioWrite8(UartBase + UMCR, DUART_MCRVAL);
> + MmioWrite8(UartBase + UFCR, DUART_FCRVAL);
> + MmioWrite8(UartBase + ULCR, DUART_LCR_BKSE | DUART_LCRVAL);
> + MmioWrite8(UartBase + UDLB, BaudDivisor & 0xff);
> + MmioWrite8(UartBase + UDMB, (BaudDivisor >> 8) & 0xff);
> + MmioWrite8(UartBase + ULCR, DUART_LCRVAL);
> +
> + return EFI_SUCCESS;
> +}
> +
> +/**
> + Write data to serial device.
> +
> + @param Buffer Point of data buffer which need to be written.
> + @param NumberOfBytes Number of output bytes which are cached in Buffer.
> +
> + @retval 0 Write data failed.
> + @retval !0 Actual number of bytes written to serial device.
> +
> +**/
> +UINTN
> +EFIAPI
> +SerialPortWrite (
> + IN UINT8 *Buffer,
> + IN UINTN NumberOfBytes
> + )
> +{
> + UINT8 *Final;
> + UINTN UartBase;
> +
> + Final = &Buffer[NumberOfBytes];
> + UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
> +
> + while (Buffer < Final) {
> + while ((MmioRead8(UartBase + ULSR) & DUART_LSR_THRE) == 0);
> + MmioWrite8(UartBase + UTHR, *Buffer++);
Space before ( [2x]
> + }
> +
> + return NumberOfBytes;
> +}
> +
> +/**
> + Read data from serial device and save the data in buffer.
> +
> + @param Buffer Point of data buffer which need to be written.
> + @param NumberOfBytes Number of output bytes which are cached in Buffer.
> +
> + @retval 0 Read data failed.
> + @retval !0 Actual number of bytes read from serial device.
> +
> +**/
> +UINTN
> +EFIAPI
> +SerialPortRead (
> + OUT UINT8 *Buffer,
> + IN UINTN NumberOfBytes
> + )
> +{
> + UINTN Count;
> + UINTN UartBase;
> +
> + UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
> +
> + for (Count = 0; Count < NumberOfBytes; Count++, Buffer++) {
> + /*
> + * Loop while waiting for a new char(s) to arrive in the
> + * RxFIFO
> + */
> + while ((MmioRead8(UartBase + ULSR) & DUART_LSR_DR) == 0);
> +
> + *Buffer = MmioRead8(UartBase + URBR);
and here
> + }
> +
> + return NumberOfBytes;
> +}
> +
> +/**
> + Check to see if any data is available to be read from the debug device.
> +
> + @retval EFI_SUCCESS At least one byte of data is available to be read
> + @retval EFI_NOT_READY No data is available to be read
> + @retval EFI_DEVICE_ERROR The serial device is not functioning properly
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +SerialPortPoll (
> + VOID
> + )
> +{
> + UINTN UartBase;
> +
> + UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
> +
> + return ((MmioRead8 (UartBase + ULSR) & DUART_LSR_DR) != 0);
> +}
> +
> +/**
> + Set new attributes to LS1043a.
> +
> + @param BaudRate The baud rate of the serial device. If the baud rate is not supported,
> + the speed will be reduced down to the nearest supported one and the
> + variable's value will be updated accordingly.
> + @param ReceiveFifoDepth The number of characters the device will buffer on input. If the specified
> + value is not supported, the variable's value will be reduced down to the
> + nearest supported one.
> + @param Timeout If applicable, the number of microseconds the device will wait
> + before timing out a Read or a Write operation.
> + @param Parity If applicable, this is the EFI_PARITY_TYPE that is computed or checked
> + as each character is transmitted or received. If the device does not
> + support parity, the value is the default parity value.
> + @param DataBits The number of data bits in each character
> + @param StopBits If applicable, the EFI_STOP_BITS_TYPE number of stop bits per character.
> + If the device does not support stop bits, the value is the default stop
> + bit value.
> +
> + @retval EFI_SUCCESS All attributes were set correctly on the serial device.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +SerialPortSetAttributes (
> + IN OUT UINT64 *BaudRate,
> + IN OUT UINT32 *ReceiveFifoDepth,
> + IN OUT UINT32 *Timeout,
> + IN OUT EFI_PARITY_TYPE *Parity,
> + IN OUT UINT8 *DataBits,
> + IN OUT EFI_STOP_BITS_TYPE *StopBits
> + )
> +{
> + return SerialPortInitialize ();
> +}
> diff --git a/Platform/NXP/Library/DUartPortLib/DUartPortLib.inf b/Platform/NXP/Library/DUartPortLib/DUartPortLib.inf
> new file mode 100644
> index 0000000..ead8b40
> --- /dev/null
> +++ b/Platform/NXP/Library/DUartPortLib/DUartPortLib.inf
> @@ -0,0 +1,39 @@
> +# DUartPortLib.inf
> +#
> +# Component description file for DUartPortLib module
> +#
> +# Copyright (c) 2013, Freescale Ltd. All rights reserved.
> +# Copyright 2017 NXP
> +#
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD License
> +# which accompanies this distribution. The full text of the license may be found at
> +# http://opensource.org/licenses/bsd-license.php
> +#
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +#
> +#
> +
> +[Defines]
> + INF_VERSION = 0x00010005
0x0001001A
> + BASE_NAME = DUartPortLib
> + FILE_GUID = 8ecefc8f-a2c4-4091-b80f-20f7aeb0567f
Please don't reuse the GUID of PL011SerialPortLib.inf
> + MODULE_TYPE = BASE
> + VERSION_STRING = 1.0
> + LIBRARY_CLASS = SerialPortLib
> +
> +[Sources.common]
> + DUartPortLib.c
> +
> +[LibraryClasses]
> + PcdLib
> + SocLib
Please reorder this patch after the patch that introduces SocLib
> +
> +[Packages]
> + MdeModulePkg/MdeModulePkg.dec
> + MdePkg/MdePkg.dec
> +
> +[Pcd]
> + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase
> + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate
> --
> 1.9.1
>
^ permalink raw reply [flat|nested] 39+ messages in thread
* Re: [PATCH 05/10] Platform/NXP : Add support for DUART library
2017-11-13 12:28 ` Ard Biesheuvel
@ 2017-11-14 4:12 ` Meenakshi Aggarwal
0 siblings, 0 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-14 4:12 UTC (permalink / raw)
To: Ard Biesheuvel
Cc: Leif Lindholm, Kinney, Michael D, edk2-devel@lists.01.org,
Udit Kumar, Varun Sethi
> -----Original Message-----
> From: Ard Biesheuvel [mailto:ard.biesheuvel@linaro.org]
> Sent: Monday, November 13, 2017 5:59 PM
> To: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> Cc: Leif Lindholm <leif.lindholm@linaro.org>; Kinney, Michael D
> <michael.d.kinney@intel.com>; edk2-devel@lists.01.org; Udit Kumar
> <udit.kumar@nxp.com>; Varun Sethi <V.Sethi@nxp.com>
> Subject: Re: [PATCH 05/10] Platform/NXP : Add support for DUART library
>
> On 7 November 2017 at 14:42, Meenakshi Aggarwal
> <meenakshi.aggarwal@nxp.com> wrote:
> > Contributed-under: TianoCore Contribution Agreement 1.1
> > Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> > ---
> > Platform/NXP/Library/DUartPortLib/DUart.h | 128 ++++++++
> > Platform/NXP/Library/DUartPortLib/DUartPortLib.c | 334
> +++++++++++++++++++++
> > Platform/NXP/Library/DUartPortLib/DUartPortLib.inf | 39 +++
> > 3 files changed, 501 insertions(+)
> > create mode 100644 Platform/NXP/Library/DUartPortLib/DUart.h
> > create mode 100644 Platform/NXP/Library/DUartPortLib/DUartPortLib.c
> > create mode 100644 Platform/NXP/Library/DUartPortLib/DUartPortLib.inf
> >
> > diff --git a/Platform/NXP/Library/DUartPortLib/DUart.h
> > b/Platform/NXP/Library/DUartPortLib/DUart.h
> > new file mode 100644
> > index 0000000..907790b
> > --- /dev/null
> > +++ b/Platform/NXP/Library/DUartPortLib/DUart.h
> > @@ -0,0 +1,128 @@
> > +/** DUart.h
> > +* Header defining the DUART constants (Base addresses, sizes, flags)
> > +*
> > +* Based on Serial I/O Port library headers available in PL011Uart.h
> > +*
> > +* Copyright (c) 2011-2012, ARM Limited. All rights reserved.
> > +* Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
> > +* Copyright 2017 NXP
> > +*
> > +* This program and the accompanying materials
> > +* are licensed and made available under the terms and conditions of
> > +the BSD License
> > +* which accompanies this distribution. The full text of the license
> > +may be found at
> > +*
> >
> +https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> e
> > +nsource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.agg
> >
> +arwal%40nxp.com%7C1ca9bf8b8a2e47ac2b4608d52a921bdc%7C686ea1d3bc
> 2b4c6f
> >
> +a92cd99c5c301635%7C0%7C0%7C636461729393076197&sdata=HSBbU2pCf%
> 2F1MAPr
> > +69WVzzxn6HwycvOQexxGhw%2Fwg4GU%3D&reserved=0
> > +*
> > +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > +BASIS,
> > +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> > +*
> > +**/
> > +
> > +#ifndef __DUART_H__
> > +#define __DUART_H__
> > +
> > +// FIFO Control Register
> > +#define DUART_FCR_FIFO_EN 0x01 /* Fifo enable */
> > +#define DUART_FCR_CLEAR_RCVR 0x02 /* Clear the RCVR FIFO */
> > +#define DUART_FCR_CLEAR_XMIT 0x04 /* Clear the XMIT FIFO */
> > +#define DUART_FCR_DMA_SELECT 0x08 /* For DMA applications */
> > +#define DUART_FCR_TRIGGER_MASK 0xC0 /* Mask for the FIFO trigger
> range */
> > +#define DUART_FCR_TRIGGER_1 0x00 /* Mask for trigger set at 1 */
> > +#define DUART_FCR_TRIGGER_4 0x40 /* Mask for trigger set at 4 */
> > +#define DUART_FCR_TRIGGER_8 0x80 /* Mask for trigger set at 8 */
> > +#define DUART_FCR_TRIGGER_14 0xC0 /* Mask for trigger set at 14 */
> > +#define DUART_FCR_RXSR 0x02 /* Receiver soft reset */
> > +#define DUART_FCR_TXSR 0x04 /* Transmitter soft reset */
> > +
> > +// Modem Control Register
> > +#define DUART_MCR_DTR 0x01 /* Reserved */
> > +#define DUART_MCR_RTS 0x02 /* RTS */
> > +#define DUART_MCR_OUT1 0x04 /* Reserved */
> > +#define DUART_MCR_OUT2 0x08 /* Reserved */
> > +#define DUART_MCR_LOOP 0x10 /* Enable loopback test mode */
> > +#define DUART_MCR_AFE 0x20 /* AFE (Auto Flow Control) */
> > +#define DUART_MCR_DMA_EN 0x04
> > +#define DUART_MCR_TX_DFR 0x08
> > +
> > +// Line Control Register
> > +/*
> > +* Note: if the word length is 5 bits (DUART_LCR_WLEN5), then setting
> > +* DUART_LCR_STOP will select 1.5 stop bits, not 2 stop bits.
> > +*/
> > +#define DUART_LCR_WLS_MSK 0x03 /* character length select mask
> */
> > +#define DUART_LCR_WLS_5 0x00 /* 5 bit character length */
> > +#define DUART_LCR_WLS_6 0x01 /* 6 bit character length */
> > +#define DUART_LCR_WLS_7 0x02 /* 7 bit character length */
> > +#define DUART_LCR_WLS_8 0x03 /* 8 bit character length */
> > +#define DUART_LCR_STB 0x04 /* # stop Bits, off=1, on=1.5 or 2) */
> > +#define DUART_LCR_PEN 0x08 /* Parity eneble */
> > +#define DUART_LCR_EPS 0x10 /* Even Parity Select */
> > +#define DUART_LCR_STKP 0x20 /* Stick Parity */
> > +#define DUART_LCR_SBRK 0x40 /* Set Break */
> > +#define DUART_LCR_BKSE 0x80 /* Bank select enable */
> > +#define DUART_LCR_DLAB 0x80 /* Divisor latch access bit */
> > +
> > +// Line Status Register
> > +#define DUART_LSR_DR 0x01 /* Data ready */
> > +#define DUART_LSR_OE 0x02 /* Overrun */
> > +#define DUART_LSR_PE 0x04 /* Parity error */
> > +#define DUART_LSR_FE 0x08 /* Framing error */
> > +#define DUART_LSR_BI 0x10 /* Break */
> > +#define DUART_LSR_THRE 0x20 /* Xmit holding register empty */
> > +#define DUART_LSR_TEMT 0x40 /* Xmitter empty */
> > +#define DUART_LSR_ERR 0x80 /* Error */
> > +
> > +// Modem Status Register
> > +#define DUART_MSR_DCTS 0x01 /* Delta CTS */
> > +#define DUART_MSR_DDSR 0x02 /* Reserved */
> > +#define DUART_MSR_TERI 0x04 /* Reserved */
> > +#define DUART_MSR_DDCD 0x08 /* Reserved */
> > +#define DUART_MSR_CTS 0x10 /* Clear to Send */
> > +#define DUART_MSR_DSR 0x20 /* Reserved */
> > +#define DUART_MSR_RI 0x40 /* Reserved */
> > +#define DUART_MSR_DCD 0x80 /* Reserved */
> > +
> > +// Interrupt Identification Register
> > +#define DUART_IIR_NO_INT 0x01 /* No interrupts pending */
> > +#define DUART_IIR_ID 0x06 /* Mask for the interrupt ID */
> > +#define DUART_IIR_MSI 0x00 /* Modem status interrupt */
> > +#define DUART_IIR_THRI 0x02 /* Transmitter holding register
> empty */
> > +#define DUART_IIR_RDI 0x04 /* Receiver data interrupt */
> > +#define DUART_IIR_RLSI 0x06 /* Receiver line status interrupt */
> > +
> > +// Interrupt Enable Register
> > +#define DUART_IER_MSI 0x08 /* Enable Modem status interrupt */
> > +#define DUART_IER_RLSI 0x04 /* Enable receiver line status
> interrupt */
> > +#define DUART_IER_THRI 0x02 /* Enable Transmitter holding
> register int. */
> > +#define DUART_IER_RDI 0x01 /* Enable receiver data interrupt */
> > +
> > +// LCR defaults
> > +#define DUART_LCR_8N1 0x03
> > +#define DUART_LCRVAL DUART_LCR_8N1 /* 8 data, 1 stop, no
> parity */
> > +#define DUART_MCRVAL (DUART_MCR_DTR | \
> > + DUART_MCR_RTS) /* RTS/DTR */
> > +#define DUART_FCRVAL (DUART_FCR_FIFO_EN | \
> > + DUART_FCR_RXSR | \
> > + DUART_FCR_TXSR) /* Clear & enable FIFOs */
> > +
> > +#define URBR 0x0
> > +#define UTHR 0x0
> > +#define UDLB 0x0
> > +#define UDMB 0x1
> > +#define UIER 0x1
> > +#define UIIR 0x2
> > +#define UFCR 0x2
> > +#define UAFR 0x2
> > +#define ULCR 0x3
> > +#define UMCR 0x4
> > +#define ULSR 0x5
> > +#define UMSR 0x6
> > +#define USCR 0x7
> > +#define UDSR 0x10
> > +
> > +extern
> > +UINT32
> > +CalculateBaudDivisor (
> > + IN UINT64 BaudRate
> > + );
> > +
> > +#endif /* __DUART_H__ */
> > diff --git a/Platform/NXP/Library/DUartPortLib/DUartPortLib.c
> > b/Platform/NXP/Library/DUartPortLib/DUartPortLib.c
> > new file mode 100644
> > index 0000000..99766d1
> > --- /dev/null
> > +++ b/Platform/NXP/Library/DUartPortLib/DUartPortLib.c
> > @@ -0,0 +1,334 @@
> > +/** DuartPortLib.c
> > + DUART (NS16550) library functions
> > +
> > + Based on Serial I/O Port library functions available in
> > + PL011SerialPortLib.c
> > +
> > + Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
> > + Copyright (c) 2012 - 2013, ARM Ltd. All rights reserved.<BR>
> > + Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
> > + Copyright 2017 NXP
> > +
> > + This program and the accompanying materials are licensed and made
> > + available under the terms and conditions of the BSD License which
> > + accompanies this distribution. The full text of the license may be
> > + found at
> > +
> > +
> https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> > + ensource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.a
> > +
> ggarwal%40nxp.com%7C1ca9bf8b8a2e47ac2b4608d52a921bdc%7C686ea1d3b
> c2b4
> > +
> c6fa92cd99c5c301635%7C0%7C0%7C636461729393076197&sdata=HSBbU2pCf
> %2F1
> > + MAPr69WVzzxn6HwycvOQexxGhw%2Fwg4GU%3D&reserved=0
> > +
> > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > + BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +
> > +**/
> > +
> > +#include <Base.h>
> > +#include <Library/IoLib.h>
> > +#include <Library/PcdLib.h>
> > +#include <Library/SerialPortLib.h>
> > +
> > +#include "DUart.h"
> > +
> > +STATIC CONST UINT32 mInvalidControlBits =
> (EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE | \
> > +
> > +EFI_SERIAL_DATA_TERMINAL_READY);
> > +
> > +/**
> > + Assert or deassert the control signals on a serial port.
> > + The following control signals are set according their bit settings :
> > + . Request to Send
> > + . Data Terminal Ready
> > +
> > + @param[in] Control The following bits are taken into account :
> > + . EFI_SERIAL_REQUEST_TO_SEND : assert/deassert the
> > + "Request To Send" control signal if this bit is
> > + equal to one/zero.
> > + . EFI_SERIAL_DATA_TERMINAL_READY : assert/deassert
> > + the "Data Terminal Ready" control signal if this
> > + bit is equal to one/zero.
> > + . EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE :
> enable/disable
> > + the hardware loopback if this bit is equal to
> > + one/zero.
> > + . EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE : not
> supported.
> > + . EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE : enable/
> > + disable the hardware flow control based on CTS (Clear
> > + To Send) and RTS (Ready To Send) control signals.
> > +
> > + @retval EFI_SUCCESS The new control bits were set on the device.
> > + @retval EFI_UNSUPPORTED The device does not support this
> operation.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +SerialPortSetControl (
> > + IN UINT32 Control
> > + )
> > +{
> > + UINT32 McrBits;
> > + UINTN UartBase;
> > +
> > + UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
> > +
> > + if (Control & (mInvalidControlBits)) {
> > + return EFI_UNSUPPORTED;
> > + }
> > +
> > + McrBits = MmioRead8 (UartBase + UMCR);
> > +
> > + if (Control & EFI_SERIAL_REQUEST_TO_SEND) {
> > + McrBits |= DUART_MCR_RTS;
> > + } else {
> > + McrBits &= ~DUART_MCR_RTS;
> > + }
> > +
> > + if (Control & EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE) {
> > + McrBits |= DUART_MCR_LOOP;
> > + } else {
> > + McrBits &= ~DUART_MCR_LOOP;
> > + }
> > +
> > + if (Control & EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE) {
> > + McrBits |= DUART_MCR_AFE;
> > + } else {
> > + McrBits &= ~DUART_MCR_AFE;
> > + }
> > +
> > + MmioWrite32 (UartBase + UMCR, McrBits);
> > +
> > + return EFI_SUCCESS;
> > +}
> > +
> > +/**
> > + Retrieve the status of the control bits on a serial device.
> > +
> > + @param[out] Control Status of the control bits on a serial device :
> > +
> > + . EFI_SERIAL_DATA_CLEAR_TO_SEND,
> > + EFI_SERIAL_DATA_SET_READY,
> > + EFI_SERIAL_RING_INDICATE,
> > + EFI_SERIAL_CARRIER_DETECT,
> > + EFI_SERIAL_REQUEST_TO_SEND,
> > + EFI_SERIAL_DATA_TERMINAL_READY
> > + are all related to the DTE (Data Terminal Equipment)
> > + and DCE (Data Communication Equipment) modes of
> > + operation of the serial device.
> > + . EFI_SERIAL_INPUT_BUFFER_EMPTY : equal to one if the
> > + receive buffer is empty, 0 otherwise.
> > + . EFI_SERIAL_OUTPUT_BUFFER_EMPTY : equal to one if the
> > + transmit buffer is empty, 0 otherwise.
> > + . EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE : equal to one
> if
> > + the hardware loopback is enabled (the ouput feeds the
> > + receive buffer), 0 otherwise.
> > + . EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE : equal to one
> if
> > + a loopback is accomplished by software, 0 otherwise.
> > + . EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE : equal
> to
> > + one if the hardware flow control based on CTS (Clear
> > + To Send) and RTS (Ready To Send) control signals is
> > + enabled, 0 otherwise.
> > +
> > + @retval EFI_SUCCESS The control bits were read from the serial
> device.
> > +
> > +**/
> > +
> > +EFI_STATUS
> > +EFIAPI
> > +SerialPortGetControl (
> > + OUT UINT32 *Control
> > + )
> > +{
> > + UINT32 MsrRegister;
> > + UINT32 McrRegister;
> > + UINT32 LsrRegister;
> > + UINTN UartBase;
> > +
> > + UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
> > +
> > + MsrRegister = MmioRead8 (UartBase + UMSR); McrRegister =
> MmioRead8
> > + (UartBase + UMCR); LsrRegister = MmioRead8 (UartBase + ULSR);
> > +
> > + *Control = 0;
> > +
> > + if ((MsrRegister & DUART_MSR_CTS) == DUART_MSR_CTS) {
> > + *Control |= EFI_SERIAL_CLEAR_TO_SEND; }
> > +
> > + if ((McrRegister & DUART_MCR_RTS) == DUART_MCR_RTS) {
> > + *Control |= EFI_SERIAL_REQUEST_TO_SEND; }
> > +
> > + if ((LsrRegister & DUART_LSR_TEMT) == DUART_LSR_TEMT) {
> > + *Control |= EFI_SERIAL_OUTPUT_BUFFER_EMPTY; }
> > +
> > + if ((McrRegister & DUART_MCR_AFE) == DUART_MCR_AFE) {
> > + *Control |= EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE;
> > + }
> > +
> > + if ((McrRegister & DUART_MCR_LOOP) == DUART_MCR_LOOP) {
> > + *Control |= EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE;
> > + }
> > +
> > + return EFI_SUCCESS;
> > +}
> > +
> > +/**
> > + Programmed hardware of Serial port.
> > +
> > + @return Always return EFI_SUCCESS.
> > +
> > +**/
> > +
> > +EFI_STATUS
> > +EFIAPI
> > +SerialPortInitialize (
> > + VOID
> > + )
> > +{
> > + UINT64 BaudRate;
> > + UINT32 BaudDivisor;
> > + UINTN UartBase;
> > +
> > + UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase); BaudRate =
> > + (UINTN)PcdGet64 (PcdUartDefaultBaudRate);
> > +
> > + BaudDivisor = CalculateBaudDivisor(BaudRate);
> > +
> > + while (!(MmioRead8(UartBase + ULSR) & DUART_LSR_TEMT));
> > +
> > + //
> > + // Enable received data available interrupt, setup data format, //
> > + setup baud divisor // MmioWrite8(UartBase + UIER, 0x1);
> > + MmioWrite8(UartBase + ULCR, DUART_LCR_BKSE | DUART_LCRVAL);
> > + MmioWrite8(UartBase + UDLB, 0); MmioWrite8(UartBase + UDMB, 0);
> > + MmioWrite8(UartBase + ULCR, DUART_LCRVAL); MmioWrite8(UartBase
> +
> > + UMCR, DUART_MCRVAL); MmioWrite8(UartBase + UFCR,
> DUART_FCRVAL);
> > + MmioWrite8(UartBase + ULCR, DUART_LCR_BKSE | DUART_LCRVAL);
> > + MmioWrite8(UartBase + UDLB, BaudDivisor & 0xff);
> > + MmioWrite8(UartBase + UDMB, (BaudDivisor >> 8) & 0xff);
> > + MmioWrite8(UartBase + ULCR, DUART_LCRVAL);
> > +
> > + return EFI_SUCCESS;
> > +}
> > +
> > +/**
> > + Write data to serial device.
> > +
> > + @param Buffer Point of data buffer which need to be written.
> > + @param NumberOfBytes Number of output bytes which are cached in
> Buffer.
> > +
> > + @retval 0 Write data failed.
> > + @retval !0 Actual number of bytes written to serial device.
> > +
> > +**/
> > +UINTN
> > +EFIAPI
> > +SerialPortWrite (
> > + IN UINT8 *Buffer,
> > + IN UINTN NumberOfBytes
> > + )
> > +{
> > + UINT8 *Final;
> > + UINTN UartBase;
> > +
> > + Final = &Buffer[NumberOfBytes];
> > + UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
> > +
> > + while (Buffer < Final) {
> > + while ((MmioRead8(UartBase + ULSR) & DUART_LSR_THRE) == 0);
> > + MmioWrite8(UartBase + UTHR, *Buffer++);
>
> Space before ( [2x]
>
OK, will update all patches.
> > + }
> > +
> > + return NumberOfBytes;
> > +}
> > +
> > +/**
> > + Read data from serial device and save the data in buffer.
> > +
> > + @param Buffer Point of data buffer which need to be written.
> > + @param NumberOfBytes Number of output bytes which are cached in
> Buffer.
> > +
> > + @retval 0 Read data failed.
> > + @retval !0 Actual number of bytes read from serial device.
> > +
> > +**/
> > +UINTN
> > +EFIAPI
> > +SerialPortRead (
> > + OUT UINT8 *Buffer,
> > + IN UINTN NumberOfBytes
> > + )
> > +{
> > + UINTN Count;
> > + UINTN UartBase;
> > +
> > + UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
> > +
> > + for (Count = 0; Count < NumberOfBytes; Count++, Buffer++) {
> > + /*
> > + * Loop while waiting for a new char(s) to arrive in the
> > + * RxFIFO
> > + */
> > + while ((MmioRead8(UartBase + ULSR) & DUART_LSR_DR) == 0);
> > +
> > + *Buffer = MmioRead8(UartBase + URBR);
>
> and here
>
> > + }
> > +
> > + return NumberOfBytes;
> > +}
> > +
> > +/**
> > + Check to see if any data is available to be read from the debug device.
> > +
> > + @retval EFI_SUCCESS At least one byte of data is available to be read
> > + @retval EFI_NOT_READY No data is available to be read
> > + @retval EFI_DEVICE_ERROR The serial device is not functioning
> > + properly
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +SerialPortPoll (
> > + VOID
> > + )
> > +{
> > + UINTN UartBase;
> > +
> > + UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
> > +
> > + return ((MmioRead8 (UartBase + ULSR) & DUART_LSR_DR) != 0); }
> > +
> > +/**
> > + Set new attributes to LS1043a.
> > +
> > + @param BaudRate The baud rate of the serial device. If the baud
> rate is not supported,
> > + the speed will be reduced down to the nearest
> supported one and the
> > + variable's value will be updated accordingly.
> > + @param ReceiveFifoDepth The number of characters the device will
> buffer on input. If the specified
> > + value is not supported, the variable's value will be
> reduced down to the
> > + nearest supported one.
> > + @param Timeout If applicable, the number of microseconds the
> device will wait
> > + before timing out a Read or a Write operation.
> > + @param Parity If applicable, this is the EFI_PARITY_TYPE that is
> computed or checked
> > + as each character is transmitted or received. If the device
> does not
> > + support parity, the value is the default parity value.
> > + @param DataBits The number of data bits in each character
> > + @param StopBits If applicable, the EFI_STOP_BITS_TYPE number
> of stop bits per character.
> > + If the device does not support stop bits, the value is the
> default stop
> > + bit value.
> > +
> > + @retval EFI_SUCCESS All attributes were set correctly on the serial
> device.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +SerialPortSetAttributes (
> > + IN OUT UINT64 *BaudRate,
> > + IN OUT UINT32 *ReceiveFifoDepth,
> > + IN OUT UINT32 *Timeout,
> > + IN OUT EFI_PARITY_TYPE *Parity,
> > + IN OUT UINT8 *DataBits,
> > + IN OUT EFI_STOP_BITS_TYPE *StopBits
> > + )
> > +{
> > + return SerialPortInitialize ();
> > +}
> > diff --git a/Platform/NXP/Library/DUartPortLib/DUartPortLib.inf
> > b/Platform/NXP/Library/DUartPortLib/DUartPortLib.inf
> > new file mode 100644
> > index 0000000..ead8b40
> > --- /dev/null
> > +++ b/Platform/NXP/Library/DUartPortLib/DUartPortLib.inf
> > @@ -0,0 +1,39 @@
> > +# DUartPortLib.inf
> > +#
> > +# Component description file for DUartPortLib module # # Copyright
> > +(c) 2013, Freescale Ltd. All rights reserved.
> > +# Copyright 2017 NXP
> > +#
> > +# This program and the accompanying materials # are licensed and
> > +made available under the terms and conditions of the BSD License #
> > +which accompanies this distribution. The full text of the license
> > +may be found at #
> >
> +https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> e
> > +nsource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.agg
> >
> +arwal%40nxp.com%7C1ca9bf8b8a2e47ac2b4608d52a921bdc%7C686ea1d3bc
> 2b4c6f
> >
> +a92cd99c5c301635%7C0%7C0%7C636461729393076197&sdata=HSBbU2pCf%
> 2F1MAPr
> > +69WVzzxn6HwycvOQexxGhw%2Fwg4GU%3D&reserved=0
> > +#
> > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > +BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +#
> > +#
> > +
> > +[Defines]
> > + INF_VERSION = 0x00010005
>
> 0x0001001A
>
Will correct this.
> > + BASE_NAME = DUartPortLib
> > + FILE_GUID = 8ecefc8f-a2c4-4091-b80f-20f7aeb0567f
>
> Please don't reuse the GUID of PL011SerialPortLib.inf
>
Will regenerate all GUIDS.
> > + MODULE_TYPE = BASE
> > + VERSION_STRING = 1.0
> > + LIBRARY_CLASS = SerialPortLib
> > +
> > +[Sources.common]
> > + DUartPortLib.c
> > +
> > +[LibraryClasses]
> > + PcdLib
> > + SocLib
>
> Please reorder this patch after the patch that introduces SocLib
>
Yes, my fault here
> > +
> > +[Packages]
> > + MdeModulePkg/MdeModulePkg.dec
> > + MdePkg/MdePkg.dec
> > +
> > +[Pcd]
> > + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase
> > + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate
> > --
> > 1.9.1
> >
^ permalink raw reply [flat|nested] 39+ messages in thread
* [PATCH 06/10] Platform/NXP: Add support for I2c operations library
2017-11-07 14:42 [PATCH 00/10] edk2-platforms/Platform/NXP Meenakshi Aggarwal
` (4 preceding siblings ...)
2017-11-07 14:42 ` [PATCH 05/10] Platform/NXP : Add support for DUART library Meenakshi Aggarwal
@ 2017-11-07 14:42 ` Meenakshi Aggarwal
2017-11-13 12:36 ` Ard Biesheuvel
2017-11-07 14:42 ` [PATCH 07/10] Platform/NXP : Add support for DS1307 RTC library Meenakshi Aggarwal
` (4 subsequent siblings)
10 siblings, 1 reply; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-07 14:42 UTC (permalink / raw)
To: ard.biesheuvel, leif.lindholm, michael.d.kinney, edk2-devel
I2C bus initialization and I2c read/write APIs added.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
---
Platform/NXP/Include/Library/I2c.h | 125 ++++++++
Platform/NXP/Library/I2cLib/I2cLib.c | 549 +++++++++++++++++++++++++++++++++
Platform/NXP/Library/I2cLib/I2cLib.h | 109 +++++++
Platform/NXP/Library/I2cLib/I2cLib.inf | 43 +++
4 files changed, 826 insertions(+)
create mode 100644 Platform/NXP/Include/Library/I2c.h
create mode 100644 Platform/NXP/Library/I2cLib/I2cLib.c
create mode 100644 Platform/NXP/Library/I2cLib/I2cLib.h
create mode 100644 Platform/NXP/Library/I2cLib/I2cLib.inf
diff --git a/Platform/NXP/Include/Library/I2c.h b/Platform/NXP/Include/Library/I2c.h
new file mode 100644
index 0000000..c7195ab
--- /dev/null
+++ b/Platform/NXP/Include/Library/I2c.h
@@ -0,0 +1,125 @@
+/** I2c.h
+ Header defining the constant, base address amd function for I2C controller
+
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __I2C_H___
+#define __I2C_H__
+
+#include <Uefi.h>
+
+#define I2C1 0
+#define I2C2 1
+#define I2C3 2
+#define I2C4 3
+
+///
+/// Define the I2C flags
+///
+#define I2C_READ_FLAG 0x1
+#define I2C_WRITE_FLAG 0x2
+
+/**
+ Function to initialize i2c bus
+
+ @param I2cBus I2c Controller number
+ @param Speed Value to be set
+
+ @retval EFI_SUCCESS
+**/
+EFI_STATUS
+EFIAPI
+I2cBusInit (
+ IN UINT32 I2cBus,
+ IN UINT32 Speed
+ );
+
+/**
+ Function to read data usin i2c
+
+ @param I2cBus I2c Controller number
+ @param Chip Address of slave device from where data to be read
+ @param Offset Offset of slave memory
+ @param Alen Address length of slave
+ @param Buffer A pointer to the destination buffer for the data
+ @param Len Length of data to be read
+
+ @retval EFI_NOT_READY Arbitration lost
+ @retval EFI_TIMEOUT Failed to initialize data transfer in predefined time
+ @retval EFI_NOT_FOUND ACK was not recieved
+ @retval EFI_SUCCESS Read was successful
+
+**/
+EFI_STATUS
+I2cDataRead (
+ IN UINT32 I2cBus,
+ IN UINT8 Chip,
+ IN UINT32 Offset,
+ IN UINT32 Alen,
+ OUT UINT8 *Buffer,
+ IN UINT32 Len
+ );
+
+/**
+ Function to write data using i2c bus
+
+ @param I2cBus I2c Controller number
+ @param Chip Address of slave device where data to be written
+ @param Offset Offset of slave memory
+ @param Alen Address length of slave
+ @param Buffer A pointer to the source buffer for the data
+ @param Len Length of data to be write
+
+ @retval EFI_NOT_READY Arbitration lost
+ @retval EFI_TIMEOUT Failed to initialize data transfer in predefined time
+ @retval EFI_NOT_FOUND ACK was not recieved
+ @retval EFI_SUCCESS Read was successful
+
+**/
+EFI_STATUS
+I2cDataWrite (
+ IN UINT32 I2cBus,
+ IN UINT8 Chip,
+ IN UINT32 Offset,
+ IN INT32 Alen,
+ OUT UINT8 *Buffer,
+ IN INT32 Len
+ );
+
+/**
+ Function to reset I2c
+ @param I2cBus I2c Controller number
+
+ @return VOID
+**/
+VOID
+I2cReset (
+ UINT32 I2cBus
+ );
+
+/**
+ Function to Probe I2c slave device
+ @param I2cBus I2c Controller number
+
+ @retval EFI_INVALID_PARAMETER Invalid I2c Controller number
+ @retval EFI_SUCCESS I2c device probed successfully
+
+**/
+EFI_STATUS
+EFIAPI
+I2cProbeDevices (
+ IN INT16 I2cBus,
+ IN UINT8 Chip
+ );
+
+#endif
diff --git a/Platform/NXP/Library/I2cLib/I2cLib.c b/Platform/NXP/Library/I2cLib/I2cLib.c
new file mode 100644
index 0000000..574b899
--- /dev/null
+++ b/Platform/NXP/Library/I2cLib/I2cLib.c
@@ -0,0 +1,549 @@
+/** I2cLib.c
+ I2c Library containing functions for read, write, initialize, set speed etc
+
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+#include <Base.h>
+#include <Library/DebugLib.h>
+#include <Library/I2c.h>
+#include <Library/IoLib.h>
+#include <Library/TimerLib.h>
+
+#include "I2cLib.h"
+
+EFI_PHYSICAL_ADDRESS I2cAddrArr[FixedPcdGet32(PcdNumI2cController)] = {
+ FixedPcdGet64(PcdI2c0BaseAddr),
+ FixedPcdGet64(PcdI2c1BaseAddr),
+ FixedPcdGet64(PcdI2c2BaseAddr),
+ FixedPcdGet64(PcdI2c3BaseAddr)
+};
+
+UINT16 ClkDiv[60][2] = {
+ { 20, 0x00 }, { 22, 0x01 }, { 24, 0x02 }, { 26, 0x03 },
+ { 28, 0x04 }, { 30, 0x05 }, { 32, 0x09 }, { 34, 0x06 },
+ { 36, 0x0A }, { 40, 0x07 }, { 44, 0x0C }, { 48, 0x0D },
+ { 52, 0x43 }, { 56, 0x0E }, { 60, 0x45 }, { 64, 0x12 },
+ { 68, 0x0F }, { 72, 0x13 }, { 80, 0x14 }, { 88, 0x15 },
+ { 96, 0x19 }, { 104, 0x16 }, { 112, 0x1A }, { 128, 0x17 },
+ { 136, 0x4F }, { 144, 0x1C }, { 160, 0x1D }, { 176, 0x55 },
+ { 192, 0x1E }, { 208, 0x56 }, { 224, 0x22 }, { 228, 0x24 },
+ { 240, 0x1F }, { 256, 0x23 }, { 288, 0x5C }, { 320, 0x25 },
+ { 384, 0x26 }, { 448, 0x2A }, { 480, 0x27 }, { 512, 0x2B },
+ { 576, 0x2C }, { 640, 0x2D }, { 768, 0x31 }, { 896, 0x32 },
+ { 960, 0x2F }, { 1024, 0x33 }, { 1152, 0x34 },{ 1280, 0x35 },
+ { 1536, 0x36 }, { 1792, 0x3A }, { 1920, 0x37 }, { 2048, 0x3B },
+ { 2304, 0x3C }, { 2560, 0x3D }, { 3072, 0x3E }, { 3584, 0x7A },
+ { 3840, 0x3F }, { 4096, 0x7B }, { 5120, 0x7D }, { 6144, 0x7E },
+};
+
+/**
+ Calculate and set proper clock divider
+
+ @param Rate : clock rate
+
+ @retval ClkDiv : Value used to get frequency divider value
+
+**/
+UINT8
+GetClk(
+ IN UINT32 Rate
+ )
+{
+ UINTN ClkRate;
+ UINT32 Div;
+ UINT8 ClkDivx;
+
+ ClkRate = CalculateI2cClockRate();
+
+ Div = (ClkRate + Rate - 1) / Rate;
+
+ if (Div < ClkDiv[0][0]) {
+ ClkDivx = 0;
+ } else if (Div > ClkDiv[ARRAY_SIZE(ClkDiv) - 1][0]){
+ ClkDivx = ARRAY_SIZE(ClkDiv) - 1;
+ } else {
+ for (ClkDivx = 0; ClkDiv[ClkDivx][0] < Div; ClkDivx++);
+ }
+
+ return ClkDivx;
+}
+
+/**
+ Function to reset I2c
+ @param I2cBus : I2c Controller number
+
+ @return VOID
+**/
+
+VOID
+I2cReset (
+ IN UINT32 I2cBus
+ )
+{
+ I2C_REGS *I2cRegs;
+
+ I2cRegs = (I2C_REGS *)I2cAddrArr[I2cBus];
+
+ /** Reset module */
+ MmioWrite8((UINTN)&I2cRegs->I2cCr, I2C_CR_IDIS);
+ MmioWrite8((UINTN)&I2cRegs->I2cSr, 0);
+}
+
+/**
+ Function to set I2c bus speed
+
+ @param I2cBus : I2c Controller number
+ @param Speed : Value to be set
+
+ @retval EFI_SUCCESS
+**/
+EFI_STATUS
+EFIAPI
+I2cSetBusSpeed (
+ IN UINT32 I2cBus,
+ IN UINT32 Speed
+ )
+{
+ I2C_REGS *I2cRegs;
+ UINT8 ClkId;
+ UINT8 SpeedId;
+
+ I2cRegs = (I2C_REGS *)I2cAddrArr[I2cBus];
+
+ ASSERT(I2cRegs);
+
+ ClkId = GetClk(Speed);
+ SpeedId = ClkDiv[ClkId][1];
+
+ /** Store divider value */
+ MmioWrite8((UINTN)&I2cRegs->I2cFdr, SpeedId);
+ I2cReset(I2cBus);
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Function used to check if i2c is in mentioned state or not
+
+ @param I2cRegs : Pointer to I2C registers
+ @param State : i2c state need to be checked
+
+ @retval EFI_NOT_READY Arbitration was lost
+ @retval EFI_TIMEOUT Timeout occured
+ @retval CurrState Value of state register
+
+**/
+EFI_STATUS
+WaitForI2cState (
+ IN I2C_REGS *I2cRegs,
+ IN UINT32 State
+ )
+{
+ UINT8 CurrState;
+ UINT64 Cnt;
+
+ for (Cnt = 0; Cnt < 50; Cnt++) {
+ CurrState = MmioRead8((UINTN)&I2cRegs->I2cSr);
+ if (CurrState & I2C_SR_IAL) {
+ MmioWrite8((UINTN)&I2cRegs->I2cSr, CurrState | I2C_SR_IAL);
+ return EFI_NOT_READY;
+ }
+
+ if ((CurrState & (State >> 8)) == (UINT8)State) {
+ return CurrState;
+ }
+
+ MicroSecondDelay(300);
+ }
+
+ return EFI_TIMEOUT;
+}
+
+/**
+ Function to transfer byte on i2c
+
+ @param I2cRegs : Pointer to i2c registers
+ @param Byte : Byte to be transferred on i2c bus
+
+ @retval EFI_NOT_READY Arbitration was lost
+ @retval EFI_TIMEOUT Timeout occured
+ @retval EFI_NOT_FOUND ACK was not recieved
+ @retval EFI_SUCCESS Data transfer was succesful
+
+**/
+EFI_STATUS
+TransferByte (
+ IN I2C_REGS *I2cRegs,
+ IN UINT8 Byte
+ )
+{
+ EFI_STATUS Ret;
+
+ MmioWrite8((UINTN)&I2cRegs->I2cSr, I2C_SR_IIF_CLEAR);
+ MmioWrite8((UINTN)&I2cRegs->I2cDr, Byte);
+
+ Ret = WaitForI2cState(I2cRegs, IIF);
+ if ((Ret == EFI_TIMEOUT) || (Ret == EFI_NOT_READY)) {
+ return Ret;
+ }
+
+ if (Ret & I2C_SR_RX_NO_AK) {
+ return EFI_NOT_FOUND;
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Function to stop transaction on i2c bus
+
+ @param I2cRegs : Pointer to i2c registers
+
+ @retval EFI_NOT_READY Arbitration was lost
+ @retval EFI_TIMEOUT Timeout occured
+ @retval EFI_SUCCESS Stop operation was successful
+
+**/
+EFI_STATUS
+I2cStop (
+ IN I2C_REGS *I2cRegs
+ )
+{
+ INT32 Ret;
+ UINT32 Temp;
+
+ Temp = MmioRead8((UINTN)&I2cRegs->I2cCr);
+
+ Temp &= ~(I2C_CR_MSTA | I2C_CR_MTX);
+ MmioWrite8((UINTN)&I2cRegs->I2cCr, Temp);
+
+ Ret = WaitForI2cState(I2cRegs, BUS_IDLE);
+
+ if (Ret < 0) {
+ return Ret;
+ } else {
+ return EFI_SUCCESS;
+ }
+}
+
+/**
+ Function to send start signal, Chip Address and
+ memory offset
+
+ @param I2cRegs : Pointer to i2c base registers
+ @param Chip : Chip Address
+ @param Offset : Slave memory's offset
+ @param Alen : length of chip address
+
+ @retval EFI_NOT_READY Arbitration lost
+ @retval EFI_TIMEOUT Failed to initialize data transfer in predefined time
+ @retval EFI_NOT_FOUND ACK was not recieved
+ @retval EFI_SUCCESS Read was successful
+
+**/
+EFI_STATUS
+InitTransfer (
+ IN I2C_REGS *I2cRegs,
+ IN UINT8 Chip,
+ IN UINT32 Offset,
+ IN INT32 Alen
+ )
+{
+ UINT32 Temp;
+ EFI_STATUS Ret;
+
+ /** Enable I2C controller */
+ if (MmioRead8((UINTN)&I2cRegs->I2cCr) & I2C_CR_IDIS) {
+ MmioWrite8((UINTN)&I2cRegs->I2cCr, I2C_CR_IEN);
+ }
+
+ if (MmioRead8((UINTN)&I2cRegs->I2cAdr) == (Chip << 1)) {
+ MmioWrite8((UINTN)&I2cRegs->I2cAdr, (Chip << 1) ^ 2);
+ }
+
+ MmioWrite8((UINTN)&I2cRegs->I2cSr, I2C_SR_IIF_CLEAR);
+ Ret = WaitForI2cState(I2cRegs, BUS_IDLE);
+ if ((Ret == EFI_TIMEOUT) || (Ret == EFI_NOT_READY)) {
+ return Ret;
+ }
+
+ /** Start I2C transaction */
+ Temp = MmioRead8((UINTN)&I2cRegs->I2cCr);
+ /** set to master mode */
+ Temp |= I2C_CR_MSTA;
+ MmioWrite8((UINTN)&I2cRegs->I2cCr, Temp);
+
+ Ret = WaitForI2cState(I2cRegs, BUS_BUSY);
+ if ((Ret == EFI_TIMEOUT) || (Ret == EFI_NOT_READY)) {
+ return Ret;
+ }
+
+ Temp |= I2C_CR_MTX | I2C_CR_TX_NO_AK;
+ MmioWrite8((UINTN)&I2cRegs->I2cCr, Temp);
+
+ /** write slave Address */
+ Ret = TransferByte(I2cRegs, Chip << 1);
+ if (Ret != EFI_SUCCESS) {
+ return Ret;
+ }
+
+ if (Alen >= 0) {
+ while (Alen--) {
+ Ret = TransferByte(I2cRegs, (Offset >> (Alen * 8)) & 0xff);
+ if (Ret != EFI_SUCCESS)
+ return Ret;
+ }
+ }
+ return EFI_SUCCESS;
+}
+
+/**
+ Function to check if i2c bud is idle
+
+ @param Base : Pointer to base address of I2c controller
+
+ @retval EFI_SUCCESS
+
+**/
+INT32
+I2cBusIdle (
+ IN VOID *Base
+ )
+{
+ return EFI_SUCCESS;
+}
+
+/**
+ Function to initiate data transfer on i2c bus
+
+ @param I2cRegs : Pointer to i2c base registers
+ @param Chip : Chip Address
+ @param Offset : Slave memory's offset
+ @param Alen : length of chip address
+
+ @retval EFI_NOT_READY : Arbitration lost
+ @retval EFI_TIMEOUT : Failed to initialize data transfer in predefined time
+ @retval EFI_NOT_FOUND : ACK was not recieved
+ @retval EFI_SUCCESS : Read was successful
+
+**/
+EFI_STATUS
+InitDataTransfer (
+ IN I2C_REGS *I2cRegs,
+ IN UINT8 Chip,
+ IN UINT32 Offset,
+ IN INT32 Alen
+ )
+{
+ EFI_STATUS Ret;
+ INT32 Retry;
+
+ for (Retry = 0; Retry < 3; Retry++) {
+ Ret = InitTransfer(I2cRegs, Chip, Offset, Alen);
+ if (Ret == EFI_SUCCESS) {
+ return EFI_SUCCESS;
+ }
+
+ I2cStop(I2cRegs);
+
+ if (EFI_NOT_FOUND == Ret) {
+ return Ret;
+ }
+
+ /** Disable controller */
+ if (Ret != EFI_NOT_READY) {
+ MmioWrite8((UINTN)&I2cRegs->I2cCr, I2C_CR_IDIS);
+ }
+
+ if (I2cBusIdle(I2cRegs) < 0) {
+ break;
+ }
+ }
+ return Ret;
+}
+
+/**
+ Function to read data using i2c bus
+
+ @param I2cBus : I2c Controller number
+ @param Chip : Address of slave device from where data to be read
+ @param Offset : Offset of slave memory
+ @param Alen : Address length of slave
+ @param Buffer : A pointer to the destination buffer for the data
+ @param Len : Length of data to be read
+
+ @retval EFI_NOT_READY : Arbitration lost
+ @retval EFI_TIMEOUT : Failed to initialize data transfer in predefined time
+ @retval EFI_NOT_FOUND : ACK was not recieved
+ @retval EFI_SUCCESS : Read was successful
+
+**/
+EFI_STATUS
+I2cDataRead (
+ IN UINT32 I2cBus,
+ IN UINT8 Chip,
+ IN UINT32 Offset,
+ IN UINT32 Alen,
+ IN UINT8 *Buffer,
+ IN UINT32 Len
+ )
+{
+ EFI_STATUS Ret;
+ UINT32 Temp;
+ INT32 I;
+ I2C_REGS *I2cRegs;
+
+ I2cRegs = (I2C_REGS *)I2cAddrArr[I2cBus];
+
+ Ret = InitDataTransfer(I2cRegs, Chip, Offset, Alen);
+ if (Ret != EFI_SUCCESS) {
+ return Ret;
+ }
+
+ Temp = MmioRead8((UINTN)&I2cRegs->I2cCr);
+ Temp |= I2C_CR_RSTA;
+ MmioWrite8((UINTN)&I2cRegs->I2cCr, Temp);
+
+ Ret = TransferByte(I2cRegs, (Chip << 1) | 1);
+ if (Ret != EFI_SUCCESS) {
+ I2cStop(I2cRegs);
+ return Ret;
+ }
+
+ /** setup bus to read data */
+ Temp = MmioRead8((UINTN)&I2cRegs->I2cCr);
+ Temp &= ~(I2C_CR_MTX | I2C_CR_TX_NO_AK);
+ if (Len == 1) {
+ Temp |= I2C_CR_TX_NO_AK;
+ }
+
+ MmioWrite8((UINTN)&I2cRegs->I2cCr, Temp);
+ MmioWrite8((UINTN)&I2cRegs->I2cSr, I2C_SR_IIF_CLEAR);
+
+ /** read data */
+ /** Dummy Read to initiate recieve operation */
+ MmioRead8((UINTN)&I2cRegs->I2cDr);
+
+ for (I = 0; I < Len; I++) {
+ Ret = WaitForI2cState(I2cRegs, IIF);
+ if ((Ret == EFI_TIMEOUT) || (Ret == EFI_NOT_READY)) {
+ I2cStop(I2cRegs);
+ return Ret;
+ }
+ /**
+ It must generate STOP before read I2DR to prevent
+ controller from generating another clock cycle
+ **/
+ if (I == (Len - 1)) {
+ I2cStop(I2cRegs);
+ } else if (I == (Len - 2)) {
+ Temp = MmioRead8((UINTN)&I2cRegs->I2cCr);
+ Temp |= I2C_CR_TX_NO_AK;
+ MmioWrite8((UINTN)&I2cRegs->I2cCr, Temp);
+ }
+ MmioWrite8((UINTN)&I2cRegs->I2cSr, I2C_SR_IIF_CLEAR);
+ Buffer[I] = MmioRead8((UINTN)&I2cRegs->I2cDr);
+ }
+
+ I2cStop(I2cRegs);
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Function to write data using i2c bus
+
+ @param I2cBus : I2c Controller number
+ @param Chip : Address of slave device where data to be written
+ @param Offset : Offset of slave memory
+ @param Alen : Address length of slave
+ @param Buffer : A pointer to the source buffer for the data
+ @param Len : Length of data to be write
+
+ @retval EFI_NOT_READY : Arbitration lost
+ @retval EFI_TIMEOUT : Failed to initialize data transfer in predefined time
+ @retval EFI_NOT_FOUND : ACK was not recieved
+ @retval EFI_SUCCESS : Read was successful
+
+**/
+EFI_STATUS
+I2cDataWrite (
+ IN UINT32 I2cBus,
+ IN UINT8 Chip,
+ IN UINT32 Offset,
+ IN INT32 Alen,
+ OUT UINT8 *Buffer,
+ IN INT32 Len
+ )
+{
+ EFI_STATUS Ret;
+ I2C_REGS *I2cRegs;
+ INT32 I;
+
+ I2cRegs = (I2C_REGS *)I2cAddrArr[I2cBus];
+
+ Ret = InitDataTransfer(I2cRegs, Chip, Offset, Alen);
+ if (Ret != EFI_SUCCESS) {
+ return Ret;
+ }
+
+ /** write data */
+ /** Dummy write to initiate write operation */
+ for (I = 0; I < Len; I++) {
+ Ret = TransferByte(I2cRegs, Buffer[I]);
+ if (Ret != EFI_SUCCESS) {
+ break;
+ }
+ }
+
+ I2cStop(I2cRegs);
+ return Ret;
+}
+
+/**
+ Function to Probe i2c bus
+
+ @param I2c : I2c Controller number
+
+ @retval EFI_INVALID_PARAMETER : Input parametr I2c was invalid
+ @retval EFI_SUCCESS : I2c was initialized successfully
+
+**/
+EFI_STATUS
+EFIAPI
+I2cProbeDevices (
+ IN INT16 I2c,
+ IN UINT8 ChipAdd
+ )
+{
+ if(I2c >= PcdGet32(PcdNumI2cController) || I2cAddrArr[I2c] == 0x0) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ return I2cDataWrite(I2c, ChipAdd, 0, 0, NULL, 0);
+}
+
+/**
+ Function to initialize i2c bus
+
+ @param I2cBus : I2c Controller number
+ @param Speed : value to be set
+**/
+EFI_STATUS
+EFIAPI
+I2cBusInit (
+ IN UINT32 I2cBus,
+ IN UINT32 Speed
+ )
+{
+ return I2cSetBusSpeed(I2cBus, Speed);
+}
diff --git a/Platform/NXP/Library/I2cLib/I2cLib.h b/Platform/NXP/Library/I2cLib/I2cLib.h
new file mode 100644
index 0000000..61076f5
--- /dev/null
+++ b/Platform/NXP/Library/I2cLib/I2cLib.h
@@ -0,0 +1,109 @@
+/** I2cLib.h
+ Header defining the constant, base address amd function for I2C controller
+
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __I2C_H___
+#define __I2C_H__
+
+#include <Uefi.h>
+
+#define I2C_CR_IIEN (1 << 6)
+#define I2C_CR_MSTA (1 << 5)
+#define I2C_CR_MTX (1 << 4)
+#define I2C_CR_TX_NO_AK (1 << 3)
+#define I2C_CR_RSTA (1 << 2)
+
+#define I2C_SR_ICF (1 << 7)
+#define I2C_SR_IBB (1 << 5)
+#define I2C_SR_IAL (1 << 4)
+#define I2C_SR_IIF (1 << 1)
+#define I2C_SR_RX_NO_AK (1 << 0)
+
+#define I2C_CR_IEN (0 << 7)
+#define I2C_CR_IDIS (1 << 7)
+#define I2C_SR_IIF_CLEAR (1 << 1)
+
+#define BUS_IDLE (0 | (I2C_SR_IBB << 8))
+#define BUS_BUSY (I2C_SR_IBB | (I2C_SR_IBB << 8))
+#define IIF (I2C_SR_IIF | (I2C_SR_IIF << 8))
+
+/**
+ Record defining i2c registers
+**/
+typedef struct {
+ UINT8 I2cAdr;
+ UINT8 I2cFdr;
+ UINT8 I2cCr;
+ UINT8 I2cSr;
+ UINT8 I2cDr;
+} I2C_REGS ;
+
+/**
+ Function to set I2c bus speed
+
+ @param I2cBus I2c Controller number
+ @param Speed Value to be set
+
+ @retval EFI_SUCCESS
+**/
+EFI_STATUS
+EFIAPI
+I2cSetBusSpeed (
+ IN UINT32 I2cBus,
+ IN UINT32 Speed
+ );
+
+/**
+ Function to stop transaction on i2c bus
+
+ @param I2cRegs Pointer to i2c registers
+
+ @retval EFI_NOT_READY Arbitration was lost
+ @retval EFI_TIMEOUT Timeout occured
+ @retval EFI_SUCCESS Stop operation was successful
+
+**/
+EFI_STATUS
+I2cStop (
+ IN I2C_REGS *I2cRegs
+ );
+
+/**
+ Function to initiate data transfer on i2c bus
+
+ @param I2cRegs Pointer to i2c base registers
+ @param Chip Chip Address
+ @param Offset Slave memory's offset
+ @param Alen length of chip address
+
+ @retval EFI_NOT_READY Arbitration lost
+ @retval EFI_TIMEOUT Failed to initialize data transfer in predefined time
+ @retval EFI_NOT_FOUND ACK was not recieved
+ @retval EFI_SUCCESS Read was successful
+
+**/
+EFI_STATUS
+I2cBusInitTransfer (
+ IN I2C_REGS *I2cRegs,
+ IN UINT8 Chip,
+ IN UINT32 Offset,
+ IN INT32 Alen
+ );
+
+UINT32
+CalculateI2cClockRate (
+ VOID
+ );
+
+#endif
diff --git a/Platform/NXP/Library/I2cLib/I2cLib.inf b/Platform/NXP/Library/I2cLib/I2cLib.inf
new file mode 100644
index 0000000..427c3b8
--- /dev/null
+++ b/Platform/NXP/Library/I2cLib/I2cLib.inf
@@ -0,0 +1,43 @@
+# I2cLib.inf
+#
+# Component description file for I2cLib module
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = I2cLib
+ FILE_GUID = 8ecefc8f-a2c4-4091-b81f-20f7aeb0567f
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = I2cLib
+
+[Sources.common]
+ I2cLib.c
+
+[LibraryClasses]
+ BaseLib
+ IoLib
+ SocLib
+ TimerLib
+
+[Packages]
+ MdePkg/MdePkg.dec
+ edk2-platforms/Platform/NXP/NxpQoriqLs.dec
+
+[Pcd]
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c0BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c1BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c2BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c3BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdNumI2cController
--
1.9.1
^ permalink raw reply related [flat|nested] 39+ messages in thread
* Re: [PATCH 06/10] Platform/NXP: Add support for I2c operations library
2017-11-07 14:42 ` [PATCH 06/10] Platform/NXP: Add support for I2c operations library Meenakshi Aggarwal
@ 2017-11-13 12:36 ` Ard Biesheuvel
2017-11-14 5:36 ` Meenakshi Aggarwal
0 siblings, 1 reply; 39+ messages in thread
From: Ard Biesheuvel @ 2017-11-13 12:36 UTC (permalink / raw)
To: Meenakshi Aggarwal
Cc: Leif Lindholm, Kinney, Michael D, edk2-devel@lists.01.org,
Udit Kumar, Varun Sethi
On 7 November 2017 at 14:42, Meenakshi Aggarwal
<meenakshi.aggarwal@nxp.com> wrote:
> I2C bus initialization and I2c read/write APIs added.
>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> ---
> Platform/NXP/Include/Library/I2c.h | 125 ++++++++
> Platform/NXP/Library/I2cLib/I2cLib.c | 549 +++++++++++++++++++++++++++++++++
> Platform/NXP/Library/I2cLib/I2cLib.h | 109 +++++++
> Platform/NXP/Library/I2cLib/I2cLib.inf | 43 +++
> 4 files changed, 826 insertions(+)
> create mode 100644 Platform/NXP/Include/Library/I2c.h
> create mode 100644 Platform/NXP/Library/I2cLib/I2cLib.c
> create mode 100644 Platform/NXP/Library/I2cLib/I2cLib.h
> create mode 100644 Platform/NXP/Library/I2cLib/I2cLib.inf
>
Please try to use the PI protocols for I2C rather than inventing your own.
> diff --git a/Platform/NXP/Include/Library/I2c.h b/Platform/NXP/Include/Library/I2c.h
> new file mode 100644
> index 0000000..c7195ab
> --- /dev/null
> +++ b/Platform/NXP/Include/Library/I2c.h
> @@ -0,0 +1,125 @@
> +/** I2c.h
> + Header defining the constant, base address amd function for I2C controller
> +
> + Copyright 2017 NXP
> +
> + This program and the accompanying materials
> + are licensed and made available under the terms and conditions of the BSD License
> + which accompanies this distribution. The full text of the license may be found at
> + http://opensource.org/licenses/bsd-license.php
> +
> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#ifndef __I2C_H___
> +#define __I2C_H__
> +
> +#include <Uefi.h>
> +
> +#define I2C1 0
> +#define I2C2 1
> +#define I2C3 2
> +#define I2C4 3
> +
> +///
> +/// Define the I2C flags
> +///
> +#define I2C_READ_FLAG 0x1
> +#define I2C_WRITE_FLAG 0x2
> +
> +/**
> + Function to initialize i2c bus
> +
> + @param I2cBus I2c Controller number
> + @param Speed Value to be set
> +
> + @retval EFI_SUCCESS
> +**/
> +EFI_STATUS
> +EFIAPI
> +I2cBusInit (
> + IN UINT32 I2cBus,
> + IN UINT32 Speed
Please fix alignment
> + );
> +
> +/**
> + Function to read data usin i2c
> +
> + @param I2cBus I2c Controller number
> + @param Chip Address of slave device from where data to be read
> + @param Offset Offset of slave memory
> + @param Alen Address length of slave
> + @param Buffer A pointer to the destination buffer for the data
> + @param Len Length of data to be read
> +
> + @retval EFI_NOT_READY Arbitration lost
> + @retval EFI_TIMEOUT Failed to initialize data transfer in predefined time
> + @retval EFI_NOT_FOUND ACK was not recieved
> + @retval EFI_SUCCESS Read was successful
> +
> +**/
> +EFI_STATUS
> +I2cDataRead (
> + IN UINT32 I2cBus,
> + IN UINT8 Chip,
> + IN UINT32 Offset,
> + IN UINT32 Alen,
> + OUT UINT8 *Buffer,
> + IN UINT32 Len
> + );
and here
> +
> +/**
> + Function to write data using i2c bus
> +
> + @param I2cBus I2c Controller number
> + @param Chip Address of slave device where data to be written
> + @param Offset Offset of slave memory
> + @param Alen Address length of slave
> + @param Buffer A pointer to the source buffer for the data
> + @param Len Length of data to be write
> +
> + @retval EFI_NOT_READY Arbitration lost
> + @retval EFI_TIMEOUT Failed to initialize data transfer in predefined time
> + @retval EFI_NOT_FOUND ACK was not recieved
> + @retval EFI_SUCCESS Read was successful
> +
> +**/
> +EFI_STATUS
> +I2cDataWrite (
> + IN UINT32 I2cBus,
> + IN UINT8 Chip,
> + IN UINT32 Offset,
> + IN INT32 Alen,
> + OUT UINT8 *Buffer,
> + IN INT32 Len
> + );
> +
> +/**
> + Function to reset I2c
> + @param I2cBus I2c Controller number
> +
> + @return VOID
> +**/
> +VOID
> +I2cReset (
> + UINT32 I2cBus
> + );
> +
> +/**
> + Function to Probe I2c slave device
> + @param I2cBus I2c Controller number
> +
> + @retval EFI_INVALID_PARAMETER Invalid I2c Controller number
> + @retval EFI_SUCCESS I2c device probed successfully
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +I2cProbeDevices (
> + IN INT16 I2cBus,
> + IN UINT8 Chip
> + );
> +
> +#endif
> diff --git a/Platform/NXP/Library/I2cLib/I2cLib.c b/Platform/NXP/Library/I2cLib/I2cLib.c
> new file mode 100644
> index 0000000..574b899
> --- /dev/null
> +++ b/Platform/NXP/Library/I2cLib/I2cLib.c
> @@ -0,0 +1,549 @@
> +/** I2cLib.c
> + I2c Library containing functions for read, write, initialize, set speed etc
> +
> + Copyright 2017 NXP
> +
> + This program and the accompanying materials
> + are licensed and made available under the terms and conditions of the BSD License
> + which accompanies this distribution. The full text of the license may be found at
> + http://opensource.org/licenses/bsd-license.php
> +
> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +#include <Base.h>
> +#include <Library/DebugLib.h>
> +#include <Library/I2c.h>
> +#include <Library/IoLib.h>
> +#include <Library/TimerLib.h>
> +
> +#include "I2cLib.h"
> +
STATIC CONST
> +EFI_PHYSICAL_ADDRESS I2cAddrArr[FixedPcdGet32(PcdNumI2cController)] = {
> + FixedPcdGet64(PcdI2c0BaseAddr),
> + FixedPcdGet64(PcdI2c1BaseAddr),
> + FixedPcdGet64(PcdI2c2BaseAddr),
> + FixedPcdGet64(PcdI2c3BaseAddr)
> +};
> +
STATIC CONST
> +UINT16 ClkDiv[60][2] = {
> + { 20, 0x00 }, { 22, 0x01 }, { 24, 0x02 }, { 26, 0x03 },
> + { 28, 0x04 }, { 30, 0x05 }, { 32, 0x09 }, { 34, 0x06 },
> + { 36, 0x0A }, { 40, 0x07 }, { 44, 0x0C }, { 48, 0x0D },
> + { 52, 0x43 }, { 56, 0x0E }, { 60, 0x45 }, { 64, 0x12 },
> + { 68, 0x0F }, { 72, 0x13 }, { 80, 0x14 }, { 88, 0x15 },
> + { 96, 0x19 }, { 104, 0x16 }, { 112, 0x1A }, { 128, 0x17 },
> + { 136, 0x4F }, { 144, 0x1C }, { 160, 0x1D }, { 176, 0x55 },
> + { 192, 0x1E }, { 208, 0x56 }, { 224, 0x22 }, { 228, 0x24 },
> + { 240, 0x1F }, { 256, 0x23 }, { 288, 0x5C }, { 320, 0x25 },
> + { 384, 0x26 }, { 448, 0x2A }, { 480, 0x27 }, { 512, 0x2B },
> + { 576, 0x2C }, { 640, 0x2D }, { 768, 0x31 }, { 896, 0x32 },
> + { 960, 0x2F }, { 1024, 0x33 }, { 1152, 0x34 },{ 1280, 0x35 },
> + { 1536, 0x36 }, { 1792, 0x3A }, { 1920, 0x37 }, { 2048, 0x3B },
> + { 2304, 0x3C }, { 2560, 0x3D }, { 3072, 0x3E }, { 3584, 0x7A },
> + { 3840, 0x3F }, { 4096, 0x7B }, { 5120, 0x7D }, { 6144, 0x7E },
> +};
> +
> +/**
> + Calculate and set proper clock divider
> +
> + @param Rate : clock rate
> +
> + @retval ClkDiv : Value used to get frequency divider value
> +
> +**/
STATIC
> +UINT8
> +GetClk(
> + IN UINT32 Rate
> + )
> +{
> + UINTN ClkRate;
> + UINT32 Div;
> + UINT8 ClkDivx;
> +
> + ClkRate = CalculateI2cClockRate();
> +
> + Div = (ClkRate + Rate - 1) / Rate;
> +
> + if (Div < ClkDiv[0][0]) {
> + ClkDivx = 0;
> + } else if (Div > ClkDiv[ARRAY_SIZE(ClkDiv) - 1][0]){
> + ClkDivx = ARRAY_SIZE(ClkDiv) - 1;
> + } else {
> + for (ClkDivx = 0; ClkDiv[ClkDivx][0] < Div; ClkDivx++);
> + }
> +
> + return ClkDivx;
> +}
> +
> +/**
> + Function to reset I2c
> + @param I2cBus : I2c Controller number
> +
> + @return VOID
> +**/
> +
> +VOID
> +I2cReset (
> + IN UINT32 I2cBus
> + )
> +{
> + I2C_REGS *I2cRegs;
> +
> + I2cRegs = (I2C_REGS *)I2cAddrArr[I2cBus];
> +
> + /** Reset module */
Please use // for single line comments
> + MmioWrite8((UINTN)&I2cRegs->I2cCr, I2C_CR_IDIS);
> + MmioWrite8((UINTN)&I2cRegs->I2cSr, 0);
Space before (
> +}
> +
> +/**
> + Function to set I2c bus speed
> +
> + @param I2cBus : I2c Controller number
> + @param Speed : Value to be set
> +
> + @retval EFI_SUCCESS
> +**/
> +EFI_STATUS
> +EFIAPI
> +I2cSetBusSpeed (
> + IN UINT32 I2cBus,
> + IN UINT32 Speed
> + )
> +{
> + I2C_REGS *I2cRegs;
> + UINT8 ClkId;
> + UINT8 SpeedId;
> +
> + I2cRegs = (I2C_REGS *)I2cAddrArr[I2cBus];
> +
> + ASSERT(I2cRegs);
> +
> + ClkId = GetClk(Speed);
> + SpeedId = ClkDiv[ClkId][1];
> +
> + /** Store divider value */
> + MmioWrite8((UINTN)&I2cRegs->I2cFdr, SpeedId);
> + I2cReset(I2cBus);
> +
> + return EFI_SUCCESS;
> +}
> +
> +/**
> + Function used to check if i2c is in mentioned state or not
> +
> + @param I2cRegs : Pointer to I2C registers
> + @param State : i2c state need to be checked
> +
> + @retval EFI_NOT_READY Arbitration was lost
> + @retval EFI_TIMEOUT Timeout occured
> + @retval CurrState Value of state register
> +
> +**/
> +EFI_STATUS
> +WaitForI2cState (
> + IN I2C_REGS *I2cRegs,
> + IN UINT32 State
> + )
> +{
> + UINT8 CurrState;
> + UINT64 Cnt;
> +
> + for (Cnt = 0; Cnt < 50; Cnt++) {
> + CurrState = MmioRead8((UINTN)&I2cRegs->I2cSr);
> + if (CurrState & I2C_SR_IAL) {
> + MmioWrite8((UINTN)&I2cRegs->I2cSr, CurrState | I2C_SR_IAL);
> + return EFI_NOT_READY;
> + }
> +
> + if ((CurrState & (State >> 8)) == (UINT8)State) {
> + return CurrState;
> + }
> +
> + MicroSecondDelay(300);
Why 300 us? And please add a MemoryFence () as well
> + }
> +
> + return EFI_TIMEOUT;
> +}
> +
> +/**
> + Function to transfer byte on i2c
> +
> + @param I2cRegs : Pointer to i2c registers
> + @param Byte : Byte to be transferred on i2c bus
> +
> + @retval EFI_NOT_READY Arbitration was lost
> + @retval EFI_TIMEOUT Timeout occured
> + @retval EFI_NOT_FOUND ACK was not recieved
> + @retval EFI_SUCCESS Data transfer was succesful
> +
> +**/
> +EFI_STATUS
> +TransferByte (
> + IN I2C_REGS *I2cRegs,
> + IN UINT8 Byte
> + )
> +{
> + EFI_STATUS Ret;
> +
> + MmioWrite8((UINTN)&I2cRegs->I2cSr, I2C_SR_IIF_CLEAR);
> + MmioWrite8((UINTN)&I2cRegs->I2cDr, Byte);
> +
> + Ret = WaitForI2cState(I2cRegs, IIF);
> + if ((Ret == EFI_TIMEOUT) || (Ret == EFI_NOT_READY)) {
> + return Ret;
> + }
> +
> + if (Ret & I2C_SR_RX_NO_AK) {
> + return EFI_NOT_FOUND;
> + }
> +
> + return EFI_SUCCESS;
> +}
> +
> +/**
> + Function to stop transaction on i2c bus
> +
> + @param I2cRegs : Pointer to i2c registers
> +
> + @retval EFI_NOT_READY Arbitration was lost
> + @retval EFI_TIMEOUT Timeout occured
> + @retval EFI_SUCCESS Stop operation was successful
> +
> +**/
> +EFI_STATUS
> +I2cStop (
> + IN I2C_REGS *I2cRegs
> + )
> +{
> + INT32 Ret;
> + UINT32 Temp;
> +
> + Temp = MmioRead8((UINTN)&I2cRegs->I2cCr);
> +
> + Temp &= ~(I2C_CR_MSTA | I2C_CR_MTX);
> + MmioWrite8((UINTN)&I2cRegs->I2cCr, Temp);
> +
> + Ret = WaitForI2cState(I2cRegs, BUS_IDLE);
> +
> + if (Ret < 0) {
> + return Ret;
> + } else {
> + return EFI_SUCCESS;
> + }
> +}
> +
> +/**
> + Function to send start signal, Chip Address and
> + memory offset
> +
> + @param I2cRegs : Pointer to i2c base registers
> + @param Chip : Chip Address
> + @param Offset : Slave memory's offset
> + @param Alen : length of chip address
> +
> + @retval EFI_NOT_READY Arbitration lost
> + @retval EFI_TIMEOUT Failed to initialize data transfer in predefined time
> + @retval EFI_NOT_FOUND ACK was not recieved
> + @retval EFI_SUCCESS Read was successful
> +
> +**/
> +EFI_STATUS
> +InitTransfer (
> + IN I2C_REGS *I2cRegs,
> + IN UINT8 Chip,
> + IN UINT32 Offset,
> + IN INT32 Alen
> + )
> +{
> + UINT32 Temp;
> + EFI_STATUS Ret;
> +
> + /** Enable I2C controller */
> + if (MmioRead8((UINTN)&I2cRegs->I2cCr) & I2C_CR_IDIS) {
> + MmioWrite8((UINTN)&I2cRegs->I2cCr, I2C_CR_IEN);
> + }
> +
> + if (MmioRead8((UINTN)&I2cRegs->I2cAdr) == (Chip << 1)) {
> + MmioWrite8((UINTN)&I2cRegs->I2cAdr, (Chip << 1) ^ 2);
> + }
> +
> + MmioWrite8((UINTN)&I2cRegs->I2cSr, I2C_SR_IIF_CLEAR);
> + Ret = WaitForI2cState(I2cRegs, BUS_IDLE);
> + if ((Ret == EFI_TIMEOUT) || (Ret == EFI_NOT_READY)) {
> + return Ret;
> + }
> +
> + /** Start I2C transaction */
> + Temp = MmioRead8((UINTN)&I2cRegs->I2cCr);
> + /** set to master mode */
> + Temp |= I2C_CR_MSTA;
> + MmioWrite8((UINTN)&I2cRegs->I2cCr, Temp);
> +
> + Ret = WaitForI2cState(I2cRegs, BUS_BUSY);
> + if ((Ret == EFI_TIMEOUT) || (Ret == EFI_NOT_READY)) {
> + return Ret;
> + }
> +
> + Temp |= I2C_CR_MTX | I2C_CR_TX_NO_AK;
> + MmioWrite8((UINTN)&I2cRegs->I2cCr, Temp);
> +
> + /** write slave Address */
> + Ret = TransferByte(I2cRegs, Chip << 1);
> + if (Ret != EFI_SUCCESS) {
> + return Ret;
> + }
> +
> + if (Alen >= 0) {
> + while (Alen--) {
> + Ret = TransferByte(I2cRegs, (Offset >> (Alen * 8)) & 0xff);
> + if (Ret != EFI_SUCCESS)
> + return Ret;
> + }
> + }
> + return EFI_SUCCESS;
> +}
> +
> +/**
> + Function to check if i2c bud is idle
bud -> bus
> +
> + @param Base : Pointer to base address of I2c controller
> +
> + @retval EFI_SUCCESS
> +
> +**/
> +INT32
> +I2cBusIdle (
> + IN VOID *Base
> + )
> +{
> + return EFI_SUCCESS;
> +}
> +
> +/**
> + Function to initiate data transfer on i2c bus
> +
> + @param I2cRegs : Pointer to i2c base registers
> + @param Chip : Chip Address
> + @param Offset : Slave memory's offset
> + @param Alen : length of chip address
> +
> + @retval EFI_NOT_READY : Arbitration lost
> + @retval EFI_TIMEOUT : Failed to initialize data transfer in predefined time
> + @retval EFI_NOT_FOUND : ACK was not recieved
> + @retval EFI_SUCCESS : Read was successful
> +
> +**/
> +EFI_STATUS
> +InitDataTransfer (
> + IN I2C_REGS *I2cRegs,
> + IN UINT8 Chip,
> + IN UINT32 Offset,
> + IN INT32 Alen
> + )
> +{
> + EFI_STATUS Ret;
> + INT32 Retry;
> +
> + for (Retry = 0; Retry < 3; Retry++) {
> + Ret = InitTransfer(I2cRegs, Chip, Offset, Alen);
> + if (Ret == EFI_SUCCESS) {
> + return EFI_SUCCESS;
> + }
> +
> + I2cStop(I2cRegs);
> +
> + if (EFI_NOT_FOUND == Ret) {
> + return Ret;
> + }
> +
> + /** Disable controller */
> + if (Ret != EFI_NOT_READY) {
> + MmioWrite8((UINTN)&I2cRegs->I2cCr, I2C_CR_IDIS);
> + }
> +
> + if (I2cBusIdle(I2cRegs) < 0) {
> + break;
> + }
> + }
> + return Ret;
> +}
> +
> +/**
> + Function to read data using i2c bus
> +
> + @param I2cBus : I2c Controller number
> + @param Chip : Address of slave device from where data to be read
> + @param Offset : Offset of slave memory
> + @param Alen : Address length of slave
> + @param Buffer : A pointer to the destination buffer for the data
> + @param Len : Length of data to be read
> +
> + @retval EFI_NOT_READY : Arbitration lost
> + @retval EFI_TIMEOUT : Failed to initialize data transfer in predefined time
> + @retval EFI_NOT_FOUND : ACK was not recieved
> + @retval EFI_SUCCESS : Read was successful
> +
> +**/
> +EFI_STATUS
> +I2cDataRead (
> + IN UINT32 I2cBus,
> + IN UINT8 Chip,
> + IN UINT32 Offset,
> + IN UINT32 Alen,
> + IN UINT8 *Buffer,
> + IN UINT32 Len
> + )
> +{
> + EFI_STATUS Ret;
> + UINT32 Temp;
> + INT32 I;
> + I2C_REGS *I2cRegs;
> +
> + I2cRegs = (I2C_REGS *)I2cAddrArr[I2cBus];
> +
> + Ret = InitDataTransfer(I2cRegs, Chip, Offset, Alen);
> + if (Ret != EFI_SUCCESS) {
> + return Ret;
> + }
> +
> + Temp = MmioRead8((UINTN)&I2cRegs->I2cCr);
> + Temp |= I2C_CR_RSTA;
> + MmioWrite8((UINTN)&I2cRegs->I2cCr, Temp);
> +
> + Ret = TransferByte(I2cRegs, (Chip << 1) | 1);
> + if (Ret != EFI_SUCCESS) {
> + I2cStop(I2cRegs);
> + return Ret;
> + }
> +
> + /** setup bus to read data */
> + Temp = MmioRead8((UINTN)&I2cRegs->I2cCr);
> + Temp &= ~(I2C_CR_MTX | I2C_CR_TX_NO_AK);
> + if (Len == 1) {
> + Temp |= I2C_CR_TX_NO_AK;
> + }
> +
> + MmioWrite8((UINTN)&I2cRegs->I2cCr, Temp);
> + MmioWrite8((UINTN)&I2cRegs->I2cSr, I2C_SR_IIF_CLEAR);
> +
> + /** read data */
> + /** Dummy Read to initiate recieve operation */
> + MmioRead8((UINTN)&I2cRegs->I2cDr);
> +
> + for (I = 0; I < Len; I++) {
> + Ret = WaitForI2cState(I2cRegs, IIF);
> + if ((Ret == EFI_TIMEOUT) || (Ret == EFI_NOT_READY)) {
> + I2cStop(I2cRegs);
> + return Ret;
> + }
> + /**
> + It must generate STOP before read I2DR to prevent
> + controller from generating another clock cycle
> + **/
> + if (I == (Len - 1)) {
> + I2cStop(I2cRegs);
> + } else if (I == (Len - 2)) {
> + Temp = MmioRead8((UINTN)&I2cRegs->I2cCr);
> + Temp |= I2C_CR_TX_NO_AK;
> + MmioWrite8((UINTN)&I2cRegs->I2cCr, Temp);
> + }
> + MmioWrite8((UINTN)&I2cRegs->I2cSr, I2C_SR_IIF_CLEAR);
> + Buffer[I] = MmioRead8((UINTN)&I2cRegs->I2cDr);
> + }
> +
> + I2cStop(I2cRegs);
> +
> + return EFI_SUCCESS;
> +}
> +
> +/**
> + Function to write data using i2c bus
> +
> + @param I2cBus : I2c Controller number
> + @param Chip : Address of slave device where data to be written
> + @param Offset : Offset of slave memory
> + @param Alen : Address length of slave
> + @param Buffer : A pointer to the source buffer for the data
> + @param Len : Length of data to be write
> +
> + @retval EFI_NOT_READY : Arbitration lost
> + @retval EFI_TIMEOUT : Failed to initialize data transfer in predefined time
> + @retval EFI_NOT_FOUND : ACK was not recieved
> + @retval EFI_SUCCESS : Read was successful
> +
> +**/
> +EFI_STATUS
> +I2cDataWrite (
> + IN UINT32 I2cBus,
> + IN UINT8 Chip,
> + IN UINT32 Offset,
> + IN INT32 Alen,
> + OUT UINT8 *Buffer,
> + IN INT32 Len
> + )
> +{
> + EFI_STATUS Ret;
> + I2C_REGS *I2cRegs;
> + INT32 I;
> +
> + I2cRegs = (I2C_REGS *)I2cAddrArr[I2cBus];
> +
> + Ret = InitDataTransfer(I2cRegs, Chip, Offset, Alen);
> + if (Ret != EFI_SUCCESS) {
> + return Ret;
> + }
> +
> + /** write data */
> + /** Dummy write to initiate write operation */
> + for (I = 0; I < Len; I++) {
> + Ret = TransferByte(I2cRegs, Buffer[I]);
> + if (Ret != EFI_SUCCESS) {
> + break;
> + }
> + }
> +
> + I2cStop(I2cRegs);
> + return Ret;
> +}
> +
> +/**
> + Function to Probe i2c bus
> +
> + @param I2c : I2c Controller number
> +
> + @retval EFI_INVALID_PARAMETER : Input parametr I2c was invalid
> + @retval EFI_SUCCESS : I2c was initialized successfully
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +I2cProbeDevices (
> + IN INT16 I2c,
> + IN UINT8 ChipAdd
> + )
> +{
> + if(I2c >= PcdGet32(PcdNumI2cController) || I2cAddrArr[I2c] == 0x0) {
Space after if and after PcdGet32
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + return I2cDataWrite(I2c, ChipAdd, 0, 0, NULL, 0);
and here
> +}
> +
> +/**
> + Function to initialize i2c bus
> +
> + @param I2cBus : I2c Controller number
> + @param Speed : value to be set
> +**/
> +EFI_STATUS
> +EFIAPI
> +I2cBusInit (
> + IN UINT32 I2cBus,
> + IN UINT32 Speed
> + )
> +{
> + return I2cSetBusSpeed(I2cBus, Speed);
> +}
> diff --git a/Platform/NXP/Library/I2cLib/I2cLib.h b/Platform/NXP/Library/I2cLib/I2cLib.h
> new file mode 100644
> index 0000000..61076f5
> --- /dev/null
> +++ b/Platform/NXP/Library/I2cLib/I2cLib.h
> @@ -0,0 +1,109 @@
> +/** I2cLib.h
> + Header defining the constant, base address amd function for I2C controller
> +
> + Copyright 2017 NXP
> +
> + This program and the accompanying materials
> + are licensed and made available under the terms and conditions of the BSD License
> + which accompanies this distribution. The full text of the license may be found at
> + http://opensource.org/licenses/bsd-license.php
> +
> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#ifndef __I2C_H___
> +#define __I2C_H__
> +
> +#include <Uefi.h>
> +
> +#define I2C_CR_IIEN (1 << 6)
> +#define I2C_CR_MSTA (1 << 5)
> +#define I2C_CR_MTX (1 << 4)
> +#define I2C_CR_TX_NO_AK (1 << 3)
> +#define I2C_CR_RSTA (1 << 2)
> +
> +#define I2C_SR_ICF (1 << 7)
> +#define I2C_SR_IBB (1 << 5)
> +#define I2C_SR_IAL (1 << 4)
> +#define I2C_SR_IIF (1 << 1)
> +#define I2C_SR_RX_NO_AK (1 << 0)
> +
> +#define I2C_CR_IEN (0 << 7)
> +#define I2C_CR_IDIS (1 << 7)
> +#define I2C_SR_IIF_CLEAR (1 << 1)
> +
> +#define BUS_IDLE (0 | (I2C_SR_IBB << 8))
> +#define BUS_BUSY (I2C_SR_IBB | (I2C_SR_IBB << 8))
> +#define IIF (I2C_SR_IIF | (I2C_SR_IIF << 8))
> +
> +/**
> + Record defining i2c registers
> +**/
> +typedef struct {
> + UINT8 I2cAdr;
> + UINT8 I2cFdr;
> + UINT8 I2cCr;
> + UINT8 I2cSr;
> + UINT8 I2cDr;
> +} I2C_REGS ;
> +
> +/**
> + Function to set I2c bus speed
> +
> + @param I2cBus I2c Controller number
> + @param Speed Value to be set
> +
> + @retval EFI_SUCCESS
> +**/
> +EFI_STATUS
> +EFIAPI
> +I2cSetBusSpeed (
> + IN UINT32 I2cBus,
> + IN UINT32 Speed
> + );
> +
> +/**
> + Function to stop transaction on i2c bus
> +
> + @param I2cRegs Pointer to i2c registers
> +
> + @retval EFI_NOT_READY Arbitration was lost
> + @retval EFI_TIMEOUT Timeout occured
> + @retval EFI_SUCCESS Stop operation was successful
> +
> +**/
> +EFI_STATUS
> +I2cStop (
> + IN I2C_REGS *I2cRegs
> + );
> +
> +/**
> + Function to initiate data transfer on i2c bus
> +
> + @param I2cRegs Pointer to i2c base registers
> + @param Chip Chip Address
> + @param Offset Slave memory's offset
> + @param Alen length of chip address
> +
> + @retval EFI_NOT_READY Arbitration lost
> + @retval EFI_TIMEOUT Failed to initialize data transfer in predefined time
> + @retval EFI_NOT_FOUND ACK was not recieved
> + @retval EFI_SUCCESS Read was successful
> +
> +**/
> +EFI_STATUS
> +I2cBusInitTransfer (
> + IN I2C_REGS *I2cRegs,
> + IN UINT8 Chip,
> + IN UINT32 Offset,
> + IN INT32 Alen
> + );
> +
> +UINT32
> +CalculateI2cClockRate (
> + VOID
> + );
> +
> +#endif
> diff --git a/Platform/NXP/Library/I2cLib/I2cLib.inf b/Platform/NXP/Library/I2cLib/I2cLib.inf
> new file mode 100644
> index 0000000..427c3b8
> --- /dev/null
> +++ b/Platform/NXP/Library/I2cLib/I2cLib.inf
> @@ -0,0 +1,43 @@
> +# I2cLib.inf
> +#
> +# Component description file for I2cLib module
> +#
> +# Copyright 2017 NXP
> +#
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD License
> +# which accompanies this distribution. The full text of the license may be found at
> +# http://opensource.org/licenses/bsd-license.php
> +#
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +#
> +#
> +
> +[Defines]
> + INF_VERSION = 0x00010005
0x0001001A
> + BASE_NAME = I2cLib
> + FILE_GUID = 8ecefc8f-a2c4-4091-b81f-20f7aeb0567f
Please don't reuse the GUID of PL011SerialPortLib.inf
> + MODULE_TYPE = BASE
> + VERSION_STRING = 1.0
> + LIBRARY_CLASS = I2cLib
> +
> +[Sources.common]
> + I2cLib.c
> +
> +[LibraryClasses]
> + BaseLib
> + IoLib
> + SocLib
Please reorder this patch after the one that introduces SocLib (if
this truly depends on it)
> + TimerLib
> +
> +[Packages]
> + MdePkg/MdePkg.dec
> + edk2-platforms/Platform/NXP/NxpQoriqLs.dec
Please remove edk2-platforms/ prefix and add it to your PACKAGES_PATH instead.
> +
> +[Pcd]
> + gNxpQoriqLsTokenSpaceGuid.PcdI2c0BaseAddr
> + gNxpQoriqLsTokenSpaceGuid.PcdI2c1BaseAddr
> + gNxpQoriqLsTokenSpaceGuid.PcdI2c2BaseAddr
> + gNxpQoriqLsTokenSpaceGuid.PcdI2c3BaseAddr
> + gNxpQoriqLsTokenSpaceGuid.PcdNumI2cController
> --
> 1.9.1
>
^ permalink raw reply [flat|nested] 39+ messages in thread
* Re: [PATCH 06/10] Platform/NXP: Add support for I2c operations library
2017-11-13 12:36 ` Ard Biesheuvel
@ 2017-11-14 5:36 ` Meenakshi Aggarwal
0 siblings, 0 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-14 5:36 UTC (permalink / raw)
To: Ard Biesheuvel
Cc: Leif Lindholm, Kinney, Michael D, edk2-devel@lists.01.org,
Udit Kumar, Varun Sethi
> -----Original Message-----
> From: Ard Biesheuvel [mailto:ard.biesheuvel@linaro.org]
> Sent: Monday, November 13, 2017 6:06 PM
> To: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> Cc: Leif Lindholm <leif.lindholm@linaro.org>; Kinney, Michael D
> <michael.d.kinney@intel.com>; edk2-devel@lists.01.org; Udit Kumar
> <udit.kumar@nxp.com>; Varun Sethi <V.Sethi@nxp.com>
> Subject: Re: [PATCH 06/10] Platform/NXP: Add support for I2c operations
> library
>
> On 7 November 2017 at 14:42, Meenakshi Aggarwal
> <meenakshi.aggarwal@nxp.com> wrote:
> > I2C bus initialization and I2c read/write APIs added.
> >
> > Contributed-under: TianoCore Contribution Agreement 1.1
> > Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> > ---
> > Platform/NXP/Include/Library/I2c.h | 125 ++++++++
> > Platform/NXP/Library/I2cLib/I2cLib.c | 549
> +++++++++++++++++++++++++++++++++
> > Platform/NXP/Library/I2cLib/I2cLib.h | 109 +++++++
> > Platform/NXP/Library/I2cLib/I2cLib.inf | 43 +++
> > 4 files changed, 826 insertions(+)
> > create mode 100644 Platform/NXP/Include/Library/I2c.h
> > create mode 100644 Platform/NXP/Library/I2cLib/I2cLib.c
> > create mode 100644 Platform/NXP/Library/I2cLib/I2cLib.h
> > create mode 100644 Platform/NXP/Library/I2cLib/I2cLib.inf
> >
>
> Please try to use the PI protocols for I2C rather than inventing your own.
>
Will rework our patch
> > diff --git a/Platform/NXP/Include/Library/I2c.h
> > b/Platform/NXP/Include/Library/I2c.h
> > new file mode 100644
> > index 0000000..c7195ab
> > --- /dev/null
> > +++ b/Platform/NXP/Include/Library/I2c.h
> > @@ -0,0 +1,125 @@
> > +/** I2c.h
> > + Header defining the constant, base address amd function for I2C
> > +controller
> > +
> > + Copyright 2017 NXP
> > +
> > + This program and the accompanying materials are licensed and made
> > + available under the terms and conditions of the BSD License which
> > + accompanies this distribution. The full text of the license may be
> > + found at
> > +
> > +
> https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> > + ensource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.a
> > +
> ggarwal%40nxp.com%7C14609f2d45104cbffa4d08d52a9322ed%7C686ea1d3b
> c2b4
> > +
> c6fa92cd99c5c301635%7C0%7C0%7C636461733822406010&sdata=v6XNbA4uv
> FFb2
> > + Fp5daZGXSedLOy1cJW%2F5Uo94vcdpbU%3D&reserved=0
> > +
> > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > + BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +
> > +**/
> > +
> > +#ifndef __I2C_H___
> > +#define __I2C_H__
> > +
> > +#include <Uefi.h>
> > +
> > +#define I2C1 0
> > +#define I2C2 1
> > +#define I2C3 2
> > +#define I2C4 3
> > +
> > +///
> > +/// Define the I2C flags
> > +///
> > +#define I2C_READ_FLAG 0x1
> > +#define I2C_WRITE_FLAG 0x2
> > +
> > +/**
> > + Function to initialize i2c bus
> > +
> > + @param I2cBus I2c Controller number
> > + @param Speed Value to be set
> > +
> > + @retval EFI_SUCCESS
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +I2cBusInit (
> > + IN UINT32 I2cBus,
> > + IN UINT32 Speed
>
> Please fix alignment
>
> > + );
> > +
> > +/**
> > + Function to read data usin i2c
> > +
> > + @param I2cBus I2c Controller number
> > + @param Chip Address of slave device from where data to be read
> > + @param Offset Offset of slave memory
> > + @param Alen Address length of slave
> > + @param Buffer A pointer to the destination buffer for the data
> > + @param Len Length of data to be read
> > +
> > + @retval EFI_NOT_READY Arbitration lost
> > + @retval EFI_TIMEOUT Failed to initialize data transfer in predefined
> time
> > + @retval EFI_NOT_FOUND ACK was not recieved
> > + @retval EFI_SUCCESS Read was successful
> > +
> > +**/
> > +EFI_STATUS
> > +I2cDataRead (
> > + IN UINT32 I2cBus,
> > + IN UINT8 Chip,
> > + IN UINT32 Offset,
> > + IN UINT32 Alen,
> > + OUT UINT8 *Buffer,
> > + IN UINT32 Len
> > + );
>
> and here
>
> > +
> > +/**
> > + Function to write data using i2c bus
> > +
> > + @param I2cBus I2c Controller number
> > + @param Chip Address of slave device where data to be
> written
> > + @param Offset Offset of slave memory
> > + @param Alen Address length of slave
> > + @param Buffer A pointer to the source buffer for the data
> > + @param Len Length of data to be write
> > +
> > + @retval EFI_NOT_READY Arbitration lost
> > + @retval EFI_TIMEOUT Failed to initialize data transfer in
> predefined time
> > + @retval EFI_NOT_FOUND ACK was not recieved
> > + @retval EFI_SUCCESS Read was successful
> > +
> > +**/
> > +EFI_STATUS
> > +I2cDataWrite (
> > + IN UINT32 I2cBus,
> > + IN UINT8 Chip,
> > + IN UINT32 Offset,
> > + IN INT32 Alen,
> > + OUT UINT8 *Buffer,
> > + IN INT32 Len
> > + );
> > +
> > +/**
> > + Function to reset I2c
> > + @param I2cBus I2c Controller number
> > +
> > + @return VOID
> > +**/
> > +VOID
> > +I2cReset (
> > + UINT32 I2cBus
> > + );
> > +
> > +/**
> > + Function to Probe I2c slave device
> > + @param I2cBus I2c Controller number
> > +
> > + @retval EFI_INVALID_PARAMETER Invalid I2c Controller number
> > + @retval EFI_SUCCESS I2c device probed successfully
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +I2cProbeDevices (
> > + IN INT16 I2cBus,
> > + IN UINT8 Chip
> > + );
> > +
> > +#endif
> > diff --git a/Platform/NXP/Library/I2cLib/I2cLib.c
> > b/Platform/NXP/Library/I2cLib/I2cLib.c
> > new file mode 100644
> > index 0000000..574b899
> > --- /dev/null
> > +++ b/Platform/NXP/Library/I2cLib/I2cLib.c
> > @@ -0,0 +1,549 @@
> > +/** I2cLib.c
> > + I2c Library containing functions for read, write, initialize, set
> > +speed etc
> > +
> > + Copyright 2017 NXP
> > +
> > + This program and the accompanying materials are licensed and made
> > + available under the terms and conditions of the BSD License which
> > + accompanies this distribution. The full text of the license may be
> > + found at
> > +
> > +
> https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> > + ensource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.a
> > +
> ggarwal%40nxp.com%7C14609f2d45104cbffa4d08d52a9322ed%7C686ea1d3b
> c2b4
> > +
> c6fa92cd99c5c301635%7C0%7C0%7C636461733822406010&sdata=v6XNbA4uv
> FFb2
> > + Fp5daZGXSedLOy1cJW%2F5Uo94vcdpbU%3D&reserved=0
> > +
> > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > + BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +
> > +**/
> > +#include <Base.h>
> > +#include <Library/DebugLib.h>
> > +#include <Library/I2c.h>
> > +#include <Library/IoLib.h>
> > +#include <Library/TimerLib.h>
> > +
> > +#include "I2cLib.h"
> > +
>
> STATIC CONST
>
> > +EFI_PHYSICAL_ADDRESS
> I2cAddrArr[FixedPcdGet32(PcdNumI2cController)] =
> > +{
> > + FixedPcdGet64(PcdI2c0BaseAddr),
> > + FixedPcdGet64(PcdI2c1BaseAddr),
> > + FixedPcdGet64(PcdI2c2BaseAddr),
> > + FixedPcdGet64(PcdI2c3BaseAddr)
> > +};
> > +
>
> STATIC CONST
>
> > +UINT16 ClkDiv[60][2] = {
> > + { 20, 0x00 }, { 22, 0x01 }, { 24, 0x02 }, { 26, 0x03 },
> > + { 28, 0x04 }, { 30, 0x05 }, { 32, 0x09 }, { 34, 0x06 },
> > + { 36, 0x0A }, { 40, 0x07 }, { 44, 0x0C }, { 48, 0x0D },
> > + { 52, 0x43 }, { 56, 0x0E }, { 60, 0x45 }, { 64, 0x12 },
> > + { 68, 0x0F }, { 72, 0x13 }, { 80, 0x14 }, { 88, 0x15 },
> > + { 96, 0x19 }, { 104, 0x16 }, { 112, 0x1A }, { 128, 0x17 },
> > + { 136, 0x4F }, { 144, 0x1C }, { 160, 0x1D }, { 176, 0x55 },
> > + { 192, 0x1E }, { 208, 0x56 }, { 224, 0x22 }, { 228, 0x24 },
> > + { 240, 0x1F }, { 256, 0x23 }, { 288, 0x5C }, { 320, 0x25 },
> > + { 384, 0x26 }, { 448, 0x2A }, { 480, 0x27 }, { 512, 0x2B },
> > + { 576, 0x2C }, { 640, 0x2D }, { 768, 0x31 }, { 896, 0x32 },
> > + { 960, 0x2F }, { 1024, 0x33 }, { 1152, 0x34 },{ 1280, 0x35 },
> > + { 1536, 0x36 }, { 1792, 0x3A }, { 1920, 0x37 }, { 2048, 0x3B },
> > + { 2304, 0x3C }, { 2560, 0x3D }, { 3072, 0x3E }, { 3584, 0x7A },
> > + { 3840, 0x3F }, { 4096, 0x7B }, { 5120, 0x7D }, { 6144, 0x7E }, };
> > +
> > +/**
> > + Calculate and set proper clock divider
> > +
> > + @param Rate : clock rate
> > +
> > + @retval ClkDiv : Value used to get frequency divider value
> > +
> > +**/
>
> STATIC
>
> > +UINT8
> > +GetClk(
> > + IN UINT32 Rate
> > + )
> > +{
> > + UINTN ClkRate;
> > + UINT32 Div;
> > + UINT8 ClkDivx;
> > +
> > + ClkRate = CalculateI2cClockRate();
> > +
> > + Div = (ClkRate + Rate - 1) / Rate;
> > +
> > + if (Div < ClkDiv[0][0]) {
> > + ClkDivx = 0;
> > + } else if (Div > ClkDiv[ARRAY_SIZE(ClkDiv) - 1][0]){
> > + ClkDivx = ARRAY_SIZE(ClkDiv) - 1; } else {
> > + for (ClkDivx = 0; ClkDiv[ClkDivx][0] < Div; ClkDivx++); }
> > +
> > + return ClkDivx;
> > +}
> > +
> > +/**
> > + Function to reset I2c
> > + @param I2cBus : I2c Controller number
> > +
> > + @return VOID
> > +**/
> > +
> > +VOID
> > +I2cReset (
> > + IN UINT32 I2cBus
> > + )
> > +{
> > + I2C_REGS *I2cRegs;
> > +
> > + I2cRegs = (I2C_REGS *)I2cAddrArr[I2cBus];
> > +
> > + /** Reset module */
>
> Please use // for single line comments
>
> > + MmioWrite8((UINTN)&I2cRegs->I2cCr, I2C_CR_IDIS);
> > + MmioWrite8((UINTN)&I2cRegs->I2cSr, 0);
>
> Space before (
>
> > +}
> > +
> > +/**
> > + Function to set I2c bus speed
> > +
> > + @param I2cBus : I2c Controller number
> > + @param Speed : Value to be set
> > +
> > + @retval EFI_SUCCESS
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +I2cSetBusSpeed (
> > + IN UINT32 I2cBus,
> > + IN UINT32 Speed
> > + )
> > +{
> > + I2C_REGS *I2cRegs;
> > + UINT8 ClkId;
> > + UINT8 SpeedId;
> > +
> > + I2cRegs = (I2C_REGS *)I2cAddrArr[I2cBus];
> > +
> > + ASSERT(I2cRegs);
> > +
> > + ClkId = GetClk(Speed);
> > + SpeedId = ClkDiv[ClkId][1];
> > +
> > + /** Store divider value */
> > + MmioWrite8((UINTN)&I2cRegs->I2cFdr, SpeedId); I2cReset(I2cBus);
> > +
> > + return EFI_SUCCESS;
> > +}
> > +
> > +/**
> > + Function used to check if i2c is in mentioned state or not
> > +
> > + @param I2cRegs : Pointer to I2C registers
> > + @param State : i2c state need to be checked
> > +
> > + @retval EFI_NOT_READY Arbitration was lost
> > + @retval EFI_TIMEOUT Timeout occured
> > + @retval CurrState Value of state register
> > +
> > +**/
> > +EFI_STATUS
> > +WaitForI2cState (
> > + IN I2C_REGS *I2cRegs,
> > + IN UINT32 State
> > + )
> > +{
> > + UINT8 CurrState;
> > + UINT64 Cnt;
> > +
> > + for (Cnt = 0; Cnt < 50; Cnt++) {
> > + CurrState = MmioRead8((UINTN)&I2cRegs->I2cSr);
> > + if (CurrState & I2C_SR_IAL) {
> > + MmioWrite8((UINTN)&I2cRegs->I2cSr, CurrState | I2C_SR_IAL);
> > + return EFI_NOT_READY;
> > + }
> > +
> > + if ((CurrState & (State >> 8)) == (UINT8)State) {
> > + return CurrState;
> > + }
> > +
> > + MicroSecondDelay(300);
>
> Why 300 us? And please add a MemoryFence () as well
>
> > + }
> > +
> > + return EFI_TIMEOUT;
> > +}
> > +
> > +/**
> > + Function to transfer byte on i2c
> > +
> > + @param I2cRegs : Pointer to i2c registers
> > + @param Byte : Byte to be transferred on i2c bus
> > +
> > + @retval EFI_NOT_READY Arbitration was lost
> > + @retval EFI_TIMEOUT Timeout occured
> > + @retval EFI_NOT_FOUND ACK was not recieved
> > + @retval EFI_SUCCESS Data transfer was succesful
> > +
> > +**/
> > +EFI_STATUS
> > +TransferByte (
> > + IN I2C_REGS *I2cRegs,
> > + IN UINT8 Byte
> > + )
> > +{
> > + EFI_STATUS Ret;
> > +
> > + MmioWrite8((UINTN)&I2cRegs->I2cSr, I2C_SR_IIF_CLEAR);
> > + MmioWrite8((UINTN)&I2cRegs->I2cDr, Byte);
> > +
> > + Ret = WaitForI2cState(I2cRegs, IIF); if ((Ret == EFI_TIMEOUT) ||
> > + (Ret == EFI_NOT_READY)) {
> > + return Ret;
> > + }
> > +
> > + if (Ret & I2C_SR_RX_NO_AK) {
> > + return EFI_NOT_FOUND;
> > + }
> > +
> > + return EFI_SUCCESS;
> > +}
> > +
> > +/**
> > + Function to stop transaction on i2c bus
> > +
> > + @param I2cRegs : Pointer to i2c registers
> > +
> > + @retval EFI_NOT_READY Arbitration was lost
> > + @retval EFI_TIMEOUT Timeout occured
> > + @retval EFI_SUCCESS Stop operation was successful
> > +
> > +**/
> > +EFI_STATUS
> > +I2cStop (
> > + IN I2C_REGS *I2cRegs
> > + )
> > +{
> > + INT32 Ret;
> > + UINT32 Temp;
> > +
> > + Temp = MmioRead8((UINTN)&I2cRegs->I2cCr);
> > +
> > + Temp &= ~(I2C_CR_MSTA | I2C_CR_MTX);
> > + MmioWrite8((UINTN)&I2cRegs->I2cCr, Temp);
> > +
> > + Ret = WaitForI2cState(I2cRegs, BUS_IDLE);
> > +
> > + if (Ret < 0) {
> > + return Ret;
> > + } else {
> > + return EFI_SUCCESS;
> > + }
> > +}
> > +
> > +/**
> > + Function to send start signal, Chip Address and
> > + memory offset
> > +
> > + @param I2cRegs : Pointer to i2c base registers
> > + @param Chip : Chip Address
> > + @param Offset : Slave memory's offset
> > + @param Alen : length of chip address
> > +
> > + @retval EFI_NOT_READY Arbitration lost
> > + @retval EFI_TIMEOUT Failed to initialize data transfer in predefined
> time
> > + @retval EFI_NOT_FOUND ACK was not recieved
> > + @retval EFI_SUCCESS Read was successful
> > +
> > +**/
> > +EFI_STATUS
> > +InitTransfer (
> > + IN I2C_REGS *I2cRegs,
> > + IN UINT8 Chip,
> > + IN UINT32 Offset,
> > + IN INT32 Alen
> > + )
> > +{
> > + UINT32 Temp;
> > + EFI_STATUS Ret;
> > +
> > + /** Enable I2C controller */
> > + if (MmioRead8((UINTN)&I2cRegs->I2cCr) & I2C_CR_IDIS) {
> > + MmioWrite8((UINTN)&I2cRegs->I2cCr, I2C_CR_IEN); }
> > +
> > + if (MmioRead8((UINTN)&I2cRegs->I2cAdr) == (Chip << 1)) {
> > + MmioWrite8((UINTN)&I2cRegs->I2cAdr, (Chip << 1) ^ 2); }
> > +
> > + MmioWrite8((UINTN)&I2cRegs->I2cSr, I2C_SR_IIF_CLEAR); Ret =
> > + WaitForI2cState(I2cRegs, BUS_IDLE); if ((Ret == EFI_TIMEOUT) ||
> > + (Ret == EFI_NOT_READY)) {
> > + return Ret;
> > + }
> > +
> > + /** Start I2C transaction */
> > + Temp = MmioRead8((UINTN)&I2cRegs->I2cCr);
> > + /** set to master mode */
> > + Temp |= I2C_CR_MSTA;
> > + MmioWrite8((UINTN)&I2cRegs->I2cCr, Temp);
> > +
> > + Ret = WaitForI2cState(I2cRegs, BUS_BUSY); if ((Ret == EFI_TIMEOUT)
> > + || (Ret == EFI_NOT_READY)) {
> > + return Ret;
> > + }
> > +
> > + Temp |= I2C_CR_MTX | I2C_CR_TX_NO_AK;
> > + MmioWrite8((UINTN)&I2cRegs->I2cCr, Temp);
> > +
> > + /** write slave Address */
> > + Ret = TransferByte(I2cRegs, Chip << 1); if (Ret != EFI_SUCCESS) {
> > + return Ret;
> > + }
> > +
> > + if (Alen >= 0) {
> > + while (Alen--) {
> > + Ret = TransferByte(I2cRegs, (Offset >> (Alen * 8)) & 0xff);
> > + if (Ret != EFI_SUCCESS)
> > + return Ret;
> > + }
> > + }
> > + return EFI_SUCCESS;
> > +}
> > +
> > +/**
> > + Function to check if i2c bud is idle
>
> bud -> bus
>
> > +
> > + @param Base : Pointer to base address of I2c controller
> > +
> > + @retval EFI_SUCCESS
> > +
> > +**/
> > +INT32
> > +I2cBusIdle (
> > + IN VOID *Base
> > + )
> > +{
> > + return EFI_SUCCESS;
> > +}
> > +
> > +/**
> > + Function to initiate data transfer on i2c bus
> > +
> > + @param I2cRegs : Pointer to i2c base registers
> > + @param Chip : Chip Address
> > + @param Offset : Slave memory's offset
> > + @param Alen : length of chip address
> > +
> > + @retval EFI_NOT_READY : Arbitration lost
> > + @retval EFI_TIMEOUT : Failed to initialize data transfer in predefined
> time
> > + @retval EFI_NOT_FOUND : ACK was not recieved
> > + @retval EFI_SUCCESS : Read was successful
> > +
> > +**/
> > +EFI_STATUS
> > +InitDataTransfer (
> > + IN I2C_REGS *I2cRegs,
> > + IN UINT8 Chip,
> > + IN UINT32 Offset,
> > + IN INT32 Alen
> > + )
> > +{
> > + EFI_STATUS Ret;
> > + INT32 Retry;
> > +
> > + for (Retry = 0; Retry < 3; Retry++) {
> > + Ret = InitTransfer(I2cRegs, Chip, Offset, Alen);
> > + if (Ret == EFI_SUCCESS) {
> > + return EFI_SUCCESS;
> > + }
> > +
> > + I2cStop(I2cRegs);
> > +
> > + if (EFI_NOT_FOUND == Ret) {
> > + return Ret;
> > + }
> > +
> > + /** Disable controller */
> > + if (Ret != EFI_NOT_READY) {
> > + MmioWrite8((UINTN)&I2cRegs->I2cCr, I2C_CR_IDIS);
> > + }
> > +
> > + if (I2cBusIdle(I2cRegs) < 0) {
> > + break;
> > + }
> > + }
> > + return Ret;
> > +}
> > +
> > +/**
> > + Function to read data using i2c bus
> > +
> > + @param I2cBus : I2c Controller number
> > + @param Chip : Address of slave device from where data to be
> read
> > + @param Offset : Offset of slave memory
> > + @param Alen : Address length of slave
> > + @param Buffer : A pointer to the destination buffer for the data
> > + @param Len : Length of data to be read
> > +
> > + @retval EFI_NOT_READY : Arbitration lost
> > + @retval EFI_TIMEOUT : Failed to initialize data transfer in predefined
> time
> > + @retval EFI_NOT_FOUND : ACK was not recieved
> > + @retval EFI_SUCCESS : Read was successful
> > +
> > +**/
> > +EFI_STATUS
> > +I2cDataRead (
> > + IN UINT32 I2cBus,
> > + IN UINT8 Chip,
> > + IN UINT32 Offset,
> > + IN UINT32 Alen,
> > + IN UINT8 *Buffer,
> > + IN UINT32 Len
> > + )
> > +{
> > + EFI_STATUS Ret;
> > + UINT32 Temp;
> > + INT32 I;
> > + I2C_REGS *I2cRegs;
> > +
> > + I2cRegs = (I2C_REGS *)I2cAddrArr[I2cBus];
> > +
> > + Ret = InitDataTransfer(I2cRegs, Chip, Offset, Alen); if (Ret !=
> > + EFI_SUCCESS) {
> > + return Ret;
> > + }
> > +
> > + Temp = MmioRead8((UINTN)&I2cRegs->I2cCr);
> > + Temp |= I2C_CR_RSTA;
> > + MmioWrite8((UINTN)&I2cRegs->I2cCr, Temp);
> > +
> > + Ret = TransferByte(I2cRegs, (Chip << 1) | 1); if (Ret !=
> > + EFI_SUCCESS) {
> > + I2cStop(I2cRegs);
> > + return Ret;
> > + }
> > +
> > + /** setup bus to read data */
> > + Temp = MmioRead8((UINTN)&I2cRegs->I2cCr);
> > + Temp &= ~(I2C_CR_MTX | I2C_CR_TX_NO_AK); if (Len == 1) {
> > + Temp |= I2C_CR_TX_NO_AK;
> > + }
> > +
> > + MmioWrite8((UINTN)&I2cRegs->I2cCr, Temp);
> > + MmioWrite8((UINTN)&I2cRegs->I2cSr, I2C_SR_IIF_CLEAR);
> > +
> > + /** read data */
> > + /** Dummy Read to initiate recieve operation */
> > + MmioRead8((UINTN)&I2cRegs->I2cDr);
> > +
> > + for (I = 0; I < Len; I++) {
> > + Ret = WaitForI2cState(I2cRegs, IIF);
> > + if ((Ret == EFI_TIMEOUT) || (Ret == EFI_NOT_READY)) {
> > + I2cStop(I2cRegs);
> > + return Ret;
> > + }
> > + /**
> > + It must generate STOP before read I2DR to prevent
> > + controller from generating another clock cycle
> > + **/
> > + if (I == (Len - 1)) {
> > + I2cStop(I2cRegs);
> > + } else if (I == (Len - 2)) {
> > + Temp = MmioRead8((UINTN)&I2cRegs->I2cCr);
> > + Temp |= I2C_CR_TX_NO_AK;
> > + MmioWrite8((UINTN)&I2cRegs->I2cCr, Temp);
> > + }
> > + MmioWrite8((UINTN)&I2cRegs->I2cSr, I2C_SR_IIF_CLEAR);
> > + Buffer[I] = MmioRead8((UINTN)&I2cRegs->I2cDr);
> > + }
> > +
> > + I2cStop(I2cRegs);
> > +
> > + return EFI_SUCCESS;
> > +}
> > +
> > +/**
> > + Function to write data using i2c bus
> > +
> > + @param I2cBus : I2c Controller number
> > + @param Chip : Address of slave device where data to be written
> > + @param Offset : Offset of slave memory
> > + @param Alen : Address length of slave
> > + @param Buffer : A pointer to the source buffer for the data
> > + @param Len : Length of data to be write
> > +
> > + @retval EFI_NOT_READY : Arbitration lost
> > + @retval EFI_TIMEOUT : Failed to initialize data transfer in predefined
> time
> > + @retval EFI_NOT_FOUND : ACK was not recieved
> > + @retval EFI_SUCCESS : Read was successful
> > +
> > +**/
> > +EFI_STATUS
> > +I2cDataWrite (
> > + IN UINT32 I2cBus,
> > + IN UINT8 Chip,
> > + IN UINT32 Offset,
> > + IN INT32 Alen,
> > + OUT UINT8 *Buffer,
> > + IN INT32 Len
> > + )
> > +{
> > + EFI_STATUS Ret;
> > + I2C_REGS *I2cRegs;
> > + INT32 I;
> > +
> > + I2cRegs = (I2C_REGS *)I2cAddrArr[I2cBus];
> > +
> > + Ret = InitDataTransfer(I2cRegs, Chip, Offset, Alen); if (Ret !=
> > + EFI_SUCCESS) {
> > + return Ret;
> > + }
> > +
> > + /** write data */
> > + /** Dummy write to initiate write operation */ for (I = 0; I <
> > + Len; I++) {
> > + Ret = TransferByte(I2cRegs, Buffer[I]);
> > + if (Ret != EFI_SUCCESS) {
> > + break;
> > + }
> > + }
> > +
> > + I2cStop(I2cRegs);
> > + return Ret;
> > +}
> > +
> > +/**
> > + Function to Probe i2c bus
> > +
> > + @param I2c : I2c Controller number
> > +
> > + @retval EFI_INVALID_PARAMETER : Input parametr I2c was invalid
> > + @retval EFI_SUCCESS : I2c was initialized successfully
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +I2cProbeDevices (
> > + IN INT16 I2c,
> > + IN UINT8 ChipAdd
> > + )
> > +{
> > + if(I2c >= PcdGet32(PcdNumI2cController) || I2cAddrArr[I2c] == 0x0)
> > +{
>
> Space after if and after PcdGet32
>
>
> > + return EFI_INVALID_PARAMETER;
> > + }
> > +
> > + return I2cDataWrite(I2c, ChipAdd, 0, 0, NULL, 0);
>
> and here
>
> > +}
> > +
> > +/**
> > + Function to initialize i2c bus
> > +
> > + @param I2cBus : I2c Controller number
> > + @param Speed : value to be set
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +I2cBusInit (
> > + IN UINT32 I2cBus,
> > + IN UINT32 Speed
> > + )
> > +{
> > + return I2cSetBusSpeed(I2cBus, Speed); }
> > diff --git a/Platform/NXP/Library/I2cLib/I2cLib.h
> > b/Platform/NXP/Library/I2cLib/I2cLib.h
> > new file mode 100644
> > index 0000000..61076f5
> > --- /dev/null
> > +++ b/Platform/NXP/Library/I2cLib/I2cLib.h
> > @@ -0,0 +1,109 @@
> > +/** I2cLib.h
> > + Header defining the constant, base address amd function for I2C
> > +controller
> > +
> > + Copyright 2017 NXP
> > +
> > + This program and the accompanying materials are licensed and made
> > + available under the terms and conditions of the BSD License which
> > + accompanies this distribution. The full text of the license may be
> > + found at
> > +
> > +
> https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> > + ensource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.a
> > +
> ggarwal%40nxp.com%7C14609f2d45104cbffa4d08d52a9322ed%7C686ea1d3b
> c2b4
> > +
> c6fa92cd99c5c301635%7C0%7C0%7C636461733822406010&sdata=v6XNbA4uv
> FFb2
> > + Fp5daZGXSedLOy1cJW%2F5Uo94vcdpbU%3D&reserved=0
> > +
> > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > + BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +
> > +**/
> > +
> > +#ifndef __I2C_H___
> > +#define __I2C_H__
> > +
> > +#include <Uefi.h>
> > +
> > +#define I2C_CR_IIEN (1 << 6)
> > +#define I2C_CR_MSTA (1 << 5)
> > +#define I2C_CR_MTX (1 << 4)
> > +#define I2C_CR_TX_NO_AK (1 << 3)
> > +#define I2C_CR_RSTA (1 << 2)
> > +
> > +#define I2C_SR_ICF (1 << 7)
> > +#define I2C_SR_IBB (1 << 5)
> > +#define I2C_SR_IAL (1 << 4)
> > +#define I2C_SR_IIF (1 << 1)
> > +#define I2C_SR_RX_NO_AK (1 << 0)
> > +
> > +#define I2C_CR_IEN (0 << 7)
> > +#define I2C_CR_IDIS (1 << 7)
> > +#define I2C_SR_IIF_CLEAR (1 << 1)
> > +
> > +#define BUS_IDLE (0 | (I2C_SR_IBB << 8))
> > +#define BUS_BUSY (I2C_SR_IBB | (I2C_SR_IBB << 8))
> > +#define IIF (I2C_SR_IIF | (I2C_SR_IIF << 8))
> > +
> > +/**
> > + Record defining i2c registers
> > +**/
> > +typedef struct {
> > + UINT8 I2cAdr;
> > + UINT8 I2cFdr;
> > + UINT8 I2cCr;
> > + UINT8 I2cSr;
> > + UINT8 I2cDr;
> > +} I2C_REGS ;
> > +
> > +/**
> > + Function to set I2c bus speed
> > +
> > + @param I2cBus I2c Controller number
> > + @param Speed Value to be set
> > +
> > + @retval EFI_SUCCESS
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +I2cSetBusSpeed (
> > + IN UINT32 I2cBus,
> > + IN UINT32 Speed
> > + );
> > +
> > +/**
> > + Function to stop transaction on i2c bus
> > +
> > + @param I2cRegs Pointer to i2c registers
> > +
> > + @retval EFI_NOT_READY Arbitration was lost
> > + @retval EFI_TIMEOUT Timeout occured
> > + @retval EFI_SUCCESS Stop operation was successful
> > +
> > +**/
> > +EFI_STATUS
> > +I2cStop (
> > + IN I2C_REGS *I2cRegs
> > + );
> > +
> > +/**
> > + Function to initiate data transfer on i2c bus
> > +
> > + @param I2cRegs Pointer to i2c base registers
> > + @param Chip Chip Address
> > + @param Offset Slave memory's offset
> > + @param Alen length of chip address
> > +
> > + @retval EFI_NOT_READY Arbitration lost
> > + @retval EFI_TIMEOUT Failed to initialize data transfer in
> predefined time
> > + @retval EFI_NOT_FOUND ACK was not recieved
> > + @retval EFI_SUCCESS Read was successful
> > +
> > +**/
> > +EFI_STATUS
> > +I2cBusInitTransfer (
> > + IN I2C_REGS *I2cRegs,
> > + IN UINT8 Chip,
> > + IN UINT32 Offset,
> > + IN INT32 Alen
> > + );
> > +
> > +UINT32
> > +CalculateI2cClockRate (
> > + VOID
> > + );
> > +
> > +#endif
> > diff --git a/Platform/NXP/Library/I2cLib/I2cLib.inf
> > b/Platform/NXP/Library/I2cLib/I2cLib.inf
> > new file mode 100644
> > index 0000000..427c3b8
> > --- /dev/null
> > +++ b/Platform/NXP/Library/I2cLib/I2cLib.inf
> > @@ -0,0 +1,43 @@
> > +# I2cLib.inf
> > +#
> > +# Component description file for I2cLib module # # Copyright 2017
> > +NXP # # This program and the accompanying materials # are licensed
> > +and made available under the terms and conditions of the BSD License
> > +# which accompanies this distribution. The full text of the license
> > +may be found at #
> >
> +https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> e
> > +nsource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.agg
> >
> +arwal%40nxp.com%7C14609f2d45104cbffa4d08d52a9322ed%7C686ea1d3bc
> 2b4c6f
> >
> +a92cd99c5c301635%7C0%7C0%7C636461733822406010&sdata=v6XNbA4uvF
> Fb2Fp5d
> > +aZGXSedLOy1cJW%2F5Uo94vcdpbU%3D&reserved=0
> > +#
> > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > +BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +#
> > +#
> > +
> > +[Defines]
> > + INF_VERSION = 0x00010005
>
> 0x0001001A
>
> > + BASE_NAME = I2cLib
> > + FILE_GUID = 8ecefc8f-a2c4-4091-b81f-20f7aeb0567f
>
> Please don't reuse the GUID of PL011SerialPortLib.inf
>
> > + MODULE_TYPE = BASE
> > + VERSION_STRING = 1.0
> > + LIBRARY_CLASS = I2cLib
> > +
> > +[Sources.common]
> > + I2cLib.c
> > +
> > +[LibraryClasses]
> > + BaseLib
> > + IoLib
> > + SocLib
>
> Please reorder this patch after the one that introduces SocLib (if this truly
> depends on it)
>
> > + TimerLib
> > +
> > +[Packages]
> > + MdePkg/MdePkg.dec
> > + edk2-platforms/Platform/NXP/NxpQoriqLs.dec
>
> Please remove edk2-platforms/ prefix and add it to your PACKAGES_PATH
> instead.
>
> > +
> > +[Pcd]
> > + gNxpQoriqLsTokenSpaceGuid.PcdI2c0BaseAddr
> > + gNxpQoriqLsTokenSpaceGuid.PcdI2c1BaseAddr
> > + gNxpQoriqLsTokenSpaceGuid.PcdI2c2BaseAddr
> > + gNxpQoriqLsTokenSpaceGuid.PcdI2c3BaseAddr
> > + gNxpQoriqLsTokenSpaceGuid.PcdNumI2cController
> > --
> > 1.9.1
> >
^ permalink raw reply [flat|nested] 39+ messages in thread
* [PATCH 07/10] Platform/NXP : Add support for DS1307 RTC library
2017-11-07 14:42 [PATCH 00/10] edk2-platforms/Platform/NXP Meenakshi Aggarwal
` (5 preceding siblings ...)
2017-11-07 14:42 ` [PATCH 06/10] Platform/NXP: Add support for I2c operations library Meenakshi Aggarwal
@ 2017-11-07 14:42 ` Meenakshi Aggarwal
2017-11-13 12:42 ` Ard Biesheuvel
2017-11-07 14:42 ` [PATCH 08/10] Platform/NXP: Add support for ArmPlatformLib Meenakshi Aggarwal
` (3 subsequent siblings)
10 siblings, 1 reply; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-07 14:42 UTC (permalink / raw)
To: ard.biesheuvel, leif.lindholm, michael.d.kinney, edk2-devel
Real time clock Apis on top of I2C Apis
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
---
Platform/NXP/Library/Ds1307RtcLib/Ds1307Rtc.h | 40 ++++
Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.c | 226 +++++++++++++++++++++
Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.inf | 40 ++++
3 files changed, 306 insertions(+)
create mode 100644 Platform/NXP/Library/Ds1307RtcLib/Ds1307Rtc.h
create mode 100644 Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.c
create mode 100644 Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.inf
diff --git a/Platform/NXP/Library/Ds1307RtcLib/Ds1307Rtc.h b/Platform/NXP/Library/Ds1307RtcLib/Ds1307Rtc.h
new file mode 100644
index 0000000..952933f
--- /dev/null
+++ b/Platform/NXP/Library/Ds1307RtcLib/Ds1307Rtc.h
@@ -0,0 +1,40 @@
+/** Ds1307Rtc.h
+*
+* Copyright 2017 NXP
+*
+* This program and the accompanying materials
+* are licensed and made available under the terms and conditions of the BSD License
+* which accompanies this distribution. The full text of the license may be found at
+* http://opensource.org/licenses/bsd-license.php
+*
+* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#ifndef __DS1307RTC_H__
+#define __DS1307RTC_H__
+
+#define Bin(Bcd) ((Bcd) & 0x0f) + ((Bcd) >> 4) * 10
+#define Bcd(Bin) (((Bin / 10) << 4) | (Bin % 10))
+
+/*
+ * RTC register addresses
+ */
+#define DS1307_SEC_REG_ADDR 0x00
+#define DS1307_MIN_REG_ADDR 0x01
+#define DS1307_HR_REG_ADDR 0x02
+#define DS1307_DAY_REG_ADDR 0x03
+#define DS1307_DATE_REG_ADDR 0x04
+#define DS1307_MON_REG_ADDR 0x05
+#define DS1307_YR_REG_ADDR 0x06
+#define DS1307_CTL_REG_ADDR 0x07
+
+#define DS1307_SEC_BIT_CH 0x80 /* Clock Halt (in Register 0) */
+
+#define DS1307_CTL_BIT_RS0 0x01 /* Rate select 0 */
+#define DS1307_CTL_BIT_RS1 0x02 /* Rate select 1 */
+#define DS1307_CTL_BIT_SQWE 0x10 /* Square Wave Enable */
+#define DS1307_CTL_BIT_OUT 0x80 /* Output Control */
+
+#endif // __DS1307RTC_H__
diff --git a/Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.c b/Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.c
new file mode 100644
index 0000000..5f620a3
--- /dev/null
+++ b/Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.c
@@ -0,0 +1,226 @@
+/** Ds1307RtcLib.c
+ Implement EFI RealTimeClock with runtime services via RTC Lib for DS1307 RTC.
+
+ Based on RTC implementation available in
+ EmbeddedPkg/Library/TemplateRealTimeClockLib/RealTimeClockLib.c
+
+ Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Base.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/I2c.h>
+#include <Library/RealTimeClockLib.h>
+
+#include "Ds1307Rtc.h"
+
+/**
+ Read RTC register.
+
+ @param RtcRegAddr Register offset of RTC to be read.
+
+ @retval Register Value read
+
+**/
+
+UINT8
+RtcRead (
+ IN UINT8 RtcRegAddr
+ )
+{
+ INT32 Status;
+ UINT8 Val;
+
+ Val = 0;
+ Status = I2cDataRead(PcdGet32(PcdRtcI2cBus), PcdGet32(PcdDs1307I2cAddress),
+ RtcRegAddr, 0x1, &Val, sizeof(Val));
+ if (EFI_ERROR(Status))
+ DEBUG((DEBUG_ERROR, "RTC read error at Addr:0x%x\n", RtcRegAddr));
+
+ return Val;
+}
+/**
+ Write RTC register.
+
+ @param RtcRegAddr Register offset of RTC to write.
+ @param Val Value to be written
+
+**/
+
+VOID
+RtcWrite(
+ IN UINT8 RtcRegAddr,
+ IN UINT8 Val
+ )
+{
+ EFI_STATUS Status;
+
+ Status = I2cDataWrite(PcdGet32(PcdRtcI2cBus), PcdGet32(PcdDs1307I2cAddress),
+ RtcRegAddr, 0x1, &Val, sizeof(Val));
+ if (EFI_ERROR(Status))
+ DEBUG((DEBUG_ERROR, "RTC write error at Addr:0x%x\n", RtcRegAddr));
+}
+
+/**
+ Returns the current time and date information, and the time-keeping capabilities
+ of the hardware platform.
+
+ @param Time A pointer to storage to receive a snapshot of the current time.
+ @param Capabilities An optional pointer to a buffer to receive the real time clock
+ device's capabilities.
+
+ @retval EFI_SUCCESS The operation completed successfully.
+ @retval EFI_INVALID_PARAMETER Time is NULL.
+ @retval EFI_DEVICE_ERROR The time could not be retrieved due to hardware error.
+
+**/
+
+EFI_STATUS
+EFIAPI
+LibGetTime (
+ OUT EFI_TIME *Time,
+ OUT EFI_TIME_CAPABILITIES *Capabilities
+ )
+{
+ EFI_STATUS Status;
+ UINT8 Second;
+ UINT8 Minute;
+ UINT8 Hour;
+ UINT8 Day;
+ UINT8 Month;
+ UINT8 Year;
+
+ Status = EFI_SUCCESS;
+
+ Second = RtcRead (DS1307_SEC_REG_ADDR);
+ Minute = RtcRead (DS1307_MIN_REG_ADDR);
+ Hour = RtcRead (DS1307_HR_REG_ADDR);
+ Day = RtcRead (DS1307_DATE_REG_ADDR);
+ Month = RtcRead (DS1307_MON_REG_ADDR);
+ Year = RtcRead (DS1307_YR_REG_ADDR);
+
+ if (Second & DS1307_SEC_BIT_CH) {
+ DEBUG ((DEBUG_ERROR, "### Warning: RTC oscillator has stopped\n"));
+ /* clear the CH flag */
+ RtcWrite (DS1307_SEC_REG_ADDR,
+ RtcRead (DS1307_SEC_REG_ADDR) & ~DS1307_SEC_BIT_CH);
+ Status = EFI_DEVICE_ERROR;
+ }
+
+ Time->Second = Bin (Second & 0x7F);
+ Time->Minute = Bin (Minute & 0x7F);
+ Time->Hour = Bin (Hour & 0x3F);
+ Time->Day = Bin (Day & 0x3F);
+ Time->Month = Bin (Month & 0x1F);
+ Time->Year = Bin (Year) + ( Bin (Year) >= 70 ? 1900 : 2000);
+
+ return Status;
+}
+
+/**
+ Sets the current local time and date information.
+
+ @param Time A pointer to the current time.
+
+ @retval EFI_SUCCESS The operation completed successfully.
+ @retval EFI_INVALID_PARAMETER A time field is out of range.
+ @retval EFI_DEVICE_ERROR The time could not be set due due to hardware error.
+
+**/
+EFI_STATUS
+EFIAPI
+LibSetTime (
+ IN EFI_TIME *Time
+ )
+{
+ if (Time->Year < 1970 || Time->Year > 2069)
+ DEBUG((DEBUG_ERROR, "WARNING: Year should be between 1970 and 2069!\n"));
+
+ RtcWrite (DS1307_YR_REG_ADDR, Bcd (Time->Year % 100));
+ RtcWrite (DS1307_MON_REG_ADDR, Bcd (Time->Month));
+ RtcWrite (DS1307_DATE_REG_ADDR, Bcd (Time->Day));
+ RtcWrite (DS1307_HR_REG_ADDR, Bcd (Time->Hour));
+ RtcWrite (DS1307_MIN_REG_ADDR, Bcd (Time->Minute));
+ RtcWrite (DS1307_SEC_REG_ADDR, Bcd (Time->Second));
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Returns the current wakeup alarm clock setting.
+
+ @param Enabled Indicates if the alarm is currently enabled or disabled.
+ @param Pending Indicates if the alarm signal is pending and requires acknowledgement.
+ @param Time The current alarm setting.
+
+ @retval EFI_SUCCESS The alarm settings were returned.
+ @retval EFI_INVALID_PARAMETER Any parameter is NULL.
+ @retval EFI_DEVICE_ERROR The wakeup time could not be retrieved due to a hardware error.
+
+**/
+EFI_STATUS
+EFIAPI
+LibGetWakeupTime (
+ OUT BOOLEAN *Enabled,
+ OUT BOOLEAN *Pending,
+ OUT EFI_TIME *Time
+ )
+{
+ // Not a required feature
+ return EFI_UNSUPPORTED;
+}
+
+/**
+ Sets the system wakeup alarm clock time.
+
+ @param Enabled Enable or disable the wakeup alarm.
+ @param Time If Enable is TRUE, the time to set the wakeup alarm for.
+
+ @retval EFI_SUCCESS If Enable is TRUE, then the wakeup alarm was enabled. If
+ Enable is FALSE, then the wakeup alarm was disabled.
+ @retval EFI_INVALID_PARAMETER A time field is out of range.
+ @retval EFI_DEVICE_ERROR The wakeup time could not be set due to a hardware error.
+ @retval EFI_UNSUPPORTED A wakeup timer is not supported on this platform.
+
+**/
+EFI_STATUS
+EFIAPI
+LibSetWakeupTime (
+ IN BOOLEAN Enabled,
+ OUT EFI_TIME *Time
+ )
+{
+ // Not a required feature
+ return EFI_UNSUPPORTED;
+}
+
+/**
+ This is the declaration of an EFI image entry point. This can be the entry point to an application
+ written to this specification, an EFI boot service driver, or an EFI runtime driver.
+
+ @param ImageHandle Handle that identifies the loaded image.
+ @param SystemTable System Table for this image.
+
+ @retval EFI_SUCCESS The operation completed successfully.
+
+**/
+EFI_STATUS
+EFIAPI
+LibRtcInitialize (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ return I2cBusInit(PcdGet32(PcdRtcI2cBus), PcdGet32(PcdI2cSpeed));
+}
diff --git a/Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.inf b/Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.inf
new file mode 100644
index 0000000..b068b43
--- /dev/null
+++ b/Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.inf
@@ -0,0 +1,40 @@
+# @Ds1307RtcLib.inf
+#
+# Lib to provide support for DS1307 Real Time Clock
+#
+# Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
+# Copyright (c) 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = Ds1307RtcLib
+ FILE_GUID = B661E02D-A90B-42AB-A5F9-CF841AAA43D9
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = RealTimeClockLib
+
+[Sources.common]
+ Ds1307RtcLib.c
+
+[Packages]
+ EmbeddedPkg/EmbeddedPkg.dec
+ MdePkg/MdePkg.dec
+ edk2-platforms/Platform/NXP/NxpQoriqLs.dec
+
+[LibraryClasses]
+ DebugLib
+ I2cLib
+
+[Pcd]
+ gNxpQoriqLsTokenSpaceGuid.PcdRtcI2cBus
+ gNxpQoriqLsTokenSpaceGuid.PcdI2cSpeed
+ gNxpQoriqLsTokenSpaceGuid.PcdDs1307I2cAddress
--
1.9.1
^ permalink raw reply related [flat|nested] 39+ messages in thread
* Re: [PATCH 07/10] Platform/NXP : Add support for DS1307 RTC library
2017-11-07 14:42 ` [PATCH 07/10] Platform/NXP : Add support for DS1307 RTC library Meenakshi Aggarwal
@ 2017-11-13 12:42 ` Ard Biesheuvel
2017-11-14 5:51 ` Meenakshi Aggarwal
0 siblings, 1 reply; 39+ messages in thread
From: Ard Biesheuvel @ 2017-11-13 12:42 UTC (permalink / raw)
To: Meenakshi Aggarwal
Cc: Leif Lindholm, Kinney, Michael D, edk2-devel@lists.01.org,
Udit Kumar, Varun Sethi
On 7 November 2017 at 14:42, Meenakshi Aggarwal
<meenakshi.aggarwal@nxp.com> wrote:
> Real time clock Apis on top of I2C Apis
>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> ---
> Platform/NXP/Library/Ds1307RtcLib/Ds1307Rtc.h | 40 ++++
> Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.c | 226 +++++++++++++++++++++
> Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.inf | 40 ++++
> 3 files changed, 306 insertions(+)
> create mode 100644 Platform/NXP/Library/Ds1307RtcLib/Ds1307Rtc.h
> create mode 100644 Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.c
> create mode 100644 Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.inf
>
> diff --git a/Platform/NXP/Library/Ds1307RtcLib/Ds1307Rtc.h b/Platform/NXP/Library/Ds1307RtcLib/Ds1307Rtc.h
> new file mode 100644
> index 0000000..952933f
> --- /dev/null
> +++ b/Platform/NXP/Library/Ds1307RtcLib/Ds1307Rtc.h
> @@ -0,0 +1,40 @@
> +/** Ds1307Rtc.h
> +*
> +* Copyright 2017 NXP
> +*
> +* This program and the accompanying materials
> +* are licensed and made available under the terms and conditions of the BSD License
> +* which accompanies this distribution. The full text of the license may be found at
> +* http://opensource.org/licenses/bsd-license.php
> +*
> +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +#ifndef __DS1307RTC_H__
> +#define __DS1307RTC_H__
> +
> +#define Bin(Bcd) ((Bcd) & 0x0f) + ((Bcd) >> 4) * 10
> +#define Bcd(Bin) (((Bin / 10) << 4) | (Bin % 10))
Please use BcdToDecimal8 and DecimalToBcd8 from BaseLib instead
> +
> +/*
> + * RTC register addresses
> + */
> +#define DS1307_SEC_REG_ADDR 0x00
> +#define DS1307_MIN_REG_ADDR 0x01
> +#define DS1307_HR_REG_ADDR 0x02
> +#define DS1307_DAY_REG_ADDR 0x03
> +#define DS1307_DATE_REG_ADDR 0x04
> +#define DS1307_MON_REG_ADDR 0x05
> +#define DS1307_YR_REG_ADDR 0x06
> +#define DS1307_CTL_REG_ADDR 0x07
> +
> +#define DS1307_SEC_BIT_CH 0x80 /* Clock Halt (in Register 0) */
> +
> +#define DS1307_CTL_BIT_RS0 0x01 /* Rate select 0 */
> +#define DS1307_CTL_BIT_RS1 0x02 /* Rate select 1 */
> +#define DS1307_CTL_BIT_SQWE 0x10 /* Square Wave Enable */
> +#define DS1307_CTL_BIT_OUT 0x80 /* Output Control */
> +
> +#endif // __DS1307RTC_H__
> diff --git a/Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.c b/Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.c
> new file mode 100644
> index 0000000..5f620a3
> --- /dev/null
> +++ b/Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.c
> @@ -0,0 +1,226 @@
> +/** Ds1307RtcLib.c
> + Implement EFI RealTimeClock with runtime services via RTC Lib for DS1307 RTC.
> +
> + Based on RTC implementation available in
> + EmbeddedPkg/Library/TemplateRealTimeClockLib/RealTimeClockLib.c
> +
> + Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
> + Copyright 2017 NXP
> +
> + This program and the accompanying materials
> + are licensed and made available under the terms and conditions of the BSD License
> + which accompanies this distribution. The full text of the license may be found at
> + http://opensource.org/licenses/bsd-license.php
> +
> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#include <Base.h>
> +#include <Library/BaseLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/I2c.h>
In general, please try to use the PI protocols for I2C instead of
rolling your own. This will allow this driver to be shared between
platforms.
> +#include <Library/RealTimeClockLib.h>
> +
> +#include "Ds1307Rtc.h"
> +
> +/**
> + Read RTC register.
> +
> + @param RtcRegAddr Register offset of RTC to be read.
> +
> + @retval Register Value read
> +
> +**/
> +
> +UINT8
> +RtcRead (
> + IN UINT8 RtcRegAddr
> + )
> +{
> + INT32 Status;
> + UINT8 Val;
> +
> + Val = 0;
> + Status = I2cDataRead(PcdGet32(PcdRtcI2cBus), PcdGet32(PcdDs1307I2cAddress),
> + RtcRegAddr, 0x1, &Val, sizeof(Val));
> + if (EFI_ERROR(Status))
> + DEBUG((DEBUG_ERROR, "RTC read error at Addr:0x%x\n", RtcRegAddr));
> +
Always use { } after if, and add space before (
> + return Val;
> +}
> +/**
> + Write RTC register.
> +
> + @param RtcRegAddr Register offset of RTC to write.
> + @param Val Value to be written
> +
> +**/
> +
> +VOID
> +RtcWrite(
> + IN UINT8 RtcRegAddr,
> + IN UINT8 Val
> + )
> +{
> + EFI_STATUS Status;
> +
> + Status = I2cDataWrite(PcdGet32(PcdRtcI2cBus), PcdGet32(PcdDs1307I2cAddress),
> + RtcRegAddr, 0x1, &Val, sizeof(Val));
> + if (EFI_ERROR(Status))
> + DEBUG((DEBUG_ERROR, "RTC write error at Addr:0x%x\n", RtcRegAddr));
same here
> +}
> +
> +/**
> + Returns the current time and date information, and the time-keeping capabilities
> + of the hardware platform.
> +
> + @param Time A pointer to storage to receive a snapshot of the current time.
> + @param Capabilities An optional pointer to a buffer to receive the real time clock
> + device's capabilities.
> +
> + @retval EFI_SUCCESS The operation completed successfully.
> + @retval EFI_INVALID_PARAMETER Time is NULL.
> + @retval EFI_DEVICE_ERROR The time could not be retrieved due to hardware error.
> +
> +**/
> +
> +EFI_STATUS
> +EFIAPI
> +LibGetTime (
> + OUT EFI_TIME *Time,
> + OUT EFI_TIME_CAPABILITIES *Capabilities
> + )
> +{
> + EFI_STATUS Status;
> + UINT8 Second;
> + UINT8 Minute;
> + UINT8 Hour;
> + UINT8 Day;
> + UINT8 Month;
> + UINT8 Year;
> +
> + Status = EFI_SUCCESS;
> +
> + Second = RtcRead (DS1307_SEC_REG_ADDR);
> + Minute = RtcRead (DS1307_MIN_REG_ADDR);
> + Hour = RtcRead (DS1307_HR_REG_ADDR);
> + Day = RtcRead (DS1307_DATE_REG_ADDR);
> + Month = RtcRead (DS1307_MON_REG_ADDR);
> + Year = RtcRead (DS1307_YR_REG_ADDR);
> +
Is it safe to read the RTC using separate I2C transactions? What
happens if there is a carry between any of those registers?
> + if (Second & DS1307_SEC_BIT_CH) {
> + DEBUG ((DEBUG_ERROR, "### Warning: RTC oscillator has stopped\n"));
> + /* clear the CH flag */
> + RtcWrite (DS1307_SEC_REG_ADDR,
> + RtcRead (DS1307_SEC_REG_ADDR) & ~DS1307_SEC_BIT_CH);
> + Status = EFI_DEVICE_ERROR;
> + }
> +
> + Time->Second = Bin (Second & 0x7F);
> + Time->Minute = Bin (Minute & 0x7F);
> + Time->Hour = Bin (Hour & 0x3F);
> + Time->Day = Bin (Day & 0x3F);
> + Time->Month = Bin (Month & 0x1F);
> + Time->Year = Bin (Year) + ( Bin (Year) >= 70 ? 1900 : 2000);
> +
Please use symbolic constants and some comments to clarify how the
2-digit year counter maps onto a real year.
> + return Status;
> +}
> +
> +/**
> + Sets the current local time and date information.
> +
> + @param Time A pointer to the current time.
> +
> + @retval EFI_SUCCESS The operation completed successfully.
> + @retval EFI_INVALID_PARAMETER A time field is out of range.
> + @retval EFI_DEVICE_ERROR The time could not be set due due to hardware error.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +LibSetTime (
> + IN EFI_TIME *Time
> + )
> +{
> + if (Time->Year < 1970 || Time->Year > 2069)
> + DEBUG((DEBUG_ERROR, "WARNING: Year should be between 1970 and 2069!\n"));
> +
Missing { }
> + RtcWrite (DS1307_YR_REG_ADDR, Bcd (Time->Year % 100));
> + RtcWrite (DS1307_MON_REG_ADDR, Bcd (Time->Month));
> + RtcWrite (DS1307_DATE_REG_ADDR, Bcd (Time->Day));
> + RtcWrite (DS1307_HR_REG_ADDR, Bcd (Time->Hour));
> + RtcWrite (DS1307_MIN_REG_ADDR, Bcd (Time->Minute));
> + RtcWrite (DS1307_SEC_REG_ADDR, Bcd (Time->Second));
> +
Can you use a single bus transaction here?
> + return EFI_SUCCESS;
> +}
> +
> +/**
> + Returns the current wakeup alarm clock setting.
> +
> + @param Enabled Indicates if the alarm is currently enabled or disabled.
> + @param Pending Indicates if the alarm signal is pending and requires acknowledgement.
> + @param Time The current alarm setting.
> +
> + @retval EFI_SUCCESS The alarm settings were returned.
> + @retval EFI_INVALID_PARAMETER Any parameter is NULL.
> + @retval EFI_DEVICE_ERROR The wakeup time could not be retrieved due to a hardware error.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +LibGetWakeupTime (
> + OUT BOOLEAN *Enabled,
> + OUT BOOLEAN *Pending,
> + OUT EFI_TIME *Time
> + )
> +{
> + // Not a required feature
... but does the IP support it?
> + return EFI_UNSUPPORTED;
> +}
> +
> +/**
> + Sets the system wakeup alarm clock time.
> +
> + @param Enabled Enable or disable the wakeup alarm.
> + @param Time If Enable is TRUE, the time to set the wakeup alarm for.
> +
> + @retval EFI_SUCCESS If Enable is TRUE, then the wakeup alarm was enabled. If
> + Enable is FALSE, then the wakeup alarm was disabled.
> + @retval EFI_INVALID_PARAMETER A time field is out of range.
> + @retval EFI_DEVICE_ERROR The wakeup time could not be set due to a hardware error.
> + @retval EFI_UNSUPPORTED A wakeup timer is not supported on this platform.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +LibSetWakeupTime (
> + IN BOOLEAN Enabled,
> + OUT EFI_TIME *Time
> + )
> +{
> + // Not a required feature
> + return EFI_UNSUPPORTED;
> +}
> +
> +/**
> + This is the declaration of an EFI image entry point. This can be the entry point to an application
> + written to this specification, an EFI boot service driver, or an EFI runtime driver.
> +
> + @param ImageHandle Handle that identifies the loaded image.
> + @param SystemTable System Table for this image.
> +
> + @retval EFI_SUCCESS The operation completed successfully.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +LibRtcInitialize (
> + IN EFI_HANDLE ImageHandle,
> + IN EFI_SYSTEM_TABLE *SystemTable
> + )
> +{
> + return I2cBusInit(PcdGet32(PcdRtcI2cBus), PcdGet32(PcdI2cSpeed));
> +}
> diff --git a/Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.inf b/Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.inf
> new file mode 100644
> index 0000000..b068b43
> --- /dev/null
> +++ b/Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.inf
> @@ -0,0 +1,40 @@
> +# @Ds1307RtcLib.inf
> +#
> +# Lib to provide support for DS1307 Real Time Clock
> +#
> +# Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
> +# Copyright (c) 2017 NXP
> +#
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD License
> +# which accompanies this distribution. The full text of the license may be found at
> +# http://opensource.org/licenses/bsd-license.php
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +#
> +#
> +
> +[Defines]
> + INF_VERSION = 0x00010005
0x0001001A
> + BASE_NAME = Ds1307RtcLib
> + FILE_GUID = B661E02D-A90B-42AB-A5F9-CF841AAA43D9
Please don't reuse the GUID of TemplateRealTimeClockLib.inf
> + MODULE_TYPE = BASE
> + VERSION_STRING = 1.0
> + LIBRARY_CLASS = RealTimeClockLib
> +
> +[Sources.common]
> + Ds1307RtcLib.c
> +
> +[Packages]
> + EmbeddedPkg/EmbeddedPkg.dec
> + MdePkg/MdePkg.dec
> + edk2-platforms/Platform/NXP/NxpQoriqLs.dec
> +
> +[LibraryClasses]
> + DebugLib
> + I2cLib
> +
> +[Pcd]
> + gNxpQoriqLsTokenSpaceGuid.PcdRtcI2cBus
> + gNxpQoriqLsTokenSpaceGuid.PcdI2cSpeed
> + gNxpQoriqLsTokenSpaceGuid.PcdDs1307I2cAddress
> --
> 1.9.1
>
^ permalink raw reply [flat|nested] 39+ messages in thread
* Re: [PATCH 07/10] Platform/NXP : Add support for DS1307 RTC library
2017-11-13 12:42 ` Ard Biesheuvel
@ 2017-11-14 5:51 ` Meenakshi Aggarwal
0 siblings, 0 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-14 5:51 UTC (permalink / raw)
To: Ard Biesheuvel
Cc: Leif Lindholm, Kinney, Michael D, edk2-devel@lists.01.org,
Udit Kumar, Varun Sethi
> -----Original Message-----
> From: Ard Biesheuvel [mailto:ard.biesheuvel@linaro.org]
> Sent: Monday, November 13, 2017 6:13 PM
> To: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> Cc: Leif Lindholm <leif.lindholm@linaro.org>; Kinney, Michael D
> <michael.d.kinney@intel.com>; edk2-devel@lists.01.org; Udit Kumar
> <udit.kumar@nxp.com>; Varun Sethi <V.Sethi@nxp.com>
> Subject: Re: [PATCH 07/10] Platform/NXP : Add support for DS1307 RTC
> library
>
> On 7 November 2017 at 14:42, Meenakshi Aggarwal
> <meenakshi.aggarwal@nxp.com> wrote:
> > Real time clock Apis on top of I2C Apis
> >
> > Contributed-under: TianoCore Contribution Agreement 1.1
> > Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> > ---
> > Platform/NXP/Library/Ds1307RtcLib/Ds1307Rtc.h | 40 ++++
> > Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.c | 226
> +++++++++++++++++++++
> > Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.inf | 40 ++++
> > 3 files changed, 306 insertions(+)
> > create mode 100644 Platform/NXP/Library/Ds1307RtcLib/Ds1307Rtc.h
> > create mode 100644 Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.c
> > create mode 100644 Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.inf
> >
> > diff --git a/Platform/NXP/Library/Ds1307RtcLib/Ds1307Rtc.h
> > b/Platform/NXP/Library/Ds1307RtcLib/Ds1307Rtc.h
> > new file mode 100644
> > index 0000000..952933f
> > --- /dev/null
> > +++ b/Platform/NXP/Library/Ds1307RtcLib/Ds1307Rtc.h
> > @@ -0,0 +1,40 @@
> > +/** Ds1307Rtc.h
> > +*
> > +* Copyright 2017 NXP
> > +*
> > +* This program and the accompanying materials
> > +* are licensed and made available under the terms and conditions of
> > +the BSD License
> > +* which accompanies this distribution. The full text of the license
> > +may be found at
> > +*
> >
> +https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> e
> > +nsource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.agg
> >
> +arwal%40nxp.com%7Caa920efb2ccb4db769b908d52a940c38%7C686ea1d3bc
> 2b4c6f
> >
> +a92cd99c5c301635%7C0%7C0%7C636461737713319807&sdata=VpAhiubKgpc
> F6DxWQ
> > +Rtbt602oqXGCTsdKdmijMVJt2U%3D&reserved=0
> > +*
> > +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > +BASIS,
> > +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> > +*
> > +**/
> > +
> > +#ifndef __DS1307RTC_H__
> > +#define __DS1307RTC_H__
> > +
> > +#define Bin(Bcd) ((Bcd) & 0x0f) + ((Bcd) >> 4) * 10 #define Bcd(Bin)
> > +(((Bin / 10) << 4) | (Bin % 10))
>
> Please use BcdToDecimal8 and DecimalToBcd8 from BaseLib instead
>
OK
> > +
> > +/*
> > + * RTC register addresses
> > + */
> > +#define DS1307_SEC_REG_ADDR 0x00
> > +#define DS1307_MIN_REG_ADDR 0x01
> > +#define DS1307_HR_REG_ADDR 0x02
> > +#define DS1307_DAY_REG_ADDR 0x03
> > +#define DS1307_DATE_REG_ADDR 0x04
> > +#define DS1307_MON_REG_ADDR 0x05
> > +#define DS1307_YR_REG_ADDR 0x06
> > +#define DS1307_CTL_REG_ADDR 0x07
> > +
> > +#define DS1307_SEC_BIT_CH 0x80 /* Clock Halt (in Register 0) */
> > +
> > +#define DS1307_CTL_BIT_RS0 0x01 /* Rate select 0 */
> > +#define DS1307_CTL_BIT_RS1 0x02 /* Rate select 1 */
> > +#define DS1307_CTL_BIT_SQWE 0x10 /* Square Wave Enable */
> > +#define DS1307_CTL_BIT_OUT 0x80 /* Output Control */
> > +
> > +#endif // __DS1307RTC_H__
> > diff --git a/Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.c
> > b/Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.c
> > new file mode 100644
> > index 0000000..5f620a3
> > --- /dev/null
> > +++ b/Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.c
> > @@ -0,0 +1,226 @@
> > +/** Ds1307RtcLib.c
> > + Implement EFI RealTimeClock with runtime services via RTC Lib for
> DS1307 RTC.
> > +
> > + Based on RTC implementation available in
> > + EmbeddedPkg/Library/TemplateRealTimeClockLib/RealTimeClockLib.c
> > +
> > + Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
> > + Copyright 2017 NXP
> > +
> > + This program and the accompanying materials are licensed and made
> > + available under the terms and conditions of the BSD License which
> > + accompanies this distribution. The full text of the license may be
> > + found at
> > +
> > +
> https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> > + ensource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.a
> > +
> ggarwal%40nxp.com%7Caa920efb2ccb4db769b908d52a940c38%7C686ea1d3b
> c2b4
> > +
> c6fa92cd99c5c301635%7C0%7C0%7C636461737713319807&sdata=VpAhiubKg
> pcF6
> > + DxWQRtbt602oqXGCTsdKdmijMVJt2U%3D&reserved=0
> > +
> > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > + BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +
> > +**/
> > +
> > +#include <Base.h>
> > +#include <Library/BaseLib.h>
> > +#include <Library/DebugLib.h>
> > +#include <Library/I2c.h>
>
> In general, please try to use the PI protocols for I2C instead of rolling your
> own. This will allow this driver to be shared between platforms.
>
> OK, will rework
> > +#include <Library/RealTimeClockLib.h>
> > +
> > +#include "Ds1307Rtc.h"
> > +
> > +/**
> > + Read RTC register.
> > +
> > + @param RtcRegAddr Register offset of RTC to be read.
> > +
> > + @retval Register Value read
> > +
> > +**/
> > +
> > +UINT8
> > +RtcRead (
> > + IN UINT8 RtcRegAddr
> > + )
> > +{
> > + INT32 Status;
> > + UINT8 Val;
> > +
> > + Val = 0;
> > + Status = I2cDataRead(PcdGet32(PcdRtcI2cBus),
> PcdGet32(PcdDs1307I2cAddress),
> > + RtcRegAddr, 0x1, &Val, sizeof(Val)); if
> > + (EFI_ERROR(Status))
> > + DEBUG((DEBUG_ERROR, "RTC read error at Addr:0x%x\n",
> > + RtcRegAddr));
> > +
>
> Always use { } after if, and add space before (
>
sure
> > + return Val;
> > +}
> > +/**
> > + Write RTC register.
> > +
> > + @param RtcRegAddr Register offset of RTC to write.
> > + @param Val Value to be written
> > +
> > +**/
> > +
> > +VOID
> > +RtcWrite(
> > + IN UINT8 RtcRegAddr,
> > + IN UINT8 Val
> > + )
> > +{
> > + EFI_STATUS Status;
> > +
> > + Status = I2cDataWrite(PcdGet32(PcdRtcI2cBus),
> PcdGet32(PcdDs1307I2cAddress),
> > + RtcRegAddr, 0x1, &Val, sizeof(Val)); if
> > + (EFI_ERROR(Status))
> > + DEBUG((DEBUG_ERROR, "RTC write error at Addr:0x%x\n",
> > + RtcRegAddr));
>
> same here
>
>
> > +}
> > +
> > +/**
> > + Returns the current time and date information, and the time-keeping
> > +capabilities
> > + of the hardware platform.
> > +
> > + @param Time A pointer to storage to receive a snapshot of the
> current time.
> > + @param Capabilities An optional pointer to a buffer to receive the
> real time clock
> > + device's capabilities.
> > +
> > + @retval EFI_SUCCESS The operation completed successfully.
> > + @retval EFI_INVALID_PARAMETER Time is NULL.
> > + @retval EFI_DEVICE_ERROR The time could not be retrieved due to
> hardware error.
> > +
> > +**/
> > +
> > +EFI_STATUS
> > +EFIAPI
> > +LibGetTime (
> > + OUT EFI_TIME *Time,
> > + OUT EFI_TIME_CAPABILITIES *Capabilities
> > + )
> > +{
> > + EFI_STATUS Status;
> > + UINT8 Second;
> > + UINT8 Minute;
> > + UINT8 Hour;
> > + UINT8 Day;
> > + UINT8 Month;
> > + UINT8 Year;
> > +
> > + Status = EFI_SUCCESS;
> > +
> > + Second = RtcRead (DS1307_SEC_REG_ADDR); Minute = RtcRead
> > + (DS1307_MIN_REG_ADDR); Hour = RtcRead (DS1307_HR_REG_ADDR);
> Day =
> > + RtcRead (DS1307_DATE_REG_ADDR); Month = RtcRead
> > + (DS1307_MON_REG_ADDR); Year = RtcRead (DS1307_YR_REG_ADDR);
> > +
>
> Is it safe to read the RTC using separate I2C transactions? What happens if
> there is a carry between any of those registers?
>
DS1307 allows reading RTC registers separately.
We will see if any optimization is possible and specification allows.
> > + if (Second & DS1307_SEC_BIT_CH) {
> > + DEBUG ((DEBUG_ERROR, "### Warning: RTC oscillator has
> stopped\n"));
> > + /* clear the CH flag */
> > + RtcWrite (DS1307_SEC_REG_ADDR,
> > + RtcRead (DS1307_SEC_REG_ADDR) & ~DS1307_SEC_BIT_CH);
> > + Status = EFI_DEVICE_ERROR;
> > + }
> > +
> > + Time->Second = Bin (Second & 0x7F); Time->Minute = Bin (Minute &
> > + 0x7F); Time->Hour = Bin (Hour & 0x3F); Time->Day = Bin (Day &
> > + 0x3F); Time->Month = Bin (Month & 0x1F); Time->Year = Bin (Year)
> > + + ( Bin (Year) >= 70 ? 1900 : 2000);
> > +
>
> Please use symbolic constants and some comments to clarify how the 2-digit
> year counter maps onto a real year.
>
OK
> > + return Status;
> > +}
> > +
> > +/**
> > + Sets the current local time and date information.
> > +
> > + @param Time A pointer to the current time.
> > +
> > + @retval EFI_SUCCESS The operation completed successfully.
> > + @retval EFI_INVALID_PARAMETER A time field is out of range.
> > + @retval EFI_DEVICE_ERROR The time could not be set due due to
> hardware error.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +LibSetTime (
> > + IN EFI_TIME *Time
> > + )
> > +{
> > + if (Time->Year < 1970 || Time->Year > 2069)
> > + DEBUG((DEBUG_ERROR, "WARNING: Year should be between 1970 and
> > +2069!\n"));
> > +
>
> Missing { }
>
OK
> > + RtcWrite (DS1307_YR_REG_ADDR, Bcd (Time->Year % 100)); RtcWrite
> > + (DS1307_MON_REG_ADDR, Bcd (Time->Month)); RtcWrite
> > + (DS1307_DATE_REG_ADDR, Bcd (Time->Day)); RtcWrite
> > + (DS1307_HR_REG_ADDR, Bcd (Time->Hour)); RtcWrite
> > + (DS1307_MIN_REG_ADDR, Bcd (Time->Minute)); RtcWrite
> > + (DS1307_SEC_REG_ADDR, Bcd (Time->Second));
> > +
>
> Can you use a single bus transaction here?
>
We can try.
> > + return EFI_SUCCESS;
> > +}
> > +
> > +/**
> > + Returns the current wakeup alarm clock setting.
> > +
> > + @param Enabled Indicates if the alarm is currently enabled or
> disabled.
> > + @param Pending Indicates if the alarm signal is pending and
> requires acknowledgement.
> > + @param Time The current alarm setting.
> > +
> > + @retval EFI_SUCCESS The alarm settings were returned.
> > + @retval EFI_INVALID_PARAMETER Any parameter is NULL.
> > + @retval EFI_DEVICE_ERROR The wakeup time could not be retrieved
> due to a hardware error.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +LibGetWakeupTime (
> > + OUT BOOLEAN *Enabled,
> > + OUT BOOLEAN *Pending,
> > + OUT EFI_TIME *Time
> > + )
> > +{
> > + // Not a required feature
>
> ... but does the IP support it?
> I don’t think DS1307 supports alarm
> > + return EFI_UNSUPPORTED;
> > +}
> > +
> > +/**
> > + Sets the system wakeup alarm clock time.
> > +
> > + @param Enabled Enable or disable the wakeup alarm.
> > + @param Time If Enable is TRUE, the time to set the wakeup
> alarm for.
> > +
> > + @retval EFI_SUCCESS If Enable is TRUE, then the wakeup alarm was
> enabled. If
> > + Enable is FALSE, then the wakeup alarm was disabled.
> > + @retval EFI_INVALID_PARAMETER A time field is out of range.
> > + @retval EFI_DEVICE_ERROR The wakeup time could not be set due to
> a hardware error.
> > + @retval EFI_UNSUPPORTED A wakeup timer is not supported on this
> platform.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +LibSetWakeupTime (
> > + IN BOOLEAN Enabled,
> > + OUT EFI_TIME *Time
> > + )
> > +{
> > + // Not a required feature
> > + return EFI_UNSUPPORTED;
> > +}
> > +
> > +/**
> > + This is the declaration of an EFI image entry point. This can be
> > +the entry point to an application
> > + written to this specification, an EFI boot service driver, or an EFI runtime
> driver.
> > +
> > + @param ImageHandle Handle that identifies the loaded image.
> > + @param SystemTable System Table for this image.
> > +
> > + @retval EFI_SUCCESS The operation completed successfully.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +LibRtcInitialize (
> > + IN EFI_HANDLE ImageHandle,
> > + IN EFI_SYSTEM_TABLE *SystemTable
> > + )
> > +{
> > + return I2cBusInit(PcdGet32(PcdRtcI2cBus), PcdGet32(PcdI2cSpeed)); }
> > diff --git a/Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.inf
> > b/Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.inf
> > new file mode 100644
> > index 0000000..b068b43
> > --- /dev/null
> > +++ b/Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.inf
> > @@ -0,0 +1,40 @@
> > +# @Ds1307RtcLib.inf
> > +#
> > +# Lib to provide support for DS1307 Real Time Clock # # Copyright
> > +(c) 2016, Freescale Semiconductor, Inc. All rights reserved.
> > +# Copyright (c) 2017 NXP
> > +#
> > +# This program and the accompanying materials # are licensed and
> > +made available under the terms and conditions of the BSD License #
> > +which accompanies this distribution. The full text of the license may
> > +be found at #
> >
> +https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> e
> > +nsource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.agg
> >
> +arwal%40nxp.com%7Caa920efb2ccb4db769b908d52a940c38%7C686ea1d3bc
> 2b4c6f
> >
> +a92cd99c5c301635%7C0%7C0%7C636461737713319807&sdata=VpAhiubKgpc
> F6DxWQ
> > +Rtbt602oqXGCTsdKdmijMVJt2U%3D&reserved=0
> > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > +BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +#
> > +#
> > +
> > +[Defines]
> > + INF_VERSION = 0x00010005
>
> 0x0001001A
>
OK
> > + BASE_NAME = Ds1307RtcLib
> > + FILE_GUID = B661E02D-A90B-42AB-A5F9-CF841AAA43D9
>
> Please don't reuse the GUID of TemplateRealTimeClockLib.inf
>
OK
> > + MODULE_TYPE = BASE
> > + VERSION_STRING = 1.0
> > + LIBRARY_CLASS = RealTimeClockLib
> > +
> > +[Sources.common]
> > + Ds1307RtcLib.c
> > +
> > +[Packages]
> > + EmbeddedPkg/EmbeddedPkg.dec
> > + MdePkg/MdePkg.dec
> > + edk2-platforms/Platform/NXP/NxpQoriqLs.dec
> > +
> > +[LibraryClasses]
> > + DebugLib
> > + I2cLib
> > +
> > +[Pcd]
> > + gNxpQoriqLsTokenSpaceGuid.PcdRtcI2cBus
> > + gNxpQoriqLsTokenSpaceGuid.PcdI2cSpeed
> > + gNxpQoriqLsTokenSpaceGuid.PcdDs1307I2cAddress
> > --
> > 1.9.1
> >
^ permalink raw reply [flat|nested] 39+ messages in thread
* [PATCH 08/10] Platform/NXP: Add support for ArmPlatformLib
2017-11-07 14:42 [PATCH 00/10] edk2-platforms/Platform/NXP Meenakshi Aggarwal
` (6 preceding siblings ...)
2017-11-07 14:42 ` [PATCH 07/10] Platform/NXP : Add support for DS1307 RTC library Meenakshi Aggarwal
@ 2017-11-07 14:42 ` Meenakshi Aggarwal
2017-11-07 14:42 ` [PATCH 09/10] SocLib : Add support for initialization of peripherals Meenakshi Aggarwal
` (2 subsequent siblings)
10 siblings, 0 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-07 14:42 UTC (permalink / raw)
To: ard.biesheuvel, leif.lindholm, michael.d.kinney, edk2-devel
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
---
.../Library/PlatformLib/ArmPlatformLib.c | 105 ++++++++++++
.../Library/PlatformLib/ArmPlatformLib.inf | 70 ++++++++
.../Library/PlatformLib/NxpQoriqLsHelper.S | 38 +++++
.../Library/PlatformLib/NxpQoriqLsMem.c | 184 +++++++++++++++++++++
4 files changed, 397 insertions(+)
create mode 100644 Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/ArmPlatformLib.c
create mode 100644 Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/ArmPlatformLib.inf
create mode 100644 Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/NxpQoriqLsHelper.S
create mode 100644 Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/NxpQoriqLsMem.c
diff --git a/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/ArmPlatformLib.c b/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/ArmPlatformLib.c
new file mode 100644
index 0000000..21deb41
--- /dev/null
+++ b/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/ArmPlatformLib.c
@@ -0,0 +1,105 @@
+/** ArmPlatformLib.c
+*
+* Contains board initialization functions.
+*
+* Based on BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoard.c
+*
+* Copyright (c) 2011-2012, ARM Limited. All rights reserved.
+* Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
+* Copyright 2017 NXP
+*
+* This program and the accompanying materials
+* are licensed and made available under the terms and conditions of the BSD License
+* which accompanies this distribution. The full text of the license may be found at
+* http://opensource.org/licenses/bsd-license.php
+*
+* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#include <Library/ArmPlatformLib.h>
+#include <Ppi/ArmMpCoreInfo.h>
+
+extern VOID SocInit(VOID);
+
+/**
+ Return the current Boot Mode
+
+ This function returns the boot reason on the platform
+
+**/
+EFI_BOOT_MODE
+ArmPlatformGetBootMode (
+ VOID
+ )
+{
+ return BOOT_WITH_FULL_CONFIGURATION;
+}
+
+/**
+ Placeholder for Platform Initialization
+**/
+EFI_STATUS
+ArmPlatformInitialize (
+ IN UINTN MpId
+ )
+{
+ SocInit();
+
+ return EFI_SUCCESS;
+}
+
+ARM_CORE_INFO LS1043aMpCoreInfoCTA53x4[] = {
+ {
+ // Cluster 0, Core 0
+ 0x0, 0x0,
+
+ // MP Core MailBox Set/Get/Clear Addresses and Clear Value
+ (EFI_PHYSICAL_ADDRESS)0,
+ (EFI_PHYSICAL_ADDRESS)0,
+ (EFI_PHYSICAL_ADDRESS)0,
+ (UINT64)0xFFFFFFFF
+ },
+};
+
+EFI_STATUS
+PrePeiCoreGetMpCoreInfo (
+ OUT UINTN *CoreCount,
+ OUT ARM_CORE_INFO **ArmCoreTable
+ )
+{
+ *CoreCount = sizeof(LS1043aMpCoreInfoCTA53x4) / sizeof(ARM_CORE_INFO);
+ *ArmCoreTable = LS1043aMpCoreInfoCTA53x4;
+
+ return EFI_SUCCESS;
+}
+
+ARM_MP_CORE_INFO_PPI mMpCoreInfoPpi = { PrePeiCoreGetMpCoreInfo };
+
+EFI_PEI_PPI_DESCRIPTOR gPlatformPpiTable[] = {
+ {
+ EFI_PEI_PPI_DESCRIPTOR_PPI,
+ &gArmMpCoreInfoPpiGuid,
+ &mMpCoreInfoPpi
+ }
+};
+
+VOID
+ArmPlatformGetPlatformPpiList (
+ OUT UINTN *PpiListSize,
+ OUT EFI_PEI_PPI_DESCRIPTOR **PpiList
+ )
+{
+ *PpiListSize = sizeof(gPlatformPpiTable);
+ *PpiList = gPlatformPpiTable;
+}
+
+
+UINTN
+ArmPlatformGetCorePosition (
+ IN UINTN MpId
+ )
+{
+ return 1;
+}
diff --git a/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/ArmPlatformLib.inf b/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/ArmPlatformLib.inf
new file mode 100644
index 0000000..43956f7
--- /dev/null
+++ b/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/ArmPlatformLib.inf
@@ -0,0 +1,70 @@
+# @file
+#
+# Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = PlatformLib
+ FILE_GUID = 736343a0-1d96-11e0-aaaa-0002a5d5c51b
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = ArmPlatformLib
+
+[Packages]
+ ArmPkg/ArmPkg.dec
+ ArmPlatformPkg/ArmPlatformPkg.dec
+ EmbeddedPkg/EmbeddedPkg.dec
+ MdePkg/MdePkg.dec
+ edk2-platforms/Platform/NXP/NxpQoriqLs.dec
+
+[LibraryClasses]
+ ArmLib
+ SocLib
+
+[Sources.common]
+ NxpQoriqLsHelper.S | GCC
+ NxpQoriqLsMem.c
+ ArmPlatformLib.c
+
+[Ppis]
+ gArmMpCoreInfoPpiGuid
+
+[FeaturePcd]
+ gEmbeddedTokenSpaceGuid.PcdCacheEnable
+
+[FixedPcd]
+ gArmTokenSpaceGuid.PcdArmPrimaryCore
+ gNxpQoriqLsTokenSpaceGuid.PcdCcsrBaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdCcsrSize
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion1BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion1Size
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion2BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion2Size
+ gNxpQoriqLsTokenSpaceGuid.PcdQmanSwpBaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdQmanSwpSize
+ gNxpQoriqLsTokenSpaceGuid.PcdBmanSwpBaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdBmanSwpSize
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp1BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp1BaseSize
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp2BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp2BaseSize
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp3BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp3BaseSize
+ gNxpQoriqLsTokenSpaceGuid.PcdDram1BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdDram1Size
+ gNxpQoriqLsTokenSpaceGuid.PcdDram2BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdDram2Size
+ gNxpQoriqLsTokenSpaceGuid.PcdDram3BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdDram3Size
+ gNxpQoriqLsTokenSpaceGuid.PcdQspiRegionBaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdQspiRegionSize
diff --git a/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/NxpQoriqLsHelper.S b/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/NxpQoriqLsHelper.S
new file mode 100644
index 0000000..205c0d8
--- /dev/null
+++ b/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/NxpQoriqLsHelper.S
@@ -0,0 +1,38 @@
+# @file
+#
+# Copyright (c) 2012-2013, ARM Limited. All rights reserved.
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+#include <AsmMacroIoLibV8.h>
+#include <AutoGen.h>
+
+.text
+.align 2
+
+GCC_ASM_IMPORT(ArmReadMpidr)
+
+ASM_FUNC(ArmPlatformIsPrimaryCore)
+ tst x0, #3
+ cset x0, eq
+ ret
+
+ASM_FUNC(ArmPlatformPeiBootAction)
+EL1_OR_EL2(x0)
+1:
+2:
+ ret
+
+ASM_FUNC(ArmPlatformGetPrimaryCoreMpId)
+ MOV32 (x0, FixedPcdGet32(PcdArmPrimaryCore))
+ ldrh w0, [x0]
+ ret
diff --git a/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/NxpQoriqLsMem.c b/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/NxpQoriqLsMem.c
new file mode 100644
index 0000000..4b4f558
--- /dev/null
+++ b/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/NxpQoriqLsMem.c
@@ -0,0 +1,184 @@
+/** NxpQoriqLsMem.c
+*
+* Board memory specific Library.
+*
+* Based on BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardMem.c
+*
+* Copyright (c) 2011, ARM Limited. All rights reserved.
+* Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
+* Copyright 2017 NXP
+*
+* This program and the accompanying materials
+* are licensed and made available under the terms and conditions of the BSD License
+* which accompanies this distribution. The full text of the license may be found at
+* http://opensource.org/licenses/bsd-license.php
+*
+* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#include <Library/ArmPlatformLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PcdLib.h>
+#include <Library/MemoryAllocationLib.h>
+
+#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 25
+
+#define CCSR_BASE_ADDR FixedPcdGet64 (PcdCcsrBaseAddr)
+#define CCSR_SIZE FixedPcdGet64 (PcdCcsrSize)
+#define IFC_REGION1_BASE_ADDR FixedPcdGet64 (PcdIfcRegion1BaseAddr)
+#define IFC_REGION1_SIZE FixedPcdGet64 (PcdIfcRegion1Size)
+#define IFC_REGION2_BASE_ADDR FixedPcdGet64 (PcdIfcRegion2BaseAddr)
+#define IFC_REGION2_SIZE FixedPcdGet64 (PcdIfcRegion2Size)
+#define QMAN_SWP_BASE_ADDR FixedPcdGet64 (PcdQmanSwpBaseAddr)
+#define QMAN_SWP_SIZE FixedPcdGet64 (PcdQmanSwpSize)
+#define BMAN_SWP_BASE_ADDR FixedPcdGet64 (PcdBmanSwpBaseAddr)
+#define BMAN_SWP_SIZE FixedPcdGet64 (PcdBmanSwpSize)
+#define PCI_EXP1_BASE_ADDR FixedPcdGet64 (PcdPciExp1BaseAddr)
+#define PCI_EXP1_BASE_SIZE FixedPcdGet64 (PcdPciExp1BaseSize)
+#define PCI_EXP2_BASE_ADDR FixedPcdGet64 (PcdPciExp2BaseAddr)
+#define PCI_EXP2_BASE_SIZE FixedPcdGet64 (PcdPciExp2BaseSize)
+#define PCI_EXP3_BASE_ADDR FixedPcdGet64 (PcdPciExp3BaseAddr)
+#define PCI_EXP3_BASE_SIZE FixedPcdGet64 (PcdPciExp3BaseSize)
+#define DRAM1_BASE_ADDR FixedPcdGet64 (PcdDram1BaseAddr)
+#define DRAM1_SIZE FixedPcdGet64 (PcdDram1Size)
+#define DRAM2_BASE_ADDR FixedPcdGet64 (PcdDram2BaseAddr)
+#define DRAM2_SIZE FixedPcdGet64 (PcdDram2Size)
+#define DRAM3_BASE_ADDR FixedPcdGet64 (PcdDram3BaseAddr)
+#define DRAM3_SIZE FixedPcdGet64 (PcdDram3Size)
+#define QSPI_REGION_BASE_ADDR FixedPcdGet64 (PcdQspiRegionBaseAddr)
+#define QSPI_REGION_SIZE FixedPcdGet64 (PcdQspiRegionSize)
+
+/**
+ Return the Virtual Memory Map of your platform
+
+ This Virtual Memory Map is used by MemoryInitPei Module to initialize the MMU on your platform.
+
+ @param VirtualMemoryMap : Array of ARM_MEMORY_REGION_DESCRIPTOR describing a Physical-to-
+ Virtual Memory mapping. This array must be ended by a zero-filled
+ entry
+
+**/
+
+VOID
+ArmPlatformGetVirtualMemoryMap (
+ IN ARM_MEMORY_REGION_DESCRIPTOR** VirtualMemoryMap
+ )
+{
+ ARM_MEMORY_REGION_ATTRIBUTES CacheAttributes;
+ UINTN Index;
+ ARM_MEMORY_REGION_DESCRIPTOR *VirtualMemoryTable;
+
+ Index = 0;
+
+ ASSERT(VirtualMemoryMap != NULL);
+
+ VirtualMemoryTable = (ARM_MEMORY_REGION_DESCRIPTOR*)AllocatePages(
+ EFI_SIZE_TO_PAGES (sizeof(ARM_MEMORY_REGION_DESCRIPTOR) * MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS));
+
+ if (VirtualMemoryTable == NULL) {
+ return;
+ }
+
+ if (FeaturePcdGet(PcdCacheEnable) == TRUE) {
+ CacheAttributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK;
+ } else {
+ CacheAttributes = ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED;
+ }
+
+ // DRAM1 (Must be 1st entry)
+ VirtualMemoryTable[Index].PhysicalBase = DRAM1_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = DRAM1_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = DRAM1_SIZE;
+ VirtualMemoryTable[Index].Attributes = CacheAttributes;
+
+ // CCSR Space
+ VirtualMemoryTable[++Index].PhysicalBase = CCSR_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = CCSR_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = CCSR_SIZE;
+ VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
+
+ // IFC region 1
+ //
+ // A-009241 : Unaligned write transactions to IFC may result in corruption of data
+ // Affects : IFC
+ // Description: 16 byte unaligned write from system bus to IFC may result in extra unintended
+ // writes on external IFC interface that can corrupt data on external flash.
+ // Impact : Data corruption on external flash may happen in case of unaligned writes to
+ // IFC memory space.
+ // Workaround: Following are the workarounds:
+ // For write transactions from core, IFC interface memories (including IFC SRAM)
+ // should be configured as device type memory in MMU.
+ // For write transactions from non-core masters (like system DMA), the address
+ // should be 16 byte aligned and the data size should be multiple of 16 bytes.
+ //
+ VirtualMemoryTable[++Index].PhysicalBase = IFC_REGION1_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = IFC_REGION1_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = IFC_REGION1_SIZE;
+ VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
+
+ // QMAN SWP
+ VirtualMemoryTable[++Index].PhysicalBase = QMAN_SWP_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = QMAN_SWP_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = QMAN_SWP_SIZE;
+ VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED;
+
+ // BMAN SWP
+ VirtualMemoryTable[++Index].PhysicalBase = BMAN_SWP_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = BMAN_SWP_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = BMAN_SWP_SIZE;
+ VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED;
+
+ // IFC region 2
+ VirtualMemoryTable[++Index].PhysicalBase = IFC_REGION2_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = IFC_REGION2_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = IFC_REGION2_SIZE;
+ VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
+
+ // DRAM2
+ VirtualMemoryTable[++Index].PhysicalBase = DRAM2_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = DRAM2_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = DRAM2_SIZE;
+ VirtualMemoryTable[Index].Attributes = CacheAttributes;
+
+ // PCIe1
+ VirtualMemoryTable[++Index].PhysicalBase = PCI_EXP1_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = PCI_EXP1_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = PCI_EXP1_BASE_SIZE;
+ VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
+
+ // PCIe2
+ VirtualMemoryTable[++Index].PhysicalBase = PCI_EXP2_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = PCI_EXP2_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = PCI_EXP2_BASE_SIZE;
+ VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
+
+ // PCIe3
+ VirtualMemoryTable[++Index].PhysicalBase = PCI_EXP3_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = PCI_EXP3_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = PCI_EXP3_BASE_SIZE;
+ VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
+
+ // DRAM3
+ VirtualMemoryTable[++Index].PhysicalBase = DRAM3_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = DRAM3_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = DRAM3_SIZE;
+ VirtualMemoryTable[Index].Attributes = CacheAttributes;
+
+ // QSPI region
+ VirtualMemoryTable[++Index].PhysicalBase = QSPI_REGION_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = QSPI_REGION_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = QSPI_REGION_SIZE;
+ VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED;
+
+ // End of Table
+ VirtualMemoryTable[++Index].PhysicalBase = 0;
+ VirtualMemoryTable[Index].VirtualBase = 0;
+ VirtualMemoryTable[Index].Length = 0;
+ VirtualMemoryTable[Index].Attributes = (ARM_MEMORY_REGION_ATTRIBUTES)0;
+
+ ASSERT((Index + 1) <= MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS);
+
+ *VirtualMemoryMap = VirtualMemoryTable;
+}
--
1.9.1
^ permalink raw reply related [flat|nested] 39+ messages in thread
* [PATCH 09/10] SocLib : Add support for initialization of peripherals
2017-11-07 14:42 [PATCH 00/10] edk2-platforms/Platform/NXP Meenakshi Aggarwal
` (7 preceding siblings ...)
2017-11-07 14:42 ` [PATCH 08/10] Platform/NXP: Add support for ArmPlatformLib Meenakshi Aggarwal
@ 2017-11-07 14:42 ` Meenakshi Aggarwal
2017-11-07 14:42 ` [PATCH 10/10] Compilation : Add the fdf, dsc and dec files Meenakshi Aggarwal
2017-11-22 15:48 ` [PATCH v2 1/9] Platform/NXP: Add support for Big Endian Mmio APIs Meenakshi Aggarwal
10 siblings, 0 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-07 14:42 UTC (permalink / raw)
To: ard.biesheuvel, leif.lindholm, michael.d.kinney, edk2-devel
Add SocInit function that initializes peripherals
and print board and soc information.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
---
Platform/NXP/Include/Bitops.h | 179 +++++++++++++++
Silicon/NXP/Chassis/Chassis.c | 393 ++++++++++++++++++++++++++++++++
Silicon/NXP/Chassis/Chassis.h | 123 ++++++++++
Silicon/NXP/Chassis/Chassis2/SerDes.h | 82 +++++++
Silicon/NXP/Chassis/Chassis2/Soc.c | 146 ++++++++++++
Silicon/NXP/Chassis/Chassis2/Soc.h | 376 ++++++++++++++++++++++++++++++
Silicon/NXP/Chassis/LS1043aSocLib.inf | 48 ++++
Silicon/NXP/Chassis/SerDes.c | 253 ++++++++++++++++++++
Silicon/NXP/LS1043A/Include/SocSerDes.h | 55 +++++
9 files changed, 1655 insertions(+)
create mode 100644 Platform/NXP/Include/Bitops.h
create mode 100644 Silicon/NXP/Chassis/Chassis.c
create mode 100644 Silicon/NXP/Chassis/Chassis.h
create mode 100644 Silicon/NXP/Chassis/Chassis2/SerDes.h
create mode 100644 Silicon/NXP/Chassis/Chassis2/Soc.c
create mode 100644 Silicon/NXP/Chassis/Chassis2/Soc.h
create mode 100644 Silicon/NXP/Chassis/LS1043aSocLib.inf
create mode 100644 Silicon/NXP/Chassis/SerDes.c
create mode 100644 Silicon/NXP/LS1043A/Include/SocSerDes.h
diff --git a/Platform/NXP/Include/Bitops.h b/Platform/NXP/Include/Bitops.h
new file mode 100644
index 0000000..90e6404
--- /dev/null
+++ b/Platform/NXP/Include/Bitops.h
@@ -0,0 +1,179 @@
+/** Bitops.h
+ Header defining the general bitwise operations
+
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __BITOPS_H__
+#define __BITOPS_H__
+
+#include <Library/DebugLib.h>
+
+#define MASK_LOWER_16 0xFFFF0000
+#define MASK_UPPER_16 0x0000FFFF
+#define MASK_LOWER_8 0xFF000000
+#define MASK_UPPER_8 0x000000FF
+
+/*
+ * Returns the bit mask for a bit index from 0 to 31
+ */
+#define BIT(_BitIndex) (0x1u << (_BitIndex))
+
+/**
+ * Upper32Bits - return bits 32-63 of a number
+ * @N: the number we're accessing
+ *
+ * A basic shift-right of a 64- or 32-bit quantity. Use this to suppress
+ * the "right shift count >= width of type" warning when that quantity is
+ * 32-bits.
+ */
+#define Upper32Bits(N) ((UINT32)(((N) >> 16) >> 16))
+
+/**
+ * Lower32Bits - return bits 0-31 of a number
+ * @N: the number we're accessing
+ */
+#define Lower32Bits(N) ((UINT32)(N))
+
+
+/*
+ * Stores a value for a given bit field in 32-bit '_Container'
+ */
+
+#define SET_BIT_FIELD32(_Container, _BitShift, _BitWidth, _Value) \
+ __SET_BIT_FIELD32(_Container, \
+ __GEN_BIT_FIELD_MASK32(_BitShift, _BitWidth), \
+ _BitShift, \
+ _Value)
+
+#define __SET_BIT_FIELD32(_Container, _BitMask, _BitShift, _Value) \
+ do { \
+ (_Container) &= ~(_BitMask); \
+ if ((_Value) != 0) { \
+ ASSERT(((UINT32)(_Value) << (_BitShift)) <= (_BitMask)); \
+ (_Container) |= \
+ ((UINT32)(_Value) << (_BitShift)) & (_BitMask); \
+ } \
+ } while (0)
+
+/*
+ * Extracts the value for a given bit field in 32-bit _Container
+ */
+
+#define GET_BIT_FIELD32(_Container, _BitShift, _BitWidth) \
+ __GET_BIT_FIELD32(_Container, \
+ __GEN_BIT_FIELD_MASK32(_BitShift, _BitWidth), \
+ _BitShift)
+
+#define __GET_BIT_FIELD32(_Container, _BitMask, _BitShift) \
+ (((UINT32)(_Container) & (_BitMask)) >> (_BitShift))
+
+#define __GEN_BIT_FIELD_MASK32(_BitShift, _BitWidth) \
+ ((_BitWidth) < 32 ? \
+ (((UINT32)1 << (_BitWidth)) - 1) << (_BitShift) : \
+ ~(UINT32)0)
+
+/*
+ *Stores a value for a given bit field in 64-bit '_Container'
+ */
+#define SET_BIT_FIELD64(_Container, _BitShift, _BitWidth, _Value) \
+ __SET_BIT_FIELD64(_Container, \
+ __GEN_BIT_FIELD_MASK64(_BitShift, _BitWidth), \
+ _BitShift, \
+ _Value)
+
+#define __SET_BIT_FIELD64(_Container, _BitMask, _BitShift, _Value) \
+ do { \
+ (_Container) &= ~(_BitMask); \
+ if ((_Value) != 0) { \
+ ASSERT(((UINT64)(_Value) << (_BitShift)) <= (_BitMask)); \
+ (_Container) |= \
+ ((UINT64)(_Value) << (_BitShift)) & (_BitMask); \
+ } \
+ } while (0)
+
+/*
+ * Extracts the value for a given bit field in 64-bit _Container
+ */
+#define GET_BIT_FIELD64(_Container, _BitShift, _BitWidth) \
+ __GET_BIT_FIELD64(_Container, \
+ __GEN_BIT_FIELD_MASK64(_BitShift, _BitWidth), \
+ _BitShift)
+
+#define __GET_BIT_FIELD64(_Container, _BitMask, _BitShift) \
+ (((UINT64)(_Container) & (_BitMask)) >> (_BitShift))
+
+#define __GEN_BIT_FIELD_MASK64(_BitShift, _BitWidth) \
+ ((_BitWidth) < 64 ? \
+ (((UINT64)1 << (_BitWidth)) - 1) << (_BitShift) : \
+ ~(UINT64)0)
+
+/**
+
+ Test If the Destination buffer sets (0->1) or clears (1->0) any bit in Source buffer ?
+
+ @param[in] Source Source Buffer Pointer
+ @param[in] Destination Destination Buffer Pointer
+ @param[in] NumBytes Bytes to Compare
+ @param[in] Set True : Test Weather Destination buffer sets any bit in Source buffer ?
+ False : Test Weather Destination buffer clears any bit in Source buffer ?
+
+ @retval TRUE Destination buffer sets/clear a bit in source buffer.
+ @retval FALSE Destination buffer doesn't sets/clear bit in source buffer.
+
+**/
+STATIC
+inline
+BOOLEAN
+TestBitSetClear (
+ IN VOID *Source,
+ IN VOID *Destination,
+ IN UINTN NumBytes,
+ IN BOOLEAN Set
+ )
+{
+ UINTN Index = 0;
+ VOID* Buffer;
+
+ if (Set) {
+ Buffer = Destination;
+ } else {
+ Buffer = Source;
+ }
+
+ while(Index < NumBytes) {
+ if ((NumBytes - Index) >= 8) {
+ if ((*((UINT64*)(Source+Index)) ^ *((UINT64*)(Destination+Index))) & *((UINT64*)(Buffer+Index))) {
+ return TRUE;
+ }
+ Index += 8;
+ } else if ((NumBytes - Index) >= 4) {
+ if ((*((UINT32*)(Source+Index)) ^ *((UINT32*)(Destination+Index))) & *((UINT32*)(Buffer+Index))) {
+ return TRUE;
+ }
+ Index += 4;
+ } else if ((NumBytes - Index) >= 2) {
+ if ((*((UINT16*)(Source+Index)) ^ *((UINT16*)(Destination+Index))) & *((UINT16*)(Buffer+Index))) {
+ return TRUE;
+ }
+ Index += 2;
+ } else if ((NumBytes - Index) >= 1) {
+ if ((*((UINT8*)(Source+Index)) ^ *((UINT8*)(Destination+Index))) & *((UINT8*)(Buffer+Index))) {
+ return TRUE;
+ }
+ Index += 1;
+ }
+ }
+ return FALSE;
+}
+
+#endif
diff --git a/Silicon/NXP/Chassis/Chassis.c b/Silicon/NXP/Chassis/Chassis.c
new file mode 100644
index 0000000..35814ca
--- /dev/null
+++ b/Silicon/NXP/Chassis/Chassis.c
@@ -0,0 +1,393 @@
+/** @file
+ SoC specific Library containg functions to initialize various SoC components
+
+ Copyright (c) 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Base.h>
+#include <Library/BaseLib.h>
+#include <Library/BeIoLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IoLib.h>
+#include <Library/PcdLib.h>
+#include <Library/PrintLib.h>
+#include <Library/SerialPortLib.h>
+#include <Library/Utils.h>
+
+#include <Soc.h>
+
+#include "Chassis.h"
+
+UINT32
+EFIAPI
+GurRead (
+ IN UINTN Address
+ )
+{
+ if (FixedPcdGetBool(PcdGurBigEndian)) {
+ return BeMmioRead32(Address);
+ } else {
+ return MmioRead32(Address);
+ }
+}
+
+/*
+ * Structure to list available SOCs.
+ */
+STATIC CPU_TYPE CpuTypeList[] = {
+ CPU_TYPE_ENTRY(LS1043A, LS1043A, 4),
+};
+
+UINT32
+InitiatorType (
+ IN UINT32 Cluster,
+ IN UINTN InitId
+ )
+{
+ CCSR_GUR *GurBase;
+ UINT32 Idx;
+ UINT32 Type;
+
+ GurBase = (VOID *)PcdGet64(PcdGutsBaseAddr);
+ Idx = (Cluster >> (InitId * 8)) & TP_CLUSTER_INIT_MASK;
+ Type = GurRead((UINTN)&GurBase->TpItyp[Idx]);
+
+ if (Type & TP_ITYP_AV_MASK) {
+ return Type;
+ }
+
+ return 0;
+}
+
+/*
+ * Return the mask for number of cores on this SOC.
+ */
+UINT32
+CpuMask (
+ VOID
+ )
+{
+ CCSR_GUR *GurBase;
+ UINTN ClusterIndex;
+ UINTN Count;
+ UINT32 Cluster;
+ UINT32 Type;
+ UINT32 Mask;
+ UINTN InitiatorIndex;
+
+ GurBase = (VOID *)PcdGet64(PcdGutsBaseAddr);
+ ClusterIndex = 0;
+ Count = 0;
+ Mask = 0;
+
+ do {
+ Cluster = GurRead((UINTN)&GurBase->TpCluster[ClusterIndex].Lower);
+ for (InitiatorIndex = 0; InitiatorIndex < TP_INIT_PER_CLUSTER; InitiatorIndex++) {
+ Type = InitiatorType(Cluster, InitiatorIndex);
+ if (Type) {
+ if (TP_ITYP_TYPE_MASK(Type) == TP_ITYP_TYPE_ARM)
+ Mask |= 1 << Count;
+ Count++;
+ }
+ }
+ ClusterIndex++;
+ } while (CHECK_CLUSTER(Cluster));
+
+ return Mask;
+}
+
+/*
+ * Return the number of cores on this SOC.
+ */
+UINTN
+CpuNumCores (
+ VOID
+ )
+{
+ return HammingWeight32(CpuMask());
+}
+
+UINT32
+QoriqCoreToType (
+ IN UINTN Core
+ )
+{
+ CCSR_GUR *GurBase;
+ UINTN ClusterIndex;
+ UINTN Count;
+ UINT32 Cluster;
+ UINT32 Type;
+ UINTN InitiatorIndex;
+
+ GurBase = (VOID *)PcdGet64(PcdGutsBaseAddr);
+ ClusterIndex = 0;
+ Count = 0;
+
+ do {
+ Cluster = GurRead((UINTN)&GurBase->TpCluster[ClusterIndex].Lower);
+ for (InitiatorIndex = 0; InitiatorIndex < TP_INIT_PER_CLUSTER; InitiatorIndex++) {
+ Type = InitiatorType(Cluster, InitiatorIndex);
+ if (Type) {
+ if (Count == Core)
+ return Type;
+ Count++;
+ }
+ }
+ ClusterIndex++;
+ } while (CHECK_CLUSTER(Cluster));
+
+ return -1; /* cannot identify the cluster */
+}
+
+/*
+ * Print CPU information
+ */
+VOID
+PrintCpuInfo (
+ VOID
+ )
+{
+ SYS_INFO SysInfo;
+ UINTN CoreIndex;
+ UINTN Core;
+ UINT32 Type;
+ CHAR8 Buf[32];
+ CHAR8 Buffer[100];
+ UINTN CharCount;
+
+ GetSysInfo(&SysInfo);
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "Clock Configuration:");
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+
+ ForEachCpu(CoreIndex, Core, CpuNumCores(), CpuMask()) {
+ if (!(CoreIndex % 3)) {
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "\n ");
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+ }
+
+ Type = TP_ITYP_VERSION(QoriqCoreToType(Core));
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "CPU%d(%a):%-4a MHz ", Core,
+ Type == TY_ITYP_VERSION_A7 ? "A7 " :
+ (Type == TY_ITYP_VERSION_A53 ? "A53" :
+ (Type == TY_ITYP_VERSION_A57 ? "A57" :
+ (Type == TY_ITYP_VERSION_A72 ? "A72" : " Unknown Core "))),
+ StringToMHz(Buf, sizeof(Buf), SysInfo.FreqProcessor[Core]));
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+ }
+
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "\n Bus: %-4a MHz ",
+ StringToMHz(Buf, sizeof(Buf), SysInfo.FreqSystemBus));
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "DDR: %-4a MHz",
+ StringToMHz(Buf, sizeof(Buf), SysInfo.FreqDdrBus));
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+
+ if (SysInfo.FreqFman[0] != 0) {
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "\n FMAN: %-4a MHz ",
+ StringToMHz(Buf, sizeof(Buf), SysInfo.FreqFman[0]));
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+ }
+
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "\n");
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+}
+
+/*
+ * Return system bus frequency
+ */
+UINT64
+GetBusFrequency (
+ VOID
+ )
+{
+ SYS_INFO SocSysInfo;
+
+ GetSysInfo(&SocSysInfo);
+
+ return SocSysInfo.FreqSystemBus;
+}
+
+/*
+ * Return SDXC bus frequency
+ */
+UINT64
+GetSdxcFrequency (
+ VOID
+ )
+{
+ SYS_INFO SocSysInfo;
+
+ GetSysInfo(&SocSysInfo);
+
+ return SocSysInfo.FreqSdhc;
+}
+
+/*
+ * Print Soc information
+ */
+VOID
+PrintSoc (
+ VOID
+ )
+{
+ CHAR8 Buf[16];
+ CCSR_GUR *GurBase;
+ UINTN Count;
+ UINTN Svr;
+ UINTN Ver;
+
+ GurBase = (VOID *)PcdGet64(PcdGutsBaseAddr);
+
+ Buf[0] = L'\0';
+ Svr = GurRead((UINTN)&GurBase->Svr);
+ Ver = SVR_SOC_VER(Svr);
+
+ for (Count = 0; Count < ARRAY_SIZE(CpuTypeList); Count++)
+ if ((CpuTypeList[Count].SocVer & SVR_WO_E) == Ver) {
+ AsciiStrCpy(Buf, (CONST CHAR8 *)CpuTypeList[Count].Name);
+
+ if (IS_E_PROCESSOR(Svr)) {
+ AsciiStrCat(Buf, (CONST CHAR8 *)"E");
+ }
+ break;
+ }
+
+ if (Count == ARRAY_SIZE(CpuTypeList)) {
+ AsciiStrCpy(Buf, (CONST CHAR8 *)"unknown");
+ }
+
+ DEBUG((DEBUG_INFO, "SoC: %a (0x%x); Rev %d.%d\n",
+ Buf, Svr, SVR_MAJOR(Svr), SVR_MINOR(Svr)));
+
+ return;
+}
+
+/*
+ * Dump RCW (Reset Control Word) on console
+ */
+VOID
+PrintRCW (
+ VOID
+ )
+{
+ CCSR_GUR *Base;
+ UINTN Count;
+ CHAR8 Buffer[100];
+ UINTN CharCount;
+
+ Base = (VOID *)PcdGet64(PcdGutsBaseAddr);
+
+ /*
+ * Display the RCW, so that no one gets confused as to what RCW
+ * we're actually using for this boot.
+ */
+
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer),
+ "Reset Configuration Word (RCW):");
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+ for (Count = 0; Count < ARRAY_SIZE(Base->RcwSr); Count++) {
+ UINT32 Rcw = BeMmioRead32((UINTN)&Base->RcwSr[Count]);
+
+ if ((Count % 4) == 0) {
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer),
+ "\n %08x:", Count * 4);
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+ }
+
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), " %08x", Rcw);
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+ }
+
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "\n");
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+}
+
+/*
+ * Setup SMMU in bypass mode
+ * and also set its pagesize
+ */
+VOID
+SmmuInit (
+ VOID
+ )
+{
+ UINT32 Value;
+
+ /* set pagesize as 64K and ssmu-500 in bypass mode */
+ Value = (MmioRead32((UINTN)SMMU_REG_SACR) | SACR_PAGESIZE_MASK);
+ MmioWrite32((UINTN)SMMU_REG_SACR, Value);
+
+ Value = (MmioRead32((UINTN)SMMU_REG_SCR0) | SCR0_CLIENTPD_MASK) & ~(SCR0_USFCFG_MASK);
+ MmioWrite32((UINTN)SMMU_REG_SCR0, Value);
+
+ Value = (MmioRead32((UINTN)SMMU_REG_NSCR0) | SCR0_CLIENTPD_MASK) & ~(SCR0_USFCFG_MASK);
+ MmioWrite32((UINTN)SMMU_REG_NSCR0, Value);
+}
+
+/*
+ * Return current Soc Name form CpuTypeList
+ */
+CHAR8 *
+GetSocName (
+ VOID
+ )
+{
+ UINT8 Count;
+ UINTN Svr;
+ UINTN Ver;
+ CCSR_GUR *GurBase;
+
+ GurBase = (VOID *)PcdGet64(PcdGutsBaseAddr);
+
+ Svr = GurRead((UINTN)&GurBase->Svr);
+ Ver = SVR_SOC_VER(Svr);
+
+ for (Count = 0; Count < ARRAY_SIZE(CpuTypeList); Count++) {
+ if ((CpuTypeList[Count].SocVer & SVR_WO_E) == Ver) {
+ return (CHAR8 *)CpuTypeList[Count].Name;
+ }
+ }
+
+ return NULL;
+}
+
+/*
+ * Return Baud divisor on basis of Baudrate
+ */
+UINT32
+CalculateBaudDivisor (
+ IN UINT64 BaudRate
+ )
+{
+ SYS_INFO SocSysInfo;
+ UINTN DUartClk;
+
+ GetSysInfo(&SocSysInfo);
+ DUartClk = SocSysInfo.FreqSystemBus/PcdGet32(PcdPlatformFreqDiv);
+
+ return ((DUartClk)/(BaudRate * 16));
+}
+
+/*
+ * Return I2c bus frequency
+ */
+UINT32
+CalculateI2cClockRate (
+ VOID
+ )
+{
+ SYS_INFO SocSysInfo;
+
+ GetSysInfo(&SocSysInfo);
+
+ return SocSysInfo.FreqSystemBus;
+}
diff --git a/Silicon/NXP/Chassis/Chassis.h b/Silicon/NXP/Chassis/Chassis.h
new file mode 100644
index 0000000..8c97a3a
--- /dev/null
+++ b/Silicon/NXP/Chassis/Chassis.h
@@ -0,0 +1,123 @@
+/** @file
+* Header defining the Base addresses, sizes, flags etc for chassis 1
+*
+* Copyright 2017 NXP
+*
+* This program and the accompanying materials
+* are licensed and made available under the terms and conditions of the BSD License
+* which accompanies this distribution. The full text of the license may be found at
+* http://opensource.org/licenses/bsd-license.php
+*
+* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#ifndef __CHASSIS_H__
+#define __CHASSIS_H__
+
+#define TP_ITYP_AV_MASK 0x00000001 /* Initiator available */
+#define TP_ITYP_TYPE_MASK(x) (((x) & 0x6) >> 1) /* Initiator Type */
+#define TP_ITYP_TYPE_ARM 0x0
+#define TP_ITYP_TYPE_PPC 0x1
+#define TP_ITYP_TYPE_OTHER 0x2 /* StarCore DSP */
+#define TP_ITYP_TYPE_HA 0x3 /* HW Accelerator */
+#define TP_ITYP_THDS(x) (((x) & 0x18) >> 3) /* # threads */
+#define TP_ITYP_VERSION(x) (((x) & 0xe0) >> 5) /* Initiator Version */
+#define TP_CLUSTER_INIT_MASK 0x0000003f /* initiator mask */
+#define TP_INIT_PER_CLUSTER 4
+
+#define TY_ITYP_VERSION_A7 0x1
+#define TY_ITYP_VERSION_A53 0x2
+#define TY_ITYP_VERSION_A57 0x3
+#define TY_ITYP_VERSION_A72 0x4
+
+#define CPU_TYPE_ENTRY(N, V, NC) \
+ { .Name = #N, .SocVer = SVR_##V, .NumCores = (NC)}
+
+#define SVR_WO_E 0xFFFFFE
+#define SVR_LS1043A 0x879200
+
+#define SVR_MAJOR(svr) (((svr) >> 4) & 0xf)
+#define SVR_MINOR(svr) (((svr) >> 0) & 0xf)
+#define SVR_SOC_VER(svr) (((svr) >> 8) & SVR_WO_E)
+#define IS_E_PROCESSOR(svr) (!((svr >> 8) & 0x1))
+
+typedef struct {
+ CHAR8 Name[16];
+ UINT32 SocVer;
+ UINT32 NumCores;
+} CPU_TYPE;
+
+typedef struct {
+ UINTN CpuClk; /* CPU clock in Hz! */
+ UINTN BusClk;
+ UINTN MemClk;
+ UINTN PciClk;
+ UINTN SdhcClk;
+} SOC_CLOCK_INFO;
+
+/*
+ * Print Soc information
+ */
+VOID
+PrintSoc (
+ VOID
+ );
+
+/*
+ * Initialize Clock structure
+ */
+VOID
+ClockInit (
+ VOID
+ );
+
+/*
+ * Setup SMMU in bypass mode
+ * and also set its pagesize
+ */
+VOID
+SmmuInit (
+ VOID
+ );
+
+/*
+ * Print CPU information
+ */
+VOID
+PrintCpuInfo (
+ VOID
+ );
+
+/*
+ * Dump RCW (Reset Control Word) on console
+ */
+VOID
+PrintRCW (
+ VOID
+ );
+
+UINT32
+InitiatorType (
+ IN UINT32 Cluster,
+ IN UINTN InitId
+ );
+
+/*
+ * Return the mask for number of cores on this SOC.
+ */
+UINT32
+CpuMask (
+ VOID
+ );
+
+/*
+ * Return the number of cores on this SOC.
+ */
+UINTN
+CpuNumCores (
+ VOID
+ );
+
+#endif /* __CHASSIS_H__ */
diff --git a/Silicon/NXP/Chassis/Chassis2/SerDes.h b/Silicon/NXP/Chassis/Chassis2/SerDes.h
new file mode 100644
index 0000000..844cad0
--- /dev/null
+++ b/Silicon/NXP/Chassis/Chassis2/SerDes.h
@@ -0,0 +1,82 @@
+/** SerDes.h
+ The Header file of SerDes Module for Chassis 2
+
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __SERDES_H__
+#define __SERDES_H__
+
+#include <Uefi/UefiBaseType.h>
+
+#define SRDS_MAX_LANES 4
+
+typedef enum {
+ NONE = 0,
+ PCIE1,
+ PCIE2,
+ PCIE3,
+ SATA,
+ SGMII_FM1_DTSEC1,
+ SGMII_FM1_DTSEC2,
+ SGMII_FM1_DTSEC5,
+ SGMII_FM1_DTSEC6,
+ SGMII_FM1_DTSEC9,
+ SGMII_FM1_DTSEC10,
+ QSGMII_FM1_A,
+ XFI_FM1_MAC9,
+ XFI_FM1_MAC10,
+ SGMII_2500_FM1_DTSEC2,
+ SGMII_2500_FM1_DTSEC5,
+ SGMII_2500_FM1_DTSEC9,
+ SGMII_2500_FM1_DTSEC10,
+ SERDES_PRTCL_COUNT
+} SERDES_PROTOCOL;
+
+typedef enum {
+ SRDS_1 = 0,
+ SRDS_2,
+ SRDS_MAX_NUM
+} SERDES_NUMBER;
+
+typedef struct {
+ UINT16 Protocol;
+ UINT8 SrdsLane[SRDS_MAX_LANES];
+} SERDES_CONFIG;
+
+typedef
+VOID
+SERDES_PROBE_LANES_CALLBACK (
+ IN SERDES_PROTOCOL LaneProtocol,
+ IN VOID *Arg
+ );
+
+VOID
+SerDesProbeLanes(
+ IN SERDES_PROBE_LANES_CALLBACK *SerDesLaneProbeCallback,
+ IN VOID *Arg
+ );
+
+EFI_STATUS
+CheckSerDesPrtclValid (
+ IN INTN SerDes,
+ IN UINT32 Prtcl
+ );
+
+SERDES_PROTOCOL
+GetSerDesPrtcl (
+ IN INTN SerDes,
+ IN INTN Cfg,
+ IN INTN Lane
+ );
+
+#endif /* __SERDES_H */
diff --git a/Silicon/NXP/Chassis/Chassis2/Soc.c b/Silicon/NXP/Chassis/Chassis2/Soc.c
new file mode 100644
index 0000000..e18c390
--- /dev/null
+++ b/Silicon/NXP/Chassis/Chassis2/Soc.c
@@ -0,0 +1,146 @@
+/** @Soc.c
+ SoC specific Library containg functions to initialize various SoC components
+
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Base.h>
+#include <Chassis.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib/MemLibInternals.h>
+#include <Library/DebugLib.h>
+#include <Library/IoLib.h>
+#include <Library/PcdLib.h>
+#include <Library/PrintLib.h>
+#include <Library/SerialPortLib.h>
+#include <Library/Utils.h>
+
+#include "Soc.h"
+
+VOID
+GetSysInfo (
+ OUT SYS_INFO *PtrSysInfo
+ )
+{
+ CCSR_GUR *GurBase;
+ CCSR_CLOCK *ClkBase;
+ UINTN CpuIndex;
+ UINT32 TempRcw;
+ UINT32 CPllSel;
+ UINT32 CplxPll;
+ CONST UINT8 CoreCplxPll[8] = {
+ [0] = 0, /* CC1 PPL / 1 */
+ [1] = 0, /* CC1 PPL / 2 */
+ [4] = 1, /* CC2 PPL / 1 */
+ [5] = 1, /* CC2 PPL / 2 */
+ };
+
+ CONST UINT8 CoreCplxPllDivisor[8] = {
+ [0] = 1, /* CC1 PPL / 1 */
+ [1] = 2, /* CC1 PPL / 2 */
+ [4] = 1, /* CC2 PPL / 1 */
+ [5] = 2, /* CC2 PPL / 2 */
+ };
+
+ UINTN PllCount;
+ UINTN FreqCPll[NUM_CC_PLLS];
+ UINTN PllRatio[NUM_CC_PLLS];
+ UINTN SysClk;
+
+ GurBase = (VOID *)PcdGet64(PcdGutsBaseAddr);
+ ClkBase = (VOID *)PcdGet64(PcdClkBaseAddr);
+ SysClk = CLK_FREQ;
+
+ InternalMemZeroMem(PtrSysInfo, sizeof (SYS_INFO));
+
+ PtrSysInfo->FreqSystemBus = SysClk;
+ PtrSysInfo->FreqDdrBus = SysClk;
+
+ PtrSysInfo->FreqSystemBus *= (GurRead((UINTN)&GurBase->RcwSr[0]) >>
+ CHASSIS2_RCWSR0_SYS_PLL_RAT_SHIFT) &
+ CHASSIS2_RCWSR0_SYS_PLL_RAT_MASK;
+ PtrSysInfo->FreqDdrBus *= (GurRead((UINTN)&GurBase->RcwSr[0]) >>
+ CHASSIS2_RCWSR0_MEM_PLL_RAT_SHIFT) &
+ CHASSIS2_RCWSR0_MEM_PLL_RAT_MASK;
+
+ for (PllCount = 0; PllCount < NUM_CC_PLLS; PllCount++) {
+ PllRatio[PllCount] = (GurRead((UINTN)&ClkBase->PllCgSr[PllCount].PllCnGSr) >> 1) & 0xff;
+ if (PllRatio[PllCount] > 4) {
+ FreqCPll[PllCount] = SysClk * PllRatio[PllCount];
+ } else {
+ FreqCPll[PllCount] = PtrSysInfo->FreqSystemBus * PllRatio[PllCount];
+ }
+ }
+
+ for (CpuIndex = 0; CpuIndex < MAX_CPUS; CpuIndex++) {
+ CPllSel = (GurRead((UINTN)&ClkBase->ClkcSr[CpuIndex].ClkCnCSr) >> 27) & 0xf;
+ CplxPll = CoreCplxPll[CPllSel];
+
+ PtrSysInfo->FreqProcessor[CpuIndex] = FreqCPll[CplxPll] / CoreCplxPllDivisor[CPllSel];
+ }
+
+ TempRcw = GurRead((UINTN)&GurBase->RcwSr[7]);
+ switch ((TempRcw & HWA_CGA_M1_CLK_SEL) >> HWA_CGA_M1_CLK_SHIFT) {
+ case 2:
+ PtrSysInfo->FreqFman[0] = FreqCPll[0] / 2;
+ break;
+ case 3:
+ PtrSysInfo->FreqFman[0] = FreqCPll[0] / 3;
+ break;
+ case 4:
+ PtrSysInfo->FreqFman[0] = FreqCPll[0] / 4;
+ break;
+ case 5:
+ PtrSysInfo->FreqFman[0] = PtrSysInfo->FreqSystemBus;
+ break;
+ case 6:
+ PtrSysInfo->FreqFman[0] = FreqCPll[1] / 2;
+ break;
+ case 7:
+ PtrSysInfo->FreqFman[0] = FreqCPll[1] / 3;
+ break;
+ default:
+ DEBUG((DEBUG_WARN, "Error: Unknown FMan1 clock select!\n"));
+ break;
+ }
+ PtrSysInfo->FreqSdhc = PtrSysInfo->FreqSystemBus/PcdGet32(PcdPlatformFreqDiv);
+ PtrSysInfo->FreqQman = PtrSysInfo->FreqSystemBus/PcdGet32(PcdPlatformFreqDiv);
+}
+
+/**
+ Function to initialize SoC specific constructs
+ // CPU Info
+ // SoC Personality
+ // Board Personality
+ // RCW prints
+ **/
+VOID
+SocInit (
+ VOID
+ )
+{
+ CHAR8 Buffer[100];
+ UINTN CharCount;
+
+ SmmuInit();
+
+ // Initialize the Serial Port
+ SerialPortInitialize ();
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "\nUEFI firmware (version %s built at %a on %a)\n\r",
+ (CHAR16*)PcdGetPtr(PcdFirmwareVersionString), __TIME__, __DATE__);
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+
+ PrintCpuInfo();
+ PrintRCW();
+
+ return;
+}
diff --git a/Silicon/NXP/Chassis/Chassis2/Soc.h b/Silicon/NXP/Chassis/Chassis2/Soc.h
new file mode 100644
index 0000000..e6b89d3
--- /dev/null
+++ b/Silicon/NXP/Chassis/Chassis2/Soc.h
@@ -0,0 +1,376 @@
+/** Soc.h
+* Header defining the Base addresses, sizes, flags etc for chassis 1
+*
+* Copyright 2017 NXP
+*
+* This program and the accompanying materials
+* are licensed and made available under the terms and conditions of the BSD License
+* which accompanies this distribution. The full text of the license may be found at
+* http://opensource.org/licenses/bsd-license.php
+*
+* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#ifndef __SOC_H__
+#define __SOC_H__
+
+#define HWA_CGA_M1_CLK_SEL 0xe0000000
+#define HWA_CGA_M1_CLK_SHIFT 29
+
+#define TP_CLUSTER_EOC_MASK 0xc0000000 /* end of clusters mask */
+#define NUM_CC_PLLS 2
+#define CLK_FREQ 100000000
+#define MAX_CPUS 4
+#define NUM_FMAN 1
+#define CHECK_CLUSTER(Cluster) ((Cluster & TP_CLUSTER_EOC_MASK) == 0x0)
+
+/* RCW SERDES MACRO */
+#define RCWSR_INDEX 4
+#define RCWSR_SRDS1_PRTCL_MASK 0xffff0000
+#define RCWSR_SRDS1_PRTCL_SHIFT 16
+#define RCWSR_SRDS2_PRTCL_MASK 0x0000ffff
+#define RCWSR_SRDS2_PRTCL_SHIFT 0
+
+/* SMMU Defintions */
+#define SMMU_BASE_ADDR 0x09000000
+#define SMMU_REG_SCR0 (SMMU_BASE_ADDR + 0x0)
+#define SMMU_REG_SACR (SMMU_BASE_ADDR + 0x10)
+#define SMMU_REG_IDR1 (SMMU_BASE_ADDR + 0x24)
+#define SMMU_REG_NSCR0 (SMMU_BASE_ADDR + 0x400)
+#define SMMU_REG_NSACR (SMMU_BASE_ADDR + 0x410)
+
+#define SCR0_USFCFG_MASK 0x00000400
+#define SCR0_CLIENTPD_MASK 0x00000001
+#define SACR_PAGESIZE_MASK 0x00010000
+#define IDR1_PAGESIZE_MASK 0x80000000
+
+typedef struct {
+ UINTN FreqProcessor[MAX_CPUS];
+ UINTN FreqSystemBus;
+ UINTN FreqDdrBus;
+ UINTN FreqLocalBus;
+ UINTN FreqSdhc;
+ UINTN FreqFman[NUM_FMAN];
+ UINTN FreqQman;
+} SYS_INFO;
+
+typedef enum {
+ ARM_CLK = 0,
+ BUS_CLK,
+ UART_CLK,
+ ESDHC_CLK,
+ I2C_CLK,
+ DSPI_CLK,
+} PERIPHERAL_CLOCK;
+
+/* Device Configuration and Pin Control */
+typedef struct {
+ UINT32 PorSr1; /* POR status 1 */
+#define CHASSIS2_CCSR_PORSR1_RCW_MASK 0xFF800000
+ UINT32 PorSr2; /* POR status 2 */
+ UINT8 Res008[0x20-0x8];
+ UINT32 GppOrCr1; /* General-purpose POR configuration */
+ UINT32 GppOrCr2;
+ UINT32 DcfgFuseSr; /* Fuse status register */
+ UINT8 Res02c[0x70-0x2c];
+ UINT32 DevDisr; /* Device disable control */
+ UINT32 DevDisr2; /* Device disable control 2 */
+ UINT32 DevDisr3; /* Device disable control 3 */
+ UINT32 DevDisr4; /* Device disable control 4 */
+ UINT32 DevDisr5; /* Device disable control 5 */
+ UINT32 DevDisr6; /* Device disable control 6 */
+ UINT32 DevDisr7; /* Device disable control 7 */
+ UINT8 Res08c[0x94-0x8c];
+ UINT32 CoreDisrU; /* uppper portion for support of 64 cores */
+ UINT32 CoreDisrL; /* lower portion for support of 64 cores */
+ UINT8 Res09c[0xa0-0x9c];
+ UINT32 Pvr; /* Processor version */
+ UINT32 Svr; /* System version */
+ UINT32 Mvr; /* Manufacturing version */
+ UINT8 Res0ac[0xb0-0xac];
+ UINT32 RstCr; /* Reset control */
+ UINT32 RstRqPblSr; /* Reset request preboot loader status */
+ UINT8 Res0b8[0xc0-0xb8];
+ UINT32 RstRqMr1; /* Reset request mask */
+ UINT8 Res0c4[0xc8-0xc4];
+ UINT32 RstRqSr1; /* Reset request status */
+ UINT8 Res0cc[0xd4-0xcc];
+ UINT32 RstRqWdTmrL; /* Reset request WDT mask */
+ UINT8 Res0d8[0xdc-0xd8];
+ UINT32 RstRqWdtSrL; /* Reset request WDT status */
+ UINT8 Res0e0[0xe4-0xe0];
+ UINT32 BrrL; /* Boot release */
+ UINT8 Res0e8[0x100-0xe8];
+ UINT32 RcwSr[16]; /* Reset control word status */
+#define CHASSIS2_RCWSR0_SYS_PLL_RAT_SHIFT 25
+#define CHASSIS2_RCWSR0_SYS_PLL_RAT_MASK 0x1f
+#define CHASSIS2_RCWSR0_MEM_PLL_RAT_SHIFT 16
+#define CHASSIS2_RCWSR0_MEM_PLL_RAT_MASK 0x3f
+ UINT8 Res140[0x200-0x140];
+ UINT32 ScratchRw[4]; /* Scratch Read/Write */
+ UINT8 Res210[0x300-0x210];
+ UINT32 ScratcHw1R[4]; /* Scratch Read (Write once) */
+ UINT8 Res310[0x400-0x310];
+ UINT32 CrstSr[12];
+ UINT8 Res430[0x500-0x430];
+ /* PCI Express n Logical I/O Device Number register */
+ UINT32 DcfgCcsrPex1LiodNr;
+ UINT32 DcfgCcsrPex2LiodNr;
+ UINT32 DcfgCcsrPex3LiodNr;
+ UINT32 DcfgCcsrPex4LiodNr;
+ /* RIO n Logical I/O Device Number register */
+ UINT32 DcfgCcsrRio1LiodNr;
+ UINT32 DcfgCcsrRio2LiodNr;
+ UINT32 DcfgCcsrRio3LiodNr;
+ UINT32 DcfgCcsrRio4LiodNr;
+ /* USB Logical I/O Device Number register */
+ UINT32 DcfgCcsrUsb1LiodNr;
+ UINT32 DcfgCcsrUsb2LiodNr;
+ UINT32 DcfgCcsrUsb3LiodNr;
+ UINT32 DcfgCcsrUsb4LiodNr;
+ /* SD/MMC Logical I/O Device Number register */
+ UINT32 DcfgCcsrSdMmc1LiodNr;
+ UINT32 DcfgCcsrSdMmc2LiodNr;
+ UINT32 DcfgCcsrSdMmc3LiodNr;
+ UINT32 DcfgCcsrSdMmc4LiodNr;
+ /* RIO Message Unit Logical I/O Device Number register */
+ UINT32 DcfgCcsrRiomaintLiodNr;
+ UINT8 Res544[0x550-0x544];
+ UINT32 SataLiodNr[4];
+ UINT8 Res560[0x570-0x560];
+ UINT32 DcfgCcsrMisc1LiodNr;
+ UINT32 DcfgCcsrMisc2LiodNr;
+ UINT32 DcfgCcsrMisc3LiodNr;
+ UINT32 DcfgCcsrMisc4LiodNr;
+ UINT32 DcfgCcsrDma1LiodNr;
+ UINT32 DcfgCcsrDma2LiodNr;
+ UINT32 DcfgCcsrDma3LiodNr;
+ UINT32 DcfgCcsrDma4LiodNr;
+ UINT32 DcfgCcsrSpare1LiodNr;
+ UINT32 DcfgCcsrSpare2LiodNr;
+ UINT32 DcfgCcsrSpare3LiodNr;
+ UINT32 DcfgCcsrSpare4LiodNr;
+ UINT8 Res5a0[0x600-0x5a0];
+ UINT32 DcfgCcsrPblSr;
+ UINT32 PamuBypENr;
+ UINT32 DmaCr1;
+ UINT8 Res60c[0x610-0x60c];
+ UINT32 DcfgCcsrGenSr1;
+ UINT32 DcfgCcsrGenSr2;
+ UINT32 DcfgCcsrGenSr3;
+ UINT32 DcfgCcsrGenSr4;
+ UINT32 DcfgCcsrGenCr1;
+ UINT32 DcfgCcsrGenCr2;
+ UINT32 DcfgCcsrGenCr3;
+ UINT32 DcfgCcsrGenCr4;
+ UINT32 DcfgCcsrGenCr5;
+ UINT32 DcfgCcsrGenCr6;
+ UINT32 DcfgCcsrGenCr7;
+ UINT8 Res63c[0x658-0x63c];
+ UINT32 DcfgCcsrcGenSr1;
+ UINT32 DcfgCcsrcGenSr0;
+ UINT8 Res660[0x678-0x660];
+ UINT32 DcfgCcsrcGenCr1;
+ UINT32 DcfgCcsrcGenCr0;
+ UINT8 Res680[0x700-0x680];
+ UINT32 DcfgCcsrSrIoPstecr;
+ UINT32 DcfgCcsrDcsrCr;
+ UINT8 Res708[0x740-0x708]; /* add more registers when needed */
+ UINT32 TpItyp[64]; /* Topology Initiator Type Register */
+ struct {
+ UINT32 Upper;
+ UINT32 Lower;
+ } TpCluster[16];
+ UINT8 Res8c0[0xa00-0x8c0]; /* add more registers when needed */
+ UINT32 DcfgCcsrQmBmWarmRst;
+ UINT8 Resa04[0xa20-0xa04]; /* add more registers when needed */
+ UINT32 DcfgCcsrReserved0;
+ UINT32 DcfgCcsrReserved1;
+} CCSR_GUR;
+
+/* Supplemental Configuration Unit */
+typedef struct {
+ UINT8 Res000[0x070-0x000];
+ UINT32 Usb1Prm1Cr;
+ UINT32 Usb1Prm2Cr;
+ UINT32 Usb1Prm3Cr;
+ UINT32 Usb2Prm1Cr;
+ UINT32 Usb2Prm2Cr;
+ UINT32 Usb2Prm3Cr;
+ UINT32 Usb3Prm1Cr;
+ UINT32 Usb3Prm2Cr;
+ UINT32 Usb3Prm3Cr;
+ UINT8 Res094[0x100-0x094];
+ UINT32 Usb2Icid;
+ UINT32 Usb3Icid;
+ UINT8 Res108[0x114-0x108];
+ UINT32 DmaIcid;
+ UINT32 SataIcid;
+ UINT32 Usb1Icid;
+ UINT32 QeIcid;
+ UINT32 SdhcIcid;
+ UINT32 EdmaIcid;
+ UINT32 EtrIcid;
+ UINT32 Core0SftRst;
+ UINT32 Core1SftRst;
+ UINT32 Core2SftRst;
+ UINT32 Core3SftRst;
+ UINT8 Res140[0x158-0x140];
+ UINT32 AltCBar;
+ UINT32 QspiCfg;
+ UINT8 Res160[0x180-0x160];
+ UINT32 DmaMcr;
+ UINT8 Res184[0x188-0x184];
+ UINT32 GicAlign;
+ UINT32 DebugIcid;
+ UINT8 Res190[0x1a4-0x190];
+ UINT32 SnpCnfGcr;
+#define CCSR_SCFG_SNPCNFGCR_SECRDSNP BIT31
+#define CCSR_SCFG_SNPCNFGCR_SECWRSNP BIT30
+#define CCSR_SCFG_SNPCNFGCR_SATARDSNP BIT23
+#define CCSR_SCFG_SNPCNFGCR_SATAWRSNP BIT22
+#define CCSR_SCFG_SNPCNFGCR_USB1RDSNP BIT21
+#define CCSR_SCFG_SNPCNFGCR_USB1WRSNP BIT20
+#define CCSR_SCFG_SNPCNFGCR_USB2RDSNP BIT15
+#define CCSR_SCFG_SNPCNFGCR_USB2WRSNP BIT16
+#define CCSR_SCFG_SNPCNFGCR_USB3RDSNP BIT13
+#define CCSR_SCFG_SNPCNFGCR_USB3WRSNP BIT14
+ UINT8 Res1a8[0x1ac-0x1a8];
+ UINT32 IntpCr;
+ UINT8 Res1b0[0x204-0x1b0];
+ UINT32 CoreSrEnCr;
+ UINT8 Res208[0x220-0x208];
+ UINT32 RvBar00;
+ UINT32 RvBar01;
+ UINT32 RvBar10;
+ UINT32 RvBar11;
+ UINT32 RvBar20;
+ UINT32 RvBar21;
+ UINT32 RvBar30;
+ UINT32 RvBar31;
+ UINT32 LpmCsr;
+ UINT8 Res244[0x400-0x244];
+ UINT32 QspIdQScr;
+ UINT32 EcgTxcMcr;
+ UINT32 SdhcIoVSelCr;
+ UINT32 RcwPMuxCr0;
+ /**Setting RCW PinMux Register bits 17-19 to select USB2_DRVVBUS
+ *Setting RCW PinMux Register bits 21-23 to select USB2_PWRFAULT
+ *Setting RCW PinMux Register bits 25-27 to select USB3_DRVVBUS
+ Setting RCW PinMux Register bits 29-31 to select USB3_DRVVBUS*/
+#define CCSR_SCFG_RCWPMUXCRO_SELCR_USB 0x3333
+ /**Setting RCW PinMux Register bits 17-19 to select USB2_DRVVBUS
+ *Setting RCW PinMux Register bits 21-23 to select USB2_PWRFAULT
+ *Setting RCW PinMux Register bits 25-27 to select IIC4_SCL
+ Setting RCW PinMux Register bits 29-31 to select IIC4_SDA*/
+#define CCSR_SCFG_RCWPMUXCRO_NOT_SELCR_USB 0x3300
+ UINT32 UsbDrvVBusSelCr;
+#define CCSR_SCFG_USBDRVVBUS_SELCR_USB1 0x00000000
+#define CCSR_SCFG_USBDRVVBUS_SELCR_USB2 0x00000001
+#define CCSR_SCFG_USBDRVVBUS_SELCR_USB3 0x00000003
+ UINT32 UsbPwrFaultSelCr;
+#define CCSR_SCFG_USBPWRFAULT_INACTIVE 0x00000000
+#define CCSR_SCFG_USBPWRFAULT_SHARED 0x00000001
+#define CCSR_SCFG_USBPWRFAULT_DEDICATED 0x00000002
+#define CCSR_SCFG_USBPWRFAULT_USB3_SHIFT 4
+#define CCSR_SCFG_USBPWRFAULT_USB2_SHIFT 2
+#define CCSR_SCFG_USBPWRFAULT_USB1_SHIFT 0
+ UINT32 UsbRefclkSelcr1;
+ UINT32 UsbRefclkSelcr2;
+ UINT32 UsbRefclkSelcr3;
+ UINT8 Res424[0x600-0x424];
+ UINT32 ScratchRw[4];
+ UINT8 Res610[0x680-0x610];
+ UINT32 CoreBCr;
+ UINT8 Res684[0x1000-0x684];
+ UINT32 Pex1MsiIr;
+ UINT32 Pex1MsiR;
+ UINT8 Res1008[0x2000-0x1008];
+ UINT32 Pex2;
+ UINT32 Pex2MsiR;
+ UINT8 Res2008[0x3000-0x2008];
+ UINT32 Pex3MsiIr;
+ UINT32 Pex3MsiR;
+} CCSR_SCFG;
+
+#define USB_TXVREFTUNE 0x9
+#define USB_SQRXTUNE 0xFC7FFFFF
+#define USB_PCSTXSWINGFULL 0x47
+#define USB_PHY_RX_EQ_VAL_1 0x0000
+#define USB_PHY_RX_EQ_VAL_2 0x8000
+#define USB_PHY_RX_EQ_VAL_3 0x8003
+#define USB_PHY_RX_EQ_VAL_4 0x800b
+
+/*USB_PHY_SS memory map*/
+typedef struct {
+ UINT16 IpIdcodeLo;
+ UINT16 SupIdcodeHi;
+ UINT8 Res4[0x0006-0x0004];
+ UINT16 RtuneDebug;
+ UINT16 RtuneStat;
+ UINT16 SupSsPhase;
+ UINT16 SsFreq;
+ UINT8 ResE[0x0020-0x000e];
+ UINT16 Ateovrd;
+ UINT16 MpllOvrdInLo;
+ UINT8 Res24[0x0026-0x0024];
+ UINT16 SscOvrdIn;
+ UINT8 Res28[0x002A-0x0028];
+ UINT16 LevelOvrdIn;
+ UINT8 Res2C[0x0044-0x002C];
+ UINT16 ScopeCount;
+ UINT8 Res46[0x0060-0x0046];
+ UINT16 MpllLoopCtl;
+ UINT8 Res62[0x006C-0x0062];
+ UINT16 SscClkCntrl;
+ UINT8 Res6E[0x2002-0x006E];
+ UINT16 Lane0TxOvrdInHi;
+ UINT16 Lane0TxOvrdDrvLo;
+ UINT8 Res2006[0x200C-0x2006];
+ UINT16 Lane0RxOvrdInHi;
+ UINT8 Res200E[0x2022-0x200E];
+ UINT16 Lane0TxCmWaitTimeOvrd;
+ UINT8 Res2024[0x202A-0x2024];
+ UINT16 Lane0TxLbertCtl;
+ UINT16 Lane0RxLbertCtl;
+ UINT16 Lane0RxLbertErr;
+ UINT8 Res2030[0x205A-0x2030];
+ UINT16 Lane0TxAltBlock;
+} CCSR_USB_PHY;
+
+/* Clocking */
+typedef struct {
+ struct {
+ UINT32 ClkCnCSr; /* core cluster n clock control status */
+ UINT8 Res004[0x0c];
+ UINT32 ClkcGHwAcSr; /* Clock generator n hardware accelerator */
+ UINT8 Res014[0x0c];
+ } ClkcSr[4];
+ UINT8 Res040[0x780]; /* 0x100 */
+ struct {
+ UINT32 PllCnGSr;
+ UINT8 Res804[0x1c];
+ } PllCgSr[2];
+ UINT8 Res840[0x1c0];
+ UINT32 ClkPCSr; /* 0xa00 Platform clock domain control/status */
+ UINT8 Resa04[0x1fc];
+ UINT32 PllPGSr; /* 0xc00 Platform PLL General Status */
+ UINT8 Resc04[0x1c];
+ UINT32 PllDGSr; /* 0xc20 DDR PLL General Status */
+ UINT8 Resc24[0x3dc];
+} CCSR_CLOCK;
+
+VOID
+GetSysInfo (
+ OUT SYS_INFO *
+ );
+
+UINT32
+EFIAPI
+GurRead (
+ IN UINTN Address
+ );
+
+#endif /* __SOC_H__ */
diff --git a/Silicon/NXP/Chassis/LS1043aSocLib.inf b/Silicon/NXP/Chassis/LS1043aSocLib.inf
new file mode 100644
index 0000000..c914b27
--- /dev/null
+++ b/Silicon/NXP/Chassis/LS1043aSocLib.inf
@@ -0,0 +1,48 @@
+# @file
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = SocLib
+ FILE_GUID = 736343a0-1d96-11e0-aaaa-0002a5d5c51b
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = SocLib
+
+[Packages]
+ MdeModulePkg/MdeModulePkg.dec
+ MdePkg/MdePkg.dec
+ edk2-platforms/Platform/NXP/NxpQoriqLs.dec
+ edk2-platforms/Silicon/NXP/Chassis/Chassis2/Chassis2.dec
+ edk2-platforms/Silicon/NXP/LS1043A/LS1043A.dec
+
+[LibraryClasses]
+ BaseLib
+ BeIoLib
+ DebugLib
+ SerialPortLib
+ UtilsLib
+
+[Sources.common]
+ Chassis.c
+ Chassis2/Soc.c
+ SerDes.c
+
+[FixedPcd]
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString
+ gNxpQoriqLsTokenSpaceGuid.PcdGutsBaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdPlatformFreqDiv
+ gNxpQoriqLsTokenSpaceGuid.PcdSerdes2Enabled
+ gNxpQoriqLsTokenSpaceGuid.PcdGurBigEndian
+ gNxpQoriqLsTokenSpaceGuid.PcdClkBaseAddr
diff --git a/Silicon/NXP/Chassis/SerDes.c b/Silicon/NXP/Chassis/SerDes.c
new file mode 100644
index 0000000..28d9847
--- /dev/null
+++ b/Silicon/NXP/Chassis/SerDes.c
@@ -0,0 +1,253 @@
+/** SerDes.c
+ Provides the basic interfaces for SerDes Module
+
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Bitops.h>
+#include <Library/DebugLib.h>
+#include <SerDes.h>
+#include <SocSerDes.h>
+#include <Soc.h>
+#include <Uefi.h>
+
+UINT64 *SerDesPrtclMap;
+
+/**
+ Function to get serdes Lane protocol corresponding to
+ serdes protocol.
+
+ @param SerDes Serdes number.
+ @param Cfg Serdes Protocol.
+ @param Lane Serdes Lane number.
+
+ @return Serdes Lane protocol.
+
+**/
+SERDES_PROTOCOL
+GetSerDesPrtcl (
+ IN INTN SerDes,
+ IN INTN Cfg,
+ IN INTN Lane
+ )
+{
+ SERDES_CONFIG *Config;
+
+ if (SerDes >= ARRAY_SIZE(SerDesConfigTbl)) {
+ return 0;
+ }
+
+ Config = SerDesConfigTbl[SerDes];
+ while (Config->Protocol) {
+ if (Config->Protocol == Cfg) {
+ return Config->SrdsLane[Lane];
+ }
+ Config++;
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Function to check if inputted protocol is a valid serdes protocol.
+
+ @param SerDes Serdes number.
+ @param Prtcl Serdes Protocol to be verified.
+
+ @return EFI_INVALID_PARAMETER Input parameter in invalid.
+ @return EFI_NOT_FOUND Serdes Protocol not a valid protocol.
+ @return EFI_SUCCESS Serdes Protocol is a valid protocol.
+
+**/
+EFI_STATUS
+CheckSerDesPrtclValid (
+ IN INTN SerDes,
+ IN UINT32 Prtcl
+ )
+{
+ SERDES_CONFIG *Config;
+ INTN Cnt;
+
+ if (SerDes >= ARRAY_SIZE(SerDesConfigTbl)) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Config = SerDesConfigTbl[SerDes];
+ while (Config->Protocol) {
+ if (Config->Protocol == Prtcl) {
+ DEBUG((DEBUG_INFO, "Protocol: %x Matched with the one in Table\n", Prtcl));
+ break;
+ }
+ Config++;
+ }
+
+ if (!Config->Protocol) {
+ return EFI_NOT_FOUND;
+ }
+
+ for (Cnt = 0; Cnt < SRDS_MAX_LANES; Cnt++) {
+ if (Config->SrdsLane[Cnt] != NONE) {
+ return EFI_SUCCESS;
+ }
+ }
+
+ return EFI_NOT_FOUND;
+}
+
+/**
+ Function to fill serdes map information.
+
+ @param Srds Serdes number.
+ @param SERDES_PROTOCOLMask Serdes Protocol Mask.
+ @param SERDES_PROTOCOLShift Serdes Protocol shift value.
+ @param SerDesPrtclMap Pointer to Serdes Protocol map.
+
+**/
+VOID
+LSSerDesMap (
+ IN UINT32 Srds,
+ IN UINT32 SERDES_PROTOCOLMask,
+ IN UINT32 SERDES_PROTOCOLShift,
+ OUT UINT64 *SerDesPrtclMap
+ )
+{
+ CCSR_GUR *Gur;
+ UINT32 SrdsProt;
+ INTN Lane;
+ UINT32 Flag;
+
+ Gur = (VOID *)PcdGet64(PcdGutsBaseAddr);
+ *SerDesPrtclMap = 0x0;
+ Flag = 0;
+
+ SrdsProt = GurRead((UINTN)&Gur->RcwSr[RCWSR_INDEX]) & SERDES_PROTOCOLMask;
+ SrdsProt >>= SERDES_PROTOCOLShift;
+
+ DEBUG((DEBUG_INFO, "Using SERDES%d Protocol: %d (0x%x)\n",
+ Srds + 1, SrdsProt, SrdsProt));
+
+ if (EFI_SUCCESS != CheckSerDesPrtclValid(Srds, SrdsProt)) {
+ DEBUG((DEBUG_ERROR, "SERDES%d[PRTCL] = 0x%x is not valid\n",
+ Srds + 1, SrdsProt));
+ Flag++;
+ }
+
+ for (Lane = 0; Lane < SRDS_MAX_LANES; Lane++) {
+ SERDES_PROTOCOL LanePrtcl = GetSerDesPrtcl(Srds, SrdsProt, Lane);
+ if (LanePrtcl >= SERDES_PRTCL_COUNT) {
+ DEBUG((DEBUG_ERROR, "Unknown SerDes lane protocol %d\n", LanePrtcl));
+ Flag++;
+ } else {
+ *SerDesPrtclMap |= BIT(LanePrtcl);
+ }
+ }
+
+ if (Flag) {
+ DEBUG((DEBUG_ERROR, "Could not configure SerDes module!!\n"));
+ } else {
+ DEBUG((DEBUG_INFO, "Successfully configured SerDes module!!\n"));
+ }
+}
+
+STATIC
+VOID
+SerDesInstanceProbeLanes (
+ IN UINT32 Srds,
+ IN UINT32 SERDES_PROTOCOLMask,
+ IN UINT32 SERDES_PROTOCOLShift,
+ IN SERDES_PROBE_LANES_CALLBACK *SerDesLaneProbeCallback,
+ IN VOID *Arg
+ )
+{
+
+ CCSR_GUR *Gur;
+ UINT32 SrdsProt;
+ INTN Lane;
+
+ Gur = (VOID *)PcdGet64(PcdGutsBaseAddr);;
+
+ SrdsProt = GurRead((UINTN)&Gur->RcwSr[RCWSR_INDEX]) & SERDES_PROTOCOLMask;
+ SrdsProt >>= SERDES_PROTOCOLShift;
+
+ /*
+ * Invoke callback for all lanes in the SerDes instance:
+ */
+ for (Lane = 0; Lane < SRDS_MAX_LANES; Lane++) {
+ SERDES_PROTOCOL LanePrtcl = GetSerDesPrtcl(Srds, SrdsProt, Lane);
+ if (LanePrtcl >= SERDES_PRTCL_COUNT || LanePrtcl < NONE) {
+ DEBUG((DEBUG_ERROR, "Unknown SerDes lane protocol %d\n", LanePrtcl));
+ }
+ else if (LanePrtcl != NONE) {
+ SerDesLaneProbeCallback(LanePrtcl, Arg);
+ }
+ }
+}
+
+VOID
+SerDesProbeLanes (
+ IN SERDES_PROBE_LANES_CALLBACK *SerDesLaneProbeCallback,
+ IN VOID *Arg
+ )
+{
+ SerDesInstanceProbeLanes(SRDS_1,
+ RCWSR_SRDS1_PRTCL_MASK,
+ RCWSR_SRDS1_PRTCL_SHIFT,
+ SerDesLaneProbeCallback,
+ Arg);
+
+ if (PcdGetBool(PcdSerdes2Enabled)) {
+ SerDesInstanceProbeLanes(SRDS_2,
+ RCWSR_SRDS2_PRTCL_MASK,
+ RCWSR_SRDS2_PRTCL_SHIFT,
+ SerDesLaneProbeCallback,
+ Arg);
+ }
+}
+
+/**
+ Function to return Serdes protocol map for all serdes available on board.
+
+ @param SerDesPrtclMap Pointer to Serdes protocl map.
+
+**/
+VOID
+GetSerdesProtocolMaps (
+ OUT UINT64 *SerDesPrtclMap
+ )
+{
+ LSSerDesMap(SRDS_1,
+ RCWSR_SRDS1_PRTCL_MASK,
+ RCWSR_SRDS1_PRTCL_SHIFT,
+ SerDesPrtclMap);
+
+ if (PcdGetBool(PcdSerdes2Enabled)) {
+ LSSerDesMap(SRDS_2,
+ RCWSR_SRDS2_PRTCL_MASK,
+ RCWSR_SRDS2_PRTCL_SHIFT,
+ SerDesPrtclMap);
+ }
+
+}
+
+BOOLEAN
+IsSerDesLaneProtocolConfigured (
+ IN UINT64 SerDesPrtclMap,
+ IN SERDES_PROTOCOL Device
+ )
+{
+ if (Device >= SERDES_PRTCL_COUNT || Device < NONE) {
+ ASSERT(Device > NONE && Device < SERDES_PRTCL_COUNT);
+ DEBUG((DEBUG_ERROR, "Unknown SerDes lane protocol Device %d\n", Device));
+ }
+
+ return (SerDesPrtclMap & BIT(Device)) != 0 ;
+}
diff --git a/Silicon/NXP/LS1043A/Include/SocSerDes.h b/Silicon/NXP/LS1043A/Include/SocSerDes.h
new file mode 100644
index 0000000..90e165f
--- /dev/null
+++ b/Silicon/NXP/LS1043A/Include/SocSerDes.h
@@ -0,0 +1,55 @@
+/** @file
+ The Header file of SerDes Module for LS1043A
+
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __SOC_SERDES_H__
+#define __SOC_SERDES_H__
+
+#include <SerDes.h>
+
+SERDES_CONFIG SerDes1ConfigTbl[] = {
+ /* SerDes 1 */
+ {0x1555, {XFI_FM1_MAC9, PCIE1, PCIE2, PCIE3 } },
+ {0x2555, {SGMII_2500_FM1_DTSEC9, PCIE1, PCIE2, PCIE3 } },
+ {0x4555, {QSGMII_FM1_A, PCIE1, PCIE2, PCIE3 } },
+ {0x4558, {QSGMII_FM1_A, PCIE1, PCIE2, SATA } },
+ {0x1355, {XFI_FM1_MAC9, SGMII_FM1_DTSEC2, PCIE2, PCIE3 } },
+ {0x2355, {SGMII_2500_FM1_DTSEC9, SGMII_FM1_DTSEC2, PCIE2, PCIE3 } },
+ {0x3335, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC2, SGMII_FM1_DTSEC5, PCIE3 } },
+ {0x3355, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC2, PCIE2, PCIE3 } },
+ {0x3358, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC2, PCIE2, SATA } },
+ {0x3555, {SGMII_FM1_DTSEC9, PCIE1, PCIE2, PCIE3 } },
+ {0x3558, {SGMII_FM1_DTSEC9, PCIE1, PCIE2, SATA } },
+ {0x7000, {PCIE1, PCIE1, PCIE1, PCIE1 } },
+ {0x9998, {PCIE1, PCIE2, PCIE3, SATA } },
+ {0x6058, {PCIE1, PCIE1, PCIE2, SATA } },
+ {0x1455, {XFI_FM1_MAC9, QSGMII_FM1_A, PCIE2, PCIE3 } },
+ {0x2455, {SGMII_2500_FM1_DTSEC9, QSGMII_FM1_A, PCIE2, PCIE3 } },
+ {0x2255, {SGMII_2500_FM1_DTSEC9, SGMII_2500_FM1_DTSEC2, PCIE2, PCIE3 } },
+ {0x3333, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC2, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6 } },
+ {0x1460, {XFI_FM1_MAC9, QSGMII_FM1_A, PCIE3, PCIE3 } },
+ {0x2460, {SGMII_2500_FM1_DTSEC9, QSGMII_FM1_A, PCIE3, PCIE3 } },
+ {0x3460, {SGMII_FM1_DTSEC9, QSGMII_FM1_A, PCIE3, PCIE3 } },
+ {0x3455, {SGMII_FM1_DTSEC9, QSGMII_FM1_A, PCIE2, PCIE3 } },
+ {0x9960, {PCIE1, PCIE2, PCIE3, PCIE3 } },
+ {0x2233, {SGMII_2500_FM1_DTSEC9, SGMII_FM1_DTSEC2, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6 } },
+ {0x2533, {SGMII_2500_FM1_DTSEC9, PCIE1, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6 } },
+ {}
+};
+
+SERDES_CONFIG *SerDesConfigTbl[] = {
+ SerDes1ConfigTbl
+};
+
+#endif /* __SOC_SERDES_H */
--
1.9.1
^ permalink raw reply related [flat|nested] 39+ messages in thread
* [PATCH 10/10] Compilation : Add the fdf, dsc and dec files.
2017-11-07 14:42 [PATCH 00/10] edk2-platforms/Platform/NXP Meenakshi Aggarwal
` (8 preceding siblings ...)
2017-11-07 14:42 ` [PATCH 09/10] SocLib : Add support for initialization of peripherals Meenakshi Aggarwal
@ 2017-11-07 14:42 ` Meenakshi Aggarwal
2017-11-22 15:48 ` [PATCH v2 1/9] Platform/NXP: Add support for Big Endian Mmio APIs Meenakshi Aggarwal
10 siblings, 0 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-07 14:42 UTC (permalink / raw)
To: ard.biesheuvel, leif.lindholm, michael.d.kinney, edk2-devel
The firware device, description and declaration files.
Build script and Environment setup script.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
---
Platform/NXP/Env.cshrc | 75 +++++
Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dec | 29 ++
Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dsc | 74 +++++
Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.fdf | 279 +++++++++++++++++
Platform/NXP/NxpQoriqLs.dec | 257 +++++++++++++++
Platform/NXP/NxpQoriqLs.dsc | 453 +++++++++++++++++++++++++++
Platform/NXP/Readme.md | 14 +
Platform/NXP/build.sh | 100 ++++++
Silicon/NXP/Chassis/Chassis2/Chassis2.dec | 19 ++
Silicon/NXP/LS1043A/LS1043A.dec | 22 ++
Silicon/NXP/LS1043A/LS1043A.dsc | 82 +++++
11 files changed, 1404 insertions(+)
create mode 100644 Platform/NXP/Env.cshrc
create mode 100644 Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dec
create mode 100644 Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dsc
create mode 100644 Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.fdf
create mode 100644 Platform/NXP/NxpQoriqLs.dec
create mode 100644 Platform/NXP/NxpQoriqLs.dsc
create mode 100644 Platform/NXP/Readme.md
create mode 100755 Platform/NXP/build.sh
create mode 100644 Silicon/NXP/Chassis/Chassis2/Chassis2.dec
create mode 100644 Silicon/NXP/LS1043A/LS1043A.dec
create mode 100644 Silicon/NXP/LS1043A/LS1043A.dsc
diff --git a/Platform/NXP/Env.cshrc b/Platform/NXP/Env.cshrc
new file mode 100644
index 0000000..9b7f261
--- /dev/null
+++ b/Platform/NXP/Env.cshrc
@@ -0,0 +1,75 @@
+# @file.
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials are licensed and made available under
+# the terms and conditions of the BSD License which accompanies this distribution.
+# The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+unset GCC_UTILITY GCC_VERSION MajorVersion MinorVersion
+
+if [ X"$CROSS_COMPILE_64" != X"" ]; then
+ ARM64_PREFIX="$CROSS_COMPILE_64"
+elif [ X"$CROSS_COMPILE" != X"" ]; then
+ ARM64_PREFIX="$CROSS_COMPILE"
+else
+ ARM64_PREFIX="aarch64-linux-gnu-"
+fi
+
+GCC_UTILITY="${ARM64_PREFIX}gcc"
+CheckGcc=`which $GCC_UTILITY >/dev/null 2>&1`
+if [ "$?" -eq 0 ];then
+ GCC_VERSION=`$GCC_UTILITY -v 2>&1 | tail -n 1 | awk '{print $3}'`
+ MajorVersion=`echo $GCC_VERSION | cut -d . -f 1`
+ MinorVersion=`echo $GCC_VERSION | cut -d . -f 2`
+ GCC_ARCH_PREFIX=
+ NOTSUPPORTED=0
+
+ case $MajorVersion in
+ 4)
+ case $MinorVersion in
+ 9)
+ GCC_ARCH_PREFIX="GCC49_AARCH64_PREFIX"
+ ;;
+ *)
+ NOTSUPPORTED=1
+ ;;
+ esac
+ ;;
+ 5)
+ case $MinorVersion in
+ 4)
+ GCC_ARCH_PREFIX="GCC5_AARCH64_PREFIX"
+ ;;
+ *)
+ GCC_ARCH_PREFIX="GCC5_AARCH64_PREFIX"
+ echo "Warning: ${GCC_UTILITY} version ($MajorVersion.$MinorVersion) has not been tested, please use at own risk."
+ ;;
+ esac
+ ;;
+ *)
+ NOTSUPPORTED=1
+ ;;
+ esac
+
+ [ "$NOTSUPPORTED" -eq 1 ] && {
+ echo "Error: ${GCC_UTILITY} version ($MajorVersion.$MinorVersion) not supported ."
+ unset GCC_UTILITY GCC_VERSION MajorVersion MinorVersion
+ }
+
+ [ -n "$GCC_ARCH_PREFIX" ] && {
+ export GCC_ARCH_PREFIX="$GCC_ARCH_PREFIX"
+ export "$GCC_ARCH_PREFIX=$ARM64_PREFIX"
+ }
+
+ unset ARCH
+else
+ echo "Error: ${GCC_UTILITY} not found. Please check PATH variable."
+ unset GCC_UTILITY GCC_VERSION MajorVersion MinorVersion
+fi
diff --git a/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dec b/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dec
new file mode 100644
index 0000000..1b639e2
--- /dev/null
+++ b/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dec
@@ -0,0 +1,29 @@
+# LS1043aRdbPkg.dec
+# LS1043a board package.
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials are licensed and made available under
+# the terms and conditions of the BSD License which accompanies this distribution.
+# The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+
+[Defines]
+ PACKAGE_NAME = LS1043aRdbPkg
+ PACKAGE_GUID = 6eba6648-d853-4eb3-9761-528b82d5ab04
+
+################################################################################
+#
+# Include Section - list of Include Paths that are provided by this package.
+# Comments are used for Keywords and Module Types.
+#
+# Supported Module Types:
+# BASE SEC PEI_CORE PEIM DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER DXE_SAL_DRIVER UEFI_DRIVER UEFI_APPLICATION
+#
+################################################################################
+[Includes.common]
+ Include # Root include for the package
diff --git a/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dsc b/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dsc
new file mode 100644
index 0000000..9a6cf1c
--- /dev/null
+++ b/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dsc
@@ -0,0 +1,74 @@
+# LS1043aRdbPkg.dsc
+#
+# LS1043ARDB Board package.
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+
+################################################################################
+#
+# Defines Section - statements that will be processed to create a Makefile.
+#
+################################################################################
+[Defines]
+ #
+ # Defines for default states. These can be changed on the command line.
+ # -D FLAG=VALUE
+ #
+ PLATFORM_NAME = LS1043aRdbPkg
+ PLATFORM_GUID = 60169ec4-d2b4-44f8-825e-f8684fd42e4f
+ OUTPUT_DIRECTORY = Build/LS1043aRdbPkg
+ FLASH_DEFINITION = edk2-platforms/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.fdf
+
+!include ../NxpQoriqLs.dsc
+!include ../../../Silicon/NXP/LS1043A/LS1043A.dsc
+
+[LibraryClasses.common]
+ ArmPlatformLib|edk2-platforms/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/ArmPlatformLib.inf
+ EfiResetSystemLib|edk2-platforms/Platform/NXP/Library/ResetSystemLib/ResetSystemLib.inf
+ I2cLib|edk2-platforms/Platform/NXP/Library/I2cLib/I2cLib.inf
+ SerialPortLib|edk2-platforms/Platform/NXP/Library/DUartPortLib/DUartPortLib.inf
+ BeIoLib|edk2-platforms/Platform/NXP/Library/BeIoLib/BeIoLib.inf
+ SocLib|edk2-platforms/Silicon/NXP/Chassis/LS1043aSocLib.inf
+ RealTimeClockLib|edk2-platforms/Platform/NXP/Library/Ds1307RtcLib/Ds1307RtcLib.inf
+ UtilsLib|edk2-platforms/Platform/NXP/Library/UtilsLib/Utils.inf
+
+[PcdsFixedAtBuild.common]
+ gArmPlatformTokenSpaceGuid.PcdFirmwareVendor|"LS1043a RDB board"
+
+ #
+ # Board Specific Pcds
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdSerdes2Enabled|FALSE
+ gNxpQoriqLsTokenSpaceGuid.PcdPlatformFreqDiv|0x1
+
+ #
+ # RTC Specific Pcds
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdRtcI2cBus|0
+ gNxpQoriqLsTokenSpaceGuid.PcdI2cSpeed|100000
+ gNxpQoriqLsTokenSpaceGuid.PcdDs1307I2cAddress|0x68
+
+ #
+ # Big Endian IPs
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdGurBigEndian|TRUE
+ gNxpQoriqLsTokenSpaceGuid.PcdWdogBigEndian|TRUE
+
+################################################################################
+#
+# Components Section - list of all EDK II Modules needed by this Platform
+#
+################################################################################
+[Components.common]
+ edk2-platforms/Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf
+
+ ##
diff --git a/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.fdf b/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.fdf
new file mode 100644
index 0000000..6d187a9
--- /dev/null
+++ b/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.fdf
@@ -0,0 +1,279 @@
+# LS1043aRdbPkg.fdf
+#
+# FLASH layout file for LS1043a board.
+#
+# Copyright (c) 2016, Freescale Ltd. All rights reserved.
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+
+################################################################################
+#
+# FD Section
+# The [FD] Section is made up of the definition statements and a
+# description of what goes into the Flash Device Image. Each FD section
+# defines one flash "device" image. A flash device image may be one of
+# the following: Removable media bootable image (like a boot floppy
+# image,) an Option ROM image (that would be "flashed" into an add-in
+# card,) a System "Flash" image (that would be burned into a system's
+# flash) or an Update ("Capsule") image that will be used to update and
+# existing system flash.
+#
+################################################################################
+
+[FD.LS1043ARDB_EFI]
+BaseAddress = 0x82000000|gArmTokenSpaceGuid.PcdFdBaseAddress #The base address of the FLASH Device.
+Size = 0x000EC890|gArmTokenSpaceGuid.PcdFdSize #The size in bytes of the FLASH Device
+ErasePolarity = 1
+BlockSize = 0x1
+NumBlocks = 0xEC890
+
+################################################################################
+#
+# Following are lists of FD Region layout which correspond to the locations of different
+# images within the flash device.
+#
+# Regions must be defined in ascending order and may not overlap.
+#
+# A Layout Region start with a eight digit hex offset (leading "0x" required) followed by
+# the pipe "|" character, followed by the size of the region, also in hex with the leading
+# "0x" characters. Like:
+# Offset|Size
+# PcdOffsetCName|PcdSizeCName
+# RegionType <FV, DATA, or FILE>
+#
+################################################################################
+0x00000000|0x000EC890
+gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize
+FV = FVMAIN_COMPACT
+
+
+################################################################################
+#
+# FV Section
+#
+# [FV] section is used to define what components or modules are placed within a flash
+# device file. This section also defines order the components and modules are positioned
+# within the image. The [FV] section consists of define statements, set statements and
+# module statements.
+#
+################################################################################
+
+[FV.FvMain]
+FvNameGuid = 1037c42b-8452-4c41-aac7-41e6c31468da
+BlockSize = 0x1
+NumBlocks = 0 # This FV gets compressed so make it just big enough
+FvAlignment = 8 # FV alignment and FV attributes setting.
+ERASE_POLARITY = 1
+MEMORY_MAPPED = TRUE
+STICKY_WRITE = TRUE
+LOCK_CAP = TRUE
+LOCK_STATUS = TRUE
+WRITE_DISABLED_CAP = TRUE
+WRITE_ENABLED_CAP = TRUE
+WRITE_STATUS = TRUE
+WRITE_LOCK_CAP = TRUE
+WRITE_LOCK_STATUS = TRUE
+READ_DISABLED_CAP = TRUE
+READ_ENABLED_CAP = TRUE
+READ_STATUS = TRUE
+READ_LOCK_CAP = TRUE
+READ_LOCK_STATUS = TRUE
+
+ INF MdeModulePkg/Core/Dxe/DxeMain.inf
+ INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
+
+ #
+ # PI DXE Drivers producing Architectural Protocols (EFI Services)
+ #
+ INF ArmPkg/Drivers/CpuDxe/CpuDxe.inf
+
+ INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
+ INF ArmPkg/Drivers/ArmGic/ArmGicDxe.inf
+ INF ArmPkg/Drivers/TimerDxe/TimerDxe.inf
+ INF edk2-platforms/Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf
+ INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
+ INF MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf
+ INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
+ INF EmbeddedPkg/EmbeddedMonotonicCounter/EmbeddedMonotonicCounter.inf
+ INF MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDxe.inf
+ INF EmbeddedPkg/ResetRuntimeDxe/ResetRuntimeDxe.inf
+ INF EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf
+
+ #
+ # Multiple Console IO support
+ #
+ INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
+ INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
+ INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
+ INF MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
+ INF MdeModulePkg/Universal/SerialDxe/SerialDxe.inf
+
+ INF EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf
+ INF EmbeddedPkg/SimpleTextInOutSerial/SimpleTextInOutSerial.inf
+
+ #
+ # Network modules
+ #
+ INF MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf
+ INF MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf
+ INF MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf
+ INF MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf
+ INF MdeModulePkg/Universal/Network/ArpDxe/ArpDxe.inf
+ INF MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf
+ INF MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf
+ INF MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf
+ INF MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf
+ INF MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf
+ INF MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
+!if $(NETWORK_IP6_ENABLE) == TRUE
+ INF NetworkPkg/Ip6Dxe/Ip6Dxe.inf
+ INF NetworkPkg/TcpDxe/TcpDxe.inf
+ INF NetworkPkg/Udp6Dxe/Udp6Dxe.inf
+ INF NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf
+ INF NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf
+ INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf
+!else
+ INF MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf
+!endif
+
+ #
+ # FAT filesystem + GPT/MBR partitioning
+ #
+ INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
+ INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
+ INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
+ INF FatPkg/FatPei/FatPei.inf
+ INF FatPkg/EnhancedFatDxe/Fat.inf
+
+ #
+ # UEFI application (Shell Embedded Boot Loader)
+ #
+ INF ShellPkg/Application/Shell/Shell.inf
+
+ #
+ # Bds
+ #
+ INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
+ INF MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
+ INF MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf
+ INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
+ INF MdeModulePkg/Application/UiApp/UiApp.inf
+
+[FV.FVMAIN_COMPACT]
+FvAlignment = 8
+ERASE_POLARITY = 1
+MEMORY_MAPPED = TRUE
+STICKY_WRITE = TRUE
+LOCK_CAP = TRUE
+LOCK_STATUS = TRUE
+WRITE_DISABLED_CAP = TRUE
+WRITE_ENABLED_CAP = TRUE
+WRITE_STATUS = TRUE
+WRITE_LOCK_CAP = TRUE
+WRITE_LOCK_STATUS = TRUE
+READ_DISABLED_CAP = TRUE
+READ_ENABLED_CAP = TRUE
+READ_STATUS = TRUE
+READ_LOCK_CAP = TRUE
+READ_LOCK_STATUS = TRUE
+
+ INF ArmPlatformPkg/PrePi/PeiUniCore.inf
+
+ FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {
+ SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE {
+ SECTION FV_IMAGE = FVMAIN
+ }
+ }
+
+################################################################################
+#
+# Rules are use with the [FV] section's module INF type to define
+# how an FFS file is created for a given INF file. The following Rule are the default
+# rules for the different module type. User can add the customized rules to define the
+# content of the FFS file.
+#
+################################################################################
+
+[Rule.Common.SEC]
+ FILE SEC = $(NAMED_GUID) RELOCS_STRIPPED {
+ TE TE Align = 32 $(INF_OUTPUT)/$(MODULE_NAME).efi
+ }
+
+[Rule.Common.PEI_CORE]
+ FILE PEI_CORE = $(NAMED_GUID) {
+ TE TE $(INF_OUTPUT)/$(MODULE_NAME).efi
+ UI STRING ="$(MODULE_NAME)" Optional
+ }
+
+[Rule.Common.PEIM]
+ FILE PEIM = $(NAMED_GUID) {
+ PEI_DEPEX PEI_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex
+ PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi
+ UI STRING="$(MODULE_NAME)" Optional
+ }
+
+[Rule.Common.PEIM.TIANOCOMPRESSED]
+ FILE PEIM = $(NAMED_GUID) DEBUG_MYTOOLS_IA32 {
+ PEI_DEPEX PEI_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex
+ GUIDED A31280AD-481E-41B6-95E8-127F4C984779 PROCESSING_REQUIRED = TRUE {
+ PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi
+ UI STRING="$(MODULE_NAME)" Optional
+ }
+ }
+
+[Rule.Common.DXE_CORE]
+ FILE DXE_CORE = $(NAMED_GUID) {
+ PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi
+ UI STRING="$(MODULE_NAME)" Optional
+ }
+
+
+[Rule.Common.UEFI_DRIVER]
+ FILE DRIVER = $(NAMED_GUID) {
+ DXE_DEPEX DXE_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex
+ PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi
+ UI STRING="$(MODULE_NAME)" Optional
+ }
+
+[Rule.Common.DXE_DRIVER]
+ FILE DRIVER = $(NAMED_GUID) {
+ DXE_DEPEX DXE_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex
+ PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi
+ UI STRING="$(MODULE_NAME)" Optional
+ }
+
+[Rule.Common.DXE_RUNTIME_DRIVER]
+ FILE DRIVER = $(NAMED_GUID) {
+ DXE_DEPEX DXE_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex
+ PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi
+ UI STRING="$(MODULE_NAME)" Optional
+ }
+
+[Rule.Common.UEFI_APPLICATION]
+ FILE APPLICATION = $(NAMED_GUID) {
+ UI STRING ="$(MODULE_NAME)" Optional
+ PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi
+ }
+
+[Rule.Common.UEFI_DRIVER.BINARY]
+ FILE DRIVER = $(NAMED_GUID) {
+ DXE_DEPEX DXE_DEPEX Optional |.depex
+ PE32 PE32 |.efi
+ UI STRING="$(MODULE_NAME)" Optional
+ VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER)
+ }
+
+[Rule.Common.UEFI_APPLICATION.BINARY]
+ FILE APPLICATION = $(NAMED_GUID) {
+ PE32 PE32 |.efi
+ UI STRING="$(MODULE_NAME)" Optional
+ VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER)
+ }
diff --git a/Platform/NXP/NxpQoriqLs.dec b/Platform/NXP/NxpQoriqLs.dec
new file mode 100644
index 0000000..550dbd6
--- /dev/null
+++ b/Platform/NXP/NxpQoriqLs.dec
@@ -0,0 +1,257 @@
+# @file.
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials are licensed and made available under
+# the terms and conditions of the BSD License which accompanies this distribution.
+# The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+[Defines]
+ DEC_SPECIFICATION = 0x00010005
+ PACKAGE_VERSION = 0.1
+
+[Includes]
+ .
+ Include
+
+[Guids.common]
+ gNxpQoriqLsTokenSpaceGuid = {0x98657342, 0x4aee, 0x4fc6, {0xbc, 0xb5, 0xff, 0x45, 0xb7, 0xa8, 0x71, 0xf2}}
+
+[PcdsFixedAtBuild.common]
+ #
+ # Pcds for I2C Controller
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdI2cBus|0|UINT32|0x00000001
+ gNxpQoriqLsTokenSpaceGuid.PcdI2cSpeed|0|UINT32|0x00000002
+ gNxpQoriqLsTokenSpaceGuid.PcdNumI2cController|0|UINT32|0x00000003
+
+ #
+ # Pcds for RTC device
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdRtcI2cBus|0|UINT32|0x00000005
+ gNxpQoriqLsTokenSpaceGuid.PcdRTCI2cAddress|0|UINT32|0x00000006
+ gNxpQoriqLsTokenSpaceGuid.PcdDs3231I2cAddress|0|UINT32|0x00000007
+ gNxpQoriqLsTokenSpaceGuid.PcdDs1307I2cAddress|0|UINT32|0x00000008
+ gNxpQoriqLsTokenSpaceGuid.PcdPcf2129I2cAddress|0|UINT32|0x00000009
+
+ #
+ # Pcds for base address and size
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdGutsBaseAddr|0x0|UINT64|0x00000100
+ gNxpQoriqLsTokenSpaceGuid.PcdPiFdSize|0x0|UINT32|0x00000101
+ gNxpQoriqLsTokenSpaceGuid.PcdPiFdBaseAddress|0x0|UINT64|0x00000102
+ gNxpQoriqLsTokenSpaceGuid.PcdDspiBaseAddr|0|UINT64|0x00000103
+ gNxpQoriqLsTokenSpaceGuid.PcdClkBaseAddr|0x0|UINT64|0x00000104
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog1BaseAddr|0x0|UINT64|0x00000105
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog2BaseAddr|0x0|UINT64|0x00000106
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog3BaseAddr|0x0|UINT64|0x00000107
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog4BaseAddr|0x0|UINT64|0x00000108
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog5BaseAddr|0x0|UINT64|0x00000109
+ gNxpQoriqLsTokenSpaceGuid.PcdDdrBaseAddr|0x0|UINT64|0x0000010A
+ gNxpQoriqLsTokenSpaceGuid.PcdSdxcBaseAddr|0|UINT64|0x0000010B
+ gNxpQoriqLsTokenSpaceGuid.PcdScfgBaseAddr|0|UINT64|0x0000010C
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c0BaseAddr|0|UINT64|0x0000010D
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c1BaseAddr|0|UINT64|0x0000010E
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c2BaseAddr|0|UINT64|0x0000010F
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c3BaseAddr|0|UINT64|0x00000110
+ gNxpQoriqLsTokenSpaceGuid.PcdSataController1BaseAddress|0x0|UINT32|0x00000111
+ gNxpQoriqLsTokenSpaceGuid.PcdSataController2BaseAddress|0x0|UINT32|0x00000112
+ gNxpQoriqLsTokenSpaceGuid.PcdQmanSwpBaseAddr|0x0500000000|UINT64|0x00000113
+ gNxpQoriqLsTokenSpaceGuid.PcdQmanSwpSize|0x0080000000|UINT64|0x00000114
+ gNxpQoriqLsTokenSpaceGuid.PcdBmanSwpBaseAddr|0x0508000000|UINT64|0x00000115
+ gNxpQoriqLsTokenSpaceGuid.PcdBmanSwpSize|0x0080000000|UINT64|0x00000116
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp1BaseAddr|0x0|UINT64|0x00000117
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp1BaseSize|0x0|UINT64|0x00000118
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp2BaseAddr|0x0|UINT64|0x00000119
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp2BaseSize|0x0|UINT64|0x0000011A
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp3BaseAddr|0x0|UINT64|0x0000011B
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp3BaseSize|0x0|UINT64|0x0000011C
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp4BaseAddr|0x3800000000|UINT64|0x000011D
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp4BaseSize|0x800000000|UINT64|0x000011E
+ gNxpQoriqLsTokenSpaceGuid.PcdDram1BaseAddr|0x0080000000|UINT64|0x0000011F
+ gNxpQoriqLsTokenSpaceGuid.PcdDram1Size|0x0080000000|UINT64|0x00000120
+ gNxpQoriqLsTokenSpaceGuid.PcdDram2BaseAddr|0x0880000000|UINT64|0x00000121
+ gNxpQoriqLsTokenSpaceGuid.PcdDram2Size|0x0780000000|UINT64|0x00000122
+ gNxpQoriqLsTokenSpaceGuid.PcdDram3BaseAddr|0x8800000000|UINT64|0x00000123
+ gNxpQoriqLsTokenSpaceGuid.PcdDram3Size|0x7800000000|UINT64|0x00000124
+ gNxpQoriqLsTokenSpaceGuid.PcdQspiRegionBaseAddr|0x40000000|UINT64|0x00000125
+ gNxpQoriqLsTokenSpaceGuid.PcdQspiRegionSize|0x20000000|UINT64|0x00000126
+ gNxpQoriqLsTokenSpaceGuid.PcdQspiRegion2BaseAddr|0x0|UINT64|0x00000127
+ gNxpQoriqLsTokenSpaceGuid.PcdQspiRegion2Size|0x0|UINT64|0x00000128
+ gNxpQoriqLsTokenSpaceGuid.PcdSystemMemoryExBase|0|UINT64|0x00000129
+ gNxpQoriqLsTokenSpaceGuid.PcdSystemMemoryExSize|0|UINT64|0x0000012A
+ gNxpQoriqLsTokenSpaceGuid.PcdUsbBaseAddr|0|UINT32|0x0000012B
+ gNxpQoriqLsTokenSpaceGuid.PcdUsbSize|0|UINT32|0x0000012C
+ gNxpQoriqLsTokenSpaceGuid.PcdCcsrBaseAddr|0x01000000|UINT64|0x0000012D
+ gNxpQoriqLsTokenSpaceGuid.PcdCcsrSize|0x0F000000|UINT64|0x0000012E
+ gNxpQoriqLsTokenSpaceGuid.PcdDramMemSize|0x0|UINT64|0x0000012F
+
+ #
+ # DSPI Pcds
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdDspiSpeed|0|UINT32|0x00000150
+ gNxpQoriqLsTokenSpaceGuid.PcdDspiMode|0|UINT32|0x00000151
+ gNxpQoriqLsTokenSpaceGuid.PcdDspiBusNumber|0|UINT32|0x00000152
+ gNxpQoriqLsTokenSpaceGuid.PcdDspiCs|0|UINT32|0x00000153
+
+ #
+ # IFC PCDs
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion1BaseAddr|0x60000000|UINT64|0x00000190
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion1Size|0x20000000|UINT64|0x00000191
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion2BaseAddr|0x0620000000|UINT64|0x00000192
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion2Size|0x00E0000000|UINT64|0x00000193
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcNandReservedSize|0x0|UINT32|0x00000194
+ gNxpQoriqLsTokenSpaceGuid.PcdFlashDeviceBase64|0x0|UINT64|0x00000195
+ gNxpQoriqLsTokenSpaceGuid.PcdFlashReservedRegionBase64|0x0|UINT64|0x00000196
+
+ #
+ # PCI PCDs
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdPciMaxPayloadFixup|FALSE|BOOLEAN|0x000001C0
+ gNxpQoriqLsTokenSpaceGuid.PcdKludgeMapPciMmioAsCached|FALSE|BOOLEAN|0x000001C1
+ gNxpQoriqLsTokenSpaceGuid.PcdPciBusMin|0|UINT64|0x000001C2
+ gNxpQoriqLsTokenSpaceGuid.PcdPciBusMax|255|UINT64|0x000001C3
+ gNxpQoriqLsTokenSpaceGuid.PcdPci1Mmio64Base|0x0|UINT64|0x000001C4
+ gNxpQoriqLsTokenSpaceGuid.PcdPci2Mmio64Base|0x0|UINT64|0x000001C5
+ gNxpQoriqLsTokenSpaceGuid.PcdPci3Mmio64Base|0x0|UINT64|0x000001C6
+ gNxpQoriqLsTokenSpaceGuid.PcdPci4Mmio64Base|0x0|UINT64|0x000001C7
+ gNxpQoriqLsTokenSpaceGuid.PcdPciMmio64Size|0x0|UINT64|0x000001C8
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp1SysAddr|0x0|UINT64|0x000001C9
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp2SysAddr|0x0|UINT64|0x000001CA
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp3SysAddr|0x0|UINT64|0x000001CB
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp4SysAddr|0x0|UINT64|0x000001CC
+ gNxpQoriqLsTokenSpaceGuid.PcdPciDebug|FALSE|BOOLEAN|0x000001CD
+ gNxpQoriqLsTokenSpaceGuid.PcdNumPciController|0|UINT32|0x000001CE
+ gNxpQoriqLsTokenSpaceGuid.PcdPciMemOneTransaction|0x0|UINT64|0x000001CF
+ gNxpQoriqLsTokenSpaceGuid.PcdPcieLutBase|0x0|UINT64|0x000001D0
+ gNxpQoriqLsTokenSpaceGuid.PcdPcieLutDbg|0x0|UINT64|0x000001D1
+
+ #
+ # NV Pcd
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdNvFdBase|0x0|UINT64|0x00000210
+ gNxpQoriqLsTokenSpaceGuid.PcdNvFdSize|0x0|UINT64|0x00000211
+
+ #
+ # QSPI PCDs
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdQspiFdtCompatible|""|VOID*|0x00000220
+ gNxpQoriqLsTokenSpaceGuid.PcdFdtAddress|0|UINT64|0x00000221
+
+ #
+ # Platform PCDs
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdPlatformFreqDiv|0|UINT32|0x00000250
+ gNxpQoriqLsTokenSpaceGuid.PcdSerdes2Enabled|FALSE|BOOLEAN|0x00000251
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcNorEnabled|0x0|UINT64|0x00000252
+ gNxpQoriqLsTokenSpaceGuid.PcdMuxToUsb3|FALSE|BOOLEAN|0x00000253
+
+ #
+ # Erratum PCDs
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdI2cErratumA009203|FALSE|BOOLEAN|0x00000270
+ gNxpQoriqLsTokenSpaceGuid.PcdUsbErratumA009007|FALSE|BOOLEAN|0x00000271
+ gNxpQoriqLsTokenSpaceGuid.PcdErratumA008751|FALSE|BOOLEAN|0x00000272
+ gNxpQoriqLsTokenSpaceGuid.PcdErratumA009008|FALSE|BOOLEAN|0x00000273
+ gNxpQoriqLsTokenSpaceGuid.PcdErratumA009798|FALSE|BOOLEAN|0x00000274
+ gNxpQoriqLsTokenSpaceGuid.PcdErratumA008514|FALSE|BOOLEAN|0x00000275
+ gNxpQoriqLsTokenSpaceGuid.PcdErratumA008336|FALSE|BOOLEAN|0x00000276
+ gNxpQoriqLsTokenSpaceGuid.PcdSataErratumA009185|FALSE|BOOLEAN|0x00000277
+
+ #
+ # Test PCDs
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdDspiTest|FALSE|BOOLEAN|0x00000290
+
+ #
+ # Clock PCDs
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdSysClk|0x0|UINT64|0x000002A0
+ gNxpQoriqLsTokenSpaceGuid.PcdDdrClk|0x0|UINT64|0x000002A1
+
+ #
+ # DPAA1 PCDs
+ #
+ # Valid values for PcdDpaa1DebugFlags:
+ # - 0x1 Enable DPAA1 debugging messages
+ # - 0x2 Dump values of RAM words or registers
+ # - 0x4 Perform extra checks
+ # - 0x8 Trace sent/received network packets
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa1Initialize|FALSE|BOOLEAN|0x000002B0
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa1DebugFlags|0x0|UINT32|0x000002B1
+ gNxpQoriqLsTokenSpaceGuid.PcdFManFwFlashAddr|0x0|UINT32|0x000002B2
+ gNxpQoriqLsTokenSpaceGuid.PcdSgmiiPrtclInit|FALSE|BOOLEAN|0x000002B3
+ #
+ # Bit mask to indicate the DPAA1 MEMACs to be used.
+ # MeMaci is selected to be used, if bit 'i - 1' is set in the bit mask,
+ # where i is the range '1 .. #Memacs'. For example, if we want MEMAC5
+ # to be used, the value of the mask needs to be 0x10 (bit 4 set)
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa1UsedMemacsMask|0x0|UINT64|0x000002B4
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa1FmanMdio1Addr|0x0|UINT64|0x000002B5
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa1FmanMdio2Addr|0x0|UINT64|0x000002B6
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa1FmanAddr|0x0|UINT64|0x000002B7
+
+ #
+ # DPAA2 PCDs
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McPortalBaseAddr|0x0|UINT64|0x000002D0
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McPortalSize|0x0|UINT64|0x000002D1
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2NiPortalsBaseAddr|0x0|UINT64|0x000002D2
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2NiPortalsSize|0x0|UINT64|0x000002D3
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2QBmanPortalsBaseAddr|0x0|UINT64|0x000002D4
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2QBmanPortalSize|0x0|UINT64|0x000002D5
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2QBmanPortalsCacheSize|0x0|UINT64|0x000002D6
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McRamSize|0x0|UINT64|0x000002D7
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2Initialize|FALSE|BOOLEAN|0x000002D8
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McFwSrc|0x0|UINT8|0x000002D9
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McFwNorAddr|0x0|UINT64|0x000002DA
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McDpcNorAddr|0x0|UINT64|0x000002DB
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McDplNorAddr|0x0|UINT64|0x000002DC
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McDpcMaxLen|0x0|UINT32|0x000002DD
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McDpcMcDramOffset|0x0|UINT32|0x000002DE
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McDplMaxLen|0x0|UINT32|0x000002DF
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McDplMcDramOffset|0x0|UINT32|0x000002E0
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McPrivateRamSize|0x0|UINT32|0x000002E1
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2StreamIdStart|0x0|UINT32|0x000002E2
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2StreamIdEnd|0x0|UINT32|0x000002E3
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McBootTimeoutMs|0x0|UINT32|0x000002E4
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McLogMcDramOffset|0x0|UINT32|0x000002E5
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McLogLevel|0x0|UINT8|0x000002E6
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2DebugFlags|0x0|UINT32|0x000002E7
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2CortinaFwSrc|0x0|UINT8|0x000002E8
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2CortinaFwNorAddr|0x0|UINT64|0x000002E9
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2CortinaFwMaxLen|0x0|UINT32|0x000002EA
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2UsedDpmacsMask|0x0|UINT64|0x000002EB
+ gNxpQoriqLsTokenSpaceGuid.PcdMacDeviceDisableRegAddr|0x0|UINT64|0x000002EC
+ gNxpQoriqLsTokenSpaceGuid.PcdBypassAmqMask|0x0|UINT32|0x000002ED
+ gNxpQoriqLsTokenSpaceGuid.PcdMdioBustCount|0x0|UINT8|0x000002EE
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2Wriop1Mdio1Addr|0x0|UINT64|0x000002EF
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2Wriop1Mdio2Addr|0x0|UINT64|0x000002F0
+
+ #
+ # USB Pcds
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdNumUsbController|0|UINT32|0x00000300
+
+ #
+ # Pcds to support Big Endian IPs
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdMmcBigEndian|FALSE|BOOLEAN|0x0000310
+ gNxpQoriqLsTokenSpaceGuid.PcdGurBigEndian|FALSE|BOOLEAN|0x0000311
+ gNxpQoriqLsTokenSpaceGuid.PcdPciLutBigEndian|FALSE|BOOLEAN|0x00000312
+ gNxpQoriqLsTokenSpaceGuid.PcdWdogBigEndian|FALSE|BOOLEAN|0x00000313
+
+ #
+ # System ID Eeprom Pcds
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdSysEepromI2cBus|0|UINT32|0x0000330
+ gNxpQoriqLsTokenSpaceGuid.PcdSysEepromI2cAddress|0|UINT32|0x0000331
diff --git a/Platform/NXP/NxpQoriqLs.dsc b/Platform/NXP/NxpQoriqLs.dsc
new file mode 100644
index 0000000..8bf65a6
--- /dev/null
+++ b/Platform/NXP/NxpQoriqLs.dsc
@@ -0,0 +1,453 @@
+# @file
+#
+# Copyright (c) 2017 NXP.
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+################################################################################
+#
+# Defines Section - statements that will be processed to create a Makefile.
+#
+################################################################################
+[Defines]
+ #
+ # Defines for default states. These can be changed on the command line.
+ # -D FLAG=VALUE
+ #
+ PLATFORM_VERSION = 0.1
+ DSC_SPECIFICATION = 0x00010005
+ SUPPORTED_ARCHITECTURES = AARCH64
+ BUILD_TARGETS = DEBUG|RELEASE
+ SKUID_IDENTIFIER = DEFAULT
+
+[LibraryClasses.common]
+ ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf
+ ArmMmuLib|ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf
+ ArmSmcLib|ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf
+ ArmGenericTimerCounterLib|ArmPkg/Library/ArmGenericTimerPhyCounterLib/ArmGenericTimerPhyCounterLib.inf
+ TimerLib|ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf
+ ArmTrustZoneLib|ArmPlatformPkg/Drivers/ArmTrustZone/ArmTrustZone.inf
+ ArmPlatformStackLib|ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.inf
+ HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf
+ UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf
+ FileExplorerLib|MdeModulePkg/Library/FileExplorerLib/FileExplorerLib.inf
+ BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf
+ PlatformBootManagerLib|ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
+ DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
+ UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
+ CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf
+
+ # Networking Requirements
+ NetLib|MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf
+ DpcLib|MdeModulePkg/Library/DxeDpcLib/DxeDpcLib.inf
+ UdpIoLib|MdeModulePkg/Library/DxeUdpIoLib/DxeUdpIoLib.inf
+ IpIoLib|MdeModulePkg/Library/DxeIpIoLib/DxeIpIoLib.inf
+
+ # ARM GIC400 General Interrupt Driver
+ ArmGicLib|ArmPkg/Drivers/ArmGic/ArmGicLib.inf
+ ArmGicArchLib|ArmPkg/Library/ArmGicArchLib/ArmGicArchLib.inf
+ DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
+ DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf
+ MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
+ BaseLib|MdePkg/Library/BaseLib/BaseLib.inf
+ SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf
+ BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
+ PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf
+ PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
+ EfiFileLib|EmbeddedPkg/Library/EfiFileLib/EfiFileLib.inf
+ PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
+ PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
+ PeCoffExtraActionLib|ArmPkg/Library/DebugPeCoffExtraActionLib/DebugPeCoffExtraActionLib.inf
+ CacheMaintenanceLib|ArmPkg/Library/ArmCacheMaintenanceLib/ArmCacheMaintenanceLib.inf
+ DefaultExceptionHandlerLib|ArmPkg/Library/DefaultExceptionHandlerLib/DefaultExceptionHandlerLib.inf
+ CpuExceptionHandlerLib|ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.inf
+ PrePiLib|EmbeddedPkg/Library/PrePiLib/PrePiLib.inf
+ SemihostLib|ArmPkg/Library/SemihostLib/SemihostLib.inf
+ IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf
+ MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
+ UefiLib|MdePkg/Library/UefiLib/UefiLib.inf
+ HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
+ UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf
+ DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf
+ UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf
+ DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf
+ UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
+ UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
+ PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
+ UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf
+ CpuLib|MdePkg/Library/BaseCpuLib/BaseCpuLib.inf
+ ArmDisassemblerLib|ArmPkg/Library/ArmDisassemblerLib/ArmDisassemblerLib.inf
+ DebugAgentLib|MdeModulePkg/Library/DebugAgentLibNull/DebugAgentLibNull.inf
+ DmaLib|EmbeddedPkg/Library/NonCoherentDmaLib/NonCoherentDmaLib.inf
+ BdsLib|ArmPkg/Library/BdsLib/BdsLib.inf
+ FdtLib|EmbeddedPkg/Library/FdtLib/FdtLib.inf
+ ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
+ ShellCommandLib|ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf
+ FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
+ ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf
+ SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
+ NetLib|MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf
+ HandleParsingLib|ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf
+ BcfgCommandLib|ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.inf
+ TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf
+ AuthVariableLib|MdeModulePkg/Library/AuthVariableLibNull/AuthVariableLibNull.inf
+ VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
+ NULL|MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf
+ CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
+
+[LibraryClasses.common.SEC]
+ PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
+ ReportStatusCodeLib|IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf
+ UefiDecompressLib|MdePkg/Library/BaseUefiDecompressLib/BaseUefiDecompressLib.inf
+ ExtractGuidedSectionLib|EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.inf
+ LzmaDecompressLib|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
+ PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
+ HobLib|EmbeddedPkg/Library/PrePiHobLib/PrePiHobLib.inf
+ PrePiHobListPointerLib|ArmPlatformPkg/Library/PrePiHobListPointerLib/PrePiHobListPointerLib.inf
+ MemoryAllocationLib|EmbeddedPkg/Library/PrePiMemoryAllocationLib/PrePiMemoryAllocationLib.inf
+ PerformanceLib|MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.inf
+ PlatformPeiLib|ArmPlatformPkg/PlatformPei/PlatformPeiLib.inf
+ MemoryInitPeiLib|ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.inf
+
+ # 1/123 faster than Stm or Vstm version
+ BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
+
+ # Uncomment to turn on GDB stub in SEC.
+ #DebugAgentLib|EmbeddedPkg/Library/GdbDebugAgent/GdbDebugAgent.inf
+
+[LibraryClasses.common.PEIM]
+ PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf
+ PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf
+ PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf
+ PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf
+ HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf
+ MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf
+
+[LibraryClasses.common.DXE_CORE]
+ HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf
+ MemoryAllocationLib|MdeModulePkg/Library/DxeCoreMemoryAllocationLib/DxeCoreMemoryAllocationLib.inf
+ DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf
+ ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
+ ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf
+ UefiDecompressLib|MdePkg/Library/BaseUefiDecompressLib/BaseUefiDecompressLib.inf
+ DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
+ PeCoffLib|EmbeddedPkg/Library/DxeHobPeCoffLib/DxeHobPeCoffLib.inf
+ PerformanceLib|MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf
+
+[LibraryClasses.common.DXE_DRIVER]
+ ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
+ DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
+ SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf
+ PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf
+ MemoryInitPeiLib|ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.inf
+
+[LibraryClasses.common.UEFI_APPLICATION]
+ PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
+ HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
+ ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
+ UefiDecompressLib|IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLib.inf
+ PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf
+
+[LibraryClasses.common.UEFI_DRIVER]
+ ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
+ UefiDecompressLib|IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLib.inf
+ ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf
+ PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf
+ DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
+
+[LibraryClasses.common.DXE_RUNTIME_DRIVER]
+ HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
+ MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
+ ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
+ CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
+ PeCoffLib|EmbeddedPkg/Library/DxeHobPeCoffLib/DxeHobPeCoffLib.inf
+
+[LibraryClasses.AARCH64]
+ #
+ # It is not possible to prevent the ARM compiler for generic intrinsic functions.
+ # This library provides the instrinsic functions generate by a given compiler.
+ # [LibraryClasses.ARM] and NULL mean link this library into all ARM images.
+ #
+ NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
+
+[BuildOptions]
+ XCODE:*_*_ARM_PLATFORM_FLAGS == -arch armv7
+ GCC:*_*_ARM_PLATFORM_FLAGS == -march=armv7-a
+ RVCT:*_*_ARM_PLATFORM_FLAGS == --cpu cortex-a9
+
+[BuildOptions.common.EDKII.DXE_RUNTIME_DRIVER]
+ GCC:*_*_ARM_DLINK_FLAGS = -z common-page-size=0x1000
+ GCC:*_*_AARCH64_DLINK_FLAGS = -z common-page-size=0x10000
+
+################################################################################
+#
+# Pcd Section - list of all EDK II PCD Entries defined by this Platform
+#
+################################################################################
+
+[PcdsFeatureFlag.common]
+ ## If TRUE, Graphics Output Protocol will be installed on virtual handle created by ConsplitterDxe.
+ # It could be set FALSE to save size.
+ gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE
+ gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|FALSE
+ gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|TRUE
+ gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnosticsDisable|TRUE
+ gEfiMdePkgTokenSpaceGuid.PcdComponentName2Disable|TRUE
+ gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnostics2Disable|TRUE
+
+ #
+ # Control what commands are supported from the UI
+ # Turn these on and off to add features or save size
+ #
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedMacBoot|TRUE
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedDirCmd|TRUE
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedHobCmd|TRUE
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedHwDebugCmd|TRUE
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedPciDebugCmd|TRUE
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedIoEnable|FALSE
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedScriptCmd|FALSE
+ gEmbeddedTokenSpaceGuid.PcdCacheEnable|TRUE
+
+ # Use the Vector Table location in CpuDxe. We will not copy the Vector Table at PcdCpuVectorBaseAddress
+ gArmTokenSpaceGuid.PcdRelocateVectorTable|FALSE
+ gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob|TRUE
+ gArmTokenSpaceGuid.PcdCpuDxeProduceDebugSupport|FALSE
+ gEfiMdeModulePkgTokenSpaceGuid.PcdTurnOffUsbLegacySupport|TRUE
+
+[PcdsDynamicDefault.common]
+ #
+ # Set video resolution for boot options and for text setup.
+ # PlatformDxe can set the former at runtime.
+ #
+ gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution|800
+ gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution|600
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution|640
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution|480
+
+[PcdsDynamicHii.common.DEFAULT]
+ gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|L"Timeout"|gEfiGlobalVariableGuid|0x0|10
+
+[PcdsFixedAtBuild.common]
+ gEmbeddedTokenSpaceGuid.PcdMetronomeTickPeriod|1000
+ gEmbeddedTokenSpaceGuid.PcdTimerPeriod|10000 # expressed in 100ns units, 100,000 x 100 ns = 10,000,000 ns = 10 ms
+ gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x2000
+ gEfiMdeModulePkgTokenSpaceGuid.PcdMaxAuthVariableSize|0x2800
+ gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange|FALSE
+ gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile|{ 0x21, 0xaa, 0x2c, 0x46, 0x14, 0x76, 0x03, 0x45, 0x83, 0x6e, 0x8a, 0xb6, 0xf4, 0x66, 0x23, 0x31 }
+ gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdShellFile|{ 0x83, 0xA5, 0x04, 0x7C, 0x3E, 0x9E, 0x1C, 0x4F, 0xAD, 0x65, 0xE0, 0x52, 0x68, 0xD0, 0xB4, 0xD1 }
+ gArmPlatformTokenSpaceGuid.PcdCoreCount|1 # Only one core
+ gEfiMdePkgTokenSpaceGuid.PcdMaximumUnicodeStringLength|1000000
+ gEfiMdePkgTokenSpaceGuid.PcdMaximumAsciiStringLength|2000000
+ gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|1000000
+ gEfiMdePkgTokenSpaceGuid.PcdSpinLockTimeout|10000000
+ gEfiMdePkgTokenSpaceGuid.PcdDebugClearMemoryValue|0xAF
+ gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask|1
+ gEfiMdePkgTokenSpaceGuid.PcdPostCodePropertyMask|0
+ gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|320
+
+!if $(TARGET) == RELEASE
+ gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x27
+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x81000000
+!else
+ gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x2F
+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x81000044
+!endif
+
+ gEfiMdePkgTokenSpaceGuid.PcdReportStatusCodePropertyMask|0x07
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedAutomaticBootCommand|""
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedDefaultTextColor|0x07
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedMemVariableStoreSize|0x10000
+
+ #
+ # Optional feature to help prevent EFI memory map fragments
+ # Turned on and off via: PcdPrePiProduceMemoryTypeInformationHob
+ # Values are in EFI Pages (4K). DXE Core will make sure that
+ # at least this much of each type of memory can be allocated
+ # from a single memory range. This way you only end up with
+ # maximum of two fragements for each type in the memory map
+ # (the memory used, and the free memory that was prereserved
+ # but not used).
+ #
+ gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiACPIReclaimMemory|0
+ gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiACPIMemoryNVS|0
+ gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiReservedMemoryType|0
+ gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesData|80
+ gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesCode|40
+ gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiBootServicesCode|400
+ gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiBootServicesData|3000
+ gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiLoaderCode|10
+ gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiLoaderData|0
+
+ # Serial Terminal
+ gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate|115200
+ gEfiMdePkgTokenSpaceGuid.PcdDefaultTerminalType|4
+
+ # Size of the region reserved for fixed address allocations (Reserved 32MB)
+ gArmTokenSpaceGuid.PcdArmLinuxKernelMaxOffset|0x08000000
+ gArmTokenSpaceGuid.PcdArmLinuxFdtMaxOffset|0x08000000
+ gArmTokenSpaceGuid.PcdArmLinuxFdtAlignment|0x0
+ gArmTokenSpaceGuid.PcdCpuVectorBaseAddress|0x94A00000
+ gArmTokenSpaceGuid.PcdCpuResetAddress|0x94A00000
+
+ # Timer
+ gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz|0
+
+ # We want to use the Shell Libraries but don't want it to initialise
+ # automatically. We initialise the libraries when the command is called by the
+ # Shell.
+ gEfiShellPkgTokenSpaceGuid.PcdShellLibAutoInitialize|FALSE
+
+ # Use the serial console for both ConIn & ConOut
+ gArmPlatformTokenSpaceGuid.PcdDefaultConOutPaths|L"VenHw(D3987D4B-971A-435F-8CAF-4967EB627241)/Uart(115200,8,N,1)/VenPcAnsi();"
+ gArmPlatformTokenSpaceGuid.PcdDefaultConInPaths|L"VenHw(D3987D4B-971A-435F-8CAF-4967EB627241)/Uart(115200,8,N,1)/VenPcAnsi()"
+ gEfiShellPkgTokenSpaceGuid.PcdShellLibAutoInitialize|FALSE
+ gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|16000
+!ifdef $(NO_SHELL_PROFILES)
+ gEfiShellPkgTokenSpaceGuid.PcdShellProfileMask|0x00
+!endif #$(NO_SHELL_PROFILES)
+
+################################################################################
+#
+# Components Section - list of all EDK II Modules needed by this Platform
+#
+################################################################################
+[Components.common]
+ #
+ # SEC
+ #
+ ArmPlatformPkg/PrePi/PeiUniCore.inf
+ MdeModulePkg/Universal/PCD/Pei/Pcd.inf {
+ <LibraryClasses>
+ PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
+ }
+
+ #
+ # DXE
+ #
+ MdeModulePkg/Core/Dxe/DxeMain.inf {
+ <LibraryClasses>
+ NULL|MdeModulePkg/Library/DxeCrc32GuidedSectionExtractLib/DxeCrc32GuidedSectionExtractLib.inf
+ NULL|EmbeddedPkg/Library/LzmaHobCustomDecompressLib/LzmaHobCustomDecompressLib.inf
+ }
+ MdeModulePkg/Universal/PCD/Dxe/Pcd.inf {
+ <LibraryClasses>
+ PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
+ }
+
+ #
+ # Architectural Protocols
+ #
+ ArmPkg/Drivers/CpuDxe/CpuDxe.inf
+ MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
+ MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
+ MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf
+ MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDxe.inf
+ EmbeddedPkg/ResetRuntimeDxe/ResetRuntimeDxe.inf
+ EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf
+ EmbeddedPkg/EmbeddedMonotonicCounter/EmbeddedMonotonicCounter.inf
+
+ # FDT installation
+ EmbeddedPkg/Drivers/FdtPlatformDxe/FdtPlatformDxe.inf
+ MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
+ MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
+ MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
+ MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
+ MdeModulePkg/Universal/SerialDxe/SerialDxe.inf
+ MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
+ EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf
+ ArmPkg/Drivers/TimerDxe/TimerDxe.inf
+ ArmPkg/Drivers/ArmGic/ArmGicDxe.inf
+ EmbeddedPkg/SimpleTextInOutSerial/SimpleTextInOutSerial.inf
+
+ #
+ # Networking stack
+ #
+ MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf
+ MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf
+ MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf
+ MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf
+ MdeModulePkg/Universal/Network/ArpDxe/ArpDxe.inf
+ MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf
+ MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf
+ MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf
+ MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf
+ MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf
+ MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
+!if $(NETWORK_IP6_ENABLE) == TRUE
+ NetworkPkg/Ip6Dxe/Ip6Dxe.inf
+ NetworkPkg/TcpDxe/TcpDxe.inf
+ NetworkPkg/Udp6Dxe/Udp6Dxe.inf
+ NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf
+ NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf
+ NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf
+!else
+ MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf
+!endif
+
+ #
+ # FAT filesystem + GPT/MBR partitioning
+ #
+ MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
+ MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
+ MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
+ FatPkg/FatPei/FatPei.inf
+ FatPkg/EnhancedFatDxe/Fat.inf
+
+ #
+ # Bds
+ #
+ MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
+ MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
+ MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf
+ MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
+ MdeModulePkg/Application/UiApp/UiApp.inf {
+ <LibraryClasses>
+ NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf
+ NULL|MdeModulePkg/Library/BootManagerUiLib/BootManagerUiLib.inf
+ NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf
+ }
+ MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
+
+ #
+ # Example Application
+ #
+ MdeModulePkg/Application/HelloWorld/HelloWorld.inf
+ ShellPkg/Library/UefiShellLib/UefiShellLib.inf
+ ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf
+ ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.inf
+ ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf
+ ShellPkg/Library/UefiDpLib/UefiDpLib.inf {
+ <LibraryClasses>
+ TimerLib|MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.inf
+ PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf
+ DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
+ }
+ ShellPkg/Application/Shell/Shell.inf {
+ <LibraryClasses>
+ NULL|ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.inf
+ NULL|ShellPkg/Library/UefiShellLevel1CommandsLib/UefiShellLevel1CommandsLib.inf
+ NULL|ShellPkg/Library/UefiShellLevel3CommandsLib/UefiShellLevel3CommandsLib.inf
+!ifndef $(NO_SHELL_PROFILES)
+ NULL|ShellPkg/Library/UefiShellDriver1CommandsLib/UefiShellDriver1CommandsLib.inf
+ NULL|ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.inf
+ NULL|ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf
+ NULL|ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
+ NULL|ShellPkg/Library/UefiShellTftpCommandLib/UefiShellTftpCommandLib.inf
+!ifdef $(INCLUDE_DP)
+ NULL|ShellPkg/Library/UefiDpLib/UefiDpLib.inf
+!endif #$(INCLUDE_DP)
+!ifdef $(INCLUDE_TFTP_COMMAND)
+ NULL|ShellPkg/Library/UefiShellTftpCommandLib/UefiShellTftpCommandLib.inf
+!endif #$(INCLUDE_TFTP_COMMAND)
+!endif #$(NO_SHELL_PROFILES)
+ }
+
+ ##
diff --git a/Platform/NXP/Readme.md b/Platform/NXP/Readme.md
new file mode 100644
index 0000000..984ed8b
--- /dev/null
+++ b/Platform/NXP/Readme.md
@@ -0,0 +1,14 @@
+Support for all NXP boards is available in this directory.
+
+# How to build
+
+1. Source Environment file:
+ source Env.cshrc
+
+2. Build desired board
+ ./build.sh <board-name> <build-candidate> <clean> (optional)
+
+ board-name : LS1043 / LS1046 / LS2088
+ build-candidate : DEBUG / RELEASE
+
+Currently, support for LS1043 is provided.
diff --git a/Platform/NXP/build.sh b/Platform/NXP/build.sh
new file mode 100755
index 0000000..4e393d1
--- /dev/null
+++ b/Platform/NXP/build.sh
@@ -0,0 +1,100 @@
+#!/bin/bash
+
+# UEFI build script for NXP LS SoCs
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+
+# Global Defaults
+ARCH=AARCH64
+TARGET_TOOLS=`echo $GCC_ARCH_PREFIX | cut -d _ -f 1`
+BASE_DIR=../../..
+
+[ -z "$TARGET_TOOLS" ] && {
+ echo "TARGET_TOOLS not found. Please run \"source Env.cshrc\" ."
+ exit 1
+}
+
+print_usage_banner()
+{
+ echo ""
+ echo "This shell script expects:"
+ echo " Arg 1 (mandatory): Board Type (can be LS1043 / LS1046 / LS2088)."
+ echo " Arg 2 (mandatory): Build candidate (can be RELEASE or DEBUG). By
+ default we build the RELEASE candidate."
+ echo " Arg 3 (optional): clean - To do a 'make clean' operation."
+}
+
+# Check for total num of input arguments
+if [[ "$#" -gt 3 ]]; then
+ echo "Illegal number of parameters"
+ print_usage_banner
+ exit
+fi
+
+# Check for third parameter to be clean only
+if [[ "$3" && $3 != "clean" ]]; then
+ echo "Error ! Either clean or emplty"
+ print_usage_banner
+ exit
+fi
+
+# Check for input arguments
+if [[ $1 == "" || $2 == "" ]]; then
+ echo "Error !"
+ print_usage_banner
+ exit
+fi
+
+# Check for input arguments
+if [[ $1 != "LS1043" && $1 != "LS1046" && $1 != "LS2088" ]]; then
+ echo "Error ! Incorrect Board Type specified."
+ print_usage_banner
+ exit
+fi
+
+# Check for input arguments
+if [[ $2 != "RELEASE" ]]; then
+ if [[ $2 != "DEBUG" ]]; then
+ echo "Error ! Incorrect build target specified."
+ print_usage_banner
+ exit
+ fi
+fi
+
+PKG="aRdbPkg"
+
+echo ".........................................."
+echo "Welcome to $1$PKG UEFI Build environment"
+echo ".........................................."
+
+if [[ $3 == "clean" ]]; then
+ echo "Cleaning up the build directory '$BASE_DIR/Build/$1$PKG/'.."
+ rm -rf $BASE_DIR/Build/$1$PKG/*
+ exit
+fi
+
+# Clean-up
+set -e
+shopt -s nocasematch
+
+#
+# Setup workspace now
+#
+echo Initializing workspace
+cd $BASE_DIR
+
+# Use the BaseTools in edk2
+export EDK_TOOLS_PATH=`pwd`/BaseTools
+source edksetup.sh BaseTools
+
+
+build -p "$WORKSPACE/edk2-platforms/Platform/NXP/$1$PKG/$1$PKG.dsc" -a $ARCH -t $TARGET_TOOLS -b $2
diff --git a/Silicon/NXP/Chassis/Chassis2/Chassis2.dec b/Silicon/NXP/Chassis/Chassis2/Chassis2.dec
new file mode 100644
index 0000000..cf41b3c
--- /dev/null
+++ b/Silicon/NXP/Chassis/Chassis2/Chassis2.dec
@@ -0,0 +1,19 @@
+# @file
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials are licensed and made available under
+# the terms and conditions of the BSD License which accompanies this distribution.
+# The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+[Defines]
+ DEC_SPECIFICATION = 0x00010005
+
+[Includes]
+ .
diff --git a/Silicon/NXP/LS1043A/LS1043A.dec b/Silicon/NXP/LS1043A/LS1043A.dec
new file mode 100644
index 0000000..f14edb2
--- /dev/null
+++ b/Silicon/NXP/LS1043A/LS1043A.dec
@@ -0,0 +1,22 @@
+# LS1043A.dec
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials are licensed and made available under
+# the terms and conditions of the BSD License which accompanies this distribution.
+# The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+[Defines]
+ DEC_SPECIFICATION = 0x00010005
+
+[Guids.common]
+ gNxpLs1043ATokenSpaceGuid = {0x6834fe45, 0x4aee, 0x4fc6, {0xbc, 0xb5, 0xff, 0x45, 0xb7, 0xa8, 0x71, 0xf2}}
+
+[Includes]
+ Include
diff --git a/Silicon/NXP/LS1043A/LS1043A.dsc b/Silicon/NXP/LS1043A/LS1043A.dsc
new file mode 100644
index 0000000..78f8011
--- /dev/null
+++ b/Silicon/NXP/LS1043A/LS1043A.dsc
@@ -0,0 +1,82 @@
+# LS1043A.dsc
+# LS1043A Soc package.
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+################################################################################
+#
+# Pcd Section - list of all EDK II PCD Entries defined by this Platform
+#
+################################################################################
+[PcdsDynamicDefault.common]
+
+ #
+ # ARM General Interrupt Controller
+ gArmTokenSpaceGuid.PcdGicDistributorBase|0x01401000
+ gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase|0x01402000
+
+[PcdsFixedAtBuild.common]
+
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedPrompt|"LS1043a"
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase|0x021c0500
+
+ #
+ # LS1043a board Specific PCDs
+ # XX (DRAM - Region 1 2GB)
+ # (NOR - IFC Region 1 512MB)
+ gArmTokenSpaceGuid.PcdSystemMemoryBase|0x80000000
+ gArmTokenSpaceGuid.PcdSystemMemorySize|0x80000000
+ gArmPlatformTokenSpaceGuid.PcdSystemMemoryUefiRegionSize|0x02000000
+
+ #
+ # CCSR Address Space and other attached Memories
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdCcsrBaseAddr|0x01000000
+ gNxpQoriqLsTokenSpaceGuid.PcdCcsrSize|0x0F000000
+ gNxpQoriqLsTokenSpaceGuid.PcdClkBaseAddr|0x01EE1000
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion1BaseAddr|0x60000000
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion1Size|0x20000000
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion2BaseAddr|0x0620000000
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion2Size|0x00E0000000
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcNandReservedSize|0x2EA
+ gNxpQoriqLsTokenSpaceGuid.PcdQmanSwpBaseAddr|0x0500000000
+ gNxpQoriqLsTokenSpaceGuid.PcdQmanSwpSize|0x0080000000
+ gNxpQoriqLsTokenSpaceGuid.PcdBmanSwpBaseAddr|0x0508000000
+ gNxpQoriqLsTokenSpaceGuid.PcdBmanSwpSize|0x0080000000
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp1BaseAddr|0x4000000000
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp1BaseSize|0x800000000
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp2BaseAddr|0x4800000000
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp2BaseSize|0x800000000
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp3BaseAddr|0x5000000000
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp3BaseSize|0x800000000
+ gNxpQoriqLsTokenSpaceGuid.PcdDram1BaseAddr|0x0080000000
+ gNxpQoriqLsTokenSpaceGuid.PcdDram1Size|0x0080000000
+ gNxpQoriqLsTokenSpaceGuid.PcdDram2BaseAddr|0x0880000000
+ gNxpQoriqLsTokenSpaceGuid.PcdDram2Size|0x0780000000
+ gNxpQoriqLsTokenSpaceGuid.PcdDram3BaseAddr|0x8800000000
+ gNxpQoriqLsTokenSpaceGuid.PcdDram3Size|0x7800000000
+ gNxpQoriqLsTokenSpaceGuid.PcdScfgBaseAddr|0x1570000
+ gNxpQoriqLsTokenSpaceGuid.PcdGutsBaseAddr|0x01EE0000
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog1BaseAddr|0x02AD0000
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog2BaseAddr|0x02AE0000
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog3BaseAddr|0x02A70000
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog4BaseAddr|0x02A80000
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog5BaseAddr|0x02A90000
+ gNxpQoriqLsTokenSpaceGuid.PcdSdxcBaseAddr|0x01560000
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c0BaseAddr|0x02180000
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c1BaseAddr|0x02190000
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c2BaseAddr|0x021A0000
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c3BaseAddr|0x021B0000
+ gNxpQoriqLsTokenSpaceGuid.PcdNumI2cController|4
+
+##
--
1.9.1
^ permalink raw reply related [flat|nested] 39+ messages in thread
* [PATCH v2 1/9] Platform/NXP: Add support for Big Endian Mmio APIs
2017-11-07 14:42 [PATCH 00/10] edk2-platforms/Platform/NXP Meenakshi Aggarwal
` (9 preceding siblings ...)
2017-11-07 14:42 ` [PATCH 10/10] Compilation : Add the fdf, dsc and dec files Meenakshi Aggarwal
@ 2017-11-22 15:48 ` Meenakshi Aggarwal
2017-11-22 15:48 ` [PATCH v2 2/9] Platform/NXP : Add support for Watchdog driver Meenakshi Aggarwal
` (8 more replies)
10 siblings, 9 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-22 15:48 UTC (permalink / raw)
To: ard.biesheuvel, leif.lindholm, michael.d.kinney, edk2-devel
This library add supports for BE read/write and other
MMIO helper function.
In this data swapped after reading from MMIO and before
write using MMIO.
It can be used by any module with BE address space.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
---
Platform/NXP/Include/Library/BeIoLib.h | 332 +++++++++++++++++++++++++
Platform/NXP/Library/BeIoLib/BeIoLib.c | 400 +++++++++++++++++++++++++++++++
Platform/NXP/Library/BeIoLib/BeIoLib.inf | 31 +++
3 files changed, 763 insertions(+)
create mode 100644 Platform/NXP/Include/Library/BeIoLib.h
create mode 100644 Platform/NXP/Library/BeIoLib/BeIoLib.c
create mode 100644 Platform/NXP/Library/BeIoLib/BeIoLib.inf
diff --git a/Platform/NXP/Include/Library/BeIoLib.h b/Platform/NXP/Include/Library/BeIoLib.h
new file mode 100644
index 0000000..a58883a
--- /dev/null
+++ b/Platform/NXP/Include/Library/BeIoLib.h
@@ -0,0 +1,332 @@
+/** BeIoLib.h
+ *
+ * Copyright 2017 NXP
+ *
+ * This program and the accompanying materials
+ * are licensed and made available under the terms and conditions of the BSD License
+ * which accompanies this distribution. The full text of the license may be found at
+ * http://opensource.org/licenses/bsd-license.php
+ *
+ * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+ *
+ **/
+
+#ifndef __BE_IOLIB_H__
+#define __BE_IOLIB_H__
+
+#include <Base.h>
+
+/**
+ MmioRead8 for Big-Endian modules.
+
+ @param Address The MMIO register to read.
+
+ @return The value read.
+
+**/
+UINT8
+EFIAPI
+BeMmioRead8 (
+ IN UINTN Address
+ );
+
+/**
+ MmioRead16 for Big-Endian modules.
+
+ @param Address The MMIO register to read.
+
+ @return The value read.
+
+**/
+UINT16
+EFIAPI
+BeMmioRead16 (
+ IN UINTN Address
+ );
+
+/**
+ MmioRead32 for Big-Endian modules.
+
+ @param Address The MMIO register to read.
+
+ @return The value read.
+
+**/
+UINT32
+EFIAPI
+BeMmioRead32 (
+ IN UINTN Address
+ );
+
+/**
+ MmioRead64 for Big-Endian modules.
+
+ @param Address The MMIO register to read.
+
+ @return The value read.
+
+**/
+UINT64
+EFIAPI
+BeMmioRead64 (
+ IN UINTN Address
+ );
+
+/**
+ MmioWrite8 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param Value The value to write to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+BeMmioWrite8 (
+ IN UINTN Address,
+ IN UINT8 Value
+ );
+
+/**
+ MmioWrite16 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param Value The value to write to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+BeMmioWrite16 (
+ IN UINTN Address,
+ IN UINT16 Value
+ );
+
+/**
+ MmioWrite32 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param Value The value to write to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+BeMmioWrite32 (
+ IN UINTN Address,
+ IN UINT32 Value
+ );
+
+/**
+ MmioWrite64 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param Value The value to write to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+BeMmioWrite64 (
+ IN UINTN Address,
+ IN UINT64 Value
+ );
+
+/**
+ MmioAndThenOr8 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+ @param OrData The value to OR with the result of the AND operation.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+BeMmioAndThenOr8 (
+ IN UINTN Address,
+ IN UINT8 AndData,
+ IN UINT8 OrData
+ );
+
+/**
+ MmioAndThenOr16 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+ @param OrData The value to OR with the result of the AND operation.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+BeMmioAndThenOr16 (
+ IN UINTN Address,
+ IN UINT16 AndData,
+ IN UINT16 OrData
+ );
+
+/**
+ MmioAndThenOr32 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+ @param OrData The value to OR with the result of the AND operation.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+BeMmioAndThenOr32 (
+ IN UINTN Address,
+ IN UINT32 AndData,
+ IN UINT32 OrData
+ );
+
+/**
+ MmioAndThenOr64 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+ @param OrData The value to OR with the result of the AND operation.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+BeMmioAndThenOr64 (
+ IN UINTN Address,
+ IN UINT64 AndData,
+ IN UINT64 OrData
+ );
+
+/**
+ MmioOr8 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param OrData The value to OR with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+BeMmioOr8 (
+ IN UINTN Address,
+ IN UINT8 OrData
+ );
+
+/**
+ MmioOr16 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param OrData The value to OR with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+BeMmioOr16 (
+ IN UINTN Address,
+ IN UINT16 OrData
+ );
+
+/**
+ MmioOr32 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param OrData The value to OR with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+BeMmioOr32 (
+ IN UINTN Address,
+ IN UINT32 OrData
+ );
+
+/**
+ MmioOr64 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param OrData The value to OR with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+BeMmioOr64 (
+ IN UINTN Address,
+ IN UINT64 OrData
+ );
+
+/**
+ MmioAnd8 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+BeMmioAnd8 (
+ IN UINTN Address,
+ IN UINT8 AndData
+ );
+
+/**
+ MmioAnd16 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+BeMmioAnd16 (
+ IN UINTN Address,
+ IN UINT16 AndData
+ );
+
+/**
+ MmioAnd32 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+BeMmioAnd32 (
+ IN UINTN Address,
+ IN UINT32 AndData
+ );
+
+/**
+ MmioAnd64 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+BeMmioAnd64 (
+ IN UINTN Address,
+ IN UINT64 AndData
+ );
+
+#endif /* _BE_IOLIB_H */
diff --git a/Platform/NXP/Library/BeIoLib/BeIoLib.c b/Platform/NXP/Library/BeIoLib/BeIoLib.c
new file mode 100644
index 0000000..b4b12ac
--- /dev/null
+++ b/Platform/NXP/Library/BeIoLib/BeIoLib.c
@@ -0,0 +1,400 @@
+/** BeIoLib.c
+
+ Provide MMIO APIs for BE modules.
+
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Base.h>
+#include <Library/BaseLib.h>
+#include <Library/IoLib.h>
+
+/**
+ MmioRead8 for Big-Endian modules.
+
+ @param Address The MMIO register to read.
+
+ @return The value read.
+
+**/
+UINT8
+EFIAPI
+BeMmioRead8 (
+ IN UINTN Address
+ )
+{
+ return MmioRead8 (Address);
+}
+
+/**
+ MmioRead16 for Big-Endian modules.
+
+ @param Address The MMIO register to read.
+
+ @return The value read.
+
+**/
+UINT16
+EFIAPI
+BeMmioRead16 (
+ IN UINTN Address
+ )
+{
+ return SwapBytes16 (MmioRead16 (Address));
+}
+
+/**
+ MmioRead32 for Big-Endian modules.
+
+ @param Address The MMIO register to read.
+
+ @return The value read.
+
+**/
+UINT32
+EFIAPI
+BeMmioRead32 (
+ IN UINTN Address
+ )
+{
+ return SwapBytes32 (MmioRead32 (Address));
+}
+
+/**
+ MmioRead64 for Big-Endian modules.
+
+ @param Address The MMIO register to read.
+
+ @return The value read.
+
+**/
+UINT64
+EFIAPI
+BeMmioRead64 (
+ IN UINTN Address
+ )
+{
+ return SwapBytes64 (MmioRead64 (Address));
+}
+
+/**
+ MmioWrite8 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param Value The value to write to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+BeMmioWrite8 (
+ IN UINTN Address,
+ IN UINT8 Value
+ )
+{
+ return MmioWrite8 (Address, Value);
+}
+
+/**
+ MmioWrite16 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param Value The value to write to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+BeMmioWrite16 (
+ IN UINTN Address,
+ IN UINT16 Value
+ )
+{
+ return MmioWrite16 (Address, SwapBytes16 (Value));
+}
+
+/**
+ MmioWrite32 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param Value The value to write to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+BeMmioWrite32 (
+ IN UINTN Address,
+ IN UINT32 Value
+ )
+{
+ return MmioWrite32 (Address, SwapBytes32 (Value));
+}
+
+/**
+ MmioWrite64 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param Value The value to write to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+BeMmioWrite64 (
+ IN UINTN Address,
+ IN UINT64 Value
+ )
+{
+ return MmioWrite64 (Address, SwapBytes64 (Value));
+}
+
+/**
+ MmioAndThenOr8 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+ @param OrData The value to OR with the result of the AND operation.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+BeMmioAndThenOr8 (
+ IN UINTN Address,
+ IN UINT8 AndData,
+ IN UINT8 OrData
+ )
+{
+ return MmioAndThenOr8 (Address, AndData, OrData);
+}
+
+/**
+ MmioAndThenOr16 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+ @param OrData The value to OR with the result of the AND operation.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+BeMmioAndThenOr16 (
+ IN UINTN Address,
+ IN UINT16 AndData,
+ IN UINT16 OrData
+ )
+{
+ AndData = SwapBytes16 (AndData);
+ OrData = SwapBytes16 (OrData);
+
+ return MmioAndThenOr16 (Address, AndData, OrData);
+}
+
+/**
+ MmioAndThenOr32 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+ @param OrData The value to OR with the result of the AND operation.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+BeMmioAndThenOr32 (
+ IN UINTN Address,
+ IN UINT32 AndData,
+ IN UINT32 OrData
+ )
+{
+ AndData = SwapBytes32 (AndData);
+ OrData = SwapBytes32 (OrData);
+
+ return MmioAndThenOr32 (Address, AndData, OrData);
+}
+
+/**
+ MmioAndThenOr64 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+ @param OrData The value to OR with the result of the AND operation.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+BeMmioAndThenOr64 (
+ IN UINTN Address,
+ IN UINT64 AndData,
+ IN UINT64 OrData
+ )
+{
+ AndData = SwapBytes64 (AndData);
+ OrData = SwapBytes64 (OrData);
+
+ return MmioAndThenOr64 (Address, AndData, OrData);
+}
+
+/**
+ MmioOr8 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param OrData The value to OR with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+BeMmioOr8 (
+ IN UINTN Address,
+ IN UINT8 OrData
+ )
+{
+ return MmioOr8 (Address, OrData);
+}
+
+/**
+ MmioOr16 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param OrData The value to OR with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+BeMmioOr16 (
+ IN UINTN Address,
+ IN UINT16 OrData
+ )
+{
+ return MmioOr16 (Address, SwapBytes16 (OrData));
+}
+
+/**
+ MmioOr32 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param OrData The value to OR with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+BeMmioOr32 (
+ IN UINTN Address,
+ IN UINT32 OrData
+ )
+{
+ return MmioOr32 (Address, SwapBytes32 (OrData));
+}
+
+/**
+ MmioOr64 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param OrData The value to OR with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+BeMmioOr64 (
+ IN UINTN Address,
+ IN UINT64 OrData
+ )
+{
+ return MmioOr64 (Address, SwapBytes64 (OrData));
+}
+
+/**
+ MmioAnd8 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+BeMmioAnd8 (
+ IN UINTN Address,
+ IN UINT8 AndData
+ )
+{
+ return MmioAnd8 (Address, AndData);
+}
+
+/**
+ MmioAnd16 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+BeMmioAnd16 (
+ IN UINTN Address,
+ IN UINT16 AndData
+ )
+{
+ return MmioAnd16 (Address, SwapBytes16 (AndData));
+}
+
+/**
+ MmioAnd32 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+BeMmioAnd32 (
+ IN UINTN Address,
+ IN UINT32 AndData
+ )
+{
+ return MmioAnd32 (Address, SwapBytes32 (AndData));
+}
+
+/**
+ MmioAnd64 for Big-Endian modules.
+
+ @param Address The MMIO register to write.
+ @param AndData The value to AND with the read value from the MMIO register.
+
+ @return The value written back to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+BeMmioAnd64 (
+ IN UINTN Address,
+ IN UINT64 AndData
+ )
+{
+ return MmioAnd64 (Address, SwapBytes64 (AndData));
+}
diff --git a/Platform/NXP/Library/BeIoLib/BeIoLib.inf b/Platform/NXP/Library/BeIoLib/BeIoLib.inf
new file mode 100644
index 0000000..8c466e8
--- /dev/null
+++ b/Platform/NXP/Library/BeIoLib/BeIoLib.inf
@@ -0,0 +1,31 @@
+## @BeIoLib.inf
+
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+##
+
+[Defines]
+ INF_VERSION = 0x0001001A
+ BASE_NAME = BeIoLib
+ FILE_GUID = 28d77333-77eb-4faf-8735-130e5eb3e343
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = BeIoLib
+
+[Packages]
+ MdeModulePkg/MdeModulePkg.dec
+ MdePkg/MdePkg.dec
+
+[LibraryClasses]
+ IoLib
+
+[Sources.common]
+ BeIoLib.c
--
1.9.1
^ permalink raw reply related [flat|nested] 39+ messages in thread
* [PATCH v2 2/9] Platform/NXP : Add support for Watchdog driver
2017-11-22 15:48 ` [PATCH v2 1/9] Platform/NXP: Add support for Big Endian Mmio APIs Meenakshi Aggarwal
@ 2017-11-22 15:48 ` Meenakshi Aggarwal
2017-11-22 15:48 ` [PATCH v2 3/9] SocLib : Add support for initialization of peripherals Meenakshi Aggarwal
` (7 subsequent siblings)
8 siblings, 0 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-22 15:48 UTC (permalink / raw)
To: ard.biesheuvel, leif.lindholm, michael.d.kinney, edk2-devel
Installs watchdog timer arch protocol
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
---
Platform/NXP/Drivers/WatchDog/WatchDog.c | 421 ++++++++++++++++++++++++++
Platform/NXP/Drivers/WatchDog/WatchDog.h | 37 +++
Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf | 47 +++
3 files changed, 505 insertions(+)
create mode 100644 Platform/NXP/Drivers/WatchDog/WatchDog.c
create mode 100644 Platform/NXP/Drivers/WatchDog/WatchDog.h
create mode 100644 Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf
diff --git a/Platform/NXP/Drivers/WatchDog/WatchDog.c b/Platform/NXP/Drivers/WatchDog/WatchDog.c
new file mode 100644
index 0000000..956e455
--- /dev/null
+++ b/Platform/NXP/Drivers/WatchDog/WatchDog.c
@@ -0,0 +1,421 @@
+/** WatchDog.c
+*
+* Based on Watchdog driver implemenation available in
+* ArmPlatformPkg/Drivers/SP805WatchdogDxe/SP805Watchdog.c
+*
+* Copyright (c) 2011-2013, ARM Limited. All rights reserved.
+* Copyright 2017 NXP
+*
+* This program and the accompanying materials
+* are licensed and made available under the terms and conditions of the BSD License
+* which accompanies this distribution. The full text of the license may be found at
+* http://opensource.org/licenses/bsd-license.php
+*
+* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#include <PiDxe.h>
+#include <Library/BaseLib.h>
+#include <Library/BeIoLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IoLib.h>
+#include <Library/PcdLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Protocol/WatchdogTimer.h>
+
+#include "WatchDog.h"
+
+STATIC EFI_EVENT EfiExitBootServicesEvent;
+
+STATIC
+UINT16
+EFIAPI
+WdogRead (
+ IN UINTN Address
+ )
+{
+ if (FixedPcdGetBool (PcdWdogBigEndian)) {
+ return BeMmioRead16 (Address);
+ } else {
+ return MmioRead16(Address);
+ }
+}
+
+STATIC
+UINT16
+EFIAPI
+WdogWrite (
+ IN UINTN Address,
+ IN UINT16 Value
+ )
+{
+ if (FixedPcdGetBool (PcdWdogBigEndian)) {
+ return BeMmioWrite16 (Address, Value);
+ } else {
+ return MmioWrite16 (Address, Value);
+ }
+}
+
+STATIC
+UINT16
+EFIAPI
+WdogAndThenOr (
+ IN UINTN Address,
+ IN UINT16 And,
+ IN UINT16 Or
+ )
+{
+ if (FixedPcdGetBool (PcdWdogBigEndian)) {
+ return BeMmioAndThenOr16 (Address, And, Or);
+ } else {
+ return MmioAndThenOr16 (Address, And, Or);
+ }
+}
+
+STATIC
+UINT16
+EFIAPI
+WdogOr (
+ IN UINTN Address,
+ IN UINT16 Or
+ )
+{
+ if (FixedPcdGetBool (PcdWdogBigEndian)) {
+ return BeMmioOr16 (Address, Or);
+ } else {
+ return MmioOr16 (Address, Or);
+ }
+}
+
+STATIC
+VOID
+WdogPing (
+ VOID
+ )
+{
+ //
+ // To reload a timeout value to the counter the proper service sequence begins by
+ // writing 0x_5555 followed by 0x_AAAA to the Watchdog Service Register (WDOG_WSR).
+ // This service sequence will reload the counter with the timeout value WT[7:0] of
+ // Watchdog Control Register (WDOG_WCR).
+ //
+
+ WdogWrite (PcdGet64 (PcdWdog1BaseAddr) + WDOG_WSR_OFFSET,
+ WDOG_SERVICE_SEQ1);
+ WdogWrite (PcdGet64 (PcdWdog1BaseAddr) + WDOG_WSR_OFFSET,
+ WDOG_SERVICE_SEQ2);
+}
+
+/**
+ Stop the Wdog watchdog timer from counting down.
+**/
+STATIC
+VOID
+WdogStop (
+ VOID
+ )
+{
+ // Watchdog cannot be disabled by software once started.
+ // At best, we can keep reload counter with maximum value
+
+ WdogAndThenOr (PcdGet64 (PcdWdog1BaseAddr) + WDOG_WCR_OFFSET,
+ (UINT16)(~WDOG_WCR_WT),
+ (WD_COUNT (WT_MAX_TIME) & WD_COUNT_MASK));
+ WdogPing ();
+}
+
+/**
+ Starts the Wdog counting down by feeding Service register with
+ desired pattern.
+ The count down will start from the value stored in the Load register,
+ not from the value where it was previously stopped.
+**/
+STATIC
+VOID
+WdogStart (
+ VOID
+ )
+{
+ //Reload the timeout value
+ WdogPing ();
+}
+
+/**
+ On exiting boot services we must make sure the Wdog Watchdog Timer
+ is stopped.
+**/
+STATIC
+VOID
+EFIAPI
+ExitBootServicesEvent (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ WdogStop ();
+}
+
+/**
+ This function registers the handler NotifyFunction so it is called every time
+ the watchdog timer expires. It also passes the amount of time since the last
+ handler call to the NotifyFunction.
+ If NotifyFunction is not NULL and a handler is not already registered,
+ then the new handler is registered and EFI_SUCCESS is returned.
+ If NotifyFunction is NULL, and a handler is already registered,
+ then that handler is unregistered.
+ If an attempt is made to register a handler when a handler is already registered,
+ then EFI_ALREADY_STARTED is returned.
+ If an attempt is made to unregister a handler when a handler is not registered,
+ then EFI_INVALID_PARAMETER is returned.
+
+ @param This The EFI_TIMER_ARCH_PROTOCOL instance.
+ @param NotifyFunction The function to call when a timer interrupt fires. This
+ function executes at TPL_HIGH_LEVEL. The DXE Core will
+ register a handler for the timer interrupt, so it can know
+ how much time has passed. This information is used to
+ signal timer based events. NULL will unregister the handler.
+
+ @retval EFI_SUCCESS The watchdog timer handler was registered.
+ @retval EFI_ALREADY_STARTED NotifyFunction is not NULL, and a handler is already
+ registered.
+ @retval EFI_INVALID_PARAMETER NotifyFunction is NULL, and a handler was not
+ previously registered.
+
+**/
+STATIC
+EFI_STATUS
+EFIAPI
+WdogRegisterHandler (
+ IN EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
+ IN EFI_WATCHDOG_TIMER_NOTIFY NotifyFunction
+ )
+{
+ // ERROR: This function is not supported.
+ // The hardware watchdog will reset the board
+ return EFI_INVALID_PARAMETER;
+}
+
+/**
+
+ This function adjusts the period of timer interrupts to the value specified
+ by TimerPeriod. If the timer period is updated, then the selected timer
+ period is stored in EFI_TIMER.TimerPeriod, and EFI_SUCCESS is returned. If
+ the timer hardware is not programmable, then EFI_UNSUPPORTED is returned.
+ If an error occurs while attempting to update the timer period, then the
+ timer hardware will be put back in its state prior to this call, and
+ EFI_DEVICE_ERROR is returned. If TimerPeriod is 0, then the timer interrupt
+ is disabled. This is not the same as disabling the CPU's interrupts.
+ Instead, it must either turn off the timer hardware, or it must adjust the
+ interrupt controller so that a CPU interrupt is not generated when the timer
+ interrupt fires.
+
+ @param This The EFI_TIMER_ARCH_PROTOCOL instance.
+ @param TimerPeriod The rate to program the timer interrupt in 100 nS units. If
+ the timer hardware is not programmable, then EFI_UNSUPPORTED is
+ returned. If the timer is programmable, then the timer period
+ will be rounded up to the nearest timer period that is supported
+ by the timer hardware. If TimerPeriod is set to 0, then the
+ timer interrupts will be disabled.
+
+
+ @retval EFI_SUCCESS The timer period was changed.
+ @retval EFI_UNSUPPORTED The platform cannot change the period of the timer interrupt.
+ @retval EFI_DEVICE_ERROR The timer period could not be changed due to a device error.
+
+**/
+STATIC
+EFI_STATUS
+EFIAPI
+WdogSetTimerPeriod (
+ IN EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
+ IN UINT64 TimerPeriod // In 100ns units
+ )
+{
+ EFI_STATUS Status;
+ UINT64 TimerPeriodInSec;
+ UINT16 Val;
+
+ Status = EFI_SUCCESS;
+
+ if (TimerPeriod == 0) {
+ // This is a watchdog stop request
+ WdogStop ();
+ return Status;
+ } else {
+ // Convert the TimerPeriod (in 100 ns unit) to an equivalent second value
+
+ TimerPeriodInSec = DivU64x32 (TimerPeriod, NANO_SECOND_BASE);
+
+ // The registers in the Wdog are only 32 bits
+ if (TimerPeriodInSec > WT_MAX_TIME) {
+ // We could load the watchdog with the maximum supported value but
+ // if a smaller value was requested, this could have the watchdog
+ // triggering before it was intended.
+ // Better generate an error to let the caller know.
+ Status = EFI_DEVICE_ERROR;
+ return Status;
+ }
+
+ // set the new timeout value in the WCR
+ // Convert the timeout value from Seconds to timer count
+ Val = ((WD_COUNT(TimerPeriodInSec) & WD_COUNT_MASK) << 8);
+
+ WdogAndThenOr (PcdGet64 (PcdWdog1BaseAddr) + WDOG_WCR_OFFSET,
+ (UINT16)(~WDOG_WCR_WT),
+ Val);
+ // Start the watchdog
+ WdogStart ();
+ }
+
+ return Status;
+}
+
+/**
+ This function retrieves the period of timer interrupts in 100 ns units,
+ returns that value in TimerPeriod, and returns EFI_SUCCESS. If TimerPeriod
+ is NULL, then EFI_INVALID_PARAMETER is returned. If a TimerPeriod of 0 is
+ returned, then the timer is currently disabled.
+
+ @param This The EFI_TIMER_ARCH_PROTOCOL instance.
+ @param TimerPeriod A pointer to the timer period to retrieve in 100 ns units. If
+ 0 is returned, then the timer is currently disabled.
+
+
+ @retval EFI_SUCCESS The timer period was returned in TimerPeriod.
+ @retval EFI_INVALID_PARAMETER TimerPeriod is NULL.
+
+**/
+STATIC
+EFI_STATUS
+EFIAPI
+WdogGetTimerPeriod (
+ IN EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
+ OUT UINT64 *TimerPeriod
+ )
+{
+ EFI_STATUS Status;
+ UINT64 ReturnValue;
+ UINT16 Val;
+
+ Status = EFI_SUCCESS;
+
+ if (TimerPeriod == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ // Check if the watchdog is stopped
+ if ((WdogRead (PcdGet64 (PcdWdog1BaseAddr) + WDOG_WCR_OFFSET)
+ & WDOG_WCR_WDE) == 0 ) {
+ // It is stopped, so return zero.
+ ReturnValue = 0;
+ } else {
+ // Convert the Watchdog ticks into equivalent TimerPeriod second value.
+ Val = (WdogRead (PcdGet64 (PcdWdog1BaseAddr) + WDOG_WCR_OFFSET)
+ & WDOG_WCR_WT ) >> 8;
+ ReturnValue = WD_SEC(Val);
+ }
+
+ *TimerPeriod = ReturnValue;
+ return Status;
+}
+
+/**
+ Interface structure for the Watchdog Architectural Protocol.
+
+ @par Protocol Description:
+ This protocol provides a service to set the amount of time to wait
+ before firing the watchdog timer, and it also provides a service to
+ register a handler that is invoked when the watchdog timer fires.
+
+ @par When the watchdog timer fires, control will be passed to a handler
+ if one has been registered. If no handler has been registered,
+ or the registered handler returns, then the system will be
+ reset by calling the Runtime Service ResetSystem().
+
+ @param RegisterHandler
+ Registers a handler that will be called each time the
+ watchdogtimer interrupt fires. TimerPeriod defines the minimum
+ time between timer interrupts, so TimerPeriod will also
+ be the minimum time between calls to the registered
+ handler.
+ NOTE: If the watchdog resets the system in hardware, then
+ this function will not have any chance of executing.
+
+ @param SetTimerPeriod
+ Sets the period of the timer interrupt in 100 nS units.
+ This function is optional, and may return EFI_UNSUPPORTED.
+ If this function is supported, then the timer period will
+ be rounded up to the nearest supported timer period.
+
+ @param GetTimerPeriod
+ Retrieves the period of the timer interrupt in 100 nS units.
+
+**/
+STATIC
+EFI_WATCHDOG_TIMER_ARCH_PROTOCOL gWatchdogTimer = {
+ WdogRegisterHandler,
+ WdogSetTimerPeriod,
+ WdogGetTimerPeriod
+};
+
+/**
+ Initialize state information for the Watchdog Timer Architectural Protocol.
+
+ @param ImageHandle of the loaded driver
+ @param SystemTable Pointer to the System Table
+
+ @retval EFI_SUCCESS Protocol registered
+ @retval EFI_OUT_OF_RESOURCES Cannot allocate protocol data structure
+ @retval EFI_DEVICE_ERROR Hardware problems
+
+**/
+EFI_STATUS
+EFIAPI
+WdogInitialize (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EFI_STATUS Status;
+ EFI_HANDLE Handle;
+
+ WdogAndThenOr (PcdGet64 (PcdWdog1BaseAddr) + WDOG_WCR_OFFSET,
+ (UINT16)(~WDOG_WCR_WT),
+ (WD_COUNT (WT_MAX_TIME) & WD_COUNT_MASK));
+
+ WdogOr (PcdGet64 (PcdWdog1BaseAddr) + WDOG_WCR_OFFSET, WDOG_WCR_WDE);
+
+ //
+ // Make sure the Watchdog Timer Architectural Protocol
+ // has not been installed in the system yet.
+ // This will avoid conflicts with the universal watchdog
+ //
+ ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiWatchdogTimerArchProtocolGuid);
+
+ // Register for an ExitBootServicesEvent
+ Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY,
+ ExitBootServicesEvent, NULL, &EfiExitBootServicesEvent);
+ if (EFI_ERROR (Status)) {
+ Status = EFI_OUT_OF_RESOURCES;
+ return Status;
+ }
+
+ // Install the Timer Architectural Protocol onto a new handle
+ Handle = NULL;
+ Status = gBS->InstallMultipleProtocolInterfaces (
+ &Handle,
+ &gEfiWatchdogTimerArchProtocolGuid, &gWatchdogTimer,
+ NULL
+ );
+ if (EFI_ERROR (Status)) {
+ gBS->CloseEvent (EfiExitBootServicesEvent);
+ Status = EFI_OUT_OF_RESOURCES;
+ return Status;
+ }
+
+ WdogPing ();
+
+ return Status;
+}
diff --git a/Platform/NXP/Drivers/WatchDog/WatchDog.h b/Platform/NXP/Drivers/WatchDog/WatchDog.h
new file mode 100644
index 0000000..56ddbde
--- /dev/null
+++ b/Platform/NXP/Drivers/WatchDog/WatchDog.h
@@ -0,0 +1,37 @@
+/** WatchDog.h
+*
+* Copyright 2017 NXP
+*
+* This program and the accompanying materials
+* are licensed and made available under the terms and conditions of the BSD License
+* which accompanies this distribution. The full text of the license may be found at
+* http://opensource.org/licenses/bsd-license.php
+*
+* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#ifndef __WATCHDOG_H__
+#define __WATCHDOG_H__
+
+#define WDOG_SIZE 0x1000
+#define WDOG_WCR_OFFSET 0
+#define WDOG_WSR_OFFSET 2
+#define WDOG_WRSR_OFFSET 4
+#define WDOG_WICR_OFFSET 6
+#define WDOG_WCR_WT (0xFF << 8)
+#define WDOG_WCR_WDE (1 << 2)
+#define WDOG_SERVICE_SEQ1 0x5555
+#define WDOG_SERVICE_SEQ2 0xAAAA
+#define WDOG_WCR_WDZST 0x1
+#define WDOG_WCR_WRE (1 << 3) /* -> WDOG Reset Enable */
+
+#define WT_MAX_TIME 128
+#define WD_COUNT(Sec) (((Sec) * 2 - 1) << 8)
+#define WD_COUNT_MASK 0xff00
+#define WD_SEC(Cnt) (((Cnt) + 1) / 2)
+
+#define NANO_SECOND_BASE 10000000
+
+#endif //__WATCHDOG_H__
diff --git a/Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf b/Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf
new file mode 100644
index 0000000..a74f477
--- /dev/null
+++ b/Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf
@@ -0,0 +1,47 @@
+# WatchDog.inf
+#
+# Component description file for WatchDog module
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+[Defines]
+ INF_VERSION = 0x0001001A
+ BASE_NAME = WatchDogDxe
+ FILE_GUID = 0358b544-ec65-4339-89cd-cad60a3dd787
+ MODULE_TYPE = DXE_DRIVER
+ VERSION_STRING = 1.0
+ ENTRY_POINT = WdogInitialize
+
+[Sources.common]
+ WatchDog.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ Platform/NXP/NxpQoriqLs.dec
+
+[LibraryClasses]
+ BaseLib
+ BeIoLib
+ PcdLib
+ UefiBootServicesTableLib
+ UefiDriverEntryPoint
+
+[Pcd]
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog1BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdWdogBigEndian
+
+[Protocols]
+ gEfiWatchdogTimerArchProtocolGuid
+
+[Depex]
+ TRUE
--
1.9.1
^ permalink raw reply related [flat|nested] 39+ messages in thread
* [PATCH v2 3/9] SocLib : Add support for initialization of peripherals
2017-11-22 15:48 ` [PATCH v2 1/9] Platform/NXP: Add support for Big Endian Mmio APIs Meenakshi Aggarwal
2017-11-22 15:48 ` [PATCH v2 2/9] Platform/NXP : Add support for Watchdog driver Meenakshi Aggarwal
@ 2017-11-22 15:48 ` Meenakshi Aggarwal
2017-11-22 15:48 ` [PATCH v2 4/9] Platform/NXP : Add support for DUART library Meenakshi Aggarwal
` (6 subsequent siblings)
8 siblings, 0 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-22 15:48 UTC (permalink / raw)
To: ard.biesheuvel, leif.lindholm, michael.d.kinney, edk2-devel
Add SocInit function that initializes peripherals
and print board and soc information.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
---
Platform/NXP/Include/Bitops.h | 179 +++++++++++++
Silicon/NXP/Chassis/Chassis.c | 413 ++++++++++++++++++++++++++++++
Silicon/NXP/Chassis/Chassis.h | 144 +++++++++++
Silicon/NXP/Chassis/Chassis2/Chassis2.dec | 19 ++
Silicon/NXP/Chassis/Chassis2/SerDes.h | 69 +++++
Silicon/NXP/Chassis/Chassis2/Soc.c | 145 +++++++++++
Silicon/NXP/Chassis/Chassis2/Soc.h | 376 +++++++++++++++++++++++++++
Silicon/NXP/Chassis/LS1043aSocLib.inf | 47 ++++
Silicon/NXP/Chassis/SerDes.c | 254 ++++++++++++++++++
Silicon/NXP/LS1043A/Include/SocSerDes.h | 55 ++++
10 files changed, 1701 insertions(+)
create mode 100644 Platform/NXP/Include/Bitops.h
create mode 100644 Silicon/NXP/Chassis/Chassis.c
create mode 100644 Silicon/NXP/Chassis/Chassis.h
create mode 100644 Silicon/NXP/Chassis/Chassis2/Chassis2.dec
create mode 100644 Silicon/NXP/Chassis/Chassis2/SerDes.h
create mode 100644 Silicon/NXP/Chassis/Chassis2/Soc.c
create mode 100644 Silicon/NXP/Chassis/Chassis2/Soc.h
create mode 100644 Silicon/NXP/Chassis/LS1043aSocLib.inf
create mode 100644 Silicon/NXP/Chassis/SerDes.c
create mode 100644 Silicon/NXP/LS1043A/Include/SocSerDes.h
diff --git a/Platform/NXP/Include/Bitops.h b/Platform/NXP/Include/Bitops.h
new file mode 100644
index 0000000..beddb4e
--- /dev/null
+++ b/Platform/NXP/Include/Bitops.h
@@ -0,0 +1,179 @@
+/** Bitops.h
+ Header defining the general bitwise operations
+
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __BITOPS_H__
+#define __BITOPS_H__
+
+#include <Library/DebugLib.h>
+
+#define MASK_LOWER_16 0xFFFF0000
+#define MASK_UPPER_16 0x0000FFFF
+#define MASK_LOWER_8 0xFF000000
+#define MASK_UPPER_8 0x000000FF
+
+/*
+ * Returns the bit mask for a bit index from 0 to 31
+ */
+#define BIT(_BitIndex) (0x1u << (_BitIndex))
+
+/**
+ * Upper32Bits - return bits 32-63 of a number
+ * @N: the number we're accessing
+ *
+ * A basic shift-right of a 64- or 32-bit quantity. Use this to suppress
+ * the "right shift count >= width of type" warning when that quantity is
+ * 32-bits.
+ */
+#define Upper32Bits(N) ((UINT32)(((N) >> 16) >> 16))
+
+/**
+ * Lower32Bits - return bits 0-31 of a number
+ * @N: the number we're accessing
+ */
+#define Lower32Bits(N) ((UINT32)(N))
+
+
+/*
+ * Stores a value for a given bit field in 32-bit '_Container'
+ */
+
+#define SET_BIT_FIELD32(_Container, _BitShift, _BitWidth, _Value) \
+ __SET_BIT_FIELD32(_Container, \
+ __GEN_BIT_FIELD_MASK32(_BitShift, _BitWidth), \
+ _BitShift, \
+ _Value)
+
+#define __SET_BIT_FIELD32(_Container, _BitMask, _BitShift, _Value) \
+ do { \
+ (_Container) &= ~(_BitMask); \
+ if ((_Value) != 0) { \
+ ASSERT(((UINT32)(_Value) << (_BitShift)) <= (_BitMask)); \
+ (_Container) |= \
+ ((UINT32)(_Value) << (_BitShift)) & (_BitMask); \
+ } \
+ } while (0)
+
+/*
+ * Extracts the value for a given bit field in 32-bit _Container
+ */
+
+#define GET_BIT_FIELD32(_Container, _BitShift, _BitWidth) \
+ __GET_BIT_FIELD32(_Container, \
+ __GEN_BIT_FIELD_MASK32(_BitShift, _BitWidth), \
+ _BitShift)
+
+#define __GET_BIT_FIELD32(_Container, _BitMask, _BitShift) \
+ (((UINT32)(_Container) & (_BitMask)) >> (_BitShift))
+
+#define __GEN_BIT_FIELD_MASK32(_BitShift, _BitWidth) \
+ ((_BitWidth) < 32 ? \
+ (((UINT32)1 << (_BitWidth)) - 1) << (_BitShift) : \
+ ~(UINT32)0)
+
+/*
+ *Stores a value for a given bit field in 64-bit '_Container'
+ */
+#define SET_BIT_FIELD64(_Container, _BitShift, _BitWidth, _Value) \
+ __SET_BIT_FIELD64(_Container, \
+ __GEN_BIT_FIELD_MASK64(_BitShift, _BitWidth), \
+ _BitShift, \
+ _Value)
+
+#define __SET_BIT_FIELD64(_Container, _BitMask, _BitShift, _Value) \
+ do { \
+ (_Container) &= ~(_BitMask); \
+ if ((_Value) != 0) { \
+ ASSERT(((UINT64)(_Value) << (_BitShift)) <= (_BitMask)); \
+ (_Container) |= \
+ ((UINT64)(_Value) << (_BitShift)) & (_BitMask); \
+ } \
+ } while (0)
+
+/*
+ * Extracts the value for a given bit field in 64-bit _Container
+ */
+#define GET_BIT_FIELD64(_Container, _BitShift, _BitWidth) \
+ __GET_BIT_FIELD64(_Container, \
+ __GEN_BIT_FIELD_MASK64(_BitShift, _BitWidth), \
+ _BitShift)
+
+#define __GET_BIT_FIELD64(_Container, _BitMask, _BitShift) \
+ (((UINT64)(_Container) & (_BitMask)) >> (_BitShift))
+
+#define __GEN_BIT_FIELD_MASK64(_BitShift, _BitWidth) \
+ ((_BitWidth) < 64 ? \
+ (((UINT64)1 << (_BitWidth)) - 1) << (_BitShift) : \
+ ~(UINT64)0)
+
+/**
+
+ Test If the Destination buffer sets (0->1) or clears (1->0) any bit in Source buffer ?
+
+ @param[in] Source Source Buffer Pointer
+ @param[in] Destination Destination Buffer Pointer
+ @param[in] NumBytes Bytes to Compare
+ @param[in] Set True : Test Weather Destination buffer sets any bit in Source buffer ?
+ False : Test Weather Destination buffer clears any bit in Source buffer ?
+
+ @retval TRUE Destination buffer sets/clear a bit in source buffer.
+ @retval FALSE Destination buffer doesn't sets/clear bit in source buffer.
+
+**/
+STATIC
+inline
+BOOLEAN
+TestBitSetClear (
+ IN VOID *Source,
+ IN VOID *Destination,
+ IN UINTN NumBytes,
+ IN BOOLEAN Set
+ )
+{
+ UINTN Index = 0;
+ VOID* Buffer;
+
+ if (Set) {
+ Buffer = Destination;
+ } else {
+ Buffer = Source;
+ }
+
+ while (Index < NumBytes) {
+ if ((NumBytes - Index) >= 8) {
+ if ((*((UINT64*)(Source+Index)) ^ *((UINT64*)(Destination+Index))) & *((UINT64*)(Buffer+Index))) {
+ return TRUE;
+ }
+ Index += 8;
+ } else if ((NumBytes - Index) >= 4) {
+ if ((*((UINT32*)(Source+Index)) ^ *((UINT32*)(Destination+Index))) & *((UINT32*)(Buffer+Index))) {
+ return TRUE;
+ }
+ Index += 4;
+ } else if ((NumBytes - Index) >= 2) {
+ if ((*((UINT16*)(Source+Index)) ^ *((UINT16*)(Destination+Index))) & *((UINT16*)(Buffer+Index))) {
+ return TRUE;
+ }
+ Index += 2;
+ } else if ((NumBytes - Index) >= 1) {
+ if ((*((UINT8*)(Source+Index)) ^ *((UINT8*)(Destination+Index))) & *((UINT8*)(Buffer+Index))) {
+ return TRUE;
+ }
+ Index += 1;
+ }
+ }
+ return FALSE;
+}
+
+#endif
diff --git a/Silicon/NXP/Chassis/Chassis.c b/Silicon/NXP/Chassis/Chassis.c
new file mode 100644
index 0000000..a6a77c2
--- /dev/null
+++ b/Silicon/NXP/Chassis/Chassis.c
@@ -0,0 +1,413 @@
+/** @file
+ SoC specific Library containg functions to initialize various SoC components
+
+ Copyright (c) 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Base.h>
+#include <Library/BaseLib.h>
+#include <Library/BeIoLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IoLib.h>
+#include <Library/PcdLib.h>
+#include <Library/PrintLib.h>
+#include <Library/SerialPortLib.h>
+
+#include <Soc.h>
+
+#include "Chassis.h"
+
+UINT32
+EFIAPI
+GurRead (
+ IN UINTN Address
+ )
+{
+ if (FixedPcdGetBool (PcdGurBigEndian)) {
+ return BeMmioRead32 (Address);
+ } else {
+ return MmioRead32 (Address);
+ }
+}
+
+/*
+ * Structure to list available SOCs.
+ */
+STATIC CPU_TYPE CpuTypeList[] = {
+ CPU_TYPE_ENTRY (LS1043A, LS1043A, 4),
+};
+
+/*
+ * Return the number of bits set
+ */
+STATIC
+inline
+UINTN
+CountSetBits (
+ IN UINTN Num
+ )
+{
+ UINTN Count;
+
+ Count = 0;
+
+ while (Num) {
+ Count += Num & 1;
+ Num >>= 1;
+ }
+
+ return Count;
+}
+
+UINT32
+InitiatorType (
+ IN UINT32 Cluster,
+ IN UINTN InitId
+ )
+{
+ CCSR_GUR *GurBase;
+ UINT32 Idx;
+ UINT32 Type;
+
+ GurBase = (VOID *)PcdGet64 (PcdGutsBaseAddr);
+ Idx = (Cluster >> (InitId * 8)) & TP_CLUSTER_INIT_MASK;
+ Type = GurRead ((UINTN)&GurBase->TpItyp[Idx]);
+
+ if (Type & TP_ITYP_AV_MASK) {
+ return Type;
+ }
+
+ return 0;
+}
+
+/*
+ * Return the mask for number of cores on this SOC.
+ */
+UINT32
+CpuMask (
+ VOID
+ )
+{
+ CCSR_GUR *GurBase;
+ UINTN ClusterIndex;
+ UINTN Count;
+ UINT32 Cluster;
+ UINT32 Type;
+ UINT32 Mask;
+ UINTN InitiatorIndex;
+
+ GurBase = (VOID *)PcdGet64 (PcdGutsBaseAddr);
+ ClusterIndex = 0;
+ Count = 0;
+ Mask = 0;
+
+ do {
+ Cluster = GurRead ((UINTN)&GurBase->TpCluster[ClusterIndex].Lower);
+ for (InitiatorIndex = 0; InitiatorIndex < TP_INIT_PER_CLUSTER; InitiatorIndex++) {
+ Type = InitiatorType (Cluster, InitiatorIndex);
+ if (Type) {
+ if (TP_ITYP_TYPE_MASK (Type) == TP_ITYP_TYPE_ARM)
+ Mask |= 1 << Count;
+ Count++;
+ }
+ }
+ ClusterIndex++;
+ } while (CHECK_CLUSTER (Cluster));
+
+ return Mask;
+}
+
+/*
+ * Return the number of cores on this SOC.
+ */
+UINTN
+CpuNumCores (
+ VOID
+ )
+{
+ return CountSetBits (CpuMask ());
+}
+
+UINT32
+QoriqCoreToType (
+ IN UINTN Core
+ )
+{
+ CCSR_GUR *GurBase;
+ UINTN ClusterIndex;
+ UINTN Count;
+ UINT32 Cluster;
+ UINT32 Type;
+ UINTN InitiatorIndex;
+
+ GurBase = (VOID *)PcdGet64 (PcdGutsBaseAddr);
+ ClusterIndex = 0;
+ Count = 0;
+
+ do {
+ Cluster = GurRead ((UINTN)&GurBase->TpCluster[ClusterIndex].Lower);
+ for (InitiatorIndex = 0; InitiatorIndex < TP_INIT_PER_CLUSTER; InitiatorIndex++) {
+ Type = InitiatorType (Cluster, InitiatorIndex);
+ if (Type) {
+ if (Count == Core)
+ return Type;
+ Count++;
+ }
+ }
+ ClusterIndex++;
+ } while (CHECK_CLUSTER (Cluster));
+
+ return -1; /* cannot identify the cluster */
+}
+
+/*
+ * Print CPU information
+ */
+VOID
+PrintCpuInfo (
+ VOID
+ )
+{
+ SYS_INFO SysInfo;
+ UINTN CoreIndex;
+ UINTN Core;
+ UINT32 Type;
+ CHAR8 Buffer[100];
+ UINTN CharCount;
+
+ GetSysInfo (&SysInfo);
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "Clock Configuration:");
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+
+ ForEachCpu (CoreIndex, Core, CpuNumCores (), CpuMask ()) {
+ if (!(CoreIndex % 3)) {
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "\n ");
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+ }
+
+ Type = TP_ITYP_VERSION (QoriqCoreToType (Core));
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "CPU%d(%a):%-4d MHz ", Core,
+ Type == TY_ITYP_VERSION_A7 ? "A7 " :
+ (Type == TY_ITYP_VERSION_A53 ? "A53" :
+ (Type == TY_ITYP_VERSION_A57 ? "A57" :
+ (Type == TY_ITYP_VERSION_A72 ? "A72" : " Unknown Core "))),
+ SysInfo.FreqProcessor[Core] / MEGA_HZ);
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+ }
+
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "\n Bus: %-4d MHz ",
+ SysInfo.FreqSystemBus / MEGA_HZ);
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "DDR: %-4d MT/s",
+ SysInfo.FreqDdrBus / MEGA_HZ);
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+
+ if (SysInfo.FreqFman[0] != 0) {
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "\n FMAN: %-4d MHz ",
+ SysInfo.FreqFman[0] / MEGA_HZ);
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+ }
+
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "\n");
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+}
+
+/*
+ * Return system bus frequency
+ */
+UINT64
+GetBusFrequency (
+ VOID
+ )
+{
+ SYS_INFO SocSysInfo;
+
+ GetSysInfo (&SocSysInfo);
+
+ return SocSysInfo.FreqSystemBus;
+}
+
+/*
+ * Return SDXC bus frequency
+ */
+UINT64
+GetSdxcFrequency (
+ VOID
+ )
+{
+ SYS_INFO SocSysInfo;
+
+ GetSysInfo (&SocSysInfo);
+
+ return SocSysInfo.FreqSdhc;
+}
+
+/*
+ * Print Soc information
+ */
+VOID
+PrintSoc (
+ VOID
+ )
+{
+ CHAR8 Buf[16];
+ CCSR_GUR *GurBase;
+ UINTN Count;
+ UINTN Svr;
+ UINTN Ver;
+
+ GurBase = (VOID *)PcdGet64 (PcdGutsBaseAddr);
+
+ Buf[0] = L'\0';
+ Svr = GurRead ((UINTN)&GurBase->Svr);
+ Ver = SVR_SOC_VER (Svr);
+
+ for (Count = 0; Count < ARRAY_SIZE (CpuTypeList); Count++)
+ if ((CpuTypeList[Count].SocVer & SVR_WO_E) == Ver) {
+ AsciiStrCpy (Buf, (CONST CHAR8 *)CpuTypeList[Count].Name);
+
+ if (IS_E_PROCESSOR (Svr)) {
+ AsciiStrCat (Buf, (CONST CHAR8 *)"E");
+ }
+ break;
+ }
+
+ if (Count == ARRAY_SIZE (CpuTypeList)) {
+ AsciiStrCpy (Buf, (CONST CHAR8 *)"unknown");
+ }
+
+ DEBUG ((DEBUG_INFO, "SoC: %a (0x%x); Rev %d.%d\n",
+ Buf, Svr, SVR_MAJOR (Svr), SVR_MINOR (Svr)));
+
+ return;
+}
+
+/*
+ * Dump RCW (Reset Control Word) on console
+ */
+VOID
+PrintRCW (
+ VOID
+ )
+{
+ CCSR_GUR *Base;
+ UINTN Count;
+ CHAR8 Buffer[100];
+ UINTN CharCount;
+
+ Base = (VOID *)PcdGet64 (PcdGutsBaseAddr);
+
+ /*
+ * Display the RCW, so that no one gets confused as to what RCW
+ * we're actually using for this boot.
+ */
+
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer),
+ "Reset Configuration Word (RCW):");
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+ for (Count = 0; Count < ARRAY_SIZE(Base->RcwSr); Count++) {
+ UINT32 Rcw = BeMmioRead32((UINTN)&Base->RcwSr[Count]);
+
+ if ((Count % 4) == 0) {
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer),
+ "\n %08x:", Count * 4);
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+ }
+
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), " %08x", Rcw);
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+ }
+
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "\n");
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+}
+
+/*
+ * Setup SMMU in bypass mode
+ * and also set its pagesize
+ */
+VOID
+SmmuInit (
+ VOID
+ )
+{
+ UINT32 Value;
+
+ /* set pagesize as 64K and ssmu-500 in bypass mode */
+ Value = (MmioRead32 ((UINTN)SMMU_REG_SACR) | SACR_PAGESIZE_MASK);
+ MmioWrite32 ((UINTN)SMMU_REG_SACR, Value);
+
+ Value = (MmioRead32 ((UINTN)SMMU_REG_SCR0) | SCR0_CLIENTPD_MASK) & ~SCR0_USFCFG_MASK;
+ MmioWrite32 ((UINTN)SMMU_REG_SCR0, Value);
+
+ Value = (MmioRead32 ((UINTN)SMMU_REG_NSCR0) | SCR0_CLIENTPD_MASK) & ~SCR0_USFCFG_MASK;
+ MmioWrite32 ((UINTN)SMMU_REG_NSCR0, Value);
+}
+
+/*
+ * Return current Soc Name form CpuTypeList
+ */
+CHAR8 *
+GetSocName (
+ VOID
+ )
+{
+ UINT8 Count;
+ UINTN Svr;
+ UINTN Ver;
+ CCSR_GUR *GurBase;
+
+ GurBase = (VOID *)PcdGet64 (PcdGutsBaseAddr);
+
+ Svr = GurRead ((UINTN)&GurBase->Svr);
+ Ver = SVR_SOC_VER (Svr);
+
+ for (Count = 0; Count < ARRAY_SIZE (CpuTypeList); Count++) {
+ if ((CpuTypeList[Count].SocVer & SVR_WO_E) == Ver) {
+ return (CHAR8 *)CpuTypeList[Count].Name;
+ }
+ }
+
+ return NULL;
+}
+
+/*
+ * Return Baud divisor on basis of Baudrate
+ */
+UINT32
+CalculateBaudDivisor (
+ IN UINT64 BaudRate
+ )
+{
+ SYS_INFO SocSysInfo;
+ UINTN DUartClk;
+
+ GetSysInfo(&SocSysInfo);
+ DUartClk = SocSysInfo.FreqSystemBus/PcdGet32(PcdPlatformFreqDiv);
+
+ return ((DUartClk)/(BaudRate * 16));
+}
+
+/*
+ * Return I2c bus frequency
+ */
+UINT32
+CalculateI2cClockRate (
+ VOID
+ )
+{
+ SYS_INFO SocSysInfo;
+
+ GetSysInfo (&SocSysInfo);
+
+ return SocSysInfo.FreqSystemBus;
+}
diff --git a/Silicon/NXP/Chassis/Chassis.h b/Silicon/NXP/Chassis/Chassis.h
new file mode 100644
index 0000000..4bdb4d0
--- /dev/null
+++ b/Silicon/NXP/Chassis/Chassis.h
@@ -0,0 +1,144 @@
+/** @file
+* Header defining the Base addresses, sizes, flags etc for chassis 1
+*
+* Copyright 2017 NXP
+*
+* This program and the accompanying materials
+* are licensed and made available under the terms and conditions of the BSD License
+* which accompanies this distribution. The full text of the license may be found at
+* http://opensource.org/licenses/bsd-license.php
+*
+* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#ifndef __CHASSIS_H__
+#define __CHASSIS_H__
+
+#define TP_ITYP_AV_MASK 0x00000001 /* Initiator available */
+#define TP_ITYP_TYPE_MASK(x) (((x) & 0x6) >> 1) /* Initiator Type */
+#define TP_ITYP_TYPE_ARM 0x0
+#define TP_ITYP_TYPE_PPC 0x1
+#define TP_ITYP_TYPE_OTHER 0x2 /* StarCore DSP */
+#define TP_ITYP_TYPE_HA 0x3 /* HW Accelerator */
+#define TP_ITYP_THDS(x) (((x) & 0x18) >> 3) /* # threads */
+#define TP_ITYP_VERSION(x) (((x) & 0xe0) >> 5) /* Initiator Version */
+#define TP_CLUSTER_INIT_MASK 0x0000003f /* initiator mask */
+#define TP_INIT_PER_CLUSTER 4
+
+#define TY_ITYP_VERSION_A7 0x1
+#define TY_ITYP_VERSION_A53 0x2
+#define TY_ITYP_VERSION_A57 0x3
+#define TY_ITYP_VERSION_A72 0x4
+
+STATIC
+inline
+UINTN
+CpuMaskNext (
+ IN UINTN Cpu,
+ IN UINTN Mask
+ )
+{
+ for (Cpu++; !((1 << Cpu) & Mask); Cpu++)
+ ;
+
+ return Cpu;
+}
+
+#define ForEachCpu(Iter, Cpu, NumCpus, Mask) \
+ for (Iter = 0, Cpu = CpuMaskNext(-1, Mask); \
+ Iter < NumCpus; \
+ Iter++, Cpu = CpuMaskNext(Cpu, Mask)) \
+
+#define CPU_TYPE_ENTRY(N, V, NC) \
+ { .Name = #N, .SocVer = SVR_##V, .NumCores = (NC)}
+
+#define SVR_WO_E 0xFFFFFE
+#define SVR_LS1043A 0x879200
+
+#define SVR_MAJOR(svr) (((svr) >> 4) & 0xf)
+#define SVR_MINOR(svr) (((svr) >> 0) & 0xf)
+#define SVR_SOC_VER(svr) (((svr) >> 8) & SVR_WO_E)
+#define IS_E_PROCESSOR(svr) (!((svr >> 8) & 0x1))
+
+#define MEGA_HZ 1000000
+
+typedef struct {
+ CHAR8 Name[16];
+ UINT32 SocVer;
+ UINT32 NumCores;
+} CPU_TYPE;
+
+typedef struct {
+ UINTN CpuClk; /* CPU clock in Hz! */
+ UINTN BusClk;
+ UINTN MemClk;
+ UINTN PciClk;
+ UINTN SdhcClk;
+} SOC_CLOCK_INFO;
+
+/*
+ * Print Soc information
+ */
+VOID
+PrintSoc (
+ VOID
+ );
+
+/*
+ * Initialize Clock structure
+ */
+VOID
+ClockInit (
+ VOID
+ );
+
+/*
+ * Setup SMMU in bypass mode
+ * and also set its pagesize
+ */
+VOID
+SmmuInit (
+ VOID
+ );
+
+/*
+ * Print CPU information
+ */
+VOID
+PrintCpuInfo (
+ VOID
+ );
+
+/*
+ * Dump RCW (Reset Control Word) on console
+ */
+VOID
+PrintRCW (
+ VOID
+ );
+
+UINT32
+InitiatorType (
+ IN UINT32 Cluster,
+ IN UINTN InitId
+ );
+
+/*
+ * Return the mask for number of cores on this SOC.
+ */
+UINT32
+CpuMask (
+ VOID
+ );
+
+/*
+ * Return the number of cores on this SOC.
+ */
+UINTN
+CpuNumCores (
+ VOID
+ );
+
+#endif /* __CHASSIS_H__ */
diff --git a/Silicon/NXP/Chassis/Chassis2/Chassis2.dec b/Silicon/NXP/Chassis/Chassis2/Chassis2.dec
new file mode 100644
index 0000000..cf41b3c
--- /dev/null
+++ b/Silicon/NXP/Chassis/Chassis2/Chassis2.dec
@@ -0,0 +1,19 @@
+# @file
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials are licensed and made available under
+# the terms and conditions of the BSD License which accompanies this distribution.
+# The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+[Defines]
+ DEC_SPECIFICATION = 0x00010005
+
+[Includes]
+ .
diff --git a/Silicon/NXP/Chassis/Chassis2/SerDes.h b/Silicon/NXP/Chassis/Chassis2/SerDes.h
new file mode 100644
index 0000000..9fc60d3
--- /dev/null
+++ b/Silicon/NXP/Chassis/Chassis2/SerDes.h
@@ -0,0 +1,69 @@
+/** SerDes.h
+ The Header file of SerDes Module for Chassis 2
+
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __SERDES_H__
+#define __SERDES_H__
+
+#include <Uefi/UefiBaseType.h>
+
+#define SRDS_MAX_LANES 4
+
+typedef enum {
+ NONE = 0,
+ PCIE1,
+ PCIE2,
+ PCIE3,
+ SATA,
+ SGMII_FM1_DTSEC1,
+ SGMII_FM1_DTSEC2,
+ SGMII_FM1_DTSEC5,
+ SGMII_FM1_DTSEC6,
+ SGMII_FM1_DTSEC9,
+ SGMII_FM1_DTSEC10,
+ QSGMII_FM1_A,
+ XFI_FM1_MAC9,
+ XFI_FM1_MAC10,
+ SGMII_2500_FM1_DTSEC2,
+ SGMII_2500_FM1_DTSEC5,
+ SGMII_2500_FM1_DTSEC9,
+ SGMII_2500_FM1_DTSEC10,
+ SERDES_PRTCL_COUNT
+} SERDES_PROTOCOL;
+
+typedef enum {
+ SRDS_1 = 0,
+ SRDS_2,
+ SRDS_MAX_NUM
+} SERDES_NUMBER;
+
+typedef struct {
+ UINT16 Protocol;
+ UINT8 SrdsLane[SRDS_MAX_LANES];
+} SERDES_CONFIG;
+
+typedef
+VOID
+SERDES_PROBE_LANES_CALLBACK (
+ IN SERDES_PROTOCOL LaneProtocol,
+ IN VOID *Arg
+ );
+
+VOID
+SerDesProbeLanes(
+ IN SERDES_PROBE_LANES_CALLBACK *SerDesLaneProbeCallback,
+ IN VOID *Arg
+ );
+
+#endif /* __SERDES_H */
diff --git a/Silicon/NXP/Chassis/Chassis2/Soc.c b/Silicon/NXP/Chassis/Chassis2/Soc.c
new file mode 100644
index 0000000..2f57929
--- /dev/null
+++ b/Silicon/NXP/Chassis/Chassis2/Soc.c
@@ -0,0 +1,145 @@
+/** @Soc.c
+ SoC specific Library containg functions to initialize various SoC components
+
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Base.h>
+#include <Chassis.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib/MemLibInternals.h>
+#include <Library/DebugLib.h>
+#include <Library/IoLib.h>
+#include <Library/PcdLib.h>
+#include <Library/PrintLib.h>
+#include <Library/SerialPortLib.h>
+
+#include "Soc.h"
+
+VOID
+GetSysInfo (
+ OUT SYS_INFO *PtrSysInfo
+ )
+{
+ CCSR_GUR *GurBase;
+ CCSR_CLOCK *ClkBase;
+ UINTN CpuIndex;
+ UINT32 TempRcw;
+ UINT32 CPllSel;
+ UINT32 CplxPll;
+ CONST UINT8 CoreCplxPll[8] = {
+ [0] = 0, /* CC1 PPL / 1 */
+ [1] = 0, /* CC1 PPL / 2 */
+ [4] = 1, /* CC2 PPL / 1 */
+ [5] = 1, /* CC2 PPL / 2 */
+ };
+
+ CONST UINT8 CoreCplxPllDivisor[8] = {
+ [0] = 1, /* CC1 PPL / 1 */
+ [1] = 2, /* CC1 PPL / 2 */
+ [4] = 1, /* CC2 PPL / 1 */
+ [5] = 2, /* CC2 PPL / 2 */
+ };
+
+ UINTN PllCount;
+ UINTN FreqCPll[NUM_CC_PLLS];
+ UINTN PllRatio[NUM_CC_PLLS];
+ UINTN SysClk;
+
+ GurBase = (VOID *)PcdGet64 (PcdGutsBaseAddr);
+ ClkBase = (VOID *)PcdGet64 (PcdClkBaseAddr);
+ SysClk = CLK_FREQ;
+
+ InternalMemZeroMem(PtrSysInfo, sizeof (SYS_INFO));
+
+ PtrSysInfo->FreqSystemBus = SysClk;
+ PtrSysInfo->FreqDdrBus = SysClk;
+
+ PtrSysInfo->FreqSystemBus *= (GurRead ((UINTN)&GurBase->RcwSr[0]) >>
+ CHASSIS2_RCWSR0_SYS_PLL_RAT_SHIFT) &
+ CHASSIS2_RCWSR0_SYS_PLL_RAT_MASK;
+ PtrSysInfo->FreqDdrBus *= (GurRead ((UINTN)&GurBase->RcwSr[0]) >>
+ CHASSIS2_RCWSR0_MEM_PLL_RAT_SHIFT) &
+ CHASSIS2_RCWSR0_MEM_PLL_RAT_MASK;
+
+ for (PllCount = 0; PllCount < NUM_CC_PLLS; PllCount++) {
+ PllRatio[PllCount] = (GurRead ((UINTN)&ClkBase->PllCgSr[PllCount].PllCnGSr) >> 1) & 0xff;
+ if (PllRatio[PllCount] > 4) {
+ FreqCPll[PllCount] = SysClk * PllRatio[PllCount];
+ } else {
+ FreqCPll[PllCount] = PtrSysInfo->FreqSystemBus * PllRatio[PllCount];
+ }
+ }
+
+ for (CpuIndex = 0; CpuIndex < MAX_CPUS; CpuIndex++) {
+ CPllSel = (GurRead ((UINTN)&ClkBase->ClkcSr[CpuIndex].ClkCnCSr) >> 27) & 0xf;
+ CplxPll = CoreCplxPll[CPllSel];
+
+ PtrSysInfo->FreqProcessor[CpuIndex] = FreqCPll[CplxPll] / CoreCplxPllDivisor[CPllSel];
+ }
+
+ TempRcw = GurRead ((UINTN)&GurBase->RcwSr[7]);
+ switch ((TempRcw & HWA_CGA_M1_CLK_SEL) >> HWA_CGA_M1_CLK_SHIFT) {
+ case 2:
+ PtrSysInfo->FreqFman[0] = FreqCPll[0] / 2;
+ break;
+ case 3:
+ PtrSysInfo->FreqFman[0] = FreqCPll[0] / 3;
+ break;
+ case 4:
+ PtrSysInfo->FreqFman[0] = FreqCPll[0] / 4;
+ break;
+ case 5:
+ PtrSysInfo->FreqFman[0] = PtrSysInfo->FreqSystemBus;
+ break;
+ case 6:
+ PtrSysInfo->FreqFman[0] = FreqCPll[1] / 2;
+ break;
+ case 7:
+ PtrSysInfo->FreqFman[0] = FreqCPll[1] / 3;
+ break;
+ default:
+ DEBUG ((DEBUG_WARN, "Error: Unknown FMan1 clock select!\n"));
+ break;
+ }
+ PtrSysInfo->FreqSdhc = PtrSysInfo->FreqSystemBus/PcdGet32 (PcdPlatformFreqDiv);
+ PtrSysInfo->FreqQman = PtrSysInfo->FreqSystemBus/PcdGet32 (PcdPlatformFreqDiv);
+}
+
+/**
+ Function to initialize SoC specific constructs
+ // CPU Info
+ // SoC Personality
+ // Board Personality
+ // RCW prints
+ **/
+VOID
+SocInit (
+ VOID
+ )
+{
+ CHAR8 Buffer[100];
+ UINTN CharCount;
+
+ SmmuInit ();
+
+ // Initialize the Serial Port
+ SerialPortInitialize ();
+ CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "\nUEFI firmware (version %s built at %a on %a)\n\r",
+ (CHAR16*)PcdGetPtr (PcdFirmwareVersionString), __TIME__, __DATE__);
+ SerialPortWrite ((UINT8 *) Buffer, CharCount);
+
+ PrintCpuInfo ();
+ PrintRCW ();
+
+ return;
+}
diff --git a/Silicon/NXP/Chassis/Chassis2/Soc.h b/Silicon/NXP/Chassis/Chassis2/Soc.h
new file mode 100644
index 0000000..cb9338e
--- /dev/null
+++ b/Silicon/NXP/Chassis/Chassis2/Soc.h
@@ -0,0 +1,376 @@
+/** Soc.h
+* Header defining the Base addresses, sizes, flags etc for chassis 1
+*
+* Copyright 2017 NXP
+*
+* This program and the accompanying materials
+* are licensed and made available under the terms and conditions of the BSD License
+* which accompanies this distribution. The full text of the license may be found at
+* http://opensource.org/licenses/bsd-license.php
+*
+* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#ifndef __SOC_H__
+#define __SOC_H__
+
+#define HWA_CGA_M1_CLK_SEL 0xe0000000
+#define HWA_CGA_M1_CLK_SHIFT 29
+
+#define TP_CLUSTER_EOC_MASK 0xc0000000 /* end of clusters mask */
+#define NUM_CC_PLLS 2
+#define CLK_FREQ 100000000
+#define MAX_CPUS 4
+#define NUM_FMAN 1
+#define CHECK_CLUSTER(Cluster) ((Cluster & TP_CLUSTER_EOC_MASK) == 0x0)
+
+/* RCW SERDES MACRO */
+#define RCWSR_INDEX 4
+#define RCWSR_SRDS1_PRTCL_MASK 0xffff0000
+#define RCWSR_SRDS1_PRTCL_SHIFT 16
+#define RCWSR_SRDS2_PRTCL_MASK 0x0000ffff
+#define RCWSR_SRDS2_PRTCL_SHIFT 0
+
+/* SMMU Defintions */
+#define SMMU_BASE_ADDR 0x09000000
+#define SMMU_REG_SCR0 (SMMU_BASE_ADDR + 0x0)
+#define SMMU_REG_SACR (SMMU_BASE_ADDR + 0x10)
+#define SMMU_REG_IDR1 (SMMU_BASE_ADDR + 0x24)
+#define SMMU_REG_NSCR0 (SMMU_BASE_ADDR + 0x400)
+#define SMMU_REG_NSACR (SMMU_BASE_ADDR + 0x410)
+
+#define SCR0_USFCFG_MASK 0x00000400
+#define SCR0_CLIENTPD_MASK 0x00000001
+#define SACR_PAGESIZE_MASK 0x00010000
+#define IDR1_PAGESIZE_MASK 0x80000000
+
+typedef struct {
+ UINTN FreqProcessor[MAX_CPUS];
+ UINTN FreqSystemBus;
+ UINTN FreqDdrBus;
+ UINTN FreqLocalBus;
+ UINTN FreqSdhc;
+ UINTN FreqFman[NUM_FMAN];
+ UINTN FreqQman;
+} SYS_INFO;
+
+typedef enum {
+ ARM_CLK = 0,
+ BUS_CLK,
+ UART_CLK,
+ ESDHC_CLK,
+ I2C_CLK,
+ DSPI_CLK,
+} PERIPHERAL_CLOCK;
+
+/* Device Configuration and Pin Control */
+typedef struct {
+ UINT32 PorSr1; /* POR status 1 */
+#define CHASSIS2_CCSR_PORSR1_RCW_MASK 0xFF800000
+ UINT32 PorSr2; /* POR status 2 */
+ UINT8 Res008[0x20-0x8];
+ UINT32 GppOrCr1; /* General-purpose POR configuration */
+ UINT32 GppOrCr2;
+ UINT32 DcfgFuseSr; /* Fuse status register */
+ UINT8 Res02c[0x70-0x2c];
+ UINT32 DevDisr; /* Device disable control */
+ UINT32 DevDisr2; /* Device disable control 2 */
+ UINT32 DevDisr3; /* Device disable control 3 */
+ UINT32 DevDisr4; /* Device disable control 4 */
+ UINT32 DevDisr5; /* Device disable control 5 */
+ UINT32 DevDisr6; /* Device disable control 6 */
+ UINT32 DevDisr7; /* Device disable control 7 */
+ UINT8 Res08c[0x94-0x8c];
+ UINT32 CoreDisrU; /* uppper portion for support of 64 cores */
+ UINT32 CoreDisrL; /* lower portion for support of 64 cores */
+ UINT8 Res09c[0xa0-0x9c];
+ UINT32 Pvr; /* Processor version */
+ UINT32 Svr; /* System version */
+ UINT32 Mvr; /* Manufacturing version */
+ UINT8 Res0ac[0xb0-0xac];
+ UINT32 RstCr; /* Reset control */
+ UINT32 RstRqPblSr; /* Reset request preboot loader status */
+ UINT8 Res0b8[0xc0-0xb8];
+ UINT32 RstRqMr1; /* Reset request mask */
+ UINT8 Res0c4[0xc8-0xc4];
+ UINT32 RstRqSr1; /* Reset request status */
+ UINT8 Res0cc[0xd4-0xcc];
+ UINT32 RstRqWdTmrL; /* Reset request WDT mask */
+ UINT8 Res0d8[0xdc-0xd8];
+ UINT32 RstRqWdtSrL; /* Reset request WDT status */
+ UINT8 Res0e0[0xe4-0xe0];
+ UINT32 BrrL; /* Boot release */
+ UINT8 Res0e8[0x100-0xe8];
+ UINT32 RcwSr[16]; /* Reset control word status */
+#define CHASSIS2_RCWSR0_SYS_PLL_RAT_SHIFT 25
+#define CHASSIS2_RCWSR0_SYS_PLL_RAT_MASK 0x1f
+#define CHASSIS2_RCWSR0_MEM_PLL_RAT_SHIFT 16
+#define CHASSIS2_RCWSR0_MEM_PLL_RAT_MASK 0x3f
+ UINT8 Res140[0x200-0x140];
+ UINT32 ScratchRw[4]; /* Scratch Read/Write */
+ UINT8 Res210[0x300-0x210];
+ UINT32 ScratcHw1R[4]; /* Scratch Read (Write once) */
+ UINT8 Res310[0x400-0x310];
+ UINT32 CrstSr[12];
+ UINT8 Res430[0x500-0x430];
+ /* PCI Express n Logical I/O Device Number register */
+ UINT32 DcfgCcsrPex1LiodNr;
+ UINT32 DcfgCcsrPex2LiodNr;
+ UINT32 DcfgCcsrPex3LiodNr;
+ UINT32 DcfgCcsrPex4LiodNr;
+ /* RIO n Logical I/O Device Number register */
+ UINT32 DcfgCcsrRio1LiodNr;
+ UINT32 DcfgCcsrRio2LiodNr;
+ UINT32 DcfgCcsrRio3LiodNr;
+ UINT32 DcfgCcsrRio4LiodNr;
+ /* USB Logical I/O Device Number register */
+ UINT32 DcfgCcsrUsb1LiodNr;
+ UINT32 DcfgCcsrUsb2LiodNr;
+ UINT32 DcfgCcsrUsb3LiodNr;
+ UINT32 DcfgCcsrUsb4LiodNr;
+ /* SD/MMC Logical I/O Device Number register */
+ UINT32 DcfgCcsrSdMmc1LiodNr;
+ UINT32 DcfgCcsrSdMmc2LiodNr;
+ UINT32 DcfgCcsrSdMmc3LiodNr;
+ UINT32 DcfgCcsrSdMmc4LiodNr;
+ /* RIO Message Unit Logical I/O Device Number register */
+ UINT32 DcfgCcsrRiomaintLiodNr;
+ UINT8 Res544[0x550-0x544];
+ UINT32 SataLiodNr[4];
+ UINT8 Res560[0x570-0x560];
+ UINT32 DcfgCcsrMisc1LiodNr;
+ UINT32 DcfgCcsrMisc2LiodNr;
+ UINT32 DcfgCcsrMisc3LiodNr;
+ UINT32 DcfgCcsrMisc4LiodNr;
+ UINT32 DcfgCcsrDma1LiodNr;
+ UINT32 DcfgCcsrDma2LiodNr;
+ UINT32 DcfgCcsrDma3LiodNr;
+ UINT32 DcfgCcsrDma4LiodNr;
+ UINT32 DcfgCcsrSpare1LiodNr;
+ UINT32 DcfgCcsrSpare2LiodNr;
+ UINT32 DcfgCcsrSpare3LiodNr;
+ UINT32 DcfgCcsrSpare4LiodNr;
+ UINT8 Res5a0[0x600-0x5a0];
+ UINT32 DcfgCcsrPblSr;
+ UINT32 PamuBypENr;
+ UINT32 DmaCr1;
+ UINT8 Res60c[0x610-0x60c];
+ UINT32 DcfgCcsrGenSr1;
+ UINT32 DcfgCcsrGenSr2;
+ UINT32 DcfgCcsrGenSr3;
+ UINT32 DcfgCcsrGenSr4;
+ UINT32 DcfgCcsrGenCr1;
+ UINT32 DcfgCcsrGenCr2;
+ UINT32 DcfgCcsrGenCr3;
+ UINT32 DcfgCcsrGenCr4;
+ UINT32 DcfgCcsrGenCr5;
+ UINT32 DcfgCcsrGenCr6;
+ UINT32 DcfgCcsrGenCr7;
+ UINT8 Res63c[0x658-0x63c];
+ UINT32 DcfgCcsrcGenSr1;
+ UINT32 DcfgCcsrcGenSr0;
+ UINT8 Res660[0x678-0x660];
+ UINT32 DcfgCcsrcGenCr1;
+ UINT32 DcfgCcsrcGenCr0;
+ UINT8 Res680[0x700-0x680];
+ UINT32 DcfgCcsrSrIoPstecr;
+ UINT32 DcfgCcsrDcsrCr;
+ UINT8 Res708[0x740-0x708]; /* add more registers when needed */
+ UINT32 TpItyp[64]; /* Topology Initiator Type Register */
+ struct {
+ UINT32 Upper;
+ UINT32 Lower;
+ } TpCluster[16];
+ UINT8 Res8c0[0xa00-0x8c0]; /* add more registers when needed */
+ UINT32 DcfgCcsrQmBmWarmRst;
+ UINT8 Resa04[0xa20-0xa04]; /* add more registers when needed */
+ UINT32 DcfgCcsrReserved0;
+ UINT32 DcfgCcsrReserved1;
+} CCSR_GUR;
+
+/* Supplemental Configuration Unit */
+typedef struct {
+ UINT8 Res000[0x070-0x000];
+ UINT32 Usb1Prm1Cr;
+ UINT32 Usb1Prm2Cr;
+ UINT32 Usb1Prm3Cr;
+ UINT32 Usb2Prm1Cr;
+ UINT32 Usb2Prm2Cr;
+ UINT32 Usb2Prm3Cr;
+ UINT32 Usb3Prm1Cr;
+ UINT32 Usb3Prm2Cr;
+ UINT32 Usb3Prm3Cr;
+ UINT8 Res094[0x100-0x094];
+ UINT32 Usb2Icid;
+ UINT32 Usb3Icid;
+ UINT8 Res108[0x114-0x108];
+ UINT32 DmaIcid;
+ UINT32 SataIcid;
+ UINT32 Usb1Icid;
+ UINT32 QeIcid;
+ UINT32 SdhcIcid;
+ UINT32 EdmaIcid;
+ UINT32 EtrIcid;
+ UINT32 Core0SftRst;
+ UINT32 Core1SftRst;
+ UINT32 Core2SftRst;
+ UINT32 Core3SftRst;
+ UINT8 Res140[0x158-0x140];
+ UINT32 AltCBar;
+ UINT32 QspiCfg;
+ UINT8 Res160[0x180-0x160];
+ UINT32 DmaMcr;
+ UINT8 Res184[0x188-0x184];
+ UINT32 GicAlign;
+ UINT32 DebugIcid;
+ UINT8 Res190[0x1a4-0x190];
+ UINT32 SnpCnfGcr;
+#define CCSR_SCFG_SNPCNFGCR_SECRDSNP BIT31
+#define CCSR_SCFG_SNPCNFGCR_SECWRSNP BIT30
+#define CCSR_SCFG_SNPCNFGCR_SATARDSNP BIT23
+#define CCSR_SCFG_SNPCNFGCR_SATAWRSNP BIT22
+#define CCSR_SCFG_SNPCNFGCR_USB1RDSNP BIT21
+#define CCSR_SCFG_SNPCNFGCR_USB1WRSNP BIT20
+#define CCSR_SCFG_SNPCNFGCR_USB2RDSNP BIT15
+#define CCSR_SCFG_SNPCNFGCR_USB2WRSNP BIT16
+#define CCSR_SCFG_SNPCNFGCR_USB3RDSNP BIT13
+#define CCSR_SCFG_SNPCNFGCR_USB3WRSNP BIT14
+ UINT8 Res1a8[0x1ac-0x1a8];
+ UINT32 IntpCr;
+ UINT8 Res1b0[0x204-0x1b0];
+ UINT32 CoreSrEnCr;
+ UINT8 Res208[0x220-0x208];
+ UINT32 RvBar00;
+ UINT32 RvBar01;
+ UINT32 RvBar10;
+ UINT32 RvBar11;
+ UINT32 RvBar20;
+ UINT32 RvBar21;
+ UINT32 RvBar30;
+ UINT32 RvBar31;
+ UINT32 LpmCsr;
+ UINT8 Res244[0x400-0x244];
+ UINT32 QspIdQScr;
+ UINT32 EcgTxcMcr;
+ UINT32 SdhcIoVSelCr;
+ UINT32 RcwPMuxCr0;
+ /**Setting RCW PinMux Register bits 17-19 to select USB2_DRVVBUS
+ *Setting RCW PinMux Register bits 21-23 to select USB2_PWRFAULT
+ *Setting RCW PinMux Register bits 25-27 to select USB3_DRVVBUS
+ Setting RCW PinMux Register bits 29-31 to select USB3_DRVVBUS*/
+#define CCSR_SCFG_RCWPMUXCRO_SELCR_USB 0x3333
+ /**Setting RCW PinMux Register bits 17-19 to select USB2_DRVVBUS
+ *Setting RCW PinMux Register bits 21-23 to select USB2_PWRFAULT
+ *Setting RCW PinMux Register bits 25-27 to select IIC4_SCL
+ Setting RCW PinMux Register bits 29-31 to select IIC4_SDA*/
+#define CCSR_SCFG_RCWPMUXCRO_NOT_SELCR_USB 0x3300
+ UINT32 UsbDrvVBusSelCr;
+#define CCSR_SCFG_USBDRVVBUS_SELCR_USB1 0x00000000
+#define CCSR_SCFG_USBDRVVBUS_SELCR_USB2 0x00000001
+#define CCSR_SCFG_USBDRVVBUS_SELCR_USB3 0x00000003
+ UINT32 UsbPwrFaultSelCr;
+#define CCSR_SCFG_USBPWRFAULT_INACTIVE 0x00000000
+#define CCSR_SCFG_USBPWRFAULT_SHARED 0x00000001
+#define CCSR_SCFG_USBPWRFAULT_DEDICATED 0x00000002
+#define CCSR_SCFG_USBPWRFAULT_USB3_SHIFT 4
+#define CCSR_SCFG_USBPWRFAULT_USB2_SHIFT 2
+#define CCSR_SCFG_USBPWRFAULT_USB1_SHIFT 0
+ UINT32 UsbRefclkSelcr1;
+ UINT32 UsbRefclkSelcr2;
+ UINT32 UsbRefclkSelcr3;
+ UINT8 Res424[0x600-0x424];
+ UINT32 ScratchRw[4];
+ UINT8 Res610[0x680-0x610];
+ UINT32 CoreBCr;
+ UINT8 Res684[0x1000-0x684];
+ UINT32 Pex1MsiIr;
+ UINT32 Pex1MsiR;
+ UINT8 Res1008[0x2000-0x1008];
+ UINT32 Pex2;
+ UINT32 Pex2MsiR;
+ UINT8 Res2008[0x3000-0x2008];
+ UINT32 Pex3MsiIr;
+ UINT32 Pex3MsiR;
+} CCSR_SCFG;
+
+#define USB_TXVREFTUNE 0x9
+#define USB_SQRXTUNE 0xFC7FFFFF
+#define USB_PCSTXSWINGFULL 0x47
+#define USB_PHY_RX_EQ_VAL_1 0x0000
+#define USB_PHY_RX_EQ_VAL_2 0x8000
+#define USB_PHY_RX_EQ_VAL_3 0x8003
+#define USB_PHY_RX_EQ_VAL_4 0x800b
+
+/*USB_PHY_SS memory map*/
+typedef struct {
+ UINT16 IpIdcodeLo;
+ UINT16 SupIdcodeHi;
+ UINT8 Res4[0x0006-0x0004];
+ UINT16 RtuneDebug;
+ UINT16 RtuneStat;
+ UINT16 SupSsPhase;
+ UINT16 SsFreq;
+ UINT8 ResE[0x0020-0x000e];
+ UINT16 Ateovrd;
+ UINT16 MpllOvrdInLo;
+ UINT8 Res24[0x0026-0x0024];
+ UINT16 SscOvrdIn;
+ UINT8 Res28[0x002A-0x0028];
+ UINT16 LevelOvrdIn;
+ UINT8 Res2C[0x0044-0x002C];
+ UINT16 ScopeCount;
+ UINT8 Res46[0x0060-0x0046];
+ UINT16 MpllLoopCtl;
+ UINT8 Res62[0x006C-0x0062];
+ UINT16 SscClkCntrl;
+ UINT8 Res6E[0x2002-0x006E];
+ UINT16 Lane0TxOvrdInHi;
+ UINT16 Lane0TxOvrdDrvLo;
+ UINT8 Res2006[0x200C-0x2006];
+ UINT16 Lane0RxOvrdInHi;
+ UINT8 Res200E[0x2022-0x200E];
+ UINT16 Lane0TxCmWaitTimeOvrd;
+ UINT8 Res2024[0x202A-0x2024];
+ UINT16 Lane0TxLbertCtl;
+ UINT16 Lane0RxLbertCtl;
+ UINT16 Lane0RxLbertErr;
+ UINT8 Res2030[0x205A-0x2030];
+ UINT16 Lane0TxAltBlock;
+} CCSR_USB_PHY;
+
+/* Clocking */
+typedef struct {
+ struct {
+ UINT32 ClkCnCSr; /* core cluster n clock control status */
+ UINT8 Res004[0x0c];
+ UINT32 ClkcGHwAcSr; /* Clock generator n hardware accelerator */
+ UINT8 Res014[0x0c];
+ } ClkcSr[4];
+ UINT8 Res040[0x780]; /* 0x100 */
+ struct {
+ UINT32 PllCnGSr;
+ UINT8 Res804[0x1c];
+ } PllCgSr[2];
+ UINT8 Res840[0x1c0];
+ UINT32 ClkPCSr; /* 0xa00 Platform clock domain control/status */
+ UINT8 Resa04[0x1fc];
+ UINT32 PllPGSr; /* 0xc00 Platform PLL General Status */
+ UINT8 Resc04[0x1c];
+ UINT32 PllDGSr; /* 0xc20 DDR PLL General Status */
+ UINT8 Resc24[0x3dc];
+} CCSR_CLOCK;
+
+VOID
+GetSysInfo (
+ OUT SYS_INFO *
+ );
+
+UINT32
+EFIAPI
+GurRead (
+ IN UINTN Address
+ );
+
+#endif /* __SOC_H__ */
diff --git a/Silicon/NXP/Chassis/LS1043aSocLib.inf b/Silicon/NXP/Chassis/LS1043aSocLib.inf
new file mode 100644
index 0000000..e6e7ac4
--- /dev/null
+++ b/Silicon/NXP/Chassis/LS1043aSocLib.inf
@@ -0,0 +1,47 @@
+# @file
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+[Defines]
+ INF_VERSION = 0x0001001A
+ BASE_NAME = SocLib
+ FILE_GUID = e868c5ca-9729-43ae-bff4-438c67de8c68
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = SocLib
+
+[Packages]
+ MdeModulePkg/MdeModulePkg.dec
+ MdePkg/MdePkg.dec
+ Platform/NXP/NxpQoriqLs.dec
+ Silicon/NXP/Chassis/Chassis2/Chassis2.dec
+ Silicon/NXP/LS1043A/LS1043A.dec
+
+[LibraryClasses]
+ BaseLib
+ BeIoLib
+ DebugLib
+ SerialPortLib
+
+[Sources.common]
+ Chassis.c
+ Chassis2/Soc.c
+ SerDes.c
+
+[FixedPcd]
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString
+ gNxpQoriqLsTokenSpaceGuid.PcdGutsBaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdPlatformFreqDiv
+ gNxpQoriqLsTokenSpaceGuid.PcdSerdes2Enabled
+ gNxpQoriqLsTokenSpaceGuid.PcdGurBigEndian
+ gNxpQoriqLsTokenSpaceGuid.PcdClkBaseAddr
diff --git a/Silicon/NXP/Chassis/SerDes.c b/Silicon/NXP/Chassis/SerDes.c
new file mode 100644
index 0000000..e9a8ab7
--- /dev/null
+++ b/Silicon/NXP/Chassis/SerDes.c
@@ -0,0 +1,254 @@
+/** SerDes.c
+ Provides the basic interfaces for SerDes Module
+
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Bitops.h>
+#include <Library/DebugLib.h>
+#include <SerDes.h>
+#include <SocSerDes.h>
+#include <Soc.h>
+#include <Uefi.h>
+
+/**
+ Function to get serdes Lane protocol corresponding to
+ serdes protocol.
+
+ @param SerDes Serdes number.
+ @param Cfg Serdes Protocol.
+ @param Lane Serdes Lane number.
+
+ @return Serdes Lane protocol.
+
+**/
+STATIC
+SERDES_PROTOCOL
+GetSerDesPrtcl (
+ IN INTN SerDes,
+ IN INTN Cfg,
+ IN INTN Lane
+ )
+{
+ SERDES_CONFIG *Config;
+
+ if (SerDes >= ARRAY_SIZE (SerDesConfigTbl)) {
+ return 0;
+ }
+
+ Config = SerDesConfigTbl[SerDes];
+ while (Config->Protocol) {
+ if (Config->Protocol == Cfg) {
+ return Config->SrdsLane[Lane];
+ }
+ Config++;
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Function to check if inputted protocol is a valid serdes protocol.
+
+ @param SerDes Serdes number.
+ @param Prtcl Serdes Protocol to be verified.
+
+ @return EFI_INVALID_PARAMETER Input parameter in invalid.
+ @return EFI_NOT_FOUND Serdes Protocol not a valid protocol.
+ @return EFI_SUCCESS Serdes Protocol is a valid protocol.
+
+**/
+STATIC
+EFI_STATUS
+CheckSerDesPrtclValid (
+ IN INTN SerDes,
+ IN UINT32 Prtcl
+ )
+{
+ SERDES_CONFIG *Config;
+ INTN Cnt;
+
+ if (SerDes >= ARRAY_SIZE (SerDesConfigTbl)) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Config = SerDesConfigTbl[SerDes];
+ while (Config->Protocol) {
+ if (Config->Protocol == Prtcl) {
+ DEBUG ((DEBUG_INFO, "Protocol: %x Matched with the one in Table\n", Prtcl));
+ break;
+ }
+ Config++;
+ }
+
+ if (!Config->Protocol) {
+ return EFI_NOT_FOUND;
+ }
+
+ for (Cnt = 0; Cnt < SRDS_MAX_LANES; Cnt++) {
+ if (Config->SrdsLane[Cnt] != NONE) {
+ return EFI_SUCCESS;
+ }
+ }
+
+ return EFI_NOT_FOUND;
+}
+
+/**
+ Function to fill serdes map information.
+
+ @param Srds Serdes number.
+ @param SerdesProtocolMask Serdes Protocol Mask.
+ @param SerdesProtocolShift Serdes Protocol shift value.
+ @param SerDesPrtclMap Pointer to Serdes Protocol map.
+
+**/
+STATIC
+VOID
+LSSerDesMap (
+ IN UINT32 Srds,
+ IN UINT32 SerdesProtocolMask,
+ IN UINT32 SerdesProtocolShift,
+ OUT UINT64 *SerDesPrtclMap
+ )
+{
+ CCSR_GUR *Gur;
+ UINT32 SrdsProt;
+ INTN Lane;
+ UINT32 Flag;
+
+ Gur = (VOID *)PcdGet64 (PcdGutsBaseAddr);
+ *SerDesPrtclMap = 0x0;
+ Flag = 0;
+
+ SrdsProt = GurRead ((UINTN)&Gur->RcwSr[RCWSR_INDEX]) & SerdesProtocolMask;
+ SrdsProt >>= SerdesProtocolShift;
+
+ DEBUG ((DEBUG_INFO, "Using SERDES%d Protocol: %d (0x%x)\n",
+ Srds + 1, SrdsProt, SrdsProt));
+
+ if (EFI_SUCCESS != CheckSerDesPrtclValid (Srds, SrdsProt)) {
+ DEBUG ((DEBUG_ERROR, "SERDES%d[PRTCL] = 0x%x is not valid\n",
+ Srds + 1, SrdsProt));
+ Flag++;
+ }
+
+ for (Lane = 0; Lane < SRDS_MAX_LANES; Lane++) {
+ SERDES_PROTOCOL LanePrtcl = GetSerDesPrtcl (Srds, SrdsProt, Lane);
+ if (LanePrtcl >= SERDES_PRTCL_COUNT) {
+ DEBUG ((DEBUG_ERROR, "Unknown SerDes lane protocol %d\n", LanePrtcl));
+ Flag++;
+ } else {
+ *SerDesPrtclMap |= BIT (LanePrtcl);
+ }
+ }
+
+ if (Flag) {
+ DEBUG ((DEBUG_ERROR, "Could not configure SerDes module!!\n"));
+ } else {
+ DEBUG ((DEBUG_INFO, "Successfully configured SerDes module!!\n"));
+ }
+}
+
+STATIC
+VOID
+SerDesInstanceProbeLanes (
+ IN UINT32 Srds,
+ IN UINT32 SerdesProtocolMask,
+ IN UINT32 SerdesProtocolShift,
+ IN SERDES_PROBE_LANES_CALLBACK *SerDesLaneProbeCallback,
+ IN VOID *Arg
+ )
+{
+
+ CCSR_GUR *Gur;
+ UINT32 SrdsProt;
+ INTN Lane;
+
+ Gur = (VOID *)PcdGet64 (PcdGutsBaseAddr);;
+
+ SrdsProt = GurRead ((UINTN)&Gur->RcwSr[RCWSR_INDEX]) & SerdesProtocolMask;
+ SrdsProt >>= SerdesProtocolShift;
+
+ /*
+ * Invoke callback for all lanes in the SerDes instance:
+ */
+ for (Lane = 0; Lane < SRDS_MAX_LANES; Lane++) {
+ SERDES_PROTOCOL LanePrtcl = GetSerDesPrtcl (Srds, SrdsProt, Lane);
+ if (LanePrtcl >= SERDES_PRTCL_COUNT || LanePrtcl < NONE) {
+ DEBUG ((DEBUG_ERROR, "Unknown SerDes lane protocol %d\n", LanePrtcl));
+ }
+ else if (LanePrtcl != NONE) {
+ SerDesLaneProbeCallback (LanePrtcl, Arg);
+ }
+ }
+}
+
+VOID
+SerDesProbeLanes (
+ IN SERDES_PROBE_LANES_CALLBACK *SerDesLaneProbeCallback,
+ IN VOID *Arg
+ )
+{
+ SerDesInstanceProbeLanes (SRDS_1,
+ RCWSR_SRDS1_PRTCL_MASK,
+ RCWSR_SRDS1_PRTCL_SHIFT,
+ SerDesLaneProbeCallback,
+ Arg);
+
+ if (PcdGetBool (PcdSerdes2Enabled)) {
+ SerDesInstanceProbeLanes (SRDS_2,
+ RCWSR_SRDS2_PRTCL_MASK,
+ RCWSR_SRDS2_PRTCL_SHIFT,
+ SerDesLaneProbeCallback,
+ Arg);
+ }
+}
+
+/**
+ Function to return Serdes protocol map for all serdes available on board.
+
+ @param SerDesPrtclMap Pointer to Serdes protocl map.
+
+**/
+VOID
+GetSerdesProtocolMaps (
+ OUT UINT64 *SerDesPrtclMap
+ )
+{
+ LSSerDesMap (SRDS_1,
+ RCWSR_SRDS1_PRTCL_MASK,
+ RCWSR_SRDS1_PRTCL_SHIFT,
+ SerDesPrtclMap);
+
+ if (PcdGetBool (PcdSerdes2Enabled)) {
+ LSSerDesMap (SRDS_2,
+ RCWSR_SRDS2_PRTCL_MASK,
+ RCWSR_SRDS2_PRTCL_SHIFT,
+ SerDesPrtclMap);
+ }
+
+}
+
+BOOLEAN
+IsSerDesLaneProtocolConfigured (
+ IN UINT64 SerDesPrtclMap,
+ IN SERDES_PROTOCOL Device
+ )
+{
+ if (Device >= SERDES_PRTCL_COUNT || Device < NONE) {
+ ASSERT (Device > NONE && Device < SERDES_PRTCL_COUNT);
+ DEBUG ((DEBUG_ERROR, "Unknown SerDes lane protocol Device %d\n", Device));
+ }
+
+ return (SerDesPrtclMap & BIT (Device)) != 0 ;
+}
diff --git a/Silicon/NXP/LS1043A/Include/SocSerDes.h b/Silicon/NXP/LS1043A/Include/SocSerDes.h
new file mode 100644
index 0000000..90e165f
--- /dev/null
+++ b/Silicon/NXP/LS1043A/Include/SocSerDes.h
@@ -0,0 +1,55 @@
+/** @file
+ The Header file of SerDes Module for LS1043A
+
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __SOC_SERDES_H__
+#define __SOC_SERDES_H__
+
+#include <SerDes.h>
+
+SERDES_CONFIG SerDes1ConfigTbl[] = {
+ /* SerDes 1 */
+ {0x1555, {XFI_FM1_MAC9, PCIE1, PCIE2, PCIE3 } },
+ {0x2555, {SGMII_2500_FM1_DTSEC9, PCIE1, PCIE2, PCIE3 } },
+ {0x4555, {QSGMII_FM1_A, PCIE1, PCIE2, PCIE3 } },
+ {0x4558, {QSGMII_FM1_A, PCIE1, PCIE2, SATA } },
+ {0x1355, {XFI_FM1_MAC9, SGMII_FM1_DTSEC2, PCIE2, PCIE3 } },
+ {0x2355, {SGMII_2500_FM1_DTSEC9, SGMII_FM1_DTSEC2, PCIE2, PCIE3 } },
+ {0x3335, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC2, SGMII_FM1_DTSEC5, PCIE3 } },
+ {0x3355, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC2, PCIE2, PCIE3 } },
+ {0x3358, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC2, PCIE2, SATA } },
+ {0x3555, {SGMII_FM1_DTSEC9, PCIE1, PCIE2, PCIE3 } },
+ {0x3558, {SGMII_FM1_DTSEC9, PCIE1, PCIE2, SATA } },
+ {0x7000, {PCIE1, PCIE1, PCIE1, PCIE1 } },
+ {0x9998, {PCIE1, PCIE2, PCIE3, SATA } },
+ {0x6058, {PCIE1, PCIE1, PCIE2, SATA } },
+ {0x1455, {XFI_FM1_MAC9, QSGMII_FM1_A, PCIE2, PCIE3 } },
+ {0x2455, {SGMII_2500_FM1_DTSEC9, QSGMII_FM1_A, PCIE2, PCIE3 } },
+ {0x2255, {SGMII_2500_FM1_DTSEC9, SGMII_2500_FM1_DTSEC2, PCIE2, PCIE3 } },
+ {0x3333, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC2, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6 } },
+ {0x1460, {XFI_FM1_MAC9, QSGMII_FM1_A, PCIE3, PCIE3 } },
+ {0x2460, {SGMII_2500_FM1_DTSEC9, QSGMII_FM1_A, PCIE3, PCIE3 } },
+ {0x3460, {SGMII_FM1_DTSEC9, QSGMII_FM1_A, PCIE3, PCIE3 } },
+ {0x3455, {SGMII_FM1_DTSEC9, QSGMII_FM1_A, PCIE2, PCIE3 } },
+ {0x9960, {PCIE1, PCIE2, PCIE3, PCIE3 } },
+ {0x2233, {SGMII_2500_FM1_DTSEC9, SGMII_FM1_DTSEC2, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6 } },
+ {0x2533, {SGMII_2500_FM1_DTSEC9, PCIE1, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6 } },
+ {}
+};
+
+SERDES_CONFIG *SerDesConfigTbl[] = {
+ SerDes1ConfigTbl
+};
+
+#endif /* __SOC_SERDES_H */
--
1.9.1
^ permalink raw reply related [flat|nested] 39+ messages in thread
* [PATCH v2 4/9] Platform/NXP : Add support for DUART library
2017-11-22 15:48 ` [PATCH v2 1/9] Platform/NXP: Add support for Big Endian Mmio APIs Meenakshi Aggarwal
2017-11-22 15:48 ` [PATCH v2 2/9] Platform/NXP : Add support for Watchdog driver Meenakshi Aggarwal
2017-11-22 15:48 ` [PATCH v2 3/9] SocLib : Add support for initialization of peripherals Meenakshi Aggarwal
@ 2017-11-22 15:48 ` Meenakshi Aggarwal
2017-11-22 15:48 ` [PATCH v2 5/9] Platform/NXP: Add support for I2c driver Meenakshi Aggarwal
` (5 subsequent siblings)
8 siblings, 0 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-22 15:48 UTC (permalink / raw)
To: ard.biesheuvel, leif.lindholm, michael.d.kinney, edk2-devel
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
---
Platform/NXP/Library/DUartPortLib/DUart.h | 128 ++++++++
Platform/NXP/Library/DUartPortLib/DUartPortLib.c | 331 +++++++++++++++++++++
Platform/NXP/Library/DUartPortLib/DUartPortLib.inf | 39 +++
3 files changed, 498 insertions(+)
create mode 100644 Platform/NXP/Library/DUartPortLib/DUart.h
create mode 100644 Platform/NXP/Library/DUartPortLib/DUartPortLib.c
create mode 100644 Platform/NXP/Library/DUartPortLib/DUartPortLib.inf
diff --git a/Platform/NXP/Library/DUartPortLib/DUart.h b/Platform/NXP/Library/DUartPortLib/DUart.h
new file mode 100644
index 0000000..907790b
--- /dev/null
+++ b/Platform/NXP/Library/DUartPortLib/DUart.h
@@ -0,0 +1,128 @@
+/** DUart.h
+* Header defining the DUART constants (Base addresses, sizes, flags)
+*
+* Based on Serial I/O Port library headers available in PL011Uart.h
+*
+* Copyright (c) 2011-2012, ARM Limited. All rights reserved.
+* Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
+* Copyright 2017 NXP
+*
+* This program and the accompanying materials
+* are licensed and made available under the terms and conditions of the BSD License
+* which accompanies this distribution. The full text of the license may be found at
+* http://opensource.org/licenses/bsd-license.php
+*
+* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#ifndef __DUART_H__
+#define __DUART_H__
+
+// FIFO Control Register
+#define DUART_FCR_FIFO_EN 0x01 /* Fifo enable */
+#define DUART_FCR_CLEAR_RCVR 0x02 /* Clear the RCVR FIFO */
+#define DUART_FCR_CLEAR_XMIT 0x04 /* Clear the XMIT FIFO */
+#define DUART_FCR_DMA_SELECT 0x08 /* For DMA applications */
+#define DUART_FCR_TRIGGER_MASK 0xC0 /* Mask for the FIFO trigger range */
+#define DUART_FCR_TRIGGER_1 0x00 /* Mask for trigger set at 1 */
+#define DUART_FCR_TRIGGER_4 0x40 /* Mask for trigger set at 4 */
+#define DUART_FCR_TRIGGER_8 0x80 /* Mask for trigger set at 8 */
+#define DUART_FCR_TRIGGER_14 0xC0 /* Mask for trigger set at 14 */
+#define DUART_FCR_RXSR 0x02 /* Receiver soft reset */
+#define DUART_FCR_TXSR 0x04 /* Transmitter soft reset */
+
+// Modem Control Register
+#define DUART_MCR_DTR 0x01 /* Reserved */
+#define DUART_MCR_RTS 0x02 /* RTS */
+#define DUART_MCR_OUT1 0x04 /* Reserved */
+#define DUART_MCR_OUT2 0x08 /* Reserved */
+#define DUART_MCR_LOOP 0x10 /* Enable loopback test mode */
+#define DUART_MCR_AFE 0x20 /* AFE (Auto Flow Control) */
+#define DUART_MCR_DMA_EN 0x04
+#define DUART_MCR_TX_DFR 0x08
+
+// Line Control Register
+/*
+* Note: if the word length is 5 bits (DUART_LCR_WLEN5), then setting
+* DUART_LCR_STOP will select 1.5 stop bits, not 2 stop bits.
+*/
+#define DUART_LCR_WLS_MSK 0x03 /* character length select mask */
+#define DUART_LCR_WLS_5 0x00 /* 5 bit character length */
+#define DUART_LCR_WLS_6 0x01 /* 6 bit character length */
+#define DUART_LCR_WLS_7 0x02 /* 7 bit character length */
+#define DUART_LCR_WLS_8 0x03 /* 8 bit character length */
+#define DUART_LCR_STB 0x04 /* # stop Bits, off=1, on=1.5 or 2) */
+#define DUART_LCR_PEN 0x08 /* Parity eneble */
+#define DUART_LCR_EPS 0x10 /* Even Parity Select */
+#define DUART_LCR_STKP 0x20 /* Stick Parity */
+#define DUART_LCR_SBRK 0x40 /* Set Break */
+#define DUART_LCR_BKSE 0x80 /* Bank select enable */
+#define DUART_LCR_DLAB 0x80 /* Divisor latch access bit */
+
+// Line Status Register
+#define DUART_LSR_DR 0x01 /* Data ready */
+#define DUART_LSR_OE 0x02 /* Overrun */
+#define DUART_LSR_PE 0x04 /* Parity error */
+#define DUART_LSR_FE 0x08 /* Framing error */
+#define DUART_LSR_BI 0x10 /* Break */
+#define DUART_LSR_THRE 0x20 /* Xmit holding register empty */
+#define DUART_LSR_TEMT 0x40 /* Xmitter empty */
+#define DUART_LSR_ERR 0x80 /* Error */
+
+// Modem Status Register
+#define DUART_MSR_DCTS 0x01 /* Delta CTS */
+#define DUART_MSR_DDSR 0x02 /* Reserved */
+#define DUART_MSR_TERI 0x04 /* Reserved */
+#define DUART_MSR_DDCD 0x08 /* Reserved */
+#define DUART_MSR_CTS 0x10 /* Clear to Send */
+#define DUART_MSR_DSR 0x20 /* Reserved */
+#define DUART_MSR_RI 0x40 /* Reserved */
+#define DUART_MSR_DCD 0x80 /* Reserved */
+
+// Interrupt Identification Register
+#define DUART_IIR_NO_INT 0x01 /* No interrupts pending */
+#define DUART_IIR_ID 0x06 /* Mask for the interrupt ID */
+#define DUART_IIR_MSI 0x00 /* Modem status interrupt */
+#define DUART_IIR_THRI 0x02 /* Transmitter holding register empty */
+#define DUART_IIR_RDI 0x04 /* Receiver data interrupt */
+#define DUART_IIR_RLSI 0x06 /* Receiver line status interrupt */
+
+// Interrupt Enable Register
+#define DUART_IER_MSI 0x08 /* Enable Modem status interrupt */
+#define DUART_IER_RLSI 0x04 /* Enable receiver line status interrupt */
+#define DUART_IER_THRI 0x02 /* Enable Transmitter holding register int. */
+#define DUART_IER_RDI 0x01 /* Enable receiver data interrupt */
+
+// LCR defaults
+#define DUART_LCR_8N1 0x03
+#define DUART_LCRVAL DUART_LCR_8N1 /* 8 data, 1 stop, no parity */
+#define DUART_MCRVAL (DUART_MCR_DTR | \
+ DUART_MCR_RTS) /* RTS/DTR */
+#define DUART_FCRVAL (DUART_FCR_FIFO_EN | \
+ DUART_FCR_RXSR | \
+ DUART_FCR_TXSR) /* Clear & enable FIFOs */
+
+#define URBR 0x0
+#define UTHR 0x0
+#define UDLB 0x0
+#define UDMB 0x1
+#define UIER 0x1
+#define UIIR 0x2
+#define UFCR 0x2
+#define UAFR 0x2
+#define ULCR 0x3
+#define UMCR 0x4
+#define ULSR 0x5
+#define UMSR 0x6
+#define USCR 0x7
+#define UDSR 0x10
+
+extern
+UINT32
+CalculateBaudDivisor (
+ IN UINT64 BaudRate
+ );
+
+#endif /* __DUART_H__ */
diff --git a/Platform/NXP/Library/DUartPortLib/DUartPortLib.c b/Platform/NXP/Library/DUartPortLib/DUartPortLib.c
new file mode 100644
index 0000000..b2036b8
--- /dev/null
+++ b/Platform/NXP/Library/DUartPortLib/DUartPortLib.c
@@ -0,0 +1,331 @@
+/** DuartPortLib.c
+ DUART (NS16550) library functions
+
+ Based on Serial I/O Port library functions available in PL011SerialPortLib.c
+
+ Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
+ Copyright (c) 2012 - 2013, ARM Ltd. All rights reserved.<BR>
+ Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Base.h>
+#include <Library/IoLib.h>
+#include <Library/PcdLib.h>
+#include <Library/SerialPortLib.h>
+
+#include "DUart.h"
+
+STATIC CONST UINT32 mInvalidControlBits = (EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE | \
+ EFI_SERIAL_DATA_TERMINAL_READY);
+
+/**
+ Assert or deassert the control signals on a serial port.
+ The following control signals are set according their bit settings :
+ . Request to Send
+ . Data Terminal Ready
+
+ @param[in] Control The following bits are taken into account :
+ . EFI_SERIAL_REQUEST_TO_SEND : assert/deassert the
+ "Request To Send" control signal if this bit is
+ equal to one/zero.
+ . EFI_SERIAL_DATA_TERMINAL_READY : assert/deassert
+ the "Data Terminal Ready" control signal if this
+ bit is equal to one/zero.
+ . EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE : enable/disable
+ the hardware loopback if this bit is equal to
+ one/zero.
+ . EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE : not supported.
+ . EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE : enable/
+ disable the hardware flow control based on CTS (Clear
+ To Send) and RTS (Ready To Send) control signals.
+
+ @retval EFI_SUCCESS The new control bits were set on the device.
+ @retval EFI_UNSUPPORTED The device does not support this operation.
+
+**/
+EFI_STATUS
+EFIAPI
+SerialPortSetControl (
+ IN UINT32 Control
+ )
+{
+ UINT32 McrBits;
+ UINTN UartBase;
+
+ UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
+
+ if (Control & (mInvalidControlBits)) {
+ return EFI_UNSUPPORTED;
+ }
+
+ McrBits = MmioRead8 (UartBase + UMCR);
+
+ if (Control & EFI_SERIAL_REQUEST_TO_SEND) {
+ McrBits |= DUART_MCR_RTS;
+ } else {
+ McrBits &= ~DUART_MCR_RTS;
+ }
+
+ if (Control & EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE) {
+ McrBits |= DUART_MCR_LOOP;
+ } else {
+ McrBits &= ~DUART_MCR_LOOP;
+ }
+
+ if (Control & EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE) {
+ McrBits |= DUART_MCR_AFE;
+ } else {
+ McrBits &= ~DUART_MCR_AFE;
+ }
+
+ MmioWrite32 (UartBase + UMCR, McrBits);
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Retrieve the status of the control bits on a serial device.
+
+ @param[out] Control Status of the control bits on a serial device :
+
+ . EFI_SERIAL_DATA_CLEAR_TO_SEND,
+ EFI_SERIAL_DATA_SET_READY,
+ EFI_SERIAL_RING_INDICATE,
+ EFI_SERIAL_CARRIER_DETECT,
+ EFI_SERIAL_REQUEST_TO_SEND,
+ EFI_SERIAL_DATA_TERMINAL_READY
+ are all related to the DTE (Data Terminal Equipment)
+ and DCE (Data Communication Equipment) modes of
+ operation of the serial device.
+ . EFI_SERIAL_INPUT_BUFFER_EMPTY : equal to one if the
+ receive buffer is empty, 0 otherwise.
+ . EFI_SERIAL_OUTPUT_BUFFER_EMPTY : equal to one if the
+ transmit buffer is empty, 0 otherwise.
+ . EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE : equal to one if
+ the hardware loopback is enabled (the ouput feeds the
+ receive buffer), 0 otherwise.
+ . EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE : equal to one if
+ a loopback is accomplished by software, 0 otherwise.
+ . EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE : equal to
+ one if the hardware flow control based on CTS (Clear
+ To Send) and RTS (Ready To Send) control signals is
+ enabled, 0 otherwise.
+
+ @retval EFI_SUCCESS The control bits were read from the serial device.
+
+**/
+EFI_STATUS
+EFIAPI
+SerialPortGetControl (
+ OUT UINT32 *Control
+ )
+{
+ UINT32 MsrRegister;
+ UINT32 McrRegister;
+ UINT32 LsrRegister;
+ UINTN UartBase;
+
+ UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
+
+ MsrRegister = MmioRead8 (UartBase + UMSR);
+ McrRegister = MmioRead8 (UartBase + UMCR);
+ LsrRegister = MmioRead8 (UartBase + ULSR);
+
+ *Control = 0;
+
+ if ((MsrRegister & DUART_MSR_CTS) == DUART_MSR_CTS) {
+ *Control |= EFI_SERIAL_CLEAR_TO_SEND;
+ }
+
+ if ((McrRegister & DUART_MCR_RTS) == DUART_MCR_RTS) {
+ *Control |= EFI_SERIAL_REQUEST_TO_SEND;
+ }
+
+ if ((LsrRegister & DUART_LSR_TEMT) == DUART_LSR_TEMT) {
+ *Control |= EFI_SERIAL_OUTPUT_BUFFER_EMPTY;
+ }
+
+ if ((McrRegister & DUART_MCR_AFE) == DUART_MCR_AFE) {
+ *Control |= EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE;
+ }
+
+ if ((McrRegister & DUART_MCR_LOOP) == DUART_MCR_LOOP) {
+ *Control |= EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE;
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Programmed hardware of Serial port.
+
+ @return Always return EFI_SUCCESS.
+
+**/
+EFI_STATUS
+EFIAPI
+SerialPortInitialize (
+ VOID
+ )
+{
+ UINT64 BaudRate;
+ UINT32 BaudDivisor;
+ UINTN UartBase;
+
+ UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
+ BaudRate = (UINTN)PcdGet64 (PcdUartDefaultBaudRate);
+
+ BaudDivisor = CalculateBaudDivisor (BaudRate);
+
+ while (!(MmioRead8 (UartBase + ULSR) & DUART_LSR_TEMT));
+
+ //
+ // Enable and assert interrupt when new data is available on
+ // external device,
+ // setup data format, setup baud divisor
+ //
+ MmioWrite8 (UartBase + UIER, 0x1);
+ MmioWrite8 (UartBase + ULCR, DUART_LCR_BKSE | DUART_LCRVAL);
+ MmioWrite8 (UartBase + UDLB, 0);
+ MmioWrite8 (UartBase + UDMB, 0);
+ MmioWrite8 (UartBase + ULCR, DUART_LCRVAL);
+ MmioWrite8 (UartBase + UMCR, DUART_MCRVAL);
+ MmioWrite8 (UartBase + UFCR, DUART_FCRVAL);
+ MmioWrite8 (UartBase + ULCR, DUART_LCR_BKSE | DUART_LCRVAL);
+ MmioWrite8 (UartBase + UDLB, BaudDivisor & 0xff);
+ MmioWrite8 (UartBase + UDMB, (BaudDivisor >> 8) & 0xff);
+ MmioWrite8 (UartBase + ULCR, DUART_LCRVAL);
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Write data to serial device.
+
+ @param Buffer Point of data buffer which need to be written.
+ @param NumberOfBytes Number of output bytes which are cached in Buffer.
+
+ @retval 0 Write data failed.
+ @retval !0 Actual number of bytes written to serial device.
+
+**/
+UINTN
+EFIAPI
+SerialPortWrite (
+ IN UINT8 *Buffer,
+ IN UINTN NumberOfBytes
+ )
+{
+ UINT8 *Final;
+ UINTN UartBase;
+
+ Final = &Buffer[NumberOfBytes];
+ UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
+
+ while (Buffer < Final) {
+ while ((MmioRead8 (UartBase + ULSR) & DUART_LSR_THRE) == 0);
+ MmioWrite8 (UartBase + UTHR, *Buffer++);
+ }
+
+ return NumberOfBytes;
+}
+
+/**
+ Read data from serial device and save the data in buffer.
+
+ @param Buffer Point of data buffer which need to be written.
+ @param NumberOfBytes Number of output bytes which are cached in Buffer.
+
+ @retval 0 Read data failed.
+ @retval !0 Actual number of bytes read from serial device.
+
+**/
+UINTN
+EFIAPI
+SerialPortRead (
+ OUT UINT8 *Buffer,
+ IN UINTN NumberOfBytes
+ )
+{
+ UINTN Count;
+ UINTN UartBase;
+
+ UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
+
+ for (Count = 0; Count < NumberOfBytes; Count++, Buffer++) {
+ // Loop while waiting for a new char(s) to arrive in the
+ // RxFIFO
+ while ((MmioRead8 (UartBase + ULSR) & DUART_LSR_DR) == 0);
+
+ *Buffer = MmioRead8 (UartBase + URBR);
+ }
+
+ return NumberOfBytes;
+}
+
+/**
+ Check to see if any data is available to be read from the debug device.
+
+ @retval EFI_SUCCESS At least one byte of data is available to be read
+ @retval EFI_NOT_READY No data is available to be read
+ @retval EFI_DEVICE_ERROR The serial device is not functioning properly
+
+**/
+BOOLEAN
+EFIAPI
+SerialPortPoll (
+ VOID
+ )
+{
+ UINTN UartBase;
+
+ UartBase = (UINTN)PcdGet64 (PcdSerialRegisterBase);
+
+ return ((MmioRead8 (UartBase + ULSR) & DUART_LSR_DR) != 0);
+}
+
+/**
+ Set new attributes to LS1043a.
+
+ @param BaudRate The baud rate of the serial device. If the baud rate is not supported,
+ the speed will be reduced down to the nearest supported one and the
+ variable's value will be updated accordingly.
+ @param ReceiveFifoDepth The number of characters the device will buffer on input. If the specified
+ value is not supported, the variable's value will be reduced down to the
+ nearest supported one.
+ @param Timeout If applicable, the number of microseconds the device will wait
+ before timing out a Read or a Write operation.
+ @param Parity If applicable, this is the EFI_PARITY_TYPE that is computed or checked
+ as each character is transmitted or received. If the device does not
+ support parity, the value is the default parity value.
+ @param DataBits The number of data bits in each character
+ @param StopBits If applicable, the EFI_STOP_BITS_TYPE number of stop bits per character.
+ If the device does not support stop bits, the value is the default stop
+ bit value.
+
+ @retval EFI_SUCCESS All attributes were set correctly on the serial device.
+
+**/
+EFI_STATUS
+EFIAPI
+SerialPortSetAttributes (
+ IN OUT UINT64 *BaudRate,
+ IN OUT UINT32 *ReceiveFifoDepth,
+ IN OUT UINT32 *Timeout,
+ IN OUT EFI_PARITY_TYPE *Parity,
+ IN OUT UINT8 *DataBits,
+ IN OUT EFI_STOP_BITS_TYPE *StopBits
+ )
+{
+ return SerialPortInitialize ();
+}
diff --git a/Platform/NXP/Library/DUartPortLib/DUartPortLib.inf b/Platform/NXP/Library/DUartPortLib/DUartPortLib.inf
new file mode 100644
index 0000000..b7b0be0
--- /dev/null
+++ b/Platform/NXP/Library/DUartPortLib/DUartPortLib.inf
@@ -0,0 +1,39 @@
+# DUartPortLib.inf
+#
+# Component description file for DUartPortLib module
+#
+# Copyright (c) 2013, Freescale Ltd. All rights reserved.
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+[Defines]
+ INF_VERSION = 0x0001001A
+ BASE_NAME = DUartPortLib
+ FILE_GUID = c42dfe79-8de5-429e-a055-2d0a58591498
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = SerialPortLib
+
+[Sources.common]
+ DUartPortLib.c
+
+[LibraryClasses]
+ PcdLib
+ SocLib
+
+[Packages]
+ MdeModulePkg/MdeModulePkg.dec
+ MdePkg/MdePkg.dec
+
+[Pcd]
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase
+ gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate
--
1.9.1
^ permalink raw reply related [flat|nested] 39+ messages in thread
* [PATCH v2 5/9] Platform/NXP: Add support for I2c driver
2017-11-22 15:48 ` [PATCH v2 1/9] Platform/NXP: Add support for Big Endian Mmio APIs Meenakshi Aggarwal
` (2 preceding siblings ...)
2017-11-22 15:48 ` [PATCH v2 4/9] Platform/NXP : Add support for DUART library Meenakshi Aggarwal
@ 2017-11-22 15:48 ` Meenakshi Aggarwal
2017-11-22 15:48 ` [PATCH v2 6/9] Silicon/Maxim : Add support for DS1307 RTC library Meenakshi Aggarwal
` (4 subsequent siblings)
8 siblings, 0 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-22 15:48 UTC (permalink / raw)
To: ard.biesheuvel, leif.lindholm, michael.d.kinney, edk2-devel
I2C driver produces gEfiI2cMasterProtocolGuid which can be
used by other modules.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
---
Platform/NXP/Drivers/I2cDxe/I2cDxe.c | 728 +++++++++++++++++++++++++++++++++
Platform/NXP/Drivers/I2cDxe/I2cDxe.h | 64 +++
Platform/NXP/Drivers/I2cDxe/I2cDxe.inf | 57 +++
3 files changed, 849 insertions(+)
create mode 100644 Platform/NXP/Drivers/I2cDxe/I2cDxe.c
create mode 100644 Platform/NXP/Drivers/I2cDxe/I2cDxe.h
create mode 100644 Platform/NXP/Drivers/I2cDxe/I2cDxe.inf
diff --git a/Platform/NXP/Drivers/I2cDxe/I2cDxe.c b/Platform/NXP/Drivers/I2cDxe/I2cDxe.c
new file mode 100644
index 0000000..1f43f9a
--- /dev/null
+++ b/Platform/NXP/Drivers/I2cDxe/I2cDxe.c
@@ -0,0 +1,728 @@
+/** I2cDxe.c
+ I2c driver APIs for read, write, initialize, set speed and reset
+
+ Copyright NXP 2017
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Library/DebugLib.h>
+#include <Library/IoLib.h>
+#include <Library/TimerLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiLib.h>
+
+#include <Protocol/I2cMaster.h>
+
+#include "I2cDxe.h"
+
+STATIC CONST EFI_PHYSICAL_ADDRESS I2cAddrArr[FixedPcdGet32 (PcdNumI2cController)] = {
+ FixedPcdGet64 (PcdI2c0BaseAddr),
+ FixedPcdGet64 (PcdI2c1BaseAddr),
+ FixedPcdGet64 (PcdI2c2BaseAddr),
+ FixedPcdGet64 (PcdI2c3BaseAddr)
+};
+
+STATIC CONST UINT16 ClkDiv[60][2] = {
+ { 20, 0x00 }, { 22, 0x01 }, { 24, 0x02 }, { 26, 0x03 },
+ { 28, 0x04 }, { 30, 0x05 }, { 32, 0x09 }, { 34, 0x06 },
+ { 36, 0x0A }, { 40, 0x07 }, { 44, 0x0C }, { 48, 0x0D },
+ { 52, 0x43 }, { 56, 0x0E }, { 60, 0x45 }, { 64, 0x12 },
+ { 68, 0x0F }, { 72, 0x13 }, { 80, 0x14 }, { 88, 0x15 },
+ { 96, 0x19 }, { 104, 0x16 }, { 112, 0x1A }, { 128, 0x17 },
+ { 136, 0x4F }, { 144, 0x1C }, { 160, 0x1D }, { 176, 0x55 },
+ { 192, 0x1E }, { 208, 0x56 }, { 224, 0x22 }, { 228, 0x24 },
+ { 240, 0x1F }, { 256, 0x23 }, { 288, 0x5C }, { 320, 0x25 },
+ { 384, 0x26 }, { 448, 0x2A }, { 480, 0x27 }, { 512, 0x2B },
+ { 576, 0x2C }, { 640, 0x2D }, { 768, 0x31 }, { 896, 0x32 },
+ { 960, 0x2F }, { 1024, 0x33 }, { 1152, 0x34 },{ 1280, 0x35 },
+ { 1536, 0x36 }, { 1792, 0x3A }, { 1920, 0x37 }, { 2048, 0x3B },
+ { 2304, 0x3C }, { 2560, 0x3D }, { 3072, 0x3E }, { 3584, 0x7A },
+ { 3840, 0x3F }, { 4096, 0x7B }, { 5120, 0x7D }, { 6144, 0x7E },
+};
+
+/**
+ Calculate and set proper clock divider
+
+ @param Rate clock rate
+
+ @retval ClkDiv Value used to get frequency divider value
+
+**/
+STATIC
+UINT8
+GetClk (
+ IN UINT32 Rate
+ )
+{
+ UINTN ClkRate;
+ UINT32 Div;
+ UINT8 ClkDivx;
+
+ ClkRate = CalculateI2cClockRate ();
+
+ Div = (ClkRate + Rate - 1) / Rate;
+
+ if (Div < ClkDiv[0][0]) {
+ ClkDivx = 0;
+ } else if (Div > ClkDiv[ARRAY_SIZE (ClkDiv) - 1][0]){
+ ClkDivx = ARRAY_SIZE (ClkDiv) - 1;
+ } else {
+ for (ClkDivx = 0; ClkDiv[ClkDivx][0] < Div; ClkDivx++);
+ }
+
+ return ClkDivx;
+}
+
+/**
+ Function used to check if i2c is in mentioned state or not
+
+ @param I2cRegs Pointer to I2C registers
+ @param State i2c state need to be checked
+
+ @retval EFI_NOT_READY Arbitration was lost
+ @retval EFI_TIMEOUT Timeout occured
+ @retval CurrState Value of state register
+
+**/
+STATIC
+EFI_STATUS
+WaitForI2cState (
+ IN I2C_REGS *I2cRegs,
+ IN UINT32 State
+ )
+{
+ UINT8 CurrState;
+ UINT64 Cnt;
+
+ for (Cnt = 0; Cnt < 50000; Cnt++) {
+ MemoryFence ();
+ CurrState = MmioRead8 ((UINTN)&I2cRegs->I2cSr);
+ if (CurrState & I2C_SR_IAL) {
+ MmioWrite8 ((UINTN)&I2cRegs->I2cSr, CurrState | I2C_SR_IAL);
+ return EFI_NOT_READY;
+ }
+
+ if ((CurrState & (State >> 8)) == (UINT8)State) {
+ return CurrState;
+ }
+ }
+
+ return EFI_TIMEOUT;
+}
+
+/**
+ Function to transfer byte on i2c
+
+ @param I2cRegs Pointer to i2c registers
+ @param Byte Byte to be transferred on i2c bus
+
+ @retval EFI_NOT_READY Arbitration was lost
+ @retval EFI_TIMEOUT Timeout occured
+ @retval EFI_NOT_FOUND ACK was not recieved
+ @retval EFI_SUCCESS Data transfer was succesful
+
+**/
+STATIC
+EFI_STATUS
+TransferByte (
+ IN I2C_REGS *I2cRegs,
+ IN UINT8 Byte
+ )
+{
+ EFI_STATUS Ret;
+
+ MmioWrite8 ((UINTN)&I2cRegs->I2cSr, I2C_SR_IIF_CLEAR);
+ MmioWrite8 ((UINTN)&I2cRegs->I2cDr, Byte);
+
+ Ret = WaitForI2cState (I2cRegs, IIF);
+ if ((Ret == EFI_TIMEOUT) || (Ret == EFI_NOT_READY)) {
+ return Ret;
+ }
+
+ if (Ret & I2C_SR_RX_NO_AK) {
+ return EFI_NOT_FOUND;
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Function to stop transaction on i2c bus
+
+ @param I2cRegs Pointer to i2c registers
+
+ @retval EFI_NOT_READY Arbitration was lost
+ @retval EFI_TIMEOUT Timeout occured
+ @retval EFI_SUCCESS Stop operation was successful
+
+**/
+STATIC
+EFI_STATUS
+I2cStop (
+ IN I2C_REGS *I2cRegs
+ )
+{
+ INT32 Ret;
+ UINT32 Temp;
+
+ Temp = MmioRead8 ((UINTN)&I2cRegs->I2cCr);
+
+ Temp &= ~(I2C_CR_MSTA | I2C_CR_MTX);
+ MmioWrite8 ((UINTN)&I2cRegs->I2cCr, Temp);
+
+ Ret = WaitForI2cState (I2cRegs, BUS_IDLE);
+
+ if (Ret < 0) {
+ return Ret;
+ } else {
+ return EFI_SUCCESS;
+ }
+}
+
+/**
+ Function to send start signal, Chip Address and
+ memory offset
+
+ @param I2cRegs Pointer to i2c base registers
+ @param Chip Chip Address
+ @param Offset Slave memory's offset
+ @param Alen length of chip address
+
+ @retval EFI_NOT_READY Arbitration lost
+ @retval EFI_TIMEOUT Failed to initialize data transfer in predefined time
+ @retval EFI_NOT_FOUND ACK was not recieved
+ @retval EFI_SUCCESS Read was successful
+
+**/
+STATIC
+EFI_STATUS
+InitTransfer (
+ IN I2C_REGS *I2cRegs,
+ IN UINT8 Chip,
+ IN UINT32 Offset,
+ IN INT32 Alen
+ )
+{
+ UINT32 Temp;
+ EFI_STATUS Ret;
+
+ // Enable I2C controller
+ if (MmioRead8 ((UINTN)&I2cRegs->I2cCr) & I2C_CR_IDIS) {
+ MmioWrite8 ((UINTN)&I2cRegs->I2cCr, I2C_CR_IEN);
+ }
+
+ if (MmioRead8 ((UINTN)&I2cRegs->I2cAdr) == (Chip << 1)) {
+ MmioWrite8 ((UINTN)&I2cRegs->I2cAdr, (Chip << 1) ^ 2);
+ }
+
+ MmioWrite8 ((UINTN)&I2cRegs->I2cSr, I2C_SR_IIF_CLEAR);
+ Ret = WaitForI2cState (I2cRegs, BUS_IDLE);
+ if ((Ret == EFI_TIMEOUT) || (Ret == EFI_NOT_READY)) {
+ return Ret;
+ }
+
+ // Start I2C transaction
+ Temp = MmioRead8 ((UINTN)&I2cRegs->I2cCr);
+ // set to master mode
+ Temp |= I2C_CR_MSTA;
+ MmioWrite8 ((UINTN)&I2cRegs->I2cCr, Temp);
+
+ Ret = WaitForI2cState (I2cRegs, BUS_BUSY);
+ if ((Ret == EFI_TIMEOUT) || (Ret == EFI_NOT_READY)) {
+ return Ret;
+ }
+
+ Temp |= I2C_CR_MTX | I2C_CR_TX_NO_AK;
+ MmioWrite8 ((UINTN)&I2cRegs->I2cCr, Temp);
+
+ // write slave Address
+ Ret = TransferByte (I2cRegs, Chip << 1);
+ if (Ret != EFI_SUCCESS) {
+ return Ret;
+ }
+
+ if (Alen >= 0) {
+ while (Alen--) {
+ Ret = TransferByte (I2cRegs, (Offset >> (Alen * 8)) & 0xff);
+ if (Ret != EFI_SUCCESS)
+ return Ret;
+ }
+ }
+ return EFI_SUCCESS;
+}
+
+/**
+ Function to check if i2c bus is idle
+
+ @param Base Pointer to base address of I2c controller
+
+ @retval EFI_SUCCESS
+
+**/
+STATIC
+INT32
+I2cBusIdle (
+ IN VOID *Base
+ )
+{
+ return EFI_SUCCESS;
+}
+
+/**
+ Function to initiate data transfer on i2c bus
+
+ @param I2cRegs Pointer to i2c base registers
+ @param Chip Chip Address
+ @param Offset Slave memory's offset
+ @param Alen length of chip address
+
+ @retval EFI_NOT_READY Arbitration lost
+ @retval EFI_TIMEOUT Failed to initialize data transfer in predefined time
+ @retval EFI_NOT_FOUND ACK was not recieved
+ @retval EFI_SUCCESS Read was successful
+
+**/
+STATIC
+EFI_STATUS
+InitDataTransfer (
+ IN I2C_REGS *I2cRegs,
+ IN UINT8 Chip,
+ IN UINT32 Offset,
+ IN INT32 Alen
+ )
+{
+ EFI_STATUS Status;
+ INT32 Retry;
+
+ for (Retry = 0; Retry < 3; Retry++) {
+ Status = InitTransfer (I2cRegs, Chip, Offset, Alen);
+ if (Status == EFI_SUCCESS) {
+ return EFI_SUCCESS;
+ }
+
+ I2cStop (I2cRegs);
+
+ if (EFI_NOT_FOUND == Status) {
+ return Status;
+ }
+
+ // Disable controller
+ if (Status != EFI_NOT_READY) {
+ MmioWrite8 ((UINTN)&I2cRegs->I2cCr, I2C_CR_IDIS);
+ }
+
+ if (I2cBusIdle (I2cRegs) < 0) {
+ break;
+ }
+ }
+ return Status;
+}
+
+/**
+ Function to read data using i2c bus
+
+ @param I2cBus I2c Controller number
+ @param Chip Address of slave device from where data to be read
+ @param Offset Offset of slave memory
+ @param Alen Address length of slave
+ @param Buffer A pointer to the destination buffer for the data
+ @param Len Length of data to be read
+
+ @retval EFI_NOT_READY Arbitration lost
+ @retval EFI_TIMEOUT Failed to initialize data transfer in predefined time
+ @retval EFI_NOT_FOUND ACK was not recieved
+ @retval EFI_SUCCESS Read was successful
+
+**/
+STATIC
+EFI_STATUS
+I2cDataRead (
+ IN UINT32 I2cBus,
+ IN UINT8 Chip,
+ IN UINT32 Offset,
+ IN UINT32 Alen,
+ IN UINT8 *Buffer,
+ IN UINT32 Len
+ )
+{
+ EFI_STATUS Status;
+ UINT32 Temp;
+ INT32 I;
+ I2C_REGS *I2cRegs;
+
+ I2cRegs = (I2C_REGS *)I2cAddrArr[I2cBus];
+
+ Status = InitDataTransfer (I2cRegs, Chip, Offset, Alen);
+ if (Status != EFI_SUCCESS) {
+ return Status;
+ }
+
+ Temp = MmioRead8 ((UINTN)&I2cRegs->I2cCr);
+ Temp |= I2C_CR_RSTA;
+ MmioWrite8 ((UINTN)&I2cRegs->I2cCr, Temp);
+
+ Status = TransferByte (I2cRegs, (Chip << 1) | 1);
+ if (Status != EFI_SUCCESS) {
+ I2cStop (I2cRegs);
+ return Status;
+ }
+
+ // setup bus to read data
+ Temp = MmioRead8 ((UINTN)&I2cRegs->I2cCr);
+ Temp &= ~(I2C_CR_MTX | I2C_CR_TX_NO_AK);
+ if (Len == 1) {
+ Temp |= I2C_CR_TX_NO_AK;
+ }
+
+ MmioWrite8 ((UINTN)&I2cRegs->I2cCr, Temp);
+ MmioWrite8 ((UINTN)&I2cRegs->I2cSr, I2C_SR_IIF_CLEAR);
+
+ // Dummy Read to initiate recieve operation
+ MmioRead8 ((UINTN)&I2cRegs->I2cDr);
+
+ for (I = 0; I < Len; I++) {
+ Status = WaitForI2cState (I2cRegs, IIF);
+ if ((Status == EFI_TIMEOUT) || (Status == EFI_NOT_READY)) {
+ I2cStop (I2cRegs);
+ return Status;
+ }
+ //
+ // It must generate STOP before read I2DR to prevent
+ // controller from generating another clock cycle
+ //
+ if (I == (Len - 1)) {
+ I2cStop (I2cRegs);
+ } else if (I == (Len - 2)) {
+ Temp = MmioRead8 ((UINTN)&I2cRegs->I2cCr);
+ Temp |= I2C_CR_TX_NO_AK;
+ MmioWrite8 ((UINTN)&I2cRegs->I2cCr, Temp);
+ }
+ MmioWrite8 ((UINTN)&I2cRegs->I2cSr, I2C_SR_IIF_CLEAR);
+ Buffer[I] = MmioRead8 ((UINTN)&I2cRegs->I2cDr);
+ }
+
+ I2cStop (I2cRegs);
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Function to write data using i2c bus
+
+ @param I2cBus I2c Controller number
+ @param Chip Address of slave device where data to be written
+ @param Offset Offset of slave memory
+ @param Alen Address length of slave
+ @param Buffer A pointer to the source buffer for the data
+ @param Len Length of data to be write
+
+ @retval EFI_NOT_READY Arbitration lost
+ @retval EFI_TIMEOUT Failed to initialize data transfer in predefined time
+ @retval EFI_NOT_FOUND ACK was not recieved
+ @retval EFI_SUCCESS Read was successful
+
+**/
+STATIC
+EFI_STATUS
+I2cDataWrite (
+ IN UINT32 I2cBus,
+ IN UINT8 Chip,
+ IN UINT32 Offset,
+ IN INT32 Alen,
+ OUT UINT8 *Buffer,
+ IN INT32 Len
+ )
+{
+ EFI_STATUS Status;
+ I2C_REGS *I2cRegs;
+ INT32 I;
+
+ I2cRegs = (I2C_REGS *)I2cAddrArr[I2cBus];
+
+ Status = InitDataTransfer (I2cRegs, Chip, Offset, Alen);
+ if (Status != EFI_SUCCESS) {
+ return Status;
+ }
+
+ // Write operation
+ for (I = 0; I < Len; I++) {
+ Status = TransferByte (I2cRegs, Buffer[I]);
+ if (Status != EFI_SUCCESS) {
+ break;
+ }
+ }
+
+ I2cStop (I2cRegs);
+ return Status;
+}
+
+/**
+ Function to set i2c bus frequency
+
+ @param This Pointer to I2c master protocol
+ @param BusClockHertz value to be set
+
+ @retval EFI_SUCCESS Operation successfull
+**/
+
+EFI_STATUS
+EFIAPI
+SetBusFrequency (
+ IN CONST EFI_I2C_MASTER_PROTOCOL *This,
+ IN OUT UINTN *BusClockHertz
+ )
+{
+ I2C_REGS *I2cRegs;
+ UINT8 ClkId;
+ UINT8 SpeedId;
+
+ I2cRegs = (I2C_REGS *)I2cAddrArr[PcdGet32 (PcdI2cBus)];
+
+ ClkId = GetClk (*BusClockHertz);
+ SpeedId = ClkDiv[ClkId][1];
+
+ // Store divider value
+ MmioWrite8 ((UINTN)&I2cRegs->I2cFdr, SpeedId);
+
+ MemoryFence ();
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Function to reset I2c Controller
+
+ @param This Pointer to I2c master protocol
+
+ @return EFI_SUCCESS Operation successfull
+**/
+EFI_STATUS
+EFIAPI
+Reset (
+ IN CONST EFI_I2C_MASTER_PROTOCOL *This
+ )
+{
+ I2C_REGS *I2cRegs;
+
+ I2cRegs = (I2C_REGS *)I2cAddrArr[PcdGet32 (PcdI2cBus)];
+
+ // Reset module
+ MmioWrite8 ((UINTN)&I2cRegs->I2cCr, I2C_CR_IDIS);
+ MmioWrite8 ((UINTN)&I2cRegs->I2cSr, 0);
+
+ MemoryFence ();
+
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+StartRequest (
+ IN CONST EFI_I2C_MASTER_PROTOCOL *This,
+ IN UINTN SlaveAddress,
+ IN EFI_I2C_REQUEST_PACKET *RequestPacket,
+ IN EFI_EVENT Event OPTIONAL,
+ OUT EFI_STATUS *I2cStatus OPTIONAL
+ )
+{
+ UINT32 Count;
+ INT32 Ret;
+ UINT32 Length;
+ UINT8 *Buffer;
+ UINT32 Flag;
+ UINT8 RegAddress;
+
+ RegAddress = 0;
+
+ if (RequestPacket->OperationCount <= 0) {
+ DEBUG ((DEBUG_ERROR,"%a: Operation count is not valid %d\n",
+ __FUNCTION__, RequestPacket->OperationCount));
+ return EFI_INVALID_PARAMETER;
+ }
+
+ for (Count = 0; Count < RequestPacket->OperationCount; Count++) {
+ Flag = RequestPacket->Operation[Count].Flags;
+ Length = RequestPacket->Operation[Count].LengthInBytes;
+ Buffer = RequestPacket->Operation[Count].Buffer;
+
+ if (Length <= 0) {
+ DEBUG ((DEBUG_ERROR,"%a: Invalid length of buffer %d\n",
+ __FUNCTION__, Length));
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (Flag == I2C_FLAG_WRITE && Count == 0) {
+ RegAddress = *Buffer;
+ continue;
+ } else if (Flag == I2C_FLAG_READ) {
+ Ret = I2cDataRead (PcdGet32 (PcdI2cBus), SlaveAddress,
+ RegAddress, sizeof(SlaveAddress)/8, Buffer, Length);
+ if (Ret != EFI_SUCCESS) {
+ DEBUG ((DEBUG_ERROR,"%a: I2c read operation failed (error %d)\n",
+ __FUNCTION__, Ret));
+ return Ret;
+ }
+ } else if (Flag == I2C_FLAG_WRITE) {
+ Ret = I2cDataWrite (PcdGet32 (PcdI2cBus), SlaveAddress,
+ RegAddress, sizeof(SlaveAddress)/8, Buffer, Length);
+ if (Ret != EFI_SUCCESS) {
+ DEBUG ((DEBUG_ERROR,"%a: I2c write operation failed (error %d)\n",
+ __FUNCTION__, Ret));
+ return Ret;
+ }
+ } else {
+ DEBUG ((DEBUG_ERROR,"%a: Invalid Flag %d\n",
+ __FUNCTION__, Flag));
+ return EFI_INVALID_PARAMETER;
+ }
+ }
+
+ return EFI_SUCCESS;
+}
+
+CONST EFI_I2C_CONTROLLER_CAPABILITIES I2cControllerCapabilities = {
+ 0,
+ 0,
+ 0,
+ 0
+};
+
+STATIC EFI_I2C_MASTER_PROTOCOL gI2c = {
+ ///
+ /// Set the clock frequency for the I2C bus.
+ ///
+ SetBusFrequency,
+ ///
+ /// Reset the I2C host controller.
+ ///
+ Reset,
+ ///
+ /// Start an I2C transaction in master mode on the host controller.
+ ///
+ StartRequest,
+ ///
+ /// Pointer to an EFI_I2C_CONTROLLER_CAPABILITIES data structure containing
+ /// the capabilities of the I2C host controller.
+ ///
+ &I2cControllerCapabilities
+};
+
+STATIC I2C_DEVICE_PATH gDevicePath = {
+ {
+ {
+ HARDWARE_DEVICE_PATH, HW_VENDOR_DP,
+ {
+ sizeof (VENDOR_DEVICE_PATH), 0
+ }
+ },
+ EFI_CALLER_ID_GUID
+ },
+ {
+ END_DEVICE_PATH_TYPE,
+ END_ENTIRE_DEVICE_PATH_SUBTYPE,
+ {
+ sizeof (EFI_DEVICE_PATH_PROTOCOL), 0
+ }
+ }
+};
+
+/**
+ The Entry Point for I2C driver.
+
+ @param[in] ImageHandle The firmware allocated handle for the EFI image.
+ @param[in] SystemTable A pointer to the EFI System Table.
+
+ @retval EFI_SUCCESS The entry point is executed successfully.
+ @retval other Some error occurs when executing this entry point.
+
+**/
+EFI_STATUS
+EFIAPI
+I2cDxeEntryPoint (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EFI_STATUS Status;
+
+ //
+ // Install I2c Master protocol on this controller
+ //
+ Status = gBS->InstallMultipleProtocolInterfaces (
+ &ImageHandle,
+ &gEfiI2cMasterProtocolGuid,
+ (VOID**)&gI2c,
+ &gEfiDevicePathProtocolGuid,
+ &gDevicePath,
+ NULL
+ );
+
+ ASSERT_EFI_ERROR (Status);
+
+ return Status;
+}
+
+/**
+ Unload function for the I2c Driver.
+
+ @param ImageHandle[in] The allocated handle for the EFI image
+
+ @retval EFI_SUCCESS The driver was unloaded successfully
+ @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image handle.
+
+**/
+EFI_STATUS
+EFIAPI
+I2cDxeUnload (
+ IN EFI_HANDLE ImageHandle
+ )
+{
+ EFI_STATUS Status;
+ EFI_HANDLE *HandleBuffer;
+ UINTN HandleCount;
+ UINTN Index;
+
+ //
+ // Retrieve all I2c handles in the handle database
+ //
+ Status = gBS->LocateHandleBuffer (ByProtocol,
+ &gEfiI2cMasterProtocolGuid,
+ NULL,
+ &HandleCount,
+ &HandleBuffer);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ //
+ // Disconnect the driver from the handles in the handle database
+ //
+ for (Index = 0; Index < HandleCount; Index++) {
+ Status = gBS->DisconnectController (HandleBuffer[Index],
+ gImageHandle,
+ NULL);
+ }
+
+ //
+ // Free the handle array
+ //
+ gBS->FreePool (HandleBuffer);
+
+ //
+ // Uninstall protocols installed by the driver in its entrypoint
+ //
+ Status = gBS->UninstallMultipleProtocolInterfaces (ImageHandle,
+ &gEfiI2cMasterProtocolGuid, &gI2c,
+ &gEfiDevicePathProtocolGuid, &gDevicePath,
+ NULL);
+
+ return Status;
+}
diff --git a/Platform/NXP/Drivers/I2cDxe/I2cDxe.h b/Platform/NXP/Drivers/I2cDxe/I2cDxe.h
new file mode 100644
index 0000000..01c9d8c
--- /dev/null
+++ b/Platform/NXP/Drivers/I2cDxe/I2cDxe.h
@@ -0,0 +1,64 @@
+/** I2cDxe.h
+ Header defining the constant, base address amd function for I2C controller
+
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __I2C_DXE_H___
+#define __I2C_DXE_H__
+
+#include <Uefi.h>
+
+#define I2C_CR_IIEN (1 << 6)
+#define I2C_CR_MSTA (1 << 5)
+#define I2C_CR_MTX (1 << 4)
+#define I2C_CR_TX_NO_AK (1 << 3)
+#define I2C_CR_RSTA (1 << 2)
+
+#define I2C_SR_ICF (1 << 7)
+#define I2C_SR_IBB (1 << 5)
+#define I2C_SR_IAL (1 << 4)
+#define I2C_SR_IIF (1 << 1)
+#define I2C_SR_RX_NO_AK (1 << 0)
+
+#define I2C_CR_IEN (0 << 7)
+#define I2C_CR_IDIS (1 << 7)
+#define I2C_SR_IIF_CLEAR (1 << 1)
+
+#define BUS_IDLE (0 | (I2C_SR_IBB << 8))
+#define BUS_BUSY (I2C_SR_IBB | (I2C_SR_IBB << 8))
+#define IIF (I2C_SR_IIF | (I2C_SR_IIF << 8))
+
+#define I2C_FLAG_WRITE 0x0
+
+typedef struct {
+ VENDOR_DEVICE_PATH Guid;
+ EFI_DEVICE_PATH_PROTOCOL End;
+} I2C_DEVICE_PATH;
+
+/**
+ Record defining i2c registers
+**/
+typedef struct {
+ UINT8 I2cAdr;
+ UINT8 I2cFdr;
+ UINT8 I2cCr;
+ UINT8 I2cSr;
+ UINT8 I2cDr;
+} I2C_REGS ;
+
+UINT32
+CalculateI2cClockRate (
+ VOID
+ );
+
+#endif
diff --git a/Platform/NXP/Drivers/I2cDxe/I2cDxe.inf b/Platform/NXP/Drivers/I2cDxe/I2cDxe.inf
new file mode 100644
index 0000000..6768b14
--- /dev/null
+++ b/Platform/NXP/Drivers/I2cDxe/I2cDxe.inf
@@ -0,0 +1,57 @@
+# @file
+#
+# Component description file for I2c driver
+#
+# Copyright (c) 2015, Freescale Semiconductor, Inc. All rights reserved.
+# Copyright NXP 2017
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+[Defines]
+ INF_VERSION = 0x0001001A
+ BASE_NAME = I2cDxe
+ FILE_GUID = 5f2927ba-1b04-4d5f-8bef-2b50c635d1e7
+ MODULE_TYPE = DXE_DRIVER
+ VERSION_STRING = 1.0
+ ENTRY_POINT = I2cDxeEntryPoint
+ UNLOAD = I2cDxeUnload
+
+[Sources.common]
+ I2cDxe.c
+
+[LibraryClasses]
+ ArmLib
+ IoLib
+ MemoryAllocationLib
+ PcdLib
+ SocLib
+ TimerLib
+ UefiDriverEntryPoint
+ UefiLib
+
+[Packages]
+ MdePkg/MdePkg.dec
+ Platform/NXP/NxpQoriqLs.dec
+
+[Protocols]
+ gEfiI2cMasterProtocolGuid
+
+[Pcd]
+ gNxpQoriqLsTokenSpaceGuid.PcdI2cBus
+ gNxpQoriqLsTokenSpaceGuid.PcdI2cSpeed
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c0BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c1BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c2BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c3BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdNumI2cController
+
+[Depex]
+ TRUE
--
1.9.1
^ permalink raw reply related [flat|nested] 39+ messages in thread
* [PATCH v2 6/9] Silicon/Maxim : Add support for DS1307 RTC library
2017-11-22 15:48 ` [PATCH v2 1/9] Platform/NXP: Add support for Big Endian Mmio APIs Meenakshi Aggarwal
` (3 preceding siblings ...)
2017-11-22 15:48 ` [PATCH v2 5/9] Platform/NXP: Add support for I2c driver Meenakshi Aggarwal
@ 2017-11-22 15:48 ` Meenakshi Aggarwal
2017-11-22 15:48 ` [PATCH v2 7/9] Platform/NXP: Add support for ArmPlatformLib Meenakshi Aggarwal
` (3 subsequent siblings)
8 siblings, 0 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-22 15:48 UTC (permalink / raw)
To: ard.biesheuvel, leif.lindholm, michael.d.kinney, edk2-devel
Real time clock Apis on top of I2C Apis
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
---
Silicon/Maxim/Library/Ds1307RtcLib/Ds1307Rtc.h | 59 ++++
Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.c | 327 +++++++++++++++++++++
.../Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.dec | 26 ++
.../Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.inf | 45 +++
4 files changed, 457 insertions(+)
create mode 100644 Silicon/Maxim/Library/Ds1307RtcLib/Ds1307Rtc.h
create mode 100644 Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.c
create mode 100644 Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.dec
create mode 100644 Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.inf
diff --git a/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307Rtc.h b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307Rtc.h
new file mode 100644
index 0000000..96271f8
--- /dev/null
+++ b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307Rtc.h
@@ -0,0 +1,59 @@
+/** Ds1307Rtc.h
+*
+* Copyright 2017 NXP
+*
+* This program and the accompanying materials
+* are licensed and made available under the terms and conditions of the BSD License
+* which accompanies this distribution. The full text of the license may be found at
+* http://opensource.org/licenses/bsd-license.php
+*
+* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#ifndef __DS1307RTC_H__
+#define __DS1307RTC_H__
+
+/*
+ * RTC time register
+ */
+#define DS1307_SEC_REG_ADDR 0x00
+#define DS1307_MIN_REG_ADDR 0x01
+#define DS1307_HR_REG_ADDR 0x02
+#define DS1307_DAY_REG_ADDR 0x03
+#define DS1307_DATE_REG_ADDR 0x04
+#define DS1307_MON_REG_ADDR 0x05
+#define DS1307_YR_REG_ADDR 0x06
+
+#define DS1307_SEC_BIT_CH 0x80 /* Clock Halt (in Register 0) */
+
+/*
+ * RTC control register
+ */
+#define DS1307_CTL_REG_ADDR 0x07
+
+#define START_YEAR 1970
+#define END_YEAR 2070
+
+/*
+ * TIME MASKS
+ */
+#define MASK_SEC 0x7F
+#define MASK_MIN 0x7F
+#define MASK_HOUR 0x3F
+#define MASK_DAY 0x3F
+#define MASK_MONTH 0x1F
+
+/*
+ * I2C FLAGS
+ */
+#define I2C_REG_ADDRESS 0x2
+
+typedef struct {
+ UINTN OperationCount;
+ EFI_I2C_OPERATION SetAddressOp;
+ EFI_I2C_OPERATION GetSetDateTimeOp;
+} RTC_I2C_REQUEST;
+
+#endif // __DS1307RTC_H__
diff --git a/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.c b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.c
new file mode 100644
index 0000000..e362f2b
--- /dev/null
+++ b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.c
@@ -0,0 +1,327 @@
+/** Ds1307RtcLib.c
+ Implement EFI RealTimeClock via RTC Lib for DS1307 RTC.
+
+ Based on RTC implementation available in
+ EmbeddedPkg/Library/TemplateRealTimeClockLib/RealTimeClockLib.c
+
+ Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+ Copyright 2017 NXP
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <PiDxe.h>
+#include <Base.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/RealTimeClockLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiLib.h>
+#include <Protocol/I2cMaster.h>
+
+#include "Ds1307Rtc.h"
+
+STATIC VOID *mDriverEventRegistration;
+STATIC EFI_I2C_MASTER_PROTOCOL *mI2cMaster;
+
+/**
+ Read RTC register.
+
+ @param RtcRegAddr Register offset of RTC to be read.
+
+ @retval Register Value read
+
+**/
+
+STATIC
+UINT8
+RtcRead (
+ IN UINT8 RtcRegAddr
+ )
+{
+ RTC_I2C_REQUEST Req;
+ EFI_STATUS Status;
+ UINT8 Val;
+
+ Val = 0;
+
+ Req.OperationCount = 2;
+
+ Req.SetAddressOp.Flags = 0;
+ Req.SetAddressOp.LengthInBytes = sizeof (RtcRegAddr);
+ Req.SetAddressOp.Buffer = &RtcRegAddr;
+
+ Req.GetSetDateTimeOp.Flags = I2C_FLAG_READ;
+ Req.GetSetDateTimeOp.LengthInBytes = sizeof (Val);
+ Req.GetSetDateTimeOp.Buffer = &Val;
+
+ Status = mI2cMaster->StartRequest (mI2cMaster, FixedPcdGet8 (PcdI2cSlaveAddress),
+ (VOID *)&Req,
+ NULL, NULL);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "RTC read error at Addr:0x%x\n", RtcRegAddr));
+ }
+
+ return Val;
+}
+
+/**
+ Write RTC register.
+
+ @param RtcRegAddr Register offset of RTC to write.
+ @param Val Value to be written
+
+**/
+
+STATIC
+VOID
+RtcWrite (
+ IN UINT8 RtcRegAddr,
+ IN UINT8 Val
+ )
+{
+ RTC_I2C_REQUEST Req;
+ EFI_STATUS Status;
+
+ Req.OperationCount = 2;
+
+ Req.SetAddressOp.Flags = 0;
+ Req.SetAddressOp.LengthInBytes = sizeof (RtcRegAddr);
+ Req.SetAddressOp.Buffer = &RtcRegAddr;
+
+ Req.GetSetDateTimeOp.Flags = 0;
+ Req.GetSetDateTimeOp.LengthInBytes = sizeof (Val);
+ Req.GetSetDateTimeOp.Buffer = &Val;
+
+ Status = mI2cMaster->StartRequest (mI2cMaster, FixedPcdGet8 (PcdI2cSlaveAddress),
+ (VOID *)&Req,
+ NULL, NULL);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "RTC write error at Addr:0x%x\n", RtcRegAddr));
+ }
+}
+
+/**
+ Returns the current time and date information, and the time-keeping capabilities
+ of the hardware platform.
+
+ @param Time A pointer to storage to receive a snapshot of the current time.
+ @param Capabilities An optional pointer to a buffer to receive the real time clock
+ device's capabilities.
+
+ @retval EFI_SUCCESS The operation completed successfully.
+ @retval EFI_INVALID_PARAMETER Time is NULL.
+ @retval EFI_DEVICE_ERROR The time could not be retrieved due to hardware error.
+
+**/
+
+EFI_STATUS
+EFIAPI
+LibGetTime (
+ OUT EFI_TIME *Time,
+ OUT EFI_TIME_CAPABILITIES *Capabilities
+ )
+{
+ EFI_STATUS Status;
+ UINT8 Second;
+ UINT8 Minute;
+ UINT8 Hour;
+ UINT8 Day;
+ UINT8 Month;
+ UINT8 Year;
+
+ if (mI2cMaster == NULL) {
+ return EFI_DEVICE_ERROR;
+ }
+
+ Status = EFI_SUCCESS;
+
+ Second = RtcRead (DS1307_SEC_REG_ADDR);
+ Minute = RtcRead (DS1307_MIN_REG_ADDR);
+ Hour = RtcRead (DS1307_HR_REG_ADDR);
+ Day = RtcRead (DS1307_DATE_REG_ADDR);
+ Month = RtcRead (DS1307_MON_REG_ADDR);
+ Year = RtcRead (DS1307_YR_REG_ADDR);
+
+ if (Second & DS1307_SEC_BIT_CH) {
+ DEBUG ((DEBUG_ERROR, "### Warning: RTC oscillator has stopped\n"));
+ /* clear the CH flag */
+ RtcWrite (DS1307_SEC_REG_ADDR,
+ RtcRead (DS1307_SEC_REG_ADDR) & ~DS1307_SEC_BIT_CH);
+ Status = EFI_DEVICE_ERROR;
+ }
+
+ Time->Second = BcdToDecimal8 (Second & MASK_SEC);
+ Time->Minute = BcdToDecimal8 (Minute & MASK_MIN);
+ Time->Hour = BcdToDecimal8 (Hour & MASK_HOUR);
+ Time->Day = BcdToDecimal8 (Day & MASK_DAY);
+ Time->Month = BcdToDecimal8 (Month & MASK_MONTH);
+
+ //
+ // RTC can save year 1970 to 2069
+ // On writing Year, save year % 100
+ // On Reading reversing the operation e.g. 2012
+ // write = 12 (2012 % 100)
+ // read = 2012 (12 + 2000)
+ //
+ Time->Year = BcdToDecimal8 (Year) +
+ (BcdToDecimal8 (Year) >= 70 ? START_YEAR - 70 : END_YEAR -70);
+
+ return Status;
+}
+
+/**
+ Sets the current local time and date information.
+
+ @param Time A pointer to the current time.
+
+ @retval EFI_SUCCESS The operation completed successfully.
+ @retval EFI_INVALID_PARAMETER A time field is out of range.
+
+**/
+EFI_STATUS
+EFIAPI
+LibSetTime (
+ IN EFI_TIME *Time
+ )
+{
+ if (mI2cMaster == NULL) {
+ return EFI_DEVICE_ERROR;
+ }
+
+ if (Time->Year < START_YEAR || Time->Year >= END_YEAR){
+ DEBUG ((DEBUG_ERROR, "WARNING: Year should be between 1970 and 2069!\n"));
+ return EFI_INVALID_PARAMETER;
+ }
+
+ RtcWrite (DS1307_YR_REG_ADDR, DecimalToBcd8 (Time->Year % 100));
+ RtcWrite (DS1307_MON_REG_ADDR, DecimalToBcd8 (Time->Month));
+ RtcWrite (DS1307_DATE_REG_ADDR, DecimalToBcd8 (Time->Day));
+ RtcWrite (DS1307_HR_REG_ADDR, DecimalToBcd8 (Time->Hour));
+ RtcWrite (DS1307_MIN_REG_ADDR, DecimalToBcd8 (Time->Minute));
+ RtcWrite (DS1307_SEC_REG_ADDR, DecimalToBcd8 (Time->Second));
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Returns the current wakeup alarm clock setting.
+
+ @param Enabled Indicates if the alarm is currently enabled or disabled.
+ @param Pending Indicates if the alarm signal is pending and requires acknowledgement.
+ @param Time The current alarm setting.
+
+ @retval EFI_SUCCESS The alarm settings were returned.
+ @retval EFI_INVALID_PARAMETER Any parameter is NULL.
+ @retval EFI_DEVICE_ERROR The wakeup time could not be retrieved due to a hardware error.
+
+**/
+EFI_STATUS
+EFIAPI
+LibGetWakeupTime (
+ OUT BOOLEAN *Enabled,
+ OUT BOOLEAN *Pending,
+ OUT EFI_TIME *Time
+ )
+{
+ // Not a required feature
+ return EFI_UNSUPPORTED;
+}
+
+/**
+ Sets the system wakeup alarm clock time.
+
+ @param Enabled Enable or disable the wakeup alarm.
+ @param Time If Enable is TRUE, the time to set the wakeup alarm for.
+
+ @retval EFI_SUCCESS If Enable is TRUE, then the wakeup alarm was enabled. If
+ Enable is FALSE, then the wakeup alarm was disabled.
+ @retval EFI_INVALID_PARAMETER A time field is out of range.
+ @retval EFI_DEVICE_ERROR The wakeup time could not be set due to a hardware error.
+ @retval EFI_UNSUPPORTED A wakeup timer is not supported on this platform.
+
+**/
+EFI_STATUS
+EFIAPI
+LibSetWakeupTime (
+ IN BOOLEAN Enabled,
+ OUT EFI_TIME *Time
+ )
+{
+ // Not a required feature
+ return EFI_UNSUPPORTED;
+}
+
+STATIC
+VOID
+I2cDriverRegistrationEvent (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ EFI_STATUS Status;
+ EFI_I2C_MASTER_PROTOCOL *I2cMaster;
+ UINTN BusFrequency;
+
+ Status = gBS->LocateProtocol (&gEfiI2cMasterProtocolGuid, NULL, (VOID **)&I2cMaster);
+
+ gBS->CloseEvent (Event);
+
+ ASSERT_EFI_ERROR (Status);
+
+ Status = I2cMaster->Reset (I2cMaster);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "%a: I2CMaster->Reset () failed - %r\n",
+ __FUNCTION__, Status));
+ return;
+ }
+
+ BusFrequency = FixedPcdGet16 (PcdI2cBusFrequency);
+ Status = I2cMaster->SetBusFrequency (I2cMaster, &BusFrequency);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "%a: I2CMaster->SetBusFrequency () failed - %r\n",
+ __FUNCTION__, Status));
+ return;
+ }
+
+ mI2cMaster = I2cMaster;
+}
+
+/**
+ This is the declaration of an EFI image entry point. This can be the entry point to an application
+ written to this specification, an EFI boot service driver.
+
+ @param ImageHandle Handle that identifies the loaded image.
+ @param SystemTable System Table for this image.
+
+ @retval EFI_SUCCESS The operation completed successfully.
+
+**/
+EFI_STATUS
+EFIAPI
+LibRtcInitialize (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ //
+ // Register a protocol registration notification callback on the driver
+ // binding protocol so we can attempt to connect our I2C master to it
+ // as soon as it appears.
+ //
+ EfiCreateProtocolNotifyEvent (
+ &gEfiI2cMasterProtocolGuid,
+ TPL_CALLBACK,
+ I2cDriverRegistrationEvent,
+ NULL,
+ &mDriverEventRegistration);
+
+ return EFI_SUCCESS;
+}
diff --git a/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.dec b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.dec
new file mode 100644
index 0000000..1aaf897
--- /dev/null
+++ b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.dec
@@ -0,0 +1,26 @@
+#/** @file
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#**/
+
+[Defines]
+ DEC_SPECIFICATION = 0x0001001A
+ PACKAGE_NAME = Ds1307RtcLib
+ PACKAGE_GUID = 0c095cf6-834d-4fa2-a5a0-31ac35591ad2
+ PACKAGE_VERSION = 0.1
+
+[Guids]
+ gDs1307RtcLibTokenSpaceGuid = { 0xd939eb84, 0xa95a, 0x46a0, { 0xa8, 0x2b, 0xb9, 0x64, 0x30, 0xcf, 0xf5, 0x99 }}
+
+[PcdsFixedAtBuild]
+ gDs1307RtcLibTokenSpaceGuid.PcdI2cSlaveAddress|0|UINT8|0x00000001
+ gDs1307RtcLibTokenSpaceGuid.PcdI2cBusFrequency|0|UINT32|0x00000002
diff --git a/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.inf b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.inf
new file mode 100644
index 0000000..1182211
--- /dev/null
+++ b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.inf
@@ -0,0 +1,45 @@
+# @Ds1307RtcLib.inf
+#
+# Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
+# Copyright (c) 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+[Defines]
+ INF_VERSION = 0x0001001A
+ BASE_NAME = Ds1307RtcLib
+ FILE_GUID = 7112fb46-8dda-4a41-ac40-bf212fedfc08
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = RealTimeClockLib
+
+[Sources.common]
+ Ds1307RtcLib.c
+
+[Packages]
+ EmbeddedPkg/EmbeddedPkg.dec
+ MdePkg/MdePkg.dec
+ Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.dec
+
+[LibraryClasses]
+ DebugLib
+ UefiBootServicesTableLib
+ UefiLib
+
+[Protocols]
+ gEfiDriverBindingProtocolGuid ## CONSUMES
+ gEfiI2cMasterProtocolGuid ## CONSUMES
+
+[FixedPcd]
+ gDs1307RtcLibTokenSpaceGuid.PcdI2cSlaveAddress
+ gDs1307RtcLibTokenSpaceGuid.PcdI2cBusFrequency
+
+[Depex]
+ gEfiI2cMasterProtocolGuid
--
1.9.1
^ permalink raw reply related [flat|nested] 39+ messages in thread
* [PATCH v2 7/9] Platform/NXP: Add support for ArmPlatformLib
2017-11-22 15:48 ` [PATCH v2 1/9] Platform/NXP: Add support for Big Endian Mmio APIs Meenakshi Aggarwal
` (4 preceding siblings ...)
2017-11-22 15:48 ` [PATCH v2 6/9] Silicon/Maxim : Add support for DS1307 RTC library Meenakshi Aggarwal
@ 2017-11-22 15:48 ` Meenakshi Aggarwal
2017-11-22 15:48 ` [PATCH v2 8/9] Compilation : Add the fdf, dsc and dec files Meenakshi Aggarwal
` (2 subsequent siblings)
8 siblings, 0 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-22 15:48 UTC (permalink / raw)
To: ard.biesheuvel, leif.lindholm, michael.d.kinney, edk2-devel
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
---
.../Library/PlatformLib/ArmPlatformLib.c | 105 ++++++++++++
.../Library/PlatformLib/ArmPlatformLib.inf | 70 ++++++++
.../Library/PlatformLib/NxpQoriqLsHelper.S | 38 +++++
.../Library/PlatformLib/NxpQoriqLsMem.c | 184 +++++++++++++++++++++
4 files changed, 397 insertions(+)
create mode 100644 Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/ArmPlatformLib.c
create mode 100644 Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/ArmPlatformLib.inf
create mode 100644 Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/NxpQoriqLsHelper.S
create mode 100644 Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/NxpQoriqLsMem.c
diff --git a/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/ArmPlatformLib.c b/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/ArmPlatformLib.c
new file mode 100644
index 0000000..ab4815d
--- /dev/null
+++ b/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/ArmPlatformLib.c
@@ -0,0 +1,105 @@
+/** ArmPlatformLib.c
+*
+* Contains board initialization functions.
+*
+* Based on BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoard.c
+*
+* Copyright (c) 2011-2012, ARM Limited. All rights reserved.
+* Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
+* Copyright 2017 NXP
+*
+* This program and the accompanying materials
+* are licensed and made available under the terms and conditions of the BSD License
+* which accompanies this distribution. The full text of the license may be found at
+* http://opensource.org/licenses/bsd-license.php
+*
+* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#include <Library/ArmPlatformLib.h>
+#include <Ppi/ArmMpCoreInfo.h>
+
+extern VOID SocInit (VOID);
+
+/**
+ Return the current Boot Mode
+
+ This function returns the boot reason on the platform
+
+**/
+EFI_BOOT_MODE
+ArmPlatformGetBootMode (
+ VOID
+ )
+{
+ return BOOT_WITH_FULL_CONFIGURATION;
+}
+
+/**
+ Placeholder for Platform Initialization
+**/
+EFI_STATUS
+ArmPlatformInitialize (
+ IN UINTN MpId
+ )
+{
+ SocInit ();
+
+ return EFI_SUCCESS;
+}
+
+ARM_CORE_INFO LS1043aMpCoreInfoCTA53x4[] = {
+ {
+ // Cluster 0, Core 0
+ 0x0, 0x0,
+
+ // MP Core MailBox Set/Get/Clear Addresses and Clear Value
+ (EFI_PHYSICAL_ADDRESS)0,
+ (EFI_PHYSICAL_ADDRESS)0,
+ (EFI_PHYSICAL_ADDRESS)0,
+ (UINT64)0xFFFFFFFF
+ },
+};
+
+EFI_STATUS
+PrePeiCoreGetMpCoreInfo (
+ OUT UINTN *CoreCount,
+ OUT ARM_CORE_INFO **ArmCoreTable
+ )
+{
+ *CoreCount = sizeof (LS1043aMpCoreInfoCTA53x4) / sizeof (ARM_CORE_INFO);
+ *ArmCoreTable = LS1043aMpCoreInfoCTA53x4;
+
+ return EFI_SUCCESS;
+}
+
+ARM_MP_CORE_INFO_PPI mMpCoreInfoPpi = { PrePeiCoreGetMpCoreInfo };
+
+EFI_PEI_PPI_DESCRIPTOR gPlatformPpiTable[] = {
+ {
+ EFI_PEI_PPI_DESCRIPTOR_PPI,
+ &gArmMpCoreInfoPpiGuid,
+ &mMpCoreInfoPpi
+ }
+};
+
+VOID
+ArmPlatformGetPlatformPpiList (
+ OUT UINTN *PpiListSize,
+ OUT EFI_PEI_PPI_DESCRIPTOR **PpiList
+ )
+{
+ *PpiListSize = sizeof (gPlatformPpiTable);
+ *PpiList = gPlatformPpiTable;
+}
+
+
+UINTN
+ArmPlatformGetCorePosition (
+ IN UINTN MpId
+ )
+{
+ return 1;
+}
diff --git a/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/ArmPlatformLib.inf b/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/ArmPlatformLib.inf
new file mode 100644
index 0000000..f8fdee9
--- /dev/null
+++ b/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/ArmPlatformLib.inf
@@ -0,0 +1,70 @@
+# @file
+#
+# Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+
+[Defines]
+ INF_VERSION = 0x0001001A
+ BASE_NAME = PlatformLib
+ FILE_GUID = 736343a0-1d96-11e0-aaaa-0002a5d5c51b
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = ArmPlatformLib
+
+[Packages]
+ ArmPkg/ArmPkg.dec
+ ArmPlatformPkg/ArmPlatformPkg.dec
+ EmbeddedPkg/EmbeddedPkg.dec
+ MdePkg/MdePkg.dec
+ Platform/NXP/NxpQoriqLs.dec
+
+[LibraryClasses]
+ ArmLib
+ SocLib
+
+[Sources.common]
+ NxpQoriqLsHelper.S | GCC
+ NxpQoriqLsMem.c
+ ArmPlatformLib.c
+
+[Ppis]
+ gArmMpCoreInfoPpiGuid
+
+[FeaturePcd]
+ gEmbeddedTokenSpaceGuid.PcdCacheEnable
+
+[FixedPcd]
+ gArmTokenSpaceGuid.PcdArmPrimaryCore
+ gNxpQoriqLsTokenSpaceGuid.PcdCcsrBaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdCcsrSize
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion1BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion1Size
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion2BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion2Size
+ gNxpQoriqLsTokenSpaceGuid.PcdQmanSwpBaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdQmanSwpSize
+ gNxpQoriqLsTokenSpaceGuid.PcdBmanSwpBaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdBmanSwpSize
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp1BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp1BaseSize
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp2BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp2BaseSize
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp3BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp3BaseSize
+ gNxpQoriqLsTokenSpaceGuid.PcdDram1BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdDram1Size
+ gNxpQoriqLsTokenSpaceGuid.PcdDram2BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdDram2Size
+ gNxpQoriqLsTokenSpaceGuid.PcdDram3BaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdDram3Size
+ gNxpQoriqLsTokenSpaceGuid.PcdQspiRegionBaseAddr
+ gNxpQoriqLsTokenSpaceGuid.PcdQspiRegionSize
diff --git a/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/NxpQoriqLsHelper.S b/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/NxpQoriqLsHelper.S
new file mode 100644
index 0000000..205c0d8
--- /dev/null
+++ b/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/NxpQoriqLsHelper.S
@@ -0,0 +1,38 @@
+# @file
+#
+# Copyright (c) 2012-2013, ARM Limited. All rights reserved.
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+#include <AsmMacroIoLibV8.h>
+#include <AutoGen.h>
+
+.text
+.align 2
+
+GCC_ASM_IMPORT(ArmReadMpidr)
+
+ASM_FUNC(ArmPlatformIsPrimaryCore)
+ tst x0, #3
+ cset x0, eq
+ ret
+
+ASM_FUNC(ArmPlatformPeiBootAction)
+EL1_OR_EL2(x0)
+1:
+2:
+ ret
+
+ASM_FUNC(ArmPlatformGetPrimaryCoreMpId)
+ MOV32 (x0, FixedPcdGet32(PcdArmPrimaryCore))
+ ldrh w0, [x0]
+ ret
diff --git a/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/NxpQoriqLsMem.c b/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/NxpQoriqLsMem.c
new file mode 100644
index 0000000..6723b86
--- /dev/null
+++ b/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/NxpQoriqLsMem.c
@@ -0,0 +1,184 @@
+/** NxpQoriqLsMem.c
+*
+* Board memory specific Library.
+*
+* Based on BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardMem.c
+*
+* Copyright (c) 2011, ARM Limited. All rights reserved.
+* Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
+* Copyright 2017 NXP
+*
+* This program and the accompanying materials
+* are licensed and made available under the terms and conditions of the BSD License
+* which accompanies this distribution. The full text of the license may be found at
+* http://opensource.org/licenses/bsd-license.php
+*
+* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#include <Library/ArmPlatformLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PcdLib.h>
+#include <Library/MemoryAllocationLib.h>
+
+#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 25
+
+#define CCSR_BASE_ADDR FixedPcdGet64 (PcdCcsrBaseAddr)
+#define CCSR_SIZE FixedPcdGet64 (PcdCcsrSize)
+#define IFC_REGION1_BASE_ADDR FixedPcdGet64 (PcdIfcRegion1BaseAddr)
+#define IFC_REGION1_SIZE FixedPcdGet64 (PcdIfcRegion1Size)
+#define IFC_REGION2_BASE_ADDR FixedPcdGet64 (PcdIfcRegion2BaseAddr)
+#define IFC_REGION2_SIZE FixedPcdGet64 (PcdIfcRegion2Size)
+#define QMAN_SWP_BASE_ADDR FixedPcdGet64 (PcdQmanSwpBaseAddr)
+#define QMAN_SWP_SIZE FixedPcdGet64 (PcdQmanSwpSize)
+#define BMAN_SWP_BASE_ADDR FixedPcdGet64 (PcdBmanSwpBaseAddr)
+#define BMAN_SWP_SIZE FixedPcdGet64 (PcdBmanSwpSize)
+#define PCI_EXP1_BASE_ADDR FixedPcdGet64 (PcdPciExp1BaseAddr)
+#define PCI_EXP1_BASE_SIZE FixedPcdGet64 (PcdPciExp1BaseSize)
+#define PCI_EXP2_BASE_ADDR FixedPcdGet64 (PcdPciExp2BaseAddr)
+#define PCI_EXP2_BASE_SIZE FixedPcdGet64 (PcdPciExp2BaseSize)
+#define PCI_EXP3_BASE_ADDR FixedPcdGet64 (PcdPciExp3BaseAddr)
+#define PCI_EXP3_BASE_SIZE FixedPcdGet64 (PcdPciExp3BaseSize)
+#define DRAM1_BASE_ADDR FixedPcdGet64 (PcdDram1BaseAddr)
+#define DRAM1_SIZE FixedPcdGet64 (PcdDram1Size)
+#define DRAM2_BASE_ADDR FixedPcdGet64 (PcdDram2BaseAddr)
+#define DRAM2_SIZE FixedPcdGet64 (PcdDram2Size)
+#define DRAM3_BASE_ADDR FixedPcdGet64 (PcdDram3BaseAddr)
+#define DRAM3_SIZE FixedPcdGet64 (PcdDram3Size)
+#define QSPI_REGION_BASE_ADDR FixedPcdGet64 (PcdQspiRegionBaseAddr)
+#define QSPI_REGION_SIZE FixedPcdGet64 (PcdQspiRegionSize)
+
+/**
+ Return the Virtual Memory Map of your platform
+
+ This Virtual Memory Map is used by MemoryInitPei Module to initialize the MMU on your platform.
+
+ @param VirtualMemoryMap Array of ARM_MEMORY_REGION_DESCRIPTOR describing a Physical-to-
+ Virtual Memory mapping. This array must be ended by a zero-filled
+ entry
+
+**/
+
+VOID
+ArmPlatformGetVirtualMemoryMap (
+ IN ARM_MEMORY_REGION_DESCRIPTOR **VirtualMemoryMap
+ )
+{
+ ARM_MEMORY_REGION_ATTRIBUTES CacheAttributes;
+ UINTN Index;
+ ARM_MEMORY_REGION_DESCRIPTOR *VirtualMemoryTable;
+
+ Index = 0;
+
+ ASSERT (VirtualMemoryMap != NULL);
+
+ VirtualMemoryTable = (ARM_MEMORY_REGION_DESCRIPTOR*)AllocatePages (
+ EFI_SIZE_TO_PAGES (sizeof (ARM_MEMORY_REGION_DESCRIPTOR) * MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS));
+
+ if (VirtualMemoryTable == NULL) {
+ return;
+ }
+
+ if (FeaturePcdGet (PcdCacheEnable) == TRUE) {
+ CacheAttributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK;
+ } else {
+ CacheAttributes = ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED;
+ }
+
+ // DRAM1 (Must be 1st entry)
+ VirtualMemoryTable[Index].PhysicalBase = DRAM1_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = DRAM1_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = DRAM1_SIZE;
+ VirtualMemoryTable[Index].Attributes = CacheAttributes;
+
+ // CCSR Space
+ VirtualMemoryTable[++Index].PhysicalBase = CCSR_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = CCSR_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = CCSR_SIZE;
+ VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
+
+ // IFC region 1
+ //
+ // A-009241 : Unaligned write transactions to IFC may result in corruption of data
+ // Affects : IFC
+ // Description: 16 byte unaligned write from system bus to IFC may result in extra unintended
+ // writes on external IFC interface that can corrupt data on external flash.
+ // Impact : Data corruption on external flash may happen in case of unaligned writes to
+ // IFC memory space.
+ // Workaround: Following are the workarounds:
+ // For write transactions from core, IFC interface memories (including IFC SRAM)
+ // should be configured as device type memory in MMU.
+ // For write transactions from non-core masters (like system DMA), the address
+ // should be 16 byte aligned and the data size should be multiple of 16 bytes.
+ //
+ VirtualMemoryTable[++Index].PhysicalBase = IFC_REGION1_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = IFC_REGION1_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = IFC_REGION1_SIZE;
+ VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
+
+ // QMAN SWP
+ VirtualMemoryTable[++Index].PhysicalBase = QMAN_SWP_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = QMAN_SWP_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = QMAN_SWP_SIZE;
+ VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED;
+
+ // BMAN SWP
+ VirtualMemoryTable[++Index].PhysicalBase = BMAN_SWP_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = BMAN_SWP_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = BMAN_SWP_SIZE;
+ VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED;
+
+ // IFC region 2
+ VirtualMemoryTable[++Index].PhysicalBase = IFC_REGION2_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = IFC_REGION2_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = IFC_REGION2_SIZE;
+ VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
+
+ // DRAM2
+ VirtualMemoryTable[++Index].PhysicalBase = DRAM2_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = DRAM2_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = DRAM2_SIZE;
+ VirtualMemoryTable[Index].Attributes = CacheAttributes;
+
+ // PCIe1
+ VirtualMemoryTable[++Index].PhysicalBase = PCI_EXP1_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = PCI_EXP1_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = PCI_EXP1_BASE_SIZE;
+ VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
+
+ // PCIe2
+ VirtualMemoryTable[++Index].PhysicalBase = PCI_EXP2_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = PCI_EXP2_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = PCI_EXP2_BASE_SIZE;
+ VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
+
+ // PCIe3
+ VirtualMemoryTable[++Index].PhysicalBase = PCI_EXP3_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = PCI_EXP3_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = PCI_EXP3_BASE_SIZE;
+ VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
+
+ // DRAM3
+ VirtualMemoryTable[++Index].PhysicalBase = DRAM3_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = DRAM3_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = DRAM3_SIZE;
+ VirtualMemoryTable[Index].Attributes = CacheAttributes;
+
+ // QSPI region
+ VirtualMemoryTable[++Index].PhysicalBase = QSPI_REGION_BASE_ADDR;
+ VirtualMemoryTable[Index].VirtualBase = QSPI_REGION_BASE_ADDR;
+ VirtualMemoryTable[Index].Length = QSPI_REGION_SIZE;
+ VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED;
+
+ // End of Table
+ VirtualMemoryTable[++Index].PhysicalBase = 0;
+ VirtualMemoryTable[Index].VirtualBase = 0;
+ VirtualMemoryTable[Index].Length = 0;
+ VirtualMemoryTable[Index].Attributes = (ARM_MEMORY_REGION_ATTRIBUTES)0;
+
+ ASSERT ((Index + 1) <= MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS);
+
+ *VirtualMemoryMap = VirtualMemoryTable;
+}
--
1.9.1
^ permalink raw reply related [flat|nested] 39+ messages in thread
* [PATCH v2 8/9] Compilation : Add the fdf, dsc and dec files.
2017-11-22 15:48 ` [PATCH v2 1/9] Platform/NXP: Add support for Big Endian Mmio APIs Meenakshi Aggarwal
` (5 preceding siblings ...)
2017-11-22 15:48 ` [PATCH v2 7/9] Platform/NXP: Add support for ArmPlatformLib Meenakshi Aggarwal
@ 2017-11-22 15:48 ` Meenakshi Aggarwal
2017-11-22 15:49 ` [PATCH v2 9/9] Build : Add build script and environment script Meenakshi Aggarwal
2017-11-26 15:48 ` [PATCH v2 1/9] Platform/NXP: Add support for Big Endian Mmio APIs Leif Lindholm
8 siblings, 0 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-22 15:48 UTC (permalink / raw)
To: ard.biesheuvel, leif.lindholm, michael.d.kinney, edk2-devel
The firmware device, description and declaration files.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
---
Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dec | 29 ++
Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dsc | 77 +++++
Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.fdf | 281 +++++++++++++++++
Platform/NXP/NxpQoriqLs.dec | 248 +++++++++++++++
Platform/NXP/NxpQoriqLs.dsc | 453 +++++++++++++++++++++++++++
Silicon/NXP/LS1043A/LS1043A.dec | 22 ++
Silicon/NXP/LS1043A/LS1043A.dsc | 82 +++++
7 files changed, 1192 insertions(+)
create mode 100644 Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dec
create mode 100644 Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dsc
create mode 100644 Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.fdf
create mode 100644 Platform/NXP/NxpQoriqLs.dec
create mode 100644 Platform/NXP/NxpQoriqLs.dsc
create mode 100644 Silicon/NXP/LS1043A/LS1043A.dec
create mode 100644 Silicon/NXP/LS1043A/LS1043A.dsc
diff --git a/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dec b/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dec
new file mode 100644
index 0000000..1b639e2
--- /dev/null
+++ b/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dec
@@ -0,0 +1,29 @@
+# LS1043aRdbPkg.dec
+# LS1043a board package.
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials are licensed and made available under
+# the terms and conditions of the BSD License which accompanies this distribution.
+# The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+
+[Defines]
+ PACKAGE_NAME = LS1043aRdbPkg
+ PACKAGE_GUID = 6eba6648-d853-4eb3-9761-528b82d5ab04
+
+################################################################################
+#
+# Include Section - list of Include Paths that are provided by this package.
+# Comments are used for Keywords and Module Types.
+#
+# Supported Module Types:
+# BASE SEC PEI_CORE PEIM DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER DXE_SAL_DRIVER UEFI_DRIVER UEFI_APPLICATION
+#
+################################################################################
+[Includes.common]
+ Include # Root include for the package
diff --git a/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dsc b/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dsc
new file mode 100644
index 0000000..1951e82
--- /dev/null
+++ b/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dsc
@@ -0,0 +1,77 @@
+# LS1043aRdbPkg.dsc
+#
+# LS1043ARDB Board package.
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+
+################################################################################
+#
+# Defines Section - statements that will be processed to create a Makefile.
+#
+################################################################################
+[Defines]
+ #
+ # Defines for default states. These can be changed on the command line.
+ # -D FLAG=VALUE
+ #
+ PLATFORM_NAME = LS1043aRdbPkg
+ PLATFORM_GUID = 60169ec4-d2b4-44f8-825e-f8684fd42e4f
+ OUTPUT_DIRECTORY = Build/LS1043aRdbPkg
+ FLASH_DEFINITION = edk2-platforms/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.fdf
+
+!include ../NxpQoriqLs.dsc
+!include ../../../Silicon/NXP/LS1043A/LS1043A.dsc
+
+[LibraryClasses.common]
+ ArmPlatformLib|edk2-platforms/Platform/NXP/LS1043aRdbPkg/Library/PlatformLib/ArmPlatformLib.inf
+ ResetSystemLib|ArmPkg/Library/ArmSmcPsciResetSystemLib/ArmSmcPsciResetSystemLib.inf
+ SerialPortLib|edk2-platforms/Platform/NXP/Library/DUartPortLib/DUartPortLib.inf
+ BeIoLib|edk2-platforms/Platform/NXP/Library/BeIoLib/BeIoLib.inf
+ SocLib|edk2-platforms/Silicon/NXP/Chassis/LS1043aSocLib.inf
+ RealTimeClockLib|edk2-platforms/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.inf
+
+[PcdsFixedAtBuild.common]
+ gArmPlatformTokenSpaceGuid.PcdFirmwareVendor|"LS1043a RDB board"
+
+ #
+ # Board Specific Pcds
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdSerdes2Enabled|FALSE
+ gNxpQoriqLsTokenSpaceGuid.PcdPlatformFreqDiv|0x1
+
+ #
+ # Big Endian IPs
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdGurBigEndian|TRUE
+ gNxpQoriqLsTokenSpaceGuid.PcdWdogBigEndian|TRUE
+
+ #
+ # I2C controller Pcds
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdI2cBus|0
+
+ #
+ # RTC Pcds
+ #
+ gDs1307RtcLibTokenSpaceGuid.PcdI2cSlaveAddress|0x68
+ gDs1307RtcLibTokenSpaceGuid.PcdI2cBusFrequency|100000
+
+################################################################################
+#
+# Components Section - list of all EDK II Modules needed by this Platform
+#
+################################################################################
+[Components.common]
+ edk2-platforms/Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf
+ edk2-platforms/Platform/NXP/Drivers/I2cDxe/I2cDxe.inf
+
+ ##
diff --git a/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.fdf b/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.fdf
new file mode 100644
index 0000000..44f452a
--- /dev/null
+++ b/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.fdf
@@ -0,0 +1,281 @@
+# LS1043aRdbPkg.fdf
+#
+# FLASH layout file for LS1043a board.
+#
+# Copyright (c) 2016, Freescale Ltd. All rights reserved.
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+
+################################################################################
+#
+# FD Section
+# The [FD] Section is made up of the definition statements and a
+# description of what goes into the Flash Device Image. Each FD section
+# defines one flash "device" image. A flash device image may be one of
+# the following: Removable media bootable image (like a boot floppy
+# image,) an Option ROM image (that would be "flashed" into an add-in
+# card,) a System "Flash" image (that would be burned into a system's
+# flash) or an Update ("Capsule") image that will be used to update and
+# existing system flash.
+#
+################################################################################
+
+[FD.LS1043ARDB_EFI]
+BaseAddress = 0x82000000|gArmTokenSpaceGuid.PcdFdBaseAddress #The base address of the FLASH Device.
+Size = 0x000EC890|gArmTokenSpaceGuid.PcdFdSize #The size in bytes of the FLASH Device
+ErasePolarity = 1
+BlockSize = 0x1
+NumBlocks = 0xEC890
+
+################################################################################
+#
+# Following are lists of FD Region layout which correspond to the locations of different
+# images within the flash device.
+#
+# Regions must be defined in ascending order and may not overlap.
+#
+# A Layout Region start with a eight digit hex offset (leading "0x" required) followed by
+# the pipe "|" character, followed by the size of the region, also in hex with the leading
+# "0x" characters. Like:
+# Offset|Size
+# PcdOffsetCName|PcdSizeCName
+# RegionType <FV, DATA, or FILE>
+#
+################################################################################
+0x00000000|0x000EC890
+gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize
+FV = FVMAIN_COMPACT
+
+
+################################################################################
+#
+# FV Section
+#
+# [FV] section is used to define what components or modules are placed within a flash
+# device file. This section also defines order the components and modules are positioned
+# within the image. The [FV] section consists of define statements, set statements and
+# module statements.
+#
+################################################################################
+
+[FV.FvMain]
+FvNameGuid = 1037c42b-8452-4c41-aac7-41e6c31468da
+BlockSize = 0x1
+NumBlocks = 0 # This FV gets compressed so make it just big enough
+FvAlignment = 8 # FV alignment and FV attributes setting.
+ERASE_POLARITY = 1
+MEMORY_MAPPED = TRUE
+STICKY_WRITE = TRUE
+LOCK_CAP = TRUE
+LOCK_STATUS = TRUE
+WRITE_DISABLED_CAP = TRUE
+WRITE_ENABLED_CAP = TRUE
+WRITE_STATUS = TRUE
+WRITE_LOCK_CAP = TRUE
+WRITE_LOCK_STATUS = TRUE
+READ_DISABLED_CAP = TRUE
+READ_ENABLED_CAP = TRUE
+READ_STATUS = TRUE
+READ_LOCK_CAP = TRUE
+READ_LOCK_STATUS = TRUE
+
+ INF MdeModulePkg/Core/Dxe/DxeMain.inf
+ INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
+
+ #
+ # PI DXE Drivers producing Architectural Protocols (EFI Services)
+ #
+ INF ArmPkg/Drivers/CpuDxe/CpuDxe.inf
+
+ INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
+ INF ArmPkg/Drivers/ArmGic/ArmGicDxe.inf
+ INF ArmPkg/Drivers/TimerDxe/TimerDxe.inf
+ INF edk2-platforms/Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf
+ INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
+ INF MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf
+ INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
+ INF EmbeddedPkg/EmbeddedMonotonicCounter/EmbeddedMonotonicCounter.inf
+ INF MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDxe.inf
+ INF MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf
+ INF EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf
+
+ #
+ # Multiple Console IO support
+ #
+ INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
+ INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
+ INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
+ INF MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
+ INF MdeModulePkg/Universal/SerialDxe/SerialDxe.inf
+
+ INF EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf
+ INF EmbeddedPkg/SimpleTextInOutSerial/SimpleTextInOutSerial.inf
+
+ #
+ # Network modules
+ #
+ INF MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf
+ INF MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf
+ INF MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf
+ INF MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf
+ INF MdeModulePkg/Universal/Network/ArpDxe/ArpDxe.inf
+ INF MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf
+ INF MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf
+ INF MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf
+ INF MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf
+ INF MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf
+ INF MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
+!if $(NETWORK_IP6_ENABLE) == TRUE
+ INF NetworkPkg/Ip6Dxe/Ip6Dxe.inf
+ INF NetworkPkg/TcpDxe/TcpDxe.inf
+ INF NetworkPkg/Udp6Dxe/Udp6Dxe.inf
+ INF NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf
+ INF NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf
+ INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf
+!else
+ INF MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf
+!endif
+
+ #
+ # FAT filesystem + GPT/MBR partitioning
+ #
+ INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
+ INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
+ INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
+ INF FatPkg/FatPei/FatPei.inf
+ INF FatPkg/EnhancedFatDxe/Fat.inf
+
+ #
+ # UEFI application (Shell Embedded Boot Loader)
+ #
+ INF ShellPkg/Application/Shell/Shell.inf
+
+ #
+ # Bds
+ #
+ INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
+ INF MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
+ INF MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf
+ INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
+ INF MdeModulePkg/Application/UiApp/UiApp.inf
+
+ INF edk2-platforms/Platform/NXP/Drivers/I2cDxe/I2cDxe.inf
+
+[FV.FVMAIN_COMPACT]
+FvAlignment = 8
+ERASE_POLARITY = 1
+MEMORY_MAPPED = TRUE
+STICKY_WRITE = TRUE
+LOCK_CAP = TRUE
+LOCK_STATUS = TRUE
+WRITE_DISABLED_CAP = TRUE
+WRITE_ENABLED_CAP = TRUE
+WRITE_STATUS = TRUE
+WRITE_LOCK_CAP = TRUE
+WRITE_LOCK_STATUS = TRUE
+READ_DISABLED_CAP = TRUE
+READ_ENABLED_CAP = TRUE
+READ_STATUS = TRUE
+READ_LOCK_CAP = TRUE
+READ_LOCK_STATUS = TRUE
+
+ INF ArmPlatformPkg/PrePi/PeiUniCore.inf
+
+ FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {
+ SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE {
+ SECTION FV_IMAGE = FVMAIN
+ }
+ }
+
+################################################################################
+#
+# Rules are use with the [FV] section's module INF type to define
+# how an FFS file is created for a given INF file. The following Rule are the default
+# rules for the different module type. User can add the customized rules to define the
+# content of the FFS file.
+#
+################################################################################
+
+[Rule.Common.SEC]
+ FILE SEC = $(NAMED_GUID) RELOCS_STRIPPED {
+ TE TE Align = 32 $(INF_OUTPUT)/$(MODULE_NAME).efi
+ }
+
+[Rule.Common.PEI_CORE]
+ FILE PEI_CORE = $(NAMED_GUID) {
+ TE TE $(INF_OUTPUT)/$(MODULE_NAME).efi
+ UI STRING ="$(MODULE_NAME)" Optional
+ }
+
+[Rule.Common.PEIM]
+ FILE PEIM = $(NAMED_GUID) {
+ PEI_DEPEX PEI_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex
+ PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi
+ UI STRING="$(MODULE_NAME)" Optional
+ }
+
+[Rule.Common.PEIM.TIANOCOMPRESSED]
+ FILE PEIM = $(NAMED_GUID) DEBUG_MYTOOLS_IA32 {
+ PEI_DEPEX PEI_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex
+ GUIDED A31280AD-481E-41B6-95E8-127F4C984779 PROCESSING_REQUIRED = TRUE {
+ PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi
+ UI STRING="$(MODULE_NAME)" Optional
+ }
+ }
+
+[Rule.Common.DXE_CORE]
+ FILE DXE_CORE = $(NAMED_GUID) {
+ PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi
+ UI STRING="$(MODULE_NAME)" Optional
+ }
+
+
+[Rule.Common.UEFI_DRIVER]
+ FILE DRIVER = $(NAMED_GUID) {
+ DXE_DEPEX DXE_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex
+ PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi
+ UI STRING="$(MODULE_NAME)" Optional
+ }
+
+[Rule.Common.DXE_DRIVER]
+ FILE DRIVER = $(NAMED_GUID) {
+ DXE_DEPEX DXE_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex
+ PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi
+ UI STRING="$(MODULE_NAME)" Optional
+ }
+
+[Rule.Common.DXE_RUNTIME_DRIVER]
+ FILE DRIVER = $(NAMED_GUID) {
+ DXE_DEPEX DXE_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex
+ PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi
+ UI STRING="$(MODULE_NAME)" Optional
+ }
+
+[Rule.Common.UEFI_APPLICATION]
+ FILE APPLICATION = $(NAMED_GUID) {
+ UI STRING ="$(MODULE_NAME)" Optional
+ PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi
+ }
+
+[Rule.Common.UEFI_DRIVER.BINARY]
+ FILE DRIVER = $(NAMED_GUID) {
+ DXE_DEPEX DXE_DEPEX Optional |.depex
+ PE32 PE32 |.efi
+ UI STRING="$(MODULE_NAME)" Optional
+ VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER)
+ }
+
+[Rule.Common.UEFI_APPLICATION.BINARY]
+ FILE APPLICATION = $(NAMED_GUID) {
+ PE32 PE32 |.efi
+ UI STRING="$(MODULE_NAME)" Optional
+ VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER)
+ }
diff --git a/Platform/NXP/NxpQoriqLs.dec b/Platform/NXP/NxpQoriqLs.dec
new file mode 100644
index 0000000..fd07eee
--- /dev/null
+++ b/Platform/NXP/NxpQoriqLs.dec
@@ -0,0 +1,248 @@
+# @file.
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials are licensed and made available under
+# the terms and conditions of the BSD License which accompanies this distribution.
+# The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+[Defines]
+ DEC_SPECIFICATION = 0x00010005
+ PACKAGE_VERSION = 0.1
+
+[Includes]
+ .
+ Include
+
+[Guids.common]
+ gNxpQoriqLsTokenSpaceGuid = {0x98657342, 0x4aee, 0x4fc6, {0xbc, 0xb5, 0xff, 0x45, 0xb7, 0xa8, 0x71, 0xf2}}
+
+[PcdsFixedAtBuild.common]
+ #
+ # Pcds for I2C Controller
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdI2cBus|0|UINT32|0x00000001
+ gNxpQoriqLsTokenSpaceGuid.PcdI2cSpeed|0|UINT32|0x00000002
+ gNxpQoriqLsTokenSpaceGuid.PcdNumI2cController|0|UINT32|0x00000003
+
+ #
+ # Pcds for base address and size
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdGutsBaseAddr|0x0|UINT64|0x00000100
+ gNxpQoriqLsTokenSpaceGuid.PcdPiFdSize|0x0|UINT32|0x00000101
+ gNxpQoriqLsTokenSpaceGuid.PcdPiFdBaseAddress|0x0|UINT64|0x00000102
+ gNxpQoriqLsTokenSpaceGuid.PcdDspiBaseAddr|0|UINT64|0x00000103
+ gNxpQoriqLsTokenSpaceGuid.PcdClkBaseAddr|0x0|UINT64|0x00000104
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog1BaseAddr|0x0|UINT64|0x00000105
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog2BaseAddr|0x0|UINT64|0x00000106
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog3BaseAddr|0x0|UINT64|0x00000107
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog4BaseAddr|0x0|UINT64|0x00000108
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog5BaseAddr|0x0|UINT64|0x00000109
+ gNxpQoriqLsTokenSpaceGuid.PcdDdrBaseAddr|0x0|UINT64|0x0000010A
+ gNxpQoriqLsTokenSpaceGuid.PcdSdxcBaseAddr|0|UINT64|0x0000010B
+ gNxpQoriqLsTokenSpaceGuid.PcdScfgBaseAddr|0|UINT64|0x0000010C
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c0BaseAddr|0|UINT64|0x0000010D
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c1BaseAddr|0|UINT64|0x0000010E
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c2BaseAddr|0|UINT64|0x0000010F
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c3BaseAddr|0|UINT64|0x00000110
+ gNxpQoriqLsTokenSpaceGuid.PcdSataController1BaseAddress|0x0|UINT32|0x00000111
+ gNxpQoriqLsTokenSpaceGuid.PcdSataController2BaseAddress|0x0|UINT32|0x00000112
+ gNxpQoriqLsTokenSpaceGuid.PcdQmanSwpBaseAddr|0x0500000000|UINT64|0x00000113
+ gNxpQoriqLsTokenSpaceGuid.PcdQmanSwpSize|0x0080000000|UINT64|0x00000114
+ gNxpQoriqLsTokenSpaceGuid.PcdBmanSwpBaseAddr|0x0508000000|UINT64|0x00000115
+ gNxpQoriqLsTokenSpaceGuid.PcdBmanSwpSize|0x0080000000|UINT64|0x00000116
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp1BaseAddr|0x0|UINT64|0x00000117
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp1BaseSize|0x0|UINT64|0x00000118
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp2BaseAddr|0x0|UINT64|0x00000119
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp2BaseSize|0x0|UINT64|0x0000011A
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp3BaseAddr|0x0|UINT64|0x0000011B
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp3BaseSize|0x0|UINT64|0x0000011C
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp4BaseAddr|0x3800000000|UINT64|0x000011D
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp4BaseSize|0x800000000|UINT64|0x000011E
+ gNxpQoriqLsTokenSpaceGuid.PcdDram1BaseAddr|0x0080000000|UINT64|0x0000011F
+ gNxpQoriqLsTokenSpaceGuid.PcdDram1Size|0x0080000000|UINT64|0x00000120
+ gNxpQoriqLsTokenSpaceGuid.PcdDram2BaseAddr|0x0880000000|UINT64|0x00000121
+ gNxpQoriqLsTokenSpaceGuid.PcdDram2Size|0x0780000000|UINT64|0x00000122
+ gNxpQoriqLsTokenSpaceGuid.PcdDram3BaseAddr|0x8800000000|UINT64|0x00000123
+ gNxpQoriqLsTokenSpaceGuid.PcdDram3Size|0x7800000000|UINT64|0x00000124
+ gNxpQoriqLsTokenSpaceGuid.PcdQspiRegionBaseAddr|0x40000000|UINT64|0x00000125
+ gNxpQoriqLsTokenSpaceGuid.PcdQspiRegionSize|0x20000000|UINT64|0x00000126
+ gNxpQoriqLsTokenSpaceGuid.PcdQspiRegion2BaseAddr|0x0|UINT64|0x00000127
+ gNxpQoriqLsTokenSpaceGuid.PcdQspiRegion2Size|0x0|UINT64|0x00000128
+ gNxpQoriqLsTokenSpaceGuid.PcdSystemMemoryExBase|0|UINT64|0x00000129
+ gNxpQoriqLsTokenSpaceGuid.PcdSystemMemoryExSize|0|UINT64|0x0000012A
+ gNxpQoriqLsTokenSpaceGuid.PcdUsbBaseAddr|0|UINT32|0x0000012B
+ gNxpQoriqLsTokenSpaceGuid.PcdUsbSize|0|UINT32|0x0000012C
+ gNxpQoriqLsTokenSpaceGuid.PcdCcsrBaseAddr|0x01000000|UINT64|0x0000012D
+ gNxpQoriqLsTokenSpaceGuid.PcdCcsrSize|0x0F000000|UINT64|0x0000012E
+ gNxpQoriqLsTokenSpaceGuid.PcdDramMemSize|0x0|UINT64|0x0000012F
+
+ #
+ # DSPI Pcds
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdDspiSpeed|0|UINT32|0x00000150
+ gNxpQoriqLsTokenSpaceGuid.PcdDspiMode|0|UINT32|0x00000151
+ gNxpQoriqLsTokenSpaceGuid.PcdDspiBusNumber|0|UINT32|0x00000152
+ gNxpQoriqLsTokenSpaceGuid.PcdDspiCs|0|UINT32|0x00000153
+
+ #
+ # IFC PCDs
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion1BaseAddr|0x60000000|UINT64|0x00000190
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion1Size|0x20000000|UINT64|0x00000191
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion2BaseAddr|0x0620000000|UINT64|0x00000192
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion2Size|0x00E0000000|UINT64|0x00000193
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcNandReservedSize|0x0|UINT32|0x00000194
+ gNxpQoriqLsTokenSpaceGuid.PcdFlashDeviceBase64|0x0|UINT64|0x00000195
+ gNxpQoriqLsTokenSpaceGuid.PcdFlashReservedRegionBase64|0x0|UINT64|0x00000196
+
+ #
+ # PCI PCDs
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdPciMaxPayloadFixup|FALSE|BOOLEAN|0x000001C0
+ gNxpQoriqLsTokenSpaceGuid.PcdKludgeMapPciMmioAsCached|FALSE|BOOLEAN|0x000001C1
+ gNxpQoriqLsTokenSpaceGuid.PcdPciBusMin|0|UINT64|0x000001C2
+ gNxpQoriqLsTokenSpaceGuid.PcdPciBusMax|255|UINT64|0x000001C3
+ gNxpQoriqLsTokenSpaceGuid.PcdPci1Mmio64Base|0x0|UINT64|0x000001C4
+ gNxpQoriqLsTokenSpaceGuid.PcdPci2Mmio64Base|0x0|UINT64|0x000001C5
+ gNxpQoriqLsTokenSpaceGuid.PcdPci3Mmio64Base|0x0|UINT64|0x000001C6
+ gNxpQoriqLsTokenSpaceGuid.PcdPci4Mmio64Base|0x0|UINT64|0x000001C7
+ gNxpQoriqLsTokenSpaceGuid.PcdPciMmio64Size|0x0|UINT64|0x000001C8
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp1SysAddr|0x0|UINT64|0x000001C9
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp2SysAddr|0x0|UINT64|0x000001CA
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp3SysAddr|0x0|UINT64|0x000001CB
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp4SysAddr|0x0|UINT64|0x000001CC
+ gNxpQoriqLsTokenSpaceGuid.PcdPciDebug|FALSE|BOOLEAN|0x000001CD
+ gNxpQoriqLsTokenSpaceGuid.PcdNumPciController|0|UINT32|0x000001CE
+ gNxpQoriqLsTokenSpaceGuid.PcdPciMemOneTransaction|0x0|UINT64|0x000001CF
+ gNxpQoriqLsTokenSpaceGuid.PcdPcieLutBase|0x0|UINT64|0x000001D0
+ gNxpQoriqLsTokenSpaceGuid.PcdPcieLutDbg|0x0|UINT64|0x000001D1
+
+ #
+ # NV Pcd
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdNvFdBase|0x0|UINT64|0x00000210
+ gNxpQoriqLsTokenSpaceGuid.PcdNvFdSize|0x0|UINT64|0x00000211
+
+ #
+ # QSPI PCDs
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdQspiFdtCompatible|""|VOID*|0x00000220
+ gNxpQoriqLsTokenSpaceGuid.PcdFdtAddress|0|UINT64|0x00000221
+
+ #
+ # Platform PCDs
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdPlatformFreqDiv|0|UINT32|0x00000250
+ gNxpQoriqLsTokenSpaceGuid.PcdSerdes2Enabled|FALSE|BOOLEAN|0x00000251
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcNorEnabled|0x0|UINT64|0x00000252
+ gNxpQoriqLsTokenSpaceGuid.PcdMuxToUsb3|FALSE|BOOLEAN|0x00000253
+
+ #
+ # Erratum PCDs
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdI2cErratumA009203|FALSE|BOOLEAN|0x00000270
+ gNxpQoriqLsTokenSpaceGuid.PcdUsbErratumA009007|FALSE|BOOLEAN|0x00000271
+ gNxpQoriqLsTokenSpaceGuid.PcdErratumA008751|FALSE|BOOLEAN|0x00000272
+ gNxpQoriqLsTokenSpaceGuid.PcdErratumA009008|FALSE|BOOLEAN|0x00000273
+ gNxpQoriqLsTokenSpaceGuid.PcdErratumA009798|FALSE|BOOLEAN|0x00000274
+ gNxpQoriqLsTokenSpaceGuid.PcdErratumA008514|FALSE|BOOLEAN|0x00000275
+ gNxpQoriqLsTokenSpaceGuid.PcdErratumA008336|FALSE|BOOLEAN|0x00000276
+ gNxpQoriqLsTokenSpaceGuid.PcdSataErratumA009185|FALSE|BOOLEAN|0x00000277
+
+ #
+ # Test PCDs
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdDspiTest|FALSE|BOOLEAN|0x00000290
+
+ #
+ # Clock PCDs
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdSysClk|0x0|UINT64|0x000002A0
+ gNxpQoriqLsTokenSpaceGuid.PcdDdrClk|0x0|UINT64|0x000002A1
+
+ #
+ # DPAA1 PCDs
+ #
+ # Valid values for PcdDpaa1DebugFlags:
+ # - 0x1 Enable DPAA1 debugging messages
+ # - 0x2 Dump values of RAM words or registers
+ # - 0x4 Perform extra checks
+ # - 0x8 Trace sent/received network packets
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa1Initialize|FALSE|BOOLEAN|0x000002B0
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa1DebugFlags|0x0|UINT32|0x000002B1
+ gNxpQoriqLsTokenSpaceGuid.PcdFManFwFlashAddr|0x0|UINT32|0x000002B2
+ gNxpQoriqLsTokenSpaceGuid.PcdSgmiiPrtclInit|FALSE|BOOLEAN|0x000002B3
+ #
+ # Bit mask to indicate the DPAA1 MEMACs to be used.
+ # MeMaci is selected to be used, if bit 'i - 1' is set in the bit mask,
+ # where i is the range '1 .. #Memacs'. For example, if we want MEMAC5
+ # to be used, the value of the mask needs to be 0x10 (bit 4 set)
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa1UsedMemacsMask|0x0|UINT64|0x000002B4
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa1FmanMdio1Addr|0x0|UINT64|0x000002B5
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa1FmanMdio2Addr|0x0|UINT64|0x000002B6
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa1FmanAddr|0x0|UINT64|0x000002B7
+
+ #
+ # DPAA2 PCDs
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McPortalBaseAddr|0x0|UINT64|0x000002D0
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McPortalSize|0x0|UINT64|0x000002D1
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2NiPortalsBaseAddr|0x0|UINT64|0x000002D2
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2NiPortalsSize|0x0|UINT64|0x000002D3
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2QBmanPortalsBaseAddr|0x0|UINT64|0x000002D4
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2QBmanPortalSize|0x0|UINT64|0x000002D5
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2QBmanPortalsCacheSize|0x0|UINT64|0x000002D6
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McRamSize|0x0|UINT64|0x000002D7
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2Initialize|FALSE|BOOLEAN|0x000002D8
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McFwSrc|0x0|UINT8|0x000002D9
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McFwNorAddr|0x0|UINT64|0x000002DA
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McDpcNorAddr|0x0|UINT64|0x000002DB
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McDplNorAddr|0x0|UINT64|0x000002DC
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McDpcMaxLen|0x0|UINT32|0x000002DD
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McDpcMcDramOffset|0x0|UINT32|0x000002DE
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McDplMaxLen|0x0|UINT32|0x000002DF
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McDplMcDramOffset|0x0|UINT32|0x000002E0
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McPrivateRamSize|0x0|UINT32|0x000002E1
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2StreamIdStart|0x0|UINT32|0x000002E2
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2StreamIdEnd|0x0|UINT32|0x000002E3
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McBootTimeoutMs|0x0|UINT32|0x000002E4
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McLogMcDramOffset|0x0|UINT32|0x000002E5
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2McLogLevel|0x0|UINT8|0x000002E6
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2DebugFlags|0x0|UINT32|0x000002E7
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2CortinaFwSrc|0x0|UINT8|0x000002E8
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2CortinaFwNorAddr|0x0|UINT64|0x000002E9
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2CortinaFwMaxLen|0x0|UINT32|0x000002EA
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2UsedDpmacsMask|0x0|UINT64|0x000002EB
+ gNxpQoriqLsTokenSpaceGuid.PcdMacDeviceDisableRegAddr|0x0|UINT64|0x000002EC
+ gNxpQoriqLsTokenSpaceGuid.PcdBypassAmqMask|0x0|UINT32|0x000002ED
+ gNxpQoriqLsTokenSpaceGuid.PcdMdioBustCount|0x0|UINT8|0x000002EE
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2Wriop1Mdio1Addr|0x0|UINT64|0x000002EF
+ gNxpQoriqLsTokenSpaceGuid.PcdDpaa2Wriop1Mdio2Addr|0x0|UINT64|0x000002F0
+
+ #
+ # USB Pcds
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdNumUsbController|0|UINT32|0x00000300
+
+ #
+ # Pcds to support Big Endian IPs
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdMmcBigEndian|FALSE|BOOLEAN|0x0000310
+ gNxpQoriqLsTokenSpaceGuid.PcdGurBigEndian|FALSE|BOOLEAN|0x0000311
+ gNxpQoriqLsTokenSpaceGuid.PcdPciLutBigEndian|FALSE|BOOLEAN|0x00000312
+ gNxpQoriqLsTokenSpaceGuid.PcdWdogBigEndian|FALSE|BOOLEAN|0x00000313
+
+ #
+ # System ID Eeprom Pcds
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdSysEepromI2cBus|0|UINT32|0x0000330
+ gNxpQoriqLsTokenSpaceGuid.PcdSysEepromI2cAddress|0|UINT32|0x0000331
diff --git a/Platform/NXP/NxpQoriqLs.dsc b/Platform/NXP/NxpQoriqLs.dsc
new file mode 100644
index 0000000..768a9e8
--- /dev/null
+++ b/Platform/NXP/NxpQoriqLs.dsc
@@ -0,0 +1,453 @@
+# @file
+#
+# Copyright (c) 2017 NXP.
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+################################################################################
+#
+# Defines Section - statements that will be processed to create a Makefile.
+#
+################################################################################
+[Defines]
+ #
+ # Defines for default states. These can be changed on the command line.
+ # -D FLAG=VALUE
+ #
+ PLATFORM_VERSION = 0.1
+ DSC_SPECIFICATION = 0x00010005
+ SUPPORTED_ARCHITECTURES = AARCH64
+ BUILD_TARGETS = DEBUG|RELEASE
+ SKUID_IDENTIFIER = DEFAULT
+
+[LibraryClasses.common]
+ ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf
+ ArmMmuLib|ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf
+ ArmSmcLib|ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf
+ ArmGenericTimerCounterLib|ArmPkg/Library/ArmGenericTimerPhyCounterLib/ArmGenericTimerPhyCounterLib.inf
+ TimerLib|ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf
+ ArmTrustZoneLib|ArmPlatformPkg/Drivers/ArmTrustZone/ArmTrustZone.inf
+ ArmPlatformStackLib|ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.inf
+ HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf
+ UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf
+ FileExplorerLib|MdeModulePkg/Library/FileExplorerLib/FileExplorerLib.inf
+ BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf
+ PlatformBootManagerLib|ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
+ DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
+ UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
+ CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf
+
+ # Networking Requirements
+ NetLib|MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf
+ DpcLib|MdeModulePkg/Library/DxeDpcLib/DxeDpcLib.inf
+ UdpIoLib|MdeModulePkg/Library/DxeUdpIoLib/DxeUdpIoLib.inf
+ IpIoLib|MdeModulePkg/Library/DxeIpIoLib/DxeIpIoLib.inf
+
+ # ARM GIC400 General Interrupt Driver
+ ArmGicLib|ArmPkg/Drivers/ArmGic/ArmGicLib.inf
+ ArmGicArchLib|ArmPkg/Library/ArmGicArchLib/ArmGicArchLib.inf
+ DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
+ DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf
+ MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
+ BaseLib|MdePkg/Library/BaseLib/BaseLib.inf
+ SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf
+ BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
+ PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf
+ PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
+ EfiFileLib|EmbeddedPkg/Library/EfiFileLib/EfiFileLib.inf
+ PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
+ PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
+ PeCoffExtraActionLib|ArmPkg/Library/DebugPeCoffExtraActionLib/DebugPeCoffExtraActionLib.inf
+ CacheMaintenanceLib|ArmPkg/Library/ArmCacheMaintenanceLib/ArmCacheMaintenanceLib.inf
+ DefaultExceptionHandlerLib|ArmPkg/Library/DefaultExceptionHandlerLib/DefaultExceptionHandlerLib.inf
+ CpuExceptionHandlerLib|ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.inf
+ PrePiLib|EmbeddedPkg/Library/PrePiLib/PrePiLib.inf
+ SemihostLib|ArmPkg/Library/SemihostLib/SemihostLib.inf
+ IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf
+ MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
+ UefiLib|MdePkg/Library/UefiLib/UefiLib.inf
+ HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
+ UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf
+ DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf
+ UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf
+ DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf
+ UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
+ UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
+ PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
+ UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf
+ CpuLib|MdePkg/Library/BaseCpuLib/BaseCpuLib.inf
+ ArmDisassemblerLib|ArmPkg/Library/ArmDisassemblerLib/ArmDisassemblerLib.inf
+ DebugAgentLib|MdeModulePkg/Library/DebugAgentLibNull/DebugAgentLibNull.inf
+ DmaLib|EmbeddedPkg/Library/NonCoherentDmaLib/NonCoherentDmaLib.inf
+ BdsLib|ArmPkg/Library/BdsLib/BdsLib.inf
+ FdtLib|EmbeddedPkg/Library/FdtLib/FdtLib.inf
+ ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
+ ShellCommandLib|ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf
+ FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
+ ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf
+ SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
+ NetLib|MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf
+ HandleParsingLib|ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf
+ BcfgCommandLib|ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.inf
+ TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf
+ AuthVariableLib|MdeModulePkg/Library/AuthVariableLibNull/AuthVariableLibNull.inf
+ VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
+ NULL|MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf
+ CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
+
+[LibraryClasses.common.SEC]
+ PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
+ ReportStatusCodeLib|IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf
+ UefiDecompressLib|MdePkg/Library/BaseUefiDecompressLib/BaseUefiDecompressLib.inf
+ ExtractGuidedSectionLib|EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.inf
+ LzmaDecompressLib|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
+ PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
+ HobLib|EmbeddedPkg/Library/PrePiHobLib/PrePiHobLib.inf
+ PrePiHobListPointerLib|ArmPlatformPkg/Library/PrePiHobListPointerLib/PrePiHobListPointerLib.inf
+ MemoryAllocationLib|EmbeddedPkg/Library/PrePiMemoryAllocationLib/PrePiMemoryAllocationLib.inf
+ PerformanceLib|MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.inf
+ PlatformPeiLib|ArmPlatformPkg/PlatformPei/PlatformPeiLib.inf
+ MemoryInitPeiLib|ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.inf
+
+ # 1/123 faster than Stm or Vstm version
+ BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
+
+ # Uncomment to turn on GDB stub in SEC.
+ #DebugAgentLib|EmbeddedPkg/Library/GdbDebugAgent/GdbDebugAgent.inf
+
+[LibraryClasses.common.PEIM]
+ PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf
+ PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf
+ PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf
+ PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf
+ HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf
+ MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf
+
+[LibraryClasses.common.DXE_CORE]
+ HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf
+ MemoryAllocationLib|MdeModulePkg/Library/DxeCoreMemoryAllocationLib/DxeCoreMemoryAllocationLib.inf
+ DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf
+ ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
+ ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf
+ UefiDecompressLib|MdePkg/Library/BaseUefiDecompressLib/BaseUefiDecompressLib.inf
+ DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
+ PeCoffLib|EmbeddedPkg/Library/DxeHobPeCoffLib/DxeHobPeCoffLib.inf
+ PerformanceLib|MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf
+
+[LibraryClasses.common.DXE_DRIVER]
+ ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
+ DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
+ SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf
+ PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf
+ MemoryInitPeiLib|ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.inf
+
+[LibraryClasses.common.UEFI_APPLICATION]
+ PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
+ HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
+ ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
+ UefiDecompressLib|IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLib.inf
+ PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf
+
+[LibraryClasses.common.UEFI_DRIVER]
+ ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
+ UefiDecompressLib|IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLib.inf
+ ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf
+ PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf
+ DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
+
+[LibraryClasses.common.DXE_RUNTIME_DRIVER]
+ HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
+ MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
+ ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
+ CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
+ PeCoffLib|EmbeddedPkg/Library/DxeHobPeCoffLib/DxeHobPeCoffLib.inf
+
+[LibraryClasses.AARCH64]
+ #
+ # It is not possible to prevent the ARM compiler for generic intrinsic functions.
+ # This library provides the instrinsic functions generate by a given compiler.
+ # [LibraryClasses.ARM] and NULL mean link this library into all ARM images.
+ #
+ NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
+
+[BuildOptions]
+ XCODE:*_*_ARM_PLATFORM_FLAGS == -arch armv7
+ GCC:*_*_ARM_PLATFORM_FLAGS == -march=armv7-a
+ RVCT:*_*_ARM_PLATFORM_FLAGS == --cpu cortex-a9
+
+[BuildOptions.common.EDKII.DXE_RUNTIME_DRIVER]
+ GCC:*_*_ARM_DLINK_FLAGS = -z common-page-size=0x1000
+ GCC:*_*_AARCH64_DLINK_FLAGS = -z common-page-size=0x10000
+
+################################################################################
+#
+# Pcd Section - list of all EDK II PCD Entries defined by this Platform
+#
+################################################################################
+
+[PcdsFeatureFlag.common]
+ ## If TRUE, Graphics Output Protocol will be installed on virtual handle created by ConsplitterDxe.
+ # It could be set FALSE to save size.
+ gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE
+ gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|FALSE
+ gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|TRUE
+ gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnosticsDisable|TRUE
+ gEfiMdePkgTokenSpaceGuid.PcdComponentName2Disable|TRUE
+ gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnostics2Disable|TRUE
+
+ #
+ # Control what commands are supported from the UI
+ # Turn these on and off to add features or save size
+ #
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedMacBoot|TRUE
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedDirCmd|TRUE
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedHobCmd|TRUE
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedHwDebugCmd|TRUE
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedPciDebugCmd|TRUE
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedIoEnable|FALSE
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedScriptCmd|FALSE
+ gEmbeddedTokenSpaceGuid.PcdCacheEnable|TRUE
+
+ # Use the Vector Table location in CpuDxe. We will not copy the Vector Table at PcdCpuVectorBaseAddress
+ gArmTokenSpaceGuid.PcdRelocateVectorTable|FALSE
+ gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob|TRUE
+ gArmTokenSpaceGuid.PcdCpuDxeProduceDebugSupport|FALSE
+ gEfiMdeModulePkgTokenSpaceGuid.PcdTurnOffUsbLegacySupport|TRUE
+
+[PcdsDynamicDefault.common]
+ #
+ # Set video resolution for boot options and for text setup.
+ # PlatformDxe can set the former at runtime.
+ #
+ gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution|800
+ gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution|600
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution|640
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution|480
+
+[PcdsDynamicHii.common.DEFAULT]
+ gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|L"Timeout"|gEfiGlobalVariableGuid|0x0|10
+
+[PcdsFixedAtBuild.common]
+ gEmbeddedTokenSpaceGuid.PcdMetronomeTickPeriod|1000
+ gEmbeddedTokenSpaceGuid.PcdTimerPeriod|10000 # expressed in 100ns units, 100,000 x 100 ns = 10,000,000 ns = 10 ms
+ gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x2000
+ gEfiMdeModulePkgTokenSpaceGuid.PcdMaxAuthVariableSize|0x2800
+ gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange|FALSE
+ gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile|{ 0x21, 0xaa, 0x2c, 0x46, 0x14, 0x76, 0x03, 0x45, 0x83, 0x6e, 0x8a, 0xb6, 0xf4, 0x66, 0x23, 0x31 }
+ gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdShellFile|{ 0x83, 0xA5, 0x04, 0x7C, 0x3E, 0x9E, 0x1C, 0x4F, 0xAD, 0x65, 0xE0, 0x52, 0x68, 0xD0, 0xB4, 0xD1 }
+ gArmPlatformTokenSpaceGuid.PcdCoreCount|1 # Only one core
+ gEfiMdePkgTokenSpaceGuid.PcdMaximumUnicodeStringLength|1000000
+ gEfiMdePkgTokenSpaceGuid.PcdMaximumAsciiStringLength|2000000
+ gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|1000000
+ gEfiMdePkgTokenSpaceGuid.PcdSpinLockTimeout|10000000
+ gEfiMdePkgTokenSpaceGuid.PcdDebugClearMemoryValue|0xAF
+ gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask|1
+ gEfiMdePkgTokenSpaceGuid.PcdPostCodePropertyMask|0
+ gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|320
+
+!if $(TARGET) == RELEASE
+ gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x27
+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x81000000
+!else
+ gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x2F
+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x81000044
+!endif
+
+ gEfiMdePkgTokenSpaceGuid.PcdReportStatusCodePropertyMask|0x07
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedAutomaticBootCommand|""
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedDefaultTextColor|0x07
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedMemVariableStoreSize|0x10000
+
+ #
+ # Optional feature to help prevent EFI memory map fragments
+ # Turned on and off via: PcdPrePiProduceMemoryTypeInformationHob
+ # Values are in EFI Pages (4K). DXE Core will make sure that
+ # at least this much of each type of memory can be allocated
+ # from a single memory range. This way you only end up with
+ # maximum of two fragements for each type in the memory map
+ # (the memory used, and the free memory that was prereserved
+ # but not used).
+ #
+ gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiACPIReclaimMemory|0
+ gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiACPIMemoryNVS|0
+ gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiReservedMemoryType|0
+ gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesData|80
+ gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesCode|40
+ gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiBootServicesCode|400
+ gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiBootServicesData|3000
+ gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiLoaderCode|10
+ gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiLoaderData|0
+
+ # Serial Terminal
+ gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate|115200
+ gEfiMdePkgTokenSpaceGuid.PcdDefaultTerminalType|4
+
+ # Size of the region reserved for fixed address allocations (Reserved 32MB)
+ gArmTokenSpaceGuid.PcdArmLinuxKernelMaxOffset|0x08000000
+ gArmTokenSpaceGuid.PcdArmLinuxFdtMaxOffset|0x08000000
+ gArmTokenSpaceGuid.PcdArmLinuxFdtAlignment|0x0
+ gArmTokenSpaceGuid.PcdCpuVectorBaseAddress|0x94A00000
+ gArmTokenSpaceGuid.PcdCpuResetAddress|0x94A00000
+
+ # Timer
+ gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz|0
+
+ # We want to use the Shell Libraries but don't want it to initialise
+ # automatically. We initialise the libraries when the command is called by the
+ # Shell.
+ gEfiShellPkgTokenSpaceGuid.PcdShellLibAutoInitialize|FALSE
+
+ # Use the serial console for both ConIn & ConOut
+ gArmPlatformTokenSpaceGuid.PcdDefaultConOutPaths|L"VenHw(D3987D4B-971A-435F-8CAF-4967EB627241)/Uart(115200,8,N,1)/VenPcAnsi();"
+ gArmPlatformTokenSpaceGuid.PcdDefaultConInPaths|L"VenHw(D3987D4B-971A-435F-8CAF-4967EB627241)/Uart(115200,8,N,1)/VenPcAnsi()"
+ gEfiShellPkgTokenSpaceGuid.PcdShellLibAutoInitialize|FALSE
+ gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|16000
+!ifdef $(NO_SHELL_PROFILES)
+ gEfiShellPkgTokenSpaceGuid.PcdShellProfileMask|0x00
+!endif #$(NO_SHELL_PROFILES)
+
+################################################################################
+#
+# Components Section - list of all EDK II Modules needed by this Platform
+#
+################################################################################
+[Components.common]
+ #
+ # SEC
+ #
+ ArmPlatformPkg/PrePi/PeiUniCore.inf
+ MdeModulePkg/Universal/PCD/Pei/Pcd.inf {
+ <LibraryClasses>
+ PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
+ }
+
+ #
+ # DXE
+ #
+ MdeModulePkg/Core/Dxe/DxeMain.inf {
+ <LibraryClasses>
+ NULL|MdeModulePkg/Library/DxeCrc32GuidedSectionExtractLib/DxeCrc32GuidedSectionExtractLib.inf
+ NULL|EmbeddedPkg/Library/LzmaHobCustomDecompressLib/LzmaHobCustomDecompressLib.inf
+ }
+ MdeModulePkg/Universal/PCD/Dxe/Pcd.inf {
+ <LibraryClasses>
+ PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
+ }
+
+ #
+ # Architectural Protocols
+ #
+ ArmPkg/Drivers/CpuDxe/CpuDxe.inf
+ MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
+ MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
+ MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf
+ MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDxe.inf
+ MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf
+ EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf
+ EmbeddedPkg/EmbeddedMonotonicCounter/EmbeddedMonotonicCounter.inf
+
+ # FDT installation
+ EmbeddedPkg/Drivers/FdtPlatformDxe/FdtPlatformDxe.inf
+ MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
+ MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
+ MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
+ MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
+ MdeModulePkg/Universal/SerialDxe/SerialDxe.inf
+ MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
+ EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf
+ ArmPkg/Drivers/TimerDxe/TimerDxe.inf
+ ArmPkg/Drivers/ArmGic/ArmGicDxe.inf
+ EmbeddedPkg/SimpleTextInOutSerial/SimpleTextInOutSerial.inf
+
+ #
+ # Networking stack
+ #
+ MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf
+ MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf
+ MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf
+ MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf
+ MdeModulePkg/Universal/Network/ArpDxe/ArpDxe.inf
+ MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf
+ MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf
+ MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf
+ MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf
+ MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf
+ MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
+!if $(NETWORK_IP6_ENABLE) == TRUE
+ NetworkPkg/Ip6Dxe/Ip6Dxe.inf
+ NetworkPkg/TcpDxe/TcpDxe.inf
+ NetworkPkg/Udp6Dxe/Udp6Dxe.inf
+ NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf
+ NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf
+ NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf
+!else
+ MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf
+!endif
+
+ #
+ # FAT filesystem + GPT/MBR partitioning
+ #
+ MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
+ MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
+ MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
+ FatPkg/FatPei/FatPei.inf
+ FatPkg/EnhancedFatDxe/Fat.inf
+
+ #
+ # Bds
+ #
+ MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
+ MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
+ MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf
+ MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
+ MdeModulePkg/Application/UiApp/UiApp.inf {
+ <LibraryClasses>
+ NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf
+ NULL|MdeModulePkg/Library/BootManagerUiLib/BootManagerUiLib.inf
+ NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf
+ }
+ MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
+
+ #
+ # Example Application
+ #
+ MdeModulePkg/Application/HelloWorld/HelloWorld.inf
+ ShellPkg/Library/UefiShellLib/UefiShellLib.inf
+ ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf
+ ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.inf
+ ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf
+ ShellPkg/Library/UefiDpLib/UefiDpLib.inf {
+ <LibraryClasses>
+ TimerLib|MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.inf
+ PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf
+ DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
+ }
+ ShellPkg/Application/Shell/Shell.inf {
+ <LibraryClasses>
+ NULL|ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.inf
+ NULL|ShellPkg/Library/UefiShellLevel1CommandsLib/UefiShellLevel1CommandsLib.inf
+ NULL|ShellPkg/Library/UefiShellLevel3CommandsLib/UefiShellLevel3CommandsLib.inf
+!ifndef $(NO_SHELL_PROFILES)
+ NULL|ShellPkg/Library/UefiShellDriver1CommandsLib/UefiShellDriver1CommandsLib.inf
+ NULL|ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.inf
+ NULL|ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf
+ NULL|ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
+ NULL|ShellPkg/Library/UefiShellTftpCommandLib/UefiShellTftpCommandLib.inf
+!ifdef $(INCLUDE_DP)
+ NULL|ShellPkg/Library/UefiDpLib/UefiDpLib.inf
+!endif #$(INCLUDE_DP)
+!ifdef $(INCLUDE_TFTP_COMMAND)
+ NULL|ShellPkg/Library/UefiShellTftpCommandLib/UefiShellTftpCommandLib.inf
+!endif #$(INCLUDE_TFTP_COMMAND)
+!endif #$(NO_SHELL_PROFILES)
+ }
+
+ ##
diff --git a/Silicon/NXP/LS1043A/LS1043A.dec b/Silicon/NXP/LS1043A/LS1043A.dec
new file mode 100644
index 0000000..f14edb2
--- /dev/null
+++ b/Silicon/NXP/LS1043A/LS1043A.dec
@@ -0,0 +1,22 @@
+# LS1043A.dec
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials are licensed and made available under
+# the terms and conditions of the BSD License which accompanies this distribution.
+# The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+[Defines]
+ DEC_SPECIFICATION = 0x00010005
+
+[Guids.common]
+ gNxpLs1043ATokenSpaceGuid = {0x6834fe45, 0x4aee, 0x4fc6, {0xbc, 0xb5, 0xff, 0x45, 0xb7, 0xa8, 0x71, 0xf2}}
+
+[Includes]
+ Include
diff --git a/Silicon/NXP/LS1043A/LS1043A.dsc b/Silicon/NXP/LS1043A/LS1043A.dsc
new file mode 100644
index 0000000..78f8011
--- /dev/null
+++ b/Silicon/NXP/LS1043A/LS1043A.dsc
@@ -0,0 +1,82 @@
+# LS1043A.dsc
+# LS1043A Soc package.
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+################################################################################
+#
+# Pcd Section - list of all EDK II PCD Entries defined by this Platform
+#
+################################################################################
+[PcdsDynamicDefault.common]
+
+ #
+ # ARM General Interrupt Controller
+ gArmTokenSpaceGuid.PcdGicDistributorBase|0x01401000
+ gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase|0x01402000
+
+[PcdsFixedAtBuild.common]
+
+ gEmbeddedTokenSpaceGuid.PcdEmbeddedPrompt|"LS1043a"
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase|0x021c0500
+
+ #
+ # LS1043a board Specific PCDs
+ # XX (DRAM - Region 1 2GB)
+ # (NOR - IFC Region 1 512MB)
+ gArmTokenSpaceGuid.PcdSystemMemoryBase|0x80000000
+ gArmTokenSpaceGuid.PcdSystemMemorySize|0x80000000
+ gArmPlatformTokenSpaceGuid.PcdSystemMemoryUefiRegionSize|0x02000000
+
+ #
+ # CCSR Address Space and other attached Memories
+ #
+ gNxpQoriqLsTokenSpaceGuid.PcdCcsrBaseAddr|0x01000000
+ gNxpQoriqLsTokenSpaceGuid.PcdCcsrSize|0x0F000000
+ gNxpQoriqLsTokenSpaceGuid.PcdClkBaseAddr|0x01EE1000
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion1BaseAddr|0x60000000
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion1Size|0x20000000
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion2BaseAddr|0x0620000000
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcRegion2Size|0x00E0000000
+ gNxpQoriqLsTokenSpaceGuid.PcdIfcNandReservedSize|0x2EA
+ gNxpQoriqLsTokenSpaceGuid.PcdQmanSwpBaseAddr|0x0500000000
+ gNxpQoriqLsTokenSpaceGuid.PcdQmanSwpSize|0x0080000000
+ gNxpQoriqLsTokenSpaceGuid.PcdBmanSwpBaseAddr|0x0508000000
+ gNxpQoriqLsTokenSpaceGuid.PcdBmanSwpSize|0x0080000000
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp1BaseAddr|0x4000000000
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp1BaseSize|0x800000000
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp2BaseAddr|0x4800000000
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp2BaseSize|0x800000000
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp3BaseAddr|0x5000000000
+ gNxpQoriqLsTokenSpaceGuid.PcdPciExp3BaseSize|0x800000000
+ gNxpQoriqLsTokenSpaceGuid.PcdDram1BaseAddr|0x0080000000
+ gNxpQoriqLsTokenSpaceGuid.PcdDram1Size|0x0080000000
+ gNxpQoriqLsTokenSpaceGuid.PcdDram2BaseAddr|0x0880000000
+ gNxpQoriqLsTokenSpaceGuid.PcdDram2Size|0x0780000000
+ gNxpQoriqLsTokenSpaceGuid.PcdDram3BaseAddr|0x8800000000
+ gNxpQoriqLsTokenSpaceGuid.PcdDram3Size|0x7800000000
+ gNxpQoriqLsTokenSpaceGuid.PcdScfgBaseAddr|0x1570000
+ gNxpQoriqLsTokenSpaceGuid.PcdGutsBaseAddr|0x01EE0000
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog1BaseAddr|0x02AD0000
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog2BaseAddr|0x02AE0000
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog3BaseAddr|0x02A70000
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog4BaseAddr|0x02A80000
+ gNxpQoriqLsTokenSpaceGuid.PcdWdog5BaseAddr|0x02A90000
+ gNxpQoriqLsTokenSpaceGuid.PcdSdxcBaseAddr|0x01560000
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c0BaseAddr|0x02180000
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c1BaseAddr|0x02190000
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c2BaseAddr|0x021A0000
+ gNxpQoriqLsTokenSpaceGuid.PcdI2c3BaseAddr|0x021B0000
+ gNxpQoriqLsTokenSpaceGuid.PcdNumI2cController|4
+
+##
--
1.9.1
^ permalink raw reply related [flat|nested] 39+ messages in thread
* [PATCH v2 9/9] Build : Add build script and environment script
2017-11-22 15:48 ` [PATCH v2 1/9] Platform/NXP: Add support for Big Endian Mmio APIs Meenakshi Aggarwal
` (6 preceding siblings ...)
2017-11-22 15:48 ` [PATCH v2 8/9] Compilation : Add the fdf, dsc and dec files Meenakshi Aggarwal
@ 2017-11-22 15:49 ` Meenakshi Aggarwal
2017-11-26 15:48 ` [PATCH v2 1/9] Platform/NXP: Add support for Big Endian Mmio APIs Leif Lindholm
8 siblings, 0 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-22 15:49 UTC (permalink / raw)
To: ard.biesheuvel, leif.lindholm, michael.d.kinney, edk2-devel
Build script and Environment setup script.
Readme to explain how to run build script
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
---
Platform/NXP/Env.cshrc | 77 ++++++++++++++++++++++++++++++++++++
Platform/NXP/Readme.md | 15 +++++++
Platform/NXP/build.sh | 103 +++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 195 insertions(+)
create mode 100755 Platform/NXP/Env.cshrc
create mode 100644 Platform/NXP/Readme.md
create mode 100755 Platform/NXP/build.sh
diff --git a/Platform/NXP/Env.cshrc b/Platform/NXP/Env.cshrc
new file mode 100755
index 0000000..31abb04
--- /dev/null
+++ b/Platform/NXP/Env.cshrc
@@ -0,0 +1,77 @@
+# @file.
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials are licensed and made available under
+# the terms and conditions of the BSD License which accompanies this distribution.
+# The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+unset GCC_UTILITY GCC_VERSION MajorVersion MinorVersion
+
+if [ X"$CROSS_COMPILE_64" != X"" ]; then
+ ARM64_PREFIX="$CROSS_COMPILE_64"
+elif [ X"$CROSS_COMPILE" != X"" ]; then
+ ARM64_PREFIX="$CROSS_COMPILE"
+else
+ ARM64_PREFIX="aarch64-linux-gnu-"
+fi
+
+GCC_UTILITY="${ARM64_PREFIX}gcc"
+CheckGcc=`which $GCC_UTILITY >/dev/null 2>&1`
+if [ "$?" -eq 0 ];then
+ GCC_VERSION=`$GCC_UTILITY -v 2>&1 | tail -n 1 | awk '{print $3}'`
+ MajorVersion=`echo $GCC_VERSION | cut -d . -f 1`
+ MinorVersion=`echo $GCC_VERSION | cut -d . -f 2`
+ GCC_ARCH_PREFIX=
+ NOTSUPPORTED=0
+
+ case $MajorVersion in
+ 4)
+ case $MinorVersion in
+ 9)
+ GCC_ARCH_PREFIX="GCC49_AARCH64_PREFIX"
+ ;;
+ *)
+ NOTSUPPORTED=1
+ ;;
+ esac
+ ;;
+ 5)
+ case $MinorVersion in
+ 4)
+ GCC_ARCH_PREFIX="GCC5_AARCH64_PREFIX"
+ ;;
+ *)
+ GCC_ARCH_PREFIX="GCC5_AARCH64_PREFIX"
+ echo "Warning: ${GCC_UTILITY} version ($MajorVersion.$MinorVersion) has not been tested, please use at own risk."
+ ;;
+ esac
+ ;;
+ *)
+ NOTSUPPORTED=1
+ ;;
+ esac
+
+ [ "$NOTSUPPORTED" -eq 1 ] && {
+ echo "Error: ${GCC_UTILITY} version ($MajorVersion.$MinorVersion) not supported ."
+ unset GCC_UTILITY GCC_VERSION MajorVersion MinorVersion
+ }
+
+ [ -n "$GCC_ARCH_PREFIX" ] && {
+ export GCC_ARCH_PREFIX="$GCC_ARCH_PREFIX"
+ export "$GCC_ARCH_PREFIX=$ARM64_PREFIX"
+ }
+
+ unset ARCH
+else
+ echo "Error: ${GCC_UTILITY} not found. Please check PATH variable."
+ unset GCC_UTILITY GCC_VERSION MajorVersion MinorVersion
+fi
+
+export PACKAGES_PATH=$PWD/../../../edk2-platforms
diff --git a/Platform/NXP/Readme.md b/Platform/NXP/Readme.md
new file mode 100644
index 0000000..2c36f43
--- /dev/null
+++ b/Platform/NXP/Readme.md
@@ -0,0 +1,15 @@
+Support for all NXP boards is available in this directory.
+
+# How to build
+
+build script source environment file Env.cshrc
+
+user need to run only build command.
+
+1. Build desired board
+ ./build.sh <board-name> <build-candidate> <clean> (optional)
+
+ board-name : LS1043 / LS1046 / LS2088
+ build-candidate : DEBUG / RELEASE
+
+Currently, support for LS1043 is provided.
diff --git a/Platform/NXP/build.sh b/Platform/NXP/build.sh
new file mode 100755
index 0000000..e465ebf
--- /dev/null
+++ b/Platform/NXP/build.sh
@@ -0,0 +1,103 @@
+#!/bin/bash
+
+# UEFI build script for NXP LS SoCs
+#
+# Copyright 2017 NXP
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+
+# source environment file
+source Env.cshrc
+
+# Global Defaults
+ARCH=AARCH64
+TARGET_TOOLS=`echo $GCC_ARCH_PREFIX | cut -d _ -f 1`
+BASE_DIR=../../..
+
+[ -z "$TARGET_TOOLS" ] && {
+ echo "TARGET_TOOLS not found. Please run \"source Env.cshrc\" ."
+ exit 1
+}
+
+print_usage_banner()
+{
+ echo ""
+ echo "This shell script expects:"
+ echo " Arg 1 (mandatory): Board Type (can be LS1043 / LS1046 / LS2088)."
+ echo " Arg 2 (mandatory): Build candidate (can be RELEASE or DEBUG). By
+ default we build the RELEASE candidate."
+ echo " Arg 3 (optional): clean - To do a 'make clean' operation."
+}
+
+# Check for total num of input arguments
+if [[ "$#" -gt 3 ]]; then
+ echo "Illegal number of parameters"
+ print_usage_banner
+ exit
+fi
+
+# Check for third parameter to be clean only
+if [[ "$3" && $3 != "clean" ]]; then
+ echo "Error ! Either clean or emplty"
+ print_usage_banner
+ exit
+fi
+
+# Check for input arguments
+if [[ $1 == "" || $2 == "" ]]; then
+ echo "Error !"
+ print_usage_banner
+ exit
+fi
+
+# Check for input arguments
+if [[ $1 != "LS1043" && $1 != "LS1046" && $1 != "LS2088" ]]; then
+ echo "Error ! Incorrect Board Type specified."
+ print_usage_banner
+ exit
+fi
+
+# Check for input arguments
+if [[ $2 != "RELEASE" ]]; then
+ if [[ $2 != "DEBUG" ]]; then
+ echo "Error ! Incorrect build target specified."
+ print_usage_banner
+ exit
+ fi
+fi
+
+PKG="aRdbPkg"
+
+echo ".........................................."
+echo "Welcome to $1$PKG UEFI Build environment"
+echo ".........................................."
+
+if [[ $3 == "clean" ]]; then
+ echo "Cleaning up the build directory '$BASE_DIR/Build/$1$PKG/'.."
+ rm -rf $BASE_DIR/Build/$1$PKG/*
+ exit
+fi
+
+# Clean-up
+set -e
+shopt -s nocasematch
+
+#
+# Setup workspace now
+#
+echo Initializing workspace
+cd $BASE_DIR
+
+# Use the BaseTools in edk2
+export EDK_TOOLS_PATH=`pwd`/BaseTools
+source edksetup.sh BaseTools
+
+
+build -p "$WORKSPACE/edk2-platforms/Platform/NXP/$1$PKG/$1$PKG.dsc" -a $ARCH -t $TARGET_TOOLS -b $2
--
1.9.1
^ permalink raw reply related [flat|nested] 39+ messages in thread
* Re: [PATCH v2 1/9] Platform/NXP: Add support for Big Endian Mmio APIs
2017-11-22 15:48 ` [PATCH v2 1/9] Platform/NXP: Add support for Big Endian Mmio APIs Meenakshi Aggarwal
` (7 preceding siblings ...)
2017-11-22 15:49 ` [PATCH v2 9/9] Build : Add build script and environment script Meenakshi Aggarwal
@ 2017-11-26 15:48 ` Leif Lindholm
2017-11-27 5:08 ` Meenakshi Aggarwal
2017-11-27 7:10 ` Udit Kumar
8 siblings, 2 replies; 39+ messages in thread
From: Leif Lindholm @ 2017-11-26 15:48 UTC (permalink / raw)
To: Meenakshi Aggarwal
Cc: ard.biesheuvel, michael.d.kinney, edk2-devel, udit.kumar, v.sethi
Hmm, was there a cover letter for this v2? I can only find the one
from v1 in my inbox? Usually it is helpful to keep the cover letter
and add comments on what has changed since the previous revision.
Also, can you generate the patches with
--subject-prefix="PATCH edk2-platforms"
to ensure a predictable email header for edk2-platforms patches?
Now, for this actual patch...
This looks like a useful thing. It also looks like a very generic
thing. I would think it could live in edk2/MdePkg, but perhaps we can
simply migrate it there if we see additional users outside of the NXM
platforms.
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
On Wed, Nov 22, 2017 at 09:18:52PM +0530, Meenakshi Aggarwal wrote:
> This library add supports for BE read/write and other
> MMIO helper function.
> In this data swapped after reading from MMIO and before
> write using MMIO.
> It can be used by any module with BE address space.
>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> ---
> Platform/NXP/Include/Library/BeIoLib.h | 332 +++++++++++++++++++++++++
> Platform/NXP/Library/BeIoLib/BeIoLib.c | 400 +++++++++++++++++++++++++++++++
> Platform/NXP/Library/BeIoLib/BeIoLib.inf | 31 +++
> 3 files changed, 763 insertions(+)
> create mode 100644 Platform/NXP/Include/Library/BeIoLib.h
> create mode 100644 Platform/NXP/Library/BeIoLib/BeIoLib.c
> create mode 100644 Platform/NXP/Library/BeIoLib/BeIoLib.inf
>
> diff --git a/Platform/NXP/Include/Library/BeIoLib.h b/Platform/NXP/Include/Library/BeIoLib.h
> new file mode 100644
> index 0000000..a58883a
> --- /dev/null
> +++ b/Platform/NXP/Include/Library/BeIoLib.h
> @@ -0,0 +1,332 @@
> +/** BeIoLib.h
> + *
> + * Copyright 2017 NXP
> + *
> + * This program and the accompanying materials
> + * are licensed and made available under the terms and conditions of the BSD License
> + * which accompanies this distribution. The full text of the license may be found at
> + * http://opensource.org/licenses/bsd-license.php
> + *
> + * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> + *
> + **/
> +
> +#ifndef __BE_IOLIB_H__
> +#define __BE_IOLIB_H__
> +
> +#include <Base.h>
> +
> +/**
> + MmioRead8 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioRead8 (
> + IN UINTN Address
> + );
> +
> +/**
> + MmioRead16 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioRead16 (
> + IN UINTN Address
> + );
> +
> +/**
> + MmioRead32 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioRead32 (
> + IN UINTN Address
> + );
> +
> +/**
> + MmioRead64 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioRead64 (
> + IN UINTN Address
> + );
> +
> +/**
> + MmioWrite8 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioWrite8 (
> + IN UINTN Address,
> + IN UINT8 Value
> + );
> +
> +/**
> + MmioWrite16 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioWrite16 (
> + IN UINTN Address,
> + IN UINT16 Value
> + );
> +
> +/**
> + MmioWrite32 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioWrite32 (
> + IN UINTN Address,
> + IN UINT32 Value
> + );
> +
> +/**
> + MmioWrite64 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioWrite64 (
> + IN UINTN Address,
> + IN UINT64 Value
> + );
> +
> +/**
> + MmioAndThenOr8 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> + @param OrData The value to OR with the result of the AND operation.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioAndThenOr8 (
> + IN UINTN Address,
> + IN UINT8 AndData,
> + IN UINT8 OrData
> + );
> +
> +/**
> + MmioAndThenOr16 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> + @param OrData The value to OR with the result of the AND operation.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioAndThenOr16 (
> + IN UINTN Address,
> + IN UINT16 AndData,
> + IN UINT16 OrData
> + );
> +
> +/**
> + MmioAndThenOr32 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> + @param OrData The value to OR with the result of the AND operation.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioAndThenOr32 (
> + IN UINTN Address,
> + IN UINT32 AndData,
> + IN UINT32 OrData
> + );
> +
> +/**
> + MmioAndThenOr64 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> + @param OrData The value to OR with the result of the AND operation.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioAndThenOr64 (
> + IN UINTN Address,
> + IN UINT64 AndData,
> + IN UINT64 OrData
> + );
> +
> +/**
> + MmioOr8 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param OrData The value to OR with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioOr8 (
> + IN UINTN Address,
> + IN UINT8 OrData
> + );
> +
> +/**
> + MmioOr16 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param OrData The value to OR with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioOr16 (
> + IN UINTN Address,
> + IN UINT16 OrData
> + );
> +
> +/**
> + MmioOr32 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param OrData The value to OR with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioOr32 (
> + IN UINTN Address,
> + IN UINT32 OrData
> + );
> +
> +/**
> + MmioOr64 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param OrData The value to OR with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioOr64 (
> + IN UINTN Address,
> + IN UINT64 OrData
> + );
> +
> +/**
> + MmioAnd8 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioAnd8 (
> + IN UINTN Address,
> + IN UINT8 AndData
> + );
> +
> +/**
> + MmioAnd16 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioAnd16 (
> + IN UINTN Address,
> + IN UINT16 AndData
> + );
> +
> +/**
> + MmioAnd32 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioAnd32 (
> + IN UINTN Address,
> + IN UINT32 AndData
> + );
> +
> +/**
> + MmioAnd64 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioAnd64 (
> + IN UINTN Address,
> + IN UINT64 AndData
> + );
> +
> +#endif /* _BE_IOLIB_H */
> diff --git a/Platform/NXP/Library/BeIoLib/BeIoLib.c b/Platform/NXP/Library/BeIoLib/BeIoLib.c
> new file mode 100644
> index 0000000..b4b12ac
> --- /dev/null
> +++ b/Platform/NXP/Library/BeIoLib/BeIoLib.c
> @@ -0,0 +1,400 @@
> +/** BeIoLib.c
> +
> + Provide MMIO APIs for BE modules.
> +
> + Copyright 2017 NXP
> +
> + This program and the accompanying materials
> + are licensed and made available under the terms and conditions of the BSD License
> + which accompanies this distribution. The full text of the license may be found at
> + http://opensource.org/licenses/bsd-license.php
> +
> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#include <Base.h>
> +#include <Library/BaseLib.h>
> +#include <Library/IoLib.h>
> +
> +/**
> + MmioRead8 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioRead8 (
> + IN UINTN Address
> + )
> +{
> + return MmioRead8 (Address);
> +}
> +
> +/**
> + MmioRead16 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioRead16 (
> + IN UINTN Address
> + )
> +{
> + return SwapBytes16 (MmioRead16 (Address));
> +}
> +
> +/**
> + MmioRead32 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioRead32 (
> + IN UINTN Address
> + )
> +{
> + return SwapBytes32 (MmioRead32 (Address));
> +}
> +
> +/**
> + MmioRead64 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioRead64 (
> + IN UINTN Address
> + )
> +{
> + return SwapBytes64 (MmioRead64 (Address));
> +}
> +
> +/**
> + MmioWrite8 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioWrite8 (
> + IN UINTN Address,
> + IN UINT8 Value
> + )
> +{
> + return MmioWrite8 (Address, Value);
> +}
> +
> +/**
> + MmioWrite16 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioWrite16 (
> + IN UINTN Address,
> + IN UINT16 Value
> + )
> +{
> + return MmioWrite16 (Address, SwapBytes16 (Value));
> +}
> +
> +/**
> + MmioWrite32 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioWrite32 (
> + IN UINTN Address,
> + IN UINT32 Value
> + )
> +{
> + return MmioWrite32 (Address, SwapBytes32 (Value));
> +}
> +
> +/**
> + MmioWrite64 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioWrite64 (
> + IN UINTN Address,
> + IN UINT64 Value
> + )
> +{
> + return MmioWrite64 (Address, SwapBytes64 (Value));
> +}
> +
> +/**
> + MmioAndThenOr8 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> + @param OrData The value to OR with the result of the AND operation.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioAndThenOr8 (
> + IN UINTN Address,
> + IN UINT8 AndData,
> + IN UINT8 OrData
> + )
> +{
> + return MmioAndThenOr8 (Address, AndData, OrData);
> +}
> +
> +/**
> + MmioAndThenOr16 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> + @param OrData The value to OR with the result of the AND operation.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioAndThenOr16 (
> + IN UINTN Address,
> + IN UINT16 AndData,
> + IN UINT16 OrData
> + )
> +{
> + AndData = SwapBytes16 (AndData);
> + OrData = SwapBytes16 (OrData);
> +
> + return MmioAndThenOr16 (Address, AndData, OrData);
> +}
> +
> +/**
> + MmioAndThenOr32 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> + @param OrData The value to OR with the result of the AND operation.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioAndThenOr32 (
> + IN UINTN Address,
> + IN UINT32 AndData,
> + IN UINT32 OrData
> + )
> +{
> + AndData = SwapBytes32 (AndData);
> + OrData = SwapBytes32 (OrData);
> +
> + return MmioAndThenOr32 (Address, AndData, OrData);
> +}
> +
> +/**
> + MmioAndThenOr64 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> + @param OrData The value to OR with the result of the AND operation.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioAndThenOr64 (
> + IN UINTN Address,
> + IN UINT64 AndData,
> + IN UINT64 OrData
> + )
> +{
> + AndData = SwapBytes64 (AndData);
> + OrData = SwapBytes64 (OrData);
> +
> + return MmioAndThenOr64 (Address, AndData, OrData);
> +}
> +
> +/**
> + MmioOr8 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param OrData The value to OR with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioOr8 (
> + IN UINTN Address,
> + IN UINT8 OrData
> + )
> +{
> + return MmioOr8 (Address, OrData);
> +}
> +
> +/**
> + MmioOr16 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param OrData The value to OR with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioOr16 (
> + IN UINTN Address,
> + IN UINT16 OrData
> + )
> +{
> + return MmioOr16 (Address, SwapBytes16 (OrData));
> +}
> +
> +/**
> + MmioOr32 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param OrData The value to OR with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioOr32 (
> + IN UINTN Address,
> + IN UINT32 OrData
> + )
> +{
> + return MmioOr32 (Address, SwapBytes32 (OrData));
> +}
> +
> +/**
> + MmioOr64 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param OrData The value to OR with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioOr64 (
> + IN UINTN Address,
> + IN UINT64 OrData
> + )
> +{
> + return MmioOr64 (Address, SwapBytes64 (OrData));
> +}
> +
> +/**
> + MmioAnd8 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioAnd8 (
> + IN UINTN Address,
> + IN UINT8 AndData
> + )
> +{
> + return MmioAnd8 (Address, AndData);
> +}
> +
> +/**
> + MmioAnd16 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioAnd16 (
> + IN UINTN Address,
> + IN UINT16 AndData
> + )
> +{
> + return MmioAnd16 (Address, SwapBytes16 (AndData));
> +}
> +
> +/**
> + MmioAnd32 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioAnd32 (
> + IN UINTN Address,
> + IN UINT32 AndData
> + )
> +{
> + return MmioAnd32 (Address, SwapBytes32 (AndData));
> +}
> +
> +/**
> + MmioAnd64 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param AndData The value to AND with the read value from the MMIO register.
> +
> + @return The value written back to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioAnd64 (
> + IN UINTN Address,
> + IN UINT64 AndData
> + )
> +{
> + return MmioAnd64 (Address, SwapBytes64 (AndData));
> +}
> diff --git a/Platform/NXP/Library/BeIoLib/BeIoLib.inf b/Platform/NXP/Library/BeIoLib/BeIoLib.inf
> new file mode 100644
> index 0000000..8c466e8
> --- /dev/null
> +++ b/Platform/NXP/Library/BeIoLib/BeIoLib.inf
> @@ -0,0 +1,31 @@
> +## @BeIoLib.inf
> +
> +# Copyright 2017 NXP
> +#
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD License
> +# which accompanies this distribution. The full text of the license may be found at
> +# http://opensource.org/licenses/bsd-license.php
> +#
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +#
> +##
> +
> +[Defines]
> + INF_VERSION = 0x0001001A
> + BASE_NAME = BeIoLib
> + FILE_GUID = 28d77333-77eb-4faf-8735-130e5eb3e343
> + MODULE_TYPE = BASE
> + VERSION_STRING = 1.0
> + LIBRARY_CLASS = BeIoLib
> +
> +[Packages]
> + MdeModulePkg/MdeModulePkg.dec
> + MdePkg/MdePkg.dec
> +
> +[LibraryClasses]
> + IoLib
> +
> +[Sources.common]
> + BeIoLib.c
> --
> 1.9.1
>
^ permalink raw reply [flat|nested] 39+ messages in thread
* Re: [PATCH v2 1/9] Platform/NXP: Add support for Big Endian Mmio APIs
2017-11-26 15:48 ` [PATCH v2 1/9] Platform/NXP: Add support for Big Endian Mmio APIs Leif Lindholm
@ 2017-11-27 5:08 ` Meenakshi Aggarwal
2017-11-27 7:10 ` Udit Kumar
1 sibling, 0 replies; 39+ messages in thread
From: Meenakshi Aggarwal @ 2017-11-27 5:08 UTC (permalink / raw)
To: Leif Lindholm
Cc: ard.biesheuvel@linaro.org, michael.d.kinney@intel.com,
edk2-devel@lists.01.org, Udit Kumar, Varun Sethi
Hi Leif,
I forgot to attach a cover letter for v2, sent v3 with cover letter and added --subject-prefix="PATCH edk2-platforms".
Thanks for the review.
Regards,
Meenakshi
> -----Original Message-----
> From: Leif Lindholm [mailto:leif.lindholm@linaro.org]
> Sent: Sunday, November 26, 2017 9:19 PM
> To: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> Cc: ard.biesheuvel@linaro.org; michael.d.kinney@intel.com; edk2-
> devel@lists.01.org; Udit Kumar <udit.kumar@nxp.com>; Varun Sethi
> <V.Sethi@nxp.com>
> Subject: Re: [PATCH v2 1/9] Platform/NXP: Add support for Big Endian Mmio
> APIs
>
> Hmm, was there a cover letter for this v2? I can only find the one from v1 in
> my inbox? Usually it is helpful to keep the cover letter and add comments on
> what has changed since the previous revision.
>
> Also, can you generate the patches with
> --subject-prefix="PATCH edk2-platforms"
> to ensure a predictable email header for edk2-platforms patches?
>
> Now, for this actual patch...
> This looks like a useful thing. It also looks like a very generic thing. I would
> think it could live in edk2/MdePkg, but perhaps we can simply migrate it
> there if we see additional users outside of the NXM platforms.
>
> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
>
> On Wed, Nov 22, 2017 at 09:18:52PM +0530, Meenakshi Aggarwal wrote:
> > This library add supports for BE read/write and other MMIO helper
> > function.
> > In this data swapped after reading from MMIO and before write using
> > MMIO.
> > It can be used by any module with BE address space.
> >
> > Contributed-under: TianoCore Contribution Agreement 1.1
> > Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> > ---
> > Platform/NXP/Include/Library/BeIoLib.h | 332
> +++++++++++++++++++++++++
> > Platform/NXP/Library/BeIoLib/BeIoLib.c | 400
> +++++++++++++++++++++++++++++++
> > Platform/NXP/Library/BeIoLib/BeIoLib.inf | 31 +++
> > 3 files changed, 763 insertions(+)
> > create mode 100644 Platform/NXP/Include/Library/BeIoLib.h
> > create mode 100644 Platform/NXP/Library/BeIoLib/BeIoLib.c
> > create mode 100644 Platform/NXP/Library/BeIoLib/BeIoLib.inf
> >
> > diff --git a/Platform/NXP/Include/Library/BeIoLib.h
> > b/Platform/NXP/Include/Library/BeIoLib.h
> > new file mode 100644
> > index 0000000..a58883a
> > --- /dev/null
> > +++ b/Platform/NXP/Include/Library/BeIoLib.h
> > @@ -0,0 +1,332 @@
> > +/** BeIoLib.h
> > + *
> > + * Copyright 2017 NXP
> > + *
> > + * This program and the accompanying materials
> > + * are licensed and made available under the terms and conditions of
> > +the BSD License
> > + * which accompanies this distribution. The full text of the
> > +license may be found at
> > + *
> >
> +https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> e
> > +nsource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.agg
> >
> +arwal%40nxp.com%7C88e69067b33644a1f74108d534e53282%7C686ea1d3bc
> 2b4c6f
> >
> +a92cd99c5c301635%7C0%7C0%7C636473081368216265&sdata=o8KmMYvlGT
> AzBP0rI
> > +bOQTOAWY3fJEpfkpCwnKHWZ9Y0%3D&reserved=0
> > + *
> > + * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > +BASIS,
> > + * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> > + *
> > + **/
> > +
> > +#ifndef __BE_IOLIB_H__
> > +#define __BE_IOLIB_H__
> > +
> > +#include <Base.h>
> > +
> > +/**
> > + MmioRead8 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to read.
> > +
> > + @return The value read.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +BeMmioRead8 (
> > + IN UINTN Address
> > + );
> > +
> > +/**
> > + MmioRead16 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to read.
> > +
> > + @return The value read.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +BeMmioRead16 (
> > + IN UINTN Address
> > + );
> > +
> > +/**
> > + MmioRead32 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to read.
> > +
> > + @return The value read.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +BeMmioRead32 (
> > + IN UINTN Address
> > + );
> > +
> > +/**
> > + MmioRead64 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to read.
> > +
> > + @return The value read.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +BeMmioRead64 (
> > + IN UINTN Address
> > + );
> > +
> > +/**
> > + MmioWrite8 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param Value The value to write to the MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +BeMmioWrite8 (
> > + IN UINTN Address,
> > + IN UINT8 Value
> > + );
> > +
> > +/**
> > + MmioWrite16 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param Value The value to write to the MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +BeMmioWrite16 (
> > + IN UINTN Address,
> > + IN UINT16 Value
> > + );
> > +
> > +/**
> > + MmioWrite32 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param Value The value to write to the MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +BeMmioWrite32 (
> > + IN UINTN Address,
> > + IN UINT32 Value
> > + );
> > +
> > +/**
> > + MmioWrite64 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param Value The value to write to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +BeMmioWrite64 (
> > + IN UINTN Address,
> > + IN UINT64 Value
> > + );
> > +
> > +/**
> > + MmioAndThenOr8 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > + @param OrData The value to OR with the result of the AND operation.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +BeMmioAndThenOr8 (
> > + IN UINTN Address,
> > + IN UINT8 AndData,
> > + IN UINT8 OrData
> > + );
> > +
> > +/**
> > + MmioAndThenOr16 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > + @param OrData The value to OR with the result of the AND operation.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +BeMmioAndThenOr16 (
> > + IN UINTN Address,
> > + IN UINT16 AndData,
> > + IN UINT16 OrData
> > + );
> > +
> > +/**
> > + MmioAndThenOr32 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > + @param OrData The value to OR with the result of the AND operation.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +BeMmioAndThenOr32 (
> > + IN UINTN Address,
> > + IN UINT32 AndData,
> > + IN UINT32 OrData
> > + );
> > +
> > +/**
> > + MmioAndThenOr64 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > + @param OrData The value to OR with the result of the AND operation.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +BeMmioAndThenOr64 (
> > + IN UINTN Address,
> > + IN UINT64 AndData,
> > + IN UINT64 OrData
> > + );
> > +
> > +/**
> > + MmioOr8 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param OrData The value to OR with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +BeMmioOr8 (
> > + IN UINTN Address,
> > + IN UINT8 OrData
> > + );
> > +
> > +/**
> > + MmioOr16 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param OrData The value to OR with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +BeMmioOr16 (
> > + IN UINTN Address,
> > + IN UINT16 OrData
> > + );
> > +
> > +/**
> > + MmioOr32 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param OrData The value to OR with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +BeMmioOr32 (
> > + IN UINTN Address,
> > + IN UINT32 OrData
> > + );
> > +
> > +/**
> > + MmioOr64 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param OrData The value to OR with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +BeMmioOr64 (
> > + IN UINTN Address,
> > + IN UINT64 OrData
> > + );
> > +
> > +/**
> > + MmioAnd8 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +BeMmioAnd8 (
> > + IN UINTN Address,
> > + IN UINT8 AndData
> > + );
> > +
> > +/**
> > + MmioAnd16 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +BeMmioAnd16 (
> > + IN UINTN Address,
> > + IN UINT16 AndData
> > + );
> > +
> > +/**
> > + MmioAnd32 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +BeMmioAnd32 (
> > + IN UINTN Address,
> > + IN UINT32 AndData
> > + );
> > +
> > +/**
> > + MmioAnd64 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +BeMmioAnd64 (
> > + IN UINTN Address,
> > + IN UINT64 AndData
> > + );
> > +
> > +#endif /* _BE_IOLIB_H */
> > diff --git a/Platform/NXP/Library/BeIoLib/BeIoLib.c
> > b/Platform/NXP/Library/BeIoLib/BeIoLib.c
> > new file mode 100644
> > index 0000000..b4b12ac
> > --- /dev/null
> > +++ b/Platform/NXP/Library/BeIoLib/BeIoLib.c
> > @@ -0,0 +1,400 @@
> > +/** BeIoLib.c
> > +
> > + Provide MMIO APIs for BE modules.
> > +
> > + Copyright 2017 NXP
> > +
> > + This program and the accompanying materials are licensed and made
> > + available under the terms and conditions of the BSD License which
> > + accompanies this distribution. The full text of the license may be
> > + found at
> > +
> > +
> https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> > + ensource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.a
> > +
> ggarwal%40nxp.com%7C88e69067b33644a1f74108d534e53282%7C686ea1d3b
> c2b4
> > +
> c6fa92cd99c5c301635%7C0%7C0%7C636473081368216265&sdata=o8KmMYvl
> GTAzB
> > + P0rIbOQTOAWY3fJEpfkpCwnKHWZ9Y0%3D&reserved=0
> > +
> > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > + BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +
> > +**/
> > +
> > +#include <Base.h>
> > +#include <Library/BaseLib.h>
> > +#include <Library/IoLib.h>
> > +
> > +/**
> > + MmioRead8 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to read.
> > +
> > + @return The value read.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +BeMmioRead8 (
> > + IN UINTN Address
> > + )
> > +{
> > + return MmioRead8 (Address);
> > +}
> > +
> > +/**
> > + MmioRead16 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to read.
> > +
> > + @return The value read.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +BeMmioRead16 (
> > + IN UINTN Address
> > + )
> > +{
> > + return SwapBytes16 (MmioRead16 (Address)); }
> > +
> > +/**
> > + MmioRead32 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to read.
> > +
> > + @return The value read.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +BeMmioRead32 (
> > + IN UINTN Address
> > + )
> > +{
> > + return SwapBytes32 (MmioRead32 (Address)); }
> > +
> > +/**
> > + MmioRead64 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to read.
> > +
> > + @return The value read.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +BeMmioRead64 (
> > + IN UINTN Address
> > + )
> > +{
> > + return SwapBytes64 (MmioRead64 (Address)); }
> > +
> > +/**
> > + MmioWrite8 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param Value The value to write to the MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +BeMmioWrite8 (
> > + IN UINTN Address,
> > + IN UINT8 Value
> > + )
> > +{
> > + return MmioWrite8 (Address, Value); }
> > +
> > +/**
> > + MmioWrite16 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param Value The value to write to the MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +BeMmioWrite16 (
> > + IN UINTN Address,
> > + IN UINT16 Value
> > + )
> > +{
> > + return MmioWrite16 (Address, SwapBytes16 (Value)); }
> > +
> > +/**
> > + MmioWrite32 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param Value The value to write to the MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +BeMmioWrite32 (
> > + IN UINTN Address,
> > + IN UINT32 Value
> > + )
> > +{
> > + return MmioWrite32 (Address, SwapBytes32 (Value)); }
> > +
> > +/**
> > + MmioWrite64 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param Value The value to write to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +BeMmioWrite64 (
> > + IN UINTN Address,
> > + IN UINT64 Value
> > + )
> > +{
> > + return MmioWrite64 (Address, SwapBytes64 (Value)); }
> > +
> > +/**
> > + MmioAndThenOr8 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > + @param OrData The value to OR with the result of the AND operation.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +BeMmioAndThenOr8 (
> > + IN UINTN Address,
> > + IN UINT8 AndData,
> > + IN UINT8 OrData
> > + )
> > +{
> > + return MmioAndThenOr8 (Address, AndData, OrData); }
> > +
> > +/**
> > + MmioAndThenOr16 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > + @param OrData The value to OR with the result of the AND operation.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +BeMmioAndThenOr16 (
> > + IN UINTN Address,
> > + IN UINT16 AndData,
> > + IN UINT16 OrData
> > + )
> > +{
> > + AndData = SwapBytes16 (AndData);
> > + OrData = SwapBytes16 (OrData);
> > +
> > + return MmioAndThenOr16 (Address, AndData, OrData); }
> > +
> > +/**
> > + MmioAndThenOr32 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > + @param OrData The value to OR with the result of the AND operation.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +BeMmioAndThenOr32 (
> > + IN UINTN Address,
> > + IN UINT32 AndData,
> > + IN UINT32 OrData
> > + )
> > +{
> > + AndData = SwapBytes32 (AndData);
> > + OrData = SwapBytes32 (OrData);
> > +
> > + return MmioAndThenOr32 (Address, AndData, OrData); }
> > +
> > +/**
> > + MmioAndThenOr64 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > + @param OrData The value to OR with the result of the AND operation.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +BeMmioAndThenOr64 (
> > + IN UINTN Address,
> > + IN UINT64 AndData,
> > + IN UINT64 OrData
> > + )
> > +{
> > + AndData = SwapBytes64 (AndData);
> > + OrData = SwapBytes64 (OrData);
> > +
> > + return MmioAndThenOr64 (Address, AndData, OrData); }
> > +
> > +/**
> > + MmioOr8 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param OrData The value to OR with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +BeMmioOr8 (
> > + IN UINTN Address,
> > + IN UINT8 OrData
> > + )
> > +{
> > + return MmioOr8 (Address, OrData);
> > +}
> > +
> > +/**
> > + MmioOr16 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param OrData The value to OR with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +BeMmioOr16 (
> > + IN UINTN Address,
> > + IN UINT16 OrData
> > + )
> > +{
> > + return MmioOr16 (Address, SwapBytes16 (OrData)); }
> > +
> > +/**
> > + MmioOr32 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param OrData The value to OR with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +BeMmioOr32 (
> > + IN UINTN Address,
> > + IN UINT32 OrData
> > + )
> > +{
> > + return MmioOr32 (Address, SwapBytes32 (OrData)); }
> > +
> > +/**
> > + MmioOr64 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param OrData The value to OR with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +BeMmioOr64 (
> > + IN UINTN Address,
> > + IN UINT64 OrData
> > + )
> > +{
> > + return MmioOr64 (Address, SwapBytes64 (OrData)); }
> > +
> > +/**
> > + MmioAnd8 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +BeMmioAnd8 (
> > + IN UINTN Address,
> > + IN UINT8 AndData
> > + )
> > +{
> > + return MmioAnd8 (Address, AndData); }
> > +
> > +/**
> > + MmioAnd16 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +BeMmioAnd16 (
> > + IN UINTN Address,
> > + IN UINT16 AndData
> > + )
> > +{
> > + return MmioAnd16 (Address, SwapBytes16 (AndData)); }
> > +
> > +/**
> > + MmioAnd32 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +BeMmioAnd32 (
> > + IN UINTN Address,
> > + IN UINT32 AndData
> > + )
> > +{
> > + return MmioAnd32 (Address, SwapBytes32 (AndData)); }
> > +
> > +/**
> > + MmioAnd64 for Big-Endian modules.
> > +
> > + @param Address The MMIO register to write.
> > + @param AndData The value to AND with the read value from the MMIO
> register.
> > +
> > + @return The value written back to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +BeMmioAnd64 (
> > + IN UINTN Address,
> > + IN UINT64 AndData
> > + )
> > +{
> > + return MmioAnd64 (Address, SwapBytes64 (AndData)); }
> > diff --git a/Platform/NXP/Library/BeIoLib/BeIoLib.inf
> > b/Platform/NXP/Library/BeIoLib/BeIoLib.inf
> > new file mode 100644
> > index 0000000..8c466e8
> > --- /dev/null
> > +++ b/Platform/NXP/Library/BeIoLib/BeIoLib.inf
> > @@ -0,0 +1,31 @@
> > +## @BeIoLib.inf
> > +
> > +# Copyright 2017 NXP
> > +#
> > +# This program and the accompanying materials # are licensed and
> > +made available under the terms and conditions of the BSD License #
> > +which accompanies this distribution. The full text of the license
> > +may be found at #
> >
> +https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fop
> e
> > +nsource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi.agg
> >
> +arwal%40nxp.com%7C88e69067b33644a1f74108d534e53282%7C686ea1d3bc
> 2b4c6f
> >
> +a92cd99c5c301635%7C0%7C0%7C636473081368216265&sdata=o8KmMYvlGT
> AzBP0rI
> > +bOQTOAWY3fJEpfkpCwnKHWZ9Y0%3D&reserved=0
> > +#
> > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > +BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +#
> > +##
> > +
> > +[Defines]
> > + INF_VERSION = 0x0001001A
> > + BASE_NAME = BeIoLib
> > + FILE_GUID = 28d77333-77eb-4faf-8735-130e5eb3e343
> > + MODULE_TYPE = BASE
> > + VERSION_STRING = 1.0
> > + LIBRARY_CLASS = BeIoLib
> > +
> > +[Packages]
> > + MdeModulePkg/MdeModulePkg.dec
> > + MdePkg/MdePkg.dec
> > +
> > +[LibraryClasses]
> > + IoLib
> > +
> > +[Sources.common]
> > + BeIoLib.c
> > --
> > 1.9.1
> >
^ permalink raw reply [flat|nested] 39+ messages in thread
* Re: [PATCH v2 1/9] Platform/NXP: Add support for Big Endian Mmio APIs
2017-11-26 15:48 ` [PATCH v2 1/9] Platform/NXP: Add support for Big Endian Mmio APIs Leif Lindholm
2017-11-27 5:08 ` Meenakshi Aggarwal
@ 2017-11-27 7:10 ` Udit Kumar
1 sibling, 0 replies; 39+ messages in thread
From: Udit Kumar @ 2017-11-27 7:10 UTC (permalink / raw)
To: Leif Lindholm, Meenakshi Aggarwal, Gao, Liming
Cc: ard.biesheuvel@linaro.org, michael.d.kinney@intel.com,
edk2-devel@lists.01.org, Varun Sethi
Hi Leif,
> Hmm, was there a cover letter for this v2? I can only find the one from v1 in my
> inbox? Usually it is helpful to keep the cover letter and add comments on what
> has changed since the previous revision.
>
> Also, can you generate the patches with
> --subject-prefix="PATCH edk2-platforms"
> to ensure a predictable email header for edk2-platforms patches?
>
> Now, for this actual patch...
> This looks like a useful thing. It also looks like a very generic thing. I would think
> it could live in edk2/MdePkg, but perhaps we can simply migrate it there if we
> see additional users outside of the NXM platforms.
This is our preferred way, if this can be pushed to edk2/MdePkg but
in another discussion , Liming suggested to keep as local lib.
regards
Udit
^ permalink raw reply [flat|nested] 39+ messages in thread