Loading arch/x86/kernel/acpi/cstate.c +9 −0 Original line number Diff line number Diff line Loading @@ -145,6 +145,15 @@ int acpi_processor_ffh_cstate_probe(unsigned int cpu, percpu_entry->states[cx->index].eax = cx->address; percpu_entry->states[cx->index].ecx = MWAIT_ECX_INTERRUPT_BREAK; } /* * For _CST FFH on Intel, if GAS.access_size bit 1 is cleared, * then we should skip checking BM_STS for this C-state. * ref: "Intel Processor Vendor-Specific ACPI Interface Specification" */ if ((c->x86_vendor == X86_VENDOR_INTEL) && !(reg->access_size & 0x2)) cx->bm_sts_skip = 1; return retval; } EXPORT_SYMBOL_GPL(acpi_processor_ffh_cstate_probe); Loading drivers/acpi/processor_idle.c +6 −1 Original line number Diff line number Diff line Loading @@ -76,6 +76,8 @@ static unsigned int max_cstate __read_mostly = ACPI_PROCESSOR_MAX_POWER; module_param(max_cstate, uint, 0000); static unsigned int nocst __read_mostly; module_param(nocst, uint, 0000); static int bm_check_disable __read_mostly; module_param(bm_check_disable, uint, 0000); static unsigned int latency_factor __read_mostly = 2; module_param(latency_factor, uint, 0644); Loading Loading @@ -763,6 +765,9 @@ static int acpi_idle_bm_check(void) { u32 bm_status = 0; if (bm_check_disable) return 0; acpi_read_bit_register(ACPI_BITREG_BUS_MASTER_STATUS, &bm_status); if (bm_status) acpi_write_bit_register(ACPI_BITREG_BUS_MASTER_STATUS, 1); Loading Loading @@ -947,7 +952,7 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev, if (acpi_idle_suspend) return(acpi_idle_enter_c1(dev, state)); if (acpi_idle_bm_check()) { if (!cx->bm_sts_skip && acpi_idle_bm_check()) { if (dev->safe_state) { dev->last_state = dev->safe_state; return dev->safe_state->enter(dev, dev->safe_state); Loading include/acpi/processor.h +2 −1 Original line number Diff line number Diff line Loading @@ -48,7 +48,7 @@ struct acpi_power_register { u8 space_id; u8 bit_width; u8 bit_offset; u8 reserved; u8 access_size; u64 address; } __attribute__ ((packed)); Loading @@ -63,6 +63,7 @@ struct acpi_processor_cx { u32 power; u32 usage; u64 time; u8 bm_sts_skip; char desc[ACPI_CX_DESC_LEN]; }; Loading Loading
arch/x86/kernel/acpi/cstate.c +9 −0 Original line number Diff line number Diff line Loading @@ -145,6 +145,15 @@ int acpi_processor_ffh_cstate_probe(unsigned int cpu, percpu_entry->states[cx->index].eax = cx->address; percpu_entry->states[cx->index].ecx = MWAIT_ECX_INTERRUPT_BREAK; } /* * For _CST FFH on Intel, if GAS.access_size bit 1 is cleared, * then we should skip checking BM_STS for this C-state. * ref: "Intel Processor Vendor-Specific ACPI Interface Specification" */ if ((c->x86_vendor == X86_VENDOR_INTEL) && !(reg->access_size & 0x2)) cx->bm_sts_skip = 1; return retval; } EXPORT_SYMBOL_GPL(acpi_processor_ffh_cstate_probe); Loading
drivers/acpi/processor_idle.c +6 −1 Original line number Diff line number Diff line Loading @@ -76,6 +76,8 @@ static unsigned int max_cstate __read_mostly = ACPI_PROCESSOR_MAX_POWER; module_param(max_cstate, uint, 0000); static unsigned int nocst __read_mostly; module_param(nocst, uint, 0000); static int bm_check_disable __read_mostly; module_param(bm_check_disable, uint, 0000); static unsigned int latency_factor __read_mostly = 2; module_param(latency_factor, uint, 0644); Loading Loading @@ -763,6 +765,9 @@ static int acpi_idle_bm_check(void) { u32 bm_status = 0; if (bm_check_disable) return 0; acpi_read_bit_register(ACPI_BITREG_BUS_MASTER_STATUS, &bm_status); if (bm_status) acpi_write_bit_register(ACPI_BITREG_BUS_MASTER_STATUS, 1); Loading Loading @@ -947,7 +952,7 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev, if (acpi_idle_suspend) return(acpi_idle_enter_c1(dev, state)); if (acpi_idle_bm_check()) { if (!cx->bm_sts_skip && acpi_idle_bm_check()) { if (dev->safe_state) { dev->last_state = dev->safe_state; return dev->safe_state->enter(dev, dev->safe_state); Loading
include/acpi/processor.h +2 −1 Original line number Diff line number Diff line Loading @@ -48,7 +48,7 @@ struct acpi_power_register { u8 space_id; u8 bit_width; u8 bit_offset; u8 reserved; u8 access_size; u64 address; } __attribute__ ((packed)); Loading @@ -63,6 +63,7 @@ struct acpi_processor_cx { u32 power; u32 usage; u64 time; u8 bm_sts_skip; char desc[ACPI_CX_DESC_LEN]; }; Loading