views:

1019

answers:

5

In our embedded system (using a PowerPC processor), we want to disable the processor cache. What steps do we need to take?

To clarify a bit, the application in question must have as constant a speed of execution as we can make it. Variability in executing the same code path is not acceptable. This is the reason to turn off the cache.

+1  A: 

From the E600 reference manual:
The HID0 special-purpose register contains several bits that invalidate, disable, and lock the instruction and data caches.

You should use HID0[DCE] = 0 to disable the data cache.
You should use HID0[ICE] = 0 to disable the instruction cache.

Note that at power up, both caches are disabled. You will need to write this in assembly code.

Benoit
You can't SAFELY disable the caches simply as described. You must make sure that they are empty of ALL dirty data first! - That is, you must first write-back all dirty data to memory BEFORE disabling.
Tall Jeff
The PowerPC reference manual for your particular core version tells you what sequences to use to write back all the dirty data in the cache before disabling them.
Tall Jeff
Good Point! The question was originally in the context of running disabled from power up. Thus, there would not be any dirty cache lines. When switching on the fly, you must first flush the cache indeed!
Benoit
A: 

Perhaps you don't want to globally disable cache, you only want to disable it for a particular address range?

On some processors you can configure TLB (translation lookaside buffer) entries for address ranges such that each range could have caching enabled or disabled. This way you can disable caching for memory mapped I/O, and still leave caching on for the main block of RAM.

The only PowerPC I've done this on was a PowerPC 440EP (from IBM, then AMCC), so I don't know if all PowerPCs work the same way.

KeyserSoze
A: 

What kind of PPC core is it? The cache control is very different between different cores from different vendors... also, disabling the cache is in general considered a really bad thing to do to the machine. Performance becomes so crawlingly slow that you would do as well with an old 8-bit processor (exaggerating a bit). Some ARM variants have TCMs, tightly-coupled memories, that work instead of caches, but I am not aware of any PPC variant with that facility.

Maybe a better solution is to keep Level 1 caches active, and use the on-chip L2 caches as statically mapped RAM instead? That is common on modern PowerQUICC devices, at least.

jakobengblom2
I completely agree that you need a reason for this and shouldn't do it on a whim.
Benoit
+2  A: 

I'm kind of late to the question, and also it's been a while since I did all the low-level processor init code on PPCs, but I seem to remember the cache & MMU being pretty tightly coupled (one had to be enabled to enable the other) and I think in the MMU page tables, you could define the cacheable attribute.

So my point is this: if there's a certain subset of code that must run in deterministic time, maybe you locate that code (via a linker command file) in a region of memory that is defined as non-cacheable in the page tables? That way all the code that can/should benefit from the cache does, and the (hopefully) subset of code that shouldn't, doesn't.

I'd handle it this way anyway, so that later, if you want to enable caching for part of the system, you just need to flip a few bits in the MMU page tables, instead of (re-)writing the init code to set up all the page tables & caching.

Dan
A: 

Turning off the cache will do you no good at all. Your execution speed will drop by an order of magnitude. You would never ship a system like this, so its performance under these conditions is of no interest.

To achieve a steady execution speed, consider one of these approaches:

1) Lock some or all of the cache. All current PowerPC chips from Freescale, IBM, and AMCC offer this feature.

2) If it's a Freescale chip with L2 cache, consider mapping part of that cache as on-chip memory.