|
@@ -326,8 +326,7 @@ static void __cpuinit amd_calc_l3_indices(struct amd_northbridge *nb)
|
|
|
l3->indices = (max(max3(sc0, sc1, sc2), sc3) << 10) - 1;
|
|
|
}
|
|
|
|
|
|
-static void __cpuinit amd_init_l3_cache(struct _cpuid4_info_regs *this_leaf,
|
|
|
- int index)
|
|
|
+static void __cpuinit amd_init_l3_cache(struct _cpuid4_info_regs *this_leaf, int index)
|
|
|
{
|
|
|
int node;
|
|
|
|
|
@@ -725,14 +724,16 @@ static DEFINE_PER_CPU(struct _cpuid4_info *, ici_cpuid4_info);
|
|
|
#define CPUID4_INFO_IDX(x, y) (&((per_cpu(ici_cpuid4_info, x))[y]))
|
|
|
|
|
|
#ifdef CONFIG_SMP
|
|
|
-static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index)
|
|
|
+
|
|
|
+static int __cpuinit cache_shared_amd_cpu_map_setup(unsigned int cpu, int index)
|
|
|
{
|
|
|
- struct _cpuid4_info *this_leaf, *sibling_leaf;
|
|
|
- unsigned long num_threads_sharing;
|
|
|
- int index_msb, i, sibling;
|
|
|
+ struct _cpuid4_info *this_leaf;
|
|
|
+ int ret, i, sibling;
|
|
|
struct cpuinfo_x86 *c = &cpu_data(cpu);
|
|
|
|
|
|
- if ((index == 3) && (c->x86_vendor == X86_VENDOR_AMD)) {
|
|
|
+ ret = 0;
|
|
|
+ if (index == 3) {
|
|
|
+ ret = 1;
|
|
|
for_each_cpu(i, cpu_llc_shared_mask(cpu)) {
|
|
|
if (!per_cpu(ici_cpuid4_info, i))
|
|
|
continue;
|
|
@@ -743,8 +744,35 @@ static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index)
|
|
|
set_bit(sibling, this_leaf->shared_cpu_map);
|
|
|
}
|
|
|
}
|
|
|
- return;
|
|
|
+ } else if ((c->x86 == 0x15) && ((index == 1) || (index == 2))) {
|
|
|
+ ret = 1;
|
|
|
+ for_each_cpu(i, cpu_sibling_mask(cpu)) {
|
|
|
+ if (!per_cpu(ici_cpuid4_info, i))
|
|
|
+ continue;
|
|
|
+ this_leaf = CPUID4_INFO_IDX(i, index);
|
|
|
+ for_each_cpu(sibling, cpu_sibling_mask(cpu)) {
|
|
|
+ if (!cpu_online(sibling))
|
|
|
+ continue;
|
|
|
+ set_bit(sibling, this_leaf->shared_cpu_map);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index)
|
|
|
+{
|
|
|
+ struct _cpuid4_info *this_leaf, *sibling_leaf;
|
|
|
+ unsigned long num_threads_sharing;
|
|
|
+ int index_msb, i;
|
|
|
+ struct cpuinfo_x86 *c = &cpu_data(cpu);
|
|
|
+
|
|
|
+ if (c->x86_vendor == X86_VENDOR_AMD) {
|
|
|
+ if (cache_shared_amd_cpu_map_setup(cpu, index))
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
this_leaf = CPUID4_INFO_IDX(cpu, index);
|
|
|
num_threads_sharing = 1 + this_leaf->base.eax.split.num_threads_sharing;
|
|
|
|