aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBorislav Petkov <borislav.petkov@amd.com>2012-08-01 08:55:01 -0400
committerH. Peter Anvin <hpa@linux.intel.com>2012-08-22 19:16:11 -0400
commitc96d2c0905cc48e34f2b37b775b59932c416b343 (patch)
tree56995e17f725ba5ad5d01c963657e4fbb36b24a3
parent48e30685caa8bdc4b8d4417d8ac31db59689742c (diff)
x86, microcode, AMD: Add reverse equiv table search
We search the equivalence table using the CPUID(1) signature of the CPU in order to get the equivalence ID of the patch which we need to apply. Add a function which does the reverse - it will be needed in later patches. While at it, pull the other equiv table function up in the file so that it can be used by other functionality without forward declarations. Signed-off-by: Borislav Petkov <borislav.petkov@amd.com> Link: http://lkml.kernel.org/r/1344361461-10076-11-git-send-email-bp@amd64.org Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
-rw-r--r--arch/x86/kernel/microcode_amd.c46
1 files changed, 30 insertions, 16 deletions
diff --git a/arch/x86/kernel/microcode_amd.c b/arch/x86/kernel/microcode_amd.c
index 94ecdaa24052..03ed5af7053d 100644
--- a/arch/x86/kernel/microcode_amd.c
+++ b/arch/x86/kernel/microcode_amd.c
@@ -78,6 +78,36 @@ static struct equiv_cpu_entry *equiv_cpu_table;
78/* page-sized ucode patch buffer */ 78/* page-sized ucode patch buffer */
79void *patch; 79void *patch;
80 80
81static u16 find_equiv_id(unsigned int cpu)
82{
83 struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
84 int i = 0;
85
86 BUG_ON(equiv_cpu_table == NULL);
87
88 while (equiv_cpu_table[i].installed_cpu != 0) {
89 if (uci->cpu_sig.sig == equiv_cpu_table[i].installed_cpu)
90 return equiv_cpu_table[i].equiv_cpu;
91
92 i++;
93 }
94 return 0;
95}
96
97static u32 find_cpu_family_by_equiv_cpu(u16 equiv_cpu)
98{
99 int i = 0;
100
101 BUG_ON(!equiv_cpu_table);
102
103 while (equiv_cpu_table[i].equiv_cpu != 0) {
104 if (equiv_cpu == equiv_cpu_table[i].equiv_cpu)
105 return equiv_cpu_table[i].installed_cpu;
106 i++;
107 }
108 return 0;
109}
110
81static int collect_cpu_info_amd(int cpu, struct cpu_signature *csig) 111static int collect_cpu_info_amd(int cpu, struct cpu_signature *csig)
82{ 112{
83 struct cpuinfo_x86 *c = &cpu_data(cpu); 113 struct cpuinfo_x86 *c = &cpu_data(cpu);
@@ -119,22 +149,6 @@ static unsigned int verify_ucode_size(int cpu, u32 patch_size,
119 return patch_size; 149 return patch_size;
120} 150}
121 151
122static u16 find_equiv_id(unsigned int cpu)
123{
124 struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
125 int i = 0;
126
127 BUG_ON(equiv_cpu_table == NULL);
128
129 while (equiv_cpu_table[i].installed_cpu != 0) {
130 if (uci->cpu_sig.sig == equiv_cpu_table[i].installed_cpu)
131 return equiv_cpu_table[i].equiv_cpu;
132
133 i++;
134 }
135 return 0;
136}
137
138/* 152/*
139 * we signal a good patch is found by returning its size > 0 153 * we signal a good patch is found by returning its size > 0
140 */ 154 */