File tree Expand file tree Collapse file tree 3 files changed +17
-2
lines changed Expand file tree Collapse file tree 3 files changed +17
-2
lines changed Original file line number Diff line number Diff line change @@ -145,6 +145,15 @@ int acpi_processor_ffh_cstate_probe(unsigned int cpu,
145
145
percpu_entry -> states [cx -> index ].eax = cx -> address ;
146
146
percpu_entry -> states [cx -> index ].ecx = MWAIT_ECX_INTERRUPT_BREAK ;
147
147
}
148
+
149
+ /*
150
+ * For _CST FFH on Intel, if GAS.access_size bit 1 is cleared,
151
+ * then we should skip checking BM_STS for this C-state.
152
+ * ref: "Intel Processor Vendor-Specific ACPI Interface Specification"
153
+ */
154
+ if ((c -> x86_vendor == X86_VENDOR_INTEL ) && !(reg -> access_size & 0x2 ))
155
+ cx -> bm_sts_skip = 1 ;
156
+
148
157
return retval ;
149
158
}
150
159
EXPORT_SYMBOL_GPL (acpi_processor_ffh_cstate_probe );
Original file line number Diff line number Diff line change @@ -76,6 +76,8 @@ static unsigned int max_cstate __read_mostly = ACPI_PROCESSOR_MAX_POWER;
76
76
module_param (max_cstate , uint , 0000 );
77
77
static unsigned int nocst __read_mostly ;
78
78
module_param (nocst , uint , 0000 );
79
+ static int bm_check_disable __read_mostly ;
80
+ module_param (bm_check_disable , uint , 0000 );
79
81
80
82
static unsigned int latency_factor __read_mostly = 2 ;
81
83
module_param (latency_factor , uint , 0644 );
@@ -763,6 +765,9 @@ static int acpi_idle_bm_check(void)
763
765
{
764
766
u32 bm_status = 0 ;
765
767
768
+ if (bm_check_disable )
769
+ return 0 ;
770
+
766
771
acpi_read_bit_register (ACPI_BITREG_BUS_MASTER_STATUS , & bm_status );
767
772
if (bm_status )
768
773
acpi_write_bit_register (ACPI_BITREG_BUS_MASTER_STATUS , 1 );
@@ -947,7 +952,7 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,
947
952
if (acpi_idle_suspend )
948
953
return (acpi_idle_enter_c1 (dev , state ));
949
954
950
- if (acpi_idle_bm_check ()) {
955
+ if (! cx -> bm_sts_skip && acpi_idle_bm_check ()) {
951
956
if (dev -> safe_state ) {
952
957
dev -> last_state = dev -> safe_state ;
953
958
return dev -> safe_state -> enter (dev , dev -> safe_state );
Original file line number Diff line number Diff line change @@ -48,7 +48,7 @@ struct acpi_power_register {
48
48
u8 space_id ;
49
49
u8 bit_width ;
50
50
u8 bit_offset ;
51
- u8 reserved ;
51
+ u8 access_size ;
52
52
u64 address ;
53
53
} __attribute__ ((packed ));
54
54
@@ -63,6 +63,7 @@ struct acpi_processor_cx {
63
63
u32 power ;
64
64
u32 usage ;
65
65
u64 time ;
66
+ u8 bm_sts_skip ;
66
67
char desc [ACPI_CX_DESC_LEN ];
67
68
};
68
69
You can’t perform that action at this time.
0 commit comments