/**@file

Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#define PCH_LP_GPIO_GET_FIELD(GpioGroupIndex,GpioFieldIndex) \
  ( \
    DeRefOf(Index( \
      DeRefOf(Index( \
        GPCL, \
        GpioGroupIndex)), \
      GpioFieldIndex)) \
  )

#define PCH_H_GPIO_GET_FIELD(GpioGroupIndex,GpioFieldIndex) \
  ( \
    DeRefOf(Index( \
      DeRefOf(Index( \
        GPCH, \
        GpioGroupIndex)), \
      GpioFieldIndex)) \
  )

//
// GPIO Library objects
//
Scope(\_SB)
{

  //
  // GPIO information data structure
  //
  // PCH-LP: GPCL
  // PCH-H:  GPCH
  //
  // GPCx[GroupIndex][Field]
  //   Field0 - Community
  //   Field1 - Pad number
  //   Field2 - PADCFG register offset
  //   Field3 - HOSTSW_OWN register offset
  //   Field4 - PAD_OWN register offset
  //   Field5 - GPI_GPE_STS register offset
  //
  //
  // GPIO information data structure for PCH-LP
  //
  Name(GPCL, Package(){
    Package(){ // GPP_A
      PCH_GPIO_COM0,
      V_PCH_GPIO_GPP_A_PAD_MAX,
      R_PCH_PCR_GPIO_GPP_A_PADCFG_OFFSET,
      R_PCH_PCR_GPIO_GPP_A_HOSTSW_OWN,
      R_PCH_LP_PCR_GPIO_GPP_A_PAD_OWN,
      R_PCH_PCR_GPIO_GPP_A_GPI_GPE_STS
    },
    Package(){ // GPP_B
      PCH_GPIO_COM0,
      V_PCH_GPIO_GPP_B_PAD_MAX,
      R_PCH_PCR_GPIO_GPP_B_PADCFG_OFFSET,
      R_PCH_PCR_GPIO_GPP_B_HOSTSW_OWN,
      R_PCH_LP_PCR_GPIO_GPP_B_PAD_OWN,
      R_PCH_PCR_GPIO_GPP_B_GPI_GPE_STS
    },
    Package(){ // GPP_C
      PCH_GPIO_COM1,
      V_PCH_GPIO_GPP_C_PAD_MAX,
      R_PCH_PCR_GPIO_GPP_C_PADCFG_OFFSET,
      R_PCH_PCR_GPIO_GPP_C_HOSTSW_OWN,
      R_PCH_LP_PCR_GPIO_GPP_C_PAD_OWN,
      R_PCH_PCR_GPIO_GPP_C_GPI_GPE_STS
    },
    Package(){ // GPP_D
      PCH_GPIO_COM1,
      V_PCH_GPIO_GPP_D_PAD_MAX,
      R_PCH_PCR_GPIO_GPP_D_PADCFG_OFFSET,
      R_PCH_PCR_GPIO_GPP_D_HOSTSW_OWN,
      R_PCH_LP_PCR_GPIO_GPP_D_PAD_OWN,
      R_PCH_PCR_GPIO_GPP_D_GPI_GPE_STS
    },
    Package(){ // GPP_E
      PCH_GPIO_COM1,
      V_PCH_LP_GPIO_GPP_E_PAD_MAX,
      R_PCH_PCR_GPIO_GPP_E_PADCFG_OFFSET,
      R_PCH_PCR_GPIO_GPP_E_HOSTSW_OWN,
      R_PCH_LP_PCR_GPIO_GPP_E_PAD_OWN,
      R_PCH_PCR_GPIO_GPP_E_GPI_GPE_STS
    },
    Package(){ // GPP_F
      PCH_GPIO_COM3,
      V_PCH_GPIO_GPP_F_PAD_MAX,
      R_PCH_LP_PCR_GPIO_GPP_F_PADCFG_OFFSET,
      R_PCH_LP_PCR_GPIO_GPP_F_HOSTSW_OWN,
      R_PCH_LP_PCR_GPIO_GPP_F_PAD_OWN,
      R_PCH_LP_PCR_GPIO_GPP_F_GPI_GPE_STS
    },
    Package(){ // GPP_G
      PCH_GPIO_COM3,
      V_PCH_LP_GPIO_GPP_G_PAD_MAX,
      R_PCH_LP_PCR_GPIO_GPP_G_PADCFG_OFFSET,
      R_PCH_LP_PCR_GPIO_GPP_G_HOSTSW_OWN,
      R_PCH_LP_PCR_GPIO_GPP_G_PAD_OWN,
      R_PCH_LP_PCR_GPIO_GPP_G_GPI_GPE_STS
    },
    Package(){ // GPD
      PCH_GPIO_COM2,
      V_PCH_GPIO_GPD_PAD_MAX,
      R_PCH_PCR_GPIO_GPD_PADCFG_OFFSET,
      R_PCH_PCR_GPIO_GPD_HOSTSW_OWN,
      R_PCH_LP_PCR_GPIO_GPD_PAD_OWN,
      R_PCH_PCR_GPIO_GPD_GPI_GPE_STS
    }
  })

  //
  // GPIO information data structure for PCH-H
  //
  Name(GPCH, Package(){
    Package(){ // GPP_A
      PCH_GPIO_COM0,
      V_PCH_GPIO_GPP_A_PAD_MAX,
      R_PCH_PCR_GPIO_GPP_A_PADCFG_OFFSET,
      R_PCH_PCR_GPIO_GPP_A_HOSTSW_OWN,
      R_PCH_H_PCR_GPIO_GPP_A_PAD_OWN,
      R_PCH_PCR_GPIO_GPP_A_GPI_GPE_STS
    },
    Package(){ // GPP_B
      PCH_GPIO_COM0,
      V_PCH_GPIO_GPP_B_PAD_MAX,
      R_PCH_PCR_GPIO_GPP_B_PADCFG_OFFSET,
      R_PCH_PCR_GPIO_GPP_B_HOSTSW_OWN,
      R_PCH_H_PCR_GPIO_GPP_B_PAD_OWN,
      R_PCH_PCR_GPIO_GPP_B_GPI_GPE_STS
    },
    Package(){ // GPP_C
      PCH_GPIO_COM1,
      V_PCH_GPIO_GPP_C_PAD_MAX,
      R_PCH_PCR_GPIO_GPP_C_PADCFG_OFFSET,
      R_PCH_PCR_GPIO_GPP_C_HOSTSW_OWN,
      R_PCH_H_PCR_GPIO_GPP_C_PAD_OWN,
      R_PCH_PCR_GPIO_GPP_C_GPI_GPE_STS
      },
    Package(){ // GPP_D
      PCH_GPIO_COM1,
      V_PCH_GPIO_GPP_D_PAD_MAX,
      R_PCH_PCR_GPIO_GPP_D_PADCFG_OFFSET,
      R_PCH_PCR_GPIO_GPP_D_HOSTSW_OWN,
      R_PCH_H_PCR_GPIO_GPP_D_PAD_OWN,
      R_PCH_PCR_GPIO_GPP_D_GPI_GPE_STS
    },
    Package(){ // GPP_E
      PCH_GPIO_COM1,
      V_PCH_H_GPIO_GPP_E_PAD_MAX,
      R_PCH_PCR_GPIO_GPP_E_PADCFG_OFFSET,
      R_PCH_PCR_GPIO_GPP_E_HOSTSW_OWN,
      R_PCH_H_PCR_GPIO_GPP_E_PAD_OWN,
      R_PCH_PCR_GPIO_GPP_E_GPI_GPE_STS
    },
    Package(){ // GPP_F
      PCH_GPIO_COM1,
      V_PCH_GPIO_GPP_F_PAD_MAX,
      R_PCH_H_PCR_GPIO_GPP_F_PADCFG_OFFSET,
      R_PCH_H_PCR_GPIO_GPP_F_HOSTSW_OWN,
      R_PCH_H_PCR_GPIO_GPP_F_PAD_OWN,
      R_PCH_H_PCR_GPIO_GPP_F_GPI_GPE_STS
    },
    Package(){ // GPP_G
      PCH_GPIO_COM1,
      V_PCH_H_GPIO_GPP_G_PAD_MAX,
      R_PCH_H_PCR_GPIO_GPP_G_PADCFG_OFFSET,
      R_PCH_H_PCR_GPIO_GPP_G_HOSTSW_OWN,
      R_PCH_H_PCR_GPIO_GPP_G_PAD_OWN,
      R_PCH_H_PCR_GPIO_GPP_G_GPI_GPE_STS
    },
    Package(){ // GPP_H
      PCH_GPIO_COM1,
      V_PCH_H_GPIO_GPP_H_PAD_MAX,
      R_PCH_H_PCR_GPIO_GPP_H_PADCFG_OFFSET,
      R_PCH_H_PCR_GPIO_GPP_H_HOSTSW_OWN,
      R_PCH_H_PCR_GPIO_GPP_H_PAD_OWN,
      R_PCH_H_PCR_GPIO_GPP_H_GPI_GPE_STS
    },
    Package(){ // GPP_I
      PCH_GPIO_COM3,
      V_PCH_H_GPIO_GPP_I_PAD_MAX,
      R_PCH_H_PCR_GPIO_GPP_I_PADCFG_OFFSET,
      R_PCH_H_PCR_GPIO_GPP_I_HOSTSW_OWN,
      R_PCH_H_PCR_GPIO_GPP_I_PAD_OWN,
      R_PCH_H_PCR_GPIO_GPP_I_GPI_GPE_STS
    },
    Package(){ // GPD
      PCH_GPIO_COM2,
      V_PCH_GPIO_GPD_PAD_MAX,
      R_PCH_PCR_GPIO_GPD_PADCFG_OFFSET,
      R_PCH_PCR_GPIO_GPD_HOSTSW_OWN,
      R_PCH_H_PCR_GPIO_GPD_PAD_OWN,
      R_PCH_PCR_GPIO_GPD_GPI_GPE_STS
    }
  })

  //
  // Object for storing RX Level/Edge Configuration for all pads.
  // One fields contains data for one pad.
  //   00b = Level
  //   01b = Edge (RxInv=0 for rising edge; 1 for falling edge)
  //   10b = Disabled
  //   11b = Either rising edge or falling edge
  //
  // Each row has data for one group. Buffer size needs
  // to equal to number of pads
  Name(RXEV, Package(){
    Buffer(V_PCH_GPIO_GPP_A_PAD_MAX){},   // GPP_A
    Buffer(V_PCH_GPIO_GPP_B_PAD_MAX){},   // GPP_B
    Buffer(V_PCH_GPIO_GPP_C_PAD_MAX){},   // GPP_C
    Buffer(V_PCH_GPIO_GPP_D_PAD_MAX){},   // GPP_D
    Buffer(V_PCH_GPIO_GPP_E_PAD_MAX){},   // GPP_E
    Buffer(V_PCH_GPIO_GPP_F_PAD_MAX){},   // GPP_F
    Buffer(V_PCH_GPIO_GPP_G_PAD_MAX){},   // GPP_G
    Buffer(V_PCH_H_GPIO_GPP_H_PAD_MAX){}, // PCH-H GPP_H, PCH-LP GPD
    Buffer(V_PCH_H_GPIO_GPP_I_PAD_MAX){}, // PCH-H GPP_I, PCH-LP not used
    Buffer(V_PCH_GPIO_GPD_PAD_MAX){}      // PCH-H GPD,   PCH-LP not used
  })
}