|
|
|
@ -574,7 +574,7 @@ static void __init report_platform_properties(void) |
|
|
|
|
mdesc_release(hp); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void __devinit fill_in_one_cache(cpuinfo_sparc *c, |
|
|
|
|
static void __cpuinit fill_in_one_cache(cpuinfo_sparc *c, |
|
|
|
|
struct mdesc_handle *hp, |
|
|
|
|
u64 mp) |
|
|
|
|
{ |
|
|
|
@ -619,8 +619,7 @@ static void __devinit fill_in_one_cache(cpuinfo_sparc *c, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void __devinit mark_core_ids(struct mdesc_handle *hp, u64 mp, |
|
|
|
|
int core_id) |
|
|
|
|
static void __cpuinit mark_core_ids(struct mdesc_handle *hp, u64 mp, int core_id) |
|
|
|
|
{ |
|
|
|
|
u64 a; |
|
|
|
|
|
|
|
|
@ -653,7 +652,7 @@ static void __devinit mark_core_ids(struct mdesc_handle *hp, u64 mp, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void __devinit set_core_ids(struct mdesc_handle *hp) |
|
|
|
|
static void __cpuinit set_core_ids(struct mdesc_handle *hp) |
|
|
|
|
{ |
|
|
|
|
int idx; |
|
|
|
|
u64 mp; |
|
|
|
@ -678,8 +677,7 @@ static void __devinit set_core_ids(struct mdesc_handle *hp) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void __devinit mark_proc_ids(struct mdesc_handle *hp, u64 mp, |
|
|
|
|
int proc_id) |
|
|
|
|
static void __cpuinit mark_proc_ids(struct mdesc_handle *hp, u64 mp, int proc_id) |
|
|
|
|
{ |
|
|
|
|
u64 a; |
|
|
|
|
|
|
|
|
@ -698,8 +696,7 @@ static void __devinit mark_proc_ids(struct mdesc_handle *hp, u64 mp, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void __devinit __set_proc_ids(struct mdesc_handle *hp, |
|
|
|
|
const char *exec_unit_name) |
|
|
|
|
static void __cpuinit __set_proc_ids(struct mdesc_handle *hp, const char *exec_unit_name) |
|
|
|
|
{ |
|
|
|
|
int idx; |
|
|
|
|
u64 mp; |
|
|
|
@ -720,13 +717,13 @@ static void __devinit __set_proc_ids(struct mdesc_handle *hp, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void __devinit set_proc_ids(struct mdesc_handle *hp) |
|
|
|
|
static void __cpuinit set_proc_ids(struct mdesc_handle *hp) |
|
|
|
|
{ |
|
|
|
|
__set_proc_ids(hp, "exec_unit"); |
|
|
|
|
__set_proc_ids(hp, "exec-unit"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void __devinit get_one_mondo_bits(const u64 *p, unsigned int *mask, |
|
|
|
|
static void __cpuinit get_one_mondo_bits(const u64 *p, unsigned int *mask, |
|
|
|
|
unsigned char def) |
|
|
|
|
{ |
|
|
|
|
u64 val; |
|
|
|
@ -745,7 +742,7 @@ use_default: |
|
|
|
|
*mask = ((1U << def) * 64U) - 1U; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void __devinit get_mondo_data(struct mdesc_handle *hp, u64 mp, |
|
|
|
|
static void __cpuinit get_mondo_data(struct mdesc_handle *hp, u64 mp, |
|
|
|
|
struct trap_per_cpu *tb) |
|
|
|
|
{ |
|
|
|
|
const u64 *val; |
|
|
|
@ -763,23 +760,15 @@ static void __devinit get_mondo_data(struct mdesc_handle *hp, u64 mp, |
|
|
|
|
get_one_mondo_bits(val, &tb->nonresum_qmask, 2); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void __cpuinit mdesc_fill_in_cpu_data(cpumask_t mask) |
|
|
|
|
static void * __cpuinit mdesc_iterate_over_cpus(void *(*func)(struct mdesc_handle *, u64, int, void *), void *arg, cpumask_t *mask) |
|
|
|
|
{ |
|
|
|
|
struct mdesc_handle *hp = mdesc_grab(); |
|
|
|
|
void *ret = NULL; |
|
|
|
|
u64 mp; |
|
|
|
|
|
|
|
|
|
ncpus_probed = 0; |
|
|
|
|
mdesc_for_each_node_by_name(hp, mp, "cpu") { |
|
|
|
|
const u64 *id = mdesc_get_property(hp, mp, "id", NULL); |
|
|
|
|
const u64 *cfreq = mdesc_get_property(hp, mp, "clock-frequency", NULL); |
|
|
|
|
struct trap_per_cpu *tb; |
|
|
|
|
cpuinfo_sparc *c; |
|
|
|
|
int cpuid; |
|
|
|
|
u64 a; |
|
|
|
|
|
|
|
|
|
ncpus_probed++; |
|
|
|
|
|
|
|
|
|
cpuid = *id; |
|
|
|
|
int cpuid = *id; |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_SMP |
|
|
|
|
if (cpuid >= NR_CPUS) { |
|
|
|
@ -788,62 +777,105 @@ void __cpuinit mdesc_fill_in_cpu_data(cpumask_t mask) |
|
|
|
|
cpuid, NR_CPUS); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if (!cpu_isset(cpuid, mask)) |
|
|
|
|
continue; |
|
|
|
|
#else |
|
|
|
|
/* On uniprocessor we only want the values for the
|
|
|
|
|
* real physical cpu the kernel booted onto, however |
|
|
|
|
* cpu_data() only has one entry at index 0. |
|
|
|
|
*/ |
|
|
|
|
if (cpuid != real_hard_smp_processor_id()) |
|
|
|
|
if (!cpu_isset(cpuid, *mask)) |
|
|
|
|
continue; |
|
|
|
|
cpuid = 0; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
c = &cpu_data(cpuid); |
|
|
|
|
c->clock_tick = *cfreq; |
|
|
|
|
ret = func(hp, mp, cpuid, arg); |
|
|
|
|
if (ret) |
|
|
|
|
goto out; |
|
|
|
|
} |
|
|
|
|
out: |
|
|
|
|
mdesc_release(hp); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
tb = &trap_block[cpuid]; |
|
|
|
|
get_mondo_data(hp, mp, tb); |
|
|
|
|
static void * __cpuinit record_one_cpu(struct mdesc_handle *hp, u64 mp, int cpuid, void *arg) |
|
|
|
|
{ |
|
|
|
|
ncpus_probed++; |
|
|
|
|
#ifdef CONFIG_SMP |
|
|
|
|
set_cpu_present(cpuid, true); |
|
|
|
|
#endif |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
mdesc_for_each_arc(a, hp, mp, MDESC_ARC_TYPE_FWD) { |
|
|
|
|
u64 j, t = mdesc_arc_target(hp, a); |
|
|
|
|
const char *t_name; |
|
|
|
|
void __cpuinit mdesc_populate_present_mask(cpumask_t *mask) |
|
|
|
|
{ |
|
|
|
|
if (tlb_type != hypervisor) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
t_name = mdesc_node_name(hp, t); |
|
|
|
|
if (!strcmp(t_name, "cache")) { |
|
|
|
|
fill_in_one_cache(c, hp, t); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
ncpus_probed = 0; |
|
|
|
|
mdesc_iterate_over_cpus(record_one_cpu, NULL, mask); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
mdesc_for_each_arc(j, hp, t, MDESC_ARC_TYPE_FWD) { |
|
|
|
|
u64 n = mdesc_arc_target(hp, j); |
|
|
|
|
const char *n_name; |
|
|
|
|
static void * __cpuinit fill_in_one_cpu(struct mdesc_handle *hp, u64 mp, int cpuid, void *arg) |
|
|
|
|
{ |
|
|
|
|
const u64 *cfreq = mdesc_get_property(hp, mp, "clock-frequency", NULL); |
|
|
|
|
struct trap_per_cpu *tb; |
|
|
|
|
cpuinfo_sparc *c; |
|
|
|
|
u64 a; |
|
|
|
|
|
|
|
|
|
n_name = mdesc_node_name(hp, n); |
|
|
|
|
if (!strcmp(n_name, "cache")) |
|
|
|
|
fill_in_one_cache(c, hp, n); |
|
|
|
|
} |
|
|
|
|
#ifndef CONFIG_SMP |
|
|
|
|
/* On uniprocessor we only want the values for the
|
|
|
|
|
* real physical cpu the kernel booted onto, however |
|
|
|
|
* cpu_data() only has one entry at index 0. |
|
|
|
|
*/ |
|
|
|
|
if (cpuid != real_hard_smp_processor_id()) |
|
|
|
|
return NULL; |
|
|
|
|
cpuid = 0; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
c = &cpu_data(cpuid); |
|
|
|
|
c->clock_tick = *cfreq; |
|
|
|
|
|
|
|
|
|
tb = &trap_block[cpuid]; |
|
|
|
|
get_mondo_data(hp, mp, tb); |
|
|
|
|
|
|
|
|
|
mdesc_for_each_arc(a, hp, mp, MDESC_ARC_TYPE_FWD) { |
|
|
|
|
u64 j, t = mdesc_arc_target(hp, a); |
|
|
|
|
const char *t_name; |
|
|
|
|
|
|
|
|
|
t_name = mdesc_node_name(hp, t); |
|
|
|
|
if (!strcmp(t_name, "cache")) { |
|
|
|
|
fill_in_one_cache(c, hp, t); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_SMP |
|
|
|
|
cpu_set(cpuid, cpu_present_map); |
|
|
|
|
#endif |
|
|
|
|
mdesc_for_each_arc(j, hp, t, MDESC_ARC_TYPE_FWD) { |
|
|
|
|
u64 n = mdesc_arc_target(hp, j); |
|
|
|
|
const char *n_name; |
|
|
|
|
|
|
|
|
|
c->core_id = 0; |
|
|
|
|
c->proc_id = -1; |
|
|
|
|
n_name = mdesc_node_name(hp, n); |
|
|
|
|
if (!strcmp(n_name, "cache")) |
|
|
|
|
fill_in_one_cache(c, hp, n); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
c->core_id = 0; |
|
|
|
|
c->proc_id = -1; |
|
|
|
|
|
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void __cpuinit mdesc_fill_in_cpu_data(cpumask_t mask) |
|
|
|
|
{ |
|
|
|
|
struct mdesc_handle *hp; |
|
|
|
|
|
|
|
|
|
mdesc_populate_present_mask(&mask); |
|
|
|
|
mdesc_iterate_over_cpus(fill_in_one_cpu, NULL, &mask); |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_SMP |
|
|
|
|
sparc64_multi_core = 1; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
hp = mdesc_grab(); |
|
|
|
|
|
|
|
|
|
set_core_ids(hp); |
|
|
|
|
set_proc_ids(hp); |
|
|
|
|
|
|
|
|
|
smp_fill_in_sib_core_maps(); |
|
|
|
|
|
|
|
|
|
mdesc_release(hp); |
|
|
|
|
|
|
|
|
|
smp_fill_in_sib_core_maps(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static ssize_t mdesc_read(struct file *file, char __user *buf, |
|
|
|
|