Commit 20474abd authored by Benjamin Herrenschmidt's avatar Benjamin Herrenschmidt Committed by Paul Mackerras

[POWERPC] Fix cache line vs. block size confusion

We had an historical confusion in the kernel between cache line
and cache block size. The former is an implementation detail of
the L1 cache which can be useful for performance optimisations,
the later is the actual size on which the cache control
instructions operate, which can be different.

For some reason, we had a weird hack reading the right property
on powermac and the wrong one on any other 64 bits (32 bits is
unaffected as it only uses the cputable for cache block size
infos at this stage).

This fixes the booting-without-of.txt documentation to mention
the right properties, and fixes the 64 bits initialization code
to look for the block size first, with a fallback to the line
size if the property is missing.
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent fb293ae1
...@@ -851,12 +851,18 @@ address which can extend beyond that limit. ...@@ -851,12 +851,18 @@ address which can extend beyond that limit.
/cpus/PowerPC,970FX@0 /cpus/PowerPC,970FX@0
/cpus/PowerPC,970FX@1 /cpus/PowerPC,970FX@1
(unit addresses do not require leading zeroes) (unit addresses do not require leading zeroes)
- d-cache-line-size : one cell, L1 data cache line size in bytes - d-cache-block-size : one cell, L1 data cache block size in bytes (*)
- i-cache-line-size : one cell, L1 instruction cache line size in - i-cache-block-size : one cell, L1 instruction cache block size in
bytes bytes
- d-cache-size : one cell, size of L1 data cache in bytes - d-cache-size : one cell, size of L1 data cache in bytes
- i-cache-size : one cell, size of L1 instruction cache in bytes - i-cache-size : one cell, size of L1 instruction cache in bytes
(*) The cache "block" size is the size on which the cache management
instructions operate. Historically, this document used the cache
"line" size here which is incorrect. The kernel will prefer the cache
block size and will fallback to cache line size for backward
compatibility.
Recommended properties: Recommended properties:
- timebase-frequency : a cell indicating the frequency of the - timebase-frequency : a cell indicating the frequency of the
...@@ -870,6 +876,10 @@ address which can extend beyond that limit. ...@@ -870,6 +876,10 @@ address which can extend beyond that limit.
for the above, the common code doesn't use that property, but for the above, the common code doesn't use that property, but
you are welcome to re-use the pSeries or Maple one. A future you are welcome to re-use the pSeries or Maple one. A future
kernel version might provide a common function for this. kernel version might provide a common function for this.
- d-cache-line-size : one cell, L1 data cache line size in bytes
if different from the block size
- i-cache-line-size : one cell, L1 instruction cache line size in
bytes if different from the block size
You are welcome to add any property you find relevant to your board, You are welcome to add any property you find relevant to your board,
like some information about the mechanism used to soft-reset the like some information about the mechanism used to soft-reset the
......
...@@ -291,23 +291,16 @@ static void __init initialize_cache_info(void) ...@@ -291,23 +291,16 @@ static void __init initialize_cache_info(void)
if ( num_cpus == 1 ) { if ( num_cpus == 1 ) {
const u32 *sizep, *lsizep; const u32 *sizep, *lsizep;
u32 size, lsize; u32 size, lsize;
const char *dc, *ic;
/* Then read cache informations */
if (machine_is(powermac)) {
dc = "d-cache-block-size";
ic = "i-cache-block-size";
} else {
dc = "d-cache-line-size";
ic = "i-cache-line-size";
}
size = 0; size = 0;
lsize = cur_cpu_spec->dcache_bsize; lsize = cur_cpu_spec->dcache_bsize;
sizep = of_get_property(np, "d-cache-size", NULL); sizep = of_get_property(np, "d-cache-size", NULL);
if (sizep != NULL) if (sizep != NULL)
size = *sizep; size = *sizep;
lsizep = of_get_property(np, dc, NULL); lsizep = of_get_property(np, "d-cache-block-size", NULL);
/* fallback if block size missing */
if (lsizep == NULL)
lsizep = of_get_property(np, "d-cache-line-size", NULL);
if (lsizep != NULL) if (lsizep != NULL)
lsize = *lsizep; lsize = *lsizep;
if (sizep == 0 || lsizep == 0) if (sizep == 0 || lsizep == 0)
...@@ -324,7 +317,9 @@ static void __init initialize_cache_info(void) ...@@ -324,7 +317,9 @@ static void __init initialize_cache_info(void)
sizep = of_get_property(np, "i-cache-size", NULL); sizep = of_get_property(np, "i-cache-size", NULL);
if (sizep != NULL) if (sizep != NULL)
size = *sizep; size = *sizep;
lsizep = of_get_property(np, ic, NULL); lsizep = of_get_property(np, "i-cache-block-size", NULL);
if (lsizep == NULL)
lsizep = of_get_property(np, "i-cache-line-size", NULL);
if (lsizep != NULL) if (lsizep != NULL)
lsize = *lsizep; lsize = *lsizep;
if (sizep == 0 || lsizep == 0) if (sizep == 0 || lsizep == 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment