All of lore.kernel.org
 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 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.