ec.c 36.8 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2
 *  ec.c - ACPI Embedded Controller Driver (v3)
L
Linus Torvalds 已提交
3
 *
4 5
 *  Copyright (C) 2001-2015 Intel Corporation
 *    Author: 2014, 2015 Lv Zheng <lv.zheng@intel.com>
6 7 8 9 10 11
 *            2006, 2007 Alexey Starikovskiy <alexey.y.starikovskiy@intel.com>
 *            2006       Denis Sadykov <denis.m.sadykov@intel.com>
 *            2004       Luming Yu <luming.yu@intel.com>
 *            2001, 2002 Andy Grover <andrew.grover@intel.com>
 *            2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
 *  Copyright (C) 2008      Alexey Starikovskiy <astarikovskiy@suse.de>
L
Linus Torvalds 已提交
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or (at
 *  your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */

32
/* Uncomment next line to get verbose printout */
33
/* #define DEBUG */
34
#define pr_fmt(fmt) "ACPI : EC: " fmt
35

L
Linus Torvalds 已提交
36 37 38 39 40
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/delay.h>
D
Dmitry Torokhov 已提交
41
#include <linux/interrupt.h>
42
#include <linux/list.h>
43
#include <linux/spinlock.h>
44
#include <linux/slab.h>
45
#include <linux/acpi.h>
46
#include <linux/dmi.h>
47
#include <asm/io.h>
L
Linus Torvalds 已提交
48

49 50
#include "internal.h"

L
Linus Torvalds 已提交
51 52 53
#define ACPI_EC_CLASS			"embedded_controller"
#define ACPI_EC_DEVICE_NAME		"Embedded Controller"
#define ACPI_EC_FILE_INFO		"info"
54

55
/* EC status register */
L
Linus Torvalds 已提交
56 57
#define ACPI_EC_FLAG_OBF	0x01	/* Output buffer full */
#define ACPI_EC_FLAG_IBF	0x02	/* Input buffer full */
58
#define ACPI_EC_FLAG_CMD	0x08	/* Input buffer contains a command */
D
Dmitry Torokhov 已提交
59
#define ACPI_EC_FLAG_BURST	0x10	/* burst mode */
L
Linus Torvalds 已提交
60
#define ACPI_EC_FLAG_SCI	0x20	/* EC-SCI occurred */
61

62
/* EC commands */
63
enum ec_command {
A
Alexey Starikovskiy 已提交
64 65 66 67 68
	ACPI_EC_COMMAND_READ = 0x80,
	ACPI_EC_COMMAND_WRITE = 0x81,
	ACPI_EC_BURST_ENABLE = 0x82,
	ACPI_EC_BURST_DISABLE = 0x83,
	ACPI_EC_COMMAND_QUERY = 0x84,
69
};
70

71
#define ACPI_EC_DELAY		500	/* Wait 500ms max. during EC ops */
72
#define ACPI_EC_UDELAY_GLK	1000	/* Wait 1ms max. to get global lock */
73
#define ACPI_EC_MSI_UDELAY	550	/* Wait 550us for MSI EC */
74
#define ACPI_EC_UDELAY_POLL	1000	/* Wait 1ms for EC transaction polling */
75 76
#define ACPI_EC_CLEAR_MAX	100	/* Maximum number of events to query
					 * when trying to clear the EC */
77

78 79
enum {
	EC_FLAGS_QUERY_PENDING,		/* Query is pending */
80
	EC_FLAGS_GPE_STORM,		/* GPE storm detected */
81
	EC_FLAGS_HANDLERS_INSTALLED,	/* Handlers for GPE and
82
					 * OpReg are installed */
83 84
	EC_FLAGS_STARTED,		/* Driver is started */
	EC_FLAGS_STOPPED,		/* Driver is stopped */
L
Linus Torvalds 已提交
85
};
86

87 88 89
#define ACPI_EC_COMMAND_POLL		0x01 /* Available for command byte */
#define ACPI_EC_COMMAND_COMPLETE	0x02 /* Completed last byte */

90 91 92 93 94
/* ec.c is compiled in acpi namespace so this shows up as acpi.ec_delay param */
static unsigned int ec_delay __read_mostly = ACPI_EC_DELAY;
module_param(ec_delay, uint, 0644);
MODULE_PARM_DESC(ec_delay, "Timeout(ms) waited until an EC command completes");

95 96 97 98 99 100 101 102 103
/*
 * If the number of false interrupts per one transaction exceeds
 * this threshold, will think there is a GPE storm happened and
 * will disable the GPE for normal transaction.
 */
static unsigned int ec_storm_threshold  __read_mostly = 8;
module_param(ec_storm_threshold, uint, 0644);
MODULE_PARM_DESC(ec_storm_threshold, "Maxim false GPE numbers not considered as GPE storm");

104 105 106 107 108 109
struct acpi_ec_query_handler {
	struct list_head node;
	acpi_ec_query_func func;
	acpi_handle handle;
	void *data;
	u8 query_bit;
110
	struct kref kref;
111 112
};

113
struct transaction {
114 115 116
	const u8 *wdata;
	u8 *rdata;
	unsigned short irq_count;
117
	u8 command;
118 119
	u8 wi;
	u8 ri;
120 121
	u8 wlen;
	u8 rlen;
122
	u8 flags;
123
	unsigned long timestamp;
124 125
};

L
Lv Zheng 已提交
126
static int acpi_ec_query(struct acpi_ec *ec, u8 *data);
127
static void advance_transaction(struct acpi_ec *ec);
128

129 130
struct acpi_ec *boot_ec, *first_ec;
EXPORT_SYMBOL(first_ec);
131

132
static int EC_FLAGS_MSI; /* Out-of-spec MSI controller */
A
Alexey Starikovskiy 已提交
133
static int EC_FLAGS_VALIDATE_ECDT; /* ASUStec ECDTs need to be validated */
134
static int EC_FLAGS_SKIP_DSDT_SCAN; /* Not all BIOS survive early DSDT scan */
135
static int EC_FLAGS_CLEAR_ON_RESUME; /* Needs acpi_ec_clear() on boot/resume */
136
static int EC_FLAGS_QUERY_HANDSHAKE; /* Needs QR_EC issued when SCI_EVT set */
137

138 139 140 141 142 143 144 145 146 147
/* --------------------------------------------------------------------------
 *                           Device Flags
 * -------------------------------------------------------------------------- */

static bool acpi_ec_started(struct acpi_ec *ec)
{
	return test_bit(EC_FLAGS_STARTED, &ec->flags) &&
	       !test_bit(EC_FLAGS_STOPPED, &ec->flags);
}

148 149 150 151 152
static bool acpi_ec_flushed(struct acpi_ec *ec)
{
	return ec->reference_count == 1;
}

L
Linus Torvalds 已提交
153
/* --------------------------------------------------------------------------
154
 *                           EC Registers
L
Lv Zheng 已提交
155
 * -------------------------------------------------------------------------- */
L
Linus Torvalds 已提交
156

157
static inline u8 acpi_ec_read_status(struct acpi_ec *ec)
L
Linus Torvalds 已提交
158
{
159
	u8 x = inb(ec->command_addr);
L
Lv Zheng 已提交
160

161 162 163 164 165 166 167 168
	pr_debug("EC_SC(R) = 0x%2.2x "
		 "SCI_EVT=%d BURST=%d CMD=%d IBF=%d OBF=%d\n",
		 x,
		 !!(x & ACPI_EC_FLAG_SCI),
		 !!(x & ACPI_EC_FLAG_BURST),
		 !!(x & ACPI_EC_FLAG_CMD),
		 !!(x & ACPI_EC_FLAG_IBF),
		 !!(x & ACPI_EC_FLAG_OBF));
169
	return x;
D
Dmitry Torokhov 已提交
170 171
}

172
static inline u8 acpi_ec_read_data(struct acpi_ec *ec)
173
{
174
	u8 x = inb(ec->data_addr);
L
Lv Zheng 已提交
175

176
	ec->curr->timestamp = jiffies;
177
	pr_debug("EC_DATA(R) = 0x%2.2x\n", x);
178
	return x;
179 180
}

181
static inline void acpi_ec_write_cmd(struct acpi_ec *ec, u8 command)
L
Luming Yu 已提交
182
{
183
	pr_debug("EC_SC(W) = 0x%2.2x\n", command);
184
	outb(command, ec->command_addr);
185
	ec->curr->timestamp = jiffies;
L
Luming Yu 已提交
186 187
}

188
static inline void acpi_ec_write_data(struct acpi_ec *ec, u8 data)
L
Luming Yu 已提交
189
{
190
	pr_debug("EC_DATA(W) = 0x%2.2x\n", data);
191
	outb(data, ec->data_addr);
192
	ec->curr->timestamp = jiffies;
193
}
L
Luming Yu 已提交
194

195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
#ifdef DEBUG
static const char *acpi_ec_cmd_string(u8 cmd)
{
	switch (cmd) {
	case 0x80:
		return "RD_EC";
	case 0x81:
		return "WR_EC";
	case 0x82:
		return "BE_EC";
	case 0x83:
		return "BD_EC";
	case 0x84:
		return "QR_EC";
	}
	return "UNKNOWN";
}
#else
#define acpi_ec_cmd_string(cmd)		"UNDEF"
#endif

216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273
/* --------------------------------------------------------------------------
 *                           GPE Registers
 * -------------------------------------------------------------------------- */

static inline bool acpi_ec_is_gpe_raised(struct acpi_ec *ec)
{
	acpi_event_status gpe_status = 0;

	(void)acpi_get_gpe_status(NULL, ec->gpe, &gpe_status);
	return (gpe_status & ACPI_EVENT_FLAG_SET) ? true : false;
}

static inline void acpi_ec_enable_gpe(struct acpi_ec *ec, bool open)
{
	if (open)
		acpi_enable_gpe(NULL, ec->gpe);
	else
		acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_ENABLE);
	if (acpi_ec_is_gpe_raised(ec)) {
		/*
		 * On some platforms, EN=1 writes cannot trigger GPE. So
		 * software need to manually trigger a pseudo GPE event on
		 * EN=1 writes.
		 */
		pr_debug("***** Polling quirk *****\n");
		advance_transaction(ec);
	}
}

static inline void acpi_ec_disable_gpe(struct acpi_ec *ec, bool close)
{
	if (close)
		acpi_disable_gpe(NULL, ec->gpe);
	else
		acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_DISABLE);
}

static inline void acpi_ec_clear_gpe(struct acpi_ec *ec)
{
	/*
	 * GPE STS is a W1C register, which means:
	 * 1. Software can clear it without worrying about clearing other
	 *    GPEs' STS bits when the hardware sets them in parallel.
	 * 2. As long as software can ensure only clearing it when it is
	 *    set, hardware won't set it in parallel.
	 * So software can clear GPE in any contexts.
	 * Warning: do not move the check into advance_transaction() as the
	 * EC commands will be sent without GPE raised.
	 */
	if (!acpi_ec_is_gpe_raised(ec))
		return;
	acpi_clear_gpe(NULL, ec->gpe);
}

/* --------------------------------------------------------------------------
 *                           Transaction Management
 * -------------------------------------------------------------------------- */

274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311
static void acpi_ec_submit_request(struct acpi_ec *ec)
{
	ec->reference_count++;
	if (ec->reference_count == 1)
		acpi_ec_enable_gpe(ec, true);
}

static void acpi_ec_complete_request(struct acpi_ec *ec)
{
	bool flushed = false;

	ec->reference_count--;
	if (ec->reference_count == 0)
		acpi_ec_disable_gpe(ec, true);
	flushed = acpi_ec_flushed(ec);
	if (flushed)
		wake_up(&ec->wait);
}

/*
 * acpi_ec_submit_flushable_request() - Increase the reference count unless
 *                                      the flush operation is not in
 *                                      progress
 * @ec: the EC device
 *
 * This function must be used before taking a new action that should hold
 * the reference count.  If this function returns false, then the action
 * must be discarded or it will prevent the flush operation from being
 * completed.
 */
static bool acpi_ec_submit_flushable_request(struct acpi_ec *ec)
{
	if (!acpi_ec_started(ec))
		return false;
	acpi_ec_submit_request(ec);
	return true;
}

312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327
static void acpi_ec_submit_query(struct acpi_ec *ec)
{
	if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) {
		pr_debug("***** Event started *****\n");
		schedule_work(&ec->work);
	}
}

static void acpi_ec_complete_query(struct acpi_ec *ec)
{
	if (ec->curr->command == ACPI_EC_COMMAND_QUERY) {
		clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
		pr_debug("***** Event stopped *****\n");
	}
}

328
static int ec_transaction_completed(struct acpi_ec *ec)
329
{
330 331
	unsigned long flags;
	int ret = 0;
L
Lv Zheng 已提交
332

333
	spin_lock_irqsave(&ec->lock, flags);
334
	if (ec->curr && (ec->curr->flags & ACPI_EC_COMMAND_COMPLETE))
335
		ret = 1;
336
	spin_unlock_irqrestore(&ec->lock, flags);
337
	return ret;
L
Luming Yu 已提交
338
}
D
Dmitry Torokhov 已提交
339

340
static void advance_transaction(struct acpi_ec *ec)
341
{
342
	struct transaction *t;
343
	u8 status;
344
	bool wakeup = false;
345

346 347
	pr_debug("===== %s (%d) =====\n",
		 in_interrupt() ? "IRQ" : "TASK", smp_processor_id());
348 349 350 351 352 353
	/*
	 * By always clearing STS before handling all indications, we can
	 * ensure a hardware STS 0->1 change after this clearing can always
	 * trigger a GPE interrupt.
	 */
	acpi_ec_clear_gpe(ec);
354
	status = acpi_ec_read_status(ec);
355
	t = ec->curr;
356
	if (!t)
357 358 359 360 361 362 363 364 365 366
		goto err;
	if (t->flags & ACPI_EC_COMMAND_POLL) {
		if (t->wlen > t->wi) {
			if ((status & ACPI_EC_FLAG_IBF) == 0)
				acpi_ec_write_data(ec, t->wdata[t->wi++]);
			else
				goto err;
		} else if (t->rlen > t->ri) {
			if ((status & ACPI_EC_FLAG_OBF) == 1) {
				t->rdata[t->ri++] = acpi_ec_read_data(ec);
367
				if (t->rlen == t->ri) {
368
					t->flags |= ACPI_EC_COMMAND_COMPLETE;
369
					if (t->command == ACPI_EC_COMMAND_QUERY)
370 371
						pr_debug("***** Command(%s) hardware completion *****\n",
							 acpi_ec_cmd_string(t->command));
372 373
					wakeup = true;
				}
374 375 376
			} else
				goto err;
		} else if (t->wlen == t->wi &&
377
			   (status & ACPI_EC_FLAG_IBF) == 0) {
378
			t->flags |= ACPI_EC_COMMAND_COMPLETE;
379 380
			wakeup = true;
		}
381
		goto out;
382
	} else {
383 384
		if (EC_FLAGS_QUERY_HANDSHAKE &&
		    !(status & ACPI_EC_FLAG_SCI) &&
385 386
		    (t->command == ACPI_EC_COMMAND_QUERY)) {
			t->flags |= ACPI_EC_COMMAND_POLL;
387
			acpi_ec_complete_query(ec);
388 389
			t->rdata[t->ri++] = 0x00;
			t->flags |= ACPI_EC_COMMAND_COMPLETE;
390 391
			pr_debug("***** Command(%s) software completion *****\n",
				 acpi_ec_cmd_string(t->command));
392 393
			wakeup = true;
		} else if ((status & ACPI_EC_FLAG_IBF) == 0) {
394 395
			acpi_ec_write_cmd(ec, t->command);
			t->flags |= ACPI_EC_COMMAND_POLL;
396
			acpi_ec_complete_query(ec);
397
		} else
398
			goto err;
399
		goto out;
400
	}
401
err:
402 403 404 405
	/*
	 * If SCI bit is set, then don't think it's a false IRQ
	 * otherwise will take a not handled IRQ as a false one.
	 */
406 407 408 409
	if (!(status & ACPI_EC_FLAG_SCI)) {
		if (in_interrupt() && t)
			++t->irq_count;
	}
410
out:
411 412
	if (status & ACPI_EC_FLAG_SCI)
		acpi_ec_submit_query(ec);
413 414
	if (wakeup && in_interrupt())
		wake_up(&ec->wait);
415
}
416

417 418 419 420
static void start_transaction(struct acpi_ec *ec)
{
	ec->curr->irq_count = ec->curr->wi = ec->curr->ri = 0;
	ec->curr->flags = 0;
421
	ec->curr->timestamp = jiffies;
422
	advance_transaction(ec);
A
Alexey Starikovskiy 已提交
423
}
424

425 426
static int ec_poll(struct acpi_ec *ec)
{
427
	unsigned long flags;
428
	int repeat = 5; /* number of command restarts */
L
Lv Zheng 已提交
429

430 431
	while (repeat--) {
		unsigned long delay = jiffies +
432
			msecs_to_jiffies(ec_delay);
433
		unsigned long usecs = ACPI_EC_UDELAY_POLL;
434 435 436
		do {
			/* don't sleep with disabled interrupts */
			if (EC_FLAGS_MSI || irqs_disabled()) {
437 438
				usecs = ACPI_EC_MSI_UDELAY;
				udelay(usecs);
439
				if (ec_transaction_completed(ec))
440 441 442
					return 0;
			} else {
				if (wait_event_timeout(ec->wait,
443
						ec_transaction_completed(ec),
444
						usecs_to_jiffies(usecs)))
445 446
					return 0;
			}
447
			spin_lock_irqsave(&ec->lock, flags);
448 449 450 451
			if (time_after(jiffies,
					ec->curr->timestamp +
					usecs_to_jiffies(usecs)))
				advance_transaction(ec);
452
			spin_unlock_irqrestore(&ec->lock, flags);
453
		} while (time_before(jiffies, delay));
454
		pr_debug("controller reset, restart transaction\n");
455
		spin_lock_irqsave(&ec->lock, flags);
456
		start_transaction(ec);
457
		spin_unlock_irqrestore(&ec->lock, flags);
458
	}
459
	return -ETIME;
L
Linus Torvalds 已提交
460 461
}

462
static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,
463
					struct transaction *t)
L
Luming Yu 已提交
464
{
465 466
	unsigned long tmp;
	int ret = 0;
L
Lv Zheng 已提交
467

468
	if (EC_FLAGS_MSI)
469
		udelay(ACPI_EC_MSI_UDELAY);
470
	/* start transaction */
471
	spin_lock_irqsave(&ec->lock, tmp);
472 473
	/* Enable GPE for command processing (IBF=0/OBF=1) */
	if (!acpi_ec_submit_flushable_request(ec)) {
474 475 476
		ret = -EINVAL;
		goto unlock;
	}
477
	/* following two actions should be kept atomic */
478
	ec->curr = t;
479 480
	pr_debug("***** Command(%s) started *****\n",
		 acpi_ec_cmd_string(t->command));
481
	start_transaction(ec);
482 483 484
	spin_unlock_irqrestore(&ec->lock, tmp);
	ret = ec_poll(ec);
	spin_lock_irqsave(&ec->lock, tmp);
485 486
	pr_debug("***** Command(%s) stopped *****\n",
		 acpi_ec_cmd_string(t->command));
487
	ec->curr = NULL;
488 489
	/* Disable GPE for command processing (IBF=0/OBF=1) */
	acpi_ec_complete_request(ec);
490
unlock:
491
	spin_unlock_irqrestore(&ec->lock, tmp);
492 493 494
	return ret;
}

495
static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t)
L
Linus Torvalds 已提交
496
{
497
	int status;
L
Len Brown 已提交
498
	u32 glk;
L
Lv Zheng 已提交
499

500
	if (!ec || (!t) || (t->wlen && !t->wdata) || (t->rlen && !t->rdata))
501
		return -EINVAL;
502 503
	if (t->rdata)
		memset(t->rdata, 0, t->rlen);
504
	mutex_lock(&ec->mutex);
505
	if (ec->global_lock) {
L
Linus Torvalds 已提交
506
		status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk);
507
		if (ACPI_FAILURE(status)) {
508 509
			status = -ENODEV;
			goto unlock;
510
		}
L
Linus Torvalds 已提交
511
	}
512 513
	/* disable GPE during transaction if storm is detected */
	if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) {
514
		/* It has to be disabled, so that it doesn't trigger. */
515
		acpi_ec_disable_gpe(ec, false);
516 517
	}

518
	status = acpi_ec_transaction_unlocked(ec, t);
519 520

	if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) {
521
		msleep(1);
522
		/* It is safe to enable the GPE outside of the transaction. */
523
		acpi_ec_enable_gpe(ec, false);
524
	} else if (t->irq_count > ec_storm_threshold) {
525
		pr_info("GPE storm detected(%d GPEs), "
526 527
			"transactions will use polling mode\n",
			t->irq_count);
528 529
		set_bit(EC_FLAGS_GPE_STORM, &ec->flags);
	}
530
	if (ec->global_lock)
L
Linus Torvalds 已提交
531
		acpi_release_global_lock(glk);
532
unlock:
533
	mutex_unlock(&ec->mutex);
534
	return status;
L
Linus Torvalds 已提交
535 536
}

537
static int acpi_ec_burst_enable(struct acpi_ec *ec)
538 539
{
	u8 d;
540 541 542 543
	struct transaction t = {.command = ACPI_EC_BURST_ENABLE,
				.wdata = NULL, .rdata = &d,
				.wlen = 0, .rlen = 1};

544
	return acpi_ec_transaction(ec, &t);
545 546
}

547
static int acpi_ec_burst_disable(struct acpi_ec *ec)
548
{
549 550 551 552
	struct transaction t = {.command = ACPI_EC_BURST_DISABLE,
				.wdata = NULL, .rdata = NULL,
				.wlen = 0, .rlen = 0};

553
	return (acpi_ec_read_status(ec) & ACPI_EC_FLAG_BURST) ?
554
				acpi_ec_transaction(ec, &t) : 0;
555 556
}

L
Lv Zheng 已提交
557
static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 *data)
558 559 560
{
	int result;
	u8 d;
561 562 563
	struct transaction t = {.command = ACPI_EC_COMMAND_READ,
				.wdata = &address, .rdata = &d,
				.wlen = 1, .rlen = 1};
564

565
	result = acpi_ec_transaction(ec, &t);
566 567 568
	*data = d;
	return result;
}
569

570 571
static int acpi_ec_write(struct acpi_ec *ec, u8 address, u8 data)
{
A
Alexey Starikovskiy 已提交
572
	u8 wdata[2] = { address, data };
573 574 575 576
	struct transaction t = {.command = ACPI_EC_COMMAND_WRITE,
				.wdata = wdata, .rdata = NULL,
				.wlen = 2, .rlen = 0};

577
	return acpi_ec_transaction(ec, &t);
578 579
}

580
int ec_read(u8 addr, u8 *val)
L
Linus Torvalds 已提交
581 582
{
	int err;
583
	u8 temp_data;
L
Linus Torvalds 已提交
584 585 586 587

	if (!first_ec)
		return -ENODEV;

588
	err = acpi_ec_read(first_ec, addr, &temp_data);
L
Linus Torvalds 已提交
589 590 591 592

	if (!err) {
		*val = temp_data;
		return 0;
L
Lv Zheng 已提交
593 594
	}
	return err;
L
Linus Torvalds 已提交
595 596 597
}
EXPORT_SYMBOL(ec_read);

L
Len Brown 已提交
598
int ec_write(u8 addr, u8 val)
L
Linus Torvalds 已提交
599 600 601 602 603 604
{
	int err;

	if (!first_ec)
		return -ENODEV;

605
	err = acpi_ec_write(first_ec, addr, val);
L
Linus Torvalds 已提交
606 607 608 609 610

	return err;
}
EXPORT_SYMBOL(ec_write);

611
int ec_transaction(u8 command,
L
Lv Zheng 已提交
612 613
		   const u8 *wdata, unsigned wdata_len,
		   u8 *rdata, unsigned rdata_len)
L
Luming Yu 已提交
614
{
615 616 617
	struct transaction t = {.command = command,
				.wdata = wdata, .rdata = rdata,
				.wlen = wdata_len, .rlen = rdata_len};
L
Lv Zheng 已提交
618

619 620
	if (!first_ec)
		return -ENODEV;
L
Luming Yu 已提交
621

622
	return acpi_ec_transaction(first_ec, &t);
L
Luming Yu 已提交
623
}
624 625
EXPORT_SYMBOL(ec_transaction);

S
Seth Forshee 已提交
626 627 628 629 630 631 632 633 634
/* Get the handle to the EC device */
acpi_handle ec_get_handle(void)
{
	if (!first_ec)
		return NULL;
	return first_ec->handle;
}
EXPORT_SYMBOL(ec_get_handle);

635
/*
636
 * Process _Q events that might have accumulated in the EC.
637 638 639 640 641 642 643 644
 * Run with locked ec mutex.
 */
static void acpi_ec_clear(struct acpi_ec *ec)
{
	int i, status;
	u8 value = 0;

	for (i = 0; i < ACPI_EC_CLEAR_MAX; i++) {
L
Lv Zheng 已提交
645
		status = acpi_ec_query(ec, &value);
646 647 648 649 650 651 652 653 654 655
		if (status || !value)
			break;
	}

	if (unlikely(i == ACPI_EC_CLEAR_MAX))
		pr_warn("Warning: Maximum of %d stale EC events cleared\n", i);
	else
		pr_info("%d stale EC events cleared\n", i);
}

656 657 658 659 660 661 662
static void acpi_ec_start(struct acpi_ec *ec, bool resuming)
{
	unsigned long flags;

	spin_lock_irqsave(&ec->lock, flags);
	if (!test_and_set_bit(EC_FLAGS_STARTED, &ec->flags)) {
		pr_debug("+++++ Starting EC +++++\n");
663
		/* Enable GPE for event processing (SCI_EVT=1) */
664
		if (!resuming)
665
			acpi_ec_submit_request(ec);
666 667 668 669 670
		pr_info("+++++ EC started +++++\n");
	}
	spin_unlock_irqrestore(&ec->lock, flags);
}

671 672 673 674 675 676 677 678 679 680 681
static bool acpi_ec_stopped(struct acpi_ec *ec)
{
	unsigned long flags;
	bool flushed;

	spin_lock_irqsave(&ec->lock, flags);
	flushed = acpi_ec_flushed(ec);
	spin_unlock_irqrestore(&ec->lock, flags);
	return flushed;
}

682 683 684 685 686 687 688 689
static void acpi_ec_stop(struct acpi_ec *ec, bool suspending)
{
	unsigned long flags;

	spin_lock_irqsave(&ec->lock, flags);
	if (acpi_ec_started(ec)) {
		pr_debug("+++++ Stopping EC +++++\n");
		set_bit(EC_FLAGS_STOPPED, &ec->flags);
690 691 692 693
		spin_unlock_irqrestore(&ec->lock, flags);
		wait_event(ec->wait, acpi_ec_stopped(ec));
		spin_lock_irqsave(&ec->lock, flags);
		/* Disable GPE for event processing (SCI_EVT=1) */
694
		if (!suspending)
695
			acpi_ec_complete_request(ec);
696 697 698 699 700 701 702
		clear_bit(EC_FLAGS_STARTED, &ec->flags);
		clear_bit(EC_FLAGS_STOPPED, &ec->flags);
		pr_info("+++++ EC stopped +++++\n");
	}
	spin_unlock_irqrestore(&ec->lock, flags);
}

703
void acpi_ec_block_transactions(void)
704 705 706 707 708 709
{
	struct acpi_ec *ec = first_ec;

	if (!ec)
		return;

710
	mutex_lock(&ec->mutex);
711
	/* Prevent transactions from being carried out */
712
	acpi_ec_stop(ec, true);
713
	mutex_unlock(&ec->mutex);
714 715
}

716
void acpi_ec_unblock_transactions(void)
717 718 719 720 721 722 723
{
	struct acpi_ec *ec = first_ec;

	if (!ec)
		return;

	/* Allow transactions to be carried out again */
724
	acpi_ec_start(ec, true);
725 726 727

	if (EC_FLAGS_CLEAR_ON_RESUME)
		acpi_ec_clear(ec);
728 729
}

730
void acpi_ec_unblock_transactions_early(void)
731 732 733 734 735 736
{
	/*
	 * Allow transactions to happen again (this function is called from
	 * atomic context during wakeup, so we don't need to acquire the mutex).
	 */
	if (first_ec)
737
		acpi_ec_start(first_ec, true);
738 739
}

L
Linus Torvalds 已提交
740 741 742
/* --------------------------------------------------------------------------
                                Event Management
   -------------------------------------------------------------------------- */
743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763
static struct acpi_ec_query_handler *
acpi_ec_get_query_handler(struct acpi_ec_query_handler *handler)
{
	if (handler)
		kref_get(&handler->kref);
	return handler;
}

static void acpi_ec_query_handler_release(struct kref *kref)
{
	struct acpi_ec_query_handler *handler =
		container_of(kref, struct acpi_ec_query_handler, kref);

	kfree(handler);
}

static void acpi_ec_put_query_handler(struct acpi_ec_query_handler *handler)
{
	kref_put(&handler->kref, acpi_ec_query_handler_release);
}

764 765 766 767 768 769
int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
			      acpi_handle handle, acpi_ec_query_func func,
			      void *data)
{
	struct acpi_ec_query_handler *handler =
	    kzalloc(sizeof(struct acpi_ec_query_handler), GFP_KERNEL);
L
Lv Zheng 已提交
770

771 772 773 774 775 776 777
	if (!handler)
		return -ENOMEM;

	handler->query_bit = query_bit;
	handler->handle = handle;
	handler->func = func;
	handler->data = data;
778
	mutex_lock(&ec->mutex);
779
	kref_init(&handler->kref);
780
	list_add(&handler->node, &ec->list);
781
	mutex_unlock(&ec->mutex);
782 783 784 785 786 787
	return 0;
}
EXPORT_SYMBOL_GPL(acpi_ec_add_query_handler);

void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit)
{
A
Adrian Bunk 已提交
788
	struct acpi_ec_query_handler *handler, *tmp;
789
	LIST_HEAD(free_list);
L
Lv Zheng 已提交
790

791
	mutex_lock(&ec->mutex);
A
Adrian Bunk 已提交
792
	list_for_each_entry_safe(handler, tmp, &ec->list, node) {
793
		if (query_bit == handler->query_bit) {
794 795
			list_del_init(&handler->node);
			list_add(&handler->node, &free_list);
796 797
		}
	}
798
	mutex_unlock(&ec->mutex);
799 800
	list_for_each_entry(handler, &free_list, node)
		acpi_ec_put_query_handler(handler);
801 802
}
EXPORT_SYMBOL_GPL(acpi_ec_remove_query_handler);
L
Linus Torvalds 已提交
803

804
static void acpi_ec_run(void *cxt)
L
Luming Yu 已提交
805
{
806
	struct acpi_ec_query_handler *handler = cxt;
L
Lv Zheng 已提交
807

808
	if (!handler)
809
		return;
810
	pr_debug("##### Query(0x%02x) started #####\n", handler->query_bit);
811 812 813 814
	if (handler->func)
		handler->func(handler->data);
	else if (handler->handle)
		acpi_evaluate_object(handler->handle, NULL, NULL, NULL);
815
	pr_debug("##### Query(0x%02x) stopped #####\n", handler->query_bit);
816
	acpi_ec_put_query_handler(handler);
817 818
}

L
Lv Zheng 已提交
819
static int acpi_ec_query(struct acpi_ec *ec, u8 *data)
820 821
{
	u8 value = 0;
822 823
	int result;
	acpi_status status;
824
	struct acpi_ec_query_handler *handler;
L
Lv Zheng 已提交
825 826 827
	struct transaction t = {.command = ACPI_EC_COMMAND_QUERY,
				.wdata = NULL, .rdata = &value,
				.wlen = 0, .rlen = 1};
828

L
Lv Zheng 已提交
829 830 831 832 833 834
	/*
	 * Query the EC to find out which _Qxx method we need to evaluate.
	 * Note that successful completion of the query causes the ACPI_EC_SCI
	 * bit to be cleared (and thus clearing the interrupt source).
	 */
	result = acpi_ec_transaction(ec, &t);
835 836
	if (result)
		return result;
L
Lv Zheng 已提交
837 838 839 840
	if (data)
		*data = value;
	if (!value)
		return -ENODATA;
841

L
Lv Zheng 已提交
842
	mutex_lock(&ec->mutex);
843 844 845
	list_for_each_entry(handler, &ec->list, node) {
		if (value == handler->query_bit) {
			/* have custom handler for this bit */
846
			handler = acpi_ec_get_query_handler(handler);
847 848
			pr_debug("##### Query(0x%02x) scheduled #####\n",
				 handler->query_bit);
849
			status = acpi_os_execute((handler->func) ?
850
				OSL_NOTIFY_HANDLER : OSL_GPE_HANDLER,
851
				acpi_ec_run, handler);
852 853 854
			if (ACPI_FAILURE(status))
				result = -EBUSY;
			break;
855 856
		}
	}
L
Lv Zheng 已提交
857
	mutex_unlock(&ec->mutex);
858
	return result;
859 860
}

861
static void acpi_ec_gpe_poller(struct work_struct *work)
862
{
863
	struct acpi_ec *ec = container_of(work, struct acpi_ec, work);
L
Lv Zheng 已提交
864

L
Lv Zheng 已提交
865
	acpi_ec_query(ec, NULL);
L
Luming Yu 已提交
866
}
L
Linus Torvalds 已提交
867

868 869
static u32 acpi_ec_gpe_handler(acpi_handle gpe_device,
	u32 gpe_number, void *data)
L
Linus Torvalds 已提交
870
{
871
	unsigned long flags;
872
	struct acpi_ec *ec = data;
873

874
	spin_lock_irqsave(&ec->lock, flags);
875
	advance_transaction(ec);
876
	spin_unlock_irqrestore(&ec->lock, flags);
877
	return ACPI_INTERRUPT_HANDLED;
A
Alexey Starikovskiy 已提交
878 879
}

L
Linus Torvalds 已提交
880
/* --------------------------------------------------------------------------
L
Lv Zheng 已提交
881 882
 *                           Address Space Management
 * -------------------------------------------------------------------------- */
L
Linus Torvalds 已提交
883 884

static acpi_status
885
acpi_ec_space_handler(u32 function, acpi_physical_address address,
886
		      u32 bits, u64 *value64,
L
Len Brown 已提交
887
		      void *handler_context, void *region_context)
L
Linus Torvalds 已提交
888
{
889
	struct acpi_ec *ec = handler_context;
890 891
	int result = 0, i, bytes = bits / 8;
	u8 *value = (u8 *)value64;
L
Linus Torvalds 已提交
892 893

	if ((address > 0xFF) || !value || !handler_context)
894
		return AE_BAD_PARAMETER;
L
Linus Torvalds 已提交
895

896
	if (function != ACPI_READ && function != ACPI_WRITE)
897
		return AE_BAD_PARAMETER;
L
Linus Torvalds 已提交
898

899
	if (EC_FLAGS_MSI || bits > 8)
900
		acpi_ec_burst_enable(ec);
901

902 903 904 905
	for (i = 0; i < bytes; ++i, ++address, ++value)
		result = (function == ACPI_READ) ?
			acpi_ec_read(ec, address, value) :
			acpi_ec_write(ec, address, *value);
L
Linus Torvalds 已提交
906

907
	if (EC_FLAGS_MSI || bits > 8)
908
		acpi_ec_burst_disable(ec);
909

L
Linus Torvalds 已提交
910 911
	switch (result) {
	case -EINVAL:
912
		return AE_BAD_PARAMETER;
L
Linus Torvalds 已提交
913
	case -ENODEV:
914
		return AE_NOT_FOUND;
L
Linus Torvalds 已提交
915
	case -ETIME:
916
		return AE_TIME;
L
Linus Torvalds 已提交
917
	default:
918
		return AE_OK;
L
Linus Torvalds 已提交
919 920 921 922
	}
}

/* --------------------------------------------------------------------------
L
Lv Zheng 已提交
923 924 925
 *                             Driver Interface
 * -------------------------------------------------------------------------- */

926 927 928 929 930 931
static acpi_status
ec_parse_io_ports(struct acpi_resource *resource, void *context);

static struct acpi_ec *make_acpi_ec(void)
{
	struct acpi_ec *ec = kzalloc(sizeof(struct acpi_ec), GFP_KERNEL);
L
Lv Zheng 已提交
932

933 934
	if (!ec)
		return NULL;
935
	ec->flags = 1 << EC_FLAGS_QUERY_PENDING;
936
	mutex_init(&ec->mutex);
937
	init_waitqueue_head(&ec->wait);
938
	INIT_LIST_HEAD(&ec->list);
939
	spin_lock_init(&ec->lock);
940
	INIT_WORK(&ec->work, acpi_ec_gpe_poller);
941 942
	return ec;
}
943

944 945 946 947
static acpi_status
acpi_ec_register_query_methods(acpi_handle handle, u32 level,
			       void *context, void **return_value)
{
948 949
	char node_name[5];
	struct acpi_buffer buffer = { sizeof(node_name), node_name };
950 951
	struct acpi_ec *ec = context;
	int value = 0;
952 953 954 955
	acpi_status status;

	status = acpi_get_name(handle, ACPI_SINGLE_NAME, &buffer);

L
Lv Zheng 已提交
956
	if (ACPI_SUCCESS(status) && sscanf(node_name, "_Q%x", &value) == 1)
957 958 959 960
		acpi_ec_add_query_handler(ec, value, handle, NULL, NULL);
	return AE_OK;
}

961 962
static acpi_status
ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval)
963
{
964
	acpi_status status;
965
	unsigned long long tmp = 0;
966
	struct acpi_ec *ec = context;
967 968 969 970

	/* clear addr values, ec_parse_io_ports depend on it */
	ec->command_addr = ec->data_addr = 0;

971 972 973 974
	status = acpi_walk_resources(handle, METHOD_NAME__CRS,
				     ec_parse_io_ports, ec);
	if (ACPI_FAILURE(status))
		return status;
975 976 977

	/* Get GPE bit assignment (EC events). */
	/* TODO: Add support for _GPE returning a package */
978
	status = acpi_evaluate_integer(handle, "_GPE", NULL, &tmp);
979 980
	if (ACPI_FAILURE(status))
		return status;
981
	ec->gpe = tmp;
982
	/* Use the global lock for all EC transactions? */
983
	tmp = 0;
984 985
	acpi_evaluate_integer(handle, "_GLK", NULL, &tmp);
	ec->global_lock = tmp;
986
	ec->handle = handle;
987
	return AE_CTRL_TERMINATE;
988 989
}

990 991 992
static int ec_install_handlers(struct acpi_ec *ec)
{
	acpi_status status;
L
Lv Zheng 已提交
993

994 995
	if (test_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags))
		return 0;
996
	status = acpi_install_gpe_raw_handler(NULL, ec->gpe,
997 998 999 1000
				  ACPI_GPE_EDGE_TRIGGERED,
				  &acpi_ec_gpe_handler, ec);
	if (ACPI_FAILURE(status))
		return -ENODEV;
1001

1002
	acpi_ec_start(ec, false);
1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013
	status = acpi_install_address_space_handler(ec->handle,
						    ACPI_ADR_SPACE_EC,
						    &acpi_ec_space_handler,
						    NULL, ec);
	if (ACPI_FAILURE(status)) {
		if (status == AE_NOT_FOUND) {
			/*
			 * Maybe OS fails in evaluating the _REG object.
			 * The AE_NOT_FOUND error will be ignored and OS
			 * continue to initialize EC.
			 */
1014
			pr_err("Fail in evaluating the _REG object"
1015 1016
				" of EC device. Broken bios is suspected.\n");
		} else {
1017
			acpi_ec_stop(ec, false);
1018 1019 1020 1021 1022 1023 1024 1025 1026 1027
			acpi_remove_gpe_handler(NULL, ec->gpe,
				&acpi_ec_gpe_handler);
			return -ENODEV;
		}
	}

	set_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags);
	return 0;
}

1028 1029
static void ec_remove_handlers(struct acpi_ec *ec)
{
1030 1031
	if (!test_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags))
		return;
1032
	acpi_ec_stop(ec, false);
1033 1034
	if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle,
				ACPI_ADR_SPACE_EC, &acpi_ec_space_handler)))
1035
		pr_err("failed to remove space handler\n");
1036 1037
	if (ACPI_FAILURE(acpi_remove_gpe_handler(NULL, ec->gpe,
				&acpi_ec_gpe_handler)))
1038
		pr_err("failed to remove gpe handler\n");
1039
	clear_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags);
1040 1041
}

1042
static int acpi_ec_add(struct acpi_device *device)
L
Linus Torvalds 已提交
1043
{
1044
	struct acpi_ec *ec = NULL;
B
Bjorn Helgaas 已提交
1045
	int ret;
L
Luming Yu 已提交
1046

1047 1048 1049
	strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME);
	strcpy(acpi_device_class(device), ACPI_EC_CLASS);

1050
	/* Check for boot EC */
1051 1052 1053 1054 1055 1056 1057 1058 1059
	if (boot_ec &&
	    (boot_ec->handle == device->handle ||
	     boot_ec->handle == ACPI_ROOT_OBJECT)) {
		ec = boot_ec;
		boot_ec = NULL;
	} else {
		ec = make_acpi_ec();
		if (!ec)
			return -ENOMEM;
1060 1061 1062
	}
	if (ec_parse_device(device->handle, 0, ec, NULL) !=
		AE_CTRL_TERMINATE) {
1063 1064
			kfree(ec);
			return -EINVAL;
1065 1066
	}

1067 1068
	/* Find and register all query methods */
	acpi_walk_namespace(ACPI_TYPE_METHOD, ec->handle, 1,
1069
			    acpi_ec_register_query_methods, NULL, ec, NULL);
1070

1071 1072
	if (!first_ec)
		first_ec = ec;
1073
	device->driver_data = ec;
1074

1075 1076 1077 1078
	ret = !!request_region(ec->data_addr, 1, "EC data");
	WARN(!ret, "Could not request EC data io port 0x%lx", ec->data_addr);
	ret = !!request_region(ec->command_addr, 1, "EC cmd");
	WARN(!ret, "Could not request EC cmd io port 0x%lx", ec->command_addr);
1079

1080
	pr_info("GPE = 0x%lx, I/O: command/status = 0x%lx, data = 0x%lx\n",
1081
			  ec->gpe, ec->command_addr, ec->data_addr);
1082 1083 1084 1085 1086

	ret = ec_install_handlers(ec);

	/* EC is fully operational, allow queries */
	clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
1087 1088

	/* Clear stale _Q events if hardware might require that */
L
Lv Zheng 已提交
1089
	if (EC_FLAGS_CLEAR_ON_RESUME)
1090
		acpi_ec_clear(ec);
1091
	return ret;
L
Linus Torvalds 已提交
1092 1093
}

1094
static int acpi_ec_remove(struct acpi_device *device)
L
Linus Torvalds 已提交
1095
{
1096
	struct acpi_ec *ec;
1097
	struct acpi_ec_query_handler *handler, *tmp;
L
Linus Torvalds 已提交
1098 1099

	if (!device)
1100
		return -EINVAL;
L
Linus Torvalds 已提交
1101 1102

	ec = acpi_driver_data(device);
B
Bjorn Helgaas 已提交
1103
	ec_remove_handlers(ec);
1104
	mutex_lock(&ec->mutex);
1105
	list_for_each_entry_safe(handler, tmp, &ec->list, node) {
1106 1107 1108
		list_del(&handler->node);
		kfree(handler);
	}
1109
	mutex_unlock(&ec->mutex);
1110 1111
	release_region(ec->data_addr, 1);
	release_region(ec->command_addr, 1);
1112
	device->driver_data = NULL;
1113
	if (ec == first_ec)
1114
		first_ec = NULL;
1115
	kfree(ec);
1116
	return 0;
L
Linus Torvalds 已提交
1117 1118 1119
}

static acpi_status
1120
ec_parse_io_ports(struct acpi_resource *resource, void *context)
L
Linus Torvalds 已提交
1121
{
1122
	struct acpi_ec *ec = context;
L
Linus Torvalds 已提交
1123

1124
	if (resource->type != ACPI_RESOURCE_TYPE_IO)
L
Linus Torvalds 已提交
1125 1126 1127 1128 1129 1130 1131
		return AE_OK;

	/*
	 * The first address region returned is the data port, and
	 * the second address region returned is the status/command
	 * port.
	 */
1132
	if (ec->data_addr == 0)
1133
		ec->data_addr = resource->data.io.minimum;
1134
	else if (ec->command_addr == 0)
1135
		ec->command_addr = resource->data.io.minimum;
1136
	else
L
Linus Torvalds 已提交
1137 1138 1139 1140 1141
		return AE_CTRL_TERMINATE;

	return AE_OK;
}

1142 1143
int __init acpi_boot_ec_enable(void)
{
1144
	if (!boot_ec || test_bit(EC_FLAGS_HANDLERS_INSTALLED, &boot_ec->flags))
1145 1146 1147 1148 1149 1150 1151 1152
		return 0;
	if (!ec_install_handlers(boot_ec)) {
		first_ec = boot_ec;
		return 0;
	}
	return -EFAULT;
}

1153 1154 1155 1156 1157
static const struct acpi_device_id ec_device_ids[] = {
	{"PNP0C09", 0},
	{"", 0},
};

1158 1159 1160 1161 1162 1163 1164
/* Some BIOS do not survive early DSDT scan, skip it */
static int ec_skip_dsdt_scan(const struct dmi_system_id *id)
{
	EC_FLAGS_SKIP_DSDT_SCAN = 1;
	return 0;
}

A
Alexey Starikovskiy 已提交
1165 1166 1167 1168 1169 1170 1171 1172 1173 1174
/* ASUStek often supplies us with broken ECDT, validate it */
static int ec_validate_ecdt(const struct dmi_system_id *id)
{
	EC_FLAGS_VALIDATE_ECDT = 1;
	return 0;
}

/* MSI EC needs special treatment, enable it */
static int ec_flag_msi(const struct dmi_system_id *id)
{
1175
	pr_debug("Detected MSI hardware, enabling workarounds.\n");
A
Alexey Starikovskiy 已提交
1176 1177 1178 1179 1180
	EC_FLAGS_MSI = 1;
	EC_FLAGS_VALIDATE_ECDT = 1;
	return 0;
}

1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191
/*
 * Clevo M720 notebook actually works ok with IRQ mode, if we lifted
 * the GPE storm threshold back to 20
 */
static int ec_enlarge_storm_threshold(const struct dmi_system_id *id)
{
	pr_debug("Setting the EC GPE storm threshold to 20\n");
	ec_storm_threshold  = 20;
	return 0;
}

1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203
/*
 * Acer EC firmware refuses to respond QR_EC when SCI_EVT is not set, for
 * which case, we complete the QR_EC without issuing it to the firmware.
 * https://bugzilla.kernel.org/show_bug.cgi?id=86211
 */
static int ec_flag_query_handshake(const struct dmi_system_id *id)
{
	pr_debug("Detected the EC firmware requiring QR_EC issued when SCI_EVT set\n");
	EC_FLAGS_QUERY_HANDSHAKE = 1;
	return 0;
}

1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227
/*
 * On some hardware it is necessary to clear events accumulated by the EC during
 * sleep. These ECs stop reporting GPEs until they are manually polled, if too
 * many events are accumulated. (e.g. Samsung Series 5/9 notebooks)
 *
 * https://bugzilla.kernel.org/show_bug.cgi?id=44161
 *
 * Ideally, the EC should also be instructed NOT to accumulate events during
 * sleep (which Windows seems to do somehow), but the interface to control this
 * behaviour is not known at this time.
 *
 * Models known to be affected are Samsung 530Uxx/535Uxx/540Uxx/550Pxx/900Xxx,
 * however it is very likely that other Samsung models are affected.
 *
 * On systems which don't accumulate _Q events during sleep, this extra check
 * should be harmless.
 */
static int ec_clear_on_resume(const struct dmi_system_id *id)
{
	pr_debug("Detected system needing EC poll on resume.\n");
	EC_FLAGS_CLEAR_ON_RESUME = 1;
	return 0;
}

1228
static struct dmi_system_id ec_dmi_table[] __initdata = {
1229 1230 1231 1232
	{
	ec_skip_dsdt_scan, "Compal JFL92", {
	DMI_MATCH(DMI_BIOS_VENDOR, "COMPAL"),
	DMI_MATCH(DMI_BOARD_NAME, "JFL92") }, NULL},
A
Alexey Starikovskiy 已提交
1233 1234
	{
	ec_flag_msi, "MSI hardware", {
1235 1236 1237 1238 1239 1240 1241
	DMI_MATCH(DMI_BIOS_VENDOR, "Micro-Star")}, NULL},
	{
	ec_flag_msi, "MSI hardware", {
	DMI_MATCH(DMI_SYS_VENDOR, "Micro-Star")}, NULL},
	{
	ec_flag_msi, "MSI hardware", {
	DMI_MATCH(DMI_CHASSIS_VENDOR, "MICRO-Star")}, NULL},
A
Alexey Starikovskiy 已提交
1242
	{
1243 1244 1245
	ec_flag_msi, "MSI hardware", {
	DMI_MATCH(DMI_CHASSIS_VENDOR, "MICRO-STAR")}, NULL},
	{
1246 1247 1248 1249 1250 1251 1252 1253
	ec_flag_msi, "Quanta hardware", {
	DMI_MATCH(DMI_SYS_VENDOR, "Quanta"),
	DMI_MATCH(DMI_PRODUCT_NAME, "TW8/SW8/DW8"),}, NULL},
	{
	ec_flag_msi, "Quanta hardware", {
	DMI_MATCH(DMI_SYS_VENDOR, "Quanta"),
	DMI_MATCH(DMI_PRODUCT_NAME, "TW9/SW9"),}, NULL},
	{
1254 1255 1256 1257
	ec_flag_msi, "Clevo W350etq", {
	DMI_MATCH(DMI_SYS_VENDOR, "CLEVO CO."),
	DMI_MATCH(DMI_PRODUCT_NAME, "W35_37ET"),}, NULL},
	{
A
Alexey Starikovskiy 已提交
1258 1259
	ec_validate_ecdt, "ASUS hardware", {
	DMI_MATCH(DMI_BIOS_VENDOR, "ASUS") }, NULL},
1260 1261 1262
	{
	ec_validate_ecdt, "ASUS hardware", {
	DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc.") }, NULL},
1263 1264 1265 1266
	{
	ec_enlarge_storm_threshold, "CLEVO hardware", {
	DMI_MATCH(DMI_SYS_VENDOR, "CLEVO Co."),
	DMI_MATCH(DMI_PRODUCT_NAME, "M720T/M730T"),}, NULL},
1267 1268 1269 1270
	{
	ec_skip_dsdt_scan, "HP Folio 13", {
	DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
	DMI_MATCH(DMI_PRODUCT_NAME, "HP Folio 13"),}, NULL},
1271 1272 1273 1274
	{
	ec_validate_ecdt, "ASUS hardware", {
	DMI_MATCH(DMI_SYS_VENDOR, "ASUSTek Computer Inc."),
	DMI_MATCH(DMI_PRODUCT_NAME, "L4R"),}, NULL},
1275 1276 1277
	{
	ec_clear_on_resume, "Samsung hardware", {
	DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD.")}, NULL},
1278 1279 1280
	{
	ec_flag_query_handshake, "Acer hardware", {
	DMI_MATCH(DMI_SYS_VENDOR, "Acer"), }, NULL},
A
Alexey Starikovskiy 已提交
1281 1282 1283
	{},
};

1284 1285 1286
int __init acpi_ec_ecdt_probe(void)
{
	acpi_status status;
1287
	struct acpi_ec *saved_ec = NULL;
L
Len Brown 已提交
1288
	struct acpi_table_ecdt *ecdt_ptr;
L
Luming Yu 已提交
1289

1290 1291
	boot_ec = make_acpi_ec();
	if (!boot_ec)
1292 1293 1294 1295
		return -ENOMEM;
	/*
	 * Generate a boot ec context
	 */
A
Alexey Starikovskiy 已提交
1296
	dmi_check_system(ec_dmi_table);
1297 1298
	status = acpi_get_table(ACPI_SIG_ECDT, 1,
				(struct acpi_table_header **)&ecdt_ptr);
1299
	if (ACPI_SUCCESS(status)) {
1300
		pr_info("EC description table is found, configuring boot EC\n");
1301 1302 1303
		boot_ec->command_addr = ecdt_ptr->control.address;
		boot_ec->data_addr = ecdt_ptr->data.address;
		boot_ec->gpe = ecdt_ptr->gpe;
1304
		boot_ec->handle = ACPI_ROOT_OBJECT;
L
Lv Zheng 已提交
1305 1306
		acpi_get_handle(ACPI_ROOT_OBJECT, ecdt_ptr->id,
				&boot_ec->handle);
1307
		/* Don't trust ECDT, which comes from ASUSTek */
A
Alexey Starikovskiy 已提交
1308
		if (!EC_FLAGS_VALIDATE_ECDT)
1309
			goto install;
J
Julia Lawall 已提交
1310
		saved_ec = kmemdup(boot_ec, sizeof(struct acpi_ec), GFP_KERNEL);
1311 1312
		if (!saved_ec)
			return -ENOMEM;
1313
	/* fall through */
1314
	}
A
Alexey Starikovskiy 已提交
1315

1316 1317
	if (EC_FLAGS_SKIP_DSDT_SCAN) {
		kfree(saved_ec);
1318
		return -ENODEV;
1319
	}
1320

1321 1322
	/* This workaround is needed only on some broken machines,
	 * which require early EC, but fail to provide ECDT */
1323
	pr_debug("Look up EC in DSDT\n");
1324 1325 1326 1327 1328
	status = acpi_get_devices(ec_device_ids[0].id, ec_parse_device,
					boot_ec, NULL);
	/* Check that acpi_get_devices actually find something */
	if (ACPI_FAILURE(status) || !boot_ec->handle)
		goto error;
1329 1330 1331 1332 1333 1334
	if (saved_ec) {
		/* try to find good ECDT from ASUSTek */
		if (saved_ec->command_addr != boot_ec->command_addr ||
		    saved_ec->data_addr != boot_ec->data_addr ||
		    saved_ec->gpe != boot_ec->gpe ||
		    saved_ec->handle != boot_ec->handle)
1335
			pr_info("ASUSTek keeps feeding us with broken "
1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346
			"ECDT tables, which are very hard to workaround. "
			"Trying to use DSDT EC info instead. Please send "
			"output of acpidump to linux-acpi@vger.kernel.org\n");
		kfree(saved_ec);
		saved_ec = NULL;
	} else {
		/* We really need to limit this workaround, the only ASUS,
		* which needs it, has fake EC._INI method, so use it as flag.
		* Keep boot_ec struct as it will be needed soon.
		*/
		if (!dmi_name_in_vendors("ASUS") ||
1347
		    !acpi_has_method(boot_ec->handle, "_INI"))
1348 1349
			return -ENODEV;
	}
1350 1351
install:
	if (!ec_install_handlers(boot_ec)) {
1352
		first_ec = boot_ec;
1353
		return 0;
1354
	}
1355
error:
1356
	kfree(boot_ec);
1357
	kfree(saved_ec);
1358
	boot_ec = NULL;
L
Linus Torvalds 已提交
1359 1360 1361
	return -ENODEV;
}

1362 1363 1364 1365 1366 1367 1368 1369 1370 1371
static struct acpi_driver acpi_ec_driver = {
	.name = "ec",
	.class = ACPI_EC_CLASS,
	.ids = ec_device_ids,
	.ops = {
		.add = acpi_ec_add,
		.remove = acpi_ec_remove,
		},
};

1372
int __init acpi_ec_init(void)
L
Linus Torvalds 已提交
1373
{
L
Len Brown 已提交
1374
	int result = 0;
L
Linus Torvalds 已提交
1375 1376 1377

	/* Now register the driver for the EC */
	result = acpi_bus_register_driver(&acpi_ec_driver);
1378
	if (result < 0)
1379
		return -ENODEV;
L
Linus Torvalds 已提交
1380

1381
	return result;
L
Linus Torvalds 已提交
1382 1383 1384 1385
}

/* EC driver currently not unloadable */
#if 0
L
Len Brown 已提交
1386
static void __exit acpi_ec_exit(void)
L
Linus Torvalds 已提交
1387 1388 1389 1390
{

	acpi_bus_unregister_driver(&acpi_ec_driver);
}
1391
#endif	/* 0 */