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