// SPDX-License-Identifier: GPL-2.0-only
/*
* arch / sh / mm / cache - sh3 . c
*
* Copyright ( C ) 1999 , 2000 Niibe Yutaka
* Copyright ( C ) 2002 Paul Mundt
*/
#include <linux/init.h>
#include <linux/mman.h>
#include <linux/mm.h>
#include <linux/threads.h>
#include <asm /addrspace.h>
#include <asm /page.h>
#include <asm /processor.h>
#include <asm /cache.h>
#include <asm /io.h>
#include <linux/uaccess.h>
#include <asm /mmu_context.h>
#include <asm /cacheflush.h>
/*
* Write back the dirty D - caches , but not invalidate them .
*
* Is this really worth it , or should we just alias this routine
* to _ _ flush_purge_region too ?
*
* START : Virtual Address ( U0 , P1 , or P3 )
* SIZE : Size of the region .
*/
static void sh3__flush_wback_region(void *start, int size)
{
unsigned long v, j;
unsigned long begin, end;
unsigned long flags;
begin = (unsigned long )start & ~(L1_CACHE_BYTES-1 );
end = ((unsigned long )start + size + L1_CACHE_BYTES-1 )
& ~(L1_CACHE_BYTES-1 );
for (v = begin; v < end; v+=L1_CACHE_BYTES) {
unsigned long addrstart = CACHE_OC_ADDRESS_ARRAY;
for (j = 0 ; j < current_cpu_data.dcache.ways; j++) {
unsigned long data, addr, p;
p = __pa(v);
addr = addrstart | (v & current_cpu_data.dcache.entry_mask);
local_irq_save(flags);
data = __raw_readl(addr);
if ((data & CACHE_PHYSADDR_MASK) ==
(p & CACHE_PHYSADDR_MASK)) {
data &= ~SH_CACHE_UPDATED;
__raw_writel(data, addr);
local_irq_restore(flags);
break ;
}
local_irq_restore(flags);
addrstart += current_cpu_data.dcache.way_incr;
}
}
}
/*
* Write back the dirty D - caches and invalidate them .
*
* START : Virtual Address ( U0 , P1 , or P3 )
* SIZE : Size of the region .
*/
static void sh3__flush_purge_region(void *start, int size)
{
unsigned long v;
unsigned long begin, end;
begin = (unsigned long )start & ~(L1_CACHE_BYTES-1 );
end = ((unsigned long )start + size + L1_CACHE_BYTES-1 )
& ~(L1_CACHE_BYTES-1 );
for (v = begin; v < end; v+=L1_CACHE_BYTES) {
unsigned long data, addr;
data = (v & 0 xfffffc00); /* _Virtual_ address, ~U, ~V */
addr = CACHE_OC_ADDRESS_ARRAY |
(v & current_cpu_data.dcache.entry_mask) | SH_CACHE_ASSOC;
__raw_writel(data, addr);
}
}
void __init sh3_cache_init(void )
{
__flush_wback_region = sh3__flush_wback_region;
__flush_purge_region = sh3__flush_purge_region;
/*
* No write back please
*
* Except I don ' t think there ' s any way to avoid the writeback .
* So we just alias it to sh3__flush_purge_region ( ) . dwmw2 .
*/
__flush_invalidate_region = sh3__flush_purge_region;
}
Messung V0.5 in Prozent C=95 H=57 G=78
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-09-29)
¤
*© Formatika GbR, Deutschland