Now that we have all the necessary information available we can build the L1 cache shape info to be passed down to userspace via the ELF AUX vectors.
Signed-off-by: Benjamin Herrenschmidt <b...@kernel.crashing.org> --- arch/powerpc/kernel/setup_64.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index d36b6f4..2079e2e 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c @@ -382,6 +382,34 @@ void smp_release_cpus(void) } #endif /* CONFIG_SMP || CONFIG_KEXEC */ +static long format_cache_shape(u32 size, u32 sets, u32 lsize) +{ + long result = 0; + u32 log2size = __ilog2(lsize); + u32 ways; + + if (size == 0 || sets == 0) + return -1; + if (sets == 1) + ways = 0; + else + ways = size / (lsize * sets); + if (ways < 0x2ff) + result |= ways; + else + result |= 0x2ff; + if (log2size < 0xf) + result |= (log2size << 10); + else + result |= 0x3c00; + if (size >= 1024) + result |= (size >> 10) << 14; + else + result |= 0xfffffc000ul; + + return result; +} + /* * Initialize some remaining members of the ppc64_caches and systemcfg * structures @@ -487,6 +515,12 @@ void __init initialize_cache_info(void) /* For use by binfmt_elf */ dcache_bsize = ppc64_caches.dblock_size; icache_bsize = ppc64_caches.iblock_size; + il1cache_shape = format_cache_shape(ppc64_caches.isize, + ppc64_caches.isets, + ppc64_caches.iline_size); + dl1cache_shape = format_cache_shape(ppc64_caches.dsize, + ppc64_caches.dsets, + ppc64_caches.dline_size); DBG(" <- initialize_cache_info()\n"); } -- 2.7.4