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
490
491
492
493 advance_transaction(ec);
494}
495
496static inline void __acpi_ec_disable_event(struct acpi_ec *ec)
497{
498 if (test_and_clear_bit(EC_FLAGS_QUERY_ENABLED, &ec->flags))
499 ec_log_drv("event blocked");
500}
501
502static void acpi_ec_enable_event(struct acpi_ec *ec)
503{
504 unsigned long flags;
505
506 spin_lock_irqsave(&ec->lock, flags);
507 if (acpi_ec_started(ec))
508 __acpi_ec_enable_event(ec);
509 spin_unlock_irqrestore(&ec->lock, flags);
510}
511
512#ifdef CONFIG_PM_SLEEP
513static bool acpi_ec_query_flushed(struct acpi_ec *ec)
514{
515 bool flushed;
516 unsigned long flags;
517
518 spin_lock_irqsave(&ec->lock, flags);
519 flushed = !ec->nr_pending_queries;
520 spin_unlock_irqrestore(&ec->lock, flags);
521 return flushed;
522}
523
524static void __acpi_ec_flush_event(struct acpi_ec *ec)
525{
526
527
528
529
530 wait_event(ec->wait, acpi_ec_query_flushed(ec));
531 if (ec_query_wq)
532 flush_workqueue(ec_query_wq);
533}
534
535static void acpi_ec_disable_event(struct acpi_ec *ec)
536{
537 unsigned long flags;
538
539 spin_lock_irqsave(&ec->lock, flags);
540 __acpi_ec_disable_event(ec);
541 spin_unlock_irqrestore(&ec->lock, flags);
542 __acpi_ec_flush_event(ec);
543}
544
545void acpi_ec_flush_work(void)
546{
547 if (first_ec)
548 __acpi_ec_flush_event(first_ec);
549
550 flush_scheduled_work();
551}
552#endif
553
554static bool acpi_ec_guard_event(struct acpi_ec *ec)
555{
556 bool guarded = true;
557 unsigned long flags;
558
559 spin_lock_irqsave(&ec->lock, flags);
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574 if (ec_event_clearing == ACPI_EC_EVT_TIMING_STATUS ||
575 ec_event_clearing == ACPI_EC_EVT_TIMING_QUERY ||
576 !test_bit(EC_FLAGS_QUERY_PENDING, &ec->flags) ||
577 (ec->curr && ec->curr->command == ACPI_EC_COMMAND_QUERY))
578 guarded = false;
579 spin_unlock_irqrestore(&ec->lock, flags);
580 return guarded;
581}
582
583static int ec_transaction_polled(struct acpi_ec *ec)
584{
585 unsigned long flags;
586 int ret = 0;
587
588 spin_lock_irqsave(&ec->lock, flags);
589 if (ec->curr && (ec->curr->flags & ACPI_EC_COMMAND_POLL))
590 ret = 1;
591 spin_unlock_irqrestore(&ec->lock, flags);
592 return ret;
593}
594
595static int ec_transaction_completed(struct acpi_ec *ec)
596{
597 unsigned long flags;
598 int ret = 0;
599
600 spin_lock_irqsave(&ec->lock, flags);
601 if (ec->curr && (ec->curr->flags & ACPI_EC_COMMAND_COMPLETE))
602 ret = 1;
603 spin_unlock_irqrestore(&ec->lock, flags);
604 return ret;
605}
606
607static inline void ec_transaction_transition(struct acpi_ec *ec, unsigned long flag)
608{
609 ec->curr->flags |= flag;
610 if (ec->curr->command == ACPI_EC_COMMAND_QUERY) {
611 if (ec_event_clearing == ACPI_EC_EVT_TIMING_STATUS &&
612 flag == ACPI_EC_COMMAND_POLL)
613 acpi_ec_complete_query(ec);
614 if (ec_event_clearing == ACPI_EC_EVT_TIMING_QUERY &&
615 flag == ACPI_EC_COMMAND_COMPLETE)
616 acpi_ec_complete_query(ec);
617 if (ec_event_clearing == ACPI_EC_EVT_TIMING_EVENT &&
618 flag == ACPI_EC_COMMAND_COMPLETE)
619 set_bit(EC_FLAGS_QUERY_GUARDING, &ec->flags);
620 }
621}
622
623static void advance_transaction(struct acpi_ec *ec)
624{
625 struct transaction *t;
626 u8 status;
627 bool wakeup = false;
628
629 ec_dbg_stm("%s (%d)", in_interrupt() ? "IRQ" : "TASK",
630 smp_processor_id());
631
632
633
634
635
636 acpi_ec_clear_gpe(ec);
637 status = acpi_ec_read_status(ec);
638 t = ec->curr;
639
640
641
642
643 if (!t || !(t->flags & ACPI_EC_COMMAND_POLL)) {
644 if (ec_event_clearing == ACPI_EC_EVT_TIMING_EVENT &&
645 (!ec->nr_pending_queries ||
646 test_bit(EC_FLAGS_QUERY_GUARDING, &ec->flags))) {
647 clear_bit(EC_FLAGS_QUERY_GUARDING, &ec->flags);
648 acpi_ec_complete_query(ec);
649 }
650 }
651 if (!t)
652 goto err;
653 if (t->flags & ACPI_EC_COMMAND_POLL) {
654 if (t->wlen > t->wi) {
655 if ((status & ACPI_EC_FLAG_IBF) == 0)
656 acpi_ec_write_data(ec, t->wdata[t->wi++]);
657 else
658 goto err;
659 } else if (t->rlen > t->ri) {
660 if ((status & ACPI_EC_FLAG_OBF) == 1) {
661 t->rdata[t->ri++] = acpi_ec_read_data(ec);
662 if (t->rlen == t->ri) {
663 ec_transaction_transition(ec, ACPI_EC_COMMAND_COMPLETE);
664 if (t->command == ACPI_EC_COMMAND_QUERY)
665 ec_dbg_evt("Command(%s) completed by hardware",
666 acpi_ec_cmd_string(ACPI_EC_COMMAND_QUERY));
667 wakeup = true;
668 }
669 } else
670 goto err;
671 } else if (t->wlen == t->wi &&
672 (status & ACPI_EC_FLAG_IBF) == 0) {
673 ec_transaction_transition(ec, ACPI_EC_COMMAND_COMPLETE);
674 wakeup = true;
675 }
676 goto out;
677 } else {
678 if (EC_FLAGS_QUERY_HANDSHAKE &&
679 !(status & ACPI_EC_FLAG_SCI) &&
680 (t->command == ACPI_EC_COMMAND_QUERY)) {
681 ec_transaction_transition(ec, ACPI_EC_COMMAND_POLL);
682 t->rdata[t->ri++] = 0x00;
683 ec_transaction_transition(ec, ACPI_EC_COMMAND_COMPLETE);
684 ec_dbg_evt("Command(%s) completed by software",
685 acpi_ec_cmd_string(ACPI_EC_COMMAND_QUERY));
686 wakeup = true;
687 } else if ((status & ACPI_EC_FLAG_IBF) == 0) {
688 acpi_ec_write_cmd(ec, t->command);
689 ec_transaction_transition(ec, ACPI_EC_COMMAND_POLL);
690 } else
691 goto err;
692 goto out;
693 }
694err:
695
696
697
698
699 if (!(status & ACPI_EC_FLAG_SCI)) {
700 if (in_interrupt() && t) {
701 if (t->irq_count < ec_storm_threshold)
702 ++t->irq_count;
703
704 if (t->irq_count == ec_storm_threshold)
705 acpi_ec_mask_gpe(ec);
706 }
707 }
708out:
709 if (status & ACPI_EC_FLAG_SCI)
710 acpi_ec_submit_query(ec);
711 if (wakeup && in_interrupt())
712 wake_up(&ec->wait);
713}
714
715static void start_transaction(struct acpi_ec *ec)
716{
717 ec->curr->irq_count = ec->curr->wi = ec->curr->ri = 0;
718 ec->curr->flags = 0;
719}
720
721static int ec_guard(struct acpi_ec *ec)
722{
723 unsigned long guard = usecs_to_jiffies(ec->polling_guard);
724 unsigned long timeout = ec->timestamp + guard;
725
726
727 do {
728 if (ec->busy_polling) {
729
730 if (ec_transaction_completed(ec))
731 return 0;
732 udelay(jiffies_to_usecs(guard));
733 } else {
734
735
736
737
738
739
740
741
742
743
744 if (!ec_transaction_polled(ec) &&
745 !acpi_ec_guard_event(ec))
746 break;
747 if (wait_event_timeout(ec->wait,
748 ec_transaction_completed(ec),
749 guard))
750 return 0;
751 }
752 } while (time_before(jiffies, timeout));
753 return -ETIME;
754}
755
756static int ec_poll(struct acpi_ec *ec)
757{
758 unsigned long flags;
759 int repeat = 5;
760
761 while (repeat--) {
762 unsigned long delay = jiffies +
763 msecs_to_jiffies(ec_delay);
764 do {
765 if (!ec_guard(ec))
766 return 0;
767 spin_lock_irqsave(&ec->lock, flags);
768 advance_transaction(ec);
769 spin_unlock_irqrestore(&ec->lock, flags);
770 } while (time_before(jiffies, delay));
771 pr_debug("controller reset, restart transaction\n");
772 spin_lock_irqsave(&ec->lock, flags);
773 start_transaction(ec);
774 spin_unlock_irqrestore(&ec->lock, flags);
775 }
776 return -ETIME;
777}
778
779static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,
780 struct transaction *t)
781{
782 unsigned long tmp;
783 int ret = 0;
784
785
786 spin_lock_irqsave(&ec->lock, tmp);
787
788 if (!acpi_ec_submit_flushable_request(ec)) {
789 ret = -EINVAL;
790 goto unlock;
791 }
792 ec_dbg_ref(ec, "Increase command");
793
794 ec->curr = t;
795 ec_dbg_req("Command(%s) started", acpi_ec_cmd_string(t->command));
796 start_transaction(ec);
797 spin_unlock_irqrestore(&ec->lock, tmp);
798
799 ret = ec_poll(ec);
800
801 spin_lock_irqsave(&ec->lock, tmp);
802 if (t->irq_count == ec_storm_threshold)
803 acpi_ec_unmask_gpe(ec);
804 ec_dbg_req("Command(%s) stopped", acpi_ec_cmd_string(t->command));
805 ec->curr = NULL;
806
807 acpi_ec_complete_request(ec);
808 ec_dbg_ref(ec, "Decrease command");
809unlock:
810 spin_unlock_irqrestore(&ec->lock, tmp);
811 return ret;
812}
813
814static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t)
815{
816 int status;
817 u32 glk;
818
819 if (!ec || (!t) || (t->wlen && !t->wdata) || (t->rlen && !t->rdata))
820 return -EINVAL;
821 if (t->rdata)
822 memset(t->rdata, 0, t->rlen);
823
824 mutex_lock(&ec->mutex);
825 if (ec->global_lock) {
826 status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk);
827 if (ACPI_FAILURE(status)) {
828 status = -ENODEV;
829 goto unlock;
830 }
831 }
832
833 status = acpi_ec_transaction_unlocked(ec, t);
834
835 if (ec->global_lock)
836 acpi_release_global_lock(glk);
837unlock:
838 mutex_unlock(&ec->mutex);
839 return status;
840}
841
842static int acpi_ec_burst_enable(struct acpi_ec *ec)
843{
844 u8 d;
845 struct transaction t = {.command = ACPI_EC_BURST_ENABLE,
846 .wdata = NULL, .rdata = &d,
847 .wlen = 0, .rlen = 1};
848
849 return acpi_ec_transaction(ec, &t);
850}
851
852static int acpi_ec_burst_disable(struct acpi_ec *ec)
853{
854 struct transaction t = {.command = ACPI_EC_BURST_DISABLE,
855 .wdata = NULL, .rdata = NULL,
856 .wlen = 0, .rlen = 0};
857
858 return (acpi_ec_read_status(ec) & ACPI_EC_FLAG_BURST) ?
859 acpi_ec_transaction(ec, &t) : 0;
860}
861
862static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 *data)
863{
864 int result;
865 u8 d;
866 struct transaction t = {.command = ACPI_EC_COMMAND_READ,
867 .wdata = &address, .rdata = &d,
868 .wlen = 1, .rlen = 1};
869
870 result = acpi_ec_transaction(ec, &t);
871 *data = d;
872 return result;
873}
874
875static int acpi_ec_write(struct acpi_ec *ec, u8 address, u8 data)
876{
877 u8 wdata[2] = { address, data };
878 struct transaction t = {.command = ACPI_EC_COMMAND_WRITE,
879 .wdata = wdata, .rdata = NULL,
880 .wlen = 2, .rlen = 0};
881
882 return acpi_ec_transaction(ec, &t);
883}
884
885int ec_read(u8 addr, u8 *val)
886{
887 int err;
888 u8 temp_data;
889
890 if (!first_ec)
891 return -ENODEV;
892
893 err = acpi_ec_read(first_ec, addr, &temp_data);
894
895 if (!err) {
896 *val = temp_data;
897 return 0;
898 }
899 return err;
900}
901EXPORT_SYMBOL(ec_read);
902
903int ec_write(u8 addr, u8 val)
904{
905 int err;
906
907 if (!first_ec)
908 return -ENODEV;
909
910 err = acpi_ec_write(first_ec, addr, val);
911
912 return err;
913}
914EXPORT_SYMBOL(ec_write);
915
916int ec_transaction(u8 command,
917 const u8 *wdata, unsigned wdata_len,
918 u8 *rdata, unsigned rdata_len)
919{
920 struct transaction t = {.command = command,
921 .wdata = wdata, .rdata = rdata,
922 .wlen = wdata_len, .rlen = rdata_len};
923
924 if (!first_ec)
925 return -ENODEV;
926
927 return acpi_ec_transaction(first_ec, &t);
928}
929EXPORT_SYMBOL(ec_transaction);
930
931
932acpi_handle ec_get_handle(void)
933{
934 if (!first_ec)
935 return NULL;
936 return first_ec->handle;
937}
938EXPORT_SYMBOL(ec_get_handle);
939
940static void acpi_ec_start(struct acpi_ec *ec, bool resuming)
941{
942 unsigned long flags;
943
944 spin_lock_irqsave(&ec->lock, flags);
945 if (!test_and_set_bit(EC_FLAGS_STARTED, &ec->flags)) {
946 ec_dbg_drv("Starting EC");
947
948 if (!resuming) {
949 acpi_ec_submit_request(ec);
950 ec_dbg_ref(ec, "Increase driver");
951 }
952 ec_log_drv("EC started");
953 }
954 spin_unlock_irqrestore(&ec->lock, flags);
955}
956
957static bool acpi_ec_stopped(struct acpi_ec *ec)
958{
959 unsigned long flags;
960 bool flushed;
961
962 spin_lock_irqsave(&ec->lock, flags);
963 flushed = acpi_ec_flushed(ec);
964 spin_unlock_irqrestore(&ec->lock, flags);
965 return flushed;
966}
967
968static void acpi_ec_stop(struct acpi_ec *ec, bool suspending)
969{
970 unsigned long flags;
971
972 spin_lock_irqsave(&ec->lock, flags);
973 if (acpi_ec_started(ec)) {
974 ec_dbg_drv("Stopping EC");
975 set_bit(EC_FLAGS_STOPPED, &ec->flags);
976 spin_unlock_irqrestore(&ec->lock, flags);
977 wait_event(ec->wait, acpi_ec_stopped(ec));
978 spin_lock_irqsave(&ec->lock, flags);
979
980 if (!suspending) {
981 acpi_ec_complete_request(ec);
982 ec_dbg_ref(ec, "Decrease driver");
983 } else if (!ec_freeze_events)
984 __acpi_ec_disable_event(ec);
985 clear_bit(EC_FLAGS_STARTED, &ec->flags);
986 clear_bit(EC_FLAGS_STOPPED, &ec->flags);
987 ec_log_drv("EC stopped");
988 }
989 spin_unlock_irqrestore(&ec->lock, flags);
990}
991
992static void acpi_ec_enter_noirq(struct acpi_ec *ec)
993{
994 unsigned long flags;
995
996 spin_lock_irqsave(&ec->lock, flags);
997 ec->busy_polling = true;
998 ec->polling_guard = 0;
999 ec_log_drv("interrupt blocked");
1000 spin_unlock_irqrestore(&ec->lock, flags);
1001}
1002
1003static void acpi_ec_leave_noirq(struct acpi_ec *ec)
1004{
1005 unsigned long flags;
1006
1007 spin_lock_irqsave(&ec->lock, flags);
1008 ec->busy_polling = ec_busy_polling;
1009 ec->polling_guard = ec_polling_guard;
1010 ec_log_drv("interrupt unblocked");
1011 spin_unlock_irqrestore(&ec->lock, flags);
1012}
1013
1014void acpi_ec_block_transactions(void)
1015{
1016 struct acpi_ec *ec = first_ec;
1017
1018 if (!ec)
1019 return;
1020
1021 mutex_lock(&ec->mutex);
1022
1023 acpi_ec_stop(ec, true);
1024 mutex_unlock(&ec->mutex);
1025}
1026
1027void acpi_ec_unblock_transactions(void)
1028{
1029
1030
1031
1032
1033 if (first_ec)
1034 acpi_ec_start(first_ec, true);
1035}
1036
1037void acpi_ec_mark_gpe_for_wake(void)
1038{
1039 if (first_ec && !ec_no_wakeup)
1040 acpi_mark_gpe_for_wake(NULL, first_ec->gpe);
1041}
1042
1043void acpi_ec_set_gpe_wake_mask(u8 action)
1044{
1045 if (first_ec && !ec_no_wakeup)
1046 acpi_set_gpe_wake_mask(NULL, first_ec->gpe, action);
1047}
1048
1049void acpi_ec_dispatch_gpe(void)
1050{
1051 if (first_ec)
1052 acpi_dispatch_gpe(NULL, first_ec->gpe);
1053}
1054
1055
1056
1057
1058static struct acpi_ec_query_handler *
1059acpi_ec_get_query_handler(struct acpi_ec_query_handler *handler)
1060{
1061 if (handler)
1062 kref_get(&handler->kref);
1063 return handler;
1064}
1065
1066static struct acpi_ec_query_handler *
1067acpi_ec_get_query_handler_by_value(struct acpi_ec *ec, u8 value)
1068{
1069 struct acpi_ec_query_handler *handler;
1070 bool found = false;
1071
1072 mutex_lock(&ec->mutex);
1073 list_for_each_entry(handler, &ec->list, node) {
1074 if (value == handler->query_bit) {
1075 found = true;
1076 break;
1077 }
1078 }
1079 mutex_unlock(&ec->mutex);
1080 return found ? acpi_ec_get_query_handler(handler) : NULL;
1081}
1082
1083static void acpi_ec_query_handler_release(struct kref *kref)
1084{
1085 struct acpi_ec_query_handler *handler =
1086 container_of(kref, struct acpi_ec_query_handler, kref);
1087
1088 kfree(handler);
1089}
1090
1091static void acpi_ec_put_query_handler(struct acpi_ec_query_handler *handler)
1092{
1093 kref_put(&handler->kref, acpi_ec_query_handler_release);
1094}
1095
1096int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
1097 acpi_handle handle, acpi_ec_query_func func,
1098 void *data)
1099{
1100 struct acpi_ec_query_handler *handler =
1101 kzalloc(sizeof(struct acpi_ec_query_handler), GFP_KERNEL);
1102
1103 if (!handler)
1104 return -ENOMEM;
1105
1106 handler->query_bit = query_bit;
1107 handler->handle = handle;
1108 handler->func = func;
1109 handler->data = data;
1110 mutex_lock(&ec->mutex);
1111 kref_init(&handler->kref);
1112 list_add(&handler->node, &ec->list);
1113 mutex_unlock(&ec->mutex);
1114 return 0;
1115}
1116EXPORT_SYMBOL_GPL(acpi_ec_add_query_handler);
1117
1118static void acpi_ec_remove_query_handlers(struct acpi_ec *ec,
1119 bool remove_all, u8 query_bit)
1120{
1121 struct acpi_ec_query_handler *handler, *tmp;
1122 LIST_HEAD(free_list);
1123
1124 mutex_lock(&ec->mutex);
1125 list_for_each_entry_safe(handler, tmp, &ec->list, node) {
1126 if (remove_all || query_bit == handler->query_bit) {
1127 list_del_init(&handler->node);
1128 list_add(&handler->node, &free_list);
1129 }
1130 }
1131 mutex_unlock(&ec->mutex);
1132 list_for_each_entry_safe(handler, tmp, &free_list, node)
1133 acpi_ec_put_query_handler(handler);
1134}
1135
1136void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit)
1137{
1138 acpi_ec_remove_query_handlers(ec, false, query_bit);
1139}
1140EXPORT_SYMBOL_GPL(acpi_ec_remove_query_handler);
1141
1142static struct acpi_ec_query *acpi_ec_create_query(u8 *pval)
1143{
1144 struct acpi_ec_query *q;
1145 struct transaction *t;
1146
1147 q = kzalloc(sizeof (struct acpi_ec_query), GFP_KERNEL);
1148 if (!q)
1149 return NULL;
1150 INIT_WORK(&q->work, acpi_ec_event_processor);
1151 t = &q->transaction;
1152 t->command = ACPI_EC_COMMAND_QUERY;
1153 t->rdata = pval;
1154 t->rlen = 1;
1155 return q;
1156}
1157
1158static void acpi_ec_delete_query(struct acpi_ec_query *q)
1159{
1160 if (q) {
1161 if (q->handler)
1162 acpi_ec_put_query_handler(q->handler);
1163 kfree(q);
1164 }
1165}
1166
1167static void acpi_ec_event_processor(struct work_struct *work)
1168{
1169 struct acpi_ec_query *q = container_of(work, struct acpi_ec_query, work);
1170 struct acpi_ec_query_handler *handler = q->handler;
1171
1172 ec_dbg_evt("Query(0x%02x) started", handler->query_bit);
1173 if (handler->func)
1174 handler->func(handler->data);
1175 else if (handler->handle)
1176 acpi_evaluate_object(handler->handle, NULL, NULL, NULL);
1177 ec_dbg_evt("Query(0x%02x) stopped", handler->query_bit);
1178 acpi_ec_delete_query(q);
1179}
1180
1181static int acpi_ec_query(struct acpi_ec *ec, u8 *data)
1182{
1183 u8 value = 0;
1184 int result;
1185 struct acpi_ec_query *q;
1186
1187 q = acpi_ec_create_query(&value);
1188 if (!q)
1189 return -ENOMEM;
1190
1191
1192
1193
1194
1195
1196 result = acpi_ec_transaction(ec, &q->transaction);
1197 if (!value)
1198 result = -ENODATA;
1199 if (result)
1200 goto err_exit;
1201
1202 q->handler = acpi_ec_get_query_handler_by_value(ec, value);
1203 if (!q->handler) {
1204 result = -ENODATA;
1205 goto err_exit;
1206 }
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217 ec_dbg_evt("Query(0x%02x) scheduled", value);
1218 if (!queue_work(ec_query_wq, &q->work)) {
1219 ec_dbg_evt("Query(0x%02x) overlapped", value);
1220 result = -EBUSY;
1221 }
1222
1223err_exit:
1224 if (result)
1225 acpi_ec_delete_query(q);
1226 if (data)
1227 *data = value;
1228 return result;
1229}
1230
1231static void acpi_ec_check_event(struct acpi_ec *ec)
1232{
1233 unsigned long flags;
1234
1235 if (ec_event_clearing == ACPI_EC_EVT_TIMING_EVENT) {
1236 if (ec_guard(ec)) {
1237 spin_lock_irqsave(&ec->lock, flags);
1238
1239
1240
1241
1242 if (!ec->curr)
1243 advance_transaction(ec);
1244 spin_unlock_irqrestore(&ec->lock, flags);
1245 }
1246 }
1247}
1248
1249static void acpi_ec_event_handler(struct work_struct *work)
1250{
1251 unsigned long flags;
1252 struct acpi_ec *ec = container_of(work, struct acpi_ec, work);
1253
1254 ec_dbg_evt("Event started");
1255
1256 spin_lock_irqsave(&ec->lock, flags);
1257 while (ec->nr_pending_queries) {
1258 spin_unlock_irqrestore(&ec->lock, flags);
1259 (void)acpi_ec_query(ec, NULL);
1260 spin_lock_irqsave(&ec->lock, flags);
1261 ec->nr_pending_queries--;
1262
1263
1264
1265
1266
1267
1268 if (!ec->nr_pending_queries) {
1269 if (ec_event_clearing == ACPI_EC_EVT_TIMING_STATUS ||
1270 ec_event_clearing == ACPI_EC_EVT_TIMING_QUERY)
1271 acpi_ec_complete_query(ec);
1272 }
1273 }
1274 spin_unlock_irqrestore(&ec->lock, flags);
1275
1276 ec_dbg_evt("Event stopped");
1277
1278 acpi_ec_check_event(ec);
1279}
1280
1281static u32 acpi_ec_gpe_handler(acpi_handle gpe_device,
1282 u32 gpe_number, void *data)
1283{
1284 unsigned long flags;
1285 struct acpi_ec *ec = data;
1286
1287 spin_lock_irqsave(&ec->lock, flags);
1288 advance_transaction(ec);
1289 spin_unlock_irqrestore(&ec->lock, flags);
1290 return ACPI_INTERRUPT_HANDLED;
1291}
1292
1293
1294
1295
1296
1297static acpi_status
1298acpi_ec_space_handler(u32 function, acpi_physical_address address,
1299 u32 bits, u64 *value64,
1300 void *handler_context, void *region_context)
1301{
1302 struct acpi_ec *ec = handler_context;
1303 int result = 0, i, bytes = bits / 8;
1304 u8 *value = (u8 *)value64;
1305
1306 if ((address > 0xFF) || !value || !handler_context)
1307 return AE_BAD_PARAMETER;
1308
1309 if (function != ACPI_READ && function != ACPI_WRITE)
1310 return AE_BAD_PARAMETER;
1311
1312 if (ec->busy_polling || bits > 8)
1313 acpi_ec_burst_enable(ec);
1314
1315 for (i = 0; i < bytes; ++i, ++address, ++value)
1316 result = (function == ACPI_READ) ?
1317 acpi_ec_read(ec, address, value) :
1318 acpi_ec_write(ec, address, *value);
1319
1320 if (ec->busy_polling || bits > 8)
1321 acpi_ec_burst_disable(ec);
1322
1323 switch (result) {
1324 case -EINVAL:
1325 return AE_BAD_PARAMETER;
1326 case -ENODEV:
1327 return AE_NOT_FOUND;
1328 case -ETIME:
1329 return AE_TIME;
1330 default:
1331 return AE_OK;
1332 }
1333}
1334
1335
1336
1337
1338
1339static acpi_status
1340ec_parse_io_ports(struct acpi_resource *resource, void *context);
1341
1342static void acpi_ec_free(struct acpi_ec *ec)
1343{
1344 if (first_ec == ec)
1345 first_ec = NULL;
1346 if (boot_ec == ec)
1347 boot_ec = NULL;
1348 kfree(ec);
1349}
1350
1351static struct acpi_ec *acpi_ec_alloc(void)
1352{
1353 struct acpi_ec *ec = kzalloc(sizeof(struct acpi_ec), GFP_KERNEL);
1354
1355 if (!ec)
1356 return NULL;
1357 mutex_init(&ec->mutex);
1358 init_waitqueue_head(&ec->wait);
1359 INIT_LIST_HEAD(&ec->list);
1360 spin_lock_init(&ec->lock);
1361 INIT_WORK(&ec->work, acpi_ec_event_handler);
1362 ec->timestamp = jiffies;
1363 ec->busy_polling = true;
1364 ec->polling_guard = 0;
1365 return ec;
1366}
1367
1368static acpi_status
1369acpi_ec_register_query_methods(acpi_handle handle, u32 level,
1370 void *context, void **return_value)
1371{
1372 char node_name[5];
1373 struct acpi_buffer buffer = { sizeof(node_name), node_name };
1374 struct acpi_ec *ec = context;
1375 int value = 0;
1376 acpi_status status;
1377
1378 status = acpi_get_name(handle, ACPI_SINGLE_NAME, &buffer);
1379
1380 if (ACPI_SUCCESS(status) && sscanf(node_name, "_Q%x", &value) == 1)
1381 acpi_ec_add_query_handler(ec, value, handle, NULL, NULL);
1382 return AE_OK;
1383}
1384
1385static acpi_status
1386ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval)
1387{
1388 acpi_status status;
1389 unsigned long long tmp = 0;
1390 struct acpi_ec *ec = context;
1391
1392
1393 ec->command_addr = ec->data_addr = 0;
1394
1395 status = acpi_walk_resources(handle, METHOD_NAME__CRS,
1396 ec_parse_io_ports, ec);
1397 if (ACPI_FAILURE(status))
1398 return status;
1399 if (ec->data_addr == 0 || ec->command_addr == 0)
1400 return AE_OK;
1401
1402 if (boot_ec && boot_ec_is_ecdt && EC_FLAGS_IGNORE_DSDT_GPE) {
1403
1404
1405
1406
1407 ec->gpe = boot_ec->gpe;
1408 } else {
1409
1410
1411 status = acpi_evaluate_integer(handle, "_GPE", NULL, &tmp);
1412 if (ACPI_FAILURE(status))
1413 return status;
1414 ec->gpe = tmp;
1415 }
1416
1417 tmp = 0;
1418 acpi_evaluate_integer(handle, "_GLK", NULL, &tmp);
1419 ec->global_lock = tmp;
1420 ec->handle = handle;
1421 return AE_CTRL_TERMINATE;
1422}
1423
1424
1425
1426
1427
1428
1429static int ec_install_handlers(struct acpi_ec *ec, bool handle_events)
1430{
1431 acpi_status status;
1432
1433 acpi_ec_start(ec, false);
1434
1435 if (!test_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags)) {
1436 acpi_ec_enter_noirq(ec);
1437 status = acpi_install_address_space_handler(ec->handle,
1438 ACPI_ADR_SPACE_EC,
1439 &acpi_ec_space_handler,
1440 NULL, ec);
1441 if (ACPI_FAILURE(status)) {
1442 if (status == AE_NOT_FOUND) {
1443
1444
1445
1446
1447
1448
1449 pr_err("Fail in evaluating the _REG object"
1450 " of EC device. Broken bios is suspected.\n");
1451 } else {
1452 acpi_ec_stop(ec, false);
1453 return -ENODEV;
1454 }
1455 }
1456 set_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags);
1457 }
1458
1459 if (!handle_events)
1460 return 0;
1461
1462 if (!test_bit(EC_FLAGS_EVT_HANDLER_INSTALLED, &ec->flags)) {
1463
1464 acpi_walk_namespace(ACPI_TYPE_METHOD, ec->handle, 1,
1465 acpi_ec_register_query_methods,
1466 NULL, ec, NULL);
1467 set_bit(EC_FLAGS_EVT_HANDLER_INSTALLED, &ec->flags);
1468 }
1469 if (!test_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags)) {
1470 status = acpi_install_gpe_raw_handler(NULL, ec->gpe,
1471 ACPI_GPE_EDGE_TRIGGERED,
1472 &acpi_ec_gpe_handler, ec);
1473
1474 if (ACPI_SUCCESS(status)) {
1475 set_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags);
1476 acpi_ec_leave_noirq(ec);
1477 if (test_bit(EC_FLAGS_STARTED, &ec->flags) &&
1478 ec->reference_count >= 1)
1479 acpi_ec_enable_gpe(ec, true);
1480 }
1481 }
1482
1483 acpi_ec_enable_event(ec);
1484
1485 return 0;
1486}
1487
1488static void ec_remove_handlers(struct acpi_ec *ec)
1489{
1490 if (test_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags)) {
1491 if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle,
1492 ACPI_ADR_SPACE_EC, &acpi_ec_space_handler)))
1493 pr_err("failed to remove space handler\n");
1494 clear_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags);
1495 }
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508 acpi_ec_stop(ec, false);
1509
1510 if (test_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags)) {
1511 if (ACPI_FAILURE(acpi_remove_gpe_handler(NULL, ec->gpe,
1512 &acpi_ec_gpe_handler)))
1513 pr_err("failed to remove gpe handler\n");
1514 clear_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags);
1515 }
1516 if (test_bit(EC_FLAGS_EVT_HANDLER_INSTALLED, &ec->flags)) {
1517 acpi_ec_remove_query_handlers(ec, true, 0);
1518 clear_bit(EC_FLAGS_EVT_HANDLER_INSTALLED, &ec->flags);
1519 }
1520}
1521
1522static int acpi_ec_setup(struct acpi_ec *ec, bool handle_events)
1523{
1524 int ret;
1525
1526 ret = ec_install_handlers(ec, handle_events);
1527 if (ret)
1528 return ret;
1529
1530
1531 if (!first_ec) {
1532 first_ec = ec;
1533 acpi_handle_info(first_ec->handle, "Used as first EC\n");
1534 }
1535
1536 acpi_handle_info(ec->handle,
1537 "GPE=0x%x, EC_CMD/EC_SC=0x%lx, EC_DATA=0x%lx\n",
1538 ec->gpe, ec->command_addr, ec->data_addr);
1539 return ret;
1540}
1541
1542static int acpi_config_boot_ec(struct acpi_ec *ec, acpi_handle handle,
1543 bool handle_events, bool is_ecdt)
1544{
1545 int ret;
1546
1547
1548
1549
1550
1551
1552 if (boot_ec && boot_ec->handle != handle)
1553 ec_remove_handlers(boot_ec);
1554
1555
1556 if (boot_ec != ec)
1557 acpi_ec_free(boot_ec);
1558
1559
1560
1561
1562
1563
1564
1565 if (ec->handle != handle)
1566 ec->handle = handle;
1567
1568 ret = acpi_ec_setup(ec, handle_events);
1569 if (ret)
1570 return ret;
1571
1572
1573 if (!boot_ec) {
1574 boot_ec = ec;
1575 boot_ec_is_ecdt = is_ecdt;
1576 }
1577
1578 acpi_handle_info(boot_ec->handle,
1579 "Used as boot %s EC to handle transactions%s\n",
1580 is_ecdt ? "ECDT" : "DSDT",
1581 handle_events ? " and events" : "");
1582 return ret;
1583}
1584
1585static bool acpi_ec_ecdt_get_handle(acpi_handle *phandle)
1586{
1587 struct acpi_table_ecdt *ecdt_ptr;
1588 acpi_status status;
1589 acpi_handle handle;
1590
1591 status = acpi_get_table(ACPI_SIG_ECDT, 1,
1592 (struct acpi_table_header **)&ecdt_ptr);
1593 if (ACPI_FAILURE(status))
1594 return false;
1595
1596 status = acpi_get_handle(NULL, ecdt_ptr->id, &handle);
1597 if (ACPI_FAILURE(status))
1598 return false;
1599
1600 *phandle = handle;
1601 return true;
1602}
1603
1604static bool acpi_is_boot_ec(struct acpi_ec *ec)
1605{
1606 if (!boot_ec)
1607 return false;
1608 if (ec->command_addr == boot_ec->command_addr &&
1609 ec->data_addr == boot_ec->data_addr)
1610 return true;
1611 return false;
1612}
1613
1614static int acpi_ec_add(struct acpi_device *device)
1615{
1616 struct acpi_ec *ec = NULL;
1617 int ret;
1618 bool is_ecdt = false;
1619 acpi_status status;
1620
1621 strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME);
1622 strcpy(acpi_device_class(device), ACPI_EC_CLASS);
1623
1624 if (!strcmp(acpi_device_hid(device), ACPI_ECDT_HID)) {
1625 is_ecdt = true;
1626 ec = boot_ec;
1627 } else {
1628 ec = acpi_ec_alloc();
1629 if (!ec)
1630 return -ENOMEM;
1631 status = ec_parse_device(device->handle, 0, ec, NULL);
1632 if (status != AE_CTRL_TERMINATE) {
1633 ret = -EINVAL;
1634 goto err_alloc;
1635 }
1636 }
1637
1638 if (acpi_is_boot_ec(ec)) {
1639 boot_ec_is_ecdt = is_ecdt;
1640 if (!is_ecdt) {
1641
1642
1643
1644
1645
1646
1647 boot_ec->handle = ec->handle;
1648 acpi_handle_debug(ec->handle, "duplicated.\n");
1649 acpi_ec_free(ec);
1650 ec = boot_ec;
1651 }
1652 ret = acpi_config_boot_ec(ec, ec->handle, true, is_ecdt);
1653 } else
1654 ret = acpi_ec_setup(ec, true);
1655 if (ret)
1656 goto err_query;
1657
1658 device->driver_data = ec;
1659
1660 ret = !!request_region(ec->data_addr, 1, "EC data");
1661 WARN(!ret, "Could not request EC data io port 0x%lx", ec->data_addr);
1662 ret = !!request_region(ec->command_addr, 1, "EC cmd");
1663 WARN(!ret, "Could not request EC cmd io port 0x%lx", ec->command_addr);
1664
1665 if (!is_ecdt) {
1666
1667 acpi_walk_dep_device_list(ec->handle);
1668 }
1669 acpi_handle_debug(ec->handle, "enumerated.\n");
1670 return 0;
1671
1672err_query:
1673 if (ec != boot_ec)
1674 acpi_ec_remove_query_handlers(ec, true, 0);
1675err_alloc:
1676 if (ec != boot_ec)
1677 acpi_ec_free(ec);
1678 return ret;
1679}
1680
1681static int acpi_ec_remove(struct acpi_device *device)
1682{
1683 struct acpi_ec *ec;
1684
1685 if (!device)
1686 return -EINVAL;
1687
1688 ec = acpi_driver_data(device);
1689 release_region(ec->data_addr, 1);
1690 release_region(ec->command_addr, 1);
1691 device->driver_data = NULL;
1692 if (ec != boot_ec) {
1693 ec_remove_handlers(ec);
1694 acpi_ec_free(ec);
1695 }
1696 return 0;
1697}
1698
1699static acpi_status
1700ec_parse_io_ports(struct acpi_resource *resource, void *context)
1701{
1702 struct acpi_ec *ec = context;
1703
1704 if (resource->type != ACPI_RESOURCE_TYPE_IO)
1705 return AE_OK;
1706
1707
1708
1709
1710
1711
1712 if (ec->data_addr == 0)
1713 ec->data_addr = resource->data.io.minimum;
1714 else if (ec->command_addr == 0)
1715 ec->command_addr = resource->data.io.minimum;
1716 else
1717 return AE_CTRL_TERMINATE;
1718
1719 return AE_OK;
1720}
1721
1722static const struct acpi_device_id ec_device_ids[] = {
1723 {"PNP0C09", 0},
1724 {ACPI_ECDT_HID, 0},
1725 {"", 0},
1726};
1727
1728
1729
1730
1731
1732
1733int __init acpi_ec_dsdt_probe(void)
1734{
1735 acpi_status status;
1736 struct acpi_ec *ec;
1737 int ret;
1738
1739
1740
1741
1742
1743
1744
1745 if (boot_ec)
1746 return -ENODEV;
1747
1748 ec = acpi_ec_alloc();
1749 if (!ec)
1750 return -ENOMEM;
1751
1752
1753
1754
1755 status = acpi_get_devices(ec_device_ids[0].id,
1756 ec_parse_device, ec, NULL);
1757 if (ACPI_FAILURE(status) || !ec->handle) {
1758 ret = -ENODEV;
1759 goto error;
1760 }
1761
1762
1763
1764
1765
1766
1767
1768 ret = acpi_config_boot_ec(ec, ec->handle, false, false);
1769error:
1770 if (ret)
1771 acpi_ec_free(ec);
1772 return ret;
1773}
1774
1775
1776
1777
1778
1779
1780static int __init acpi_ec_ecdt_start(void)
1781{
1782 acpi_handle handle;
1783
1784 if (!boot_ec)
1785 return -ENODEV;
1786
1787 if (!boot_ec_is_ecdt)
1788 return -ENODEV;
1789
1790
1791
1792
1793
1794
1795
1796
1797 if (boot_ec->handle == ACPI_ROOT_OBJECT) {
1798 if (!acpi_ec_ecdt_get_handle(&handle))
1799 return -ENODEV;
1800 boot_ec->handle = handle;
1801 }
1802
1803
1804 return acpi_bus_register_early_device(ACPI_BUS_TYPE_ECDT_EC);
1805}
1806
1807#if 0
1808
1809
1810
1811
1812
1813
1814
1815static int ec_flag_query_handshake(const struct dmi_system_id *id)
1816{
1817 pr_debug("Detected the EC firmware requiring QR_EC issued when SCI_EVT set\n");
1818 EC_FLAGS_QUERY_HANDSHAKE = 1;
1819 return 0;
1820}
1821#endif
1822
1823
1824
1825
1826
1827
1828static int ec_correct_ecdt(const struct dmi_system_id *id)
1829{
1830 pr_debug("Detected system needing ECDT address correction.\n");
1831 EC_FLAGS_CORRECT_ECDT = 1;
1832 return 0;
1833}
1834
1835
1836
1837
1838
1839
1840static int ec_honor_ecdt_gpe(const struct dmi_system_id *id)
1841{
1842 pr_debug("Detected system needing ignore DSDT GPE setting.\n");
1843 EC_FLAGS_IGNORE_DSDT_GPE = 1;
1844 return 0;
1845}
1846
1847static const struct dmi_system_id ec_dmi_table[] __initconst = {
1848 {
1849 ec_correct_ecdt, "MSI MS-171F", {
1850 DMI_MATCH(DMI_SYS_VENDOR, "Micro-Star"),
1851 DMI_MATCH(DMI_PRODUCT_NAME, "MS-171F"),}, NULL},
1852 {
1853 ec_honor_ecdt_gpe, "ASUS FX502VD", {
1854 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1855 DMI_MATCH(DMI_PRODUCT_NAME, "FX502VD"),}, NULL},
1856 {
1857 ec_honor_ecdt_gpe, "ASUS FX502VE", {
1858 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1859 DMI_MATCH(DMI_PRODUCT_NAME, "FX502VE"),}, NULL},
1860 {
1861 ec_honor_ecdt_gpe, "ASUS GL702VMK", {
1862 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1863 DMI_MATCH(DMI_PRODUCT_NAME, "GL702VMK"),}, NULL},
1864 {
1865 ec_honor_ecdt_gpe, "ASUS X550VXK", {
1866 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1867 DMI_MATCH(DMI_PRODUCT_NAME, "X550VXK"),}, NULL},
1868 {
1869 ec_honor_ecdt_gpe, "ASUS X580VD", {
1870 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1871 DMI_MATCH(DMI_PRODUCT_NAME, "X580VD"),}, NULL},
1872 {},
1873};
1874
1875int __init acpi_ec_ecdt_probe(void)
1876{
1877 int ret;
1878 acpi_status status;
1879 struct acpi_table_ecdt *ecdt_ptr;
1880 struct acpi_ec *ec;
1881
1882 ec = acpi_ec_alloc();
1883 if (!ec)
1884 return -ENOMEM;
1885
1886
1887
1888 dmi_check_system(ec_dmi_table);
1889 status = acpi_get_table(ACPI_SIG_ECDT, 1,
1890 (struct acpi_table_header **)&ecdt_ptr);
1891 if (ACPI_FAILURE(status)) {
1892 ret = -ENODEV;
1893 goto error;
1894 }
1895
1896 if (!ecdt_ptr->control.address || !ecdt_ptr->data.address) {
1897
1898
1899
1900
1901 ret = -ENODEV;
1902 goto error;
1903 }
1904
1905 if (EC_FLAGS_CORRECT_ECDT) {
1906 ec->command_addr = ecdt_ptr->data.address;
1907 ec->data_addr = ecdt_ptr->control.address;
1908 } else {
1909 ec->command_addr = ecdt_ptr->control.address;
1910 ec->data_addr = ecdt_ptr->data.address;
1911 }
1912 ec->gpe = ecdt_ptr->gpe;
1913
1914
1915
1916
1917
1918 ret = acpi_config_boot_ec(ec, ACPI_ROOT_OBJECT, false, true);
1919error:
1920 if (ret)
1921 acpi_ec_free(ec);
1922 return ret;
1923}
1924
1925#ifdef CONFIG_PM_SLEEP
1926static int acpi_ec_suspend(struct device *dev)
1927{
1928 struct acpi_ec *ec =
1929 acpi_driver_data(to_acpi_device(dev));
1930
1931 if (acpi_sleep_no_ec_events() && ec_freeze_events)
1932 acpi_ec_disable_event(ec);
1933 return 0;
1934}
1935
1936static int acpi_ec_suspend_noirq(struct device *dev)
1937{
1938 struct acpi_ec *ec = acpi_driver_data(to_acpi_device(dev));
1939
1940
1941
1942
1943
1944 if (ec_no_wakeup && test_bit(EC_FLAGS_STARTED, &ec->flags) &&
1945 ec->reference_count >= 1)
1946 acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_DISABLE);
1947
1948 if (acpi_sleep_no_ec_events())
1949 acpi_ec_enter_noirq(ec);
1950
1951 return 0;
1952}
1953
1954static int acpi_ec_resume_noirq(struct device *dev)
1955{
1956 struct acpi_ec *ec = acpi_driver_data(to_acpi_device(dev));
1957
1958 if (acpi_sleep_no_ec_events())
1959 acpi_ec_leave_noirq(ec);
1960
1961 if (ec_no_wakeup && test_bit(EC_FLAGS_STARTED, &ec->flags) &&
1962 ec->reference_count >= 1)
1963 acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_ENABLE);
1964
1965 return 0;
1966}
1967
1968static int acpi_ec_resume(struct device *dev)
1969{
1970 struct acpi_ec *ec =
1971 acpi_driver_data(to_acpi_device(dev));
1972
1973 acpi_ec_enable_event(ec);
1974 return 0;
1975}
1976#endif
1977
1978static const struct dev_pm_ops acpi_ec_pm = {
1979 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(acpi_ec_suspend_noirq, acpi_ec_resume_noirq)
1980 SET_SYSTEM_SLEEP_PM_OPS(acpi_ec_suspend, acpi_ec_resume)
1981};
1982
1983static int param_set_event_clearing(const char *val,
1984 const struct kernel_param *kp)
1985{
1986 int result = 0;
1987
1988 if (!strncmp(val, "status", sizeof("status") - 1)) {
1989 ec_event_clearing = ACPI_EC_EVT_TIMING_STATUS;
1990 pr_info("Assuming SCI_EVT clearing on EC_SC accesses\n");
1991 } else if (!strncmp(val, "query", sizeof("query") - 1)) {
1992 ec_event_clearing = ACPI_EC_EVT_TIMING_QUERY;
1993 pr_info("Assuming SCI_EVT clearing on QR_EC writes\n");
1994 } else if (!strncmp(val, "event", sizeof("event") - 1)) {
1995 ec_event_clearing = ACPI_EC_EVT_TIMING_EVENT;
1996 pr_info("Assuming SCI_EVT clearing on event reads\n");
1997 } else
1998 result = -EINVAL;
1999 return result;
2000}
2001
2002static int param_get_event_clearing(char *buffer,
2003 const struct kernel_param *kp)
2004{
2005 switch (ec_event_clearing) {
2006 case ACPI_EC_EVT_TIMING_STATUS:
2007 return sprintf(buffer, "status");
2008 case ACPI_EC_EVT_TIMING_QUERY:
2009 return sprintf(buffer, "query");
2010 case ACPI_EC_EVT_TIMING_EVENT:
2011 return sprintf(buffer, "event");
2012 default:
2013 return sprintf(buffer, "invalid");
2014 }
2015 return 0;
2016}
2017
2018module_param_call(ec_event_clearing, param_set_event_clearing, param_get_event_clearing,
2019 NULL, 0644);
2020MODULE_PARM_DESC(ec_event_clearing, "Assumed SCI_EVT clearing timing");
2021
2022static struct acpi_driver acpi_ec_driver = {
2023 .name = "ec",
2024 .class = ACPI_EC_CLASS,
2025 .ids = ec_device_ids,
2026 .ops = {
2027 .add = acpi_ec_add,
2028 .remove = acpi_ec_remove,
2029 },
2030 .drv.pm = &acpi_ec_pm,
2031};
2032
2033static inline int acpi_ec_query_init(void)
2034{
2035 if (!ec_query_wq) {
2036 ec_query_wq = alloc_workqueue("kec_query", 0,
2037 ec_max_queries);
2038 if (!ec_query_wq)
2039 return -ENODEV;
2040 }
2041 return 0;
2042}
2043
2044static inline void acpi_ec_query_exit(void)
2045{
2046 if (ec_query_wq) {
2047 destroy_workqueue(ec_query_wq);
2048 ec_query_wq = NULL;
2049 }
2050}
2051
2052static const struct dmi_system_id acpi_ec_no_wakeup[] = {
2053 {
2054 .ident = "Thinkpad X1 Carbon 6th",
2055 .matches = {
2056 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
2057 DMI_MATCH(DMI_PRODUCT_FAMILY, "Thinkpad X1 Carbon 6th"),
2058 },
2059 },
2060 {
2061 .ident = "ThinkPad X1 Carbon 6th",
2062 .matches = {
2063 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
2064 DMI_MATCH(DMI_PRODUCT_FAMILY, "ThinkPad X1 Carbon 6th"),
2065 },
2066 },
2067 {
2068 .ident = "ThinkPad X1 Yoga 3rd",
2069 .matches = {
2070 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
2071 DMI_MATCH(DMI_PRODUCT_FAMILY, "ThinkPad X1 Yoga 3rd"),
2072 },
2073 },
2074 { },
2075};
2076
2077int __init acpi_ec_init(void)
2078{
2079 int result;
2080 int ecdt_fail, dsdt_fail;
2081
2082
2083 result = acpi_ec_query_init();
2084 if (result)
2085 return result;
2086
2087
2088
2089
2090
2091 if (dmi_check_system(acpi_ec_no_wakeup)) {
2092 ec_no_wakeup = true;
2093 pr_debug("Disabling EC wakeup on suspend-to-idle\n");
2094 }
2095
2096
2097 dsdt_fail = acpi_bus_register_driver(&acpi_ec_driver);
2098
2099
2100
2101
2102
2103
2104 ecdt_fail = acpi_ec_ecdt_start();
2105 return ecdt_fail && dsdt_fail ? -ENODEV : 0;
2106}
2107
2108
2109#if 0
2110static void __exit acpi_ec_exit(void)
2111{
2112
2113 acpi_bus_unregister_driver(&acpi_ec_driver);
2114 acpi_ec_query_exit();
2115}
2116#endif
2117