summaryrefslogtreecommitdiffstats
path: root/MdePkg/Include/Register/Intel/StmResourceDescriptor.h
blob: 8f29a7c8b705bd5cd191176775b6b4b829abaf4f (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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
/** @file
  STM Resource Descriptor

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

  @par Specification Reference:
  SMI Transfer Monitor (STM) User Guide Revision 1.00

**/

#ifndef _INTEL_STM_RESOURCE_DESCRIPTOR_H_
#define _INTEL_STM_RESOURCE_DESCRIPTOR_H_

#pragma pack (1)

/**
  STM Resource Descriptor Header
**/
typedef struct {
  UINT32    RscType;
  UINT16    Length;
  UINT16    ReturnStatus   : 1;
  UINT16    Reserved       : 14;
  UINT16    IgnoreResource : 1;
} STM_RSC_DESC_HEADER;

/**
  Define values for the RscType field of #STM_RSC_DESC_HEADER
  @{
**/
#define END_OF_RESOURCES      0
#define MEM_RANGE             1
#define IO_RANGE              2
#define MMIO_RANGE            3
#define MACHINE_SPECIFIC_REG  4
#define PCI_CFG_RANGE         5
#define TRAPPED_IO_RANGE      6
#define ALL_RESOURCES         7
#define REGISTER_VIOLATION    8
#define MAX_DESC_TYPE         8
/// @}

/**
  STM Resource End Descriptor
**/
typedef struct {
  STM_RSC_DESC_HEADER    Hdr;
  UINT64                 ResourceListContinuation;
} STM_RSC_END;

/**
  STM Resource Memory Descriptor
**/
typedef struct {
  STM_RSC_DESC_HEADER    Hdr;
  UINT64                 Base;
  UINT64                 Length;
  UINT32                 RWXAttributes : 3;
  UINT32                 Reserved      : 29;
  UINT32                 Reserved_2;
} STM_RSC_MEM_DESC;

/**
  Define values for the RWXAttributes field of #STM_RSC_MEM_DESC
  @{
**/
#define STM_RSC_MEM_R  0x1
#define STM_RSC_MEM_W  0x2
#define STM_RSC_MEM_X  0x4
/// @}

/**
  STM Resource I/O Descriptor
**/
typedef struct {
  STM_RSC_DESC_HEADER    Hdr;
  UINT16                 Base;
  UINT16                 Length;
  UINT32                 Reserved;
} STM_RSC_IO_DESC;

/**
  STM Resource MMIO Descriptor
**/
typedef struct {
  STM_RSC_DESC_HEADER    Hdr;
  UINT64                 Base;
  UINT64                 Length;
  UINT32                 RWXAttributes : 3;
  UINT32                 Reserved      : 29;
  UINT32                 Reserved_2;
} STM_RSC_MMIO_DESC;

/**
  Define values for the RWXAttributes field of #STM_RSC_MMIO_DESC
  @{
**/
#define STM_RSC_MMIO_R  0x1
#define STM_RSC_MMIO_W  0x2
#define STM_RSC_MMIO_X  0x4
/// @}

/**
  STM Resource MSR Descriptor
**/
typedef struct {
  STM_RSC_DESC_HEADER    Hdr;
  UINT32                 MsrIndex;
  UINT32                 KernelModeProcessing : 1;
  UINT32                 Reserved             : 31;
  UINT64                 ReadMask;
  UINT64                 WriteMask;
} STM_RSC_MSR_DESC;

/**
  STM PCI Device Path node used for the PciDevicePath field of
  #STM_RSC_PCI_CFG_DESC
**/
typedef struct {
  ///
  /// Must be 1, indicating Hardware Device Path
  ///
  UINT8     Type;
  ///
  /// Must be 1, indicating PCI
  ///
  UINT8     Subtype;
  ///
  /// sizeof(STM_PCI_DEVICE_PATH_NODE) which is 6
  ///
  UINT16    Length;
  UINT8     PciFunction;
  UINT8     PciDevice;
} STM_PCI_DEVICE_PATH_NODE;

/**
  STM Resource PCI Configuration Descriptor
**/
typedef struct {
  STM_RSC_DESC_HEADER         Hdr;
  UINT16                      RWAttributes : 2;
  UINT16                      Reserved     : 14;
  UINT16                      Base;
  UINT16                      Length;
  UINT8                       OriginatingBusNumber;
  UINT8                       LastNodeIndex;
  STM_PCI_DEVICE_PATH_NODE    PciDevicePath[1];
  // STM_PCI_DEVICE_PATH_NODE  PciDevicePath[LastNodeIndex + 1];
} STM_RSC_PCI_CFG_DESC;

/**
  Define values for the RWAttributes field of #STM_RSC_PCI_CFG_DESC
  @{
**/
#define STM_RSC_PCI_CFG_R  0x1
#define STM_RSC_PCI_CFG_W  0x2
/// @}

/**
  STM Resource Trapped I/O Descriptor
**/
typedef struct {
  STM_RSC_DESC_HEADER    Hdr;
  UINT16                 Base;
  UINT16                 Length;
  UINT16                 In        : 1;
  UINT16                 Out       : 1;
  UINT16                 Api       : 1;
  UINT16                 Reserved1 : 13;
  UINT16                 Reserved2;
} STM_RSC_TRAPPED_IO_DESC;

/**
  STM Resource All Descriptor
**/
typedef struct {
  STM_RSC_DESC_HEADER    Hdr;
} STM_RSC_ALL_RESOURCES_DESC;

/**
  STM Register Violation Descriptor
**/
typedef struct {
  STM_RSC_DESC_HEADER    Hdr;
  UINT32                 RegisterType;
  UINT32                 Reserved;
  UINT64                 ReadMask;
  UINT64                 WriteMask;
} STM_REGISTER_VIOLATION_DESC;

/**
  Enum values for the RWAttributes field of #STM_REGISTER_VIOLATION_DESC
**/
typedef enum {
  StmRegisterCr0,
  StmRegisterCr2,
  StmRegisterCr3,
  StmRegisterCr4,
  StmRegisterCr8,
  StmRegisterMax,
} STM_REGISTER_VIOLATION_TYPE;

/**
  Union of all STM resource types
**/
typedef union {
  STM_RSC_DESC_HEADER            Header;
  STM_RSC_END                    End;
  STM_RSC_MEM_DESC               Mem;
  STM_RSC_IO_DESC                Io;
  STM_RSC_MMIO_DESC              Mmio;
  STM_RSC_MSR_DESC               Msr;
  STM_RSC_PCI_CFG_DESC           PciCfg;
  STM_RSC_TRAPPED_IO_DESC        TrappedIo;
  STM_RSC_ALL_RESOURCES_DESC     All;
  STM_REGISTER_VIOLATION_DESC    RegisterViolation;
} STM_RSC;

#pragma pack ()

#endif