sh: Expose physical addressing mode through cpuinfo.
authorPaul Mundt <lethal@linux-sh.org>
Tue, 26 Oct 2010 05:44:58 +0000 (14:44 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Tue, 26 Oct 2010 05:44:58 +0000 (14:44 +0900)
CPUs can be in either the legacy 29-bit or 32-bit physical addressing
modes. This follows the x86 approach of tracking the phys bits in cpuinfo
and exposing it to userspace through procfs.

This change was requested to permit kexec-tools to detect the physical
addressing mode in order to determine the appropriate address mangling.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/include/asm/processor.h
arch/sh/kernel/cpu/init.c
arch/sh/kernel/setup.c

index 0a58cb25a658ded43bb90ad831cbc6ecebed983d..c9e7cbc4768a6428f5a7cf4696cf69333175dfd9 100644 (file)
@@ -89,6 +89,7 @@ struct sh_cpuinfo {
        struct task_struct *idle;
 #endif
 
+       unsigned int phys_bits;
        unsigned long flags;
 } __attribute__ ((aligned(L1_CACHE_BYTES)));
 
index 97661061ff206866acdee52718188091273c206a..fac742e514eec3257ea493c14eb0100796c01cec 100644 (file)
@@ -340,6 +340,8 @@ asmlinkage void __cpuinit cpu_init(void)
         */
        current_cpu_data.asid_cache = NO_CONTEXT;
 
+       current_cpu_data.phys_bits = __in_29bit_mode() ? 29 : 32;
+
        speculative_execution_init();
        expmask_init();
 
index 4e278467f76ce5f0fbc7cdbd90bd7d1eff0002e6..82c0a0c1df0dfa68abef6376e1f7d2099df2a9e1 100644 (file)
@@ -52,6 +52,7 @@ struct sh_cpuinfo cpu_data[NR_CPUS] __read_mostly = {
                .type                   = CPU_SH_NONE,
                .family                 = CPU_FAMILY_UNKNOWN,
                .loops_per_jiffy        = 10000000,
+               .phys_bits              = MAX_PHYSMEM_BITS,
        },
 };
 EXPORT_SYMBOL(cpu_data);
@@ -432,6 +433,8 @@ static int show_cpuinfo(struct seq_file *m, void *v)
        if (c->flags & CPU_HAS_L2_CACHE)
                show_cacheinfo(m, "scache", c->scache);
 
+       seq_printf(m, "address sizes\t: %u bits physical\n", c->phys_bits);
+
        seq_printf(m, "bogomips\t: %lu.%02lu\n",
                     c->loops_per_jiffy/(500000/HZ),
                     (c->loops_per_jiffy/(5000/HZ)) % 100);