Skip to content

Commit

Permalink
sh: Drop associative writes for SH-4 cache flushes.
Browse files Browse the repository at this point in the history
When flushing/invalidating the icache/dcache via the memory-mapped IC/OC
address arrays, the associative bit should only be used in conjunction with
virtual addresses. However, we currently flush cache lines based on physical
address, so stop using the associative bit.

It is a better strategy to use non-associative writes (and physical tags) for
flushing the caches anyway, because flushing by virtual address (as with the
A-bit set) requires a valid TLB entry for that virtual address. If one does not
exist in the TLB no exception is generated and the flush is silently ignored.

This is also future-proofing for SH-4A parts which are gradually phasing out
associative writes to the cache array due to the aforementioned case of certain
flushes silently turning in to nops.

Signed-off-by: Matt Fleming <matt@console-pimps.org>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
  • Loading branch information
Matt Fleming authored and Paul Mundt committed Dec 4, 2009
1 parent 7e01c94 commit a781d1e
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions arch/sh/mm/cache-sh4.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ static inline void flush_cache_one(unsigned long start, unsigned long phys)
exec_offset = cached_to_uncached;

local_irq_save(flags);
__flush_cache_one(start | SH_CACHE_ASSOC, phys, exec_offset);
__flush_cache_one(start, phys, exec_offset);
local_irq_restore(flags);
}

Expand All @@ -123,7 +123,7 @@ static void sh4_flush_dcache_page(void *arg)

/* Loop all the D-cache */
n = boot_cpu_data.dcache.n_aliases;
for (i = 0; i <= n; i++, addr += PAGE_SIZE)
for (i = 0; i < n; i++, addr += PAGE_SIZE)
flush_cache_one(addr, phys);
}

Expand Down

0 comments on commit a781d1e

Please sign in to comment.