Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/acpi/wmi Install EC space handler and pass everythin...



details:   https://anonhg.NetBSD.org/src/rev/929fa3defa93
branches:  trunk
changeset: 758249:929fa3defa93
user:      jruoho <jruoho%NetBSD.org@localhost>
date:      Thu Oct 28 15:55:04 2010 +0000

description:
Install EC space handler and pass everything to acpiec(4).
Should fix PR # 43659.

diffstat:

 sys/dev/acpi/wmi/wmi_acpi.c    |  118 +++++++++++++++++++++++++++++++++-------
 sys/dev/acpi/wmi/wmi_acpivar.h |   11 ++-
 2 files changed, 101 insertions(+), 28 deletions(-)

diffs (215 lines):

diff -r 0903f59efc7a -r 929fa3defa93 sys/dev/acpi/wmi/wmi_acpi.c
--- a/sys/dev/acpi/wmi/wmi_acpi.c       Thu Oct 28 14:37:29 2010 +0000
+++ b/sys/dev/acpi/wmi/wmi_acpi.c       Thu Oct 28 15:55:04 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: wmi_acpi.c,v 1.10 2010/10/25 15:38:05 jruoho Exp $     */
+/*     $NetBSD: wmi_acpi.c,v 1.11 2010/10/28 15:55:04 jruoho Exp $     */
 
 /*-
  * Copyright (c) 2009, 2010 Jukka Ruohonen <jruohonen%iki.fi@localhost>
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wmi_acpi.c,v 1.10 2010/10/25 15:38:05 jruoho Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wmi_acpi.c,v 1.11 2010/10/28 15:55:04 jruoho Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -38,6 +38,7 @@
 
 #include <dev/acpi/acpireg.h>
 #include <dev/acpi/acpivar.h>
+#include <dev/acpi/acpi_ecvar.h>
 #include <dev/acpi/wmi/wmi_acpivar.h>
 
 #define _COMPONENT          ACPI_RESOURCE_COMPONENT
@@ -52,26 +53,28 @@
  * (Obtained on Thu Feb 12 18:21:44 EET 2009.)
  */
 
-static int         acpi_wmi_match(device_t, cfdata_t, void *);
-static void        acpi_wmi_attach(device_t, device_t, void *);
-static int         acpi_wmi_detach(device_t, int);
-static int         acpi_wmi_rescan(device_t, const char *, const int *);
-static void        acpi_wmi_childdet(device_t, device_t);
-static int         acpi_wmi_print(void *, const char *);
-static bool        acpi_wmi_init(struct acpi_wmi_softc *);
-static bool        acpi_wmi_add(struct acpi_wmi_softc *, ACPI_OBJECT *);
-static void        acpi_wmi_del(struct acpi_wmi_softc *);
-static void       acpi_wmi_dump(struct acpi_wmi_softc *);
-
-static ACPI_STATUS acpi_wmi_guid_get(struct acpi_wmi_softc *,
-                                     const char *, struct wmi_t **);
-static void       acpi_wmi_event_add(struct acpi_wmi_softc *);
-static void       acpi_wmi_event_del(struct acpi_wmi_softc *);
-static void        acpi_wmi_event_handler(ACPI_HANDLE, uint32_t, void *);
-static bool        acpi_wmi_suspend(device_t, const pmf_qual_t *);
-static bool        acpi_wmi_resume(device_t, const pmf_qual_t *);
-static ACPI_STATUS acpi_wmi_enable(ACPI_HANDLE, const char *, bool, bool);
-static bool        acpi_wmi_input(struct wmi_t *, uint8_t, uint8_t);
+static int             acpi_wmi_match(device_t, cfdata_t, void *);
+static void            acpi_wmi_attach(device_t, device_t, void *);
+static int             acpi_wmi_detach(device_t, int);
+static int             acpi_wmi_rescan(device_t, const char *, const int *);
+static void            acpi_wmi_childdet(device_t, device_t);
+static int             acpi_wmi_print(void *, const char *);
+static bool            acpi_wmi_init(struct acpi_wmi_softc *);
+static void            acpi_wmi_init_ec(struct acpi_wmi_softc *);
+static bool            acpi_wmi_add(struct acpi_wmi_softc *, ACPI_OBJECT *);
+static void            acpi_wmi_del(struct acpi_wmi_softc *);
+static void            acpi_wmi_dump(struct acpi_wmi_softc *);
+static ACPI_STATUS     acpi_wmi_guid_get(struct acpi_wmi_softc *,
+                               const char *, struct wmi_t **);
+static void            acpi_wmi_event_add(struct acpi_wmi_softc *);
+static void            acpi_wmi_event_del(struct acpi_wmi_softc *);
+static void            acpi_wmi_event_handler(ACPI_HANDLE, uint32_t, void *);
+static ACPI_STATUS     acpi_wmi_ec_handler(uint32_t, ACPI_PHYSICAL_ADDRESS,
+                               uint32_t, ACPI_INTEGER *, void *, void *);
+static bool            acpi_wmi_suspend(device_t, const pmf_qual_t *);
+static bool            acpi_wmi_resume(device_t, const pmf_qual_t *);
+static ACPI_STATUS     acpi_wmi_enable(ACPI_HANDLE, const char *, bool, bool);
+static bool            acpi_wmi_input(struct wmi_t *, uint8_t, uint8_t);
 
 const char * const acpi_wmi_ids[] = {
        "PNP0C14",
@@ -104,6 +107,7 @@
        sc->sc_node = aa->aa_node;
 
        sc->sc_child = NULL;
+       sc->sc_ecdev = NULL;
        sc->sc_handler = NULL;
 
        aprint_naive("\n");
@@ -113,8 +117,8 @@
                return;
 
        acpi_wmi_dump(sc);
+       acpi_wmi_init_ec(sc);
        acpi_wmi_event_add(sc);
-
        acpi_wmi_rescan(self, NULL, NULL);
 
        (void)pmf_device_register(self, acpi_wmi_suspend, acpi_wmi_resume);
@@ -127,6 +131,12 @@
 
        acpi_wmi_event_del(sc);
 
+       if (sc->sc_ecdev != NULL) {
+
+               (void)AcpiRemoveAddressSpaceHandler(sc->sc_node->ad_handle,
+                   ACPI_ADR_SPACE_EC, acpi_wmi_ec_handler);
+       }
+
        if (sc->sc_child != NULL)
                (void)config_detach(sc->sc_child, flags);
 
@@ -291,6 +301,36 @@
        }
 }
 
+static void
+acpi_wmi_init_ec(struct acpi_wmi_softc *sc)
+{
+       ACPI_STATUS rv;
+       deviter_t i;
+       device_t d;
+
+       d = deviter_first(&i, DEVITER_F_ROOT_FIRST);
+
+       for (; d != NULL; d = deviter_next(&i)) {
+
+               if (device_is_a(d, "acpiec") != false ||
+                   device_is_a(d, "acpiecdt") != false) {
+                       sc->sc_ecdev = d;
+                       break;
+               }
+       }
+
+       deviter_release(&i);
+
+       if (sc->sc_ecdev == NULL)
+               return;
+
+       rv = AcpiInstallAddressSpaceHandler(sc->sc_node->ad_handle,
+           ACPI_ADR_SPACE_EC, acpi_wmi_ec_handler, NULL, sc);
+
+       if (ACPI_FAILURE(rv))
+               sc->sc_ecdev = NULL;
+}
+
 static ACPI_STATUS
 acpi_wmi_guid_get(struct acpi_wmi_softc *sc,
     const char *src, struct wmi_t **out)
@@ -510,6 +550,38 @@
 }
 
 /*
+ * Handler for EC regions, which may be embedded in WMI.
+ */
+static ACPI_STATUS
+acpi_wmi_ec_handler(uint32_t func, ACPI_PHYSICAL_ADDRESS addr,
+    uint32_t width, ACPI_INTEGER *val, void *setup, void *aux)
+{
+       struct acpi_wmi_softc *sc = aux;
+
+       if (aux == NULL || val == NULL)
+               return AE_BAD_PARAMETER;
+
+       if (addr > 0xFF || width % 8 != 0)
+               return AE_BAD_ADDRESS;
+
+       switch (func) {
+
+       case ACPI_READ:
+               (void)acpiec_bus_read(sc->sc_ecdev, addr, val, width);
+               break;
+
+       case ACPI_WRITE:
+               (void)acpiec_bus_write(sc->sc_ecdev, addr, *val, width);
+               break;
+
+       default:
+               return AE_BAD_PARAMETER;
+       }
+
+       return AE_OK;
+}
+
+/*
  * As there is no prior knowledge about the expensive
  * events that cause "significant overhead", try to
  * disable (enable) these before suspending (resuming).
diff -r 0903f59efc7a -r 929fa3defa93 sys/dev/acpi/wmi/wmi_acpivar.h
--- a/sys/dev/acpi/wmi/wmi_acpivar.h    Thu Oct 28 14:37:29 2010 +0000
+++ b/sys/dev/acpi/wmi/wmi_acpivar.h    Thu Oct 28 15:55:04 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: wmi_acpivar.h,v 1.4 2010/06/05 06:07:12 jruoho Exp $   */
+/*     $NetBSD: wmi_acpivar.h,v 1.5 2010/10/28 15:55:04 jruoho Exp $   */
 
 /*-
  * Copyright (c) 2009, 2010 Jukka Ruohonen <jruohonen%iki.fi@localhost>
@@ -31,7 +31,7 @@
 #define _SYS_DEV_ACPI_WMI_WMI_ACPIVAR_H
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wmi_acpivar.h,v 1.4 2010/06/05 06:07:12 jruoho Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wmi_acpivar.h,v 1.5 2010/10/28 15:55:04 jruoho Exp $");
 
 ACPI_STATUS    acpi_wmi_event_register(device_t, ACPI_NOTIFY_HANDLER);
 ACPI_STATUS    acpi_wmi_event_deregister(device_t);
@@ -91,10 +91,11 @@
 };
 
 struct acpi_wmi_softc {
-       device_t                sc_dev;
-       device_t                sc_child;
-       ACPI_NOTIFY_HANDLER     sc_handler;
+       device_t                 sc_dev;
+       device_t                 sc_child;
+       device_t                 sc_ecdev;
        struct acpi_devnode     *sc_node;
+       ACPI_NOTIFY_HANDLER      sc_handler;
 
        SIMPLEQ_HEAD(, wmi_t)   wmi_head;
 };



Home | Main Index | Thread Index | Old Index