|
@@ -1785,74 +1785,80 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
|
|
|
|
|
static struct cpu_spec the_cpu_spec;
|
|
|
|
|
|
-struct cpu_spec * __init identify_cpu(unsigned long offset, unsigned int pvr)
|
|
|
+static void __init setup_cpu_spec(unsigned long offset, struct cpu_spec *s)
|
|
|
{
|
|
|
- struct cpu_spec *s = cpu_specs;
|
|
|
struct cpu_spec *t = &the_cpu_spec;
|
|
|
- int i;
|
|
|
-
|
|
|
- s = PTRRELOC(s);
|
|
|
t = PTRRELOC(t);
|
|
|
|
|
|
- for (i = 0; i < ARRAY_SIZE(cpu_specs); i++,s++)
|
|
|
- if ((pvr & s->pvr_mask) == s->pvr_value) {
|
|
|
- /*
|
|
|
- * If we are overriding a previous value derived
|
|
|
- * from the real PVR with a new value obtained
|
|
|
- * using a logical PVR value, don't modify the
|
|
|
- * performance monitor fields.
|
|
|
- */
|
|
|
- if (t->num_pmcs && !s->num_pmcs) {
|
|
|
- t->cpu_name = s->cpu_name;
|
|
|
- t->cpu_features = s->cpu_features;
|
|
|
- t->cpu_user_features = s->cpu_user_features;
|
|
|
- t->icache_bsize = s->icache_bsize;
|
|
|
- t->dcache_bsize = s->dcache_bsize;
|
|
|
- t->cpu_setup = s->cpu_setup;
|
|
|
- t->cpu_restore = s->cpu_restore;
|
|
|
- t->platform = s->platform;
|
|
|
- /*
|
|
|
- * If we have passed through this logic once
|
|
|
- * before and have pulled the default case
|
|
|
- * because the real PVR was not found inside
|
|
|
- * cpu_specs[], then we are possibly running in
|
|
|
- * compatibility mode. In that case, let the
|
|
|
- * oprofiler know which set of compatibility
|
|
|
- * counters to pull from by making sure the
|
|
|
- * oprofile_cpu_type string is set to that of
|
|
|
- * compatibility mode. If the oprofile_cpu_type
|
|
|
- * already has a value, then we are possibly
|
|
|
- * overriding a real PVR with a logical one, and,
|
|
|
- * in that case, keep the current value for
|
|
|
- * oprofile_cpu_type.
|
|
|
- */
|
|
|
- if (t->oprofile_cpu_type == NULL)
|
|
|
- t->oprofile_cpu_type = s->oprofile_cpu_type;
|
|
|
- } else
|
|
|
- *t = *s;
|
|
|
- *PTRRELOC(&cur_cpu_spec) = &the_cpu_spec;
|
|
|
+ /*
|
|
|
+ * If we are overriding a previous value derived from the real
|
|
|
+ * PVR with a new value obtained using a logical PVR value,
|
|
|
+ * don't modify the performance monitor fields.
|
|
|
+ */
|
|
|
+ if (t->num_pmcs && !s->num_pmcs) {
|
|
|
+ t->cpu_name = s->cpu_name;
|
|
|
+ t->cpu_features = s->cpu_features;
|
|
|
+ t->cpu_user_features = s->cpu_user_features;
|
|
|
+ t->icache_bsize = s->icache_bsize;
|
|
|
+ t->dcache_bsize = s->dcache_bsize;
|
|
|
+ t->cpu_setup = s->cpu_setup;
|
|
|
+ t->cpu_restore = s->cpu_restore;
|
|
|
+ t->platform = s->platform;
|
|
|
+ /*
|
|
|
+ * If we have passed through this logic once before and
|
|
|
+ * have pulled the default case because the real PVR was
|
|
|
+ * not found inside cpu_specs[], then we are possibly
|
|
|
+ * running in compatibility mode. In that case, let the
|
|
|
+ * oprofiler know which set of compatibility counters to
|
|
|
+ * pull from by making sure the oprofile_cpu_type string
|
|
|
+ * is set to that of compatibility mode. If the
|
|
|
+ * oprofile_cpu_type already has a value, then we are
|
|
|
+ * possibly overriding a real PVR with a logical one,
|
|
|
+ * and, in that case, keep the current value for
|
|
|
+ * oprofile_cpu_type.
|
|
|
+ */
|
|
|
+ if (t->oprofile_cpu_type == NULL)
|
|
|
+ t->oprofile_cpu_type = s->oprofile_cpu_type;
|
|
|
+ } else
|
|
|
+ *t = *s;
|
|
|
+
|
|
|
+ *PTRRELOC(&cur_cpu_spec) = &the_cpu_spec;
|
|
|
|
|
|
- /*
|
|
|
- * Set the base platform string once; assumes
|
|
|
- * we're called with real pvr first.
|
|
|
- */
|
|
|
- if (*PTRRELOC(&powerpc_base_platform) == NULL)
|
|
|
- *PTRRELOC(&powerpc_base_platform) = t->platform;
|
|
|
+ /*
|
|
|
+ * Set the base platform string once; assumes
|
|
|
+ * we're called with real pvr first.
|
|
|
+ */
|
|
|
+ if (*PTRRELOC(&powerpc_base_platform) == NULL)
|
|
|
+ *PTRRELOC(&powerpc_base_platform) = t->platform;
|
|
|
|
|
|
#if defined(CONFIG_PPC64) || defined(CONFIG_BOOKE)
|
|
|
- /* ppc64 and booke expect identify_cpu to also call
|
|
|
- * setup_cpu for that processor. I will consolidate
|
|
|
- * that at a later time, for now, just use #ifdef.
|
|
|
- * we also don't need to PTRRELOC the function pointer
|
|
|
- * on ppc64 and booke as we are running at 0 in real
|
|
|
- * mode on ppc64 and reloc_offset is always 0 on booke.
|
|
|
- */
|
|
|
- if (s->cpu_setup) {
|
|
|
- s->cpu_setup(offset, s);
|
|
|
- }
|
|
|
+ /* ppc64 and booke expect identify_cpu to also call setup_cpu for
|
|
|
+ * that processor. I will consolidate that at a later time, for now,
|
|
|
+ * just use #ifdef. We also don't need to PTRRELOC the function
|
|
|
+ * pointer on ppc64 and booke as we are running at 0 in real mode
|
|
|
+ * on ppc64 and reloc_offset is always 0 on booke.
|
|
|
+ */
|
|
|
+ if (s->cpu_setup) {
|
|
|
+ s->cpu_setup(offset, s);
|
|
|
+ }
|
|
|
#endif /* CONFIG_PPC64 || CONFIG_BOOKE */
|
|
|
+}
|
|
|
+
|
|
|
+struct cpu_spec * __init identify_cpu(unsigned long offset, unsigned int pvr)
|
|
|
+{
|
|
|
+ struct cpu_spec *s = cpu_specs;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ s = PTRRELOC(s);
|
|
|
+
|
|
|
+ for (i = 0; i < ARRAY_SIZE(cpu_specs); i++,s++) {
|
|
|
+ if ((pvr & s->pvr_mask) == s->pvr_value) {
|
|
|
+ setup_cpu_spec(offset, s);
|
|
|
return s;
|
|
|
}
|
|
|
+ }
|
|
|
+
|
|
|
BUG();
|
|
|
+
|
|
|
return NULL;
|
|
|
}
|