1/*-
2 * Copyright (c) 2003-2007 Nate Lawson
3 * Copyright (c) 2000 Michael Smith
4 * Copyright (c) 2000 BSDi
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29#include <sys/cdefs.h>
30__FBSDID("$FreeBSD$");
31
32#include "opt_acpi.h"
33#include <sys/param.h>
34#include <sys/kernel.h>
35#include <sys/ktr.h>
36#include <sys/bus.h>
37#include <sys/lock.h>
38#include <sys/malloc.h>
39#include <sys/module.h>
40#include <sys/sx.h>
41
42#include <machine/bus.h>
43#include <machine/resource.h>
44#include <sys/rman.h>
45
46#include <contrib/dev/acpica/include/acpi.h>
47#include <contrib/dev/acpica/include/accommon.h>
48
49#include <dev/acpica/acpivar.h>
50
51/* Hooks for the ACPI CA debugging infrastructure */
52#define _COMPONENT	ACPI_EC
53ACPI_MODULE_NAME("EC")
54
55/*
56 * EC_COMMAND:
57 * -----------
58 */
59typedef UINT8				EC_COMMAND;
60
61#define EC_COMMAND_UNKNOWN		((EC_COMMAND) 0x00)
62#define EC_COMMAND_READ			((EC_COMMAND) 0x80)
63#define EC_COMMAND_WRITE		((EC_COMMAND) 0x81)
64#define EC_COMMAND_BURST_ENABLE		((EC_COMMAND) 0x82)
65#define EC_COMMAND_BURST_DISABLE	((EC_COMMAND) 0x83)
66#define EC_COMMAND_QUERY		((EC_COMMAND) 0x84)
67
68/*
69 * EC_STATUS:
70 * ----------
71 * The encoding of the EC status register is illustrated below.
72 * Note that a set bit (1) indicates the property is TRUE
73 * (e.g. if bit 0 is set then the output buffer is full).
74 * +-+-+-+-+-+-+-+-+
75 * |7|6|5|4|3|2|1|0|
76 * +-+-+-+-+-+-+-+-+
77 *  | | | | | | | |
78 *  | | | | | | | +- Output Buffer Full?
79 *  | | | | | | +--- Input Buffer Full?
80 *  | | | | | +----- <reserved>
81 *  | | | | +------- Data Register is Command Byte?
82 *  | | | +--------- Burst Mode Enabled?
83 *  | | +----------- SCI Event?
84 *  | +------------- SMI Event?
85 *  +--------------- <reserved>
86 *
87 */
88typedef UINT8				EC_STATUS;
89
90#define EC_FLAG_OUTPUT_BUFFER		((EC_STATUS) 0x01)
91#define EC_FLAG_INPUT_BUFFER		((EC_STATUS) 0x02)
92#define EC_FLAG_DATA_IS_CMD		((EC_STATUS) 0x08)
93#define EC_FLAG_BURST_MODE		((EC_STATUS) 0x10)
94
95/*
96 * EC_EVENT:
97 * ---------
98 */
99typedef UINT8				EC_EVENT;
100
101#define EC_EVENT_UNKNOWN		((EC_EVENT) 0x00)
102#define EC_EVENT_OUTPUT_BUFFER_FULL	((EC_EVENT) 0x01)
103#define EC_EVENT_INPUT_BUFFER_EMPTY	((EC_EVENT) 0x02)
104#define EC_EVENT_SCI			((EC_EVENT) 0x20)
105#define EC_EVENT_SMI			((EC_EVENT) 0x40)
106
107/* Data byte returned after burst enable indicating it was successful. */
108#define EC_BURST_ACK			0x90
109
110/*
111 * Register access primitives
112 */
113#define EC_GET_DATA(sc)							\
114	bus_space_read_1((sc)->ec_data_tag, (sc)->ec_data_handle, 0)
115
116#define EC_SET_DATA(sc, v)						\
117	bus_space_write_1((sc)->ec_data_tag, (sc)->ec_data_handle, 0, (v))
118
119#define EC_GET_CSR(sc)							\
120	bus_space_read_1((sc)->ec_csr_tag, (sc)->ec_csr_handle, 0)
121
122#define EC_SET_CSR(sc, v)						\
123	bus_space_write_1((sc)->ec_csr_tag, (sc)->ec_csr_handle, 0, (v))
124
125/* Additional params to pass from the probe routine */
126struct acpi_ec_params {
127    int		glk;
128    int		gpe_bit;
129    ACPI_HANDLE	gpe_handle;
130    int		uid;
131};
132
133/*
134 * Driver softc.
135 */
136struct acpi_ec_softc {
137    device_t		ec_dev;
138    ACPI_HANDLE		ec_handle;
139    int			ec_uid;
140    ACPI_HANDLE		ec_gpehandle;
141    UINT8		ec_gpebit;
142
143    int			ec_data_rid;
144    struct resource	*ec_data_res;
145    bus_space_tag_t	ec_data_tag;
146    bus_space_handle_t	ec_data_handle;
147
148    int			ec_csr_rid;
149    struct resource	*ec_csr_res;
150    bus_space_tag_t	ec_csr_tag;
151    bus_space_handle_t	ec_csr_handle;
152
153    int			ec_glk;
154    int			ec_glkhandle;
155    int			ec_burstactive;
156    int			ec_sci_pend;
157    volatile u_int	ec_gencount;
158    int			ec_suspending;
159};
160
161/*
162 * XXX njl
163 * I couldn't find it in the spec but other implementations also use a
164 * value of 1 ms for the time to acquire global lock.
165 */
166#define EC_LOCK_TIMEOUT	1000
167
168/* Default delay in microseconds between each run of the status polling loop. */
169#define EC_POLL_DELAY	50
170
171/* Total time in ms spent waiting for a response from EC. */
172#define EC_TIMEOUT	750
173
174#define EVENT_READY(event, status)			\
175	(((event) == EC_EVENT_OUTPUT_BUFFER_FULL &&	\
176	 ((status) & EC_FLAG_OUTPUT_BUFFER) != 0) ||	\
177	 ((event) == EC_EVENT_INPUT_BUFFER_EMPTY && 	\
178	 ((status) & EC_FLAG_INPUT_BUFFER) == 0))
179
180ACPI_SERIAL_DECL(ec, "ACPI embedded controller");
181
182static SYSCTL_NODE(_debug_acpi, OID_AUTO, ec,
183    CTLFLAG_RD | CTLFLAG_MPSAFE, NULL,
184    "EC debugging");
185
186static int	ec_burst_mode;
187SYSCTL_INT(_debug_acpi_ec, OID_AUTO, burst, CTLFLAG_RWTUN, &ec_burst_mode, 0,
188    "Enable use of burst mode (faster for nearly all systems)");
189static int	ec_polled_mode;
190SYSCTL_INT(_debug_acpi_ec, OID_AUTO, polled, CTLFLAG_RWTUN, &ec_polled_mode, 0,
191    "Force use of polled mode (only if interrupt mode doesn't work)");
192static int	ec_timeout = EC_TIMEOUT;
193SYSCTL_INT(_debug_acpi_ec, OID_AUTO, timeout, CTLFLAG_RWTUN, &ec_timeout,
194    EC_TIMEOUT, "Total time spent waiting for a response (poll+sleep)");
195
196static ACPI_STATUS
197EcLock(struct acpi_ec_softc *sc)
198{
199    ACPI_STATUS	status;
200
201    /* If _GLK is non-zero, acquire the global lock. */
202    status = AE_OK;
203    if (sc->ec_glk) {
204	status = AcpiAcquireGlobalLock(EC_LOCK_TIMEOUT, &sc->ec_glkhandle);
205	if (ACPI_FAILURE(status))
206	    return (status);
207    }
208    ACPI_SERIAL_BEGIN(ec);
209    return (status);
210}
211
212static void
213EcUnlock(struct acpi_ec_softc *sc)
214{
215    ACPI_SERIAL_END(ec);
216    if (sc->ec_glk)
217	AcpiReleaseGlobalLock(sc->ec_glkhandle);
218}
219
220static UINT32		EcGpeHandler(ACPI_HANDLE, UINT32, void *);
221static ACPI_STATUS	EcSpaceSetup(ACPI_HANDLE Region, UINT32 Function,
222				void *Context, void **return_Context);
223static ACPI_STATUS	EcSpaceHandler(UINT32 Function,
224				ACPI_PHYSICAL_ADDRESS Address,
225				UINT32 Width, UINT64 *Value,
226				void *Context, void *RegionContext);
227static ACPI_STATUS	EcWaitEvent(struct acpi_ec_softc *sc, EC_EVENT Event,
228				u_int gen_count);
229static ACPI_STATUS	EcCommand(struct acpi_ec_softc *sc, EC_COMMAND cmd);
230static ACPI_STATUS	EcRead(struct acpi_ec_softc *sc, UINT8 Address,
231				UINT8 *Data);
232static ACPI_STATUS	EcWrite(struct acpi_ec_softc *sc, UINT8 Address,
233				UINT8 Data);
234static int		acpi_ec_probe(device_t dev);
235static int		acpi_ec_attach(device_t dev);
236static int		acpi_ec_suspend(device_t dev);
237static int		acpi_ec_resume(device_t dev);
238static int		acpi_ec_shutdown(device_t dev);
239static int		acpi_ec_read_method(device_t dev, u_int addr,
240				UINT64 *val, int width);
241static int		acpi_ec_write_method(device_t dev, u_int addr,
242				UINT64 val, int width);
243
244static device_method_t acpi_ec_methods[] = {
245    /* Device interface */
246    DEVMETHOD(device_probe,	acpi_ec_probe),
247    DEVMETHOD(device_attach,	acpi_ec_attach),
248    DEVMETHOD(device_suspend,	acpi_ec_suspend),
249    DEVMETHOD(device_resume,	acpi_ec_resume),
250    DEVMETHOD(device_shutdown,	acpi_ec_shutdown),
251
252    /* Embedded controller interface */
253    DEVMETHOD(acpi_ec_read,	acpi_ec_read_method),
254    DEVMETHOD(acpi_ec_write,	acpi_ec_write_method),
255
256    DEVMETHOD_END
257};
258
259static driver_t acpi_ec_driver = {
260    "acpi_ec",
261    acpi_ec_methods,
262    sizeof(struct acpi_ec_softc),
263};
264
265static devclass_t acpi_ec_devclass;
266DRIVER_MODULE(acpi_ec, acpi, acpi_ec_driver, acpi_ec_devclass, 0, 0);
267MODULE_DEPEND(acpi_ec, acpi, 1, 1, 1);
268
269/*
270 * Look for an ECDT and if we find one, set up default GPE and
271 * space handlers to catch attempts to access EC space before
272 * we have a real driver instance in place.
273 *
274 * TODO: Some old Gateway laptops need us to fake up an ECDT or
275 * otherwise attach early so that _REG methods can run.
276 */
277void
278acpi_ec_ecdt_probe(device_t parent)
279{
280    ACPI_TABLE_ECDT *ecdt;
281    ACPI_STATUS	     status;
282    device_t	     child;
283    ACPI_HANDLE	     h;
284    struct acpi_ec_params *params;
285
286    ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
287
288    /* Find and validate the ECDT. */
289    status = AcpiGetTable(ACPI_SIG_ECDT, 1, (ACPI_TABLE_HEADER **)&ecdt);
290    if (ACPI_FAILURE(status) ||
291	ecdt->Control.BitWidth != 8 ||
292	ecdt->Data.BitWidth != 8) {
293	return;
294    }
295
296    /* Create the child device with the given unit number. */
297    child = BUS_ADD_CHILD(parent, 3, "acpi_ec", ecdt->Uid);
298    if (child == NULL) {
299	printf("%s: can't add child\n", __func__);
300	return;
301    }
302
303    /* Find and save the ACPI handle for this device. */
304    status = AcpiGetHandle(NULL, ecdt->Id, &h);
305    if (ACPI_FAILURE(status)) {
306	device_delete_child(parent, child);
307	printf("%s: can't get handle\n", __func__);
308	return;
309    }
310    acpi_set_handle(child, h);
311
312    /* Set the data and CSR register addresses. */
313    bus_set_resource(child, SYS_RES_IOPORT, 0, ecdt->Data.Address,
314	/*count*/1);
315    bus_set_resource(child, SYS_RES_IOPORT, 1, ecdt->Control.Address,
316	/*count*/1);
317
318    /*
319     * Store values for the probe/attach routines to use.  Store the
320     * ECDT GPE bit and set the global lock flag according to _GLK.
321     * Note that it is not perfectly correct to be evaluating a method
322     * before initializing devices, but in practice this function
323     * should be safe to call at this point.
324     */
325    params = malloc(sizeof(struct acpi_ec_params), M_TEMP, M_WAITOK | M_ZERO);
326    params->gpe_handle = NULL;
327    params->gpe_bit = ecdt->Gpe;
328    params->uid = ecdt->Uid;
329    acpi_GetInteger(h, "_GLK", &params->glk);
330    acpi_set_private(child, params);
331
332    /* Finish the attach process. */
333    if (device_probe_and_attach(child) != 0)
334	device_delete_child(parent, child);
335}
336
337static int
338acpi_ec_probe(device_t dev)
339{
340    ACPI_BUFFER buf;
341    ACPI_HANDLE h;
342    ACPI_OBJECT *obj;
343    ACPI_STATUS status;
344    device_t	peer;
345    char	desc[64];
346    int		ecdt;
347    int		ret, rc;
348    struct acpi_ec_params *params;
349    static char *ec_ids[] = { "PNP0C09", NULL };
350
351    ret = ENXIO;
352
353    /* Check that this is a device and that EC is not disabled. */
354    if (acpi_get_type(dev) != ACPI_TYPE_DEVICE || acpi_disabled("ec"))
355	return (ret);
356
357    if (device_is_devclass_fixed(dev)) {
358	/*
359	 * If probed via ECDT, set description and continue. Otherwise, we can
360	 * access the namespace and make sure this is not a duplicate probe.
361	 */
362        ecdt = 1;
363        params = acpi_get_private(dev);
364	if (params != NULL)
365	    ret = 0;
366
367	goto out;
368    } else
369	ecdt = 0;
370
371    rc = ACPI_ID_PROBE(device_get_parent(dev), dev, ec_ids, NULL);
372    if (rc > 0)
373	return (rc);
374
375    params = malloc(sizeof(struct acpi_ec_params), M_TEMP, M_WAITOK | M_ZERO);
376
377    buf.Pointer = NULL;
378    buf.Length = ACPI_ALLOCATE_BUFFER;
379    h = acpi_get_handle(dev);
380
381    /*
382     * Read the unit ID to check for duplicate attach and the global lock value
383     * to see if we should acquire it when accessing the EC.
384     */
385    status = acpi_GetInteger(h, "_UID", &params->uid);
386    if (ACPI_FAILURE(status))
387	params->uid = 0;
388
389    /*
390     * Check for a duplicate probe. This can happen when a probe via ECDT
391     * succeeded already. If this is a duplicate, disable this device.
392     *
393     * NB: It would seem device_disable would be sufficient to not get
394     * duplicated devices, and ENXIO isn't needed, however, device_probe() only
395     * checks DF_ENABLED at the start and so disabling it here is too late to
396     * prevent device_attach() from being called.
397     */
398    peer = devclass_get_device(acpi_ec_devclass, params->uid);
399    if (peer != NULL && device_is_alive(peer)) {
400	device_disable(dev);
401	goto out;
402    }
403
404    status = acpi_GetInteger(h, "_GLK", &params->glk);
405    if (ACPI_FAILURE(status))
406	params->glk = 0;
407
408    /*
409     * Evaluate the _GPE method to find the GPE bit used by the EC to signal
410     * status (SCI).  If it's a package, it contains a reference and GPE bit,
411     * similar to _PRW.
412     */
413    status = AcpiEvaluateObject(h, "_GPE", NULL, &buf);
414    if (ACPI_FAILURE(status)) {
415	device_printf(dev, "can't evaluate _GPE - %s\n", AcpiFormatException(status));
416	goto out;
417    }
418
419    obj = (ACPI_OBJECT *)buf.Pointer;
420    if (obj == NULL)
421	goto out;
422
423    switch (obj->Type) {
424    case ACPI_TYPE_INTEGER:
425	params->gpe_handle = NULL;
426	params->gpe_bit = obj->Integer.Value;
427	break;
428    case ACPI_TYPE_PACKAGE:
429	if (!ACPI_PKG_VALID(obj, 2))
430	    goto out;
431	params->gpe_handle = acpi_GetReference(NULL, &obj->Package.Elements[0]);
432	if (params->gpe_handle == NULL ||
433	    acpi_PkgInt32(obj, 1, &params->gpe_bit) != 0)
434		goto out;
435	break;
436    default:
437	device_printf(dev, "_GPE has invalid type %d\n", obj->Type);
438	goto out;
439    }
440
441    /* Store the values we got from the namespace for attach. */
442    acpi_set_private(dev, params);
443
444    if (buf.Pointer)
445	AcpiOsFree(buf.Pointer);
446
447    ret = rc;
448out:
449    if (ret <= 0) {
450	snprintf(desc, sizeof(desc), "Embedded Controller: GPE %#x%s%s",
451		 params->gpe_bit, (params->glk) ? ", GLK" : "",
452		 ecdt ? ", ECDT" : "");
453	device_set_desc_copy(dev, desc);
454    } else
455	free(params, M_TEMP);
456
457    return (ret);
458}
459
460static int
461acpi_ec_attach(device_t dev)
462{
463    struct acpi_ec_softc	*sc;
464    struct acpi_ec_params	*params;
465    ACPI_STATUS			Status;
466
467    ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
468
469    /* Fetch/initialize softc (assumes softc is pre-zeroed). */
470    sc = device_get_softc(dev);
471    params = acpi_get_private(dev);
472    sc->ec_dev = dev;
473    sc->ec_handle = acpi_get_handle(dev);
474
475    /* Retrieve previously probed values via device ivars. */
476    sc->ec_glk = params->glk;
477    sc->ec_gpebit = params->gpe_bit;
478    sc->ec_gpehandle = params->gpe_handle;
479    sc->ec_uid = params->uid;
480    sc->ec_suspending = FALSE;
481    acpi_set_private(dev, NULL);
482    free(params, M_TEMP);
483
484    /* Attach bus resources for data and command/status ports. */
485    sc->ec_data_rid = 0;
486    sc->ec_data_res = bus_alloc_resource_any(sc->ec_dev, SYS_RES_IOPORT,
487			&sc->ec_data_rid, RF_ACTIVE);
488    if (sc->ec_data_res == NULL) {
489	device_printf(dev, "can't allocate data port\n");
490	goto error;
491    }
492    sc->ec_data_tag = rman_get_bustag(sc->ec_data_res);
493    sc->ec_data_handle = rman_get_bushandle(sc->ec_data_res);
494
495    sc->ec_csr_rid = 1;
496    sc->ec_csr_res = bus_alloc_resource_any(sc->ec_dev, SYS_RES_IOPORT,
497			&sc->ec_csr_rid, RF_ACTIVE);
498    if (sc->ec_csr_res == NULL) {
499	device_printf(dev, "can't allocate command/status port\n");
500	goto error;
501    }
502    sc->ec_csr_tag = rman_get_bustag(sc->ec_csr_res);
503    sc->ec_csr_handle = rman_get_bushandle(sc->ec_csr_res);
504
505    /*
506     * Install a handler for this EC's GPE bit.  We want edge-triggered
507     * behavior.
508     */
509    ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "attaching GPE handler\n"));
510    Status = AcpiInstallGpeHandler(sc->ec_gpehandle, sc->ec_gpebit,
511		ACPI_GPE_EDGE_TRIGGERED, EcGpeHandler, sc);
512    if (ACPI_FAILURE(Status)) {
513	device_printf(dev, "can't install GPE handler for %s - %s\n",
514		      acpi_name(sc->ec_handle), AcpiFormatException(Status));
515	goto error;
516    }
517
518    /*
519     * Install address space handler
520     */
521    ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "attaching address space handler\n"));
522    Status = AcpiInstallAddressSpaceHandler(sc->ec_handle, ACPI_ADR_SPACE_EC,
523		&EcSpaceHandler, &EcSpaceSetup, sc);
524    if (ACPI_FAILURE(Status)) {
525	device_printf(dev, "can't install address space handler for %s - %s\n",
526		      acpi_name(sc->ec_handle), AcpiFormatException(Status));
527	goto error;
528    }
529
530    /* Enable runtime GPEs for the handler. */
531    Status = AcpiEnableGpe(sc->ec_gpehandle, sc->ec_gpebit);
532    if (ACPI_FAILURE(Status)) {
533	device_printf(dev, "AcpiEnableGpe failed: %s\n",
534		      AcpiFormatException(Status));
535	goto error;
536    }
537
538    ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "acpi_ec_attach complete\n"));
539    return (0);
540
541error:
542    AcpiRemoveGpeHandler(sc->ec_gpehandle, sc->ec_gpebit, EcGpeHandler);
543    AcpiRemoveAddressSpaceHandler(sc->ec_handle, ACPI_ADR_SPACE_EC,
544	EcSpaceHandler);
545    if (sc->ec_csr_res)
546	bus_release_resource(sc->ec_dev, SYS_RES_IOPORT, sc->ec_csr_rid,
547			     sc->ec_csr_res);
548    if (sc->ec_data_res)
549	bus_release_resource(sc->ec_dev, SYS_RES_IOPORT, sc->ec_data_rid,
550			     sc->ec_data_res);
551    return (ENXIO);
552}
553
554static int
555acpi_ec_suspend(device_t dev)
556{
557    struct acpi_ec_softc	*sc;
558
559    sc = device_get_softc(dev);
560    sc->ec_suspending = TRUE;
561    return (0);
562}
563
564static int
565acpi_ec_resume(device_t dev)
566{
567    struct acpi_ec_softc	*sc;
568
569    sc = device_get_softc(dev);
570    sc->ec_suspending = FALSE;
571    return (0);
572}
573
574static int
575acpi_ec_shutdown(device_t dev)
576{
577    struct acpi_ec_softc	*sc;
578
579    /* Disable the GPE so we don't get EC events during shutdown. */
580    sc = device_get_softc(dev);
581    AcpiDisableGpe(sc->ec_gpehandle, sc->ec_gpebit);
582    return (0);
583}
584
585/* Methods to allow other devices (e.g., smbat) to read/write EC space. */
586static int
587acpi_ec_read_method(device_t dev, u_int addr, UINT64 *val, int width)
588{
589    struct acpi_ec_softc *sc;
590    ACPI_STATUS status;
591
592    sc = device_get_softc(dev);
593    status = EcSpaceHandler(ACPI_READ, addr, width * 8, val, sc, NULL);
594    if (ACPI_FAILURE(status))
595	return (ENXIO);
596    return (0);
597}
598
599static int
600acpi_ec_write_method(device_t dev, u_int addr, UINT64 val, int width)
601{
602    struct acpi_ec_softc *sc;
603    ACPI_STATUS status;
604
605    sc = device_get_softc(dev);
606    status = EcSpaceHandler(ACPI_WRITE, addr, width * 8, &val, sc, NULL);
607    if (ACPI_FAILURE(status))
608	return (ENXIO);
609    return (0);
610}
611
612static ACPI_STATUS
613EcCheckStatus(struct acpi_ec_softc *sc, const char *msg, EC_EVENT event)
614{
615    ACPI_STATUS status;
616    EC_STATUS ec_status;
617
618    status = AE_NO_HARDWARE_RESPONSE;
619    ec_status = EC_GET_CSR(sc);
620    if (sc->ec_burstactive && !(ec_status & EC_FLAG_BURST_MODE)) {
621	CTR1(KTR_ACPI, "ec burst disabled in waitevent (%s)", msg);
622	sc->ec_burstactive = FALSE;
623    }
624    if (EVENT_READY(event, ec_status)) {
625	CTR2(KTR_ACPI, "ec %s wait ready, status %#x", msg, ec_status);
626	status = AE_OK;
627    }
628    return (status);
629}
630
631static void
632EcGpeQueryHandlerSub(struct acpi_ec_softc *sc)
633{
634    UINT8			Data;
635    ACPI_STATUS			Status;
636    int				retry;
637    char			qxx[5];
638
639    ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
640
641    /* Serialize user access with EcSpaceHandler(). */
642    Status = EcLock(sc);
643    if (ACPI_FAILURE(Status)) {
644	device_printf(sc->ec_dev, "GpeQuery lock error: %s\n",
645	    AcpiFormatException(Status));
646	return;
647    }
648
649    /*
650     * Send a query command to the EC to find out which _Qxx call it
651     * wants to make.  This command clears the SCI bit and also the
652     * interrupt source since we are edge-triggered.  To prevent the GPE
653     * that may arise from running the query from causing another query
654     * to be queued, we clear the pending flag only after running it.
655     */
656    for (retry = 0; retry < 2; retry++) {
657	Status = EcCommand(sc, EC_COMMAND_QUERY);
658	if (ACPI_SUCCESS(Status))
659	    break;
660	if (ACPI_FAILURE(EcCheckStatus(sc, "retr_check",
661	    EC_EVENT_INPUT_BUFFER_EMPTY)))
662	    break;
663    }
664    if (ACPI_FAILURE(Status)) {
665	EcUnlock(sc);
666	device_printf(sc->ec_dev, "GPE query failed: %s\n",
667	    AcpiFormatException(Status));
668	return;
669    }
670    Data = EC_GET_DATA(sc);
671
672    /*
673     * We have to unlock before running the _Qxx method below since that
674     * method may attempt to read/write from EC address space, causing
675     * recursive acquisition of the lock.
676     */
677    EcUnlock(sc);
678
679    /* Ignore the value for "no outstanding event". (13.3.5) */
680    CTR2(KTR_ACPI, "ec query ok,%s running _Q%02X", Data ? "" : " not", Data);
681    if (Data == 0)
682	return;
683
684    /* Evaluate _Qxx to respond to the controller. */
685    snprintf(qxx, sizeof(qxx), "_Q%02X", Data);
686    AcpiUtStrupr(qxx);
687    Status = AcpiEvaluateObject(sc->ec_handle, qxx, NULL, NULL);
688    if (ACPI_FAILURE(Status) && Status != AE_NOT_FOUND) {
689	device_printf(sc->ec_dev, "evaluation of query method %s failed: %s\n",
690	    qxx, AcpiFormatException(Status));
691    }
692}
693
694static void
695EcGpeQueryHandler(void *Context)
696{
697    struct acpi_ec_softc *sc = (struct acpi_ec_softc *)Context;
698    int pending;
699
700    KASSERT(Context != NULL, ("EcGpeQueryHandler called with NULL"));
701
702    do {
703	/* Read the current pending count */
704	pending = atomic_load_acq_int(&sc->ec_sci_pend);
705
706	/* Call GPE handler function */
707	EcGpeQueryHandlerSub(sc);
708
709	/*
710	 * Try to reset the pending count to zero. If this fails we
711	 * know another GPE event has occurred while handling the
712	 * current GPE event and need to loop.
713	 */
714    } while (!atomic_cmpset_int(&sc->ec_sci_pend, pending, 0));
715}
716
717/*
718 * The GPE handler is called when IBE/OBF or SCI events occur.  We are
719 * called from an unknown lock context.
720 */
721static UINT32
722EcGpeHandler(ACPI_HANDLE GpeDevice, UINT32 GpeNumber, void *Context)
723{
724    struct acpi_ec_softc *sc = Context;
725    ACPI_STATUS		       Status;
726    EC_STATUS		       EcStatus;
727
728    KASSERT(Context != NULL, ("EcGpeHandler called with NULL"));
729    CTR0(KTR_ACPI, "ec gpe handler start");
730
731    /*
732     * Notify EcWaitEvent() that the status register is now fresh.  If we
733     * didn't do this, it wouldn't be possible to distinguish an old IBE
734     * from a new one, for example when doing a write transaction (writing
735     * address and then data values.)
736     */
737    atomic_add_int(&sc->ec_gencount, 1);
738    wakeup(sc);
739
740    /*
741     * If the EC_SCI bit of the status register is set, queue a query handler.
742     * It will run the query and _Qxx method later, under the lock.
743     */
744    EcStatus = EC_GET_CSR(sc);
745    if ((EcStatus & EC_EVENT_SCI) &&
746	atomic_fetchadd_int(&sc->ec_sci_pend, 1) == 0) {
747	CTR0(KTR_ACPI, "ec gpe queueing query handler");
748	Status = AcpiOsExecute(OSL_GPE_HANDLER, EcGpeQueryHandler, Context);
749	if (ACPI_FAILURE(Status)) {
750	    printf("EcGpeHandler: queuing GPE query handler failed\n");
751	    atomic_store_rel_int(&sc->ec_sci_pend, 0);
752	}
753    }
754    return (ACPI_REENABLE_GPE);
755}
756
757static ACPI_STATUS
758EcSpaceSetup(ACPI_HANDLE Region, UINT32 Function, void *Context,
759	     void **RegionContext)
760{
761
762    ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
763
764    /*
765     * If deactivating a region, always set the output to NULL.  Otherwise,
766     * just pass the context through.
767     */
768    if (Function == ACPI_REGION_DEACTIVATE)
769	*RegionContext = NULL;
770    else
771	*RegionContext = Context;
772
773    return_ACPI_STATUS (AE_OK);
774}
775
776static ACPI_STATUS
777EcSpaceHandler(UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 Width,
778	       UINT64 *Value, void *Context, void *RegionContext)
779{
780    struct acpi_ec_softc	*sc = (struct acpi_ec_softc *)Context;
781    ACPI_PHYSICAL_ADDRESS	EcAddr;
782    UINT8			*EcData;
783    ACPI_STATUS			Status;
784
785    ACPI_FUNCTION_TRACE_U32((char *)(uintptr_t)__func__, (UINT32)Address);
786
787    if (Function != ACPI_READ && Function != ACPI_WRITE)
788	return_ACPI_STATUS (AE_BAD_PARAMETER);
789    if (Width % 8 != 0 || Value == NULL || Context == NULL)
790	return_ACPI_STATUS (AE_BAD_PARAMETER);
791    if (Address + Width / 8 > 256)
792	return_ACPI_STATUS (AE_BAD_ADDRESS);
793
794    /*
795     * If booting, check if we need to run the query handler.  If so, we
796     * we call it directly here since our thread taskq is not active yet.
797     */
798    if (cold || rebooting || sc->ec_suspending) {
799	if ((EC_GET_CSR(sc) & EC_EVENT_SCI) &&
800	    atomic_fetchadd_int(&sc->ec_sci_pend, 1) == 0) {
801	    CTR0(KTR_ACPI, "ec running gpe handler directly");
802	    EcGpeQueryHandler(sc);
803	}
804    }
805
806    /* Serialize with EcGpeQueryHandler() at transaction granularity. */
807    Status = EcLock(sc);
808    if (ACPI_FAILURE(Status))
809	return_ACPI_STATUS (Status);
810
811    /* If we can't start burst mode, continue anyway. */
812    Status = EcCommand(sc, EC_COMMAND_BURST_ENABLE);
813    if (ACPI_SUCCESS(Status)) {
814	if (EC_GET_DATA(sc) == EC_BURST_ACK) {
815	    CTR0(KTR_ACPI, "ec burst enabled");
816	    sc->ec_burstactive = TRUE;
817	}
818    }
819
820    /* Perform the transaction(s), based on Width. */
821    EcAddr = Address;
822    EcData = (UINT8 *)Value;
823    if (Function == ACPI_READ)
824	*Value = 0;
825    do {
826	switch (Function) {
827	case ACPI_READ:
828	    Status = EcRead(sc, EcAddr, EcData);
829	    break;
830	case ACPI_WRITE:
831	    Status = EcWrite(sc, EcAddr, *EcData);
832	    break;
833	}
834	if (ACPI_FAILURE(Status))
835	    break;
836	EcAddr++;
837	EcData++;
838    } while (EcAddr < Address + Width / 8);
839
840    if (sc->ec_burstactive) {
841	sc->ec_burstactive = FALSE;
842	if (ACPI_SUCCESS(EcCommand(sc, EC_COMMAND_BURST_DISABLE)))
843	    CTR0(KTR_ACPI, "ec disabled burst ok");
844    }
845
846    EcUnlock(sc);
847    return_ACPI_STATUS (Status);
848}
849
850static ACPI_STATUS
851EcWaitEvent(struct acpi_ec_softc *sc, EC_EVENT Event, u_int gen_count)
852{
853    static int	no_intr = 0;
854    ACPI_STATUS	Status;
855    int		count, i, need_poll, slp_ival;
856
857    ACPI_SERIAL_ASSERT(ec);
858    Status = AE_NO_HARDWARE_RESPONSE;
859    need_poll = cold || rebooting || ec_polled_mode || sc->ec_suspending;
860
861    /* Wait for event by polling or GPE (interrupt). */
862    if (need_poll) {
863	count = (ec_timeout * 1000) / EC_POLL_DELAY;
864	if (count == 0)
865	    count = 1;
866	DELAY(10);
867	for (i = 0; i < count; i++) {
868	    Status = EcCheckStatus(sc, "poll", Event);
869	    if (ACPI_SUCCESS(Status))
870		break;
871	    DELAY(EC_POLL_DELAY);
872	}
873    } else {
874	slp_ival = hz / 1000;
875	if (slp_ival != 0) {
876	    count = ec_timeout;
877	} else {
878	    /* hz has less than 1 ms resolution so scale timeout. */
879	    slp_ival = 1;
880	    count = ec_timeout / (1000 / hz);
881	}
882
883	/*
884	 * Wait for the GPE to signal the status changed, checking the
885	 * status register each time we get one.  It's possible to get a
886	 * GPE for an event we're not interested in here (i.e., SCI for
887	 * EC query).
888	 */
889	for (i = 0; i < count; i++) {
890	    if (gen_count == sc->ec_gencount)
891		tsleep(sc, 0, "ecgpe", slp_ival);
892	    /*
893	     * Record new generation count.  It's possible the GPE was
894	     * just to notify us that a query is needed and we need to
895	     * wait for a second GPE to signal the completion of the
896	     * event we are actually waiting for.
897	     */
898	    Status = EcCheckStatus(sc, "sleep", Event);
899	    if (ACPI_SUCCESS(Status)) {
900		if (gen_count == sc->ec_gencount)
901		    no_intr++;
902		else
903		    no_intr = 0;
904		break;
905	    }
906	    gen_count = sc->ec_gencount;
907	}
908
909	/*
910	 * We finished waiting for the GPE and it never arrived.  Try to
911	 * read the register once and trust whatever value we got.  This is
912	 * the best we can do at this point.
913	 */
914	if (ACPI_FAILURE(Status))
915	    Status = EcCheckStatus(sc, "sleep_end", Event);
916    }
917    if (!need_poll && no_intr > 10) {
918	device_printf(sc->ec_dev,
919	    "not getting interrupts, switched to polled mode\n");
920	ec_polled_mode = 1;
921    }
922    if (ACPI_FAILURE(Status))
923	    CTR0(KTR_ACPI, "error: ec wait timed out");
924    return (Status);
925}
926
927static ACPI_STATUS
928EcCommand(struct acpi_ec_softc *sc, EC_COMMAND cmd)
929{
930    ACPI_STATUS	status;
931    EC_EVENT	event;
932    EC_STATUS	ec_status;
933    u_int	gen_count;
934
935    ACPI_SERIAL_ASSERT(ec);
936
937    /* Don't use burst mode if user disabled it. */
938    if (!ec_burst_mode && cmd == EC_COMMAND_BURST_ENABLE)
939	return (AE_ERROR);
940
941    /* Decide what to wait for based on command type. */
942    switch (cmd) {
943    case EC_COMMAND_READ:
944    case EC_COMMAND_WRITE:
945    case EC_COMMAND_BURST_DISABLE:
946	event = EC_EVENT_INPUT_BUFFER_EMPTY;
947	break;
948    case EC_COMMAND_QUERY:
949    case EC_COMMAND_BURST_ENABLE:
950	event = EC_EVENT_OUTPUT_BUFFER_FULL;
951	break;
952    default:
953	device_printf(sc->ec_dev, "EcCommand: invalid command %#x\n", cmd);
954	return (AE_BAD_PARAMETER);
955    }
956
957    /*
958     * Ensure empty input buffer before issuing command.
959     * Use generation count of zero to force a quick check.
960     */
961    status = EcWaitEvent(sc, EC_EVENT_INPUT_BUFFER_EMPTY, 0);
962    if (ACPI_FAILURE(status))
963	return (status);
964
965    /* Run the command and wait for the chosen event. */
966    CTR1(KTR_ACPI, "ec running command %#x", cmd);
967    gen_count = sc->ec_gencount;
968    EC_SET_CSR(sc, cmd);
969    status = EcWaitEvent(sc, event, gen_count);
970    if (ACPI_SUCCESS(status)) {
971	/* If we succeeded, burst flag should now be present. */
972	if (cmd == EC_COMMAND_BURST_ENABLE) {
973	    ec_status = EC_GET_CSR(sc);
974	    if ((ec_status & EC_FLAG_BURST_MODE) == 0)
975		status = AE_ERROR;
976	}
977    } else
978	device_printf(sc->ec_dev, "EcCommand: no response to %#x\n", cmd);
979    return (status);
980}
981
982static ACPI_STATUS
983EcRead(struct acpi_ec_softc *sc, UINT8 Address, UINT8 *Data)
984{
985    ACPI_STATUS	status;
986    u_int gen_count;
987    int retry;
988
989    ACPI_SERIAL_ASSERT(ec);
990    CTR1(KTR_ACPI, "ec read from %#x", Address);
991
992    for (retry = 0; retry < 2; retry++) {
993	status = EcCommand(sc, EC_COMMAND_READ);
994	if (ACPI_FAILURE(status))
995	    return (status);
996
997	gen_count = sc->ec_gencount;
998	EC_SET_DATA(sc, Address);
999	status = EcWaitEvent(sc, EC_EVENT_OUTPUT_BUFFER_FULL, gen_count);
1000	if (ACPI_SUCCESS(status)) {
1001	    *Data = EC_GET_DATA(sc);
1002	    return (AE_OK);
1003	}
1004	if (ACPI_FAILURE(EcCheckStatus(sc, "retr_check",
1005	    EC_EVENT_INPUT_BUFFER_EMPTY)))
1006	    break;
1007    }
1008    device_printf(sc->ec_dev, "EcRead: failed waiting to get data\n");
1009    return (status);
1010}
1011
1012static ACPI_STATUS
1013EcWrite(struct acpi_ec_softc *sc, UINT8 Address, UINT8 Data)
1014{
1015    ACPI_STATUS	status;
1016    u_int gen_count;
1017
1018    ACPI_SERIAL_ASSERT(ec);
1019    CTR2(KTR_ACPI, "ec write to %#x, data %#x", Address, Data);
1020
1021    status = EcCommand(sc, EC_COMMAND_WRITE);
1022    if (ACPI_FAILURE(status))
1023	return (status);
1024
1025    gen_count = sc->ec_gencount;
1026    EC_SET_DATA(sc, Address);
1027    status = EcWaitEvent(sc, EC_EVENT_INPUT_BUFFER_EMPTY, gen_count);
1028    if (ACPI_FAILURE(status)) {
1029	device_printf(sc->ec_dev, "EcWrite: failed waiting for sent address\n");
1030	return (status);
1031    }
1032
1033    gen_count = sc->ec_gencount;
1034    EC_SET_DATA(sc, Data);
1035    status = EcWaitEvent(sc, EC_EVENT_INPUT_BUFFER_EMPTY, gen_count);
1036    if (ACPI_FAILURE(status)) {
1037	device_printf(sc->ec_dev, "EcWrite: failed waiting for sent data\n");
1038	return (status);
1039    }
1040
1041    return (AE_OK);
1042}
1043