Skip to content

Commit

Permalink
Merge branch 'acpi-processor'
Browse files Browse the repository at this point in the history
* acpi-processor:
  ACPI / processor: Request native thermal interrupt handling via _OSC
  • Loading branch information
rafaeljw committed Apr 1, 2016
2 parents f55532a + a212116 commit 8fbd4ad
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 0 deletions.
3 changes: 3 additions & 0 deletions arch/x86/kernel/cpu/mcheck/therm_throt.c
Original file line number Diff line number Diff line change
Expand Up @@ -384,6 +384,9 @@ static void intel_thermal_interrupt(void)
{
__u64 msr_val;

if (static_cpu_has(X86_FEATURE_HWP))
wrmsrl_safe(MSR_HWP_STATUS, 0);

rdmsrl(MSR_IA32_THERM_STATUS, msr_val);

/* Check for violation of core thermal thresholds*/
Expand Down
52 changes: 52 additions & 0 deletions drivers/acpi/acpi_processor.c
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,58 @@ static void acpi_processor_remove(struct acpi_device *device)
}
#endif /* CONFIG_ACPI_HOTPLUG_CPU */

#ifdef CONFIG_X86
static bool acpi_hwp_native_thermal_lvt_set;
static acpi_status __init acpi_hwp_native_thermal_lvt_osc(acpi_handle handle,
u32 lvl,
void *context,
void **rv)
{
u8 sb_uuid_str[] = "4077A616-290C-47BE-9EBD-D87058713953";
u32 capbuf[2];
struct acpi_osc_context osc_context = {
.uuid_str = sb_uuid_str,
.rev = 1,
.cap.length = 8,
.cap.pointer = capbuf,
};

if (acpi_hwp_native_thermal_lvt_set)
return AE_CTRL_TERMINATE;

capbuf[0] = 0x0000;
capbuf[1] = 0x1000; /* set bit 12 */

if (ACPI_SUCCESS(acpi_run_osc(handle, &osc_context))) {
if (osc_context.ret.pointer && osc_context.ret.length > 1) {
u32 *capbuf_ret = osc_context.ret.pointer;

if (capbuf_ret[1] & 0x1000) {
acpi_handle_info(handle,
"_OSC native thermal LVT Acked\n");
acpi_hwp_native_thermal_lvt_set = true;
}
}
kfree(osc_context.ret.pointer);
}

return AE_OK;
}

void __init acpi_early_processor_osc(void)
{
if (boot_cpu_has(X86_FEATURE_HWP)) {
acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT,
ACPI_UINT32_MAX,
acpi_hwp_native_thermal_lvt_osc,
NULL, NULL, NULL);
acpi_get_devices(ACPI_PROCESSOR_DEVICE_HID,
acpi_hwp_native_thermal_lvt_osc,
NULL, NULL);
}
}
#endif

/*
* The following ACPI IDs are known to be suitable for representing as
* processor devices.
Expand Down
3 changes: 3 additions & 0 deletions drivers/acpi/bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -1019,6 +1019,9 @@ static int __init acpi_bus_init(void)
goto error1;
}

/* Set capability bits for _OSC under processor scope */
acpi_early_processor_osc();

/*
* _OSC method may exist in module level code,
* so it must be run after ACPI_FULL_INITIALIZATION
Expand Down
6 changes: 6 additions & 0 deletions drivers/acpi/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,12 @@ void acpi_early_processor_set_pdc(void);
static inline void acpi_early_processor_set_pdc(void) {}
#endif

#ifdef CONFIG_X86
void acpi_early_processor_osc(void);
#else
static inline void acpi_early_processor_osc(void) {}
#endif

/* --------------------------------------------------------------------------
Embedded Controller
-------------------------------------------------------------------------- */
Expand Down

0 comments on commit 8fbd4ad

Please sign in to comment.