Author: gonzo
Date: Wed May 15 21:52:43 2019
New Revision: 347634
URL: https://svnweb.freebsd.org/changeset/base/347634

Log:
  MFC r346647:
  
  [acpi_ibm] Add support for newer Thinkpad models
  
  Add support for newer Thinkpad models with id LEN0268. Was tested on
  Thinkpad T480 and ThinkPad X1 Yoga 2nd gen.
  
  PR:           229120
  Submitted by: Ali Abdallah <ali...@gmail.com>

Modified:
  stable/12/sys/dev/acpi_support/acpi_ibm.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/dev/acpi_support/acpi_ibm.c
==============================================================================
--- stable/12/sys/dev/acpi_support/acpi_ibm.c   Wed May 15 21:25:44 2019        
(r347633)
+++ stable/12/sys/dev/acpi_support/acpi_ibm.c   Wed May 15 21:52:43 2019        
(r347634)
@@ -349,7 +349,7 @@ static devclass_t acpi_ibm_devclass;
 DRIVER_MODULE(acpi_ibm, acpi, acpi_ibm_driver, acpi_ibm_devclass,
              0, 0);
 MODULE_DEPEND(acpi_ibm, acpi, 1, 1, 1);
-static char    *ibm_ids[] = {"IBM0068", "LEN0068", NULL};
+static char    *ibm_ids[] = {"IBM0068", "LEN0068", "LEN0268", NULL};
 
 static void
 ibm_led(void *softc, int onoff)
@@ -425,9 +425,14 @@ static int
 acpi_ibm_attach(device_t dev)
 {
        int i;
+       int hkey;
        struct acpi_ibm_softc   *sc;
        char *maker, *product;
-       devclass_t              ec_devclass;
+       ACPI_OBJECT_LIST input;
+       ACPI_OBJECT params[1];
+       ACPI_OBJECT out_obj;
+       ACPI_BUFFER result;
+       devclass_t ec_devclass;
 
        ACPI_FUNCTION_TRACE((char *)(uintptr_t) __func__);
 
@@ -462,15 +467,42 @@ acpi_ibm_attach(device_t dev)
                    "initialmask", CTLFLAG_RD,
                    &sc->events_initialmask, 0, "Initial eventmask");
 
-               /* The availmask is the bitmask of supported events */
-               if (ACPI_FAILURE(acpi_GetInteger(sc->handle,
-                   IBM_NAME_EVENTS_AVAILMASK, &sc->events_availmask)))
+               if (ACPI_SUCCESS (acpi_GetInteger(sc->handle, "MHKV", &hkey))) {
+                       device_printf(dev, "Firmware version is 0x%X\n", hkey);
+                       switch(hkey >> 8)
+                       {
+                       case 1:
+                               /* The availmask is the bitmask of supported 
events */
+                               if (ACPI_FAILURE(acpi_GetInteger(sc->handle,
+                                   IBM_NAME_EVENTS_AVAILMASK, 
&sc->events_availmask)))
+                                       sc->events_availmask = 0xffffffff;
+                               break;
+
+                       case 2:
+                               result.Length = sizeof(out_obj);
+                               result.Pointer = &out_obj;
+                               params[0].Type = ACPI_TYPE_INTEGER;
+                               params[0].Integer.Value = 1;
+                               input.Pointer = params;
+                               input.Count = 1;
+
+                               sc->events_availmask = 0xffffffff;
+
+                               if (ACPI_SUCCESS(AcpiEvaluateObject (sc->handle,
+                                   IBM_NAME_EVENTS_AVAILMASK, &input, 
&result)))
+                                       sc->events_availmask = 
out_obj.Integer.Value;
+                               break;
+                       default:
+                               device_printf(dev, "Unknown firmware version 
0x%x\n", hkey);
+                               break;
+                       }
+               } else
                        sc->events_availmask = 0xffffffff;
 
                SYSCTL_ADD_UINT(sc->sysctl_ctx,
-                   SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO,
-                   "availmask", CTLFLAG_RD,
-                   &sc->events_availmask, 0, "Mask of supported events");
+                               SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO,
+                               "availmask", CTLFLAG_RD,
+                               &sc->events_availmask, 0, "Mask of supported 
events");
        }
 
        /* Hook up proc nodes */
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to