Re: [PATCH v2 2/2] ARM: mmu_32: fix setting up zero page when it is in SDRAM

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, May 31, 2023 at 12:45:17PM +0200, Ahmad Fatoum wrote:
> On 31.05.23 12:35, Sascha Hauer wrote:
> > We used to skip setting the zero page to faulting when SDRAM starts
> > at 0x0. As bootm code now explicitly sets the zero page accessible
> > before copying ATAGs there this should no longer be necessary, so
> > unconditionally set the zero page to faulting during MMU startup.
> > This also moves the zero page setup after the point the SDRAM has
> > been mapped cachable, because otherwise the zero page setup would
> > be overwritten.
> > 
> > Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx>
> > ---
> >  arch/arm/cpu/mmu_32.c | 26 +++++++-------------------
> >  1 file changed, 7 insertions(+), 19 deletions(-)
> > 
> > diff --git a/arch/arm/cpu/mmu_32.c b/arch/arm/cpu/mmu_32.c
> > index c4e5a3bb0a..fdbc0293a3 100644
> > --- a/arch/arm/cpu/mmu_32.c
> > +++ b/arch/arm/cpu/mmu_32.c
> > @@ -459,23 +459,6 @@ static int set_vector_table(unsigned long adr)
> >  	return -EINVAL;
> >  }
> >  
> > -static void create_zero_page(void)
> > -{
> > -	struct resource *zero_sdram;
> > -
> > -	zero_sdram = request_sdram_region("zero page", 0x0, PAGE_SIZE);
> > -	if (zero_sdram) {
> > -		/*
> > -		 * Here we would need to set the second level page table
> > -		 * entry to faulting. This is not yet implemented.
> > -		 */
> > -		pr_debug("zero page is in SDRAM area, currently not supported\n");
> > -	} else {
> > -		zero_page_faulting();
> > -		pr_debug("Created zero page\n");
> > -	}
> > -}
> > -
> >  /*
> >   * Map vectors and zero page
> >   */
> > @@ -487,7 +470,6 @@ static void vectors_init(void)
> >  	 */
> >  	if (!set_vector_table((unsigned long)__exceptions_start)) {
> >  		arm_fixup_vectors();
> > -		create_zero_page();
> >  		return;
> >  	}
> >  
> > @@ -495,7 +477,6 @@ static void vectors_init(void)
> >  	 * Next try high vectors at 0xffff0000.
> >  	 */
> >  	if (!set_vector_table(ARM_HIGH_VECTORS)) {
> > -		create_zero_page();
> >  		create_vector_table(ARM_HIGH_VECTORS);
> >  		return;
> >  	}
> > @@ -552,6 +533,13 @@ void __mmu_init(bool mmu_on)
> >  
> >  		remap_range((void *)pos, bank->start + bank->size - pos, MAP_CACHED);
> >  	}
> > +
> > +	/*
> > +	 * In case the zero page is in SDRAM request it to prevent others
> > +	 * from using it
> > +	 */
> > +	request_sdram_region("zero page", 0x0, PAGE_SIZE);
> > +	zero_page_faulting();
> 
> I think this would break the case of having low vectors (at address 0).
> We have vector_table requested if that's the case, so we need to check:
> 
>   if (!zero_page_in_sdram() || !zero_page_already_sdram_requested())
> 	zero_page_faulting();

You are right. How about this one?

--------------------------8<------------------------------


>From b6e5c92682467496bd9c57918996f1feffda2dd6 Mon Sep 17 00:00:00 2001
From: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx>
Date: Wed, 31 May 2023 11:58:51 +0200
Subject: [PATCH] ARM: mmu_32: fix setting up zero page when it is in SDRAM

We used to skip setting the zero page to faulting when SDRAM starts at
0x0. As bootm code now explicitly sets the zero page accessible before
copying ATAGs there this should no longer be necessary, so
unconditionally set the zero page to faulting during MMU startup.  This
also moves the zero page and vector table setup after the point the
SDRAM has been mapped cachable, because otherwise the zero page and
possibly the vector table mapping would be overwritten.

Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx>
---
 arch/arm/cpu/mmu_32.c | 23 +++++++++--------------
 1 file changed, 9 insertions(+), 14 deletions(-)

diff --git a/arch/arm/cpu/mmu_32.c b/arch/arm/cpu/mmu_32.c
index c4e5a3bb0a..14775768a3 100644
--- a/arch/arm/cpu/mmu_32.c
+++ b/arch/arm/cpu/mmu_32.c
@@ -461,19 +461,14 @@ static int set_vector_table(unsigned long adr)
 
 static void create_zero_page(void)
 {
-	struct resource *zero_sdram;
+	/*
+	 * In case the zero page is in SDRAM request it to prevent others
+	 * from using it
+	 */
+	request_sdram_region("zero page", 0x0, PAGE_SIZE);
 
-	zero_sdram = request_sdram_region("zero page", 0x0, PAGE_SIZE);
-	if (zero_sdram) {
-		/*
-		 * Here we would need to set the second level page table
-		 * entry to faulting. This is not yet implemented.
-		 */
-		pr_debug("zero page is in SDRAM area, currently not supported\n");
-	} else {
-		zero_page_faulting();
-		pr_debug("Created zero page\n");
-	}
+	zero_page_faulting();
+	pr_debug("Created zero page\n");
 }
 
 /*
@@ -530,8 +525,6 @@ void __mmu_init(bool mmu_on)
 
 	pr_debug("ttb: 0x%p\n", ttb);
 
-	vectors_init();
-
 	/*
 	 * Early mmu init will have mapped everything but the initial memory area
 	 * (excluding final OPTEE_SIZE bytes) uncached. We have now discovered
@@ -552,6 +545,8 @@ void __mmu_init(bool mmu_on)
 
 		remap_range((void *)pos, bank->start + bank->size - pos, MAP_CACHED);
 	}
+
+	vectors_init();
 }
 
 /*
-- 
2.39.2

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |




[Index of Archives]     [Linux Embedded]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux