mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86: Fix RevF detection in powernow.c
The PowerNow! driver does not support RevF and earlier parts. The current code checks for RevF processors in a function that is not called. Change the code path so that RevF processors are detected and the driver fails registration. Also fix cpufreq_add_cpu() to handle unsuccessful registration. Signed-off-by: Mark Langsdorf <mark.langsdorf@amd.com>
This commit is contained in:
1 parent
5856aed296
commit
2220131142
2 files changed
+7
-39
No files matched your search
@@ -273,59 +273,24 @@ static struct cpufreq_driver powernow_cpufreq_driver = {
|
||||
};
|
||||
|
||||
unsigned int powernow_register_driver()
|
||||
{
|
||||
unsigned int ret;
|
||||
ret = cpufreq_register_driver(&powernow_cpufreq_driver);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int powernow_cpufreq_init(void)
|
||||
{
|
||||
unsigned int i, ret = 0;
|
||||
unsigned int max_dom = 0;
|
||||
cpumask_t *pt;
|
||||
unsigned long *dom_mask;
|
||||
|
||||
for_each_online_cpu(i) {
|
||||
struct cpuinfo_x86 *c = &cpu_data[i];
|
||||
if (c->x86_vendor != X86_VENDOR_AMD)
|
||||
if (c->x86_vendor != X86_VENDOR_AMD)
|
||||
ret = -ENODEV;
|
||||
else
|
||||
else
|
||||
{
|
||||
u32 eax, ebx, ecx, edx;
|
||||
cpuid(CPUID_FREQ_VOLT_CAPABILITIES, &eax, &ebx, &ecx, &edx);
|
||||
if ((edx & USE_HW_PSTATE) != USE_HW_PSTATE)
|
||||
ret = -ENODEV;
|
||||
}
|
||||
}
|
||||
if (ret)
|
||||
return ret;
|
||||
if (max_dom < processor_pminfo[i]->perf.domain_info.domain)
|
||||
max_dom = processor_pminfo[i]->perf.domain_info.domain;
|
||||
}
|
||||
max_dom++;
|
||||
|
||||
dom_mask = xmalloc_array(unsigned long, BITS_TO_LONGS(max_dom));
|
||||
if (!dom_mask)
|
||||
return -ENOMEM;
|
||||
bitmap_zero(dom_mask, max_dom);
|
||||
|
||||
pt = xmalloc_array(cpumask_t, max_dom);
|
||||
if (!pt)
|
||||
return -ENOMEM;
|
||||
memset(pt, 0, max_dom * sizeof(cpumask_t));
|
||||
|
||||
/* get cpumask of each psd domain */
|
||||
for_each_online_cpu(i) {
|
||||
__set_bit(processor_pminfo[i]->perf.domain_info.domain, dom_mask);
|
||||
cpu_set(i, pt[processor_pminfo[i]->perf.domain_info.domain]);
|
||||
}
|
||||
|
||||
for_each_online_cpu(i)
|
||||
processor_pminfo[i]->perf.shared_cpu_map =
|
||||
pt[processor_pminfo[i]->perf.domain_info.domain];
|
||||
|
||||
xfree(pt);
|
||||
xfree(dom_mask);
|
||||
|
||||
ret = cpufreq_register_driver(&powernow_cpufreq_driver);
|
||||
return ret;
|
||||
}
|
||||
@@ -143,6 +143,9 @@ int cpufreq_add_cpu(unsigned int cpu)
|
||||
!cpu_online(cpu))
|
||||
return -EINVAL;
|
||||
|
||||
if (!cpufreq_driver)
|
||||
return 0;
|
||||
|
||||
if (cpufreq_cpu_policy[cpu])
|
||||
return 0;
|
||||
|
||||
|
||||