diff mbox series

[U-Boot,V3,15/27] imx8m: Fix MMU table issue for OPTEE memory

Message ID 20190827064033.28973-16-peng.fan@nxp.com
State Accepted
Commit 59efa6b52bb25f66bb0b0f6f633e6c403a37be3d
Delegated to: Stefano Babic
Headers show
Series i.MX8MM support | expand

Commit Message

Peng Fan Aug. 27, 2019, 6:25 a.m. UTC
When running with OPTEE, the MMU table in u-boot does not remove the OPTEE
memory from its settings. So ARM speculative prefetch in u-boot may access
that OPTEE memory. Due to trust zone is enabled by OPTEE and that memory
is set to secure access, then the speculative prefetch will fail and cause
various memory issue in u-boot.
The fail address register and int_status register in trustzone has logged
that speculative access from u-boot.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
 arch/arm/mach-imx/imx8m/soc.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

Comments

Igor Opaniuk March 4, 2020, 2:34 p.m. UTC | #1
Hi Peng,

On Tue, Aug 27, 2019 at 9:38 AM Peng Fan <peng.fan@nxp.com> wrote:
>
> When running with OPTEE, the MMU table in u-boot does not remove the OPTEE
> memory from its settings. So ARM speculative prefetch in u-boot may access
> that OPTEE memory. Due to trust zone is enabled by OPTEE and that memory
> is set to secure access, then the speculative prefetch will fail and cause
> various memory issue in u-boot.
> The fail address register and int_status register in trustzone has logged
> that speculative access from u-boot.
>
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> ---
>  arch/arm/mach-imx/imx8m/soc.c | 20 ++++++++++++++++++--
>  1 file changed, 18 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/mach-imx/imx8m/soc.c b/arch/arm/mach-imx/imx8m/soc.c
> index 5115471eff..dd393b581b 100644
> --- a/arch/arm/mach-imx/imx8m/soc.c
> +++ b/arch/arm/mach-imx/imx8m/soc.c
> @@ -112,16 +112,18 @@ static struct mm_region imx8m_mem_map[] = {
>                 /* DRAM1 */
>                 .virt = 0x40000000UL,
>                 .phys = 0x40000000UL,
> -               .size = 0xC0000000UL,
> +               .size = PHYS_SDRAM_SIZE,
>                 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
>                          PTE_BLOCK_OUTER_SHARE
> +#ifdef PHYS_SDRAM_2_SIZE
>         }, {
>                 /* DRAM2 */
>                 .virt = 0x100000000UL,
>                 .phys = 0x100000000UL,
> -               .size = 0x040000000UL,
> +               .size = PHYS_SDRAM_2_SIZE,
>                 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
>                          PTE_BLOCK_OUTER_SHARE
> +#endif
>         }, {
>                 /* List terminator */
>                 0,
> @@ -130,6 +132,20 @@ static struct mm_region imx8m_mem_map[] = {
>
>  struct mm_region *mem_map = imx8m_mem_map;
>
> +void enable_caches(void)
> +{
> +       /*
> +        * If OPTEE runs, remove OPTEE memory from MMU table to
> +        * avoid speculative prefetch. OPTEE runs at the top of
> +        * the first memory bank
> +        */
> +       if (rom_pointer[1])
> +               imx8m_mem_map[5].size -= rom_pointer[1];
> +
> +       icache_enable();
> +       dcache_enable();
> +}
> +
>  static u32 get_cpu_variant_type(u32 type)
>  {
>         struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
> --
> 2.16.4
>
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> https://lists.denx.de/listinfo/u-boot

Unfortunately, I'm still facing a similar issue when OP-TEE is loaded on
iMX8MM-based module, despite BL32_BASE(0xbe000000) +
BL32_SIZE(0x2000000) region is excluded.
Based on debug ouput the latest one is:
....
idx=2 PTE 00000000bfff7010 at level 1: bfffd003
Checking if pte fits for virt=bde00000 size=200000 blocksize=40000000
addr=bde00000 level=2
idx=2 PTE 00000000bfff7010 at level 1: bfffd003
idx=1ef PTE 00000000bfffdf78 at level 2: 0
Checking if pte fits for virt=bde00000 size=200000 blocksize=200000
Setting PTE 00000000bfffdf78 to block virt=bde00000


U-Boot hangs just after writing to System Control Register in
arch/arm/cpu/armv8/cache_v8.c:419:

/* enable the mmu */
set_sctlr(get_sctlr() | CR_M);

In my setup mainline U-Boot/TF-A/OP-TEE are used:
u-boot: 133276f14a ("Merge branch '2020-02-25-master-imports'")
tf-a: 6e46981f84 ("Merge "Update pathnames in maintainers.rst file"
into integration")
op-tee: a67dc424ff ("ta: pkcs11: API for slot/token information")

OP-TEE is compiled with these flags:
   CFG_ARM64_core=y
   CFG_NXP_CAAM=n
   CFG_NXPCRYPT=n
   PLATFORM=imx-mx8mmevk
   CFG_TEE_CORE_LOG_LEVEL=4
   DEBUG=y
   CFG_TEE_CORE_DEBUG=y

With DCACHE disabled obviously everything works. Also I don't face any issues
if TF-A is compiled without SPD=opteed.

Maybe it rings the bell and you already saw similar issues before?

Thanks
Igor Opaniuk March 4, 2020, 4:42 p.m. UTC | #2
Added Clement Faure to the discussion

On Wed, Mar 4, 2020 at 4:34 PM Igor Opaniuk <igor.opaniuk@gmail.com> wrote:
>
> Hi Peng,
>
> On Tue, Aug 27, 2019 at 9:38 AM Peng Fan <peng.fan@nxp.com> wrote:
> >
> > When running with OPTEE, the MMU table in u-boot does not remove the OPTEE
> > memory from its settings. So ARM speculative prefetch in u-boot may access
> > that OPTEE memory. Due to trust zone is enabled by OPTEE and that memory
> > is set to secure access, then the speculative prefetch will fail and cause
> > various memory issue in u-boot.
> > The fail address register and int_status register in trustzone has logged
> > that speculative access from u-boot.
> >
> > Signed-off-by: Peng Fan <peng.fan@nxp.com>
> > ---
> >  arch/arm/mach-imx/imx8m/soc.c | 20 ++++++++++++++++++--
> >  1 file changed, 18 insertions(+), 2 deletions(-)
> >
> > diff --git a/arch/arm/mach-imx/imx8m/soc.c b/arch/arm/mach-imx/imx8m/soc.c
> > index 5115471eff..dd393b581b 100644
> > --- a/arch/arm/mach-imx/imx8m/soc.c
> > +++ b/arch/arm/mach-imx/imx8m/soc.c
> > @@ -112,16 +112,18 @@ static struct mm_region imx8m_mem_map[] = {
> >                 /* DRAM1 */
> >                 .virt = 0x40000000UL,
> >                 .phys = 0x40000000UL,
> > -               .size = 0xC0000000UL,
> > +               .size = PHYS_SDRAM_SIZE,
> >                 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
> >                          PTE_BLOCK_OUTER_SHARE
> > +#ifdef PHYS_SDRAM_2_SIZE
> >         }, {
> >                 /* DRAM2 */
> >                 .virt = 0x100000000UL,
> >                 .phys = 0x100000000UL,
> > -               .size = 0x040000000UL,
> > +               .size = PHYS_SDRAM_2_SIZE,
> >                 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
> >                          PTE_BLOCK_OUTER_SHARE
> > +#endif
> >         }, {
> >                 /* List terminator */
> >                 0,
> > @@ -130,6 +132,20 @@ static struct mm_region imx8m_mem_map[] = {
> >
> >  struct mm_region *mem_map = imx8m_mem_map;
> >
> > +void enable_caches(void)
> > +{
> > +       /*
> > +        * If OPTEE runs, remove OPTEE memory from MMU table to
> > +        * avoid speculative prefetch. OPTEE runs at the top of
> > +        * the first memory bank
> > +        */
> > +       if (rom_pointer[1])
> > +               imx8m_mem_map[5].size -= rom_pointer[1];
> > +
> > +       icache_enable();
> > +       dcache_enable();
> > +}
> > +
> >  static u32 get_cpu_variant_type(u32 type)
> >  {
> >         struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
> > --
> > 2.16.4
> >
> > _______________________________________________
> > U-Boot mailing list
> > U-Boot@lists.denx.de
> > https://lists.denx.de/listinfo/u-boot
>
> Unfortunately, I'm still facing a similar issue when OP-TEE is loaded on
> iMX8MM-based module, despite BL32_BASE(0xbe000000) +
> BL32_SIZE(0x2000000) region is excluded.
> Based on debug ouput the latest one is:
> ....
> idx=2 PTE 00000000bfff7010 at level 1: bfffd003
> Checking if pte fits for virt=bde00000 size=200000 blocksize=40000000
> addr=bde00000 level=2
> idx=2 PTE 00000000bfff7010 at level 1: bfffd003
> idx=1ef PTE 00000000bfffdf78 at level 2: 0
> Checking if pte fits for virt=bde00000 size=200000 blocksize=200000
> Setting PTE 00000000bfffdf78 to block virt=bde00000
>
>
> U-Boot hangs just after writing to System Control Register in
> arch/arm/cpu/armv8/cache_v8.c:419:
>
> /* enable the mmu */
> set_sctlr(get_sctlr() | CR_M);
>
> In my setup mainline U-Boot/TF-A/OP-TEE are used:
> u-boot: 133276f14a ("Merge branch '2020-02-25-master-imports'")
> tf-a: 6e46981f84 ("Merge "Update pathnames in maintainers.rst file"
> into integration")
> op-tee: a67dc424ff ("ta: pkcs11: API for slot/token information")
>
> OP-TEE is compiled with these flags:
>    CFG_ARM64_core=y
>    CFG_NXP_CAAM=n
>    CFG_NXPCRYPT=n
>    PLATFORM=imx-mx8mmevk
>    CFG_TEE_CORE_LOG_LEVEL=4
>    DEBUG=y
>    CFG_TEE_CORE_DEBUG=y
>
> With DCACHE disabled obviously everything works. Also I don't face any issues
> if TF-A is compiled without SPD=opteed.
>
> Maybe it rings the bell and you already saw similar issues before?
>
> Thanks
>
> --
> Best regards - Freundliche Grüsse - Meilleures salutations
>
> Igor Opaniuk
>
> mailto: igor.opaniuk@gmail.com
> skype: igor.opanyuk
> +380 (93) 836 40 67
> http://ua.linkedin.com/in/iopaniuk
Peng Fan March 5, 2020, 12:50 a.m. UTC | #3
> Subject: Re: [U-Boot] [PATCH V3 15/27] imx8m: Fix MMU table issue for
> OPTEE memory
> 
> Hi Peng,
> 
> On Tue, Aug 27, 2019 at 9:38 AM Peng Fan <peng.fan@nxp.com> wrote:
> >
> > When running with OPTEE, the MMU table in u-boot does not remove the
> > OPTEE memory from its settings. So ARM speculative prefetch in u-boot
> > may access that OPTEE memory. Due to trust zone is enabled by OPTEE
> > and that memory is set to secure access, then the speculative prefetch
> > will fail and cause various memory issue in u-boot.
> > The fail address register and int_status register in trustzone has
> > logged that speculative access from u-boot.
> >
> > Signed-off-by: Peng Fan <peng.fan@nxp.com>
> > ---
> >  arch/arm/mach-imx/imx8m/soc.c | 20 ++++++++++++++++++--
> >  1 file changed, 18 insertions(+), 2 deletions(-)
> >
> > diff --git a/arch/arm/mach-imx/imx8m/soc.c
> > b/arch/arm/mach-imx/imx8m/soc.c index 5115471eff..dd393b581b
> 100644
> > --- a/arch/arm/mach-imx/imx8m/soc.c
> > +++ b/arch/arm/mach-imx/imx8m/soc.c
> > @@ -112,16 +112,18 @@ static struct mm_region imx8m_mem_map[] = {
> >                 /* DRAM1 */
> >                 .virt = 0x40000000UL,
> >                 .phys = 0x40000000UL,
> > -               .size = 0xC0000000UL,
> > +               .size = PHYS_SDRAM_SIZE,
> >                 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
> >                          PTE_BLOCK_OUTER_SHARE
> > +#ifdef PHYS_SDRAM_2_SIZE
> >         }, {
> >                 /* DRAM2 */
> >                 .virt = 0x100000000UL,
> >                 .phys = 0x100000000UL,
> > -               .size = 0x040000000UL,
> > +               .size = PHYS_SDRAM_2_SIZE,
> >                 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
> >                          PTE_BLOCK_OUTER_SHARE
> > +#endif
> >         }, {
> >                 /* List terminator */
> >                 0,
> > @@ -130,6 +132,20 @@ static struct mm_region imx8m_mem_map[] = {
> >
> >  struct mm_region *mem_map = imx8m_mem_map;
> >
> > +void enable_caches(void)
> > +{
> > +       /*
> > +        * If OPTEE runs, remove OPTEE memory from MMU table to
> > +        * avoid speculative prefetch. OPTEE runs at the top of
> > +        * the first memory bank
> > +        */
> > +       if (rom_pointer[1])
> > +               imx8m_mem_map[5].size -= rom_pointer[1];
> > +
> > +       icache_enable();
> > +       dcache_enable();
> > +}
> > +
> >  static u32 get_cpu_variant_type(u32 type)  {
> >         struct ocotp_regs *ocotp = (struct ocotp_regs
> > *)OCOTP_BASE_ADDR;
> > --
> > 2.16.4
> >
> > _______________________________________________
> > U-Boot mailing list
> > U-Boot@lists.denx.de
> > https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flist
> >
> s.denx.de%2Flistinfo%2Fu-boot&amp;data=02%7C01%7Cpeng.fan%40nxp.co
> m%7C
> >
> abfc9387a622474e599508d7c049395c%7C686ea1d3bc2b4c6fa92cd99c5c30
> 1635%7C
> >
> 0%7C0%7C637189293044493841&amp;sdata=fMrSP%2BMAzI20VMGhXm0U
> 6kejjaClNOo
> > bFjB4HVkTt%2Fs%3D&amp;reserved=0
> 
> Unfortunately, I'm still facing a similar issue when OP-TEE is loaded on
> iMX8MM-based module, despite BL32_BASE(0xbe000000) +
> BL32_SIZE(0x2000000) region is excluded.
> Based on debug ouput the latest one is:
> ....
> idx=2 PTE 00000000bfff7010 at level 1: bfffd003 Checking if pte fits for
> virt=bde00000 size=200000 blocksize=40000000
> addr=bde00000 level=2
> idx=2 PTE 00000000bfff7010 at level 1: bfffd003 idx=1ef PTE
> 00000000bfffdf78 at level 2: 0 Checking if pte fits for virt=bde00000
> size=200000 blocksize=200000 Setting PTE 00000000bfffdf78 to block
> virt=bde00000

Wired. If this is true, this is bug in u-boot MMU part.

Regards,
Peng.

> 
> 
> U-Boot hangs just after writing to System Control Register in
> arch/arm/cpu/armv8/cache_v8.c:419:
> 
> /* enable the mmu */
> set_sctlr(get_sctlr() | CR_M);
> 
> In my setup mainline U-Boot/TF-A/OP-TEE are used:
> u-boot: 133276f14a ("Merge branch '2020-02-25-master-imports'")
> tf-a: 6e46981f84 ("Merge "Update pathnames in maintainers.rst file"
> into integration")
> op-tee: a67dc424ff ("ta: pkcs11: API for slot/token information")
> 
> OP-TEE is compiled with these flags:
>    CFG_ARM64_core=y
>    CFG_NXP_CAAM=n
>    CFG_NXPCRYPT=n
>    PLATFORM=imx-mx8mmevk
>    CFG_TEE_CORE_LOG_LEVEL=4
>    DEBUG=y
>    CFG_TEE_CORE_DEBUG=y
> 
> With DCACHE disabled obviously everything works. Also I don't face any
> issues if TF-A is compiled without SPD=opteed.
> 
> Maybe it rings the bell and you already saw similar issues before?
> 
> Thanks
> 
> --
> Best regards - Freundliche Grüsse - Meilleures salutations
> 
> Igor Opaniuk
> 
> mailto: igor.opaniuk@gmail.com
> skype: igor.opanyuk
> +380 (93) 836 40 67
> https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fua.linke
> din.com%2Fin%2Fiopaniuk&amp;data=02%7C01%7Cpeng.fan%40nxp.com%7
> Cabfc9387a622474e599508d7c049395c%7C686ea1d3bc2b4c6fa92cd99c5c3
> 01635%7C0%7C0%7C637189293044493841&amp;sdata=CBnHEQfZu%2FtQv
> fbL%2FGn2H%2FBilRgKeQe5CHaUt0BjKP4%3D&amp;reserved=0
Igor Opaniuk March 5, 2020, 10:36 a.m. UTC | #4
Hi Peng,

On Thu, Mar 5, 2020 at 2:50 AM Peng Fan <peng.fan@nxp.com> wrote:
>
> > Subject: Re: [U-Boot] [PATCH V3 15/27] imx8m: Fix MMU table issue for
> > OPTEE memory
> >
> > Hi Peng,
> >
> > On Tue, Aug 27, 2019 at 9:38 AM Peng Fan <peng.fan@nxp.com> wrote:
> > >
> > > When running with OPTEE, the MMU table in u-boot does not remove the
> > > OPTEE memory from its settings. So ARM speculative prefetch in u-boot
> > > may access that OPTEE memory. Due to trust zone is enabled by OPTEE
> > > and that memory is set to secure access, then the speculative prefetch
> > > will fail and cause various memory issue in u-boot.
> > > The fail address register and int_status register in trustzone has
> > > logged that speculative access from u-boot.
> > >
> > > Signed-off-by: Peng Fan <peng.fan@nxp.com>
> > > ---
> > >  arch/arm/mach-imx/imx8m/soc.c | 20 ++++++++++++++++++--
> > >  1 file changed, 18 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/arch/arm/mach-imx/imx8m/soc.c
> > > b/arch/arm/mach-imx/imx8m/soc.c index 5115471eff..dd393b581b
> > 100644
> > > --- a/arch/arm/mach-imx/imx8m/soc.c
> > > +++ b/arch/arm/mach-imx/imx8m/soc.c
> > > @@ -112,16 +112,18 @@ static struct mm_region imx8m_mem_map[] = {
> > >                 /* DRAM1 */
> > >                 .virt = 0x40000000UL,
> > >                 .phys = 0x40000000UL,
> > > -               .size = 0xC0000000UL,
> > > +               .size = PHYS_SDRAM_SIZE,
> > >                 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
> > >                          PTE_BLOCK_OUTER_SHARE
> > > +#ifdef PHYS_SDRAM_2_SIZE
> > >         }, {
> > >                 /* DRAM2 */
> > >                 .virt = 0x100000000UL,
> > >                 .phys = 0x100000000UL,
> > > -               .size = 0x040000000UL,
> > > +               .size = PHYS_SDRAM_2_SIZE,
> > >                 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
> > >                          PTE_BLOCK_OUTER_SHARE
> > > +#endif
> > >         }, {
> > >                 /* List terminator */
> > >                 0,
> > > @@ -130,6 +132,20 @@ static struct mm_region imx8m_mem_map[] = {
> > >
> > >  struct mm_region *mem_map = imx8m_mem_map;
> > >
> > > +void enable_caches(void)
> > > +{
> > > +       /*
> > > +        * If OPTEE runs, remove OPTEE memory from MMU table to
> > > +        * avoid speculative prefetch. OPTEE runs at the top of
> > > +        * the first memory bank
> > > +        */
> > > +       if (rom_pointer[1])
> > > +               imx8m_mem_map[5].size -= rom_pointer[1];
> > > +
> > > +       icache_enable();
> > > +       dcache_enable();
> > > +}
> > > +
> > >  static u32 get_cpu_variant_type(u32 type)  {
> > >         struct ocotp_regs *ocotp = (struct ocotp_regs
> > > *)OCOTP_BASE_ADDR;
> > > --
> > > 2.16.4
> > >
> > > _______________________________________________
> > > U-Boot mailing list
> > > U-Boot@lists.denx.de
> > > https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flist
> > >
> > s.denx.de%2Flistinfo%2Fu-boot&amp;data=02%7C01%7Cpeng.fan%40nxp.co
> > m%7C
> > >
> > abfc9387a622474e599508d7c049395c%7C686ea1d3bc2b4c6fa92cd99c5c30
> > 1635%7C
> > >
> > 0%7C0%7C637189293044493841&amp;sdata=fMrSP%2BMAzI20VMGhXm0U
> > 6kejjaClNOo
> > > bFjB4HVkTt%2Fs%3D&amp;reserved=0
> >
> > Unfortunately, I'm still facing a similar issue when OP-TEE is loaded on
> > iMX8MM-based module, despite BL32_BASE(0xbe000000) +
> > BL32_SIZE(0x2000000) region is excluded.
> > Based on debug ouput the latest one is:
> > ....
> > idx=2 PTE 00000000bfff7010 at level 1: bfffd003 Checking if pte fits for
> > virt=bde00000 size=200000 blocksize=40000000
> > addr=bde00000 level=2
> > idx=2 PTE 00000000bfff7010 at level 1: bfffd003 idx=1ef PTE
> > 00000000bfffdf78 at level 2: 0 Checking if pte fits for virt=bde00000
> > size=200000 blocksize=200000 Setting PTE 00000000bfffdf78 to block
> > virt=bde00000
>
> Wired. If this is true, this is bug in u-boot MMU part.

Sorry fot the noise, that was wrong dram initiailization (I've forgot
to take into account rom_pointer[1] value)
The fix for my board is:

diff --git a/board/toradex/verdin-imx8mm/verdin-imx8mm.c
b/board/toradex/verdin-imx8mm/verdin-imx8mm.c
index 16b9fa1ec1..024c0bd183 100644
--- a/board/toradex/verdin-imx8mm/verdin-imx8mm.c
+++ b/board/toradex/verdin-imx8mm/verdin-imx8mm.c
@@ -5,6 +5,7 @@

 #include <common.h>
 #include <asm/arch/clock.h>
+#include <asm/arch/sys_proto.h>
 #include <asm/io.h>
 #include <miiphy.h>
 #include <netdev.h>
@@ -13,7 +14,12 @@ DECLARE_GLOBAL_DATA_PTR;

 int dram_init(void)
 {
-       gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
+       /* rom_pointer[1] contains the size of TEE occupies */
+       if (rom_pointer[1])
+               gd->ram_size = PHYS_SDRAM_SIZE - rom_pointer[1];
+       else
+               gd->ram_size = PHYS_SDRAM_SIZE;
+

        return 0;
 }


This bug is actual for imx8mm_evk also.
>
> Regards,
> Peng.
>
> >
> >
> > U-Boot hangs just after writing to System Control Register in
> > arch/arm/cpu/armv8/cache_v8.c:419:
> >
> > /* enable the mmu */
> > set_sctlr(get_sctlr() | CR_M);
> >
> > In my setup mainline U-Boot/TF-A/OP-TEE are used:
> > u-boot: 133276f14a ("Merge branch '2020-02-25-master-imports'")
> > tf-a: 6e46981f84 ("Merge "Update pathnames in maintainers.rst file"
> > into integration")
> > op-tee: a67dc424ff ("ta: pkcs11: API for slot/token information")
> >
> > OP-TEE is compiled with these flags:
> >    CFG_ARM64_core=y
> >    CFG_NXP_CAAM=n
> >    CFG_NXPCRYPT=n
> >    PLATFORM=imx-mx8mmevk
> >    CFG_TEE_CORE_LOG_LEVEL=4
> >    DEBUG=y
> >    CFG_TEE_CORE_DEBUG=y
> >
> > With DCACHE disabled obviously everything works. Also I don't face any
> > issues if TF-A is compiled without SPD=opteed.
> >
> > Maybe it rings the bell and you already saw similar issues before?
> >
> > Thanks
> >
> > --
> > Best regards - Freundliche Grüsse - Meilleures salutations
> >
> > Igor Opaniuk
> >
> > mailto: igor.opaniuk@gmail.com
> > skype: igor.opanyuk
> > +380 (93) 836 40 67
> > https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fua.linke
> > din.com%2Fin%2Fiopaniuk&amp;data=02%7C01%7Cpeng.fan%40nxp.com%7
> > Cabfc9387a622474e599508d7c049395c%7C686ea1d3bc2b4c6fa92cd99c5c3
> > 01635%7C0%7C0%7C637189293044493841&amp;sdata=CBnHEQfZu%2FtQv
> > fbL%2FGn2H%2FBilRgKeQe5CHaUt0BjKP4%3D&amp;reserved=0
Peng Fan March 5, 2020, 10:46 a.m. UTC | #5
> Subject: Re: [U-Boot] [PATCH V3 15/27] imx8m: Fix MMU table issue for
> OPTEE memory
> 
> Hi Peng,
> 
> On Thu, Mar 5, 2020 at 2:50 AM Peng Fan <peng.fan@nxp.com> wrote:
> >
> > > Subject: Re: [U-Boot] [PATCH V3 15/27] imx8m: Fix MMU table issue
> > > for OPTEE memory
> > >
> > > Hi Peng,
> > >
> > > On Tue, Aug 27, 2019 at 9:38 AM Peng Fan <peng.fan@nxp.com> wrote:
> > > >
> > > > When running with OPTEE, the MMU table in u-boot does not remove
> > > > the OPTEE memory from its settings. So ARM speculative prefetch in
> > > > u-boot may access that OPTEE memory. Due to trust zone is enabled
> > > > by OPTEE and that memory is set to secure access, then the
> > > > speculative prefetch will fail and cause various memory issue in u-boot.
> > > > The fail address register and int_status register in trustzone has
> > > > logged that speculative access from u-boot.
> > > >
> > > > Signed-off-by: Peng Fan <peng.fan@nxp.com>
> > > > ---
> > > >  arch/arm/mach-imx/imx8m/soc.c | 20 ++++++++++++++++++--
> > > >  1 file changed, 18 insertions(+), 2 deletions(-)
> > > >
> > > > diff --git a/arch/arm/mach-imx/imx8m/soc.c
> > > > b/arch/arm/mach-imx/imx8m/soc.c index 5115471eff..dd393b581b
> > > 100644
> > > > --- a/arch/arm/mach-imx/imx8m/soc.c
> > > > +++ b/arch/arm/mach-imx/imx8m/soc.c
> > > > @@ -112,16 +112,18 @@ static struct mm_region imx8m_mem_map[]
> = {
> > > >                 /* DRAM1 */
> > > >                 .virt = 0x40000000UL,
> > > >                 .phys = 0x40000000UL,
> > > > -               .size = 0xC0000000UL,
> > > > +               .size = PHYS_SDRAM_SIZE,
> > > >                 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
> > > >                          PTE_BLOCK_OUTER_SHARE
> > > > +#ifdef PHYS_SDRAM_2_SIZE
> > > >         }, {
> > > >                 /* DRAM2 */
> > > >                 .virt = 0x100000000UL,
> > > >                 .phys = 0x100000000UL,
> > > > -               .size = 0x040000000UL,
> > > > +               .size = PHYS_SDRAM_2_SIZE,
> > > >                 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
> > > >                          PTE_BLOCK_OUTER_SHARE
> > > > +#endif
> > > >         }, {
> > > >                 /* List terminator */
> > > >                 0,
> > > > @@ -130,6 +132,20 @@ static struct mm_region imx8m_mem_map[] =
> {
> > > >
> > > >  struct mm_region *mem_map = imx8m_mem_map;
> > > >
> > > > +void enable_caches(void)
> > > > +{
> > > > +       /*
> > > > +        * If OPTEE runs, remove OPTEE memory from MMU table to
> > > > +        * avoid speculative prefetch. OPTEE runs at the top of
> > > > +        * the first memory bank
> > > > +        */
> > > > +       if (rom_pointer[1])
> > > > +               imx8m_mem_map[5].size -= rom_pointer[1];
> > > > +
> > > > +       icache_enable();
> > > > +       dcache_enable();
> > > > +}
> > > > +
> > > >  static u32 get_cpu_variant_type(u32 type)  {
> > > >         struct ocotp_regs *ocotp = (struct ocotp_regs
> > > > *)OCOTP_BASE_ADDR;
> > > > --
> > > > 2.16.4
> > > >
> > > > _______________________________________________
> > > > U-Boot mailing list
> > > > U-Boot@lists.denx.de
> > > > https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2F
> > > > list
> > > >
> > >
> s.denx.de%2Flistinfo%2Fu-boot&amp;data=02%7C01%7Cpeng.fan%40nxp.co
> > > m%7C
> > > >
> > >
> abfc9387a622474e599508d7c049395c%7C686ea1d3bc2b4c6fa92cd99c5c30
> > > 1635%7C
> > > >
> > >
> 0%7C0%7C637189293044493841&amp;sdata=fMrSP%2BMAzI20VMGhXm0U
> > > 6kejjaClNOo
> > > > bFjB4HVkTt%2Fs%3D&amp;reserved=0
> > >
> > > Unfortunately, I'm still facing a similar issue when OP-TEE is
> > > loaded on iMX8MM-based module, despite BL32_BASE(0xbe000000) +
> > > BL32_SIZE(0x2000000) region is excluded.
> > > Based on debug ouput the latest one is:
> > > ....
> > > idx=2 PTE 00000000bfff7010 at level 1: bfffd003 Checking if pte fits
> > > for
> > > virt=bde00000 size=200000 blocksize=40000000
> > > addr=bde00000 level=2
> > > idx=2 PTE 00000000bfff7010 at level 1: bfffd003 idx=1ef PTE
> > > 00000000bfffdf78 at level 2: 0 Checking if pte fits for
> > > virt=bde00000
> > > size=200000 blocksize=200000 Setting PTE 00000000bfffdf78 to block
> > > virt=bde00000
> >
> > Wired. If this is true, this is bug in u-boot MMU part.
> 
> Sorry fot the noise, that was wrong dram initiailization (I've forgot to take into
> account rom_pointer[1] value) The fix for my board is:
> 
> diff --git a/board/toradex/verdin-imx8mm/verdin-imx8mm.c
> b/board/toradex/verdin-imx8mm/verdin-imx8mm.c
> index 16b9fa1ec1..024c0bd183 100644
> --- a/board/toradex/verdin-imx8mm/verdin-imx8mm.c
> +++ b/board/toradex/verdin-imx8mm/verdin-imx8mm.c
> @@ -5,6 +5,7 @@
> 
>  #include <common.h>
>  #include <asm/arch/clock.h>
> +#include <asm/arch/sys_proto.h>
>  #include <asm/io.h>
>  #include <miiphy.h>
>  #include <netdev.h>
> @@ -13,7 +14,12 @@ DECLARE_GLOBAL_DATA_PTR;
> 
>  int dram_init(void)
>  {
> -       gd->ram_size = get_ram_size((void *)PHYS_SDRAM,
> PHYS_SDRAM_SIZE);
> +       /* rom_pointer[1] contains the size of TEE occupies */
> +       if (rom_pointer[1])
> +               gd->ram_size = PHYS_SDRAM_SIZE - rom_pointer[1];
> +       else
> +               gd->ram_size = PHYS_SDRAM_SIZE;
> +
> 
>         return 0;
>  }

Indeed.

> 
> 
> This bug is actual for imx8mm_evk also.

Would you help submit a fix for this release?

Thanks,
Peng.

> >
> > Regards,
> > Peng.
> >
> > >
> > >
> > > U-Boot hangs just after writing to System Control Register in
> > > arch/arm/cpu/armv8/cache_v8.c:419:
> > >
> > > /* enable the mmu */
> > > set_sctlr(get_sctlr() | CR_M);
> > >
> > > In my setup mainline U-Boot/TF-A/OP-TEE are used:
> > > u-boot: 133276f14a ("Merge branch '2020-02-25-master-imports'")
> > > tf-a: 6e46981f84 ("Merge "Update pathnames in maintainers.rst file"
> > > into integration")
> > > op-tee: a67dc424ff ("ta: pkcs11: API for slot/token information")
> > >
> > > OP-TEE is compiled with these flags:
> > >    CFG_ARM64_core=y
> > >    CFG_NXP_CAAM=n
> > >    CFG_NXPCRYPT=n
> > >    PLATFORM=imx-mx8mmevk
> > >    CFG_TEE_CORE_LOG_LEVEL=4
> > >    DEBUG=y
> > >    CFG_TEE_CORE_DEBUG=y
> > >
> > > With DCACHE disabled obviously everything works. Also I don't face
> > > any issues if TF-A is compiled without SPD=opteed.
> > >
> > > Maybe it rings the bell and you already saw similar issues before?
> > >
> > > Thanks
> > >
> > > --
> > > Best regards - Freundliche Grüsse - Meilleures salutations
> > >
> > > Igor Opaniuk
> > >
> > > mailto: igor.opaniuk@gmail.com
> > > skype: igor.opanyuk
> > > +380 (93) 836 40 67
> > > https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fua.
> > > linke
> > >
> din.com%2Fin%2Fiopaniuk&amp;data=02%7C01%7Cpeng.fan%40nxp.com%7
> > >
> Cabfc9387a622474e599508d7c049395c%7C686ea1d3bc2b4c6fa92cd99c5c3
> > >
> 01635%7C0%7C0%7C637189293044493841&amp;sdata=CBnHEQfZu%2FtQv
> > > fbL%2FGn2H%2FBilRgKeQe5CHaUt0BjKP4%3D&amp;reserved=0
> 
> 
> 
> --
> Best regards - Freundliche Grüsse - Meilleures salutations
> 
> Igor Opaniuk
> 
> mailto: igor.opaniuk@gmail.com
> skype: igor.opanyuk
> +380 (93) 836 40 67
> https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fua.linke
> din.com%2Fin%2Fiopaniuk&amp;data=02%7C01%7Cpeng.fan%40nxp.com%7
> C419d4fa64db94f8f42ab08d7c0f109ce%7C686ea1d3bc2b4c6fa92cd99c5c30
> 1635%7C0%7C1%7C637190013789013047&amp;sdata=1XSMhCBa4XqDshm
> q1vSIR7Ss%2FThsuY7bfqOl7qquDqU%3D&amp;reserved=0
Igor Opaniuk March 5, 2020, 12:18 p.m. UTC | #6
On Thu, Mar 5, 2020 at 12:46 PM Peng Fan <peng.fan@nxp.com> wrote:
>
> > Subject: Re: [U-Boot] [PATCH V3 15/27] imx8m: Fix MMU table issue for
> > OPTEE memory
> >
> > Hi Peng,
> >
> > On Thu, Mar 5, 2020 at 2:50 AM Peng Fan <peng.fan@nxp.com> wrote:
> > >
> > > > Subject: Re: [U-Boot] [PATCH V3 15/27] imx8m: Fix MMU table issue
> > > > for OPTEE memory
> > > >
> > > > Hi Peng,
> > > >
> > > > On Tue, Aug 27, 2019 at 9:38 AM Peng Fan <peng.fan@nxp.com> wrote:
> > > > >
> > > > > When running with OPTEE, the MMU table in u-boot does not remove
> > > > > the OPTEE memory from its settings. So ARM speculative prefetch in
> > > > > u-boot may access that OPTEE memory. Due to trust zone is enabled
> > > > > by OPTEE and that memory is set to secure access, then the
> > > > > speculative prefetch will fail and cause various memory issue in u-boot.
> > > > > The fail address register and int_status register in trustzone has
> > > > > logged that speculative access from u-boot.
> > > > >
> > > > > Signed-off-by: Peng Fan <peng.fan@nxp.com>
> > > > > ---
> > > > >  arch/arm/mach-imx/imx8m/soc.c | 20 ++++++++++++++++++--
> > > > >  1 file changed, 18 insertions(+), 2 deletions(-)
> > > > >
> > > > > diff --git a/arch/arm/mach-imx/imx8m/soc.c
> > > > > b/arch/arm/mach-imx/imx8m/soc.c index 5115471eff..dd393b581b
> > > > 100644
> > > > > --- a/arch/arm/mach-imx/imx8m/soc.c
> > > > > +++ b/arch/arm/mach-imx/imx8m/soc.c
> > > > > @@ -112,16 +112,18 @@ static struct mm_region imx8m_mem_map[]
> > = {
> > > > >                 /* DRAM1 */
> > > > >                 .virt = 0x40000000UL,
> > > > >                 .phys = 0x40000000UL,
> > > > > -               .size = 0xC0000000UL,
> > > > > +               .size = PHYS_SDRAM_SIZE,
> > > > >                 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
> > > > >                          PTE_BLOCK_OUTER_SHARE
> > > > > +#ifdef PHYS_SDRAM_2_SIZE
> > > > >         }, {
> > > > >                 /* DRAM2 */
> > > > >                 .virt = 0x100000000UL,
> > > > >                 .phys = 0x100000000UL,
> > > > > -               .size = 0x040000000UL,
> > > > > +               .size = PHYS_SDRAM_2_SIZE,
> > > > >                 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
> > > > >                          PTE_BLOCK_OUTER_SHARE
> > > > > +#endif
> > > > >         }, {
> > > > >                 /* List terminator */
> > > > >                 0,
> > > > > @@ -130,6 +132,20 @@ static struct mm_region imx8m_mem_map[] =
> > {
> > > > >
> > > > >  struct mm_region *mem_map = imx8m_mem_map;
> > > > >
> > > > > +void enable_caches(void)
> > > > > +{
> > > > > +       /*
> > > > > +        * If OPTEE runs, remove OPTEE memory from MMU table to
> > > > > +        * avoid speculative prefetch. OPTEE runs at the top of
> > > > > +        * the first memory bank
> > > > > +        */
> > > > > +       if (rom_pointer[1])
> > > > > +               imx8m_mem_map[5].size -= rom_pointer[1];
> > > > > +
> > > > > +       icache_enable();
> > > > > +       dcache_enable();
> > > > > +}
> > > > > +
> > > > >  static u32 get_cpu_variant_type(u32 type)  {
> > > > >         struct ocotp_regs *ocotp = (struct ocotp_regs
> > > > > *)OCOTP_BASE_ADDR;
> > > > > --
> > > > > 2.16.4
> > > > >
> > > > > _______________________________________________
> > > > > U-Boot mailing list
> > > > > U-Boot@lists.denx.de
> > > > > https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2F
> > > > > list
> > > > >
> > > >
> > s.denx.de%2Flistinfo%2Fu-boot&amp;data=02%7C01%7Cpeng.fan%40nxp.co
> > > > m%7C
> > > > >
> > > >
> > abfc9387a622474e599508d7c049395c%7C686ea1d3bc2b4c6fa92cd99c5c30
> > > > 1635%7C
> > > > >
> > > >
> > 0%7C0%7C637189293044493841&amp;sdata=fMrSP%2BMAzI20VMGhXm0U
> > > > 6kejjaClNOo
> > > > > bFjB4HVkTt%2Fs%3D&amp;reserved=0
> > > >
> > > > Unfortunately, I'm still facing a similar issue when OP-TEE is
> > > > loaded on iMX8MM-based module, despite BL32_BASE(0xbe000000) +
> > > > BL32_SIZE(0x2000000) region is excluded.
> > > > Based on debug ouput the latest one is:
> > > > ....
> > > > idx=2 PTE 00000000bfff7010 at level 1: bfffd003 Checking if pte fits
> > > > for
> > > > virt=bde00000 size=200000 blocksize=40000000
> > > > addr=bde00000 level=2
> > > > idx=2 PTE 00000000bfff7010 at level 1: bfffd003 idx=1ef PTE
> > > > 00000000bfffdf78 at level 2: 0 Checking if pte fits for
> > > > virt=bde00000
> > > > size=200000 blocksize=200000 Setting PTE 00000000bfffdf78 to block
> > > > virt=bde00000
> > >
> > > Wired. If this is true, this is bug in u-boot MMU part.
> >
> > Sorry fot the noise, that was wrong dram initiailization (I've forgot to take into
> > account rom_pointer[1] value) The fix for my board is:
> >
> > diff --git a/board/toradex/verdin-imx8mm/verdin-imx8mm.c
> > b/board/toradex/verdin-imx8mm/verdin-imx8mm.c
> > index 16b9fa1ec1..024c0bd183 100644
> > --- a/board/toradex/verdin-imx8mm/verdin-imx8mm.c
> > +++ b/board/toradex/verdin-imx8mm/verdin-imx8mm.c
> > @@ -5,6 +5,7 @@
> >
> >  #include <common.h>
> >  #include <asm/arch/clock.h>
> > +#include <asm/arch/sys_proto.h>
> >  #include <asm/io.h>
> >  #include <miiphy.h>
> >  #include <netdev.h>
> > @@ -13,7 +14,12 @@ DECLARE_GLOBAL_DATA_PTR;
> >
> >  int dram_init(void)
> >  {
> > -       gd->ram_size = get_ram_size((void *)PHYS_SDRAM,
> > PHYS_SDRAM_SIZE);
> > +       /* rom_pointer[1] contains the size of TEE occupies */
> > +       if (rom_pointer[1])
> > +               gd->ram_size = PHYS_SDRAM_SIZE - rom_pointer[1];
> > +       else
> > +               gd->ram_size = PHYS_SDRAM_SIZE;
> > +
> >
> >         return 0;
> >  }
>
> Indeed.
>
> >
> >
> > This bug is actual for imx8mm_evk also.
>
> Would you help submit a fix for this release?
Sure, I'll send a fix for both NXP iMX8MM EVK and Verdin boards.
>
> Thanks,
> Peng.
>
> > >
> > > Regards,
> > > Peng.
> > >
> > > >
> > > >
> > > > U-Boot hangs just after writing to System Control Register in
> > > > arch/arm/cpu/armv8/cache_v8.c:419:
> > > >
> > > > /* enable the mmu */
> > > > set_sctlr(get_sctlr() | CR_M);
> > > >
> > > > In my setup mainline U-Boot/TF-A/OP-TEE are used:
> > > > u-boot: 133276f14a ("Merge branch '2020-02-25-master-imports'")
> > > > tf-a: 6e46981f84 ("Merge "Update pathnames in maintainers.rst file"
> > > > into integration")
> > > > op-tee: a67dc424ff ("ta: pkcs11: API for slot/token information")
> > > >
> > > > OP-TEE is compiled with these flags:
> > > >    CFG_ARM64_core=y
> > > >    CFG_NXP_CAAM=n
> > > >    CFG_NXPCRYPT=n
> > > >    PLATFORM=imx-mx8mmevk
> > > >    CFG_TEE_CORE_LOG_LEVEL=4
> > > >    DEBUG=y
> > > >    CFG_TEE_CORE_DEBUG=y
> > > >
> > > > With DCACHE disabled obviously everything works. Also I don't face
> > > > any issues if TF-A is compiled without SPD=opteed.
> > > >
> > > > Maybe it rings the bell and you already saw similar issues before?
> > > >
> > > > Thanks
> > > >
> > > > --
> > > > Best regards - Freundliche Grüsse - Meilleures salutations
> > > >
> > > > Igor Opaniuk
> > > >
> > > > mailto: igor.opaniuk@gmail.com
> > > > skype: igor.opanyuk
> > > > +380 (93) 836 40 67
> > > > https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fua.
> > > > linke
> > > >
> > din.com%2Fin%2Fiopaniuk&amp;data=02%7C01%7Cpeng.fan%40nxp.com%7
> > > >
> > Cabfc9387a622474e599508d7c049395c%7C686ea1d3bc2b4c6fa92cd99c5c3
> > > >
> > 01635%7C0%7C0%7C637189293044493841&amp;sdata=CBnHEQfZu%2FtQv
> > > > fbL%2FGn2H%2FBilRgKeQe5CHaUt0BjKP4%3D&amp;reserved=0
> >
> >
> >
> > --
> > Best regards - Freundliche Grüsse - Meilleures salutations
> >
> > Igor Opaniuk
> >
> > mailto: igor.opaniuk@gmail.com
> > skype: igor.opanyuk
> > +380 (93) 836 40 67
> > https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fua.linke
> > din.com%2Fin%2Fiopaniuk&amp;data=02%7C01%7Cpeng.fan%40nxp.com%7
> > C419d4fa64db94f8f42ab08d7c0f109ce%7C686ea1d3bc2b4c6fa92cd99c5c30
> > 1635%7C0%7C1%7C637190013789013047&amp;sdata=1XSMhCBa4XqDshm
> > q1vSIR7Ss%2FThsuY7bfqOl7qquDqU%3D&amp;reserved=0
diff mbox series

Patch

diff --git a/arch/arm/mach-imx/imx8m/soc.c b/arch/arm/mach-imx/imx8m/soc.c
index 5115471eff..dd393b581b 100644
--- a/arch/arm/mach-imx/imx8m/soc.c
+++ b/arch/arm/mach-imx/imx8m/soc.c
@@ -112,16 +112,18 @@  static struct mm_region imx8m_mem_map[] = {
 		/* DRAM1 */
 		.virt = 0x40000000UL,
 		.phys = 0x40000000UL,
-		.size = 0xC0000000UL,
+		.size = PHYS_SDRAM_SIZE,
 		.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
 			 PTE_BLOCK_OUTER_SHARE
+#ifdef PHYS_SDRAM_2_SIZE
 	}, {
 		/* DRAM2 */
 		.virt = 0x100000000UL,
 		.phys = 0x100000000UL,
-		.size = 0x040000000UL,
+		.size = PHYS_SDRAM_2_SIZE,
 		.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
 			 PTE_BLOCK_OUTER_SHARE
+#endif
 	}, {
 		/* List terminator */
 		0,
@@ -130,6 +132,20 @@  static struct mm_region imx8m_mem_map[] = {
 
 struct mm_region *mem_map = imx8m_mem_map;
 
+void enable_caches(void)
+{
+	/*
+	 * If OPTEE runs, remove OPTEE memory from MMU table to
+	 * avoid speculative prefetch. OPTEE runs at the top of
+	 * the first memory bank
+	 */
+	if (rom_pointer[1])
+		imx8m_mem_map[5].size -= rom_pointer[1];
+
+	icache_enable();
+	dcache_enable();
+}
+
 static u32 get_cpu_variant_type(u32 type)
 {
 	struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;