aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/cpu/intel_cacheinfo.c
diff options
context:
space:
mode:
authorMark Langsdorf <mark.langsdorf@amd.com>2008-07-22 14:06:02 -0400
committerIngo Molnar <mingo@elte.hu>2008-07-28 10:22:06 -0400
commita24e8d36f5fc047dac9af6200322ed393f2e3175 (patch)
tree77d13932a92f7d6ce7edde86d43ab7bb8586bed2 /arch/x86/kernel/cpu/intel_cacheinfo.c
parent7a4983bb5f94f6521aa3236fe5c035cf9bef543f (diff)
x86: L3 cache index disable for 2.6.26
On Monday 21 July 2008, Ingo Molnar wrote: > > applied to tip/x86/cpu, thanks Mark. > > > > I've done some coding style fixes for the new functions you've > > introduced, see that commit below. > > -tip testing found the following build failure: > > arch/x86/kernel/built-in.o: In function `show_cache_disable': > intel_cacheinfo.c:(.text+0xbbf2): undefined reference to `k8_northbridges' > arch/x86/kernel/built-in.o: In function `store_cache_disable': > intel_cacheinfo.c:(.text+0xbd91): undefined reference to `k8_northbridges' > > please send a delta fix patch against the tip/x86/cpu branch: > > http://people.redhat.com/mingo/tip.git/README > > which has your patch plus the cleanup applied. delta fix patch follows. It removes the dependency on k8_northbridges. -Mark Langsdorf Operating System Research Center AMD Signed-off-by: Mark Langsdorf <mark.langsdorf@amd.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/cpu/intel_cacheinfo.c')
-rw-r--r--arch/x86/kernel/cpu/intel_cacheinfo.c43
1 files changed, 38 insertions, 5 deletions
diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c
index a61c9e399ba9..a0c6c6ffed46 100644
--- a/arch/x86/kernel/cpu/intel_cacheinfo.c
+++ b/arch/x86/kernel/cpu/intel_cacheinfo.c
@@ -13,10 +13,10 @@
13#include <linux/compiler.h> 13#include <linux/compiler.h>
14#include <linux/cpu.h> 14#include <linux/cpu.h>
15#include <linux/sched.h> 15#include <linux/sched.h>
16#include <linux/pci.h>
16 17
17#include <asm/processor.h> 18#include <asm/processor.h>
18#include <asm/smp.h> 19#include <asm/smp.h>
19#include <asm/k8.h>
20 20
21#define LVL_1_INST 1 21#define LVL_1_INST 1
22#define LVL_1_DATA 2 22#define LVL_1_DATA 2
@@ -135,6 +135,12 @@ struct _cpuid4_info {
135 cpumask_t shared_cpu_map; /* future?: only cpus/node is needed */ 135 cpumask_t shared_cpu_map; /* future?: only cpus/node is needed */
136}; 136};
137 137
138static struct pci_device_id k8_nb_id[] = {
139 { PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x1103) },
140 { PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x1203) },
141 {}
142};
143
138unsigned short num_cache_leaves; 144unsigned short num_cache_leaves;
139 145
140/* AMD doesn't have CPUID4. Emulate it here to report the same 146/* AMD doesn't have CPUID4. Emulate it here to report the same
@@ -655,16 +661,39 @@ static ssize_t show_type(struct _cpuid4_info *this_leaf, char *buf) {
655#define to_object(k) container_of(k, struct _index_kobject, kobj) 661#define to_object(k) container_of(k, struct _index_kobject, kobj)
656#define to_attr(a) container_of(a, struct _cache_attr, attr) 662#define to_attr(a) container_of(a, struct _cache_attr, attr)
657 663
664static struct pci_dev *get_k8_northbridge(int node)
665{
666 struct pci_dev *dev = NULL;
667 int i;
668
669 for (i = 0; i <= node; i++) {
670 do {
671 dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev);
672 if (!dev)
673 break;
674 } while (!pci_match_id(&k8_nb_id[0], dev));
675 if (!dev)
676 break;
677 }
678 return dev;
679}
680
658static ssize_t show_cache_disable(struct _cpuid4_info *this_leaf, char *buf) 681static ssize_t show_cache_disable(struct _cpuid4_info *this_leaf, char *buf)
659{ 682{
660 int node = cpu_to_node(first_cpu(this_leaf->shared_cpu_map)); 683 int node = cpu_to_node(first_cpu(this_leaf->shared_cpu_map));
661 struct pci_dev *dev = k8_northbridges[node]; 684 struct pci_dev *dev = NULL;
662 ssize_t ret = 0; 685 ssize_t ret = 0;
663 int i; 686 int i;
664 687
665 if (!this_leaf->can_disable) 688 if (!this_leaf->can_disable)
666 return sprintf(buf, "Feature not enabled\n"); 689 return sprintf(buf, "Feature not enabled\n");
667 690
691 dev = get_k8_northbridge(node);
692 if (!dev) {
693 printk(KERN_ERR "Attempting AMD northbridge operation on a system with no northbridge\n");
694 return -EINVAL;
695 }
696
668 for (i = 0; i < 2; i++) { 697 for (i = 0; i < 2; i++) {
669 unsigned int reg; 698 unsigned int reg;
670 699
@@ -686,14 +715,12 @@ store_cache_disable(struct _cpuid4_info *this_leaf, const char *buf,
686 size_t count) 715 size_t count)
687{ 716{
688 int node = cpu_to_node(first_cpu(this_leaf->shared_cpu_map)); 717 int node = cpu_to_node(first_cpu(this_leaf->shared_cpu_map));
689 struct pci_dev *dev = k8_northbridges[node]; 718 struct pci_dev *dev = NULL;
690 unsigned int ret, index, val; 719 unsigned int ret, index, val;
691 720
692 if (!this_leaf->can_disable) 721 if (!this_leaf->can_disable)
693 return 0; 722 return 0;
694 723
695 /* write the MSR value */
696
697 if (strlen(buf) > 15) 724 if (strlen(buf) > 15)
698 return -EINVAL; 725 return -EINVAL;
699 726
@@ -704,6 +731,12 @@ store_cache_disable(struct _cpuid4_info *this_leaf, const char *buf,
704 return -EINVAL; 731 return -EINVAL;
705 732
706 val |= 0xc0000000; 733 val |= 0xc0000000;
734 dev = get_k8_northbridge(node);
735 if (!dev) {
736 printk(KERN_ERR "Attempting AMD northbridge operation on a system with no northbridge\n");
737 return -EINVAL;
738 }
739
707 pci_write_config_dword(dev, 0x1BC + index * 4, val & ~0x40000000); 740 pci_write_config_dword(dev, 0x1BC + index * 4, val & ~0x40000000);
708 wbinvd(); 741 wbinvd();
709 pci_write_config_dword(dev, 0x1BC + index * 4, val); 742 pci_write_config_dword(dev, 0x1BC + index * 4, val);