提交 7a4983bb 编写于 作者: I Ingo Molnar

x86: L3 cache index disable for 2.6.26, cleanups

No change in functionality.
Signed-off-by: NIngo Molnar <mingo@elte.hu>
上级 8cb22bcb
...@@ -253,14 +253,16 @@ static void __cpuinit amd_cpuid4(int leaf, union _cpuid4_leaf_eax *eax, ...@@ -253,14 +253,16 @@ static void __cpuinit amd_cpuid4(int leaf, union _cpuid4_leaf_eax *eax,
(ebx->split.ways_of_associativity + 1) - 1; (ebx->split.ways_of_associativity + 1) - 1;
} }
static void __cpuinit amd_check_l3_disable(int index, struct _cpuid4_info *this_leaf) static void __cpuinit
amd_check_l3_disable(int index, struct _cpuid4_info *this_leaf)
{ {
if (index < 3) if (index < 3)
return; return;
this_leaf->can_disable = 1; this_leaf->can_disable = 1;
} }
static int __cpuinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_leaf) static int
__cpuinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_leaf)
{ {
union _cpuid4_leaf_eax eax; union _cpuid4_leaf_eax eax;
union _cpuid4_leaf_ebx ebx; union _cpuid4_leaf_ebx ebx;
...@@ -271,19 +273,20 @@ static int __cpuinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_le ...@@ -271,19 +273,20 @@ static int __cpuinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_le
amd_cpuid4(index, &eax, &ebx, &ecx); amd_cpuid4(index, &eax, &ebx, &ecx);
if (boot_cpu_data.x86 >= 0x10) if (boot_cpu_data.x86 >= 0x10)
amd_check_l3_disable(index, this_leaf); amd_check_l3_disable(index, this_leaf);
} else {
} else cpuid_count(4, index, &eax.full, &ebx.full, &ecx.full, &edx);
cpuid_count(4, index, &eax.full, &ebx.full, &ecx.full, &edx); }
if (eax.split.type == CACHE_TYPE_NULL) if (eax.split.type == CACHE_TYPE_NULL)
return -EIO; /* better error ? */ return -EIO; /* better error ? */
this_leaf->eax = eax; this_leaf->eax = eax;
this_leaf->ebx = ebx; this_leaf->ebx = ebx;
this_leaf->ecx = ecx; this_leaf->ecx = ecx;
this_leaf->size = (ecx.split.number_of_sets + 1) * this_leaf->size = (ecx.split.number_of_sets + 1) *
(ebx.split.coherency_line_size + 1) * (ebx.split.coherency_line_size + 1) *
(ebx.split.physical_line_partition + 1) * (ebx.split.physical_line_partition + 1) *
(ebx.split.ways_of_associativity + 1); (ebx.split.ways_of_associativity + 1);
return 0; return 0;
} }
...@@ -649,59 +652,63 @@ static ssize_t show_type(struct _cpuid4_info *this_leaf, char *buf) { ...@@ -649,59 +652,63 @@ static ssize_t show_type(struct _cpuid4_info *this_leaf, char *buf) {
} }
} }
#define to_object(k) container_of(k, struct _index_kobject, kobj) #define to_object(k) container_of(k, struct _index_kobject, kobj)
#define to_attr(a) container_of(a, struct _cache_attr, attr) #define to_attr(a) container_of(a, struct _cache_attr, attr)
static ssize_t show_cache_disable(struct _cpuid4_info *this_leaf, char *buf) static ssize_t show_cache_disable(struct _cpuid4_info *this_leaf, char *buf)
{ {
struct pci_dev *dev; int node = cpu_to_node(first_cpu(this_leaf->shared_cpu_map));
if (this_leaf->can_disable) { struct pci_dev *dev = k8_northbridges[node];
int i; ssize_t ret = 0;
ssize_t ret = 0; int i;
int node = cpu_to_node(first_cpu(this_leaf->shared_cpu_map));
dev = k8_northbridges[node];
for (i = 0; i < 2; i++) {
unsigned int reg;
pci_read_config_dword(dev, 0x1BC + i * 4, &reg);
ret += sprintf(buf, "%sEntry: %d\n", buf, i);
ret += sprintf(buf, "%sReads: %s\tNew Entries: %s\n",
buf,
reg & 0x80000000 ? "Disabled" : "Allowed",
reg & 0x40000000 ? "Disabled" : "Allowed");
ret += sprintf(buf, "%sSubCache: %x\tIndex: %x\n", buf,
(reg & 0x30000) >> 16, reg & 0xfff);
} if (!this_leaf->can_disable)
return ret; return sprintf(buf, "Feature not enabled\n");
for (i = 0; i < 2; i++) {
unsigned int reg;
pci_read_config_dword(dev, 0x1BC + i * 4, &reg);
ret += sprintf(buf, "%sEntry: %d\n", buf, i);
ret += sprintf(buf, "%sReads: %s\tNew Entries: %s\n",
buf,
reg & 0x80000000 ? "Disabled" : "Allowed",
reg & 0x40000000 ? "Disabled" : "Allowed");
ret += sprintf(buf, "%sSubCache: %x\tIndex: %x\n",
buf, (reg & 0x30000) >> 16, reg & 0xfff);
} }
return sprintf(buf, "Feature not enabled\n"); return ret;
} }
static ssize_t store_cache_disable(struct _cpuid4_info *this_leaf, const char *buf, size_t count) static ssize_t
store_cache_disable(struct _cpuid4_info *this_leaf, const char *buf,
size_t count)
{ {
struct pci_dev *dev; int node = cpu_to_node(first_cpu(this_leaf->shared_cpu_map));
if (this_leaf->can_disable) { struct pci_dev *dev = k8_northbridges[node];
/* write the MSR value */ unsigned int ret, index, val;
unsigned int ret;
unsigned int index, val; if (!this_leaf->can_disable)
int node = cpu_to_node(first_cpu(this_leaf->shared_cpu_map)); return 0;
dev = k8_northbridges[node];
/* write the MSR value */
if (strlen(buf) > 15)
return -EINVAL; if (strlen(buf) > 15)
ret = sscanf(buf, "%x %x", &index, &val); return -EINVAL;
if (ret != 2)
return -EINVAL; ret = sscanf(buf, "%x %x", &index, &val);
if (index > 1) if (ret != 2)
return -EINVAL; return -EINVAL;
val |= 0xc0000000; if (index > 1)
pci_write_config_dword(dev, 0x1BC + index * 4, val & ~0x40000000); return -EINVAL;
wbinvd();
pci_write_config_dword(dev, 0x1BC + index * 4, val); val |= 0xc0000000;
return 1; pci_write_config_dword(dev, 0x1BC + index * 4, val & ~0x40000000);
} wbinvd();
return 0; pci_write_config_dword(dev, 0x1BC + index * 4, val);
return 1;
} }
struct _cache_attr { struct _cache_attr {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册