blob: 6839ba5f581be6428a7fbdac2ef6a4dd3b831245 [file] [log] [blame]
/* $NoKeywords:$ */
/**
* @file
*
* Misc common definition
*
*
*
* @xrefitem bom "File Content Label" "Release Content"
* @e project: AGESA
* @e sub-project: GNB
* @e \$Revision: 47656 $ @e \$Date: 2011-02-25 02:39:38 +0800 (Fri, 25 Feb 2011) $
*
*/
/*
*****************************************************************************
*
* Copyright (c) 2011, Advanced Micro Devices, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Advanced Micro Devices, Inc. nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* ***************************************************************************
*
*/
#ifndef _GNB_H_
#define _GNB_H_
#pragma pack (push, 1)
#define GNB_DEADLOOP() \
{ \
VOLATILE BOOLEAN k; \
k = TRUE; \
while (k) { \
} \
}
#ifdef IDSOPT_TRACING_ENABLED
#if (IDSOPT_TRACING_ENABLED == TRUE)
#define GNB_TRACE_ENABLE
#endif
#endif
#ifndef GNB_DEBUG_CODE
#ifdef GNB_TRACE_ENABLE
#define GNB_DEBUG_CODE(Code) Code
#else
#define GNB_DEBUG_CODE(Code)
#endif
#endif
#ifndef MIN
#define MIN(x, y) (((x) > (y))? (y):(x))
#endif
#ifndef MAX
#define MAX(x, y) (((x) > (y))? (x):(y))
#endif
#define OFF 0
#define PVOID UINT64
#define GnbLibGetHeader(x) ((AMD_CONFIG_PARAMS*) (intptr_t) (x)->StdHeader)
#define AGESA_STATUS_UPDATE(Current, Aggregated) \
if (Current > Aggregated) { \
Aggregated = Current; \
}
#ifndef offsetof
#define offsetof(s, m) (UINTN)&(((s *)0)->m)
#endif
//Table properties
#define TABLE_PROPERTY_DEAFULT 0x00000000
#define TABLE_PROPERTY_IGFX_DISABLED 0x00000001
#define TABLE_PROPERTY_IOMMU_DISABLED 0x00000002
#define TABLE_PROPERTY_LCLK_DEEP_SLEEP 0x00000004
#define TABLE_PROPERTY_ORB_CLK_GATING 0x00000008
#define TABLE_PROPERTY_IOC_LCLK_CLOCK_GATING 0x00000010
#define TABLE_PROPERTY_IOC_SCLK_CLOCK_GATING 0x00000020
#define TABLE_PROPERTY_IOMMU_L1_CLOCK_GATING 0x00000040
#define TABLE_PROPERTY_IOMMU_L2_CLOCK_GATING 0x00000080
//Register access flags Flags
#define GNB_REG_ACC_FLAG_S3SAVE 0x00000001
/// LCLK DPM enable control
typedef enum {
LclkDpmDisabled, ///<LCLK DPM disabled
LclkDpmRcActivity, ///<LCLK DPM enabled and use Root Complex Activity monitor method
} LCLK_DPM_MODE;
/// IVRS block
typedef enum {
IvrsIvhdBlock = 0x10, ///< IVHD block
IvrsIvmdBlock = 0x20, ///< IVMD block
IvrsIvmdrBlock = 0x30, ///< IVMDR block
IvrsIvhdrBlock = 0x40 ///< IVHDR block
} IVRS_BLOCK_TYPE;
#define DEVICE_ID(PciAddress) (UINT16) (((PciAddress).Address.Bus << 8) | ((PciAddress).Address.Device << 3) | (PciAddress).Address.Function)
/// IVHD entry types
typedef enum {
IvhdEntryPadding = 0, ///< Table padding
IvhdEntrySelect = 2, ///< Select
IvhdEntryStartRange = 3, ///< Start Range
IvhdEntryEndRange = 4, ///< End Range
IvhdEntryAliasSelect = 66, ///< Alias select
IvhdEntryAliasStartRange = 67, ///< Alias start range
IvhdEntryExtendedSelect = 70, ///< Extended select
IvhdEntryExtendedStartRange = 71, ///< Extended Start range
IvhdEntrySpecialDevice = 72 ///< Special device
} IVHD_ENTRY_TYPE;
/// Special device variety
typedef enum {
IvhdSpecialDeviceIoapic = 0x1, ///< IOAPIC
IvhdSpecialDeviceHpet = 0x2 ///< HPET
} IVHD_SPECIAL_DEVICE;
#define IVHD_FLAG_COHERENT BIT5
#define IVHD_FLAG_IOTLBSUP BIT4
#define IVHD_FLAG_ISOC BIT3
#define IVHD_FLAG_RESPASSPW BIT2
#define IVHD_FLAG_PASSPW BIT1
#define IVHD_FLAG_PPRSUB BIT7
#define IVHD_FLAG_PREFSUP BIT6
#define IVHD_EFR_XTSUP_OFFSET 0
#define IVHD_EFR_NXSUP_OFFSET 1
#define IVHD_EFR_GTSUP_OFFSET 2
#define IVHD_EFR_GLXSUP_OFFSET 3
#define IVHD_EFR_IASUP_OFFSET 5
#define IVHD_EFR_GASUP_OFFSET 6
#define IVHD_EFR_HESUP_OFFSET 7
#define IVHD_EFR_PASMAX_OFFSET 8
#define IVHD_EFR_PNCOUNTERS_OFFSET 13
#define IVHD_EFR_PNBANKS_OFFSET 17
#define IVHD_EFR_MSINUMPPR_OFFSET 23
#define IVHD_EFR_GATS_OFFSET 28
#define IVHD_EFR_HATS_OFFSET 30
#define IVINFO_HTATSRESV_MASK 0x00400000
#define IVINFO_VASIZE_MASK 0x003F8000
#define IVINFO_PASIZE_MASK 0x00007F00
#define IVINFO_GASIZE_MASK 0x000000E0
#define IVHD_INFO_MSINUM_OFFSET 0
#define IVHD_INFO_UNITID_OFFSET 8
/// IVRS header
typedef struct {
UINT8 Sign[4]; ///< Signature
UINT32 TableLength; ///< Table Length
UINT8 Revision; ///< Revision
UINT8 Checksum; ///< Checksum
UINT8 OemId[6]; ///< OEM ID
UINT8 OemTableId[8]; ///< OEM Tabled ID
UINT32 OemRev; ///< OEM Revision
UINT8 CreatorId[4]; ///< Creator ID
UINT32 CreatorRev; ///< Creator Revision
UINT32 IvInfo; ///< IvInfo
UINT64 Reserved; ///< Reserved
} IOMMU_IVRS_HEADER;
/// IVRS IVHD Entry
typedef struct {
UINT8 Type; ///< Type
UINT8 Flags; ///< Flags
UINT16 Length; ///< Length
UINT16 DeviceId; ///< DeviceId
UINT16 CapabilityOffset; ///< CapabilityOffset
UINT64 BaseAddress; ///< BaseAddress
UINT16 PciSegment; ///< Pci segment
UINT16 IommuInfo; ///< IOMMU info
UINT32 IommuEfr; ///< reserved
} IVRS_IVHD_ENTRY;
/// IVHD generic entry
typedef struct {
UINT8 Type; ///< Type
UINT16 DeviceId; ///< Device id
UINT8 DataSetting; ///< Data settings
} IVHD_GENERIC_ENTRY;
///IVHD alias entry
typedef struct {
UINT8 Type; ///< Type
UINT16 DeviceId; ///< Device id
UINT8 DataSetting; ///< Data settings
UINT8 Reserved; ///< Reserved
UINT16 AliasDeviceId; ///< Alias device id
UINT8 Reserved2; ///< Reserved
} IVHD_ALIAS_ENTRY;
///IVHD extended entry
typedef struct {
UINT8 Type; ///< Type
UINT16 DeviceId; ///< Device id
UINT8 DataSetting; ///< Data settings
UINT32 ExtSetting; ///< Extended settings
} IVHD_EXT_ENTRY;
/// IVHD special entry
typedef struct {
UINT8 Type; ///< Type
UINT16 Reserved; ///< Reserved
UINT8 DataSetting; ///< Data settings
UINT8 Handle; ///< Handle
UINT16 AliasDeviceId; ///< Alis device id
UINT8 Variety; ///< Variety
} IVHD_SPECIAL_ENTRY;
/// Power gaiter data setting (do not change this structure definition)
typedef struct {
UINT16 MothPsoPwrup; ///< Mother Timer Powerup
UINT16 MothPsoPwrdn; ///< Mother Timer Powerdown
UINT16 DaugPsoPwrup; ///< Daughter Timer Powerup
UINT16 DaugPsoPwrdn; ///< Daughter Timer Powerdown
UINT16 ResetTimer; ///< Reset Timer
UINT16 IsoTimer; ///< Isolation Timer
} POWER_GATE_DATA;
/// Topology information
typedef struct {
BOOLEAN PhantomFunction; ///< PCIe topology have device with phantom function
BOOLEAN PcieToPciexBridge; ///< PCIe topology have device with Pcieto Pcix bridge
} GNB_TOPOLOGY_INFO;
#define GNB_STRINGIZE(x) #x
#define GNB_SERVICE_DEFINITIONS(x) GNB_STRINGIZE (Services/x/x.h)
#define GNB_MODULE_DEFINITIONS(x) GNB_STRINGIZE (Modules/x/x.h)
#define GNB_MODULE_INSTALL(x) GNB_STRINGIZE (Modules/x/x##Install.h)
/// GNB installable services
typedef enum {
GnbPcieFamConfigService, ///< PCIe config service
GnbPcieFamInitService, ///< PCIe Init service
GnbPcieFamDebugService, ///< PCIe Debug service
} GNB_SERVICE_ID;
/// GNB service entry
typedef struct _GNB_SERVICE {
GNB_SERVICE_ID ServiceId; ///< Service ID
UINT64 Family; ///< CPU family
VOID *ServiceProtocol; ///< Service protocol
struct _GNB_SERVICE *NextService; ///< Pointer to next service
} GNB_SERVICE;
#pragma pack (pop)
#endif