1 /** @file
2   STM Resource Descriptor
3 
4   Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
5   This program and the accompanying materials
6   are licensed and made available under the terms and conditions of the BSD License
7   which accompanies this distribution.  The full text of the license may be found at
8   http://opensource.org/licenses/bsd-license.php.
9 
10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13   @par Specification Reference:
14   SMI Transfer Monitor (STM) User Guide Revision 1.00
15 
16 **/
17 
18 #ifndef _STM_RESOURCE_DESCRIPTOR_H_
19 #define _STM_RESOURCE_DESCRIPTOR_H_
20 
21 #pragma pack (1)
22 
23 /**
24   STM Resource Descriptor Header
25 **/
26 typedef struct {
27   UINT32  RscType;
28   UINT16  Length;
29   UINT16  ReturnStatus:1;
30   UINT16  Reserved:14;
31   UINT16  IgnoreResource:1;
32 } STM_RSC_DESC_HEADER;
33 
34 /**
35   Define values for the RscType field of #STM_RSC_DESC_HEADER
36   @{
37 **/
38 #define END_OF_RESOURCES      0
39 #define MEM_RANGE             1
40 #define IO_RANGE              2
41 #define MMIO_RANGE            3
42 #define MACHINE_SPECIFIC_REG  4
43 #define PCI_CFG_RANGE         5
44 #define TRAPPED_IO_RANGE      6
45 #define ALL_RESOURCES         7
46 #define REGISTER_VIOLATION    8
47 #define MAX_DESC_TYPE         8
48 /// @}
49 
50 /**
51   STM Resource End Descriptor
52 **/
53 typedef struct {
54   STM_RSC_DESC_HEADER  Hdr;
55   UINT64               ResourceListContinuation;
56 } STM_RSC_END;
57 
58 /**
59   STM Resource Memory Descriptor
60 **/
61 typedef struct {
62   STM_RSC_DESC_HEADER  Hdr;
63   UINT64               Base;
64   UINT64               Length;
65   UINT32               RWXAttributes:3;
66   UINT32               Reserved:29;
67   UINT32               Reserved_2;
68 } STM_RSC_MEM_DESC;
69 
70 /**
71   Define values for the RWXAttributes field of #STM_RSC_MEM_DESC
72   @{
73 **/
74 #define STM_RSC_MEM_R  0x1
75 #define STM_RSC_MEM_W  0x2
76 #define STM_RSC_MEM_X  0x4
77 /// @}
78 
79 /**
80   STM Resource I/O Descriptor
81 **/
82 typedef struct {
83   STM_RSC_DESC_HEADER  Hdr;
84   UINT16               Base;
85   UINT16               Length;
86   UINT32               Reserved;
87 } STM_RSC_IO_DESC;
88 
89 /**
90   STM Resource MMIO Descriptor
91 **/
92 typedef struct {
93   STM_RSC_DESC_HEADER  Hdr;
94   UINT64               Base;
95   UINT64               Length;
96   UINT32               RWXAttributes:3;
97   UINT32               Reserved:29;
98   UINT32               Reserved_2;
99 } STM_RSC_MMIO_DESC;
100 
101 /**
102   Define values for the RWXAttributes field of #STM_RSC_MMIO_DESC
103   @{
104 **/
105 #define STM_RSC_MMIO_R  0x1
106 #define STM_RSC_MMIO_W  0x2
107 #define STM_RSC_MMIO_X  0x4
108 /// @}
109 
110 /**
111   STM Resource MSR Descriptor
112 **/
113 typedef struct {
114   STM_RSC_DESC_HEADER  Hdr;
115   UINT32               MsrIndex;
116   UINT32               KernelModeProcessing:1;
117   UINT32               Reserved:31;
118   UINT64               ReadMask;
119   UINT64               WriteMask;
120 } STM_RSC_MSR_DESC;
121 
122 /**
123   STM PCI Device Path node used for the PciDevicePath field of
124   #STM_RSC_PCI_CFG_DESC
125 **/
126 typedef struct {
127   ///
128   /// Must be 1, indicating Hardware Device Path
129   ///
130   UINT8   Type;
131   ///
132   /// Must be 1, indicating PCI
133   ///
134   UINT8   Subtype;
135   ///
136   /// sizeof(STM_PCI_DEVICE_PATH_NODE) which is 6
137   ///
138   UINT16  Length;
139   UINT8   PciFunction;
140   UINT8   PciDevice;
141 } STM_PCI_DEVICE_PATH_NODE;
142 
143 /**
144   STM Resource PCI Configuration Descriptor
145 **/
146 typedef struct {
147   STM_RSC_DESC_HEADER       Hdr;
148   UINT16                    RWAttributes:2;
149   UINT16                    Reserved:14;
150   UINT16                    Base;
151   UINT16                    Length;
152   UINT8                     OriginatingBusNumber;
153   UINT8                     LastNodeIndex;
154   STM_PCI_DEVICE_PATH_NODE  PciDevicePath[1];
155 //STM_PCI_DEVICE_PATH_NODE  PciDevicePath[LastNodeIndex + 1];
156 } STM_RSC_PCI_CFG_DESC;
157 
158 /**
159   Define values for the RWAttributes field of #STM_RSC_PCI_CFG_DESC
160   @{
161 **/
162 #define STM_RSC_PCI_CFG_R  0x1
163 #define STM_RSC_PCI_CFG_W  0x2
164 /// @}
165 
166 /**
167   STM Resource Trapped I/O Descriptor
168 **/
169 typedef struct {
170   STM_RSC_DESC_HEADER  Hdr;
171   UINT16               Base;
172   UINT16               Length;
173   UINT16               In:1;
174   UINT16               Out:1;
175   UINT16               Api:1;
176   UINT16               Reserved1:13;
177   UINT16               Reserved2;
178 } STM_RSC_TRAPPED_IO_DESC;
179 
180 /**
181   STM Resource All Descriptor
182 **/
183 typedef struct {
184   STM_RSC_DESC_HEADER  Hdr;
185 } STM_RSC_ALL_RESOURCES_DESC;
186 
187 /**
188   STM Register Volation Descriptor
189 **/
190 typedef struct {
191   STM_RSC_DESC_HEADER  Hdr;
192   UINT32               RegisterType;
193   UINT32               Reserved;
194   UINT64               ReadMask;
195   UINT64               WriteMask;
196 } STM_REGISTER_VIOLATION_DESC;
197 
198 /**
199   Enum values for the RWAttributes field of #STM_REGISTER_VIOLATION_DESC
200 **/
201 typedef enum {
202   StmRegisterCr0,
203   StmRegisterCr2,
204   StmRegisterCr3,
205   StmRegisterCr4,
206   StmRegisterCr8,
207   StmRegisterMax,
208 } STM_REGISTER_VIOLATION_TYPE;
209 
210 /**
211   Union of all STM resource types
212 **/
213 typedef union {
214   STM_RSC_DESC_HEADER          Header;
215   STM_RSC_END                  End;
216   STM_RSC_MEM_DESC             Mem;
217   STM_RSC_IO_DESC              Io;
218   STM_RSC_MMIO_DESC            Mmio;
219   STM_RSC_MSR_DESC             Msr;
220   STM_RSC_PCI_CFG_DESC         PciCfg;
221   STM_RSC_TRAPPED_IO_DESC      TrappedIo;
222   STM_RSC_ALL_RESOURCES_DESC   All;
223   STM_REGISTER_VIOLATION_DESC  RegisterViolation;
224 } STM_RSC;
225 
226 #pragma pack ()
227 
228 #endif
229