drvs/intel/gma/acpi: Add methods to use MBOX3

* Add Mailbox 3 driver
* Request brightness change through Mailbox 3
* Return Ones on error or if unsupported
* Mark existing code as legacy
  (still required if no GMA driver is running)
* Call legacy code if Mailbox 3 is unsupported, on error or
  if gma driver isn't running

Tested on Lenovo T430:
* Brightness control still works
* Brightness is the same on S3 resume

Change-Id: I51554c819148336b204d28972cbf775a10c3fb8a
Signed-off-by: Patrick Rudolph <siro@das-labor.org>
Reviewed-on: https://review.coreboot.org/27711
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Matt DeVillier <matt.devillier@gmail.com>
Reviewed-by: Nathaniel Roach <nroach44@gmail.com>
Reviewed-by: Nicola Corna <nicola@corna.info>
Reviewed-by: Felix Held <felix-coreboot@felixheld.de>
This commit is contained in:
Patrick Rudolph 2018-07-29 10:53:01 +02:00 committed by Felix Held
parent bce49c2304
commit 6838aaebf9
4 changed files with 183 additions and 20 deletions

View File

@ -44,8 +44,11 @@
Store (And(Arg0, 7), DSEN) Store (And(Arg0, 7), DSEN)
} }
/* Using Notify is the right way. But Windows doesn't handle /*
it well. So use both method in a way to avoid double action. * Decrement display brightness.
*
* Using Notify is the right way. But Windows doesn't handle
* it well. So use both method in a way to avoid double action.
*/ */
Method (DECB, 0, NotSerialized) Method (DECB, 0, NotSerialized)
{ {
@ -62,6 +65,9 @@
} }
} }
/*
* Increment display brightness.
*/
Method (INCB, 0, NotSerialized) Method (INCB, 0, NotSerialized)
{ {
If (BRCT) If (BRCT)

View File

@ -1,24 +1,173 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2015 Nico Huber <nico.huber@secunet.com>
* Copyright (C) 2018 Patrick Rudolph
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
/*
* Pseudo device that contains methods to modify Opregion
* "Mailbox 3 BIOS to Driver Notification"
* The BIOS to Driver Notification mailbox is intended to support
* BIOS to Driver event notification or data storage for BIOS to
* Driver data synchronization purpose.
*/
Device (BOX3)
{
Name (_ADR, 0)
OperationRegion (OPRG, SystemMemory, ASLS, 0x2000)
Field (OPRG, DWordAcc, NoLock, Preserve)
{
// OpRegion Header
Offset (0x58),
MBOX, 32,
// Mailbox 3
Offset (0x300),
ARDY, 1, /* Offset 0 Driver readiness */
, 31,
ASLC, 32, /* Offset 4 ASLE interrupt command / status */
TCHE, 32, /* Offset 8 Technology enabled indicator */
ALSI, 32, /* Offset 12 Current ALS illuminance reading */
BCLP, 32, /* Offset 16 Backlight britness to set */
PFIT, 32, /* Offset 20 Panel fitting Request */
CBLV, 32, /* Offset 24 Brightness Current State */
}
/*
* Request back-light brightness change through mailbox 3
*
* @param Arg0 The brightness level to set in percent
* @Return Zero on success, Ones on failure
* Errors: * ASLS is zero
* * Mailbox 3 support not advertised
* * Driver not loaded or not ready
* * Driver reported an error during ASLE IRQ
*/
Method (XBCM, 1, NotSerialized)
{
If (LEqual(ASLS, Zero))
{
Return (Ones)
}
If (LEqual(And(MBOX, 0x4), Zero))
{
Return (Ones)
}
If (LEqual(ARDY, Zero))
{
Return (Ones)
}
Store (Or (Arg0, 0x80000000), BCLP)
/* Request back-light change */
Store (0x2, ASLC)
/* Trigger IRQ */
Store (0x1, ASLE)
Store (0x20, Local0)
While (LGreater(Local0, Zero))
{
Sleep (1)
If (LEqual(And(ShiftRight(ASLC, 12), 0x3), Zero))
{
Return (Zero)
}
Decrement (Local0)
}
Return (Ones)
}
/*
* Get current back-light brightness through mailbox 3
*
* @Return The current brightness or Ones on error
* Errors: * ASLS is zero
* * Mailbox 3 support not advertised
* * Driver not loaded or not ready
* * CBLV is not marked valid
*/
Method (XBQC, 0, NotSerialized)
{
If (LEqual(ASLS, Zero))
{
Return (Ones)
}
If (LEqual(And(MBOX, 0x4), Zero))
{
Return (Ones)
}
If (LEqual(ARDY, Zero))
{
Return (Ones)
}
If (LEqual(And (CBLV, 0x80000000), Zero))
{
Return (Ones)
}
Return (And (CBLV, 0xff))
}
}
/*
* Pseudo device that contains methods to operate on GTT memory
*/
Device (LEGA)
{
Name (_ADR, 0)
Method (XBCM, 1, NotSerialized)
{
Store (Divide (Multiply (Arg0, BCLM), 100), BCLV)
}
Method (XBQC, 0, NotSerialized)
{
/* Find value close to BCLV in BRIG (which must be ordered) */
Store (BCLV, Local0) // Current value
Store (BCLM, Local1) // For calculations
Store (2, Local2) // Loop index
While (LLess (Local2, Subtract (SizeOf (BRIG), 1))) {
Store (DeRefOf (Index (BRIG, Local2)), Local3)
/* Use same calculation as XBCM, to get exact matches */
Store (Divide (Multiply (Local3, Local1), 100), Local3)
If (LLessEqual (Local0, Local3)) {
Return (DeRefOf (Index (BRIG, Local2)))
}
Add (Local2, 1, Local2)
}
/* Didn't find greater/equal value: use the last */
Return (DeRefOf (Index (BRIG, Local2)))
}
}
Method (XBCM, 1, NotSerialized) Method (XBCM, 1, NotSerialized)
{ {
Store (Divide (Multiply (Arg0, BCLM), 100), BCLV) If (LEqual(^BOX3.XBCM (Arg0), Ones))
{
^LEGA.XBCM (Arg0)
}
} }
Method (XBQC, 0, NotSerialized) Method (XBQC, 0, NotSerialized)
{ {
/* Find value close to BCLV in BRIG (which must be ordered) */ Store (^BOX3.XBQC (), Local0)
Store (BCLV, Local0) // Current value If (LEqual(Local0, Ones))
Store (BCLM, Local1) // For calculations {
Store (2, Local2) // Loop index Store (^LEGA.XBQC (), Local0)
While (LLess (Local2, Subtract (SizeOf (BRIG), 1))) {
Store (DeRefOf (Index (BRIG, Local2)), Local3)
/* Use same calculation as XBCM, to get exact matches */
Store (Divide (Multiply (Local3, Local1), 100), Local3)
If (LLessEqual (Local0, Local3)) {
Return (DeRefOf (Index (BRIG, Local2)))
}
Add (Local2, 1, Local2)
} }
/* Didn't find greater/equal value: use the last */
Return (DeRefOf (Index (BRIG, Local2))) Return (Local0)
} }

View File

@ -22,7 +22,11 @@ Device (GFX0)
Field (GFXC, DWordAcc, NoLock, Preserve) Field (GFXC, DWordAcc, NoLock, Preserve)
{ {
Offset (0x10), Offset (0x10),
BAR0, 64 BAR0, 64,
Offset (0xe4),
ASLE, 32,
Offset (0xfc),
ASLS, 32,
} }
OperationRegion (GFRG, SystemMemory, And (BAR0, 0xfffffffffffffff0), 0x400000) OperationRegion (GFRG, SystemMemory, And (BAR0, 0xfffffffffffffff0), 0x400000)

View File

@ -22,7 +22,11 @@ Device (GFX0)
Field (GFXC, DWordAcc, NoLock, Preserve) Field (GFXC, DWordAcc, NoLock, Preserve)
{ {
Offset (0x10), Offset (0x10),
BAR0, 64 BAR0, 64,
Offset (0xe4),
ASLE, 32,
Offset (0xfc),
ASLS, 32,
} }
OperationRegion (GFRG, SystemMemory, And (BAR0, 0xfffffffffffffff0), 0x400000) OperationRegion (GFRG, SystemMemory, And (BAR0, 0xfffffffffffffff0), 0x400000)