aboutsummaryrefslogtreecommitdiffstats
path: root/Platforms/AMD/Styx/Binary/AmdModulePkg/Common/Wtf_Reg.h
blob: 736edabf870f4ef26718bc9911c57dee074221c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/* $NoKeywords */
/**
 * @file
 *
 * Wtf_Reg.h
 *
 * Contains Where's-The-Firmware (WTF) definitions and Macros.
 *
 * @xrefitem bom "File Content Label" "Release Content"
 * @e project: FDK
 * @e sub-project: UEFI
 * @e version: $Revision: 334098 $ @e date: $Date: 2016-01-08 14:21:15 -0600 (Fri, 08 Jan 2016) $
 *
 */
/*****************************************************************************
*
*  Copyright 2013 - 2016 ADVANCED MICRO DEVICES, INC.  All Rights Reserved.
*
*  This program and the accompanying materials are licensed and made available
*  under the terms and conditions of the BSD License which 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.
*
***************************************************************************/

#ifndef __WTF_REG__H_
#define __WTF_REG__H_

#ifdef __cplusplus
  extern "C" {
  #endif

/*----------------------------------------------------------------------------------------
 *                   D E F I N I T I O N S    A N D    M A C R O S
 *----------------------------------------------------------------------------------------
 */
#define WTF_STATUS_REG                  0xE0000000  // "Where's The Firmware" Register

#define WTF_STATUS_REG_SIZE             32
#define WTF_STATUS_ERROR_SIZE           12
#define WTF_STATUS_POST_SIZE            10
#define WTF_STATUS_FW_INDICATOR_SIZE    2
#define WTF_STATUS_BT_CHKSUMFAIL_SIZE   1

#define WTF_STATUS_ERROR_SHIFT          0
#define WTF_STATUS_POST_SHIFT           12
#define WTF_STATUS_FW_INDICATOR_SHIFT   22
#define WTF_STATUS_BT_CHKSUMFAIL_SHIFT  31

#define WTF_STATUS_ERROR_MASK           0x00000FFF
#define WTF_STATUS_POST_MASK            0x003FF000
#define WTF_STATUS_FW_INDICATOR_MASK    0x00C00000
#define WTF_STATUS_BT_CHKSUMFAIL_MASK   0x80000000

#define WTF_STATUS_MASK \
        (WTF_STATUS_ERROR_MASK | \
        WTF_STATUS_POST_MASK | \
        WTF_STATUS_FW_INDICATOR_MASK | \
        WTF_STATUS_BT_CHKSUMFAIL_MASK)

#define WTF_STATUS_DEFAULT              0x00000000
#define WTF_STATUS_FW_INDICATOR_UEFI    0x2

#define WTF_STATUS_GET_ERROR(wtf_status) \
        ((wtf_status & WTF_STATUS_ERROR_MASK) >> WTF_STATUS_ERROR_SHIFT)
#define WTF_STATUS_GET_POST(wtf_status) \
        ((wtf_status & WTF_STATUS_POST_MASK) >> WTF_STATUS_POST_SHIFT)
#define WTF_STATUS_GET_FW_INDICATOR(wtf_status) \
        ((wtf_status & WTF_STATUS_FW_INDICATOR_MASK) >> WTF_STATUS_FW_INDICATOR_SHIFT)
#define WTF_STATUS_GET_BT_CHKSUMFAIL(wtf_status) \
        ((wtf_status & WTF_STATUS_BT_CHECKSUMFAIL_MASK) >> WTF_STATUS_BT_CHECKSUMFAIL_SHIFT)

#define WTF_STATUS_SET_ERROR(error) { \
        UINT32 wtf_status_reg; \
        wtf_status_reg = MmioRead32 (WTF_STATUS_REG); \
        wtf_status_reg = (wtf_status_reg & ~WTF_STATUS_ERROR_MASK) | (error << WTF_STATUS_ERROR_SHIFT); \
        wtf_status_reg = (wtf_status_reg & ~WTF_STATUS_FW_INDICATOR_MASK) | (WTF_STATUS_FW_INDICATOR_UEFI << WTF_STATUS_FW_INDICATOR_SHIFT); \
        MmioWrite32 (WTF_STATUS_REG, wtf_status_reg); \
}

#define WTF_STATUS_SET_POST(post) { \
        UINT32 wtf_status_reg; \
        wtf_status_reg = MmioRead32 (WTF_STATUS_REG); \
        wtf_status_reg = (wtf_status_reg & ~WTF_STATUS_POST_MASK) | (post << WTF_STATUS_POST_SHIFT); \
        wtf_status_reg = (wtf_status_reg & ~WTF_STATUS_FW_INDICATOR_MASK) | (WTF_STATUS_FW_INDICATOR_UEFI << WTF_STATUS_FW_INDICATOR_SHIFT); \
        MmioWrite32 (WTF_STATUS_REG, wtf_status_reg); \
}

#define WTF_STATUS_SET_FW_INDICATOR(fwindicator) { \
        UINT32 wtf_status_reg; \
        wtf_status_reg = MmioRead32 (WTF_STATUS_REG); \
        wtf_status_reg = (wtf_status_reg & ~WTF_STATUS_FW_INDICATOR_MASK) | (fwindicator << WTF_STATUS_FW_INDICATOR_SHIFT); \
        MmioWrite32 (WTF_STATUS_REG, wtf_status_reg); \
}

#define WTF_STATUS_SET_BT_CHKSUMFAIL(btchksmfail) { \
        UINT32 wtf_status_reg; \
        wtf_status_reg = MmioRead32 (WTF_STATUS_REG); \
        wtf_status_reg = (wtf_status_reg & ~WTF_STATUS_BT_CHKSUMFAIL_MASK) | (btchksmfail << WTF_STATUS_BT_CHKSUMFAIL_SHIFT); \
        MmioWrite32 (WTF_STATUS_REG, wtf_status_reg); \
}

/*----------------------------------------------------------------------------------------
 *                  T Y P E D E F S     A N D     S T R U C T U R E S
 *----------------------------------------------------------------------------------------
 */
/// WTF Status Structure
typedef
struct _WTF_STATUS_T {
  UINT64 error                   : WTF_STATUS_ERROR_SIZE;          ///< WTF Status Error Size
  UINT64 post                    : WTF_STATUS_POST_SIZE;           ///< WTF Status Post Size
  UINT64 fwindicator             : WTF_STATUS_FW_INDICATOR_SIZE;   ///< WTF Status Firmware Indicator Size
  UINT64 reserved                : 7;                              ///< Reserved
  UINT64 btchksmfail             : WTF_STATUS_BT_CHKSUMFAIL_SIZE;  ///< WTF Status Bit Checksum Fail Size
} WTF_STATUS_T;

/// WTF Status Union
typedef
union {
  UINT32 val : 32;   ///< Value
  WTF_STATUS_T f;    ///< WTF Status Structure
} WTF_STATUS_U;


/****** DO NOT WRITE BELOW THIS LINE *******/
#ifdef __cplusplus
}
#endif
#endif