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#include <acpi/acpi.h>
45#include "accommon.h"
46#include "acevents.h"
47
48#define _COMPONENT ACPI_HARDWARE
49ACPI_MODULE_NAME("hwgpe")
50#if (!ACPI_REDUCED_HARDWARE)
51
52static acpi_status
53acpi_hw_enable_wakeup_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
54 struct acpi_gpe_block_info *gpe_block,
55 void *context);
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70u32 acpi_hw_get_gpe_register_bit(struct acpi_gpe_event_info *gpe_event_info)
71{
72
73 return ((u32)1 <<
74 (gpe_event_info->gpe_number -
75 gpe_event_info->register_info->base_gpe_number));
76}
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91acpi_status
92acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u32 action)
93{
94 struct acpi_gpe_register_info *gpe_register_info;
95 acpi_status status = AE_OK;
96 u32 enable_mask;
97 u32 register_bit;
98
99 ACPI_FUNCTION_ENTRY();
100
101
102
103 gpe_register_info = gpe_event_info->register_info;
104 if (!gpe_register_info) {
105 return (AE_NOT_EXIST);
106 }
107
108
109
110 status = acpi_hw_read(&enable_mask, &gpe_register_info->enable_address);
111 if (ACPI_FAILURE(status)) {
112 return (status);
113 }
114
115
116
117 register_bit = acpi_hw_get_gpe_register_bit(gpe_event_info);
118 switch (action & ~ACPI_GPE_SAVE_MASK) {
119 case ACPI_GPE_CONDITIONAL_ENABLE:
120
121
122
123 if (!(register_bit & gpe_register_info->enable_mask)) {
124 return (AE_BAD_PARAMETER);
125 }
126
127
128
129 case ACPI_GPE_ENABLE:
130
131 ACPI_SET_BIT(enable_mask, register_bit);
132 break;
133
134 case ACPI_GPE_DISABLE:
135
136 ACPI_CLEAR_BIT(enable_mask, register_bit);
137 break;
138
139 default:
140
141 ACPI_ERROR((AE_INFO, "Invalid GPE Action, %u", action));
142 return (AE_BAD_PARAMETER);
143 }
144
145 if (!(register_bit & gpe_register_info->mask_for_run)) {
146
147
148
149 status =
150 acpi_hw_write(enable_mask,
151 &gpe_register_info->enable_address);
152 }
153 if (ACPI_SUCCESS(status) && (action & ACPI_GPE_SAVE_MASK)) {
154 gpe_register_info->enable_mask = enable_mask;
155 }
156 return (status);
157}
158
159
160
161
162
163
164
165
166
167
168
169
170
171acpi_status acpi_hw_clear_gpe(struct acpi_gpe_event_info * gpe_event_info)
172{
173 struct acpi_gpe_register_info *gpe_register_info;
174 acpi_status status;
175 u32 register_bit;
176
177 ACPI_FUNCTION_ENTRY();
178
179
180
181 gpe_register_info = gpe_event_info->register_info;
182 if (!gpe_register_info) {
183 return (AE_NOT_EXIST);
184 }
185
186
187
188
189
190 register_bit = acpi_hw_get_gpe_register_bit(gpe_event_info);
191
192 status = acpi_hw_write(register_bit,
193 &gpe_register_info->status_address);
194
195 return (status);
196}
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211acpi_status
212acpi_hw_get_gpe_status(struct acpi_gpe_event_info * gpe_event_info,
213 acpi_event_status * event_status)
214{
215 u32 in_byte;
216 u32 register_bit;
217 struct acpi_gpe_register_info *gpe_register_info;
218 acpi_event_status local_event_status = 0;
219 acpi_status status;
220
221 ACPI_FUNCTION_ENTRY();
222
223 if (!event_status) {
224 return (AE_BAD_PARAMETER);
225 }
226
227
228
229 gpe_register_info = gpe_event_info->register_info;
230
231
232
233 register_bit = acpi_hw_get_gpe_register_bit(gpe_event_info);
234
235
236
237 if (register_bit & gpe_register_info->enable_for_run) {
238 local_event_status |= ACPI_EVENT_FLAG_ENABLED;
239 }
240
241
242
243 if (register_bit & gpe_register_info->mask_for_run) {
244 local_event_status |= ACPI_EVENT_FLAG_MASKED;
245 }
246
247
248
249 if (register_bit & gpe_register_info->enable_for_wake) {
250 local_event_status |= ACPI_EVENT_FLAG_WAKE_ENABLED;
251 }
252
253
254
255 status = acpi_hw_read(&in_byte, &gpe_register_info->enable_address);
256 if (ACPI_FAILURE(status)) {
257 return (status);
258 }
259
260 if (register_bit & in_byte) {
261 local_event_status |= ACPI_EVENT_FLAG_ENABLE_SET;
262 }
263
264
265
266 status = acpi_hw_read(&in_byte, &gpe_register_info->status_address);
267 if (ACPI_FAILURE(status)) {
268 return (status);
269 }
270
271 if (register_bit & in_byte) {
272 local_event_status |= ACPI_EVENT_FLAG_STATUS_SET;
273 }
274
275
276
277 (*event_status) = local_event_status;
278 return (AE_OK);
279}
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294static acpi_status
295acpi_hw_gpe_enable_write(u8 enable_mask,
296 struct acpi_gpe_register_info *gpe_register_info)
297{
298 acpi_status status;
299
300 status = acpi_hw_write(enable_mask, &gpe_register_info->enable_address);
301 if (ACPI_SUCCESS(status)) {
302 gpe_register_info->enable_mask = enable_mask;
303 }
304 return (status);
305}
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320acpi_status
321acpi_hw_disable_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
322 struct acpi_gpe_block_info *gpe_block, void *context)
323{
324 u32 i;
325 acpi_status status;
326
327
328
329 for (i = 0; i < gpe_block->register_count; i++) {
330
331
332
333 status =
334 acpi_hw_gpe_enable_write(0x00,
335 &gpe_block->register_info[i]);
336 if (ACPI_FAILURE(status)) {
337 return (status);
338 }
339 }
340
341 return (AE_OK);
342}
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357acpi_status
358acpi_hw_clear_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
359 struct acpi_gpe_block_info *gpe_block, void *context)
360{
361 u32 i;
362 acpi_status status;
363
364
365
366 for (i = 0; i < gpe_block->register_count; i++) {
367
368
369
370 status =
371 acpi_hw_write(0xFF,
372 &gpe_block->register_info[i].status_address);
373 if (ACPI_FAILURE(status)) {
374 return (status);
375 }
376 }
377
378 return (AE_OK);
379}
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395acpi_status
396acpi_hw_enable_runtime_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
397 struct acpi_gpe_block_info * gpe_block,
398 void *context)
399{
400 u32 i;
401 acpi_status status;
402 struct acpi_gpe_register_info *gpe_register_info;
403 u8 enable_mask;
404
405
406
407
408
409 for (i = 0; i < gpe_block->register_count; i++) {
410 gpe_register_info = &gpe_block->register_info[i];
411 if (!gpe_register_info->enable_for_run) {
412 continue;
413 }
414
415
416
417 enable_mask = gpe_register_info->enable_for_run &
418 ~gpe_register_info->mask_for_run;
419 status =
420 acpi_hw_gpe_enable_write(enable_mask, gpe_register_info);
421 if (ACPI_FAILURE(status)) {
422 return (status);
423 }
424 }
425
426 return (AE_OK);
427}
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443static acpi_status
444acpi_hw_enable_wakeup_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
445 struct acpi_gpe_block_info *gpe_block,
446 void *context)
447{
448 u32 i;
449 acpi_status status;
450 struct acpi_gpe_register_info *gpe_register_info;
451
452
453
454 for (i = 0; i < gpe_block->register_count; i++) {
455 gpe_register_info = &gpe_block->register_info[i];
456 if (!gpe_block->register_info[i].enable_for_wake) {
457 continue;
458 }
459
460
461
462 status =
463 acpi_hw_gpe_enable_write(gpe_register_info->enable_for_wake,
464 gpe_register_info);
465 if (ACPI_FAILURE(status)) {
466 return (status);
467 }
468 }
469
470 return (AE_OK);
471}
472
473
474
475
476
477
478
479
480
481
482
483
484
485acpi_status acpi_hw_disable_all_gpes(void)
486{
487 acpi_status status;
488
489 ACPI_FUNCTION_TRACE(hw_disable_all_gpes);
490
491 status = acpi_ev_walk_gpe_list(acpi_hw_disable_gpe_block, NULL);
492 status = acpi_ev_walk_gpe_list(acpi_hw_clear_gpe_block, NULL);
493 return_ACPI_STATUS(status);
494}
495
496
497
498
499
500
501
502
503
504
505
506
507
508acpi_status acpi_hw_enable_all_runtime_gpes(void)
509{
510 acpi_status status;
511
512 ACPI_FUNCTION_TRACE(hw_enable_all_runtime_gpes);
513
514 status = acpi_ev_walk_gpe_list(acpi_hw_enable_runtime_gpe_block, NULL);
515 return_ACPI_STATUS(status);
516}
517
518
519
520
521
522
523
524
525
526
527
528
529
530acpi_status acpi_hw_enable_all_wakeup_gpes(void)
531{
532 acpi_status status;
533
534 ACPI_FUNCTION_TRACE(hw_enable_all_wakeup_gpes);
535
536 status = acpi_ev_walk_gpe_list(acpi_hw_enable_wakeup_gpe_block, NULL);
537 return_ACPI_STATUS(status);
538}
539
540#endif
541