linux/drivers/acpi/ec.c
<<
>>
Prefs
   1/*
   2 *  ec.c - ACPI Embedded Controller Driver (v2.1)
   3 *
   4 *  Copyright (C) 2006-2008 Alexey Starikovskiy <astarikovskiy@suse.de>
   5 *  Copyright (C) 2006 Denis Sadykov <denis.m.sadykov@intel.com>
   6 *  Copyright (C) 2004 Luming Yu <luming.yu@intel.com>
   7 *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
   8 *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
   9 *
  10 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  11 *
  12 *  This program is free software; you can redistribute it and/or modify
  13 *  it under the terms of the GNU General Public License as published by
  14 *  the Free Software Foundation; either version 2 of the License, or (at
  15 *  your option) any later version.
  16 *
  17 *  This program is distributed in the hope that it will be useful, but
  18 *  WITHOUT ANY WARRANTY; without even the implied warranty of
  19 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  20 *  General Public License for more details.
  21 *
  22 *  You should have received a copy of the GNU General Public License along
  23 *  with this program; if not, write to the Free Software Foundation, Inc.,
  24 *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  25 *
  26 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  27 */
  28
  29/* Uncomment next line to get verbose printout */
  30/* #define DEBUG */
  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 <asm/io.h>
  42#include <acpi/acpi_bus.h>
  43#include <acpi/acpi_drivers.h>
  44#include <linux/dmi.h>
  45
  46#include "internal.h"
  47
  48#define ACPI_EC_CLASS                   "embedded_controller"
  49#define ACPI_EC_DEVICE_NAME             "Embedded Controller"
  50#define ACPI_EC_FILE_INFO               "info"
  51
  52#undef PREFIX
  53#define PREFIX                          "ACPI: EC: "
  54
  55/* EC status register */
  56#define ACPI_EC_FLAG_OBF        0x01    /* Output buffer full */
  57#define ACPI_EC_FLAG_IBF        0x02    /* Input buffer full */
  58#define ACPI_EC_FLAG_BURST      0x10    /* burst mode */
  59#define ACPI_EC_FLAG_SCI        0x20    /* EC-SCI occurred */
  60
  61/* EC commands */
  62enum ec_command {
  63        ACPI_EC_COMMAND_READ = 0x80,
  64        ACPI_EC_COMMAND_WRITE = 0x81,
  65        ACPI_EC_BURST_ENABLE = 0x82,
  66        ACPI_EC_BURST_DISABLE = 0x83,
  67        ACPI_EC_COMMAND_QUERY = 0x84,
  68};
  69
  70#define ACPI_EC_DELAY           500     /* Wait 500ms max. during EC ops */
  71#define ACPI_EC_UDELAY_GLK      1000    /* Wait 1ms max. to get global lock */
  72#define ACPI_EC_MSI_UDELAY      550     /* Wait 550us for MSI EC */
  73
  74enum {
  75        EC_FLAGS_QUERY_PENDING,         /* Query is pending */
  76        EC_FLAGS_GPE_STORM,             /* GPE storm detected */
  77        EC_FLAGS_HANDLERS_INSTALLED,    /* Handlers for GPE and
  78                                         * OpReg are installed */
  79        EC_FLAGS_BLOCKED,               /* Transactions are blocked */
  80};
  81
  82/* ec.c is compiled in acpi namespace so this shows up as acpi.ec_delay param */
  83static unsigned int ec_delay __read_mostly = ACPI_EC_DELAY;
  84module_param(ec_delay, uint, 0644);
  85MODULE_PARM_DESC(ec_delay, "Timeout(ms) waited until an EC command completes");
  86
  87/*
  88 * If the number of false interrupts per one transaction exceeds
  89 * this threshold, will think there is a GPE storm happened and
  90 * will disable the GPE for normal transaction.
  91 */
  92static unsigned int ec_storm_threshold  __read_mostly = 8;
  93module_param(ec_storm_threshold, uint, 0644);
  94MODULE_PARM_DESC(ec_storm_threshold, "Maxim false GPE numbers not considered as GPE storm");
  95
  96/* If we find an EC via the ECDT, we need to keep a ptr to its context */
  97/* External interfaces use first EC only, so remember */
  98typedef int (*acpi_ec_query_func) (void *data);
  99
 100struct acpi_ec_query_handler {
 101        struct list_head node;
 102        acpi_ec_query_func func;
 103        acpi_handle handle;
 104        void *data;
 105        u8 query_bit;
 106};
 107
 108struct transaction {
 109        const u8 *wdata;
 110        u8 *rdata;
 111        unsigned short irq_count;
 112        u8 command;
 113        u8 wi;
 114        u8 ri;
 115        u8 wlen;
 116        u8 rlen;
 117        bool done;
 118};
 119
 120struct acpi_ec *boot_ec, *first_ec;
 121EXPORT_SYMBOL(first_ec);
 122
 123static int EC_FLAGS_MSI; /* Out-of-spec MSI controller */
 124static int EC_FLAGS_VALIDATE_ECDT; /* ASUStec ECDTs need to be validated */
 125static int EC_FLAGS_SKIP_DSDT_SCAN; /* Not all BIOS survive early DSDT scan */
 126
 127/* --------------------------------------------------------------------------
 128                             Transaction Management
 129   -------------------------------------------------------------------------- */
 130
 131static inline u8 acpi_ec_read_status(struct acpi_ec *ec)
 132{
 133        u8 x = inb(ec->command_addr);
 134        pr_debug(PREFIX "---> status = 0x%2.2x\n", x);
 135        return x;
 136}
 137
 138static inline u8 acpi_ec_read_data(struct acpi_ec *ec)
 139{
 140        u8 x = inb(ec->data_addr);
 141        pr_debug(PREFIX "---> data = 0x%2.2x\n", x);
 142        return x;
 143}
 144
 145static inline void acpi_ec_write_cmd(struct acpi_ec *ec, u8 command)
 146{
 147        pr_debug(PREFIX "<--- command = 0x%2.2x\n", command);
 148        outb(command, ec->command_addr);
 149}
 150
 151static inline void acpi_ec_write_data(struct acpi_ec *ec, u8 data)
 152{
 153        pr_debug(PREFIX "<--- data = 0x%2.2x\n", data);
 154        outb(data, ec->data_addr);
 155}
 156
 157static int ec_transaction_done(struct acpi_ec *ec)
 158{
 159        unsigned long flags;
 160        int ret = 0;
 161        spin_lock_irqsave(&ec->lock, flags);
 162        if (!ec->curr || ec->curr->done)
 163                ret = 1;
 164        spin_unlock_irqrestore(&ec->lock, flags);
 165        return ret;
 166}
 167
 168static void start_transaction(struct acpi_ec *ec)
 169{
 170        ec->curr->irq_count = ec->curr->wi = ec->curr->ri = 0;
 171        ec->curr->done = false;
 172        acpi_ec_write_cmd(ec, ec->curr->command);
 173}
 174
 175static void advance_transaction(struct acpi_ec *ec, u8 status)
 176{
 177        unsigned long flags;
 178        struct transaction *t = ec->curr;
 179
 180        spin_lock_irqsave(&ec->lock, flags);
 181        if (!t)
 182                goto unlock;
 183        if (t->wlen > t->wi) {
 184                if ((status & ACPI_EC_FLAG_IBF) == 0)
 185                        acpi_ec_write_data(ec,
 186                                t->wdata[t->wi++]);
 187                else
 188                        goto err;
 189        } else if (t->rlen > t->ri) {
 190                if ((status & ACPI_EC_FLAG_OBF) == 1) {
 191                        t->rdata[t->ri++] = acpi_ec_read_data(ec);
 192                        if (t->rlen == t->ri)
 193                                t->done = true;
 194                } else
 195                        goto err;
 196        } else if (t->wlen == t->wi &&
 197                   (status & ACPI_EC_FLAG_IBF) == 0)
 198                t->done = true;
 199        goto unlock;
 200err:
 201        /*
 202         * If SCI bit is set, then don't think it's a false IRQ
 203         * otherwise will take a not handled IRQ as a false one.
 204         */
 205        if (in_interrupt() && !(status & ACPI_EC_FLAG_SCI))
 206                ++t->irq_count;
 207
 208unlock:
 209        spin_unlock_irqrestore(&ec->lock, flags);
 210}
 211
 212static int acpi_ec_sync_query(struct acpi_ec *ec);
 213
 214static int ec_check_sci_sync(struct acpi_ec *ec, u8 state)
 215{
 216        if (state & ACPI_EC_FLAG_SCI) {
 217                if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags))
 218                        return acpi_ec_sync_query(ec);
 219        }
 220        return 0;
 221}
 222
 223static int ec_poll(struct acpi_ec *ec)
 224{
 225        unsigned long flags;
 226        int repeat = 5; /* number of command restarts */
 227        while (repeat--) {
 228                unsigned long delay = jiffies +
 229                        msecs_to_jiffies(ec_delay);
 230                do {
 231                        /* don't sleep with disabled interrupts */
 232                        if (EC_FLAGS_MSI || irqs_disabled()) {
 233                                udelay(ACPI_EC_MSI_UDELAY);
 234                                if (ec_transaction_done(ec))
 235                                        return 0;
 236                        } else {
 237                                if (wait_event_timeout(ec->wait,
 238                                                ec_transaction_done(ec),
 239                                                msecs_to_jiffies(1)))
 240                                        return 0;
 241                        }
 242                        advance_transaction(ec, acpi_ec_read_status(ec));
 243                } while (time_before(jiffies, delay));
 244                pr_debug(PREFIX "controller reset, restart transaction\n");
 245                spin_lock_irqsave(&ec->lock, flags);
 246                start_transaction(ec);
 247                spin_unlock_irqrestore(&ec->lock, flags);
 248        }
 249        return -ETIME;
 250}
 251
 252static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,
 253                                        struct transaction *t)
 254{
 255        unsigned long tmp;
 256        int ret = 0;
 257        if (EC_FLAGS_MSI)
 258                udelay(ACPI_EC_MSI_UDELAY);
 259        /* start transaction */
 260        spin_lock_irqsave(&ec->lock, tmp);
 261        /* following two actions should be kept atomic */
 262        ec->curr = t;
 263        start_transaction(ec);
 264        if (ec->curr->command == ACPI_EC_COMMAND_QUERY)
 265                clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
 266        spin_unlock_irqrestore(&ec->lock, tmp);
 267        ret = ec_poll(ec);
 268        spin_lock_irqsave(&ec->lock, tmp);
 269        ec->curr = NULL;
 270        spin_unlock_irqrestore(&ec->lock, tmp);
 271        return ret;
 272}
 273
 274static int ec_check_ibf0(struct acpi_ec *ec)
 275{
 276        u8 status = acpi_ec_read_status(ec);
 277        return (status & ACPI_EC_FLAG_IBF) == 0;
 278}
 279
 280static int ec_wait_ibf0(struct acpi_ec *ec)
 281{
 282        unsigned long delay = jiffies + msecs_to_jiffies(ec_delay);
 283        /* interrupt wait manually if GPE mode is not active */
 284        while (time_before(jiffies, delay))
 285                if (wait_event_timeout(ec->wait, ec_check_ibf0(ec),
 286                                        msecs_to_jiffies(1)))
 287                        return 0;
 288        return -ETIME;
 289}
 290
 291static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t)
 292{
 293        int status;
 294        u32 glk;
 295        if (!ec || (!t) || (t->wlen && !t->wdata) || (t->rlen && !t->rdata))
 296                return -EINVAL;
 297        if (t->rdata)
 298                memset(t->rdata, 0, t->rlen);
 299        mutex_lock(&ec->mutex);
 300        if (test_bit(EC_FLAGS_BLOCKED, &ec->flags)) {
 301                status = -EINVAL;
 302                goto unlock;
 303        }
 304        if (ec->global_lock) {
 305                status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk);
 306                if (ACPI_FAILURE(status)) {
 307                        status = -ENODEV;
 308                        goto unlock;
 309                }
 310        }
 311        if (ec_wait_ibf0(ec)) {
 312                pr_err(PREFIX "input buffer is not empty, "
 313                                "aborting transaction\n");
 314                status = -ETIME;
 315                goto end;
 316        }
 317        pr_debug(PREFIX "transaction start (cmd=0x%02x, addr=0x%02x)\n",
 318                        t->command, t->wdata ? t->wdata[0] : 0);
 319        /* disable GPE during transaction if storm is detected */
 320        if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) {
 321                /* It has to be disabled, so that it doesn't trigger. */
 322                acpi_disable_gpe(NULL, ec->gpe);
 323        }
 324
 325        status = acpi_ec_transaction_unlocked(ec, t);
 326
 327        /* check if we received SCI during transaction */
 328        ec_check_sci_sync(ec, acpi_ec_read_status(ec));
 329        if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) {
 330                msleep(1);
 331                /* It is safe to enable the GPE outside of the transaction. */
 332                acpi_enable_gpe(NULL, ec->gpe);
 333        } else if (t->irq_count > ec_storm_threshold) {
 334                pr_info(PREFIX "GPE storm detected(%d GPEs), "
 335                        "transactions will use polling mode\n",
 336                        t->irq_count);
 337                set_bit(EC_FLAGS_GPE_STORM, &ec->flags);
 338        }
 339        pr_debug(PREFIX "transaction end\n");
 340end:
 341        if (ec->global_lock)
 342                acpi_release_global_lock(glk);
 343unlock:
 344        mutex_unlock(&ec->mutex);
 345        return status;
 346}
 347
 348static int acpi_ec_burst_enable(struct acpi_ec *ec)
 349{
 350        u8 d;
 351        struct transaction t = {.command = ACPI_EC_BURST_ENABLE,
 352                                .wdata = NULL, .rdata = &d,
 353                                .wlen = 0, .rlen = 1};
 354
 355        return acpi_ec_transaction(ec, &t);
 356}
 357
 358static int acpi_ec_burst_disable(struct acpi_ec *ec)
 359{
 360        struct transaction t = {.command = ACPI_EC_BURST_DISABLE,
 361                                .wdata = NULL, .rdata = NULL,
 362                                .wlen = 0, .rlen = 0};
 363
 364        return (acpi_ec_read_status(ec) & ACPI_EC_FLAG_BURST) ?
 365                                acpi_ec_transaction(ec, &t) : 0;
 366}
 367
 368static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 * data)
 369{
 370        int result;
 371        u8 d;
 372        struct transaction t = {.command = ACPI_EC_COMMAND_READ,
 373                                .wdata = &address, .rdata = &d,
 374                                .wlen = 1, .rlen = 1};
 375
 376        result = acpi_ec_transaction(ec, &t);
 377        *data = d;
 378        return result;
 379}
 380
 381static int acpi_ec_write(struct acpi_ec *ec, u8 address, u8 data)
 382{
 383        u8 wdata[2] = { address, data };
 384        struct transaction t = {.command = ACPI_EC_COMMAND_WRITE,
 385                                .wdata = wdata, .rdata = NULL,
 386                                .wlen = 2, .rlen = 0};
 387
 388        return acpi_ec_transaction(ec, &t);
 389}
 390
 391/*
 392 * Externally callable EC access functions. For now, assume 1 EC only
 393 */
 394int ec_burst_enable(void)
 395{
 396        if (!first_ec)
 397                return -ENODEV;
 398        return acpi_ec_burst_enable(first_ec);
 399}
 400
 401EXPORT_SYMBOL(ec_burst_enable);
 402
 403int ec_burst_disable(void)
 404{
 405        if (!first_ec)
 406                return -ENODEV;
 407        return acpi_ec_burst_disable(first_ec);
 408}
 409
 410EXPORT_SYMBOL(ec_burst_disable);
 411
 412int ec_read(u8 addr, u8 *val)
 413{
 414        int err;
 415        u8 temp_data;
 416
 417        if (!first_ec)
 418                return -ENODEV;
 419
 420        err = acpi_ec_read(first_ec, addr, &temp_data);
 421
 422        if (!err) {
 423                *val = temp_data;
 424                return 0;
 425        } else
 426                return err;
 427}
 428
 429EXPORT_SYMBOL(ec_read);
 430
 431int ec_write(u8 addr, u8 val)
 432{
 433        int err;
 434
 435        if (!first_ec)
 436                return -ENODEV;
 437
 438        err = acpi_ec_write(first_ec, addr, val);
 439
 440        return err;
 441}
 442
 443EXPORT_SYMBOL(ec_write);
 444
 445int ec_transaction(u8 command,
 446                   const u8 * wdata, unsigned wdata_len,
 447                   u8 * rdata, unsigned rdata_len)
 448{
 449        struct transaction t = {.command = command,
 450                                .wdata = wdata, .rdata = rdata,
 451                                .wlen = wdata_len, .rlen = rdata_len};
 452        if (!first_ec)
 453                return -ENODEV;
 454
 455        return acpi_ec_transaction(first_ec, &t);
 456}
 457
 458EXPORT_SYMBOL(ec_transaction);
 459
 460/* Get the handle to the EC device */
 461acpi_handle ec_get_handle(void)
 462{
 463        if (!first_ec)
 464                return NULL;
 465        return first_ec->handle;
 466}
 467
 468EXPORT_SYMBOL(ec_get_handle);
 469
 470void acpi_ec_block_transactions(void)
 471{
 472        struct acpi_ec *ec = first_ec;
 473
 474        if (!ec)
 475                return;
 476
 477        mutex_lock(&ec->mutex);
 478        /* Prevent transactions from being carried out */
 479        set_bit(EC_FLAGS_BLOCKED, &ec->flags);
 480        mutex_unlock(&ec->mutex);
 481}
 482
 483void acpi_ec_unblock_transactions(void)
 484{
 485        struct acpi_ec *ec = first_ec;
 486
 487        if (!ec)
 488                return;
 489
 490        mutex_lock(&ec->mutex);
 491        /* Allow transactions to be carried out again */
 492        clear_bit(EC_FLAGS_BLOCKED, &ec->flags);
 493        mutex_unlock(&ec->mutex);
 494}
 495
 496void acpi_ec_unblock_transactions_early(void)
 497{
 498        /*
 499         * Allow transactions to happen again (this function is called from
 500         * atomic context during wakeup, so we don't need to acquire the mutex).
 501         */
 502        if (first_ec)
 503                clear_bit(EC_FLAGS_BLOCKED, &first_ec->flags);
 504}
 505
 506static int acpi_ec_query_unlocked(struct acpi_ec *ec, u8 * data)
 507{
 508        int result;
 509        u8 d;
 510        struct transaction t = {.command = ACPI_EC_COMMAND_QUERY,
 511                                .wdata = NULL, .rdata = &d,
 512                                .wlen = 0, .rlen = 1};
 513        if (!ec || !data)
 514                return -EINVAL;
 515        /*
 516         * Query the EC to find out which _Qxx method we need to evaluate.
 517         * Note that successful completion of the query causes the ACPI_EC_SCI
 518         * bit to be cleared (and thus clearing the interrupt source).
 519         */
 520        result = acpi_ec_transaction_unlocked(ec, &t);
 521        if (result)
 522                return result;
 523        if (!d)
 524                return -ENODATA;
 525        *data = d;
 526        return 0;
 527}
 528
 529/* --------------------------------------------------------------------------
 530                                Event Management
 531   -------------------------------------------------------------------------- */
 532int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
 533                              acpi_handle handle, acpi_ec_query_func func,
 534                              void *data)
 535{
 536        struct acpi_ec_query_handler *handler =
 537            kzalloc(sizeof(struct acpi_ec_query_handler), GFP_KERNEL);
 538        if (!handler)
 539                return -ENOMEM;
 540
 541        handler->query_bit = query_bit;
 542        handler->handle = handle;
 543        handler->func = func;
 544        handler->data = data;
 545        mutex_lock(&ec->mutex);
 546        list_add(&handler->node, &ec->list);
 547        mutex_unlock(&ec->mutex);
 548        return 0;
 549}
 550
 551EXPORT_SYMBOL_GPL(acpi_ec_add_query_handler);
 552
 553void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit)
 554{
 555        struct acpi_ec_query_handler *handler, *tmp;
 556        mutex_lock(&ec->mutex);
 557        list_for_each_entry_safe(handler, tmp, &ec->list, node) {
 558                if (query_bit == handler->query_bit) {
 559                        list_del(&handler->node);
 560                        kfree(handler);
 561                }
 562        }
 563        mutex_unlock(&ec->mutex);
 564}
 565
 566EXPORT_SYMBOL_GPL(acpi_ec_remove_query_handler);
 567
 568static void acpi_ec_run(void *cxt)
 569{
 570        struct acpi_ec_query_handler *handler = cxt;
 571        if (!handler)
 572                return;
 573        pr_debug(PREFIX "start query execution\n");
 574        if (handler->func)
 575                handler->func(handler->data);
 576        else if (handler->handle)
 577                acpi_evaluate_object(handler->handle, NULL, NULL, NULL);
 578        pr_debug(PREFIX "stop query execution\n");
 579        kfree(handler);
 580}
 581
 582static int acpi_ec_sync_query(struct acpi_ec *ec)
 583{
 584        u8 value = 0;
 585        int status;
 586        struct acpi_ec_query_handler *handler, *copy;
 587        if ((status = acpi_ec_query_unlocked(ec, &value)))
 588                return status;
 589        list_for_each_entry(handler, &ec->list, node) {
 590                if (value == handler->query_bit) {
 591                        /* have custom handler for this bit */
 592                        copy = kmalloc(sizeof(*handler), GFP_KERNEL);
 593                        if (!copy)
 594                                return -ENOMEM;
 595                        memcpy(copy, handler, sizeof(*copy));
 596                        pr_debug(PREFIX "push query execution (0x%2x) on queue\n", value);
 597                        return acpi_os_execute((copy->func) ?
 598                                OSL_NOTIFY_HANDLER : OSL_GPE_HANDLER,
 599                                acpi_ec_run, copy);
 600                }
 601        }
 602        return 0;
 603}
 604
 605static void acpi_ec_gpe_query(void *ec_cxt)
 606{
 607        struct acpi_ec *ec = ec_cxt;
 608        if (!ec)
 609                return;
 610        mutex_lock(&ec->mutex);
 611        acpi_ec_sync_query(ec);
 612        mutex_unlock(&ec->mutex);
 613}
 614
 615static int ec_check_sci(struct acpi_ec *ec, u8 state)
 616{
 617        if (state & ACPI_EC_FLAG_SCI) {
 618                if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) {
 619                        pr_debug(PREFIX "push gpe query to the queue\n");
 620                        return acpi_os_execute(OSL_NOTIFY_HANDLER,
 621                                acpi_ec_gpe_query, ec);
 622                }
 623        }
 624        return 0;
 625}
 626
 627static u32 acpi_ec_gpe_handler(acpi_handle gpe_device,
 628        u32 gpe_number, void *data)
 629{
 630        struct acpi_ec *ec = data;
 631        u8 status = acpi_ec_read_status(ec);
 632
 633        pr_debug(PREFIX "~~~> interrupt, status:0x%02x\n", status);
 634
 635        advance_transaction(ec, status);
 636        if (ec_transaction_done(ec) &&
 637            (acpi_ec_read_status(ec) & ACPI_EC_FLAG_IBF) == 0) {
 638                wake_up(&ec->wait);
 639                ec_check_sci(ec, acpi_ec_read_status(ec));
 640        }
 641        return ACPI_INTERRUPT_HANDLED | ACPI_REENABLE_GPE;
 642}
 643
 644/* --------------------------------------------------------------------------
 645                             Address Space Management
 646   -------------------------------------------------------------------------- */
 647
 648static acpi_status
 649acpi_ec_space_handler(u32 function, acpi_physical_address address,
 650                      u32 bits, u64 *value64,
 651                      void *handler_context, void *region_context)
 652{
 653        struct acpi_ec *ec = handler_context;
 654        int result = 0, i, bytes = bits / 8;
 655        u8 *value = (u8 *)value64;
 656
 657        if ((address > 0xFF) || !value || !handler_context)
 658                return AE_BAD_PARAMETER;
 659
 660        if (function != ACPI_READ && function != ACPI_WRITE)
 661                return AE_BAD_PARAMETER;
 662
 663        if (EC_FLAGS_MSI || bits > 8)
 664                acpi_ec_burst_enable(ec);
 665
 666        for (i = 0; i < bytes; ++i, ++address, ++value)
 667                result = (function == ACPI_READ) ?
 668                        acpi_ec_read(ec, address, value) :
 669                        acpi_ec_write(ec, address, *value);
 670
 671        if (EC_FLAGS_MSI || bits > 8)
 672                acpi_ec_burst_disable(ec);
 673
 674        switch (result) {
 675        case -EINVAL:
 676                return AE_BAD_PARAMETER;
 677                break;
 678        case -ENODEV:
 679                return AE_NOT_FOUND;
 680                break;
 681        case -ETIME:
 682                return AE_TIME;
 683                break;
 684        default:
 685                return AE_OK;
 686        }
 687}
 688
 689/* --------------------------------------------------------------------------
 690                               Driver Interface
 691   -------------------------------------------------------------------------- */
 692static acpi_status
 693ec_parse_io_ports(struct acpi_resource *resource, void *context);
 694
 695static struct acpi_ec *make_acpi_ec(void)
 696{
 697        struct acpi_ec *ec = kzalloc(sizeof(struct acpi_ec), GFP_KERNEL);
 698        if (!ec)
 699                return NULL;
 700        ec->flags = 1 << EC_FLAGS_QUERY_PENDING;
 701        mutex_init(&ec->mutex);
 702        init_waitqueue_head(&ec->wait);
 703        INIT_LIST_HEAD(&ec->list);
 704        spin_lock_init(&ec->lock);
 705        return ec;
 706}
 707
 708static acpi_status
 709acpi_ec_register_query_methods(acpi_handle handle, u32 level,
 710                               void *context, void **return_value)
 711{
 712        char node_name[5];
 713        struct acpi_buffer buffer = { sizeof(node_name), node_name };
 714        struct acpi_ec *ec = context;
 715        int value = 0;
 716        acpi_status status;
 717
 718        status = acpi_get_name(handle, ACPI_SINGLE_NAME, &buffer);
 719
 720        if (ACPI_SUCCESS(status) && sscanf(node_name, "_Q%x", &value) == 1) {
 721                acpi_ec_add_query_handler(ec, value, handle, NULL, NULL);
 722        }
 723        return AE_OK;
 724}
 725
 726static acpi_status
 727ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval)
 728{
 729        acpi_status status;
 730        unsigned long long tmp = 0;
 731
 732        struct acpi_ec *ec = context;
 733
 734        /* clear addr values, ec_parse_io_ports depend on it */
 735        ec->command_addr = ec->data_addr = 0;
 736
 737        status = acpi_walk_resources(handle, METHOD_NAME__CRS,
 738                                     ec_parse_io_ports, ec);
 739        if (ACPI_FAILURE(status))
 740                return status;
 741
 742        /* Get GPE bit assignment (EC events). */
 743        /* TODO: Add support for _GPE returning a package */
 744        status = acpi_evaluate_integer(handle, "_GPE", NULL, &tmp);
 745        if (ACPI_FAILURE(status))
 746                return status;
 747        ec->gpe = tmp;
 748        /* Use the global lock for all EC transactions? */
 749        tmp = 0;
 750        acpi_evaluate_integer(handle, "_GLK", NULL, &tmp);
 751        ec->global_lock = tmp;
 752        ec->handle = handle;
 753        return AE_CTRL_TERMINATE;
 754}
 755
 756static int ec_install_handlers(struct acpi_ec *ec)
 757{
 758        acpi_status status;
 759        if (test_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags))
 760                return 0;
 761        status = acpi_install_gpe_handler(NULL, ec->gpe,
 762                                  ACPI_GPE_EDGE_TRIGGERED,
 763                                  &acpi_ec_gpe_handler, ec);
 764        if (ACPI_FAILURE(status))
 765                return -ENODEV;
 766
 767        acpi_enable_gpe(NULL, ec->gpe);
 768        status = acpi_install_address_space_handler(ec->handle,
 769                                                    ACPI_ADR_SPACE_EC,
 770                                                    &acpi_ec_space_handler,
 771                                                    NULL, ec);
 772        if (ACPI_FAILURE(status)) {
 773                if (status == AE_NOT_FOUND) {
 774                        /*
 775                         * Maybe OS fails in evaluating the _REG object.
 776                         * The AE_NOT_FOUND error will be ignored and OS
 777                         * continue to initialize EC.
 778                         */
 779                        printk(KERN_ERR "Fail in evaluating the _REG object"
 780                                " of EC device. Broken bios is suspected.\n");
 781                } else {
 782                        acpi_remove_gpe_handler(NULL, ec->gpe,
 783                                &acpi_ec_gpe_handler);
 784                        acpi_disable_gpe(NULL, ec->gpe);
 785                        return -ENODEV;
 786                }
 787        }
 788
 789        set_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags);
 790        return 0;
 791}
 792
 793static void ec_remove_handlers(struct acpi_ec *ec)
 794{
 795        acpi_disable_gpe(NULL, ec->gpe);
 796        if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle,
 797                                ACPI_ADR_SPACE_EC, &acpi_ec_space_handler)))
 798                pr_err(PREFIX "failed to remove space handler\n");
 799        if (ACPI_FAILURE(acpi_remove_gpe_handler(NULL, ec->gpe,
 800                                &acpi_ec_gpe_handler)))
 801                pr_err(PREFIX "failed to remove gpe handler\n");
 802        clear_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags);
 803}
 804
 805static int acpi_ec_add(struct acpi_device *device)
 806{
 807        struct acpi_ec *ec = NULL;
 808        int ret;
 809
 810        strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME);
 811        strcpy(acpi_device_class(device), ACPI_EC_CLASS);
 812
 813        /* Check for boot EC */
 814        if (boot_ec &&
 815            (boot_ec->handle == device->handle ||
 816             boot_ec->handle == ACPI_ROOT_OBJECT)) {
 817                ec = boot_ec;
 818                boot_ec = NULL;
 819        } else {
 820                ec = make_acpi_ec();
 821                if (!ec)
 822                        return -ENOMEM;
 823        }
 824        if (ec_parse_device(device->handle, 0, ec, NULL) !=
 825                AE_CTRL_TERMINATE) {
 826                        kfree(ec);
 827                        return -EINVAL;
 828        }
 829
 830        /* Find and register all query methods */
 831        acpi_walk_namespace(ACPI_TYPE_METHOD, ec->handle, 1,
 832                            acpi_ec_register_query_methods, NULL, ec, NULL);
 833
 834        if (!first_ec)
 835                first_ec = ec;
 836        device->driver_data = ec;
 837
 838        ret = !!request_region(ec->data_addr, 1, "EC data");
 839        WARN(!ret, "Could not request EC data io port 0x%lx", ec->data_addr);
 840        ret = !!request_region(ec->command_addr, 1, "EC cmd");
 841        WARN(!ret, "Could not request EC cmd io port 0x%lx", ec->command_addr);
 842
 843        pr_info(PREFIX "GPE = 0x%lx, I/O: command/status = 0x%lx, data = 0x%lx\n",
 844                          ec->gpe, ec->command_addr, ec->data_addr);
 845
 846        ret = ec_install_handlers(ec);
 847
 848        /* EC is fully operational, allow queries */
 849        clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
 850        return ret;
 851}
 852
 853static int acpi_ec_remove(struct acpi_device *device)
 854{
 855        struct acpi_ec *ec;
 856        struct acpi_ec_query_handler *handler, *tmp;
 857
 858        if (!device)
 859                return -EINVAL;
 860
 861        ec = acpi_driver_data(device);
 862        ec_remove_handlers(ec);
 863        mutex_lock(&ec->mutex);
 864        list_for_each_entry_safe(handler, tmp, &ec->list, node) {
 865                list_del(&handler->node);
 866                kfree(handler);
 867        }
 868        mutex_unlock(&ec->mutex);
 869        release_region(ec->data_addr, 1);
 870        release_region(ec->command_addr, 1);
 871        device->driver_data = NULL;
 872        if (ec == first_ec)
 873                first_ec = NULL;
 874        kfree(ec);
 875        return 0;
 876}
 877
 878static acpi_status
 879ec_parse_io_ports(struct acpi_resource *resource, void *context)
 880{
 881        struct acpi_ec *ec = context;
 882
 883        if (resource->type != ACPI_RESOURCE_TYPE_IO)
 884                return AE_OK;
 885
 886        /*
 887         * The first address region returned is the data port, and
 888         * the second address region returned is the status/command
 889         * port.
 890         */
 891        if (ec->data_addr == 0)
 892                ec->data_addr = resource->data.io.minimum;
 893        else if (ec->command_addr == 0)
 894                ec->command_addr = resource->data.io.minimum;
 895        else
 896                return AE_CTRL_TERMINATE;
 897
 898        return AE_OK;
 899}
 900
 901int __init acpi_boot_ec_enable(void)
 902{
 903        if (!boot_ec || test_bit(EC_FLAGS_HANDLERS_INSTALLED, &boot_ec->flags))
 904                return 0;
 905        if (!ec_install_handlers(boot_ec)) {
 906                first_ec = boot_ec;
 907                return 0;
 908        }
 909        return -EFAULT;
 910}
 911
 912static const struct acpi_device_id ec_device_ids[] = {
 913        {"PNP0C09", 0},
 914        {"", 0},
 915};
 916
 917/* Some BIOS do not survive early DSDT scan, skip it */
 918static int ec_skip_dsdt_scan(const struct dmi_system_id *id)
 919{
 920        EC_FLAGS_SKIP_DSDT_SCAN = 1;
 921        return 0;
 922}
 923
 924/* ASUStek often supplies us with broken ECDT, validate it */
 925static int ec_validate_ecdt(const struct dmi_system_id *id)
 926{
 927        EC_FLAGS_VALIDATE_ECDT = 1;
 928        return 0;
 929}
 930
 931/* MSI EC needs special treatment, enable it */
 932static int ec_flag_msi(const struct dmi_system_id *id)
 933{
 934        printk(KERN_DEBUG PREFIX "Detected MSI hardware, enabling workarounds.\n");
 935        EC_FLAGS_MSI = 1;
 936        EC_FLAGS_VALIDATE_ECDT = 1;
 937        return 0;
 938}
 939
 940/*
 941 * Clevo M720 notebook actually works ok with IRQ mode, if we lifted
 942 * the GPE storm threshold back to 20
 943 */
 944static int ec_enlarge_storm_threshold(const struct dmi_system_id *id)
 945{
 946        pr_debug("Setting the EC GPE storm threshold to 20\n");
 947        ec_storm_threshold  = 20;
 948        return 0;
 949}
 950
 951static struct dmi_system_id __initdata ec_dmi_table[] = {
 952        {
 953        ec_skip_dsdt_scan, "Compal JFL92", {
 954        DMI_MATCH(DMI_BIOS_VENDOR, "COMPAL"),
 955        DMI_MATCH(DMI_BOARD_NAME, "JFL92") }, NULL},
 956        {
 957        ec_flag_msi, "MSI hardware", {
 958        DMI_MATCH(DMI_BIOS_VENDOR, "Micro-Star")}, NULL},
 959        {
 960        ec_flag_msi, "MSI hardware", {
 961        DMI_MATCH(DMI_SYS_VENDOR, "Micro-Star")}, NULL},
 962        {
 963        ec_flag_msi, "MSI hardware", {
 964        DMI_MATCH(DMI_CHASSIS_VENDOR, "MICRO-Star")}, NULL},
 965        {
 966        ec_flag_msi, "MSI hardware", {
 967        DMI_MATCH(DMI_CHASSIS_VENDOR, "MICRO-STAR")}, NULL},
 968        {
 969        ec_flag_msi, "Quanta hardware", {
 970        DMI_MATCH(DMI_SYS_VENDOR, "Quanta"),
 971        DMI_MATCH(DMI_PRODUCT_NAME, "TW8/SW8/DW8"),}, NULL},
 972        {
 973        ec_flag_msi, "Quanta hardware", {
 974        DMI_MATCH(DMI_SYS_VENDOR, "Quanta"),
 975        DMI_MATCH(DMI_PRODUCT_NAME, "TW9/SW9"),}, NULL},
 976        {
 977        ec_validate_ecdt, "ASUS hardware", {
 978        DMI_MATCH(DMI_BIOS_VENDOR, "ASUS") }, NULL},
 979        {
 980        ec_validate_ecdt, "ASUS hardware", {
 981        DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc.") }, NULL},
 982        {
 983        ec_enlarge_storm_threshold, "CLEVO hardware", {
 984        DMI_MATCH(DMI_SYS_VENDOR, "CLEVO Co."),
 985        DMI_MATCH(DMI_PRODUCT_NAME, "M720T/M730T"),}, NULL},
 986        {
 987        ec_skip_dsdt_scan, "HP Folio 13", {
 988        DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
 989        DMI_MATCH(DMI_PRODUCT_NAME, "HP Folio 13"),}, NULL},
 990        {
 991        ec_validate_ecdt, "ASUS hardware", {
 992        DMI_MATCH(DMI_SYS_VENDOR, "ASUSTek Computer Inc."),
 993        DMI_MATCH(DMI_PRODUCT_NAME, "L4R"),}, NULL},
 994        {},
 995};
 996
 997int __init acpi_ec_ecdt_probe(void)
 998{
 999        acpi_status status;
1000        struct acpi_ec *saved_ec = NULL;
1001        struct acpi_table_ecdt *ecdt_ptr;
1002
1003        boot_ec = make_acpi_ec();
1004        if (!boot_ec)
1005                return -ENOMEM;
1006        /*
1007         * Generate a boot ec context
1008         */
1009        dmi_check_system(ec_dmi_table);
1010        status = acpi_get_table(ACPI_SIG_ECDT, 1,
1011                                (struct acpi_table_header **)&ecdt_ptr);
1012        if (ACPI_SUCCESS(status)) {
1013                pr_info(PREFIX "EC description table is found, configuring boot EC\n");
1014                boot_ec->command_addr = ecdt_ptr->control.address;
1015                boot_ec->data_addr = ecdt_ptr->data.address;
1016                boot_ec->gpe = ecdt_ptr->gpe;
1017                boot_ec->handle = ACPI_ROOT_OBJECT;
1018                acpi_get_handle(ACPI_ROOT_OBJECT, ecdt_ptr->id, &boot_ec->handle);
1019                /* Don't trust ECDT, which comes from ASUSTek */
1020                if (!EC_FLAGS_VALIDATE_ECDT)
1021                        goto install;
1022                saved_ec = kmemdup(boot_ec, sizeof(struct acpi_ec), GFP_KERNEL);
1023                if (!saved_ec)
1024                        return -ENOMEM;
1025        /* fall through */
1026        }
1027
1028        if (EC_FLAGS_SKIP_DSDT_SCAN)
1029                return -ENODEV;
1030
1031        /* This workaround is needed only on some broken machines,
1032         * which require early EC, but fail to provide ECDT */
1033        printk(KERN_DEBUG PREFIX "Look up EC in DSDT\n");
1034        status = acpi_get_devices(ec_device_ids[0].id, ec_parse_device,
1035                                        boot_ec, NULL);
1036        /* Check that acpi_get_devices actually find something */
1037        if (ACPI_FAILURE(status) || !boot_ec->handle)
1038                goto error;
1039        if (saved_ec) {
1040                /* try to find good ECDT from ASUSTek */
1041                if (saved_ec->command_addr != boot_ec->command_addr ||
1042                    saved_ec->data_addr != boot_ec->data_addr ||
1043                    saved_ec->gpe != boot_ec->gpe ||
1044                    saved_ec->handle != boot_ec->handle)
1045                        pr_info(PREFIX "ASUSTek keeps feeding us with broken "
1046                        "ECDT tables, which are very hard to workaround. "
1047                        "Trying to use DSDT EC info instead. Please send "
1048                        "output of acpidump to linux-acpi@vger.kernel.org\n");
1049                kfree(saved_ec);
1050                saved_ec = NULL;
1051        } else {
1052                /* We really need to limit this workaround, the only ASUS,
1053                * which needs it, has fake EC._INI method, so use it as flag.
1054                * Keep boot_ec struct as it will be needed soon.
1055                */
1056                acpi_handle dummy;
1057                if (!dmi_name_in_vendors("ASUS") ||
1058                    ACPI_FAILURE(acpi_get_handle(boot_ec->handle, "_INI",
1059                                                        &dummy)))
1060                        return -ENODEV;
1061        }
1062install:
1063        if (!ec_install_handlers(boot_ec)) {
1064                first_ec = boot_ec;
1065                return 0;
1066        }
1067error:
1068        kfree(boot_ec);
1069        boot_ec = NULL;
1070        return -ENODEV;
1071}
1072
1073static struct acpi_driver acpi_ec_driver = {
1074        .name = "ec",
1075        .class = ACPI_EC_CLASS,
1076        .ids = ec_device_ids,
1077        .ops = {
1078                .add = acpi_ec_add,
1079                .remove = acpi_ec_remove,
1080                },
1081};
1082
1083int __init acpi_ec_init(void)
1084{
1085        int result = 0;
1086
1087        /* Now register the driver for the EC */
1088        result = acpi_bus_register_driver(&acpi_ec_driver);
1089        if (result < 0)
1090                return -ENODEV;
1091
1092        return result;
1093}
1094
1095/* EC driver currently not unloadable */
1096#if 0
1097static void __exit acpi_ec_exit(void)
1098{
1099
1100        acpi_bus_unregister_driver(&acpi_ec_driver);
1101        return;
1102}
1103#endif  /* 0 */
1104
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.