|
@@ -180,8 +180,9 @@ static void release_pmc_hardware(void) {}
|
|
|
|
|
|
static bool check_hw_exists(void)
|
|
|
{
|
|
|
- u64 val, val_new = ~0;
|
|
|
- int i, reg, ret = 0;
|
|
|
+ u64 val, val_fail, val_new= ~0;
|
|
|
+ int i, reg, reg_fail, ret = 0;
|
|
|
+ int bios_fail = 0;
|
|
|
|
|
|
/*
|
|
|
* Check to see if the BIOS enabled any of the counters, if so
|
|
@@ -192,8 +193,11 @@ static bool check_hw_exists(void)
|
|
|
ret = rdmsrl_safe(reg, &val);
|
|
|
if (ret)
|
|
|
goto msr_fail;
|
|
|
- if (val & ARCH_PERFMON_EVENTSEL_ENABLE)
|
|
|
- goto bios_fail;
|
|
|
+ if (val & ARCH_PERFMON_EVENTSEL_ENABLE) {
|
|
|
+ bios_fail = 1;
|
|
|
+ val_fail = val;
|
|
|
+ reg_fail = reg;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (x86_pmu.num_counters_fixed) {
|
|
@@ -202,8 +206,11 @@ static bool check_hw_exists(void)
|
|
|
if (ret)
|
|
|
goto msr_fail;
|
|
|
for (i = 0; i < x86_pmu.num_counters_fixed; i++) {
|
|
|
- if (val & (0x03 << i*4))
|
|
|
- goto bios_fail;
|
|
|
+ if (val & (0x03 << i*4)) {
|
|
|
+ bios_fail = 1;
|
|
|
+ val_fail = val;
|
|
|
+ reg_fail = reg;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -221,14 +228,13 @@ static bool check_hw_exists(void)
|
|
|
if (ret || val != val_new)
|
|
|
goto msr_fail;
|
|
|
|
|
|
- return true;
|
|
|
-
|
|
|
-bios_fail:
|
|
|
/*
|
|
|
* We still allow the PMU driver to operate:
|
|
|
*/
|
|
|
- printk(KERN_CONT "Broken BIOS detected, complain to your hardware vendor.\n");
|
|
|
- printk(KERN_ERR FW_BUG "the BIOS has corrupted hw-PMU resources (MSR %x is %Lx)\n", reg, val);
|
|
|
+ if (bios_fail) {
|
|
|
+ printk(KERN_CONT "Broken BIOS detected, complain to your hardware vendor.\n");
|
|
|
+ printk(KERN_ERR FW_BUG "the BIOS has corrupted hw-PMU resources (MSR %x is %Lx)\n", reg_fail, val_fail);
|
|
|
+ }
|
|
|
|
|
|
return true;
|
|
|
|