All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mark Rutland <mark.rutland@arm.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [Patch v4 2/5] ARMv8: Adjust MMU setup
Date: Mon, 2 Jun 2014 12:34:51 +0100	[thread overview]
Message-ID: <20140602113450.GD13573@leverpostej> (raw)
In-Reply-To: <1401396548-3353-2-git-send-email-yorksun@freescale.com>

On Thu, May 29, 2014 at 09:49:05PM +0100, York Sun wrote:
> Make MMU functions reusable. Platform code can setup its own MMU tables.

What exactly does platform code need to setup its own tables for?

> Also fix a typo of "TCR_EL3_IPS_BITS" in cache_v8.c.
> 
> Signed-off-by: York Sun <yorksun@freescale.com>
> CC: David Feng <fenghua@phytium.com.cn>
> ---
> Change log:
>  v4: new patch, splitted from v3 2/4
>      Revise set_pgtable_section() to be reused by platform MMU code
>      Add inline function set_ttbr_tcr_mair() to be used by this and platform mmu code
> 
>  arch/arm/cpu/armv8/cache_v8.c    |   49 ++++++++++++++++----------------------
>  arch/arm/include/asm/armv8/mmu.h |   23 ++++++++++++++++++
>  2 files changed, 43 insertions(+), 29 deletions(-)
> 
> diff --git a/arch/arm/cpu/armv8/cache_v8.c b/arch/arm/cpu/armv8/cache_v8.c
> index a96ecda..67dbd46 100644
> --- a/arch/arm/cpu/armv8/cache_v8.c
> +++ b/arch/arm/cpu/armv8/cache_v8.c
> @@ -12,15 +12,14 @@
>  DECLARE_GLOBAL_DATA_PTR;
>  
>  #ifndef CONFIG_SYS_DCACHE_OFF
> -
> -static void set_pgtable_section(u64 section, u64 memory_type)
> +void set_pgtable_section(u64 *page_table, u64 index, u64 section,
> +			 u64 memory_type)
>  {
> -	u64 *page_table = (u64 *)gd->arch.tlb_addr;
>  	u64 value;
>  
> -	value = (section << SECTION_SHIFT) | PMD_TYPE_SECT | PMD_SECT_AF;
> +	value = section | PMD_TYPE_SECT | PMD_SECT_AF;
>  	value |= PMD_ATTRINDX(memory_type);
> -	page_table[section] = value;
> +	page_table[index] = value;
>  }
>  
>  /* to activate the MMU we need to set up virtual memory */
> @@ -28,10 +27,13 @@ static void mmu_setup(void)
>  {
>  	int i, j, el;
>  	bd_t *bd = gd->bd;
> +	u64 *page_table = (u64 *)gd->arch.tlb_addr;
>  
>  	/* Setup an identity-mapping for all spaces */
> -	for (i = 0; i < (PGTABLE_SIZE >> 3); i++)
> -		set_pgtable_section(i, MT_DEVICE_NGNRNE);
> +	for (i = 0; i < (PGTABLE_SIZE >> 3); i++) {
> +		set_pgtable_section(page_table, i, i << SECTION_SHIFT,
> +				    MT_DEVICE_NGNRNE);
> +	}
>  
>  	/* Setup an identity-mapping for all RAM space */
>  	for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
> @@ -39,36 +41,25 @@ static void mmu_setup(void)
>  		ulong end = bd->bi_dram[i].start + bd->bi_dram[i].size;
>  		for (j = start >> SECTION_SHIFT;
>  		     j < end >> SECTION_SHIFT; j++) {
> -			set_pgtable_section(j, MT_NORMAL);
> +			set_pgtable_section(page_table, j, j << SECTION_SHIFT,
> +					    MT_NORMAL);
>  		}
>  	}
>  
>  	/* load TTBR0 */
>  	el = current_el();
>  	if (el == 1) {
> -		asm volatile("msr ttbr0_el1, %0"
> -			     : : "r" (gd->arch.tlb_addr) : "memory");
> -		asm volatile("msr tcr_el1, %0"
> -			     : : "r" (TCR_FLAGS | TCR_EL1_IPS_BITS)
> -			     : "memory");
> -		asm volatile("msr mair_el1, %0"
> -			     : : "r" (MEMORY_ATTRIBUTES) : "memory");
> +		set_ttbr_tcr_mair(el, gd->arch.tlb_addr,
> +				  TCR_FLAGS | TCR_EL1_IPS_BITS,
> +				  MEMORY_ATTRIBUTES);
>  	} else if (el == 2) {
> -		asm volatile("msr ttbr0_el2, %0"
> -			     : : "r" (gd->arch.tlb_addr) : "memory");
> -		asm volatile("msr tcr_el2, %0"
> -			     : : "r" (TCR_FLAGS | TCR_EL2_IPS_BITS)
> -			     : "memory");
> -		asm volatile("msr mair_el2, %0"
> -			     : : "r" (MEMORY_ATTRIBUTES) : "memory");
> +		set_ttbr_tcr_mair(el, gd->arch.tlb_addr,
> +				  TCR_FLAGS | TCR_EL2_IPS_BITS,
> +				  MEMORY_ATTRIBUTES);
>  	} else {
> -		asm volatile("msr ttbr0_el3, %0"
> -			     : : "r" (gd->arch.tlb_addr) : "memory");
> -		asm volatile("msr tcr_el3, %0"
> -			     : : "r" (TCR_FLAGS | TCR_EL2_IPS_BITS)
> -			     : "memory");
> -		asm volatile("msr mair_el3, %0"
> -			     : : "r" (MEMORY_ATTRIBUTES) : "memory");
> +		set_ttbr_tcr_mair(el, gd->arch.tlb_addr,
> +				  TCR_FLAGS | TCR_EL3_IPS_BITS,
> +				  MEMORY_ATTRIBUTES);
>  	}
>  
>  	/* enable the mmu */
> diff --git a/arch/arm/include/asm/armv8/mmu.h b/arch/arm/include/asm/armv8/mmu.h
> index 1193e76..7de4ff9 100644
> --- a/arch/arm/include/asm/armv8/mmu.h
> +++ b/arch/arm/include/asm/armv8/mmu.h
> @@ -108,4 +108,27 @@
>  				TCR_IRGN_WBWA |		\
>  				TCR_T0SZ(VA_BITS))
>  
> +#ifndef __ASSEMBLY__
> +void set_pgtable_section(u64 *page_table, u64 index,
> +			 u64 section, u64 memory_type);
> +static inline void set_ttbr_tcr_mair(int el, u64 table, u64 tcr, u64 attr)
> +{
> +	asm volatile("dsb sy;isb");

Huh? This wasn't anywhere before. Is the isb necessary?

When is this function expected to be called? Is the MMU expected to be
on?

> +	if (el == 1) {
> +		asm volatile("msr ttbr0_el1, %0" : : "r" (table) : "memory");
> +		asm volatile("msr tcr_el1, %0" : : "r" (tcr) : "memory");
> +		asm volatile("msr mair_el1, %0" : : "r" (attr) : "memory");

If the MMU is on, this looks really scary -- what are you expecting to
change in a single invocation?

> +	} else if (el == 2) {
> +		asm volatile("msr ttbr0_el2, %0" : : "r" (table) : "memory");
> +		asm volatile("msr tcr_el2, %0" : : "r" (tcr) : "memory");
> +		asm volatile("msr mair_el2, %0" : : "r" (attr) : "memory");
> +	} else if (el == 3) {
> +		asm volatile("msr ttbr0_el3, %0" : : "r" (table) : "memory");
> +		asm volatile("msr tcr_el3, %0" : : "r" (tcr) : "memory");
> +		asm volatile("msr mair_el3, %0" : : "r" (attr) : "memory");
> +	} else {
> +		hang();
> +	}

And no synchronisation to ensure that these writes are complete or even
ordered w.r.t. each other?

Mark.

  reply	other threads:[~2014-06-02 11:34 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-29 20:49 [U-Boot] [Patch v4 1/5] Added 64-bit MMIO accessors for ARMv8 York Sun
2014-05-29 20:49 ` [U-Boot] [Patch v4 2/5] ARMv8: Adjust MMU setup York Sun
2014-06-02 11:34   ` Mark Rutland [this message]
2014-06-02 16:06     ` York Sun
2014-06-02 18:01       ` Mark Rutland
2014-06-04 16:27         ` York Sun
2014-06-05 10:09           ` Mark Rutland
2014-06-05 15:07             ` York Sun
2014-06-05 17:41               ` Mark Rutland
2014-06-05 18:34                 ` York Sun
2014-06-06 12:33                   ` Mark Rutland
2014-06-06 14:54                     ` York Sun
2014-06-06 17:32                       ` Mark Rutland
2014-06-06 17:37                         ` York Sun
2014-06-06 20:17                         ` York Sun
2014-06-06 22:14                           ` York Sun
2014-06-10  9:15                             ` Mark Rutland
2014-06-10 16:04                               ` York Sun
2014-06-13 19:41                               ` York Sun
2014-06-18 14:09                                 ` fenghua at phytium.com.cn
2014-06-18 15:44                                   ` York Sun
2014-06-06 13:34                   ` Rob Herring
2014-06-06 14:52                     ` York Sun
2014-06-06 16:09                       ` Tom Rini
2014-05-29 20:49 ` [U-Boot] [Patch v4 3/5] ARMv8/FSL_LSCH3: Add FSL_LSCH3 SoC York Sun
2014-06-11 14:05   ` fenghua at phytium.com.cn
2014-06-11 14:55     ` York Sun
2014-05-29 20:49 ` [U-Boot] [Patch v4 4/5] armv8/fsl-lsch3: Add support to load and start MC Firmware York Sun
2014-05-29 20:49 ` [U-Boot] [Patch v4 5/5] ARMv8/ls2100a_emu: Add LS2100A emulator and simulator board support York Sun

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140602113450.GD13573@leverpostej \
    --to=mark.rutland@arm.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.