mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-10-31 11:23:00 +00:00 
			
		
		
		
	 3cbfba02fe
			
		
	
	
		3cbfba02fe
		
	
	
	
	
		
			
			https://svn.code.sf.net/p/edk2/code/trunk/edk2/, which are for MinnowBoard MAX open source project. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: David Wei <david.wei@intel.com> Reviewed-by: Mike Wu <mike.wu@intel.com> Reviewed-by: Hot Tian <hot.tian@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16599 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			527 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			527 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /**
 | |
| 
 | |
| Copyright (c) 2012  - 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.
 | |
| 
 | |
| 
 | |
| 
 | |
|   @file
 | |
|   PchAccess.h
 | |
| 
 | |
|   @brief
 | |
|   Macros that simplify accessing PCH devices's PCI registers.
 | |
| 
 | |
|   ** NOTE ** these macros assume the PCH device is on BUS 0
 | |
| 
 | |
| **/
 | |
| #ifndef _PCH_ACCESS_H_
 | |
| #define _PCH_ACCESS_H_
 | |
| 
 | |
| #include "PchRegs.h"
 | |
| #include "PchCommonDefinitions.h"
 | |
| 
 | |
| #ifndef STALL_ONE_MICRO_SECOND
 | |
| #define STALL_ONE_MICRO_SECOND 1
 | |
| #endif
 | |
| #ifndef STALL_ONE_SECOND
 | |
| #define STALL_ONE_SECOND 1000000
 | |
| #endif
 | |
| 
 | |
| ///
 | |
| /// Memory Mapped PCI Access macros
 | |
| ///
 | |
| ///
 | |
| /// PCI Device MM Base
 | |
| ///
 | |
| #ifndef MmPciAddress
 | |
| #define MmPciAddress(Segment, Bus, Device, Function, Register) \
 | |
|   ((UINTN) PatchPcdGet64 (PcdPciExpressBaseAddress) + \
 | |
|    (UINTN) (Bus << 20) + \
 | |
|    (UINTN) (Device << 15) + \
 | |
|    (UINTN) (Function << 12) + \
 | |
|    (UINTN) (Register) \
 | |
|   )
 | |
| #endif
 | |
| ///
 | |
| /// Pch Controller PCI access macros
 | |
| ///
 | |
| #define PCH_RCRB_BASE ( \
 | |
|   MmioRead32 (MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_LPC, \
 | |
|   PCI_FUNCTION_NUMBER_PCH_LPC), \
 | |
|   R_PCH_LPC_RCBA)) & B_PCH_LPC_RCBA_BAR \
 | |
|   )
 | |
| 
 | |
| ///
 | |
| /// Device 0x1b, Function 0
 | |
| ///
 | |
| #define PchAzaliaPciCfg32(Register) \
 | |
|   MmioRead32 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_AZALIA, \
 | |
|   0, \
 | |
|   Register) \
 | |
|   )
 | |
| 
 | |
| #define PchAzaliaPciCfg32Or(Register, OrData) \
 | |
|   MmioOr32 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_AZALIA, \
 | |
|   0, \
 | |
|   Register), \
 | |
|   OrData \
 | |
|   )
 | |
| 
 | |
| #define PchAzaliaPciCfg32And(Register, AndData) \
 | |
|   MmioAnd32 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_AZALIA, \
 | |
|   0, \
 | |
|   Register), \
 | |
|   AndData \
 | |
|   )
 | |
| 
 | |
| #define PchAzaliaPciCfg32AndThenOr(Register, AndData, OrData) \
 | |
|   MmioAndThenOr32 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_AZALIA, \
 | |
|   0, \
 | |
|   Register), \
 | |
|   OrData \
 | |
|   )
 | |
| 
 | |
| #define PchAzaliaPciCfg16(Register) \
 | |
|   MmioRead16 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_AZALIA, \
 | |
|   0, \
 | |
|   Register) \
 | |
|   )
 | |
| 
 | |
| #define PchAzaliaPciCfg16Or(Register, OrData) \
 | |
|   MmioOr16 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_AZALIA, \
 | |
|   0, \
 | |
|   Register), \
 | |
|   OrData \
 | |
|   )
 | |
| 
 | |
| #define PchAzaliaPciCfg16And(Register, AndData) \
 | |
|   MmioAnd16 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_AZALIA, \
 | |
|   0, \
 | |
|   Register), \
 | |
|   AndData \
 | |
|   )
 | |
| 
 | |
| #define PchAzaliaPciCfg16AndThenOr(Register, AndData, OrData) \
 | |
|   MmioAndThenOr16 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_AZALIA, \
 | |
|   0, \
 | |
|   Register), \
 | |
|   AndData, \
 | |
|   OrData \
 | |
|   )
 | |
| 
 | |
| #define PchAzaliaPciCfg8(Register)  MmioRead8 (MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_AZALIA, 0, Register))
 | |
| 
 | |
| #define PchAzaliaPciCfg8Or(Register, OrData) \
 | |
|   MmioOr8 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_AZALIA, \
 | |
|   0, \
 | |
|   Register), \
 | |
|   OrData \
 | |
|   )
 | |
| 
 | |
| #define PchAzaliaPciCfg8And(Register, AndData) \
 | |
|   MmioAnd8 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_AZALIA, \
 | |
|   0, \
 | |
|   Register), \
 | |
|   AndData \
 | |
|   )
 | |
| 
 | |
| #define PchAzaliaPciCfg8AndThenOr(Register, AndData, OrData) \
 | |
|   MmioAndThenOr8 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_AZALIA, \
 | |
|   0, \
 | |
|   Register), \
 | |
|   AndData, \
 | |
|   OrData \
 | |
|   )
 | |
| 
 | |
| ///
 | |
| /// Device 0x1f, Function 0
 | |
| ///
 | |
| #define PchLpcPciCfg32(Register)  MmioRead32 (MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPC, 0, Register))
 | |
| 
 | |
| #define PchLpcMmioOr32 (Register, OrData) \
 | |
|   MmioOr32 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_LPC, \
 | |
|   0, \
 | |
|   Register), \
 | |
|   OrData \
 | |
|   )
 | |
| 
 | |
| #define PchLpcPciCfg32And(Register, AndData) \
 | |
|   MmioAnd32 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_LPC, \
 | |
|   0, \
 | |
|   Register), \
 | |
|   AndData \
 | |
|   )
 | |
| 
 | |
| #define PchLpcPciCfg32AndThenOr(Register, AndData, OrData) \
 | |
|   MmioAndThenOr32 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_LPC, \
 | |
|   0, \
 | |
|   Register), \
 | |
|   AndData, \
 | |
|   OrData \
 | |
|   )
 | |
| 
 | |
| #define PchLpcPciCfg16(Register)  MmioRead16 (MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPC, 0, Register))
 | |
| 
 | |
| #define PchLpcPciCfg16Or(Register, OrData) \
 | |
|   MmioOr16 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_LPC, \
 | |
|   0, \
 | |
|   Register), \
 | |
|   OrData \
 | |
|   )
 | |
| 
 | |
| #define PchLpcPciCfg16And(Register, AndData) \
 | |
|   MmioAndThenOr16 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_LPC, \
 | |
|   0, \
 | |
|   Register), \
 | |
|   AndData \
 | |
|   )
 | |
| 
 | |
| #define PchLpcPciCfg16AndThenOr(Register, AndData, OrData) \
 | |
|   MmioAndThenOr16 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_LPC, \
 | |
|   0, \
 | |
|   Register), \
 | |
|   AndData, \
 | |
|   OrData \
 | |
|   )
 | |
| 
 | |
| #define PchLpcPciCfg8(Register) MmioRead8 (MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_LPC, 0, Register))
 | |
| 
 | |
| #define PchLpcPciCfg8Or(Register, OrData) \
 | |
|   MmioOr8 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_LPC, \
 | |
|   0, \
 | |
|   Register), \
 | |
|   OrData \
 | |
|   )
 | |
| 
 | |
| #define PchLpcPciCfg8And(Register, AndData) \
 | |
|   MmioAnd8 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_LPC, \
 | |
|   0, \
 | |
|   Register), \
 | |
|   AndData \
 | |
|   )
 | |
| 
 | |
| #define PchLpcPciCfg8AndThenOr(Register, AndData, OrData) \
 | |
|   MmioAndThenOr8 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_LPC, \
 | |
|   0, \
 | |
|   Register), \
 | |
|   AndData, \
 | |
|   OrData \
 | |
|   )
 | |
| 
 | |
| 
 | |
| ///
 | |
| /// SATA device 0x13, Function 0
 | |
| ///
 | |
| #define PchSataPciCfg32(Register) MmioRead32 (MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_SATA, PCI_FUNCTION_NUMBER_PCH_SATA, Register))
 | |
| 
 | |
| #define PchSataPciCfg32Or(Register, OrData) \
 | |
|   MmioOr32 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_SATA, \
 | |
|   PCI_FUNCTION_NUMBER_PCH_SATA, \
 | |
|   Register), \
 | |
|   OrData \
 | |
|   )
 | |
| 
 | |
| #define PchSataPciCfg32And(Register, AndData) \
 | |
|   MmioAnd32 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_SATA, \
 | |
|   PCI_FUNCTION_NUMBER_PCH_SATA, \
 | |
|   Register), \
 | |
|   AndData \
 | |
|   )
 | |
| 
 | |
| #define PchSataPciCfg32AndThenOr(Register, AndData, OrData) \
 | |
|   MmioAndThenOr32 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_SATA, \
 | |
|   PCI_FUNCTION_NUMBER_PCH_SATA, \
 | |
|   Register), \
 | |
|   AndData, \
 | |
|   OrData \
 | |
|   )
 | |
| 
 | |
| #define PchSataPciCfg16(Register) MmioRead16 (MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_SATA, PCI_FUNCTION_NUMBER_PCH_SATA, Register))
 | |
| 
 | |
| #define PchSataPciCfg16Or(Register, OrData) \
 | |
|   MmioOr16 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_SATA, \
 | |
|   PCI_FUNCTION_NUMBER_PCH_SATA, \
 | |
|   Register), \
 | |
|   OrData \
 | |
|   )
 | |
| 
 | |
| #define PchSataPciCfg16And(Register, AndData) \
 | |
|   MmioAndThenOr16 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_SATA, \
 | |
|   PCI_FUNCTION_NUMBER_PCH_SATA, \
 | |
|   Register), \
 | |
|   AndData \
 | |
|   )
 | |
| 
 | |
| #define PchSataPciCfg16AndThenOr(Register, AndData, OrData) \
 | |
|   MmioAndThenOr16 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_SATA, \
 | |
|   PCI_FUNCTION_NUMBER_PCH_SATA, \
 | |
|   Register), \
 | |
|   AndData, \
 | |
|   OrData \
 | |
|   )
 | |
| 
 | |
| #define PchSataPciCfg8(Register)  MmioRead8 (MmPciAddress (0, DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_SATA, PCI_FUNCTION_NUMBER_PCH_SATA, Register))
 | |
| 
 | |
| #define PchSataPciCfg8Or(Register, OrData) \
 | |
|   MmioOr8 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_SATA, \
 | |
|   PCI_FUNCTION_NUMBER_PCH_SATA, \
 | |
|   Register), \
 | |
|   OrData \
 | |
|   )
 | |
| 
 | |
| #define PchSataPciCfg8And(Register, AndData) \
 | |
|   MmioAnd8 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_SATA, \
 | |
|   PCI_FUNCTION_NUMBER_PCH_SATA, \
 | |
|   Register), \
 | |
|   AndData \
 | |
|   )
 | |
| 
 | |
| #define PchSataPciCfg8AndThenOr(Register, AndData, OrData) \
 | |
|   MmioAndThenOr8 ( \
 | |
|   MmPciAddress (0, \
 | |
|   DEFAULT_PCI_BUS_NUMBER_PCH, \
 | |
|   PCI_DEVICE_NUMBER_PCH_SATA, \
 | |
|   PCI_FUNCTION_NUMBER_PCH_SATA, \
 | |
|   Register), \
 | |
|   AndData, \
 | |
|   OrData \
 | |
|   )
 | |
| 
 | |
| 
 | |
| ///
 | |
| /// Root Complex Register Block
 | |
| ///
 | |
| #define PchMmRcrb32(Register)                           MmioRead32 (PCH_RCRB_BASE + Register)
 | |
| 
 | |
| #define PchMmRcrb32Or(Register, OrData)                 MmioOr32 (PCH_RCRB_BASE + Register, OrData)
 | |
| 
 | |
| #define PchMmRcrb32And(Register, AndData)               MmioAnd32 (PCH_RCRB_BASE + Register, AndData)
 | |
| 
 | |
| #define PchMmRcrb32AndThenOr(Register, AndData, OrData) MmioAndThenOr32 (PCH_RCRB_BASE + Register, AndData, OrData)
 | |
| 
 | |
| #define PchMmRcrb16(Register)                           MmioRead16 (PCH_RCRB_BASE + Register)
 | |
| 
 | |
| #define PchMmRcrb16Or(Register, OrData)                 MmioOr16 (PCH_RCRB_BASE + Register, OrData)
 | |
| 
 | |
| #define PchMmRcrb16And(Register, AndData)               MmioAnd16 (PCH_RCRB_BASE + Register, AndData)
 | |
| 
 | |
| #define PchMmRcrb16AndThenOr(Register, AndData, OrData) MmioAndThenOr16 (PCH_RCRB_BASE + Register, AndData, OrData)
 | |
| 
 | |
| #define PchMmRcrb8(Register)                            MmioRead8 (PCH_RCRB_BASE + Register)
 | |
| 
 | |
| #define PchMmRcrb8Or(Register, OrData)                  MmioOr8 (PCH_RCRB_BASE + Register, OrData)
 | |
| 
 | |
| #define PchMmRcrb8And(Register, AndData)                MmioAnd8 (PCH_RCRB_BASE + Register, AndData)
 | |
| 
 | |
| #define PchMmRcrb8AndThenOr(Register, AndData, OrData)  MmioAndThenOr8 (PCH_RCRB_BASE + Register, AndData, OrData)
 | |
| 
 | |
| 
 | |
| ///
 | |
| /// Message Bus
 | |
| ///
 | |
| 
 | |
| ///
 | |
| /// Message Bus Registers
 | |
| ///
 | |
| #define MC_MCR            0x000000D0 // Cunit Message Control Register
 | |
| #define MC_MDR            0x000000D4 // Cunit Message Data Register
 | |
| #define MC_MCRX           0x000000D8 // Cunit Message Control Register Extension
 | |
| 
 | |
| ///
 | |
| /// Message Bus API
 | |
| ///
 | |
| #define MSG_BUS_ENABLED   0x000000F0
 | |
| #define MSGBUS_MASKHI     0xFFFFFF00
 | |
| #define MSGBUS_MASKLO     0x000000FF
 | |
| #define MESSAGE_DWORD_EN  BIT4 | BIT5 | BIT6 | BIT7
 | |
| 
 | |
| #define PchMsgBusRead32(PortId, Register, Dbuff, ReadOpCode, WriteOpCode) \
 | |
| { \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCRX), (UINT32) (Register & MSGBUS_MASKHI)); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCR ), (UINT32) ((ReadOpCode << 24) | (PortId << 16) | ((Register & MSGBUS_MASKLO) << 8) | MESSAGE_DWORD_EN)); \
 | |
|   (Dbuff) = MmioRead32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MDR)); \
 | |
| }
 | |
| 
 | |
| #define PchMsgBusAnd32(PortId, Register, Dbuff, AndData, ReadOpCode, WriteOpCode) \
 | |
| { \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCRX), (UINT32) (Register & MSGBUS_MASKHI)); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCR ), (UINT32) ((ReadOpCode << 24) | (PortId << 16) | ((Register & MSGBUS_MASKLO) << 8) | MESSAGE_DWORD_EN)); \
 | |
|   (Dbuff) = MmioRead32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MDR)); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCRX), (UINT32) (Register & MSGBUS_MASKHI)); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MDR ), (UINT32) (Dbuff & AndData)); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCR ), (UINT32) ((WriteOpCode << 24) | (PortId << 16) | ((Register & MSGBUS_MASKLO) << 8) | MESSAGE_DWORD_EN)); \
 | |
| }
 | |
| 
 | |
| #define PchMsgBusOr32(PortId, Register, Dbuff, OrData, ReadOpCode, WriteOpCode) \
 | |
| { \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCRX), (UINT32) (Register & MSGBUS_MASKHI)); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCR ), (UINT32) ((ReadOpCode << 24) | (PortId << 16) | ((Register & MSGBUS_MASKLO) << 8) | MESSAGE_DWORD_EN)); \
 | |
|   (Dbuff) = MmioRead32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MDR)); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCRX), (UINT32) (Register & MSGBUS_MASKHI)); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MDR ), (UINT32) (Dbuff | OrData)); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCR ), (UINT32) ((WriteOpCode << 24) | (PortId << 16) | ((Register & MSGBUS_MASKLO) << 8) | MESSAGE_DWORD_EN)); \
 | |
| }
 | |
| 
 | |
| #define PchMsgBusAndThenOr32(PortId, Register, Dbuff, AndData, OrData, ReadOpCode, WriteOpCode) \
 | |
| { \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCRX), (UINT32) (Register & MSGBUS_MASKHI)); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCR ), (UINT32) ((ReadOpCode << 24) | (PortId << 16) | ((Register & MSGBUS_MASKLO) << 8) | MESSAGE_DWORD_EN)); \
 | |
|   (Dbuff) = MmioRead32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MDR)); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCRX), (UINT32) (Register & MSGBUS_MASKHI)); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MDR ), (UINT32) ((Dbuff & AndData) | OrData)); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCR ), (UINT32) ((WriteOpCode << 24) | (PortId << 16) | ((Register & MSGBUS_MASKLO) << 8) | MESSAGE_DWORD_EN)); \
 | |
| }
 | |
| 
 | |
| typedef struct _PCH_MSG_BUS_TABLE_STRUCT {
 | |
|   UINT32      PortId;
 | |
|   UINT32      Address;
 | |
|   UINT32      AndMask;
 | |
|   UINT32      OrMask;
 | |
|   UINT32      ReadOpCode;
 | |
|   UINT32      WriteOpCode;
 | |
| } PCH_MSG_BUS_TABLE_STRUCT_TABLE_STRUCT;
 | |
| 
 | |
| #ifndef _S3SUPPORT_
 | |
| #define _S3SUPPORT_
 | |
| UINTN MCRX;
 | |
| UINTN MCR;
 | |
| //
 | |
| // In S3 execute, we should follow the MSG BUS access procedure to restore the saving data.
 | |
| // To do so, we adopt READ ->> SAVE
 | |
| // Indirect IO access: (According BayTrail-M EDS chapter 3.6)
 | |
| // 1. Write Index port into MSG BUS_MCRX first.
 | |
| // 2. Write content to data register which is called MSG BUS_MDR.
 | |
| // 3. Send "message bus control" to complete the procedure.
 | |
| //
 | |
| #define S3BootScriptSaveMsgBusToMemWrite(PortId, Register, Dbuff, ReadOpCode, WriteOpCode) \
 | |
| { \
 | |
|   MCRX = (UINTN) Register & MSGBUS_MASKHI; \
 | |
|   MCR = (UINTN) ((ReadOpCode << 24) | (PortId << 16) | ((Register & MSGBUS_MASKLO) << 8) | MESSAGE_DWORD_EN); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCRX), (UINT32) MCRX); \
 | |
|   S3BootScriptSaveMemWrite(EfiBootScriptWidthUint32, (UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCRX),1, (VOID *) (UINTN) &MCRX); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCR ), (UINT32) MCR); \
 | |
|   (Dbuff) = (UINT32) MmioRead32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MDR)); \
 | |
|   S3BootScriptSaveMemWrite(EfiBootScriptWidthUint32, (UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MDR),1, (VOID *) &Dbuff); \
 | |
|   MCR = (UINTN) ((WriteOpCode << 24) | (PortId << 16) | ((Register & MSGBUS_MASKLO) << 8) | MESSAGE_DWORD_EN); \
 | |
|   S3BootScriptSaveMemWrite(EfiBootScriptWidthUint32, (UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCR),1, (VOID *) (UINTN) &MCR); \
 | |
| }
 | |
| 
 | |
| //
 | |
| // This macro combines two function:  1. PchMsgBusAndThenOr32 ()  2. S3 boot script save
 | |
| //
 | |
| #define PchMsgBusAndThenOr32AddToS3Save(PortId, Register, Dbuff, AndData, OrData, ReadOpCode, WriteOpCode) \
 | |
| { \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCRX), (UINT32) (Register & MSGBUS_MASKHI)); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCR ), (UINT32) ((ReadOpCode << 24) | (PortId << 16) | ((Register & MSGBUS_MASKLO) << 8) | MESSAGE_DWORD_EN)); \
 | |
|   (Dbuff) = (UINT32) MmioRead32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MDR)); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCRX), (UINT32) (Register & MSGBUS_MASKHI)); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MDR ), (UINT32) ((Dbuff & AndData) | OrData)); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCR ), (UINT32) ((WriteOpCode << 24) | (PortId << 16) | ((Register & MSGBUS_MASKLO) << 8) | MESSAGE_DWORD_EN)); \
 | |
|   MCRX = (UINTN) Register & MSGBUS_MASKHI; \
 | |
|   MCR = (UINTN) ((ReadOpCode << 24) | (PortId << 16) | ((Register & MSGBUS_MASKLO) << 8) | MESSAGE_DWORD_EN); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCRX), (UINT32) MCRX); \
 | |
|   S3BootScriptSaveMemWrite(EfiBootScriptWidthUint32, (UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCRX),1,(VOID *) (UINTN) &MCRX); \
 | |
|   MmioWrite32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCR ), (UINT32) MCR); \
 | |
|   (Dbuff) = (UINT32) MmioRead32 ((UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MDR)); \
 | |
|   S3BootScriptSaveMemWrite(EfiBootScriptWidthUint32, (UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MDR),1,(VOID *) &Dbuff); \
 | |
|   MCR = (UINTN) ((WriteOpCode << 24) | (PortId << 16) | ((Register & MSGBUS_MASKLO) << 8) | MESSAGE_DWORD_EN); \
 | |
|   S3BootScriptSaveMemWrite(EfiBootScriptWidthUint32, (UINTN) (PatchPcdGet64 (PcdPciExpressBaseAddress) + MC_MCR),1,(VOID *) (UINTN) &MCR); \
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #endif
 |