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#define pr_fmt(fmt) "ACPI: EC: " fmt
31
32#include <linux/kernel.h>
33#include <linux/module.h>
34#include <linux/init.h>
35#include <linux/types.h>
36#include <linux/delay.h>
37#include <linux/interrupt.h>
38#include <linux/list.h>
39#include <linux/spinlock.h>
40#include <linux/slab.h>
41#include <linux/acpi.h>
42#include <linux/dmi.h>
43#include <asm/io.h>
44
45#include "internal.h"
46
47#define ACPI_EC_CLASS "embedded_controller"
48#define ACPI_EC_DEVICE_NAME "Embedded Controller"
49#define ACPI_EC_FILE_INFO "info"
50
51
52#define ACPI_EC_FLAG_OBF 0x01
53#define ACPI_EC_FLAG_IBF 0x02
54#define ACPI_EC_FLAG_CMD 0x08
55#define ACPI_EC_FLAG_BURST 0x10
56#define ACPI_EC_FLAG_SCI 0x20
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86#define ACPI_EC_EVT_TIMING_STATUS 0x00
87#define ACPI_EC_EVT_TIMING_QUERY 0x01
88#define ACPI_EC_EVT_TIMING_EVENT 0x02
89
90
91enum ec_command {
92 ACPI_EC_COMMAND_READ = 0x80,
93 ACPI_EC_COMMAND_WRITE = 0x81,
94 ACPI_EC_BURST_ENABLE = 0x82,
95 ACPI_EC_BURST_DISABLE = 0x83,
96 ACPI_EC_COMMAND_QUERY = 0x84,
97};
98
99#define ACPI_EC_DELAY 500
100#define ACPI_EC_UDELAY_GLK 1000
101#define ACPI_EC_UDELAY_POLL 550
102#define ACPI_EC_CLEAR_MAX 100
103
104#define ACPI_EC_MAX_QUERIES 16
105
106enum {
107 EC_FLAGS_QUERY_ENABLED,
108 EC_FLAGS_QUERY_PENDING,
109 EC_FLAGS_QUERY_GUARDING,
110 EC_FLAGS_GPE_HANDLER_INSTALLED,
111 EC_FLAGS_EC_HANDLER_INSTALLED,
112 EC_FLAGS_EVT_HANDLER_INSTALLED,
113 EC_FLAGS_STARTED,
114 EC_FLAGS_STOPPED,
115 EC_FLAGS_GPE_MASKED,
116};
117
118#define ACPI_EC_COMMAND_POLL 0x01
119#define ACPI_EC_COMMAND_COMPLETE 0x02
120
121
122static unsigned int ec_delay __read_mostly = ACPI_EC_DELAY;
123module_param(ec_delay, uint, 0644);
124MODULE_PARM_DESC(ec_delay, "Timeout(ms) waited until an EC command completes");
125
126static unsigned int ec_max_queries __read_mostly = ACPI_EC_MAX_QUERIES;
127module_param(ec_max_queries, uint, 0644);
128MODULE_PARM_DESC(ec_max_queries, "Maximum parallel _Qxx evaluations");
129
130static bool ec_busy_polling __read_mostly;
131module_param(ec_busy_polling, bool, 0644);
132MODULE_PARM_DESC(ec_busy_polling, "Use busy polling to advance EC transaction");
133
134static unsigned int ec_polling_guard __read_mostly = ACPI_EC_UDELAY_POLL;
135module_param(ec_polling_guard, uint, 0644);
136MODULE_PARM_DESC(ec_polling_guard, "Guard time(us) between EC accesses in polling modes");
137
138static unsigned int ec_event_clearing __read_mostly = ACPI_EC_EVT_TIMING_QUERY;
139
140
141
142
143
144
145static unsigned int ec_storm_threshold __read_mostly = 8;
146module_param(ec_storm_threshold, uint, 0644);
147MODULE_PARM_DESC(ec_storm_threshold, "Maxim false GPE numbers not considered as GPE storm");
148
149static bool ec_freeze_events __read_mostly = false;
150module_param(ec_freeze_events, bool, 0644);
151MODULE_PARM_DESC(ec_freeze_events, "Disabling event handling during suspend/resume");
152
153static bool ec_no_wakeup __read_mostly;
154module_param(ec_no_wakeup, bool, 0644);
155MODULE_PARM_DESC(ec_no_wakeup, "Do not wake up from suspend-to-idle");
156
157struct acpi_ec_query_handler {
158 struct list_head node;
159 acpi_ec_query_func func;
160 acpi_handle handle;
161 void *data;
162 u8 query_bit;
163 struct kref kref;
164};
165
166struct transaction {
167 const u8 *wdata;
168 u8 *rdata;
169 unsigned short irq_count;
170 u8 command;
171 u8 wi;
172 u8 ri;
173 u8 wlen;
174 u8 rlen;
175 u8 flags;
176};
177
178struct acpi_ec_query {
179 struct transaction transaction;
180 struct work_struct work;
181 struct acpi_ec_query_handler *handler;
182};
183
184static int acpi_ec_query(struct acpi_ec *ec, u8 *data);
185static void advance_transaction(struct acpi_ec *ec);
186static void acpi_ec_event_handler(struct work_struct *work);
187static void acpi_ec_event_processor(struct work_struct *work);
188
189struct acpi_ec *boot_ec, *first_ec;
190EXPORT_SYMBOL(first_ec);
191static bool boot_ec_is_ecdt = false;
192static struct workqueue_struct *ec_query_wq;
193
194static int EC_FLAGS_QUERY_HANDSHAKE;
195static int EC_FLAGS_CORRECT_ECDT;
196static int EC_FLAGS_IGNORE_DSDT_GPE;
197
198
199
200
201
202
203
204
205
206#ifdef DEBUG
207#define EC_DBG_SEP " "
208#define EC_DBG_DRV "+++++"
209#define EC_DBG_STM "====="
210#define EC_DBG_REQ "*****"
211#define EC_DBG_EVT "#####"
212#else
213#define EC_DBG_SEP ""
214#define EC_DBG_DRV
215#define EC_DBG_STM
216#define EC_DBG_REQ
217#define EC_DBG_EVT
218#endif
219
220#define ec_log_raw(fmt, ...) \
221 pr_info(fmt "\n", ##__VA_ARGS__)
222#define ec_dbg_raw(fmt, ...) \
223 pr_debug(fmt "\n", ##__VA_ARGS__)
224#define ec_log(filter, fmt, ...) \
225 ec_log_raw(filter EC_DBG_SEP fmt EC_DBG_SEP filter, ##__VA_ARGS__)
226#define ec_dbg(filter, fmt, ...) \
227 ec_dbg_raw(filter EC_DBG_SEP fmt EC_DBG_SEP filter, ##__VA_ARGS__)
228
229#define ec_log_drv(fmt, ...) \
230 ec_log(EC_DBG_DRV, fmt, ##__VA_ARGS__)
231#define ec_dbg_drv(fmt, ...) \
232 ec_dbg(EC_DBG_DRV, fmt, ##__VA_ARGS__)
233#define ec_dbg_stm(fmt, ...) \
234 ec_dbg(EC_DBG_STM, fmt, ##__VA_ARGS__)
235#define ec_dbg_req(fmt, ...) \
236 ec_dbg(EC_DBG_REQ, fmt, ##__VA_ARGS__)
237#define ec_dbg_evt(fmt, ...) \
238 ec_dbg(EC_DBG_EVT, fmt, ##__VA_ARGS__)
239#define ec_dbg_ref(ec, fmt, ...) \
240 ec_dbg_raw("%lu: " fmt, ec->reference_count, ## __VA_ARGS__)
241
242
243
244
245
246static bool acpi_ec_started(struct acpi_ec *ec)
247{
248 return test_bit(EC_FLAGS_STARTED, &ec->flags) &&
249 !test_bit(EC_FLAGS_STOPPED, &ec->flags);
250}
251
252static bool acpi_ec_event_enabled(struct acpi_ec *ec)
253{
254
255
256
257
258
259 if (!test_bit(EC_FLAGS_QUERY_ENABLED, &ec->flags))
260 return false;
261
262
263
264
265
266
267
268
269
270 if (ec_freeze_events)
271 return acpi_ec_started(ec);
272 else
273 return test_bit(EC_FLAGS_STARTED, &ec->flags);
274}
275
276static bool acpi_ec_flushed(struct acpi_ec *ec)
277{
278 return ec->reference_count == 1;
279}
280
281
282
283
284
285static inline u8 acpi_ec_read_status(struct acpi_ec *ec)
286{
287 u8 x = inb(ec->command_addr);
288
289 ec_dbg_raw("EC_SC(R) = 0x%2.2x "
290 "SCI_EVT=%d BURST=%d CMD=%d IBF=%d OBF=%d",
291 x,
292 !!(x & ACPI_EC_FLAG_SCI),
293 !!(x & ACPI_EC_FLAG_BURST),
294 !!(x & ACPI_EC_FLAG_CMD),
295 !!(x & ACPI_EC_FLAG_IBF),
296 !!(x & ACPI_EC_FLAG_OBF));
297 return x;
298}
299
300static inline u8 acpi_ec_read_data(struct acpi_ec *ec)
301{
302 u8 x = inb(ec->data_addr);
303
304 ec->timestamp = jiffies;
305 ec_dbg_raw("EC_DATA(R) = 0x%2.2x", x);
306 return x;
307}
308
309static inline void acpi_ec_write_cmd(struct acpi_ec *ec, u8 command)
310{
311 ec_dbg_raw("EC_SC(W) = 0x%2.2x", command);
312 outb(command, ec->command_addr);
313 ec->timestamp = jiffies;
314}
315
316static inline void acpi_ec_write_data(struct acpi_ec *ec, u8 data)
317{
318 ec_dbg_raw("EC_DATA(W) = 0x%2.2x", data);
319 outb(data, ec->data_addr);
320 ec->timestamp = jiffies;
321}
322
323#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG)
324static const char *acpi_ec_cmd_string(u8 cmd)
325{
326 switch (cmd) {
327 case 0x80:
328 return "RD_EC";
329 case 0x81:
330 return "WR_EC";
331 case 0x82:
332 return "BE_EC";
333 case 0x83:
334 return "BD_EC";
335 case 0x84:
336 return "QR_EC";
337 }
338 return "UNKNOWN";
339}
340#else
341#define acpi_ec_cmd_string(cmd) "UNDEF"
342#endif
343
344
345
346
347
348static inline bool acpi_ec_is_gpe_raised(struct acpi_ec *ec)
349{
350 acpi_event_status gpe_status = 0;
351
352 (void)acpi_get_gpe_status(NULL, ec->gpe, &gpe_status);
353 return (gpe_status & ACPI_EVENT_FLAG_STATUS_SET) ? true : false;
354}
355
356static inline void acpi_ec_enable_gpe(struct acpi_ec *ec, bool open)
357{
358 if (open)
359 acpi_enable_gpe(NULL, ec->gpe);
360 else {
361 BUG_ON(ec->reference_count < 1);
362 acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_ENABLE);
363 }
364 if (acpi_ec_is_gpe_raised(ec)) {
365
366
367
368
369
370 ec_dbg_raw("Polling quirk");
371 advance_transaction(ec);
372 }
373}
374
375static inline void acpi_ec_disable_gpe(struct acpi_ec *ec, bool close)
376{
377 if (close)
378 acpi_disable_gpe(NULL, ec->gpe);
379 else {
380 BUG_ON(ec->reference_count < 1);
381 acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_DISABLE);
382 }
383}
384
385static inline void acpi_ec_clear_gpe(struct acpi_ec *ec)
386{
387
388
389
390
391
392
393
394
395
396
397 if (!acpi_ec_is_gpe_raised(ec))
398 return;
399 acpi_clear_gpe(NULL, ec->gpe);
400}
401
402
403
404
405
406static void acpi_ec_submit_request(struct acpi_ec *ec)
407{
408 ec->reference_count++;
409 if (test_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags) &&
410 ec->reference_count == 1)
411 acpi_ec_enable_gpe(ec, true);
412}
413
414static void acpi_ec_complete_request(struct acpi_ec *ec)
415{
416 bool flushed = false;
417
418 ec->reference_count--;
419 if (test_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags) &&
420 ec->reference_count == 0)
421 acpi_ec_disable_gpe(ec, true);
422 flushed = acpi_ec_flushed(ec);
423 if (flushed)
424 wake_up(&ec->wait);
425}
426
427static void acpi_ec_mask_gpe(struct acpi_ec *ec)
428{
429 if (!test_bit(EC_FLAGS_GPE_MASKED, &ec->flags)) {
430 acpi_ec_disable_gpe(ec, false);
431 ec_dbg_drv("Polling enabled");
432 set_bit(EC_FLAGS_GPE_MASKED, &ec->flags);
433 }
434}
435
436static void acpi_ec_unmask_gpe(struct acpi_ec *ec)
437{
438 if (test_bit(EC_FLAGS_GPE_MASKED, &ec->flags)) {
439 clear_bit(EC_FLAGS_GPE_MASKED, &ec->flags);
440 acpi_ec_enable_gpe(ec, false);
441 ec_dbg_drv("Polling disabled");
442 }
443}
444
445
446
447
448
449
450
451
452
453
454
455
456static bool acpi_ec_submit_flushable_request(struct acpi_ec *ec)
457{
458 if (!acpi_ec_started(ec))
459 return false;
460 acpi_ec_submit_request(ec);
461 return true;
462}
463
464static void acpi_ec_submit_query(struct acpi_ec *ec)
465{
466 acpi_ec_mask_gpe(ec);
467 if (!acpi_ec_event_enabled(ec))
468 return;
469 if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) {
470 ec_dbg_evt("Command(%s) submitted/blocked",
471 acpi_ec_cmd_string(ACPI_EC_COMMAND_QUERY));
472 ec->nr_pending_queries++;
473 schedule_work(&ec->work);
474 }
475}
476
477static void acpi_ec_complete_query(struct acpi_ec *ec)
478{
479 if (test_and_clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags))
480 ec_dbg_evt("Command(%s) unblocked",
481 acpi_ec_cmd_string(ACPI_EC_COMMAND_QUERY));
482 acpi_ec_unmask_gpe(ec);
483}
484
485static inline void __acpi_ec_enable_event(struct acpi_ec *ec)
486{
487 if (!test_and_set_bit(EC_FLAGS_QUERY_ENABLED, &ec->flags))
488 ec_log_drv("event unblocked");
489 if (!test_bit(EC_FLAGS_QUERY_PENDING, &ec->flags))
490 advance_transaction(ec);
491}
492
493static inline void __acpi_ec_disable_event(struct acpi_ec *ec)
494{
495 if (test_and_clear_bit(EC_FLAGS_QUERY_ENABLED, &ec->flags))
496 ec_log_drv("event blocked");
497}
498
499static void acpi_ec_enable_event(struct acpi_ec *ec)
500{
501 unsigned long flags;
502
503 spin_lock_irqsave(&ec->lock, flags);
504 if (acpi_ec_started(ec))
505 __acpi_ec_enable_event(ec);
506 spin_unlock_irqrestore(&ec->lock, flags);
507}
508
509#ifdef CONFIG_PM_SLEEP
510static bool acpi_ec_query_flushed(struct acpi_ec *ec)
511{
512 bool flushed;
513 unsigned long flags;
514
515 spin_lock_irqsave(&ec->lock, flags);
516 flushed = !ec->nr_pending_queries;
517 spin_unlock_irqrestore(&ec->lock, flags);
518 return flushed;
519}
520
521static void __acpi_ec_flush_event(struct acpi_ec *ec)
522{
523
524
525
526
527 wait_event(ec->wait, acpi_ec_query_flushed(ec));
528 if (ec_query_wq)
529 flush_workqueue(ec_query_wq);
530}
531
532static void acpi_ec_disable_event(struct acpi_ec *ec)
533{
534 unsigned long flags;
535
536 spin_lock_irqsave(&ec->lock, flags);
537 __acpi_ec_disable_event(ec);
538 spin_unlock_irqrestore(&ec->lock, flags);
539 __acpi_ec_flush_event(ec);
540}
541
542void acpi_ec_flush_work(void)
543{
544 if (first_ec)
545 __acpi_ec_flush_event(first_ec);
546
547 flush_scheduled_work();
548}
549#endif
550
551static bool acpi_ec_guard_event(struct acpi_ec *ec)
552{
553 bool guarded = true;
554 unsigned long flags;
555
556 spin_lock_irqsave(&ec->lock, flags);
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571 if (ec_event_clearing == ACPI_EC_EVT_TIMING_STATUS ||
572 ec_event_clearing == ACPI_EC_EVT_TIMING_QUERY ||
573 !test_bit(EC_FLAGS_QUERY_PENDING, &ec->flags) ||
574 (ec->curr && ec->curr->command == ACPI_EC_COMMAND_QUERY))
575 guarded = false;
576 spin_unlock_irqrestore(&ec->lock, flags);
577 return guarded;
578}
579
580static int ec_transaction_polled(struct acpi_ec *ec)
581{
582 unsigned long flags;
583 int ret = 0;
584
585 spin_lock_irqsave(&ec->lock, flags);
586 if (ec->curr && (ec->curr->flags & ACPI_EC_COMMAND_POLL))
587 ret = 1;
588 spin_unlock_irqrestore(&ec->lock, flags);
589 return ret;
590}
591
592static int ec_transaction_completed(struct acpi_ec *ec)
593{
594 unsigned long flags;
595 int ret = 0;
596
597 spin_lock_irqsave(&ec->lock, flags);
598 if (ec->curr && (ec->curr->flags & ACPI_EC_COMMAND_COMPLETE))
599 ret = 1;
600 spin_unlock_irqrestore(&ec->lock, flags);
601 return ret;
602}
603
604static inline void ec_transaction_transition(struct acpi_ec *ec, unsigned long flag)
605{
606 ec->curr->flags |= flag;
607 if (ec->curr->command == ACPI_EC_COMMAND_QUERY) {
608 if (ec_event_clearing == ACPI_EC_EVT_TIMING_STATUS &&
609 flag == ACPI_EC_COMMAND_POLL)
610 acpi_ec_complete_query(ec);
611 if (ec_event_clearing == ACPI_EC_EVT_TIMING_QUERY &&
612 flag == ACPI_EC_COMMAND_COMPLETE)
613 acpi_ec_complete_query(ec);
614 if (ec_event_clearing == ACPI_EC_EVT_TIMING_EVENT &&
615 flag == ACPI_EC_COMMAND_COMPLETE)
616 set_bit(EC_FLAGS_QUERY_GUARDING, &ec->flags);
617 }
618}
619
620static void advance_transaction(struct acpi_ec *ec)
621{
622 struct transaction *t;
623 u8 status;
624 bool wakeup = false;
625
626 ec_dbg_stm("%s (%d)", in_interrupt() ? "IRQ" : "TASK",
627 smp_processor_id());
628
629
630
631
632
633 acpi_ec_clear_gpe(ec);
634 status = acpi_ec_read_status(ec);
635 t = ec->curr;
636
637
638
639
640 if (!t || !(t->flags & ACPI_EC_COMMAND_POLL)) {
641 if (ec_event_clearing == ACPI_EC_EVT_TIMING_EVENT &&
642 (!ec->nr_pending_queries ||
643 test_bit(EC_FLAGS_QUERY_GUARDING, &ec->flags))) {
644 clear_bit(EC_FLAGS_QUERY_GUARDING, &ec->flags);
645 acpi_ec_complete_query(ec);
646 }
647 }
648 if (!t)
649 goto err;
650 if (t->flags & ACPI_EC_COMMAND_POLL) {
651 if (t->wlen > t->wi) {
652 if ((status & ACPI_EC_FLAG_IBF) == 0)
653 acpi_ec_write_data(ec, t->wdata[t->wi++]);
654 else
655 goto err;
656 } else if (t->rlen > t->ri) {
657 if ((status & ACPI_EC_FLAG_OBF) == 1) {
658 t->rdata[t->ri++] = acpi_ec_read_data(ec);
659 if (t->rlen == t->ri) {
660 ec_transaction_transition(ec, ACPI_EC_COMMAND_COMPLETE);
661 if (t->command == ACPI_EC_COMMAND_QUERY)
662 ec_dbg_evt("Command(%s) completed by hardware",
663 acpi_ec_cmd_string(ACPI_EC_COMMAND_QUERY));
664 wakeup = true;
665 }
666 } else
667 goto err;
668 } else if (t->wlen == t->wi &&
669 (status & ACPI_EC_FLAG_IBF) == 0) {
670 ec_transaction_transition(ec, ACPI_EC_COMMAND_COMPLETE);
671 wakeup = true;
672 }
673 goto out;
674 } else {
675 if (EC_FLAGS_QUERY_HANDSHAKE &&
676 !(status & ACPI_EC_FLAG_SCI) &&
677 (t->command == ACPI_EC_COMMAND_QUERY)) {
678 ec_transaction_transition(ec, ACPI_EC_COMMAND_POLL);
679 t->rdata[t->ri++] = 0x00;
680 ec_transaction_transition(ec, ACPI_EC_COMMAND_COMPLETE);
681 ec_dbg_evt("Command(%s) completed by software",
682 acpi_ec_cmd_string(ACPI_EC_COMMAND_QUERY));
683 wakeup = true;
684 } else if ((status & ACPI_EC_FLAG_IBF) == 0) {
685 acpi_ec_write_cmd(ec, t->command);
686 ec_transaction_transition(ec, ACPI_EC_COMMAND_POLL);
687 } else
688 goto err;
689 goto out;
690 }
691err:
692
693
694
695
696 if (!(status & ACPI_EC_FLAG_SCI)) {
697 if (in_interrupt() && t) {
698 if (t->irq_count < ec_storm_threshold)
699 ++t->irq_count;
700
701 if (t->irq_count == ec_storm_threshold)
702 acpi_ec_mask_gpe(ec);
703 }
704 }
705out:
706 if (status & ACPI_EC_FLAG_SCI)
707 acpi_ec_submit_query(ec);
708 if (wakeup && in_interrupt())
709 wake_up(&ec->wait);
710}
711
712static void start_transaction(struct acpi_ec *ec)
713{
714 ec->curr->irq_count = ec->curr->wi = ec->curr->ri = 0;
715 ec->curr->flags = 0;
716}
717
718static int ec_guard(struct acpi_ec *ec)
719{
720 unsigned long guard = usecs_to_jiffies(ec->polling_guard);
721 unsigned long timeout = ec->timestamp + guard;
722
723
724 do {
725 if (ec->busy_polling) {
726
727 if (ec_transaction_completed(ec))
728 return 0;
729 udelay(jiffies_to_usecs(guard));
730 } else {
731
732
733
734
735
736
737
738
739
740
741 if (!ec_transaction_polled(ec) &&
742 !acpi_ec_guard_event(ec))
743 break;
744 if (wait_event_timeout(ec->wait,
745 ec_transaction_completed(ec),
746 guard))
747 return 0;
748 }
749 } while (time_before(jiffies, timeout));
750 return -ETIME;
751}
752
753static int ec_poll(struct acpi_ec *ec)
754{
755 unsigned long flags;
756 int repeat = 5;
757
758 while (repeat--) {
759 unsigned long delay = jiffies +
760 msecs_to_jiffies(ec_delay);
761 do {
762 if (!ec_guard(ec))
763 return 0;
764 spin_lock_irqsave(&ec->lock, flags);
765 advance_transaction(ec);
766 spin_unlock_irqrestore(&ec->lock, flags);
767 } while (time_before(jiffies, delay));
768 pr_debug("controller reset, restart transaction\n");
769 spin_lock_irqsave(&ec->lock, flags);
770 start_transaction(ec);
771 spin_unlock_irqrestore(&ec->lock, flags);
772 }
773 return -ETIME;
774}
775
776static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,
777 struct transaction *t)
778{
779 unsigned long tmp;
780 int ret = 0;
781
782
783 spin_lock_irqsave(&ec->lock, tmp);
784
785 if (!acpi_ec_submit_flushable_request(ec)) {
786 ret = -EINVAL;
787 goto unlock;
788 }
789 ec_dbg_ref(ec, "Increase command");
790
791 ec->curr = t;
792 ec_dbg_req("Command(%s) started", acpi_ec_cmd_string(t->command));
793 start_transaction(ec);
794 spin_unlock_irqrestore(&ec->lock, tmp);
795
796 ret = ec_poll(ec);
797
798 spin_lock_irqsave(&ec->lock, tmp);
799 if (t->irq_count == ec_storm_threshold)
800 acpi_ec_unmask_gpe(ec);
801 ec_dbg_req("Command(%s) stopped", acpi_ec_cmd_string(t->command));
802 ec->curr = NULL;
803
804 acpi_ec_complete_request(ec);
805 ec_dbg_ref(ec, "Decrease command");
806unlock:
807 spin_unlock_irqrestore(&ec->lock, tmp);
808 return ret;
809}
810
811static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t)
812{
813 int status;
814 u32 glk;
815
816 if (!ec || (!t) || (t->wlen && !t->wdata) || (t->rlen && !t->rdata))
817 return -EINVAL;
818 if (t->rdata)
819 memset(t->rdata, 0, t->rlen);
820
821 mutex_lock(&ec->mutex);
822 if (ec->global_lock) {
823 status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk);
824 if (ACPI_FAILURE(status)) {
825 status = -ENODEV;
826 goto unlock;
827 }
828 }
829
830 status = acpi_ec_transaction_unlocked(ec, t);
831
832 if (ec->global_lock)
833 acpi_release_global_lock(glk);
834unlock:
835 mutex_unlock(&ec->mutex);
836 return status;
837}
838
839static int acpi_ec_burst_enable(struct acpi_ec *ec)
840{
841 u8 d;
842 struct transaction t = {.command = ACPI_EC_BURST_ENABLE,
843 .wdata = NULL, .rdata = &d,
844 .wlen = 0, .rlen = 1};
845
846 return acpi_ec_transaction(ec, &t);
847}
848
849static int acpi_ec_burst_disable(struct acpi_ec *ec)
850{
851 struct transaction t = {.command = ACPI_EC_BURST_DISABLE,
852 .wdata = NULL, .rdata = NULL,
853 .wlen = 0, .rlen = 0};
854
855 return (acpi_ec_read_status(ec) & ACPI_EC_FLAG_BURST) ?
856 acpi_ec_transaction(ec, &t) : 0;
857}
858
859static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 *data)
860{
861 int result;
862 u8 d;
863 struct transaction t = {.command = ACPI_EC_COMMAND_READ,
864 .wdata = &address, .rdata = &d,
865 .wlen = 1, .rlen = 1};
866
867 result = acpi_ec_transaction(ec, &t);
868 *data = d;
869 return result;
870}
871
872static int acpi_ec_write(struct acpi_ec *ec, u8 address, u8 data)
873{
874 u8 wdata[2] = { address, data };
875 struct transaction t = {.command = ACPI_EC_COMMAND_WRITE,
876 .wdata = wdata, .rdata = NULL,
877 .wlen = 2, .rlen = 0};
878
879 return acpi_ec_transaction(ec, &t);
880}
881
882int ec_read(u8 addr, u8 *val)
883{
884 int err;
885 u8 temp_data;
886
887 if (!first_ec)
888 return -ENODEV;
889
890 err = acpi_ec_read(first_ec, addr, &temp_data);
891
892 if (!err) {
893 *val = temp_data;
894 return 0;
895 }
896 return err;
897}
898EXPORT_SYMBOL(ec_read);
899
900int ec_write(u8 addr, u8 val)
901{
902 int err;
903
904 if (!first_ec)
905 return -ENODEV;
906
907 err = acpi_ec_write(first_ec, addr, val);
908
909 return err;
910}
911EXPORT_SYMBOL(ec_write);
912
913int ec_transaction(u8 command,
914 const u8 *wdata, unsigned wdata_len,
915 u8 *rdata, unsigned rdata_len)
916{
917 struct transaction t = {.command = command,
918 .wdata = wdata, .rdata = rdata,
919 .wlen = wdata_len, .rlen = rdata_len};
920
921 if (!first_ec)
922 return -ENODEV;
923
924 return acpi_ec_transaction(first_ec, &t);
925}
926EXPORT_SYMBOL(ec_transaction);
927
928
929acpi_handle ec_get_handle(void)
930{
931 if (!first_ec)
932 return NULL;
933 return first_ec->handle;
934}
935EXPORT_SYMBOL(ec_get_handle);
936
937static void acpi_ec_start(struct acpi_ec *ec, bool resuming)
938{
939 unsigned long flags;
940
941 spin_lock_irqsave(&ec->lock, flags);
942 if (!test_and_set_bit(EC_FLAGS_STARTED, &ec->flags)) {
943 ec_dbg_drv("Starting EC");
944
945 if (!resuming) {
946 acpi_ec_submit_request(ec);
947 ec_dbg_ref(ec, "Increase driver");
948 }
949 ec_log_drv("EC started");
950 }
951 spin_unlock_irqrestore(&ec->lock, flags);
952}
953
954static bool acpi_ec_stopped(struct acpi_ec *ec)
955{
956 unsigned long flags;
957 bool flushed;
958
959 spin_lock_irqsave(&ec->lock, flags);
960 flushed = acpi_ec_flushed(ec);
961 spin_unlock_irqrestore(&ec->lock, flags);
962 return flushed;
963}
964
965static void acpi_ec_stop(struct acpi_ec *ec, bool suspending)
966{
967 unsigned long flags;
968
969 spin_lock_irqsave(&ec->lock, flags);
970 if (acpi_ec_started(ec)) {
971 ec_dbg_drv("Stopping EC");
972 set_bit(EC_FLAGS_STOPPED, &ec->flags);
973 spin_unlock_irqrestore(&ec->lock, flags);
974 wait_event(ec->wait, acpi_ec_stopped(ec));
975 spin_lock_irqsave(&ec->lock, flags);
976
977 if (!suspending) {
978 acpi_ec_complete_request(ec);
979 ec_dbg_ref(ec, "Decrease driver");
980 } else if (!ec_freeze_events)
981 __acpi_ec_disable_event(ec);
982 clear_bit(EC_FLAGS_STARTED, &ec->flags);
983 clear_bit(EC_FLAGS_STOPPED, &ec->flags);
984 ec_log_drv("EC stopped");
985 }
986 spin_unlock_irqrestore(&ec->lock, flags);
987}
988
989static void acpi_ec_enter_noirq(struct acpi_ec *ec)
990{
991 unsigned long flags;
992
993 spin_lock_irqsave(&ec->lock, flags);
994 ec->busy_polling = true;
995 ec->polling_guard = 0;
996 ec_log_drv("interrupt blocked");
997 spin_unlock_irqrestore(&ec->lock, flags);
998}
999
1000static void acpi_ec_leave_noirq(struct acpi_ec *ec)
1001{
1002 unsigned long flags;
1003
1004 spin_lock_irqsave(&ec->lock, flags);
1005 ec->busy_polling = ec_busy_polling;
1006 ec->polling_guard = ec_polling_guard;
1007 ec_log_drv("interrupt unblocked");
1008 spin_unlock_irqrestore(&ec->lock, flags);
1009}
1010
1011void acpi_ec_block_transactions(void)
1012{
1013 struct acpi_ec *ec = first_ec;
1014
1015 if (!ec)
1016 return;
1017
1018 mutex_lock(&ec->mutex);
1019
1020 acpi_ec_stop(ec, true);
1021 mutex_unlock(&ec->mutex);
1022}
1023
1024void acpi_ec_unblock_transactions(void)
1025{
1026
1027
1028
1029
1030 if (first_ec)
1031 acpi_ec_start(first_ec, true);
1032}
1033
1034
1035
1036
1037static struct acpi_ec_query_handler *
1038acpi_ec_get_query_handler(struct acpi_ec_query_handler *handler)
1039{
1040 if (handler)
1041 kref_get(&handler->kref);
1042 return handler;
1043}
1044
1045static struct acpi_ec_query_handler *
1046acpi_ec_get_query_handler_by_value(struct acpi_ec *ec, u8 value)
1047{
1048 struct acpi_ec_query_handler *handler;
1049 bool found = false;
1050
1051 mutex_lock(&ec->mutex);
1052 list_for_each_entry(handler, &ec->list, node) {
1053 if (value == handler->query_bit) {
1054 found = true;
1055 break;
1056 }
1057 }
1058 mutex_unlock(&ec->mutex);
1059 return found ? acpi_ec_get_query_handler(handler) : NULL;
1060}
1061
1062static void acpi_ec_query_handler_release(struct kref *kref)
1063{
1064 struct acpi_ec_query_handler *handler =
1065 container_of(kref, struct acpi_ec_query_handler, kref);
1066
1067 kfree(handler);
1068}
1069
1070static void acpi_ec_put_query_handler(struct acpi_ec_query_handler *handler)
1071{
1072 kref_put(&handler->kref, acpi_ec_query_handler_release);
1073}
1074
1075int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
1076 acpi_handle handle, acpi_ec_query_func func,
1077 void *data)
1078{
1079 struct acpi_ec_query_handler *handler =
1080 kzalloc(sizeof(struct acpi_ec_query_handler), GFP_KERNEL);
1081
1082 if (!handler)
1083 return -ENOMEM;
1084
1085 handler->query_bit = query_bit;
1086 handler->handle = handle;
1087 handler->func = func;
1088 handler->data = data;
1089 mutex_lock(&ec->mutex);
1090 kref_init(&handler->kref);
1091 list_add(&handler->node, &ec->list);
1092 mutex_unlock(&ec->mutex);
1093 return 0;
1094}
1095EXPORT_SYMBOL_GPL(acpi_ec_add_query_handler);
1096
1097static void acpi_ec_remove_query_handlers(struct acpi_ec *ec,
1098 bool remove_all, u8 query_bit)
1099{
1100 struct acpi_ec_query_handler *handler, *tmp;
1101 LIST_HEAD(free_list);
1102
1103 mutex_lock(&ec->mutex);
1104 list_for_each_entry_safe(handler, tmp, &ec->list, node) {
1105 if (remove_all || query_bit == handler->query_bit) {
1106 list_del_init(&handler->node);
1107 list_add(&handler->node, &free_list);
1108 }
1109 }
1110 mutex_unlock(&ec->mutex);
1111 list_for_each_entry_safe(handler, tmp, &free_list, node)
1112 acpi_ec_put_query_handler(handler);
1113}
1114
1115void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit)
1116{
1117 acpi_ec_remove_query_handlers(ec, false, query_bit);
1118}
1119EXPORT_SYMBOL_GPL(acpi_ec_remove_query_handler);
1120
1121static struct acpi_ec_query *acpi_ec_create_query(u8 *pval)
1122{
1123 struct acpi_ec_query *q;
1124 struct transaction *t;
1125
1126 q = kzalloc(sizeof (struct acpi_ec_query), GFP_KERNEL);
1127 if (!q)
1128 return NULL;
1129 INIT_WORK(&q->work, acpi_ec_event_processor);
1130 t = &q->transaction;
1131 t->command = ACPI_EC_COMMAND_QUERY;
1132 t->rdata = pval;
1133 t->rlen = 1;
1134 return q;
1135}
1136
1137static void acpi_ec_delete_query(struct acpi_ec_query *q)
1138{
1139 if (q) {
1140 if (q->handler)
1141 acpi_ec_put_query_handler(q->handler);
1142 kfree(q);
1143 }
1144}
1145
1146static void acpi_ec_event_processor(struct work_struct *work)
1147{
1148 struct acpi_ec_query *q = container_of(work, struct acpi_ec_query, work);
1149 struct acpi_ec_query_handler *handler = q->handler;
1150
1151 ec_dbg_evt("Query(0x%02x) started", handler->query_bit);
1152 if (handler->func)
1153 handler->func(handler->data);
1154 else if (handler->handle)
1155 acpi_evaluate_object(handler->handle, NULL, NULL, NULL);
1156 ec_dbg_evt("Query(0x%02x) stopped", handler->query_bit);
1157 acpi_ec_delete_query(q);
1158}
1159
1160static int acpi_ec_query(struct acpi_ec *ec, u8 *data)
1161{
1162 u8 value = 0;
1163 int result;
1164 struct acpi_ec_query *q;
1165
1166 q = acpi_ec_create_query(&value);
1167 if (!q)
1168 return -ENOMEM;
1169
1170
1171
1172
1173
1174
1175 result = acpi_ec_transaction(ec, &q->transaction);
1176 if (!value)
1177 result = -ENODATA;
1178 if (result)
1179 goto err_exit;
1180
1181 q->handler = acpi_ec_get_query_handler_by_value(ec, value);
1182 if (!q->handler) {
1183 result = -ENODATA;
1184 goto err_exit;
1185 }
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196 ec_dbg_evt("Query(0x%02x) scheduled", value);
1197 if (!queue_work(ec_query_wq, &q->work)) {
1198 ec_dbg_evt("Query(0x%02x) overlapped", value);
1199 result = -EBUSY;
1200 }
1201
1202err_exit:
1203 if (result)
1204 acpi_ec_delete_query(q);
1205 if (data)
1206 *data = value;
1207 return result;
1208}
1209
1210static void acpi_ec_check_event(struct acpi_ec *ec)
1211{
1212 unsigned long flags;
1213
1214 if (ec_event_clearing == ACPI_EC_EVT_TIMING_EVENT) {
1215 if (ec_guard(ec)) {
1216 spin_lock_irqsave(&ec->lock, flags);
1217
1218
1219
1220
1221 if (!ec->curr)
1222 advance_transaction(ec);
1223 spin_unlock_irqrestore(&ec->lock, flags);
1224 }
1225 }
1226}
1227
1228static void acpi_ec_event_handler(struct work_struct *work)
1229{
1230 unsigned long flags;
1231 struct acpi_ec *ec = container_of(work, struct acpi_ec, work);
1232
1233 ec_dbg_evt("Event started");
1234
1235 spin_lock_irqsave(&ec->lock, flags);
1236 while (ec->nr_pending_queries) {
1237 spin_unlock_irqrestore(&ec->lock, flags);
1238 (void)acpi_ec_query(ec, NULL);
1239 spin_lock_irqsave(&ec->lock, flags);
1240 ec->nr_pending_queries--;
1241
1242
1243
1244
1245
1246
1247 if (!ec->nr_pending_queries) {
1248 if (ec_event_clearing == ACPI_EC_EVT_TIMING_STATUS ||
1249 ec_event_clearing == ACPI_EC_EVT_TIMING_QUERY)
1250 acpi_ec_complete_query(ec);
1251 }
1252 }
1253 spin_unlock_irqrestore(&ec->lock, flags);
1254
1255 ec_dbg_evt("Event stopped");
1256
1257 acpi_ec_check_event(ec);
1258}
1259
1260static u32 acpi_ec_gpe_handler(acpi_handle gpe_device,
1261 u32 gpe_number, void *data)
1262{
1263 unsigned long flags;
1264 struct acpi_ec *ec = data;
1265
1266 spin_lock_irqsave(&ec->lock, flags);
1267 advance_transaction(ec);
1268 spin_unlock_irqrestore(&ec->lock, flags);
1269 return ACPI_INTERRUPT_HANDLED;
1270}
1271
1272
1273
1274
1275
1276static acpi_status
1277acpi_ec_space_handler(u32 function, acpi_physical_address address,
1278 u32 bits, u64 *value64,
1279 void *handler_context, void *region_context)
1280{
1281 struct acpi_ec *ec = handler_context;
1282 int result = 0, i, bytes = bits / 8;
1283 u8 *value = (u8 *)value64;
1284
1285 if ((address > 0xFF) || !value || !handler_context)
1286 return AE_BAD_PARAMETER;
1287
1288 if (function != ACPI_READ && function != ACPI_WRITE)
1289 return AE_BAD_PARAMETER;
1290
1291 if (ec->busy_polling || bits > 8)
1292 acpi_ec_burst_enable(ec);
1293
1294 for (i = 0; i < bytes; ++i, ++address, ++value)
1295 result = (function == ACPI_READ) ?
1296 acpi_ec_read(ec, address, value) :
1297 acpi_ec_write(ec, address, *value);
1298
1299 if (ec->busy_polling || bits > 8)
1300 acpi_ec_burst_disable(ec);
1301
1302 switch (result) {
1303 case -EINVAL:
1304 return AE_BAD_PARAMETER;
1305 case -ENODEV:
1306 return AE_NOT_FOUND;
1307 case -ETIME:
1308 return AE_TIME;
1309 default:
1310 return AE_OK;
1311 }
1312}
1313
1314
1315
1316
1317
1318static acpi_status
1319ec_parse_io_ports(struct acpi_resource *resource, void *context);
1320
1321static void acpi_ec_free(struct acpi_ec *ec)
1322{
1323 if (first_ec == ec)
1324 first_ec = NULL;
1325 if (boot_ec == ec)
1326 boot_ec = NULL;
1327 kfree(ec);
1328}
1329
1330static struct acpi_ec *acpi_ec_alloc(void)
1331{
1332 struct acpi_ec *ec = kzalloc(sizeof(struct acpi_ec), GFP_KERNEL);
1333
1334 if (!ec)
1335 return NULL;
1336 mutex_init(&ec->mutex);
1337 init_waitqueue_head(&ec->wait);
1338 INIT_LIST_HEAD(&ec->list);
1339 spin_lock_init(&ec->lock);
1340 INIT_WORK(&ec->work, acpi_ec_event_handler);
1341 ec->timestamp = jiffies;
1342 ec->busy_polling = true;
1343 ec->polling_guard = 0;
1344 return ec;
1345}
1346
1347static acpi_status
1348acpi_ec_register_query_methods(acpi_handle handle, u32 level,
1349 void *context, void **return_value)
1350{
1351 char node_name[5];
1352 struct acpi_buffer buffer = { sizeof(node_name), node_name };
1353 struct acpi_ec *ec = context;
1354 int value = 0;
1355 acpi_status status;
1356
1357 status = acpi_get_name(handle, ACPI_SINGLE_NAME, &buffer);
1358
1359 if (ACPI_SUCCESS(status) && sscanf(node_name, "_Q%x", &value) == 1)
1360 acpi_ec_add_query_handler(ec, value, handle, NULL, NULL);
1361 return AE_OK;
1362}
1363
1364static acpi_status
1365ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval)
1366{
1367 acpi_status status;
1368 unsigned long long tmp = 0;
1369 struct acpi_ec *ec = context;
1370
1371
1372 ec->command_addr = ec->data_addr = 0;
1373
1374 status = acpi_walk_resources(handle, METHOD_NAME__CRS,
1375 ec_parse_io_ports, ec);
1376 if (ACPI_FAILURE(status))
1377 return status;
1378 if (ec->data_addr == 0 || ec->command_addr == 0)
1379 return AE_OK;
1380
1381 if (boot_ec && boot_ec_is_ecdt && EC_FLAGS_IGNORE_DSDT_GPE) {
1382
1383
1384
1385
1386 ec->gpe = boot_ec->gpe;
1387 } else {
1388
1389
1390 status = acpi_evaluate_integer(handle, "_GPE", NULL, &tmp);
1391 if (ACPI_FAILURE(status))
1392 return status;
1393 ec->gpe = tmp;
1394 }
1395
1396 tmp = 0;
1397 acpi_evaluate_integer(handle, "_GLK", NULL, &tmp);
1398 ec->global_lock = tmp;
1399 ec->handle = handle;
1400 return AE_CTRL_TERMINATE;
1401}
1402
1403
1404
1405
1406
1407
1408static int ec_install_handlers(struct acpi_ec *ec, bool handle_events)
1409{
1410 acpi_status status;
1411
1412 acpi_ec_start(ec, false);
1413
1414 if (!test_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags)) {
1415 acpi_ec_enter_noirq(ec);
1416 status = acpi_install_address_space_handler(ec->handle,
1417 ACPI_ADR_SPACE_EC,
1418 &acpi_ec_space_handler,
1419 NULL, ec);
1420 if (ACPI_FAILURE(status)) {
1421 if (status == AE_NOT_FOUND) {
1422
1423
1424
1425
1426
1427
1428 pr_err("Fail in evaluating the _REG object"
1429 " of EC device. Broken bios is suspected.\n");
1430 } else {
1431 acpi_ec_stop(ec, false);
1432 return -ENODEV;
1433 }
1434 }
1435 set_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags);
1436 }
1437
1438 if (!handle_events)
1439 return 0;
1440
1441 if (!test_bit(EC_FLAGS_EVT_HANDLER_INSTALLED, &ec->flags)) {
1442
1443 acpi_walk_namespace(ACPI_TYPE_METHOD, ec->handle, 1,
1444 acpi_ec_register_query_methods,
1445 NULL, ec, NULL);
1446 set_bit(EC_FLAGS_EVT_HANDLER_INSTALLED, &ec->flags);
1447 }
1448 if (!test_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags)) {
1449 status = acpi_install_gpe_raw_handler(NULL, ec->gpe,
1450 ACPI_GPE_EDGE_TRIGGERED,
1451 &acpi_ec_gpe_handler, ec);
1452
1453 if (ACPI_SUCCESS(status)) {
1454 set_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags);
1455 acpi_ec_leave_noirq(ec);
1456 if (test_bit(EC_FLAGS_STARTED, &ec->flags) &&
1457 ec->reference_count >= 1)
1458 acpi_ec_enable_gpe(ec, true);
1459
1460
1461 acpi_ec_enable_event(ec);
1462 }
1463 }
1464
1465 return 0;
1466}
1467
1468static void ec_remove_handlers(struct acpi_ec *ec)
1469{
1470 if (test_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags)) {
1471 if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle,
1472 ACPI_ADR_SPACE_EC, &acpi_ec_space_handler)))
1473 pr_err("failed to remove space handler\n");
1474 clear_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags);
1475 }
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488 acpi_ec_stop(ec, false);
1489
1490 if (test_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags)) {
1491 if (ACPI_FAILURE(acpi_remove_gpe_handler(NULL, ec->gpe,
1492 &acpi_ec_gpe_handler)))
1493 pr_err("failed to remove gpe handler\n");
1494 clear_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags);
1495 }
1496 if (test_bit(EC_FLAGS_EVT_HANDLER_INSTALLED, &ec->flags)) {
1497 acpi_ec_remove_query_handlers(ec, true, 0);
1498 clear_bit(EC_FLAGS_EVT_HANDLER_INSTALLED, &ec->flags);
1499 }
1500}
1501
1502static int acpi_ec_setup(struct acpi_ec *ec, bool handle_events)
1503{
1504 int ret;
1505
1506 ret = ec_install_handlers(ec, handle_events);
1507 if (ret)
1508 return ret;
1509
1510
1511 if (!first_ec) {
1512 first_ec = ec;
1513 acpi_handle_info(first_ec->handle, "Used as first EC\n");
1514 }
1515
1516 acpi_handle_info(ec->handle,
1517 "GPE=0x%lx, EC_CMD/EC_SC=0x%lx, EC_DATA=0x%lx\n",
1518 ec->gpe, ec->command_addr, ec->data_addr);
1519 return ret;
1520}
1521
1522static int acpi_config_boot_ec(struct acpi_ec *ec, acpi_handle handle,
1523 bool handle_events, bool is_ecdt)
1524{
1525 int ret;
1526
1527
1528
1529
1530
1531
1532 if (boot_ec && boot_ec->handle != handle)
1533 ec_remove_handlers(boot_ec);
1534
1535
1536 if (boot_ec != ec)
1537 acpi_ec_free(boot_ec);
1538
1539
1540
1541
1542
1543
1544
1545 if (ec->handle != handle)
1546 ec->handle = handle;
1547
1548 ret = acpi_ec_setup(ec, handle_events);
1549 if (ret)
1550 return ret;
1551
1552
1553 if (!boot_ec) {
1554 boot_ec = ec;
1555 boot_ec_is_ecdt = is_ecdt;
1556 }
1557
1558 acpi_handle_info(boot_ec->handle,
1559 "Used as boot %s EC to handle transactions%s\n",
1560 is_ecdt ? "ECDT" : "DSDT",
1561 handle_events ? " and events" : "");
1562 return ret;
1563}
1564
1565static bool acpi_ec_ecdt_get_handle(acpi_handle *phandle)
1566{
1567 struct acpi_table_ecdt *ecdt_ptr;
1568 acpi_status status;
1569 acpi_handle handle;
1570
1571 status = acpi_get_table(ACPI_SIG_ECDT, 1,
1572 (struct acpi_table_header **)&ecdt_ptr);
1573 if (ACPI_FAILURE(status))
1574 return false;
1575
1576 status = acpi_get_handle(NULL, ecdt_ptr->id, &handle);
1577 if (ACPI_FAILURE(status))
1578 return false;
1579
1580 *phandle = handle;
1581 return true;
1582}
1583
1584static bool acpi_is_boot_ec(struct acpi_ec *ec)
1585{
1586 if (!boot_ec)
1587 return false;
1588 if (ec->command_addr == boot_ec->command_addr &&
1589 ec->data_addr == boot_ec->data_addr)
1590 return true;
1591 return false;
1592}
1593
1594static int acpi_ec_add(struct acpi_device *device)
1595{
1596 struct acpi_ec *ec = NULL;
1597 int ret;
1598
1599 strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME);
1600 strcpy(acpi_device_class(device), ACPI_EC_CLASS);
1601
1602 ec = acpi_ec_alloc();
1603 if (!ec)
1604 return -ENOMEM;
1605 if (ec_parse_device(device->handle, 0, ec, NULL) !=
1606 AE_CTRL_TERMINATE) {
1607 ret = -EINVAL;
1608 goto err_alloc;
1609 }
1610
1611 if (acpi_is_boot_ec(ec)) {
1612 boot_ec_is_ecdt = false;
1613
1614
1615
1616
1617
1618
1619 boot_ec->handle = ec->handle;
1620 acpi_handle_debug(ec->handle, "duplicated.\n");
1621 acpi_ec_free(ec);
1622 ec = boot_ec;
1623 ret = acpi_config_boot_ec(ec, ec->handle, true, false);
1624 } else
1625 ret = acpi_ec_setup(ec, true);
1626 if (ret)
1627 goto err_query;
1628
1629 device->driver_data = ec;
1630
1631 ret = !!request_region(ec->data_addr, 1, "EC data");
1632 WARN(!ret, "Could not request EC data io port 0x%lx", ec->data_addr);
1633 ret = !!request_region(ec->command_addr, 1, "EC cmd");
1634 WARN(!ret, "Could not request EC cmd io port 0x%lx", ec->command_addr);
1635
1636
1637 acpi_walk_dep_device_list(ec->handle);
1638 acpi_handle_debug(ec->handle, "enumerated.\n");
1639 return 0;
1640
1641err_query:
1642 if (ec != boot_ec)
1643 acpi_ec_remove_query_handlers(ec, true, 0);
1644err_alloc:
1645 if (ec != boot_ec)
1646 acpi_ec_free(ec);
1647 return ret;
1648}
1649
1650static int acpi_ec_remove(struct acpi_device *device)
1651{
1652 struct acpi_ec *ec;
1653
1654 if (!device)
1655 return -EINVAL;
1656
1657 ec = acpi_driver_data(device);
1658 release_region(ec->data_addr, 1);
1659 release_region(ec->command_addr, 1);
1660 device->driver_data = NULL;
1661 if (ec != boot_ec) {
1662 ec_remove_handlers(ec);
1663 acpi_ec_free(ec);
1664 }
1665 return 0;
1666}
1667
1668static acpi_status
1669ec_parse_io_ports(struct acpi_resource *resource, void *context)
1670{
1671 struct acpi_ec *ec = context;
1672
1673 if (resource->type != ACPI_RESOURCE_TYPE_IO)
1674 return AE_OK;
1675
1676
1677
1678
1679
1680
1681 if (ec->data_addr == 0)
1682 ec->data_addr = resource->data.io.minimum;
1683 else if (ec->command_addr == 0)
1684 ec->command_addr = resource->data.io.minimum;
1685 else
1686 return AE_CTRL_TERMINATE;
1687
1688 return AE_OK;
1689}
1690
1691static const struct acpi_device_id ec_device_ids[] = {
1692 {"PNP0C09", 0},
1693 {"", 0},
1694};
1695
1696
1697
1698
1699
1700
1701int __init acpi_ec_dsdt_probe(void)
1702{
1703 acpi_status status;
1704 struct acpi_ec *ec;
1705 int ret;
1706
1707
1708
1709
1710
1711
1712
1713 if (boot_ec)
1714 return -ENODEV;
1715
1716 ec = acpi_ec_alloc();
1717 if (!ec)
1718 return -ENOMEM;
1719
1720
1721
1722
1723 status = acpi_get_devices(ec_device_ids[0].id,
1724 ec_parse_device, ec, NULL);
1725 if (ACPI_FAILURE(status) || !ec->handle) {
1726 ret = -ENODEV;
1727 goto error;
1728 }
1729
1730
1731
1732
1733
1734
1735
1736 ret = acpi_config_boot_ec(ec, ec->handle, false, false);
1737error:
1738 if (ret)
1739 acpi_ec_free(ec);
1740 return ret;
1741}
1742
1743
1744
1745
1746
1747
1748static int __init acpi_ec_ecdt_start(void)
1749{
1750 acpi_handle handle;
1751
1752 if (!boot_ec)
1753 return -ENODEV;
1754
1755 if (!boot_ec_is_ecdt)
1756 return -ENODEV;
1757
1758
1759
1760
1761
1762
1763
1764
1765 if (boot_ec->handle != ACPI_ROOT_OBJECT)
1766 handle = boot_ec->handle;
1767 else if (!acpi_ec_ecdt_get_handle(&handle))
1768 return -ENODEV;
1769 return acpi_config_boot_ec(boot_ec, handle, true, true);
1770}
1771
1772#if 0
1773
1774
1775
1776
1777
1778
1779
1780static int ec_flag_query_handshake(const struct dmi_system_id *id)
1781{
1782 pr_debug("Detected the EC firmware requiring QR_EC issued when SCI_EVT set\n");
1783 EC_FLAGS_QUERY_HANDSHAKE = 1;
1784 return 0;
1785}
1786#endif
1787
1788
1789
1790
1791
1792
1793static int ec_correct_ecdt(const struct dmi_system_id *id)
1794{
1795 pr_debug("Detected system needing ECDT address correction.\n");
1796 EC_FLAGS_CORRECT_ECDT = 1;
1797 return 0;
1798}
1799
1800
1801
1802
1803
1804
1805static int ec_honor_ecdt_gpe(const struct dmi_system_id *id)
1806{
1807 pr_debug("Detected system needing ignore DSDT GPE setting.\n");
1808 EC_FLAGS_IGNORE_DSDT_GPE = 1;
1809 return 0;
1810}
1811
1812static const struct dmi_system_id ec_dmi_table[] __initconst = {
1813 {
1814 ec_correct_ecdt, "MSI MS-171F", {
1815 DMI_MATCH(DMI_SYS_VENDOR, "Micro-Star"),
1816 DMI_MATCH(DMI_PRODUCT_NAME, "MS-171F"),}, NULL},
1817 {
1818 ec_honor_ecdt_gpe, "ASUS FX502VD", {
1819 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1820 DMI_MATCH(DMI_PRODUCT_NAME, "FX502VD"),}, NULL},
1821 {
1822 ec_honor_ecdt_gpe, "ASUS FX502VE", {
1823 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1824 DMI_MATCH(DMI_PRODUCT_NAME, "FX502VE"),}, NULL},
1825 {
1826 ec_honor_ecdt_gpe, "ASUS GL702VMK", {
1827 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1828 DMI_MATCH(DMI_PRODUCT_NAME, "GL702VMK"),}, NULL},
1829 {
1830 ec_honor_ecdt_gpe, "ASUS X550VXK", {
1831 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1832 DMI_MATCH(DMI_PRODUCT_NAME, "X550VXK"),}, NULL},
1833 {
1834 ec_honor_ecdt_gpe, "ASUS X580VD", {
1835 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1836 DMI_MATCH(DMI_PRODUCT_NAME, "X580VD"),}, NULL},
1837 {},
1838};
1839
1840int __init acpi_ec_ecdt_probe(void)
1841{
1842 int ret;
1843 acpi_status status;
1844 struct acpi_table_ecdt *ecdt_ptr;
1845 struct acpi_ec *ec;
1846
1847 ec = acpi_ec_alloc();
1848 if (!ec)
1849 return -ENOMEM;
1850
1851
1852
1853 dmi_check_system(ec_dmi_table);
1854 status = acpi_get_table(ACPI_SIG_ECDT, 1,
1855 (struct acpi_table_header **)&ecdt_ptr);
1856 if (ACPI_FAILURE(status)) {
1857 ret = -ENODEV;
1858 goto error;
1859 }
1860
1861 if (!ecdt_ptr->control.address || !ecdt_ptr->data.address) {
1862
1863
1864
1865
1866 ret = -ENODEV;
1867 goto error;
1868 }
1869
1870 if (EC_FLAGS_CORRECT_ECDT) {
1871 ec->command_addr = ecdt_ptr->data.address;
1872 ec->data_addr = ecdt_ptr->control.address;
1873 } else {
1874 ec->command_addr = ecdt_ptr->control.address;
1875 ec->data_addr = ecdt_ptr->data.address;
1876 }
1877 ec->gpe = ecdt_ptr->gpe;
1878
1879
1880
1881
1882
1883 ret = acpi_config_boot_ec(ec, ACPI_ROOT_OBJECT, false, true);
1884error:
1885 if (ret)
1886 acpi_ec_free(ec);
1887 return ret;
1888}
1889
1890#ifdef CONFIG_PM_SLEEP
1891static int acpi_ec_suspend(struct device *dev)
1892{
1893 struct acpi_ec *ec =
1894 acpi_driver_data(to_acpi_device(dev));
1895
1896 if (acpi_sleep_no_ec_events() && ec_freeze_events)
1897 acpi_ec_disable_event(ec);
1898 return 0;
1899}
1900
1901static int acpi_ec_suspend_noirq(struct device *dev)
1902{
1903 struct acpi_ec *ec = acpi_driver_data(to_acpi_device(dev));
1904
1905
1906
1907
1908
1909 if (ec_no_wakeup && test_bit(EC_FLAGS_STARTED, &ec->flags) &&
1910 ec->reference_count >= 1)
1911 acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_DISABLE);
1912
1913 return 0;
1914}
1915
1916static int acpi_ec_resume_noirq(struct device *dev)
1917{
1918 struct acpi_ec *ec = acpi_driver_data(to_acpi_device(dev));
1919
1920 if (ec_no_wakeup && test_bit(EC_FLAGS_STARTED, &ec->flags) &&
1921 ec->reference_count >= 1)
1922 acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_ENABLE);
1923
1924 return 0;
1925}
1926
1927static int acpi_ec_resume(struct device *dev)
1928{
1929 struct acpi_ec *ec =
1930 acpi_driver_data(to_acpi_device(dev));
1931
1932 acpi_ec_enable_event(ec);
1933 return 0;
1934}
1935#endif
1936
1937static const struct dev_pm_ops acpi_ec_pm = {
1938 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(acpi_ec_suspend_noirq, acpi_ec_resume_noirq)
1939 SET_SYSTEM_SLEEP_PM_OPS(acpi_ec_suspend, acpi_ec_resume)
1940};
1941
1942static int param_set_event_clearing(const char *val, struct kernel_param *kp)
1943{
1944 int result = 0;
1945
1946 if (!strncmp(val, "status", sizeof("status") - 1)) {
1947 ec_event_clearing = ACPI_EC_EVT_TIMING_STATUS;
1948 pr_info("Assuming SCI_EVT clearing on EC_SC accesses\n");
1949 } else if (!strncmp(val, "query", sizeof("query") - 1)) {
1950 ec_event_clearing = ACPI_EC_EVT_TIMING_QUERY;
1951 pr_info("Assuming SCI_EVT clearing on QR_EC writes\n");
1952 } else if (!strncmp(val, "event", sizeof("event") - 1)) {
1953 ec_event_clearing = ACPI_EC_EVT_TIMING_EVENT;
1954 pr_info("Assuming SCI_EVT clearing on event reads\n");
1955 } else
1956 result = -EINVAL;
1957 return result;
1958}
1959
1960static int param_get_event_clearing(char *buffer, struct kernel_param *kp)
1961{
1962 switch (ec_event_clearing) {
1963 case ACPI_EC_EVT_TIMING_STATUS:
1964 return sprintf(buffer, "status");
1965 case ACPI_EC_EVT_TIMING_QUERY:
1966 return sprintf(buffer, "query");
1967 case ACPI_EC_EVT_TIMING_EVENT:
1968 return sprintf(buffer, "event");
1969 default:
1970 return sprintf(buffer, "invalid");
1971 }
1972 return 0;
1973}
1974
1975module_param_call(ec_event_clearing, param_set_event_clearing, param_get_event_clearing,
1976 NULL, 0644);
1977MODULE_PARM_DESC(ec_event_clearing, "Assumed SCI_EVT clearing timing");
1978
1979static struct acpi_driver acpi_ec_driver = {
1980 .name = "ec",
1981 .class = ACPI_EC_CLASS,
1982 .ids = ec_device_ids,
1983 .ops = {
1984 .add = acpi_ec_add,
1985 .remove = acpi_ec_remove,
1986 },
1987 .drv.pm = &acpi_ec_pm,
1988};
1989
1990static inline int acpi_ec_query_init(void)
1991{
1992 if (!ec_query_wq) {
1993 ec_query_wq = alloc_workqueue("kec_query", 0,
1994 ec_max_queries);
1995 if (!ec_query_wq)
1996 return -ENODEV;
1997 }
1998 return 0;
1999}
2000
2001static inline void acpi_ec_query_exit(void)
2002{
2003 if (ec_query_wq) {
2004 destroy_workqueue(ec_query_wq);
2005 ec_query_wq = NULL;
2006 }
2007}
2008
2009int __init acpi_ec_init(void)
2010{
2011 int result;
2012 int ecdt_fail, dsdt_fail;
2013
2014
2015 result = acpi_ec_query_init();
2016 if (result)
2017 return result;
2018
2019
2020 dsdt_fail = acpi_bus_register_driver(&acpi_ec_driver);
2021 ecdt_fail = acpi_ec_ecdt_start();
2022 return ecdt_fail && dsdt_fail ? -ENODEV : 0;
2023}
2024
2025
2026#if 0
2027static void __exit acpi_ec_exit(void)
2028{
2029
2030 acpi_bus_unregister_driver(&acpi_ec_driver);
2031 acpi_ec_query_exit();
2032}
2033#endif
2034