[U-Boot] [PATCH] lib_ppc: rework the flush_cache

Scott Wood scottwood at freescale.com
Wed Dec 3 17:33:28 CET 2008


Liu Dave wrote:
> The lib_ppc version basically is as below.
> void flush_cache (ulong start_addr, ulong size)
> {
> 	ulong addr, end_addr = start_addr + size;
> 	addr = start_addr & (CONFIG_SYS_CACHELINE_SIZE - 1);
> 	for (addr = start_addr; addr < end_addr; addr += CONFIG_SYS_CACHELINE_SIZE) {
> 		asm ("dcbst 0,%0": :"r" (addr));
> 	}
> }
> 
> so, you are not completely right, the flush is from start_addr.

Ah, right, the first addr assignment is just dead code.

>>> +	start = start_addr & ~(CONFIG_SYS_CACHELINE_SIZE - 1);
>>> +	end = (start_addr + size) & ~(CONFIG_SYS_CACHELINE_SIZE - 1);
>> end = start_addr + size - 1;
>>
>> The rounding is unnecessary for end, and without the - 1, if 
>> start_addr + size is on a cacheline boundary, you'll flush one
>> cache line too many (which might not be mapped, or might cause end
>> to wrap around to zero if flushing at the end of the address
>> space).
>>
> 
> I don't see what is the problem in my patch at here.

start_addr = 0
size = 0x1000

start will be 0
end will be 0x1000

The loop will flush the cache line at 0x1000, because it uses <= rather 
than <.  That is outside the area that was requested to be flushed. 
Maybe it's not mapped.  Or, maybe start + size = 0 and nothing gets flushed.

-Scott


More information about the U-Boot mailing list