<p>Patrick Rudolph has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/27711">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">drvs/intel/gma/acpi: Add methods to use MBOX3<br><br>* Add Mailbox 3 driver<br>* Request brightness change through Mailbox 3<br>* Return Ones on error or if unsupported<br>* Mark existing code as legacy<br>  (still required if no GMA driver is running)<br>* Call legacy code if Mailbox 3 is unsupported, on error or<br>  if gma driver isn't running<br><br>Tested on Lenovo T430:<br>* Brightness control still works<br>* Brightness is the same on S3 resume<br><br>Change-Id: I51554c819148336b204d28972cbf775a10c3fb8a<br>Signed-off-by: Patrick Rudolph <siro@das-labor.org><br>---<br>M src/drivers/intel/gma/acpi/common.asl<br>M src/drivers/intel/gma/acpi/configure_brightness_levels.asl<br>M src/drivers/intel/gma/acpi/non-pch.asl<br>M src/drivers/intel/gma/acpi/pch.asl<br>4 files changed, 152 insertions(+), 21 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/11/27711/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/drivers/intel/gma/acpi/common.asl b/src/drivers/intel/gma/acpi/common.asl</span><br><span>index 7415859..009e3a5 100644</span><br><span>--- a/src/drivers/intel/gma/acpi/common.asl</span><br><span>+++ b/src/drivers/intel/gma/acpi/common.asl</span><br><span>@@ -44,8 +44,11 @@</span><br><span>                Store (And(Arg0, 7), DSEN)</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* Using Notify is the right way. But Windows doesn't handle</span><br><span style="color: hsl(0, 100%, 40%);">-           it well. So use both method in a way to avoid double action.</span><br><span style="color: hsl(120, 100%, 40%);">+       /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * Decrement display brightness.</span><br><span style="color: hsl(120, 100%, 40%);">+       *</span><br><span style="color: hsl(120, 100%, 40%);">+     * Using Notify is the right way. But Windows doesn't handle</span><br><span style="color: hsl(120, 100%, 40%);">+       * it well. So use both method in a way to avoid double action.</span><br><span>       */</span><br><span>  Method (DECB, 0, NotSerialized)</span><br><span>      {</span><br><span>@@ -62,6 +65,9 @@</span><br><span>                }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * Increment display brightness.</span><br><span style="color: hsl(120, 100%, 40%);">+       */</span><br><span>  Method (INCB, 0, NotSerialized)</span><br><span>      {</span><br><span>            If (BRCT)</span><br><span>diff --git a/src/drivers/intel/gma/acpi/configure_brightness_levels.asl b/src/drivers/intel/gma/acpi/configure_brightness_levels.asl</span><br><span>index 38eb116..5f19e97 100644</span><br><span>--- a/src/drivers/intel/gma/acpi/configure_brightness_levels.asl</span><br><span>+++ b/src/drivers/intel/gma/acpi/configure_brightness_levels.asl</span><br><span>@@ -1,24 +1,141 @@</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * Pseudo device that contains methods to modify Opregion</span><br><span style="color: hsl(120, 100%, 40%);">+      * "Mailbox 3 BIOS to Driver Notification"</span><br><span style="color: hsl(120, 100%, 40%);">+   * The BIOS to Driver Notification mailbox is intended to support</span><br><span style="color: hsl(120, 100%, 40%);">+      * BIOS to Driver event notification or data storage for BIOS to</span><br><span style="color: hsl(120, 100%, 40%);">+       * Driver data synchronization purpose.</span><br><span style="color: hsl(120, 100%, 40%);">+       */</span><br><span style="color: hsl(120, 100%, 40%);">+    Device (BOX3)</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+             Name (_ADR, 0)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              OperationRegion (OPRG, SystemMemory, ASLS, 0x2000)</span><br><span style="color: hsl(120, 100%, 40%);">+            Field (OPRG, DWordAcc, NoLock, Preserve)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                     // OpRegion Header</span><br><span style="color: hsl(120, 100%, 40%);">+                    Offset (0x58),</span><br><span style="color: hsl(120, 100%, 40%);">+                        MBOX, 32,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   // Mailbox 3</span><br><span style="color: hsl(120, 100%, 40%);">+                  Offset (0x300),</span><br><span style="color: hsl(120, 100%, 40%);">+                       ARDY, 32,       /* Offset 0   Driver readiness */</span><br><span style="color: hsl(120, 100%, 40%);">+                     ASLC, 32,       /* Offset 4   ASLE interrupt command / status */</span><br><span style="color: hsl(120, 100%, 40%);">+                      TCHE, 32,       /* Offset 8   Technology enabled indicator */</span><br><span style="color: hsl(120, 100%, 40%);">+                 ALSI, 32,       /* Offset 12  Current ALS illuminance reading */</span><br><span style="color: hsl(120, 100%, 40%);">+                      BCLP, 32,       /* Offset 16  Backlight britness to set */</span><br><span style="color: hsl(120, 100%, 40%);">+                    PFIT, 32,       /* Offset 20  Panel fitting Request */</span><br><span style="color: hsl(120, 100%, 40%);">+                        CBLV, 32,       /* Offset 24  Brightness Current State */</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /*</span><br><span style="color: hsl(120, 100%, 40%);">+             * Request back-light brightness change through mailbox 3</span><br><span style="color: hsl(120, 100%, 40%);">+              *</span><br><span style="color: hsl(120, 100%, 40%);">+             * @param Arg0 The brightness level to set in percent</span><br><span style="color: hsl(120, 100%, 40%);">+          * @Return Ones on failure</span><br><span style="color: hsl(120, 100%, 40%);">+             */</span><br><span style="color: hsl(120, 100%, 40%);">+           Method (XBCM, 1, NotSerialized)</span><br><span style="color: hsl(120, 100%, 40%);">+               {</span><br><span style="color: hsl(120, 100%, 40%);">+                     If (LEqual(And(MBOX, 0x4), Zero))</span><br><span style="color: hsl(120, 100%, 40%);">+                     {</span><br><span style="color: hsl(120, 100%, 40%);">+                             Return (Ones)</span><br><span style="color: hsl(120, 100%, 40%);">+                 }</span><br><span style="color: hsl(120, 100%, 40%);">+                     If (LEqual(ARDY, Zero))</span><br><span style="color: hsl(120, 100%, 40%);">+                       {</span><br><span style="color: hsl(120, 100%, 40%);">+                             Return (Ones)</span><br><span style="color: hsl(120, 100%, 40%);">+                 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   Store (Or (Arg0, 0x80000000), BCLP)</span><br><span style="color: hsl(120, 100%, 40%);">+                   /* Request back-light change */</span><br><span style="color: hsl(120, 100%, 40%);">+                       Store (0x2, ASLC)</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* Trigger IRQ */</span><br><span style="color: hsl(120, 100%, 40%);">+                     Store (0x1, ASLE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   Store (0x20, Local0)</span><br><span style="color: hsl(120, 100%, 40%);">+                  While (LGreater(Local0, Zero))</span><br><span style="color: hsl(120, 100%, 40%);">+                        {</span><br><span style="color: hsl(120, 100%, 40%);">+                             Sleep (1)</span><br><span style="color: hsl(120, 100%, 40%);">+                             If (LEqual(And(ShiftRight(ASLC, 12), 0x3), Zero))</span><br><span style="color: hsl(120, 100%, 40%);">+                             {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     Return (Zero)</span><br><span style="color: hsl(120, 100%, 40%);">+                         }</span><br><span style="color: hsl(120, 100%, 40%);">+                             Decrement (Local0)</span><br><span style="color: hsl(120, 100%, 40%);">+                    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   Return (Ones)</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /*</span><br><span style="color: hsl(120, 100%, 40%);">+             * Get current back-light brightness through mailbox 3</span><br><span style="color: hsl(120, 100%, 40%);">+                 *</span><br><span style="color: hsl(120, 100%, 40%);">+             * @Return The current brightness or Ones on error</span><br><span style="color: hsl(120, 100%, 40%);">+             */</span><br><span style="color: hsl(120, 100%, 40%);">+           Method (XBQC, 0, NotSerialized)</span><br><span style="color: hsl(120, 100%, 40%);">+               {</span><br><span style="color: hsl(120, 100%, 40%);">+                     If (LEqual(And(MBOX, 0x4), Zero))</span><br><span style="color: hsl(120, 100%, 40%);">+                     {</span><br><span style="color: hsl(120, 100%, 40%);">+                             Return (Ones)</span><br><span style="color: hsl(120, 100%, 40%);">+                 }</span><br><span style="color: hsl(120, 100%, 40%);">+                     If (LEqual(ARDY, Zero))</span><br><span style="color: hsl(120, 100%, 40%);">+                       {</span><br><span style="color: hsl(120, 100%, 40%);">+                             Return (Ones)</span><br><span style="color: hsl(120, 100%, 40%);">+                 }</span><br><span style="color: hsl(120, 100%, 40%);">+                     If (LEqual(And (CBLV, 0x80000000), Zero))</span><br><span style="color: hsl(120, 100%, 40%);">+                     {</span><br><span style="color: hsl(120, 100%, 40%);">+                             Return (Ones)</span><br><span style="color: hsl(120, 100%, 40%);">+                 }</span><br><span style="color: hsl(120, 100%, 40%);">+                     Return (And (CBLV, 0xff))</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * Pseudo device that contains methods to operate on PCI registers</span><br><span style="color: hsl(120, 100%, 40%);">+     */</span><br><span style="color: hsl(120, 100%, 40%);">+   Device (LEGA)</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+             Name (_ADR, 0)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              Method (XBCM, 1, NotSerialized)</span><br><span style="color: hsl(120, 100%, 40%);">+               {</span><br><span style="color: hsl(120, 100%, 40%);">+                     Store (Divide (Multiply (Arg0, BCLM), 100), BCLV)</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           Method (XBQC, 0, NotSerialized)</span><br><span style="color: hsl(120, 100%, 40%);">+               {</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* Find value close to BCLV in BRIG (which must be ordered) */</span><br><span style="color: hsl(120, 100%, 40%);">+                        Store (BCLV, Local0)                    // Current value</span><br><span style="color: hsl(120, 100%, 40%);">+                      Store (BCLM, Local1)                    // For calculations</span><br><span style="color: hsl(120, 100%, 40%);">+                   Store (2, Local2)                       // Loop index</span><br><span style="color: hsl(120, 100%, 40%);">+                 While (LLess (Local2, Subtract (SizeOf (BRIG), 1))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         Store (DeRefOf (Index (BRIG, Local2)), Local3)</span><br><span style="color: hsl(120, 100%, 40%);">+                                /* Use same calculation as XBCM, to get exact matches */</span><br><span style="color: hsl(120, 100%, 40%);">+                              Store (Divide (Multiply (Local3, Local1), 100), Local3)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                             If (LLessEqual (Local0, Local3)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                    Return (DeRefOf (Index (BRIG, Local2)))</span><br><span style="color: hsl(120, 100%, 40%);">+                               }</span><br><span style="color: hsl(120, 100%, 40%);">+                             Add (Local2, 1, Local2)</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* Didn't find greater/equal value: use the last */</span><br><span style="color: hsl(120, 100%, 40%);">+                       Return (DeRefOf (Index (BRIG, Local2)))</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  Method (XBCM, 1, NotSerialized)</span><br><span>      {</span><br><span style="color: hsl(0, 100%, 40%);">-               Store (Divide (Multiply (Arg0, BCLM), 100), BCLV)</span><br><span style="color: hsl(120, 100%, 40%);">+             If (LEqual(^BOX3.XBCM (Arg0), Ones))</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+                     //LEGA.XBCM (Arg0)</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span>    }</span><br><span> </span><br><span>        Method (XBQC, 0, NotSerialized)</span><br><span>      {</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Find value close to BCLV in BRIG (which must be ordered) */</span><br><span style="color: hsl(0, 100%, 40%);">-          Store (BCLV, Local0)                    // Current value</span><br><span style="color: hsl(0, 100%, 40%);">-                Store (BCLM, Local1)                    // For calculations</span><br><span style="color: hsl(0, 100%, 40%);">-             Store (2, Local2)                       // Loop index</span><br><span style="color: hsl(0, 100%, 40%);">-           While (LLess (Local2, Subtract (SizeOf (BRIG), 1))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   Store (DeRefOf (Index (BRIG, Local2)), Local3)</span><br><span style="color: hsl(0, 100%, 40%);">-                  /* Use same calculation as XBCM, to get exact matches */</span><br><span style="color: hsl(0, 100%, 40%);">-                        Store (Divide (Multiply (Local3, Local1), 100), Local3)</span><br><span style="color: hsl(120, 100%, 40%);">+               Store (^BOX3.XBQC (), Local0)</span><br><span style="color: hsl(120, 100%, 40%);">+         //If (LEqual(Local0, Ones))</span><br><span style="color: hsl(120, 100%, 40%);">+           //{</span><br><span style="color: hsl(120, 100%, 40%);">+           //      Store (LEGA.XBCM (Arg0), Local0)</span><br><span style="color: hsl(120, 100%, 40%);">+              //}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                 If (LLessEqual (Local0, Local3)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              Return (DeRefOf (Index (BRIG, Local2)))</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(0, 100%, 40%);">-                       Add (Local2, 1, Local2)</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Didn't find greater/equal value: use the last */</span><br><span style="color: hsl(0, 100%, 40%);">-         Return (DeRefOf (Index (BRIG, Local2)))</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+             Return (Local0)</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span>\ No newline at end of file</span><br><span>diff --git a/src/drivers/intel/gma/acpi/non-pch.asl b/src/drivers/intel/gma/acpi/non-pch.asl</span><br><span>index ef8f3ff..c35d251 100644</span><br><span>--- a/src/drivers/intel/gma/acpi/non-pch.asl</span><br><span>+++ b/src/drivers/intel/gma/acpi/non-pch.asl</span><br><span>@@ -22,7 +22,11 @@</span><br><span>    Field (GFXC, DWordAcc, NoLock, Preserve)</span><br><span>     {</span><br><span>            Offset (0x10),</span><br><span style="color: hsl(0, 100%, 40%);">-          BAR0, 64</span><br><span style="color: hsl(120, 100%, 40%);">+              BAR0, 64,</span><br><span style="color: hsl(120, 100%, 40%);">+             Offset (0xe4),</span><br><span style="color: hsl(120, 100%, 40%);">+                ASLE, 32,</span><br><span style="color: hsl(120, 100%, 40%);">+             Offset (0xfc),</span><br><span style="color: hsl(120, 100%, 40%);">+                ASLS, 32,</span><br><span>    }</span><br><span> </span><br><span>        OperationRegion (GFRG, SystemMemory, And (BAR0, 0xfffffffffffffff0), 0x400000)</span><br><span>diff --git a/src/drivers/intel/gma/acpi/pch.asl b/src/drivers/intel/gma/acpi/pch.asl</span><br><span>index 3191196..b7bb324 100644</span><br><span>--- a/src/drivers/intel/gma/acpi/pch.asl</span><br><span>+++ b/src/drivers/intel/gma/acpi/pch.asl</span><br><span>@@ -22,7 +22,11 @@</span><br><span>     Field (GFXC, DWordAcc, NoLock, Preserve)</span><br><span>     {</span><br><span>            Offset (0x10),</span><br><span style="color: hsl(0, 100%, 40%);">-          BAR0, 64</span><br><span style="color: hsl(120, 100%, 40%);">+              BAR0, 64,</span><br><span style="color: hsl(120, 100%, 40%);">+             Offset (0xe4),</span><br><span style="color: hsl(120, 100%, 40%);">+                ASLE, 32,</span><br><span style="color: hsl(120, 100%, 40%);">+             Offset (0xfc),</span><br><span style="color: hsl(120, 100%, 40%);">+                ASLS, 32,</span><br><span>    }</span><br><span> </span><br><span>        OperationRegion (GFRG, SystemMemory, And (BAR0, 0xfffffffffffffff0), 0x400000)</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/27711">change 27711</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/27711"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I51554c819148336b204d28972cbf775a10c3fb8a </div>
<div style="display:none"> Gerrit-Change-Number: 27711 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Patrick Rudolph <siro@das-labor.org> </div>