1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45#include <acpi/acpi.h>
46#include "accommon.h"
47#include "actables.h"
48#include <linux/tboot.h>
49
50#define _COMPONENT ACPI_HARDWARE
51ACPI_MODULE_NAME("hwsleep")
52
53
54
55
56
57
58
59
60
61
62
63
64
65acpi_status
66acpi_set_firmware_waking_vector(u32 physical_address)
67{
68 ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector);
69
70
71
72
73
74
75
76
77
78
79
80
81 acpi_gbl_FACS->firmware_waking_vector = physical_address;
82
83
84
85 if ((acpi_gbl_FACS->length > 32) && (acpi_gbl_FACS->version >= 1)) {
86 acpi_gbl_FACS->xfirmware_waking_vector = 0;
87 }
88
89 return_ACPI_STATUS(AE_OK);
90}
91
92ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector)
93
94#if ACPI_MACHINE_WIDTH == 64
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109acpi_status
110acpi_set_firmware_waking_vector64(u64 physical_address)
111{
112 ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector64);
113
114
115
116
117 if ((acpi_gbl_FACS->length <= 32) || (acpi_gbl_FACS->version < 1)) {
118 return_ACPI_STATUS(AE_NOT_EXIST);
119 }
120
121
122
123 acpi_gbl_FACS->firmware_waking_vector = 0;
124 acpi_gbl_FACS->xfirmware_waking_vector = physical_address;
125
126 return_ACPI_STATUS(AE_OK);
127}
128
129ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector64)
130#endif
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146acpi_status acpi_enter_sleep_state_prep(u8 sleep_state)
147{
148 acpi_status status;
149 struct acpi_object_list arg_list;
150 union acpi_object arg;
151
152 ACPI_FUNCTION_TRACE(acpi_enter_sleep_state_prep);
153
154
155
156 status = acpi_get_sleep_type_data(sleep_state,
157 &acpi_gbl_sleep_type_a,
158 &acpi_gbl_sleep_type_b);
159 if (ACPI_FAILURE(status)) {
160 return_ACPI_STATUS(status);
161 }
162
163
164
165 arg_list.count = 1;
166 arg_list.pointer = &arg;
167
168 arg.type = ACPI_TYPE_INTEGER;
169 arg.integer.value = sleep_state;
170
171
172
173 status = acpi_evaluate_object(NULL, METHOD_NAME__PTS, &arg_list, NULL);
174 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
175 return_ACPI_STATUS(status);
176 }
177
178
179
180 switch (sleep_state) {
181 case ACPI_STATE_S0:
182 arg.integer.value = ACPI_SST_WORKING;
183 break;
184
185 case ACPI_STATE_S1:
186 case ACPI_STATE_S2:
187 case ACPI_STATE_S3:
188 arg.integer.value = ACPI_SST_SLEEPING;
189 break;
190
191 case ACPI_STATE_S4:
192 arg.integer.value = ACPI_SST_SLEEP_CONTEXT;
193 break;
194
195 default:
196 arg.integer.value = ACPI_SST_INDICATOR_OFF;
197 break;
198 }
199
200
201
202
203
204 status = acpi_evaluate_object(NULL, METHOD_NAME__SST, &arg_list, NULL);
205 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
206 ACPI_EXCEPTION((AE_INFO, status,
207 "While executing method _SST"));
208 }
209
210 return_ACPI_STATUS(AE_OK);
211}
212
213ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state_prep)
214
215static unsigned int gts, bfs;
216module_param(gts, uint, 0644);
217module_param(bfs, uint, 0644);
218MODULE_PARM_DESC(gts, "Enable evaluation of _GTS on suspend.");
219MODULE_PARM_DESC(bfs, "Enable evaluation of _BFS on resume".);
220
221
222
223
224
225
226
227
228
229
230
231
232
233acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
234{
235 u32 pm1a_control;
236 u32 pm1b_control;
237 struct acpi_bit_register_info *sleep_type_reg_info;
238 struct acpi_bit_register_info *sleep_enable_reg_info;
239 u32 in_value;
240 struct acpi_object_list arg_list;
241 union acpi_object arg;
242 acpi_status status;
243
244 ACPI_FUNCTION_TRACE(acpi_enter_sleep_state);
245
246 if ((acpi_gbl_sleep_type_a > ACPI_SLEEP_TYPE_MAX) ||
247 (acpi_gbl_sleep_type_b > ACPI_SLEEP_TYPE_MAX)) {
248 ACPI_ERROR((AE_INFO, "Sleep values out of range: A=%X B=%X",
249 acpi_gbl_sleep_type_a, acpi_gbl_sleep_type_b));
250 return_ACPI_STATUS(AE_AML_OPERAND_VALUE);
251 }
252
253 sleep_type_reg_info =
254 acpi_hw_get_bit_register_info(ACPI_BITREG_SLEEP_TYPE);
255 sleep_enable_reg_info =
256 acpi_hw_get_bit_register_info(ACPI_BITREG_SLEEP_ENABLE);
257
258
259
260 status =
261 acpi_write_bit_register(ACPI_BITREG_WAKE_STATUS, ACPI_CLEAR_STATUS);
262 if (ACPI_FAILURE(status)) {
263 return_ACPI_STATUS(status);
264 }
265
266
267
268 status = acpi_hw_clear_acpi_status();
269 if (ACPI_FAILURE(status)) {
270 return_ACPI_STATUS(status);
271 }
272
273
274
275
276
277 status = acpi_hw_disable_all_gpes();
278 if (ACPI_FAILURE(status)) {
279 return_ACPI_STATUS(status);
280 }
281 acpi_gbl_system_awake_and_running = FALSE;
282
283 status = acpi_hw_enable_all_wakeup_gpes();
284 if (ACPI_FAILURE(status)) {
285 return_ACPI_STATUS(status);
286 }
287
288 if (gts) {
289
290
291 arg_list.count = 1;
292 arg_list.pointer = &arg;
293 arg.type = ACPI_TYPE_INTEGER;
294 arg.integer.value = sleep_state;
295
296 status = acpi_evaluate_object(NULL, METHOD_NAME__GTS, &arg_list, NULL);
297 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
298 return_ACPI_STATUS(status);
299 }
300 }
301
302
303
304 status = acpi_hw_register_read(ACPI_REGISTER_PM1_CONTROL,
305 &pm1a_control);
306 if (ACPI_FAILURE(status)) {
307 return_ACPI_STATUS(status);
308 }
309 ACPI_DEBUG_PRINT((ACPI_DB_INIT,
310 "Entering sleep state [S%d]\n", sleep_state));
311
312
313
314 pm1a_control &= ~(sleep_type_reg_info->access_bit_mask |
315 sleep_enable_reg_info->access_bit_mask);
316 pm1b_control = pm1a_control;
317
318
319
320 pm1a_control |=
321 (acpi_gbl_sleep_type_a << sleep_type_reg_info->bit_position);
322 pm1b_control |=
323 (acpi_gbl_sleep_type_b << sleep_type_reg_info->bit_position);
324
325
326
327
328
329
330
331
332 status = acpi_hw_write_pm1_control(pm1a_control, pm1b_control);
333 if (ACPI_FAILURE(status)) {
334 return_ACPI_STATUS(status);
335 }
336
337
338
339 pm1a_control |= sleep_enable_reg_info->access_bit_mask;
340 pm1b_control |= sleep_enable_reg_info->access_bit_mask;
341
342
343
344 ACPI_FLUSH_CPU_CACHE();
345
346 tboot_sleep(sleep_state, pm1a_control, pm1b_control);
347
348
349
350 status = acpi_hw_write_pm1_control(pm1a_control, pm1b_control);
351 if (ACPI_FAILURE(status)) {
352 return_ACPI_STATUS(status);
353 }
354
355 if (sleep_state > ACPI_STATE_S3) {
356
357
358
359
360
361
362
363
364
365
366
367 acpi_os_stall(10000000);
368
369 status = acpi_hw_register_write(ACPI_REGISTER_PM1_CONTROL,
370 sleep_enable_reg_info->
371 access_bit_mask);
372 if (ACPI_FAILURE(status)) {
373 return_ACPI_STATUS(status);
374 }
375 }
376
377
378
379 do {
380 status = acpi_read_bit_register(ACPI_BITREG_WAKE_STATUS,
381 &in_value);
382 if (ACPI_FAILURE(status)) {
383 return_ACPI_STATUS(status);
384 }
385
386
387
388 } while (!in_value);
389
390 return_ACPI_STATUS(AE_OK);
391}
392
393ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state)
394
395
396
397
398
399
400
401
402
403
404
405
406
407acpi_status asmlinkage acpi_enter_sleep_state_s4bios(void)
408{
409 u32 in_value;
410 acpi_status status;
411
412 ACPI_FUNCTION_TRACE(acpi_enter_sleep_state_s4bios);
413
414
415
416 status =
417 acpi_write_bit_register(ACPI_BITREG_WAKE_STATUS, ACPI_CLEAR_STATUS);
418 if (ACPI_FAILURE(status)) {
419 return_ACPI_STATUS(status);
420 }
421
422 status = acpi_hw_clear_acpi_status();
423 if (ACPI_FAILURE(status)) {
424 return_ACPI_STATUS(status);
425 }
426
427
428
429
430
431 status = acpi_hw_disable_all_gpes();
432 if (ACPI_FAILURE(status)) {
433 return_ACPI_STATUS(status);
434 }
435 acpi_gbl_system_awake_and_running = FALSE;
436
437 status = acpi_hw_enable_all_wakeup_gpes();
438 if (ACPI_FAILURE(status)) {
439 return_ACPI_STATUS(status);
440 }
441
442 ACPI_FLUSH_CPU_CACHE();
443
444 status = acpi_hw_write_port(acpi_gbl_FADT.smi_command,
445 (u32) acpi_gbl_FADT.S4bios_request, 8);
446
447 do {
448 acpi_os_stall(1000);
449 status =
450 acpi_read_bit_register(ACPI_BITREG_WAKE_STATUS, &in_value);
451 if (ACPI_FAILURE(status)) {
452 return_ACPI_STATUS(status);
453 }
454 } while (!in_value);
455
456 return_ACPI_STATUS(AE_OK);
457}
458
459ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state_s4bios)
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474acpi_status acpi_leave_sleep_state_prep(u8 sleep_state)
475{
476 struct acpi_object_list arg_list;
477 union acpi_object arg;
478 acpi_status status;
479 struct acpi_bit_register_info *sleep_type_reg_info;
480 struct acpi_bit_register_info *sleep_enable_reg_info;
481 u32 pm1a_control;
482 u32 pm1b_control;
483
484 ACPI_FUNCTION_TRACE(acpi_leave_sleep_state_prep);
485
486
487
488
489
490
491 status = acpi_get_sleep_type_data(ACPI_STATE_S0,
492 &acpi_gbl_sleep_type_a,
493 &acpi_gbl_sleep_type_b);
494 if (ACPI_SUCCESS(status)) {
495 sleep_type_reg_info =
496 acpi_hw_get_bit_register_info(ACPI_BITREG_SLEEP_TYPE);
497 sleep_enable_reg_info =
498 acpi_hw_get_bit_register_info(ACPI_BITREG_SLEEP_ENABLE);
499
500
501
502 status = acpi_hw_register_read(ACPI_REGISTER_PM1_CONTROL,
503 &pm1a_control);
504 if (ACPI_SUCCESS(status)) {
505
506
507
508 pm1a_control &= ~(sleep_type_reg_info->access_bit_mask |
509 sleep_enable_reg_info->
510 access_bit_mask);
511 pm1b_control = pm1a_control;
512
513
514
515 pm1a_control |= (acpi_gbl_sleep_type_a <<
516 sleep_type_reg_info->bit_position);
517 pm1b_control |= (acpi_gbl_sleep_type_b <<
518 sleep_type_reg_info->bit_position);
519
520
521
522 (void)acpi_hw_write_pm1_control(pm1a_control,
523 pm1b_control);
524 }
525 }
526
527 if (bfs) {
528
529
530 arg_list.count = 1;
531 arg_list.pointer = &arg;
532 arg.type = ACPI_TYPE_INTEGER;
533 arg.integer.value = sleep_state;
534
535 status = acpi_evaluate_object(NULL, METHOD_NAME__BFS, &arg_list, NULL);
536 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
537 ACPI_EXCEPTION((AE_INFO, status, "During Method _BFS"));
538 }
539 }
540 return_ACPI_STATUS(status);
541}
542
543
544
545
546
547
548
549
550
551
552
553
554
555acpi_status acpi_leave_sleep_state(u8 sleep_state)
556{
557 struct acpi_object_list arg_list;
558 union acpi_object arg;
559 acpi_status status;
560
561 ACPI_FUNCTION_TRACE(acpi_leave_sleep_state);
562
563
564
565 acpi_gbl_sleep_type_a = ACPI_SLEEP_TYPE_INVALID;
566
567
568
569 arg_list.count = 1;
570 arg_list.pointer = &arg;
571 arg.type = ACPI_TYPE_INTEGER;
572
573
574
575 arg.integer.value = ACPI_SST_WAKING;
576 status = acpi_evaluate_object(NULL, METHOD_NAME__SST, &arg_list, NULL);
577 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
578 ACPI_EXCEPTION((AE_INFO, status, "During Method _SST"));
579 }
580
581
582
583
584
585
586
587
588
589 status = acpi_hw_disable_all_gpes();
590 if (ACPI_FAILURE(status)) {
591 return_ACPI_STATUS(status);
592 }
593 status = acpi_hw_enable_all_runtime_gpes();
594 if (ACPI_FAILURE(status)) {
595 return_ACPI_STATUS(status);
596 }
597
598 arg.integer.value = sleep_state;
599 status = acpi_evaluate_object(NULL, METHOD_NAME__WAK, &arg_list, NULL);
600 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
601 ACPI_EXCEPTION((AE_INFO, status, "During Method _WAK"));
602 }
603
604
605
606
607
608
609
610 acpi_write_bit_register(ACPI_BITREG_WAKE_STATUS, 1);
611
612 acpi_gbl_system_awake_and_running = TRUE;
613
614
615
616 (void)
617 acpi_write_bit_register(acpi_gbl_fixed_event_info
618 [ACPI_EVENT_POWER_BUTTON].
619 enable_register_id, ACPI_ENABLE_EVENT);
620
621 (void)
622 acpi_write_bit_register(acpi_gbl_fixed_event_info
623 [ACPI_EVENT_POWER_BUTTON].
624 status_register_id, ACPI_CLEAR_STATUS);
625
626 arg.integer.value = ACPI_SST_WORKING;
627 status = acpi_evaluate_object(NULL, METHOD_NAME__SST, &arg_list, NULL);
628 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
629 ACPI_EXCEPTION((AE_INFO, status, "During Method _SST"));
630 }
631
632 return_ACPI_STATUS(status);
633}
634
635ACPI_EXPORT_SYMBOL(acpi_leave_sleep_state)
636