1 /** @file
2   QEMU/KVM Firmware Configuration access
3 
4   Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>
5   Copyright (C) 2013, Red Hat, Inc.
6 
7   This program and the accompanying materials
8   are licensed and made available under the terms and conditions of the BSD License
9   which accompanies this distribution.  The full text of the license may be found at
10   http://opensource.org/licenses/bsd-license.php
11 
12   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 
15 **/
16 
17 #ifndef __FW_CFG_LIB__
18 #define __FW_CFG_LIB__
19 
20 //
21 // The size, in bytes, of names of firmware configuration files, including at
22 // least one terminating NUL byte.
23 //
24 #define QEMU_FW_CFG_FNAME_SIZE 56
25 
26 typedef enum {
27   QemuFwCfgItemSignature            = 0x0000,
28   QemuFwCfgItemInterfaceVersion     = 0x0001,
29   QemuFwCfgItemSystemUuid           = 0x0002,
30   QemuFwCfgItemRamSize              = 0x0003,
31   QemuFwCfgItemGraphicsEnabled      = 0x0004,
32   QemuFwCfgItemSmpCpuCount          = 0x0005,
33   QemuFwCfgItemMachineId            = 0x0006,
34   QemuFwCfgItemKernelAddress        = 0x0007,
35   QemuFwCfgItemKernelSize           = 0x0008,
36   QemuFwCfgItemKernelCommandLine    = 0x0009,
37   QemuFwCfgItemInitrdAddress        = 0x000a,
38   QemuFwCfgItemInitrdSize           = 0x000b,
39   QemuFwCfgItemBootDevice           = 0x000c,
40   QemuFwCfgItemNumaData             = 0x000d,
41   QemuFwCfgItemBootMenu             = 0x000e,
42   QemuFwCfgItemMaximumCpuCount      = 0x000f,
43   QemuFwCfgItemKernelEntry          = 0x0010,
44   QemuFwCfgItemKernelData           = 0x0011,
45   QemuFwCfgItemInitrdData           = 0x0012,
46   QemuFwCfgItemCommandLineAddress   = 0x0013,
47   QemuFwCfgItemCommandLineSize      = 0x0014,
48   QemuFwCfgItemCommandLineData      = 0x0015,
49   QemuFwCfgItemKernelSetupAddress   = 0x0016,
50   QemuFwCfgItemKernelSetupSize      = 0x0017,
51   QemuFwCfgItemKernelSetupData      = 0x0018,
52   QemuFwCfgItemFileDir              = 0x0019,
53 
54   QemuFwCfgItemX86AcpiTables        = 0x8000,
55   QemuFwCfgItemX86SmbiosTables      = 0x8001,
56   QemuFwCfgItemX86Irq0Override      = 0x8002,
57   QemuFwCfgItemX86E820Table         = 0x8003,
58   QemuFwCfgItemX86HpetData          = 0x8004,
59 
60 } FIRMWARE_CONFIG_ITEM;
61 
62 
63 /**
64   Returns a boolean indicating if the firmware configuration interface
65   is available or not.
66 
67   This function may change fw_cfg state.
68 
69   @retval    TRUE   The interface is available
70   @retval    FALSE  The interface is not available
71 
72 **/
73 BOOLEAN
74 EFIAPI
75 QemuFwCfgIsAvailable (
76   VOID
77   );
78 
79 
80 /**
81   Selects a firmware configuration item for reading.
82 
83   Following this call, any data read from this item will start from
84   the beginning of the configuration item's data.
85 
86   @param[in] QemuFwCfgItem - Firmware Configuration item to read
87 
88 **/
89 VOID
90 EFIAPI
91 QemuFwCfgSelectItem (
92   IN FIRMWARE_CONFIG_ITEM   QemuFwCfgItem
93   );
94 
95 
96 /**
97   Reads firmware configuration bytes into a buffer
98 
99   If called multiple times, then the data read will
100   continue at the offset of the firmware configuration
101   item where the previous read ended.
102 
103   @param[in] Size - Size in bytes to read
104   @param[in] Buffer - Buffer to store data into
105 
106 **/
107 VOID
108 EFIAPI
109 QemuFwCfgReadBytes (
110   IN UINTN                  Size,
111   IN VOID                   *Buffer  OPTIONAL
112   );
113 
114 
115 /**
116   Writes firmware configuration bytes from a buffer
117 
118   If called multiple times, then the data written will
119   continue at the offset of the firmware configuration
120   item where the previous write ended.
121 
122   @param[in] Size - Size in bytes to write
123   @param[in] Buffer - Buffer to read data from
124 
125 **/
126 VOID
127 EFIAPI
128 QemuFwCfgWriteBytes (
129   IN UINTN                  Size,
130   IN VOID                   *Buffer
131   );
132 
133 
134 /**
135   Reads a UINT8 firmware configuration value
136 
137   @return    Value of Firmware Configuration item read
138 
139 **/
140 UINT8
141 EFIAPI
142 QemuFwCfgRead8 (
143   VOID
144   );
145 
146 
147 /**
148   Reads a UINT16 firmware configuration value
149 
150   @return    Value of Firmware Configuration item read
151 
152 **/
153 UINT16
154 EFIAPI
155 QemuFwCfgRead16 (
156   VOID
157   );
158 
159 
160 /**
161   Reads a UINT32 firmware configuration value
162 
163   @return    Value of Firmware Configuration item read
164 
165 **/
166 UINT32
167 EFIAPI
168 QemuFwCfgRead32 (
169   VOID
170   );
171 
172 
173 /**
174   Reads a UINT64 firmware configuration value
175 
176   @return    Value of Firmware Configuration item read
177 
178 **/
179 UINT64
180 EFIAPI
181 QemuFwCfgRead64 (
182   VOID
183   );
184 
185 
186 /**
187   Find the configuration item corresponding to the firmware configuration file.
188 
189   @param[in]  Name - Name of file to look up.
190   @param[out] Item - Configuration item corresponding to the file, to be passed
191                      to QemuFwCfgSelectItem ().
192   @param[out] Size - Number of bytes in the file.
193 
194   @return    RETURN_SUCCESS       If file is found.
195              RETURN_NOT_FOUND     If file is not found.
196              RETURN_UNSUPPORTED   If firmware configuration is unavailable.
197 
198 **/
199 RETURN_STATUS
200 EFIAPI
201 QemuFwCfgFindFile (
202   IN   CONST CHAR8           *Name,
203   OUT  FIRMWARE_CONFIG_ITEM  *Item,
204   OUT  UINTN                 *Size
205   );
206 
207 
208 /**
209   Returns a boolean indicating if the firmware configuration interface is
210   available for library-internal purposes.
211 
212   This function never changes fw_cfg state.
213 
214   @retval    TRUE   The interface is available internally.
215   @retval    FALSE  The interface is not available internally.
216 **/
217 BOOLEAN
218 EFIAPI
219 InternalQemuFwCfgIsAvailable (
220   VOID
221   );
222 
223 
224 /**
225   Determine if S3 support is explicitly enabled.
226 
227   @retval  TRUE   if S3 support is explicitly enabled.
228            FALSE  otherwise. This includes unavailability of the firmware
229                   configuration interface.
230 **/
231 BOOLEAN
232 EFIAPI
233 QemuFwCfgS3Enabled (
234   VOID
235   );
236 
237 #endif
238 
239