public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Nishanth Menon <nm@ti.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH V2 7/9] ARM: OMAP3: Introduce OMAP3 Cortex-A8 revision specific errata
Date: Wed, 25 Feb 2015 13:49:52 -0600	[thread overview]
Message-ID: <54EE2760.5010502@ti.com> (raw)
In-Reply-To: <1424862954.2460.14.camel@collins>

On 02/25/2015 05:15 AM, Paul Kocialkowski wrote:
> Le mardi 24 f?vrier 2015 ? 16:57 -0600, Nishanth Menon a ?crit :
>> 430973: Stale prediction on replaced inter working branch causes
>> 	Cortex-A8 to execute in the wrong ARM/Thumb state
>> Impacts: Everything lower than r2p1
>> Work around: Set IBE to 1
> 
> According to the Linux kernel source, this should only affect r1p*
> (hence, not r2p0):
> https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/mm/proc-v7.S#n321

I did look at the official Cortex-A8 errata doc (I think this is under
NDA at least under TI).. Doc revision 20.0

This has a "Errata Summary Table" where "X" indicates the revision
impacted. As per that, I see:
r1p1, r1p2, r1p3, r1p7 impacted. the first not impacted is r2p1.

Hence the cmp r3, #0x21	(and orrlt).

Can someone from ARM ltd comment if there could be a better
implementation? I will post a V3 based on latest documentation on my hand.

> 
>> 454179: Stale prediction may inhibit target address misprediction on
>> 	next predicted taken branch
>> Impacts: Everything lower than r2p1
>> Work around:  Set IBE and disable branch size mispredict to 1
>>
>> 621766: Under a specific set of conditions, executing a sequence of
>> 	NEON or vfp load instructions can cause processor deadlock
>> Impacts: Everything lower than r2p1
>> Work around: Set L1NEON to 1
> 
> Erratum 458693 also sets L1NEON bit and is said to only affect r2p0
> according to the Linux kernel source:
> https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/mm/proc-v7.S#n321
> 
> I'm not sure this is relevant (different erratum but similar
> workaround), but it seems odd to me.
> 
>> Since the OMAP3 generation of processors have a wide variety of CPU
>> revisions, it is more logical to enforce an implementation using
>> revision checks.
> 
> Anyways, this worked just fine on my omap3630 device (> r2p1) and didn't
> trigger the errata workarounds. I reckon someone would have to test on a
> device that does require those workarounds (e.g. omap35xx).
> 
>> Signed-off-by: Nishanth Menon <nm@ti.com>
>> ---
>>  README                                      |    3 +++
>>  arch/arm/cpu/armv7/omap3/board.c            |    2 +-
>>  arch/arm/cpu/armv7/omap3/lowlevel_init.S    |   37 +++++++++++++++++++++++++++
>>  arch/arm/include/asm/arch-omap3/sys_proto.h |    1 +
>>  4 files changed, 42 insertions(+), 1 deletion(-)
>>
>> diff --git a/README b/README
>> index d76cdc68d406..f309e27bbd02 100644
>> --- a/README
>> +++ b/README
>> @@ -625,6 +625,9 @@ The following options need to be configured:
>>  		with CONFIG_ARM_ARCH_CP15_ERRATA define. These need to have an
>>  		SoC specific implementation of the erratum workaround to
>>  		function.
>> +		CONFIG_ARM_ERRATA_430973
>> +		CONFIG_ARM_ERRATA_454179
>> +		CONFIG_ARM_ERRATA_621766
>>  		CONFIG_ARM_ERRATA_798870
>>  
>>  - Driver Model
>> diff --git a/arch/arm/cpu/armv7/omap3/board.c b/arch/arm/cpu/armv7/omap3/board.c
>> index 51abc4b09e36..7ce30949a6c6 100644
>> --- a/arch/arm/cpu/armv7/omap3/board.c
>> +++ b/arch/arm/cpu/armv7/omap3/board.c
>> @@ -408,7 +408,7 @@ static void omap3_emu_romcode_call(u32 service_id, u32 *parameters)
>>  	do_omap3_emu_romcode_call(service_id, OMAP3_PUBLIC_SRAM_SCRATCH_AREA);
>>  }
>>  
>> -static void omap3_update_aux_cr_secure(u32 set_bits, u32 clear_bits)
>> +void omap3_update_aux_cr_secure(u32 set_bits, u32 clear_bits)
>>  {
>>  	u32 acr;
>>  
>> diff --git a/arch/arm/cpu/armv7/omap3/lowlevel_init.S b/arch/arm/cpu/armv7/omap3/lowlevel_init.S
>> index 84591b8b5bab..b8e6ebccd4e7 100644
>> --- a/arch/arm/cpu/armv7/omap3/lowlevel_init.S
>> +++ b/arch/arm/cpu/armv7/omap3/lowlevel_init.S
>> @@ -48,6 +48,43 @@ ENTRY(do_omap3_emu_romcode_call)
>>  	POP {r4-r12, pc}
>>  ENDPROC(do_omap3_emu_romcode_call)
>>  
>> +#ifdef CONFIG_ARM_ARCH_CP15_ERRATA
>> +	.globl  arch_cp15_errata_workaround
>> +/*
>> + * R0 has MIDR
>> + * R1 has CPU Variant (bits 20-23)
>> + * R2 has CPU Revision (bits 0-3)
>> + * R3 is compbined CPU variant << 4 + CPU revision
>> + */
>> +ENTRY(arch_cp15_errata_workaround)
>> +	push    {r4-r12, lr}		@ save registers - ROM code may pollute
>> +
>> +	mov r0, #0			@ Nothing to set in ACR
>> +	mov r1, #0			@ Nothing to clear in ACR
>> +
>> +#ifdef CONFIG_ARM_ERRATA_454179
>> +	cmp r3, #0x21			@ Only on < r2p1
>> +	orrlt r0, r0, #(0x3 << 6)	@ Set DBSM(BIT7) and IBE(BIT6) bits
>> +#endif
>> +
>> +#ifdef CONFIG_ARM_ERRATA_430973
>> +	cmp r3, #0x21			@ Only on < r2p1
>> +	orrlt r0, r0, #(0x1 << 6)	@ Set IBE bit
>> +#endif
>> +
>> +#ifdef CONFIG_ARM_ERRATA_621766
>> +	cmp r3, #0x21			@ Only on < r2p1
>> +	orrlt r0, r0, #(0x1 << 5)	@ Set L1NEON bit
>> +#endif
>> +
>> +	add r2, r1, r0
>> +	teq r2, #0			@ See if nothing to set or clear
>> +	bne	omap3_update_aux_cr_secure	@update as per ROM code configuration needs
>> +
>> +	pop     {r4-r12, pc}		@restore the registers back.
>> +ENDPROC(arch_cp15_errata_workaround)
>> +#endif
>> +
>>  #if !defined(CONFIG_SYS_NAND_BOOT) && !defined(CONFIG_SYS_NAND_BOOT)
>>  /**************************************************************************
>>   * cpy_clk_code: relocates clock code into SRAM where its safer to execute
>> diff --git a/arch/arm/include/asm/arch-omap3/sys_proto.h b/arch/arm/include/asm/arch-omap3/sys_proto.h
>> index c06605d533d3..56126fe8e863 100644
>> --- a/arch/arm/include/asm/arch-omap3/sys_proto.h
>> +++ b/arch/arm/include/asm/arch-omap3/sys_proto.h
>> @@ -74,5 +74,6 @@ void dieid_num_r(void);
>>  void get_dieid(u32 *id);
>>  void do_omap3_emu_romcode_call(u32 service_id, u32 parameters);
>>  void omap_smc1(u32 service, u32 val);
>> +void omap3_update_aux_cr_secure(u32 set_bits, u32 clear_bits);
>>  u32 warm_reset(void);
>>  #endif
> 


-- 
Regards,
Nishanth Menon

  reply	other threads:[~2015-02-25 19:49 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-24 22:57 [U-Boot] [PATCH V2 0/9] ARM: OMAP3-DRA7: CP15 erratum workarounds and improvements Nishanth Menon
2015-02-24 22:57 ` [U-Boot] [PATCH V2 1/9] ARM: OMAP: Change set_pl310_ctrl_reg to be generic Nishanth Menon
2015-02-24 22:57 ` [U-Boot] [PATCH V2 2/9] ARM: OMAP3: Rename omap3.h to omap.h to be generic as all SoCs Nishanth Menon
2015-02-25 11:02   ` Paul Kocialkowski
2015-02-25 17:53     ` Nishanth Menon
2015-02-24 22:57 ` [U-Boot] [PATCH V2 3/9] ARM: OMAP3: Get rid of omap3_gp_romcode_call and replace with omap_smc1 Nishanth Menon
2015-02-25 11:06   ` Paul Kocialkowski
2015-02-24 22:57 ` [U-Boot] [PATCH V2 4/9] ARM: Provide a mechanism to invoke SoC specific errata WA for CP15 Nishanth Menon
2015-02-24 22:57 ` [U-Boot] [PATCH V2 5/9] ARM: DRA7 / OMAP5: Add workaround for ARM errata 798870 Nishanth Menon
2015-02-24 22:57 ` [U-Boot] [PATCH V2 6/9] configs: ti_omap5_common: Enable " Nishanth Menon
2015-02-24 22:57 ` [U-Boot] [PATCH V2 7/9] ARM: OMAP3: Introduce OMAP3 Cortex-A8 revision specific errata Nishanth Menon
2015-02-25 11:15   ` Paul Kocialkowski
2015-02-25 19:49     ` Nishanth Menon [this message]
2015-03-03  7:30       ` Siarhei Siamashka
2015-02-24 22:57 ` [U-Boot] [PATCH V2 8/9] configs: ti_omap3_common: Enable workaround for ARM errata 454179, 430973, 621766 Nishanth Menon
2015-02-25 11:19   ` Paul Kocialkowski
2015-02-25 11:31     ` Igor Grinberg
2015-02-25 12:27       ` Paul Kocialkowski
2015-02-25 14:32         ` menon.nishanth at gmail.com
2015-02-25 21:23           ` Paul Kocialkowski
2015-02-26  5:11             ` Nishanth Menon
2015-02-27 19:27               ` Paul Kocialkowski
2015-02-24 22:57 ` [U-Boot] [PATCH V2 9/9] ARM: OMAP5 / DRA7: Setup L2 Aux Control Register with recommended configuration Nishanth Menon

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=54EE2760.5010502@ti.com \
    --to=nm@ti.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox