diff mbox

ARM: LPAE: initialize cachepolicy correctly

Message ID 20160904053331.7264-1-stefan@agner.ch (mailing list archive)
State New, archived
Headers show

Commit Message

Stefan Agner Sept. 4, 2016, 5:33 a.m. UTC
The cachepolicy variable gets initialized using a masked pmd
So far, the pmd has been masked with flags valid for the 2-page
table format. In the LPAE case, this lead to a wrong assumption
of what the initial cachepolicy has been used. Later a check
forces the cache policy to writealloc and prints the following
warning:
Forcing write-allocate cache policy for SMP

This patch uses PMD_SECT_WBWA to mask all cache setting flags.
The define represents the complete mask of the cache relevant
flags for both page table formats.

Signed-off-by: Stefan Agner <stefan@agner.ch>
---
 arch/arm/mm/mmu.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Russell King (Oracle) Sept. 4, 2016, 10:09 p.m. UTC | #1
On Sat, Sep 03, 2016 at 10:33:31PM -0700, Stefan Agner wrote:
> The cachepolicy variable gets initialized using a masked pmd
> So far, the pmd has been masked with flags valid for the 2-page
> table format. In the LPAE case, this lead to a wrong assumption
> of what the initial cachepolicy has been used. Later a check
> forces the cache policy to writealloc and prints the following
> warning:
> Forcing write-allocate cache policy for SMP
> 
> This patch uses PMD_SECT_WBWA to mask all cache setting flags.
> The define represents the complete mask of the cache relevant
> flags for both page table formats.

PMD_SECT_WBWA is just one possible combination, it's not a bit-mask.
We need a new definition.
Stefan Agner Sept. 4, 2016, 11:31 p.m. UTC | #2
On 2016-09-04 15:09, Russell King - ARM Linux wrote:
> On Sat, Sep 03, 2016 at 10:33:31PM -0700, Stefan Agner wrote:
>> The cachepolicy variable gets initialized using a masked pmd
>> So far, the pmd has been masked with flags valid for the 2-page
>> table format. In the LPAE case, this lead to a wrong assumption
>> of what the initial cachepolicy has been used. Later a check
>> forces the cache policy to writealloc and prints the following
>> warning:
>> Forcing write-allocate cache policy for SMP
>>
>> This patch uses PMD_SECT_WBWA to mask all cache setting flags.
>> The define represents the complete mask of the cache relevant
>> flags for both page table formats.
> 
> PMD_SECT_WBWA is just one possible combination, it's not a bit-mask.
> We need a new definition.

Agreed, it just happens to be the same as the bit-mask in both
page-table layouts.

Does PMD_SECT_CACHE_MASK sounds like a reasonable identifier for it?

--
Stefan
Russell King (Oracle) Sept. 5, 2016, 4:22 p.m. UTC | #3
On Sun, Sep 04, 2016 at 04:31:40PM -0700, Stefan Agner wrote:
> On 2016-09-04 15:09, Russell King - ARM Linux wrote:
> > On Sat, Sep 03, 2016 at 10:33:31PM -0700, Stefan Agner wrote:
> >> The cachepolicy variable gets initialized using a masked pmd
> >> So far, the pmd has been masked with flags valid for the 2-page
> >> table format. In the LPAE case, this lead to a wrong assumption
> >> of what the initial cachepolicy has been used. Later a check
> >> forces the cache policy to writealloc and prints the following
> >> warning:
> >> Forcing write-allocate cache policy for SMP
> >>
> >> This patch uses PMD_SECT_WBWA to mask all cache setting flags.
> >> The define represents the complete mask of the cache relevant
> >> flags for both page table formats.
> > 
> > PMD_SECT_WBWA is just one possible combination, it's not a bit-mask.
> > We need a new definition.
> 
> Agreed, it just happens to be the same as the bit-mask in both
> page-table layouts.
> 
> Does PMD_SECT_CACHE_MASK sounds like a reasonable identifier for it?

Yep, thanks.
diff mbox

Patch

diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
index 724d6be..241e5e2 100644
--- a/arch/arm/mm/mmu.c
+++ b/arch/arm/mm/mmu.c
@@ -137,7 +137,7 @@  void __init init_default_cache_policy(unsigned long pmd)
 
 	initial_pmd_value = pmd;
 
-	pmd &= PMD_SECT_TEX(1) | PMD_SECT_BUFFERABLE | PMD_SECT_CACHEABLE;
+	pmd &= PMD_SECT_WBWA;
 
 	for (i = 0; i < ARRAY_SIZE(cache_policies); i++)
 		if (cache_policies[i].pmd == pmd) {