Commit e82da214 authored by Paul Mundt's avatar Paul Mundt

sh: Track the CPU family in sh_cpuinfo.

This adds a family member to struct sh_cpuinfo, which allows us to fall
back more on the probe routines to work out what sort of subtype we are
running on. This will be used by the CPU cache initialization code in
order to first do family-level initialization, followed by subtype-level
optimizations.
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent aae4d142
...@@ -21,25 +21,25 @@ static void __init check_bugs(void) ...@@ -21,25 +21,25 @@ static void __init check_bugs(void)
current_cpu_data.loops_per_jiffy = loops_per_jiffy; current_cpu_data.loops_per_jiffy = loops_per_jiffy;
switch (current_cpu_data.type) { switch (current_cpu_data.family) {
case CPU_SH7619: case CPU_FAMILY_SH2:
*p++ = '2'; *p++ = '2';
break; break;
case CPU_SH7201 ... CPU_MXG: case CPU_FAMILY_SH2A:
*p++ = '2'; *p++ = '2';
*p++ = 'a'; *p++ = 'a';
break; break;
case CPU_SH7705 ... CPU_SH7729: case CPU_FAMILY_SH3:
*p++ = '3'; *p++ = '3';
break; break;
case CPU_SH7750 ... CPU_SH4_501: case CPU_FAMILY_SH4:
*p++ = '4'; *p++ = '4';
break; break;
case CPU_SH7763 ... CPU_SHX3: case CPU_FAMILY_SH4A:
*p++ = '4'; *p++ = '4';
*p++ = 'a'; *p++ = 'a';
break; break;
case CPU_SH7343 ... CPU_SH7366: case CPU_FAMILY_SH4AL_DSP:
*p++ = '4'; *p++ = '4';
*p++ = 'a'; *p++ = 'a';
*p++ = 'l'; *p++ = 'l';
...@@ -48,15 +48,15 @@ static void __init check_bugs(void) ...@@ -48,15 +48,15 @@ static void __init check_bugs(void)
*p++ = 's'; *p++ = 's';
*p++ = 'p'; *p++ = 'p';
break; break;
case CPU_SH5_101 ... CPU_SH5_103: case CPU_FAMILY_SH5:
*p++ = '6'; *p++ = '6';
*p++ = '4'; *p++ = '4';
break; break;
case CPU_SH_NONE: case CPU_FAMILY_UNKNOWN:
/* /*
* Specifically use CPU_SH_NONE rather than default:, * Specifically use CPU_FAMILY_UNKNOWN rather than
* so we're able to have the compiler whine about * default:, so we're able to have the compiler whine
* unhandled enumerations. * about unhandled enumerations.
*/ */
break; break;
} }
......
...@@ -44,6 +44,17 @@ enum cpu_type { ...@@ -44,6 +44,17 @@ enum cpu_type {
CPU_SH_NONE CPU_SH_NONE
}; };
enum cpu_family {
CPU_FAMILY_SH2,
CPU_FAMILY_SH2A,
CPU_FAMILY_SH3,
CPU_FAMILY_SH4,
CPU_FAMILY_SH4A,
CPU_FAMILY_SH4AL_DSP,
CPU_FAMILY_SH5,
CPU_FAMILY_UNKNOWN,
};
/* /*
* TLB information structure * TLB information structure
* *
...@@ -61,7 +72,7 @@ struct tlb_info { ...@@ -61,7 +72,7 @@ struct tlb_info {
}; };
struct sh_cpuinfo { struct sh_cpuinfo {
unsigned int type; unsigned int type, family;
int cut_major, cut_minor; int cut_major, cut_minor;
unsigned long loops_per_jiffy; unsigned long loops_per_jiffy;
unsigned long asid_cache; unsigned long asid_cache;
......
...@@ -29,6 +29,7 @@ int __init detect_cpu_and_cache_system(void) ...@@ -29,6 +29,7 @@ int __init detect_cpu_and_cache_system(void)
*/ */
boot_cpu_data.dcache.flags |= SH_CACHE_COMBINED; boot_cpu_data.dcache.flags |= SH_CACHE_COMBINED;
boot_cpu_data.icache = boot_cpu_data.dcache; boot_cpu_data.icache = boot_cpu_data.dcache;
boot_cpu_data.family = CPU_FAMILY_SH2;
return 0; return 0;
} }
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
int __init detect_cpu_and_cache_system(void) int __init detect_cpu_and_cache_system(void)
{ {
boot_cpu_data.family = CPU_FAMILY_SH2A;
/* All SH-2A CPUs have support for 16 and 32-bit opcodes.. */ /* All SH-2A CPUs have support for 16 and 32-bit opcodes.. */
boot_cpu_data.flags |= CPU_HAS_OP32; boot_cpu_data.flags |= CPU_HAS_OP32;
......
...@@ -107,5 +107,7 @@ int __uses_jump_to_uncached detect_cpu_and_cache_system(void) ...@@ -107,5 +107,7 @@ int __uses_jump_to_uncached detect_cpu_and_cache_system(void)
boot_cpu_data.dcache.flags |= SH_CACHE_COMBINED; boot_cpu_data.dcache.flags |= SH_CACHE_COMBINED;
boot_cpu_data.icache = boot_cpu_data.dcache; boot_cpu_data.icache = boot_cpu_data.dcache;
boot_cpu_data.family = CPU_FAMILY_SH3;
return 0; return 0;
} }
...@@ -57,8 +57,12 @@ int __init detect_cpu_and_cache_system(void) ...@@ -57,8 +57,12 @@ int __init detect_cpu_and_cache_system(void)
* Setup some generic flags we can probe on SH-4A parts * Setup some generic flags we can probe on SH-4A parts
*/ */
if (((pvr >> 16) & 0xff) == 0x10) { if (((pvr >> 16) & 0xff) == 0x10) {
if ((cvr & 0x10000000) == 0) boot_cpu_data.family = CPU_FAMILY_SH4A;
if ((cvr & 0x10000000) == 0) {
boot_cpu_data.flags |= CPU_HAS_DSP; boot_cpu_data.flags |= CPU_HAS_DSP;
boot_cpu_data.family = CPU_FAMILY_SH4AL_DSP;
}
boot_cpu_data.flags |= CPU_HAS_LLSC | CPU_HAS_PERF_COUNTER; boot_cpu_data.flags |= CPU_HAS_LLSC | CPU_HAS_PERF_COUNTER;
boot_cpu_data.cut_major = pvr & 0x7f; boot_cpu_data.cut_major = pvr & 0x7f;
...@@ -68,6 +72,7 @@ int __init detect_cpu_and_cache_system(void) ...@@ -68,6 +72,7 @@ int __init detect_cpu_and_cache_system(void)
} else { } else {
/* And some SH-4 defaults.. */ /* And some SH-4 defaults.. */
boot_cpu_data.flags |= CPU_HAS_PTEA; boot_cpu_data.flags |= CPU_HAS_PTEA;
boot_cpu_data.family = CPU_FAMILY_SH4;
} }
/* FPU detection works for everyone */ /* FPU detection works for everyone */
...@@ -174,7 +179,7 @@ int __init detect_cpu_and_cache_system(void) ...@@ -174,7 +179,7 @@ int __init detect_cpu_and_cache_system(void)
break; break;
default: default:
boot_cpu_data.type = CPU_SH_NONE; boot_cpu_data.type = boot_cpu_data.family = CPU_SH_NONE;
break; break;
} }
......
...@@ -34,6 +34,8 @@ int __init detect_cpu_and_cache_system(void) ...@@ -34,6 +34,8 @@ int __init detect_cpu_and_cache_system(void)
/* CPU.VCR aliased at CIR address on SH5-101 */ /* CPU.VCR aliased at CIR address on SH5-101 */
boot_cpu_data.type = CPU_SH5_101; boot_cpu_data.type = CPU_SH5_101;
boot_cpu_data.family = CPU_FAMILY_SH5;
/* /*
* First, setup some sane values for the I-cache. * First, setup some sane values for the I-cache.
*/ */
......
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
struct sh_cpuinfo cpu_data[NR_CPUS] __read_mostly = { struct sh_cpuinfo cpu_data[NR_CPUS] __read_mostly = {
[0] = { [0] = {
.type = CPU_SH_NONE, .type = CPU_SH_NONE,
.family = CPU_FAMILY_UNKNOWN,
.loops_per_jiffy = 10000000, .loops_per_jiffy = 10000000,
}, },
}; };
......
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