/*++

Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved

  This program and the accompanying materials are licensed and made available under
  the terms and conditions of the BSD License that accompanies this distribution.
  The full text of the license may be found at
  http://opensource.org/licenses/bsd-license.php.

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.



Module Name:

  IgdOpRn.ASL

Abstract:

  IGD OpRegion/Software SCI Reference Code for the Baytrail Family.
  This file contains the interrupt handler code for the Integrated
  Graphics Device (IGD) OpRegion/Software SCI mechanism.

--*/


//NOTES:
//
// (1)  The code contained in this file inherits the scope in which it
//      was included.  So BIOS developers must be sure to include this
//      file in the scope associated with the graphics device
//      (ex. \_SB.PCI0.GFX0).
// (2)  Create a _L06 method under the GPE scope to handle the event
//      generated by the graphics driver.  The _L06 method must call
//      the GSCI method in this file.
// (3)  The MCHP operation region assumes that _ADR and _BBN names
//      corresponding to bus 0, device0, function 0 have been declared
//      under the PCI0 scope.
// (4)  Before the first execution of the GSCI method, the base address
//      of the GMCH SCI OpRegion must be programmed where the driver can
//      access it. A 32bit scratch register at 0xFC in the IGD PCI
//      configuration space (B0/D2/F0/R0FCh) is used for this purpose.

//  Define an OperationRegion to cover the GMCH PCI configuration space as
//  described in the IGD OpRegion specificiation.

//  Define an OperationRegion to cover the IGD PCI configuration space as
//  described in the IGD OpRegion specificiation.

OperationRegion(IGDP, PCI_Config,0x00,0x100)
Field(IGDP, AnyAcc, NoLock, Preserve)
{
  Offset(0x10),  // GTTMMADR
  MADR,   32,
  Offset(0x50),  // GMCH Graphics Control Register
  ,   1,
  GIVD,   1,     // IGD VGA disable bit
  ,   1,
  GUMA,   5,     // Stolen memory size
  ,   8,
  Offset(0x54),
  ,   4,
  GMFN,   1,     // Gfx function 1 enable
  ,   27,
  Offset(0x5C),  // Stolen Memory Base Address
  GSTM,   32,
  Offset(0xE0),  // Reg 0xE8, SWSCI control register
  GSSE,   1,     // Graphics SCI event (1=event pending)
  GSSB,   14,    // Graphics SCI scratchpad bits
  GSES,   1,     // Graphics event select (1=SCI)
  Offset(0xE4),
  ASLE,   8,     // Reg 0xE4, ASLE interrupt register
  ,   24,    // Only use first byte of ASLE reg
  Offset(0xFC),
  ASLS,   32,    // Reg 0xFC, Address of the IGD OpRegion
}

Method (MCHK, 0, Serialized)
{

  If (LNotEqual (MADR, 0xFFFFFFFF))
  {
    OperationRegion(IGMM,SystemMemory,MADR,0x3000)
    Field(IGMM,AnyAcc, NoLock, Preserve)
    {
      Offset(0X20C8),
      ,    4,
      DCFE,    4,                     // DISPLAY_CLOCK_FREQUENCY_ENCODING
    }
  }
}


//  Define an OperationRegion to cover the IGD OpRegion layout.

OperationRegion(IGDM, SystemMemory, ASLB, 0x2000)
Field(IGDM, AnyAcc, NoLock, Preserve)
{

  // OpRegion Header

  SIGN,   128,                    // Signature-"IntelGraphicsMem"
  SIZE,   32,                     // OpRegion Size
  OVER,   32,                     // OpRegion Version
  SVER,   256,                    // System BIOS Version
  VVER,   128,                    // VBIOS Version
  GVER,   128,                    // Driver version
  MBOX,   32,                     // Mailboxes supported
  DMOD,   32,                     // Driver Model
  PCON,   32,                     // 96, Platform Configuration

  // OpRegion Mailbox 1 (Public ACPI Methods)
  // Note: Mailbox 1 is normally reserved for desktop platforms.

  Offset(0x100),
  DRDY,   32,                     // Driver readiness (ACPI notification)
  CSTS,   32,                     // Notification status
  CEVT,   32,                     // Current event
  Offset(0x120),
  DIDL,   32,                     // Supported display device ID list
  DDL2,   32,                     // Allows for 8 devices
  DDL3,   32,
  DDL4,   32,
  DDL5,   32,
  DDL6,   32,
  DDL7,   32,
  DDL8,   32,
  CPDL,   32,                     // Currently present display list
  CPL2,   32,                     // Allows for 8 devices
  CPL3,   32,
  CPL4,   32,
  CPL5,   32,
  CPL6,   32,
  CPL7,   32,
  CPL8,   32,
  CAD1,   32,                     // Currently active display list
  CAL2,   32,                     // Allows for 8 devices
  CAL3,   32,
  CAL4,   32,
  CAL5,   32,
  CAL6,   32,
  CAL7,   32,
  CAL8,   32,
  NADL,   32,                     // Next active display list
  NDL2,   32,                     // Allows for 8 devices
  NDL3,   32,
  NDL4,   32,
  NDL5,   32,
  NDL6,   32,
  NDL7,   32,
  NDL8,   32,
  ASLP,   32,                     // ASL sleep timeout
  TIDX,   32,                     // Toggle table index
  CHPD,   32,                     // Current hot plug enable indicator
  CLID,   32,                     // Current lid state indicator
  CDCK,   32,                     // Current docking state indicator
  SXSW,   32,                     // Display switch notify on resume
  EVTS,   32,                     // Events supported by ASL (diag only)
  CNOT,   32,                     // Current OS notifications (diag only)
  NRDY,   32,

  // OpRegion Mailbox 2 (Software SCI Interface)

  Offset(0x200),                  // SCIC
  SCIE,   1,                      // SCI entry bit (1=call unserviced)
  GEFC,   4,                      // Entry function code
  GXFC,   3,                      // Exit result
  GESF,   8,                      // Entry/exit sub-function/parameter
  ,   16,                     // SCIC[31:16] reserved
  Offset(0x204),                  // PARM
  PARM,   32,                     // PARM register (extra parameters)
  DSLP,   32,                     // Driver sleep time out

  // OpRegion Mailbox 3 (BIOS to Driver Notification)
  // Note: Mailbox 3 is normally reserved for desktop platforms.

  Offset(0x300),
  ARDY,   32,                     // Driver readiness (power conservation)
  ASLC,   32,                     // ASLE interrupt command/status
  TCHE,   32,                     // Technology enabled indicator
  ALSI,   32,                     // Current ALS illuminance reading
  BCLP,   32,                     // Backlight brightness
  PFIT,   32,                     // Panel fitting state or request
  CBLV,   32,                     // Current brightness level
  BCLM,   320,                    // Backlight brightness level duty cycle mapping table
  CPFM,   32,                     // Current panel fitting mode
  EPFM,   32,                     // Enabled panel fitting modes
  PLUT,   592,                    // Optional. 74-byte Panel LUT Table
  PFMB,   32,                     // Optional. PWM Frequency and Minimum Brightness
  CCDV,   32,                     // Optional. Gamma, Brightness, Contrast values.
  PCFT,   32,                     // Optional. Power Conservation Features

  Offset(0x3B6),
  STAT,   32,                     // Status register

  // OpRegion Mailbox 4 (VBT)

  Offset(0x400),
  GVD1,   0xC000,                 // 6K bytes maximum VBT image

  // OpRegion Mailbox 5 (BIOS to Driver Notification Extension)

  Offset(0x1C00),
  PHED,   32,                     // Panel Header
  BDDC,   2048,                   // Panel EDID (Max 256 bytes)

}



// Convert boot display type into a port mask.

Name (DBTB, Package()
{
  0x0000,                         // Automatic
  0x0007,                         // Port-0 : Integrated CRT
  0x0038,                         // Port-1 : DVO-A, or Integrated LVDS
  0x01C0,                         // Port-2 : SDVO-B, or SDVO-B/C
  0x0E00,                         // Port-3 : SDVO-C
  0x003F,                         // [CRT + DVO-A / Integrated LVDS]
  0x01C7,                         // [CRT + SDVO-B] or [CRT + SDVO-B/C]
  0x0E07,                         // [CRT + SDVO-C]
  0x01F8,                         // [DVO-A / Integrated LVDS + SDVO-B]
  0x0E38,                         // [DVO-A / Integrated LVDS + SDVO-C]
  0x0FC0,                         // [SDVO-B + SDVO-C]
  0x0000,                         // Reserved
  0x0000,                         // Reserved
  0x0000,                         // Reserved
  0x0000,                         // Reserved
  0x0000,                         // Reserved
  0x7000,                         // Port-4: Integrated TV
  0x7007,                         // [Integrated TV + CRT]
  0x7038,                         // [Integrated TV + LVDS]
  0x71C0,                         // [Integrated TV + DVOB]
  0x7E00                          // [Integrated TV + DVOC]
})

// Core display clock value table.

Name (CDCT, Package()
{
  Package() {160},
  Package() {200},
  Package() {267},
  Package() {320},
  Package() {356},
  Package() {400},
})

// Defined exit result values:

Name (SUCC, 1)                          // Exit result: Success
Name (NVLD, 2)                          // Exit result: Invalid parameter
Name (CRIT, 4)                          // Exit result: Critical failure
Name (NCRT, 6)                          // Exit result: Non-critical failure


/************************************************************************;
;*
;* Name: GSCI
;*
;* Description: Handles an SCI generated by the graphics driver.  The
;*              PARM and SCIC input fields are parsed to determine the
;*              functionality requested by the driver.  GBDA or SBCB
;*              is called based on the input data in SCIC.
;*
;* Usage:       The method must be called in response to a GPE 06 event
;*              which will be generated by the graphics driver.
;*              Ex: Method(\_GPE._L06) {Return(\_SB.PCI0.GFX0.GSCI())}
;*
;* Input:       PARM and SCIC are indirect inputs
;*
;* Output:      PARM and SIC are indirect outputs
;*
;* References:  GBDA (Get BIOS Data method), SBCB (System BIOS Callback
;*              method)
;*
;************************************************************************/

Method (GSCI, 0, Serialized)
{
  Include("IgdOGBDA.ASL") // "Get BIOS Data" Functions
  Include("IgdOSBCB.ASL") // "System BIOS CallBacks"

  If (LEqual(GEFC, 4))
  {
    Store(GBDA(), GXFC)     // Process Get BIOS Data functions
  }

  If (LEqual(GEFC, 6))
  {
    Store(SBCB(), GXFC)     // Process BIOS Callback functions
  }

  Store(0, GEFC)                  // Wipe out the entry function code
  Store(1, SCIS)                  // Clear the GUNIT SCI status bit in PCH ACPI I/O space.
  Store(0, GSSE)                  // Clear the SCI generation bit in PCI space.
  Store(0, SCIE)                  // Clr SCI serviced bit to signal completion

  Return(Zero)
}

// Include MOBLFEAT.ASL for mobile systems only.  Remove for desktop.
Include("IgdOMOBF.ASL")     // IGD SCI mobile features
