<p>Nico Huber has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/28301">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">drivers/intel/gma: Do not rely on CBLV in OpRegion Mailbox3<br><br>CBLV is not kept up to date by Linux' i915. We should fix that too,<br>but it will likely take some years until we can always expect it to<br>work.<br><br>For now read the register values directly. To accomodate that we<br>are not the only one writing those, revise XBQC() to search for<br>the closest value in BRIG (instead of a lower equal one) and round<br>more accurately for better matches.<br><br>Change-Id: I4e2d8fa34e75463d4cf7242af3e2c67577cfa2a5<br>Signed-off-by: Nico Huber <nico.h@gmx.de><br>---<br>M src/drivers/intel/gma/acpi/configure_brightness_levels.asl<br>1 file changed, 36 insertions(+), 51 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/01/28301/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><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 72e5466..024360f 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>@@ -93,36 +93,6 @@</span><br><span> </span><br><span>                     Return (Ones)</span><br><span>                }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               /*</span><br><span style="color: hsl(0, 100%, 40%);">-               * Get current back-light brightness through mailbox 3</span><br><span style="color: hsl(0, 100%, 40%);">-           *</span><br><span style="color: hsl(0, 100%, 40%);">-               * @Return The current brightness or Ones on error</span><br><span style="color: hsl(0, 100%, 40%);">-               * Errors: * ASLS is zero</span><br><span style="color: hsl(0, 100%, 40%);">-                *         * Mailbox 3 support not advertised</span><br><span style="color: hsl(0, 100%, 40%);">-            *         * Driver not loaded or not ready</span><br><span style="color: hsl(0, 100%, 40%);">-              *         * CBLV is not marked valid</span><br><span style="color: hsl(0, 100%, 40%);">-            */</span><br><span style="color: hsl(0, 100%, 40%);">-             Method (XBQC, 0, NotSerialized)</span><br><span style="color: hsl(0, 100%, 40%);">-         {</span><br><span style="color: hsl(0, 100%, 40%);">-                       If (LEqual(ASLS, Zero))</span><br><span style="color: hsl(0, 100%, 40%);">-                 {</span><br><span style="color: hsl(0, 100%, 40%);">-                               Return (Ones)</span><br><span style="color: hsl(0, 100%, 40%);">-                   }</span><br><span style="color: hsl(0, 100%, 40%);">-                       If (LEqual(And(MBOX, 0x4), Zero))</span><br><span style="color: hsl(0, 100%, 40%);">-                       {</span><br><span style="color: hsl(0, 100%, 40%);">-                               Return (Ones)</span><br><span style="color: hsl(0, 100%, 40%);">-                   }</span><br><span style="color: hsl(0, 100%, 40%);">-                       If (LEqual(ARDY, Zero))</span><br><span style="color: hsl(0, 100%, 40%);">-                 {</span><br><span style="color: hsl(0, 100%, 40%);">-                               Return (Ones)</span><br><span style="color: hsl(0, 100%, 40%);">-                   }</span><br><span style="color: hsl(0, 100%, 40%);">-                       If (LEqual(And (CBLV, 0x80000000), Zero))</span><br><span style="color: hsl(0, 100%, 40%);">-                       {</span><br><span style="color: hsl(0, 100%, 40%);">-                               Return (Ones)</span><br><span style="color: hsl(0, 100%, 40%);">-                   }</span><br><span style="color: hsl(0, 100%, 40%);">-                       Return (And (CBLV, 0xff))</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span>    }</span><br><span> </span><br><span>        /*</span><br><span>@@ -132,29 +102,45 @@</span><br><span>   {</span><br><span>            Name (_ADR, 0)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              Method (XBCM, 1, NotSerialized)</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Divide round closest */</span><br><span style="color: hsl(120, 100%, 40%);">+            Method (DRCL, 2)</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%);">+                     Return (Divide (Add (Arg0, Divide (Arg1, 2)), Arg1))</span><br><span>                 }</span><br><span> </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 (DRCL (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%);">+           /* Find value closest to BCLV in BRIG (which must be ordered) */</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%);">+                       /* Local0: current percentage */</span><br><span style="color: hsl(120, 100%, 40%);">+                      Store (DRCL (Multiply (BCLV, 100), BCLM), Local0)</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(120, 100%, 40%);">+                       /* Local1: loop index (selectable values start at 2 in BRIG) */</span><br><span style="color: hsl(120, 100%, 40%);">+                       Store (2, Local1)</span><br><span style="color: hsl(120, 100%, 40%);">+                     While (LLess (Local1, Subtract (SizeOf (BRIG), 1))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         /* Local[23]: adjacent values in BRIG */</span><br><span style="color: hsl(120, 100%, 40%);">+                              Store (DeRefOf (Index (BRIG, Local1)), Local2)</span><br><span style="color: hsl(120, 100%, 40%);">+                                Store (DeRefOf (Index (BRIG, Add (Local1, 1))), Local3)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                             If (LLess (Local0, Local3)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                 If (LOr (LLess (Local0, Local2),</span><br><span style="color: hsl(120, 100%, 40%);">+                                               LLess (Subtract (Local0, Local2),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    Subtract (Local3, Local0)))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                Return (Local2)</span><br><span style="color: hsl(120, 100%, 40%);">+                                       } Else {</span><br><span style="color: hsl(120, 100%, 40%);">+                                              Return (Local3)</span><br><span style="color: hsl(120, 100%, 40%);">+                                       }</span><br><span>                            }</span><br><span style="color: hsl(0, 100%, 40%);">-                               Add (Local2, 1, Local2)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                             Increment (Local1)</span><br><span>                   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                  /* 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(120, 100%, 40%);">+                       Return (Local3)</span><br><span>              }</span><br><span>    }</span><br><span> </span><br><span>@@ -168,11 +154,10 @@</span><br><span> </span><br><span>    Method (XBQC, 0, NotSerialized)</span><br><span>      {</span><br><span style="color: hsl(0, 100%, 40%);">-               Store (^BOX3.XBQC (), Local0)</span><br><span style="color: hsl(0, 100%, 40%);">-           If (LEqual(Local0, Ones))</span><br><span style="color: hsl(0, 100%, 40%);">-               {</span><br><span style="color: hsl(0, 100%, 40%);">-                       Store (^LEGA.XBQC (), Local0)</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               Return (Local0)</span><br><span style="color: hsl(120, 100%, 40%);">+               /*</span><br><span style="color: hsl(120, 100%, 40%);">+             * Always query the hardware directly. Not all OS drivers</span><br><span style="color: hsl(120, 100%, 40%);">+              * keep CBLV up to date (one is Linux' i915). Some years</span><br><span style="color: hsl(120, 100%, 40%);">+           * after that is fixed we can probably use CBLV?</span><br><span style="color: hsl(120, 100%, 40%);">+               */</span><br><span style="color: hsl(120, 100%, 40%);">+           Return (^LEGA.XBQC ())</span><br><span>       }</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/28301">change 28301</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/28301"/><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: I4e2d8fa34e75463d4cf7242af3e2c67577cfa2a5 </div>
<div style="display:none"> Gerrit-Change-Number: 28301 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Nico Huber <nico.h@gmx.de> </div>