* [U-Boot] Fwd: [PATCH 1/3] armv8/cache: Consolidate setting for MAIR and TCR [not found] <1392069354-24578-1-git-send-email-yorksun@freescale.com> @ 2014-02-10 21:58 ` York Sun [not found] ` <1392069354-24578-3-git-send-email-yorksun@freescale.com> 2014-02-13 3:13 ` [U-Boot] [PATCH 1/3] armv8/cache: Consolidate setting for MAIR and TCR FengHua 2 siblings, 0 replies; 4+ messages in thread From: York Sun @ 2014-02-10 21:58 UTC (permalink / raw) To: u-boot -------- Original Message -------- Subject: [PATCH 1/3] armv8/cache: Consolidate setting for MAIR and TCR Date: Mon, 10 Feb 2014 13:55:52 -0800 From: York Sun <yorksun@freescale.com> To: <albert.u.boot@aribaud.net> CC: <scottwood@freescale.com>, York Sun <yorksun@freescale.com>, David Feng <fenghua@phytium.com.cn> Move setting for MAIR and TCR to cache_v8.c, to avoid conflict with sub-architecture. Signed-off-by: York Sun <yorksun@freescale.com> CC: David Feng <fenghua@phytium.com.cn> --- arch/arm/cpu/armv8/cache_v8.c | 22 +++++++++++++++++++--- arch/arm/cpu/armv8/start.S | 22 ---------------------- 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/arch/arm/cpu/armv8/cache_v8.c b/arch/arm/cpu/armv8/cache_v8.c index 131fdab..7acae1b 100644 --- a/arch/arm/cpu/armv8/cache_v8.c +++ b/arch/arm/cpu/armv8/cache_v8.c @@ -45,15 +45,31 @@ static void mmu_setup(void) /* load TTBR0 */ el = current_el(); - if (el == 1) + if (el == 1) { asm volatile("msr ttbr0_el1, %0" : : "r" (gd->arch.tlb_addr) : "memory"); - else if (el == 2) + asm volatile("msr tcr_el1, %0" + : : "r" (TCR_FLAGS | TCR_EL1_IPS_BITS) + : "memory"); + asm volatile("msr mair_el1, %0" + : : "r" (MEMORY_ATTRIBUTES) : "memory"); + } else if (el == 2) { asm volatile("msr ttbr0_el2, %0" : : "r" (gd->arch.tlb_addr) : "memory"); - else + asm volatile("msr tcr_el2, %0" + : : "r" (TCR_FLAGS | TCR_EL2_IPS_BITS) + : "memory"); + asm volatile("msr mair_el2, %0" + : : "r" (MEMORY_ATTRIBUTES) : "memory"); + } 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"); + } /* enable the mmu */ set_sctlr(get_sctlr() | CR_M); diff --git a/arch/arm/cpu/armv8/start.S b/arch/arm/cpu/armv8/start.S index bcc2603..90daa4d 100644 --- a/arch/arm/cpu/armv8/start.S +++ b/arch/arm/cpu/armv8/start.S @@ -128,28 +128,6 @@ ENTRY(c_runtime_cpu_setup) isb sy #endif -#ifndef CONFIG_SYS_DCACHE_OFF - /* - * Setup MAIR and TCR. - */ - ldr x0, =MEMORY_ATTRIBUTES - ldr x1, =TCR_FLAGS - - switch_el x2, 3f, 2f, 1f -3: orr x1, x1, TCR_EL3_IPS_BITS - msr mair_el3, x0 - msr tcr_el3, x1 - b 0f -2: orr x1, x1, TCR_EL2_IPS_BITS - msr mair_el2, x0 - msr tcr_el2, x1 - b 0f -1: orr x1, x1, TCR_EL1_IPS_BITS - msr mair_el1, x0 - msr tcr_el1, x1 -0: -#endif - /* Relocate vBAR */ adr x0, vectors switch_el x1, 3f, 2f, 1f -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 4+ messages in thread
[parent not found: <1392069354-24578-3-git-send-email-yorksun@freescale.com>]
* [U-Boot] Fwd: [PATCH 3/3] armv8/cache: Change cache invalidate and flush function [not found] ` <1392069354-24578-3-git-send-email-yorksun@freescale.com> @ 2014-02-10 21:58 ` York Sun [not found] ` <4997fa.12c4.144296ae1fc.Coremail.fenghua@phytium.com.cn> 1 sibling, 0 replies; 4+ messages in thread From: York Sun @ 2014-02-10 21:58 UTC (permalink / raw) To: u-boot -------- Original Message -------- Subject: [PATCH 3/3] armv8/cache: Change cache invalidate and flush function Date: Mon, 10 Feb 2014 13:55:54 -0800 From: York Sun <yorksun@freescale.com> To: <albert.u.boot@aribaud.net> CC: <scottwood@freescale.com>, York Sun <yorksun@freescale.com>, David Feng <fenghua@phytium.com.cn> When SoC first boots up, we should invalidate the cache but not flush it. We can use the same function for invalid and flush mostly, with a wrapper. Invalidating large cache can ben slow on emulator, so we postpone doing so until I-cache is enabled, and before enabling D-cache. Signed-off-by: York Sun <yorksun@freescale.com> CC: David Feng <fenghua@phytium.com.cn> --- arch/arm/cpu/armv8/cache.S | 53 +++++++++++++++++++++++++++++------------ arch/arm/cpu/armv8/cache_v8.c | 2 +- arch/arm/cpu/armv8/start.S | 2 +- arch/arm/include/asm/system.h | 1 + 4 files changed, 41 insertions(+), 17 deletions(-) diff --git a/arch/arm/cpu/armv8/cache.S b/arch/arm/cpu/armv8/cache.S index 546a83e..249799c 100644 --- a/arch/arm/cpu/armv8/cache.S +++ b/arch/arm/cpu/armv8/cache.S @@ -19,11 +19,12 @@ * clean and invalidate one level cache. * * x0: cache level - * x1~x9: clobbered + * x1: 0 flush & invalidate, 1 invalidate only + * x2~x9: clobbered */ ENTRY(__asm_flush_dcache_level) - lsl x1, x0, #1 - msr csselr_el1, x1 /* select cache level */ + lsl x12, x0, #1 + msr csselr_el1, x12 /* select cache level */ isb /* sync change of cssidr_el1 */ mrs x6, ccsidr_el1 /* read the new cssidr_el1 */ and x2, x6, #7 /* x2 <- log2(cache line size)-4 */ @@ -35,7 +36,7 @@ ENTRY(__asm_flush_dcache_level) clz w5, w4 /* bit position of #ways */ mov x4, #0x7fff and x4, x4, x6, lsr #13 /* x4 <- max number of #sets */ - /* x1 <- cache level << 1 */ + /* x12 <- cache level << 1 */ /* x2 <- line length offset */ /* x3 <- number of cache ways - 1 */ /* x4 <- number of cache sets - 1 */ @@ -45,11 +46,14 @@ loop_set: mov x6, x3 /* x6 <- working copy of #ways */ loop_way: lsl x7, x6, x5 - orr x9, x1, x7 /* map way and level to cisw value */ + orr x9, x12, x7 /* map way and level to cisw value */ lsl x7, x4, x2 orr x9, x9, x7 /* map set number to cisw value */ - dc cisw, x9 /* clean & invalidate by set/way */ - subs x6, x6, #1 /* decrement the way */ + tbz w1, #0, 1f + dc isw, x9 + b 2f +1: dc cisw, x9 /* clean & invalidate by set/way */ +2: subs x6, x6, #1 /* decrement the way */ b.ge loop_way subs x4, x4, #1 /* decrement the set */ b.ge loop_set @@ -58,11 +62,14 @@ loop_way: ENDPROC(__asm_flush_dcache_level) /* - * void __asm_flush_dcache_all(void) + * void __asm_flush_dcache_all(int invalidate_only) + * + * x0: 0 flush & invalidate, 1 invalidate only * * clean and invalidate all data cache by SET/WAY. */ -ENTRY(__asm_flush_dcache_all) +ENTRY(__asm_dcache_all) + mov x1, x0 dsb sy mrs x10, clidr_el1 /* read clidr_el1 */ lsr x11, x10, #24 @@ -76,13 +83,13 @@ ENTRY(__asm_flush_dcache_all) /* x15 <- return address */ loop_level: - lsl x1, x0, #1 - add x1, x1, x0 /* x0 <- tripled cache level */ - lsr x1, x10, x1 - and x1, x1, #7 /* x1 <- cache type */ - cmp x1, #2 + lsl x12, x0, #1 + add x12, x12, x0 /* x0 <- tripled cache level */ + lsr x12, x10, x12 + and x12, x12, #7 /* x12 <- cache type */ + cmp x12, #2 b.lt skip /* skip if no cache or icache */ - bl __asm_flush_dcache_level + bl __asm_flush_dcache_level /* x1 = 0 flush, 1 invalidate */ skip: add x0, x0, #1 /* increment cache level */ cmp x11, x0 @@ -96,8 +103,24 @@ skip: finished: ret +ENDPROC(__asm_dcache_all) + +ENTRY(__asm_flush_dcache_all) + mov x16, lr + mov x0, #0 + bl __asm_dcache_all + mov lr, x16 + ret ENDPROC(__asm_flush_dcache_all) +ENTRY(__asm_invalidate_dcache_all) + mov x16, lr + mov x0, #0xffff + bl __asm_dcache_all + mov lr, x16 + ret +ENDPROC(__asm_invalidate_dcache_all) + /* * void __asm_flush_dcache_range(start, end) * diff --git a/arch/arm/cpu/armv8/cache_v8.c b/arch/arm/cpu/armv8/cache_v8.c index 7acae1b..3ce391ea 100644 --- a/arch/arm/cpu/armv8/cache_v8.c +++ b/arch/arm/cpu/armv8/cache_v8.c @@ -80,7 +80,7 @@ static void mmu_setup(void) */ void invalidate_dcache_all(void) { - __asm_flush_dcache_all(); + __asm_invalidate_dcache_all(); } /* diff --git a/arch/arm/cpu/armv8/start.S b/arch/arm/cpu/armv8/start.S index e70c51d..7b9ac21 100644 --- a/arch/arm/cpu/armv8/start.S +++ b/arch/arm/cpu/armv8/start.S @@ -65,9 +65,9 @@ reset: 0: /* Cache/BPB/TLB Invalidate */ - bl __asm_flush_dcache_all /* dCache clean&invalidate */ bl __asm_invalidate_icache_all /* iCache invalidate */ bl __asm_invalidate_tlb_all /* invalidate TLBs */ + /* d-cache invalidation is done before enabling d-cache */ /* Processor specific initialization */ bl lowlevel_init diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h index 4178f8c..74ee9a4 100644 --- a/arch/arm/include/asm/system.h +++ b/arch/arm/include/asm/system.h @@ -66,6 +66,7 @@ static inline void set_sctlr(unsigned int val) } void __asm_flush_dcache_all(void); +void __asm_invalidate_dcache_all(void); void __asm_flush_dcache_range(u64 start, u64 end); void __asm_invalidate_tlb_all(void); void __asm_invalidate_icache_all(void); -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 4+ messages in thread
[parent not found: <4997fa.12c4.144296ae1fc.Coremail.fenghua@phytium.com.cn>]
* [U-Boot] [PATCH 3/3] armv8/cache: Change cache invalidate and flush function [not found] ` <4997fa.12c4.144296ae1fc.Coremail.fenghua@phytium.com.cn> @ 2014-02-13 17:29 ` York Sun 0 siblings, 0 replies; 4+ messages in thread From: York Sun @ 2014-02-13 17:29 UTC (permalink / raw) To: u-boot On 02/12/2014 08:04 PM, FengHua wrote: > > > >> -----Original Messages----- >> From: "York Sun" <yorksun@freescale.com> >> Sent Time: 2014-02-11 05:55:54 (Tuesday) >> To: albert.u.boot at aribaud.net >> Cc: scottwood at freescale.com, "York Sun" <yorksun@freescale.com>, "David Feng" <fenghua@phytium.com.cn> >> Subject: [PATCH 3/3] armv8/cache: Change cache invalidate and flush function >> <snip> >> diff --git a/arch/arm/cpu/armv8/start.S b/arch/arm/cpu/armv8/start.S >> index e70c51d..7b9ac21 100644 >> --- a/arch/arm/cpu/armv8/start.S >> +++ b/arch/arm/cpu/armv8/start.S >> @@ -65,9 +65,9 @@ reset: >> 0: >> >> /* Cache/BPB/TLB Invalidate */ >> - bl __asm_flush_dcache_all /* dCache clean&invalidate */ >> bl __asm_invalidate_icache_all /* iCache invalidate */ >> bl __asm_invalidate_tlb_all /* invalidate TLBs */ > How about remove the icache and tlb invalidate operations? We can move the calling of __asm_invalidate_tlb_all to before mmu_setup, and move calling __asm_invalidate_icache_all to before icache_enable. But leaving them here makes sense as the initial setup procedure. And more important, it won't get lost. These functions run very fast, not like invalidating dcache. York ^ permalink raw reply [flat|nested] 4+ messages in thread
* [U-Boot] [PATCH 1/3] armv8/cache: Consolidate setting for MAIR and TCR [not found] <1392069354-24578-1-git-send-email-yorksun@freescale.com> 2014-02-10 21:58 ` [U-Boot] Fwd: [PATCH 1/3] armv8/cache: Consolidate setting for MAIR and TCR York Sun [not found] ` <1392069354-24578-3-git-send-email-yorksun@freescale.com> @ 2014-02-13 3:13 ` FengHua 2 siblings, 0 replies; 4+ messages in thread From: FengHua @ 2014-02-13 3:13 UTC (permalink / raw) To: u-boot hi York, > -----Original Messages----- > From: "York Sun" <yorksun@freescale.com> > Sent Time: 2014-02-11 05:55:52 (Tuesday) > To: albert.u.boot at aribaud.net > Cc: scottwood at freescale.com, "York Sun" <yorksun@freescale.com>, "David Feng" <fenghua@phytium.com.cn> > Subject: [PATCH 1/3] armv8/cache: Consolidate setting for MAIR and TCR > > Move setting for MAIR and TCR to cache_v8.c, to avoid conflict with > sub-architecture. > > Signed-off-by: York Sun <yorksun@freescale.com> > CC: David Feng <fenghua@phytium.com.cn> > --- > arch/arm/cpu/armv8/cache_v8.c | 22 +++++++++++++++++++--- > arch/arm/cpu/armv8/start.S | 22 ---------------------- > 2 files changed, 19 insertions(+), 25 deletions(-) > > diff --git a/arch/arm/cpu/armv8/cache_v8.c b/arch/arm/cpu/armv8/cache_v8.c > index 131fdab..7acae1b 100644 > --- a/arch/arm/cpu/armv8/cache_v8.c > +++ b/arch/arm/cpu/armv8/cache_v8.c > @@ -45,15 +45,31 @@ static void mmu_setup(void) > > /* load TTBR0 */ > el = current_el(); > - if (el == 1) > + if (el == 1) { > asm volatile("msr ttbr0_el1, %0" > : : "r" (gd->arch.tlb_addr) : "memory"); > - else if (el == 2) > + asm volatile("msr tcr_el1, %0" > + : : "r" (TCR_FLAGS | TCR_EL1_IPS_BITS) > + : "memory"); > + asm volatile("msr mair_el1, %0" > + : : "r" (MEMORY_ATTRIBUTES) : "memory"); > + } else if (el == 2) { > asm volatile("msr ttbr0_el2, %0" > : : "r" (gd->arch.tlb_addr) : "memory"); > - else > + asm volatile("msr tcr_el2, %0" > + : : "r" (TCR_FLAGS | TCR_EL2_IPS_BITS) > + : "memory"); > + asm volatile("msr mair_el2, %0" > + : : "r" (MEMORY_ATTRIBUTES) : "memory"); > + } 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"); > + } > > /* enable the mmu */ > set_sctlr(get_sctlr() | CR_M); > diff --git a/arch/arm/cpu/armv8/start.S b/arch/arm/cpu/armv8/start.S > index bcc2603..90daa4d 100644 > --- a/arch/arm/cpu/armv8/start.S > +++ b/arch/arm/cpu/armv8/start.S > @@ -128,28 +128,6 @@ ENTRY(c_runtime_cpu_setup) > isb sy > #endif > > -#ifndef CONFIG_SYS_DCACHE_OFF > - /* > - * Setup MAIR and TCR. > - */ > - ldr x0, =MEMORY_ATTRIBUTES > - ldr x1, =TCR_FLAGS > - > - switch_el x2, 3f, 2f, 1f > -3: orr x1, x1, TCR_EL3_IPS_BITS > - msr mair_el3, x0 > - msr tcr_el3, x1 > - b 0f > -2: orr x1, x1, TCR_EL2_IPS_BITS > - msr mair_el2, x0 > - msr tcr_el2, x1 > - b 0f > -1: orr x1, x1, TCR_EL1_IPS_BITS > - msr mair_el1, x0 > - msr tcr_el1, x1 > -0: > -#endif > - > /* Relocate vBAR */ > adr x0, vectors > switch_el x1, 3f, 2f, 1f > -- > 1.7.9.5 > This will be better. Acked. ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2014-02-13 17:29 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1392069354-24578-1-git-send-email-yorksun@freescale.com>
2014-02-10 21:58 ` [U-Boot] Fwd: [PATCH 1/3] armv8/cache: Consolidate setting for MAIR and TCR York Sun
[not found] ` <1392069354-24578-3-git-send-email-yorksun@freescale.com>
2014-02-10 21:58 ` [U-Boot] Fwd: [PATCH 3/3] armv8/cache: Change cache invalidate and flush function York Sun
[not found] ` <4997fa.12c4.144296ae1fc.Coremail.fenghua@phytium.com.cn>
2014-02-13 17:29 ` [U-Boot] " York Sun
2014-02-13 3:13 ` [U-Boot] [PATCH 1/3] armv8/cache: Consolidate setting for MAIR and TCR FengHua
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox