diff mbox

[U-Boot,1/2,V4] arm926: Flush the data cache before disabling it

Message ID 1326549779-16475-1-git-send-email-urwithsughosh@gmail.com
State Accepted
Headers show

Commit Message

Sughosh Ganu Jan. 14, 2012, 2:02 p.m. UTC
The current implementation invalidates the cache instead of flushing
it. This causes problems on platforms where the spl/u-boot is already
loaded to the RAM, with caches enabled by a first stage bootloader.

Also fix the comments to match code.

Signed-off-by: Sughosh Ganu <urwithsughosh@gmail.com>
Cc: Albert Aribaud <albert.u.boot@aribaud.net>
Cc: Tom Rini <trini@ti.com>
---

Changes since V3
* Removed tampering of the V bit setting. Would be done in a separate
  patch on the lines of review comments by Albert.

Changes since V2
* Added code to invalidate I cache, based on review comment by Aneesh.
* Fixed comments to match the code.

Changes since V1
* Added arm926 keyword to the subject line
* Removed the superfluous setting of r0.
* Fixed the comment to reflect the fact that V is not being cleared

 arch/arm/cpu/arm926ejs/start.S |   12 ++++++++----
 1 files changed, 8 insertions(+), 4 deletions(-)

Comments

Albert ARIBAUD Feb. 18, 2012, 3:41 p.m. UTC | #1
Hi Sughosh,

Le 14/01/2012 15:02, Sughosh Ganu a écrit :
> The current implementation invalidates the cache instead of flushing
> it. This causes problems on platforms where the spl/u-boot is already
> loaded to the RAM, with caches enabled by a first stage bootloader.
>
> Also fix the comments to match code.
>
> Signed-off-by: Sughosh Ganu<urwithsughosh@gmail.com>
> Cc: Albert Aribaud<albert.u.boot@aribaud.net>
> Cc: Tom Rini<trini@ti.com>
> ---
>
> Changes since V3
> * Removed tampering of the V bit setting. Would be done in a separate
>    patch on the lines of review comments by Albert.
>
> Changes since V2
> * Added code to invalidate I cache, based on review comment by Aneesh.
> * Fixed comments to match the code.
>
> Changes since V1
> * Added arm926 keyword to the subject line
> * Removed the superfluous setting of r0.
> * Fixed the comment to reflect the fact that V is not being cleared
>
>   arch/arm/cpu/arm926ejs/start.S |   12 ++++++++----
>   1 files changed, 8 insertions(+), 4 deletions(-)
>
> diff --git a/arch/arm/cpu/arm926ejs/start.S b/arch/arm/cpu/arm926ejs/start.S
> index 6a09c02..d64165a 100644
> --- a/arch/arm/cpu/arm926ejs/start.S
> +++ b/arch/arm/cpu/arm926ejs/start.S
> @@ -355,14 +355,18 @@ _dynsym_start_ofs:
>    */
>   cpu_init_crit:
>   	/*
> -	 * flush v4 I/D caches
> +	 * flush D cache before disabling it
>   	 */
>   	mov	r0, #0
> -	mcr	p15, 0, r0, c7, c7, 0	/* flush v3/v4 cache */
> -	mcr	p15, 0, r0, c8, c7, 0	/* flush v4 TLB */

Please add a comment explaining what the loop is waiting for exactly:

> +flush_dcache:
> +	mrc	p15, 0, r15, c7, c10, 3
> +	bne	flush_dcache

> +
> +	mcr	p15, 0, r0, c8, c7, 0	/* invalidate TLB */
> +	mcr	p15, 0, r0, c7, c5, 0	/* invalidate I Cache */
>
>   	/*
> -	 * disable MMU stuff and caches
> +	 * disable MMU and D cache, and enable I cache.
>   	 */
>   	mrc	p15, 0, r0, c1, c0, 0
>   	bic	r0, r0, #0x00002300	/* clear bits 13, 9:8 (--V- --RS) */

Amicalement,
Christian Riesch Feb. 18, 2012, 6:51 p.m. UTC | #2
Hi Albert,

On Saturday, February 18, 2012, Albert ARIBAUD <albert.u.boot@aribaud.net>
wrote:
> Le 14/01/2012 15:02, Sughosh Ganu a écrit :
>>
>> The current implementation invalidates the cache instead of flushing
>> it. This causes problems on platforms where the spl/u-boot is already
>> loaded to the RAM, with caches enabled by a first stage bootloader.
>>
>> Also fix the comments to match code.
>>
>> Signed-off-by: Sughosh Ganu<urwithsughosh@gmail.com>
>> Cc: Albert Aribaud<albert.u.boot@aribaud.net>
>> Cc: Tom Rini<trini@ti.com>
>> ---
>>
>> Changes since V3
>> * Removed tampering of the V bit setting. Would be done in a separate
>>   patch on the lines of review comments by Albert.
>>
>> Changes since V2
>> * Added code to invalidate I cache, based on review comment by Aneesh.
>> * Fixed comments to match the code.
>>
>> Changes since V1
>> * Added arm926 keyword to the subject line
>> * Removed the superfluous setting of r0.
>> * Fixed the comment to reflect the fact that V is not being cleared
>>
>>  arch/arm/cpu/arm926ejs/start.S |   12 ++++++++----
>>  1 files changed, 8 insertions(+), 4 deletions(-)
>>
>> diff --git a/arch/arm/cpu/arm926ejs/start.S
b/arch/arm/cpu/arm926ejs/start.S
>> index 6a09c02..d64165a 100644
>> --- a/arch/arm/cpu/arm926ejs/start.S
>> +++ b/arch/arm/cpu/arm926ejs/start.S
>> @@ -355,14 +355,18 @@ _dynsym_start_ofs:
>>   */
>>  cpu_init_crit:
>>        /*
>> -        * flush v4 I/D caches
>> +        * flush D cache before disabling it
>>         */
>>        mov     r0, #0
>> -       mcr     p15, 0, r0, c7, c7, 0   /* flush v3/v4 cache */
>> -       mcr     p15, 0, r0, c8, c7, 0   /* flush v4 TLB */
>
> Please add a comment explaining what the loop is waiting for exactly:
>
>> +flush_dcache:
>> +       mrc     p15, 0, r15, c7, c10, 3
>> +       bne     flush_dcache

That's the flush dcache code that is given in ARM's TRM for the 926ejs.
Anyway, that's already in mainline. Shall we prepare a patch that adds a
comment?

Regards, Christian
Albert ARIBAUD Feb. 19, 2012, 8:31 a.m. UTC | #3
Hi Christian,

Le 18/02/2012 19:51, Christian Riesch a écrit :
> Hi Albert,
>
> On Saturday, February 18, 2012, Albert ARIBAUD<albert.u.boot@aribaud.net>
> wrote:
>> Le 14/01/2012 15:02, Sughosh Ganu a écrit :
>>>
>>> The current implementation invalidates the cache instead of flushing
>>> it. This causes problems on platforms where the spl/u-boot is already
>>> loaded to the RAM, with caches enabled by a first stage bootloader.
>>>
>>> Also fix the comments to match code.
>>>
>>> Signed-off-by: Sughosh Ganu<urwithsughosh@gmail.com>
>>> Cc: Albert Aribaud<albert.u.boot@aribaud.net>
>>> Cc: Tom Rini<trini@ti.com>
>>> ---
>>>
>>> Changes since V3
>>> * Removed tampering of the V bit setting. Would be done in a separate
>>>    patch on the lines of review comments by Albert.
>>>
>>> Changes since V2
>>> * Added code to invalidate I cache, based on review comment by Aneesh.
>>> * Fixed comments to match the code.
>>>
>>> Changes since V1
>>> * Added arm926 keyword to the subject line
>>> * Removed the superfluous setting of r0.
>>> * Fixed the comment to reflect the fact that V is not being cleared
>>>
>>>   arch/arm/cpu/arm926ejs/start.S |   12 ++++++++----
>>>   1 files changed, 8 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/arch/arm/cpu/arm926ejs/start.S
> b/arch/arm/cpu/arm926ejs/start.S
>>> index 6a09c02..d64165a 100644
>>> --- a/arch/arm/cpu/arm926ejs/start.S
>>> +++ b/arch/arm/cpu/arm926ejs/start.S
>>> @@ -355,14 +355,18 @@ _dynsym_start_ofs:
>>>    */
>>>   cpu_init_crit:
>>>         /*
>>> -        * flush v4 I/D caches
>>> +        * flush D cache before disabling it
>>>          */
>>>         mov     r0, #0
>>> -       mcr     p15, 0, r0, c7, c7, 0   /* flush v3/v4 cache */
>>> -       mcr     p15, 0, r0, c8, c7, 0   /* flush v4 TLB */
>>
>> Please add a comment explaining what the loop is waiting for exactly:
>>
>>> +flush_dcache:
>>> +       mrc     p15, 0, r15, c7, c10, 3
>>> +       bne     flush_dcache
>
> That's the flush dcache code that is given in ARM's TRM for the 926ejs.

Just because it comes from official ARM documentation does not make it 
understandable to new readers of the code. :)

> Anyway, that's already in mainline. Shall we prepare a patch that adds a
> comment?

Sorry, I missed the fact it'd gone in already. No, that's ok, I'll just 
complain again, and earlier, when the file is next touched.

> Regards, Christian

Amicalement,
diff mbox

Patch

diff --git a/arch/arm/cpu/arm926ejs/start.S b/arch/arm/cpu/arm926ejs/start.S
index 6a09c02..d64165a 100644
--- a/arch/arm/cpu/arm926ejs/start.S
+++ b/arch/arm/cpu/arm926ejs/start.S
@@ -355,14 +355,18 @@  _dynsym_start_ofs:
  */
 cpu_init_crit:
 	/*
-	 * flush v4 I/D caches
+	 * flush D cache before disabling it
 	 */
 	mov	r0, #0
-	mcr	p15, 0, r0, c7, c7, 0	/* flush v3/v4 cache */
-	mcr	p15, 0, r0, c8, c7, 0	/* flush v4 TLB */
+flush_dcache:
+	mrc	p15, 0, r15, c7, c10, 3
+	bne	flush_dcache
+
+	mcr	p15, 0, r0, c8, c7, 0	/* invalidate TLB */
+	mcr	p15, 0, r0, c7, c5, 0	/* invalidate I Cache */
 
 	/*
-	 * disable MMU stuff and caches
+	 * disable MMU and D cache, and enable I cache.
 	 */
 	mrc	p15, 0, r0, c1, c0, 0
 	bic	r0, r0, #0x00002300	/* clear bits 13, 9:8 (--V- --RS) */