blob: 2bf8952d2907a0ed2fbc826ea63a5e07bce842f2 [file] [log] [blame]
/* $NoKeywords:$ */
/**
* @file
*
* Service procedure to access PCI config space registers
*
*
*
* @xrefitem bom "File Content Label" "Release Content"
* @e project: AGESA
* @e sub-project: GNB
* @e \$Revision: 85947 $ @e \$Date: 2013-01-14 17:25:21 -0600 (Mon, 14 Jan 2013) $
*
*/
/*
*****************************************************************************
*
* Copyright (c) 2008 - 2013, 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 _GNBURA_H_
#define _GNBURA_H_
#include "GnbPcie.h"
/// Generic device object
typedef struct {
PCI_ADDR DevPciAddress; ///< DevPciAddress
GNB_HANDLE *GnbHandle; ///< GnbHandle
AMD_CONFIG_PARAMS *StdHeader; ///<
} DEV_OBJECT;
/// Register address 32 bit encoding
typedef struct {
UINT32 Address: 31; ///< Register address
UINT32 MultInst: 1; ///< Must equals to 0
} URA_REGISTER_32B_ENTRY;
/// Register address encoding that represents a group of registers that have same fields' definitions
typedef struct {
UINT32 Addr: 24; ///< Register address
UINT32 InstOffset: 7; ///< The address offset between register instances
UINT32 MultInst: 1; ///< Must equals to 1
} URA_MULT_REG_ENTRY;
/// 16 bit field encoding
typedef struct {
UINT16 BfOffset: 6; ///< Offset of the bit field
UINT16 BfWidth: 6; ///< Width of the bit field
UINT16 Offset: 4; ///< Number of field entries from its register address entry
///< The first field entry of a register must be place right after its register entry and has offset 1.
///< The second field is placed right after the first field and has offset 2 and so on.
///< The offset field is maxed out at 15. So any entries after the 15th entries will take offset 0.
} URA_FIELD_16B_ENTRY;
/// 32 bit field encoding
typedef struct {
UINT32 BfOffset: 6; ///< Offset of the bit field
UINT32 BfWidth: 6; ///< Width of the bit field
UINT32 RegIndex: 13; ///< Direct index to its register address entry
UINT32 Rev: 6; ///< Contains ID of the family/rev that this bit field is valid
UINT32 Reserved: 1; ///< Reserved
} URA_FIELD_32B_ENTRY;
/// Register address 64 bit encoding
typedef struct {
UINT64 DomainAddress:32; ///< Register domain address
UINT64 DomainType: 8; ///< Register domain type
UINT64 Reserved: 24; ///< Reserved
} URA_REGISTER_64B_ENTRY;
/// Register / Field table entry
#define URA_ENTRY UINT16
/// Token
typedef union {
UINT32 Encode; ///< Token value
struct { ///< Sub structure used to parse Token
UINT32 Index: 13; ///< Index into a specific register or field entry in register/field table
UINT32 Type: 3; ///< Entry type:
///< 000b: 16-bit field location encoding
///< 001b: Register address encoding
///< 010b: 32-bit field location encoding
///< 011b: 64-bit field location encoding
///< Others would reserved
UINT32 Selector: 6; ///< Used by unified register access to select the access method
UINT32 InstSel: 6; ///< When register/field has multiple instances, this field is used to obtain the register address of a register group.
UINT32 S3Save:1; ///< Indicate whether S3Save is needed.
UINT32 StreamSet:1; ///< Stream Set
UINT32 ParentType:1; ///< Parent token type
UINT32 Reserved: 1; ///< Reserved for device specific usage
} Parser;
} URA_TOKEN_STRUCT;
#define URA_TOKEN UINT32
#define URA_TYPE_FIELD_16 0
#define URA_TYPE_FIELD_32 1
#define URA_TYPE_REGISTER_32 2
#define URA_TYPE_REGISTER_64 3
#define URA_TOKEN_PARENT_TYPE_32 0x20000000ul
#define URA_TOKEN_PARENT_TYPE_64 0x00000000ul
/**
TOKEN_DEF(Index, Type, Selector)
Defines a register of field token
@param[in] Index
@param[in] Type
@param[in] Selector
@param[in] ParentType
@return URA_TOKEN Encrypted URA_TOKEN format
--*/
#define TOKEN_DEF(Index, Type, Selector, ParentType) ( \
(((UINT32) (Index)) | (((UINT32) (Type)) << 13) | (((UINT32) (Selector)) << 16) | ((UINT32) (ParentType))) \
)
#define _RESERVED 0xFFFFFFFFul
#define _UNUSED 0xFEFEFEFEul
#define GNB_URA_FLAG_S3SAVE 0x00000001ul
#define GNB_URA_STREAM_SET 0x20000000ul
/// Structure used to pass token info to access methods
typedef struct {
UINT32 RegAddress; ///< Register address
UINT8 BfOffset; ///< Offset of the bit field
UINT8 BfWidth; ///< Width of the bit field
BOOLEAN WholeRegAccess; ///< Whole register access
UINT32 MethodType; ///< Index into the access method table to select access method
UINT32 Flags; ///< S3
UINT32 StreamSet; ///< StreamSet
UINT8 RegDomainType; ///< Register Domain type
} URA_TOKEN_INFO;
#define TYPE_GNB_INDIRECT_ACCESS 0
#define TYPE_GNB_PROTOCOL_ACCESS 1
/// URA_TUPLE
typedef struct {
URA_TOKEN Token; ///< Token
UINT32 Value; ///< Token value
UINT32 StepLength; ///< Byte length to next address for stream set usage.
} URA_TUPLE;
typedef VOID F_GNBURASERVICELOCATEREGTBL (
IN DEV_OBJECT *Device,
IN UINT32 *UraTableAddress
);
typedef VOID F_GNBURASERVICEGET (
IN DEV_OBJECT *Device,
IN URA_TOKEN_INFO *UraTokenInfo,
IN OUT VOID *Value
);
typedef VOID F_GNBURASERVICESET (
IN DEV_OBJECT *Device,
IN URA_TOKEN_INFO *UraTokenInfo,
IN OUT VOID *Value
);
typedef VOID F_GNBURASERVICESTREAMSET (
IN DEV_OBJECT *Device,
IN URA_TOKEN_INFO *UraTokenInfo,
IN OUT URA_TUPLE *UraTuple,
IN UINT32 CombinedCount
);
/// Register Read/Write protocol
typedef struct {
F_GNBURASERVICELOCATEREGTBL *GnbUraLocateRegTbl; ///<
F_GNBURASERVICEGET *GnbUraGet; ///<
F_GNBURASERVICESET *GnbUraSet; ///<
F_GNBURASERVICESTREAMSET *GnbUraStreamSet; ///<
} GNB_URA_SERVICE;
#endif