• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 //
27 // If the following bit is set in the UINT32 fw_cfg revision / feature bitmap
28 // -- read from key 0x0001 with the basic IO Port or MMIO method --, then the
29 // DMA interface is available.
30 //
31 #define FW_CFG_F_DMA BIT1
32 
33 //
34 // Macros for the FW_CFG_DMA_ACCESS.Control bitmap (in native encoding).
35 //
36 #define FW_CFG_DMA_CTL_ERROR  BIT0
37 #define FW_CFG_DMA_CTL_READ   BIT1
38 #define FW_CFG_DMA_CTL_SKIP   BIT2
39 #define FW_CFG_DMA_CTL_SELECT BIT3
40 #define FW_CFG_DMA_CTL_WRITE  BIT4
41 
42 typedef enum {
43   QemuFwCfgItemSignature            = 0x0000,
44   QemuFwCfgItemInterfaceVersion     = 0x0001,
45   QemuFwCfgItemSystemUuid           = 0x0002,
46   QemuFwCfgItemRamSize              = 0x0003,
47   QemuFwCfgItemGraphicsEnabled      = 0x0004,
48   QemuFwCfgItemSmpCpuCount          = 0x0005,
49   QemuFwCfgItemMachineId            = 0x0006,
50   QemuFwCfgItemKernelAddress        = 0x0007,
51   QemuFwCfgItemKernelSize           = 0x0008,
52   QemuFwCfgItemKernelCommandLine    = 0x0009,
53   QemuFwCfgItemInitrdAddress        = 0x000a,
54   QemuFwCfgItemInitrdSize           = 0x000b,
55   QemuFwCfgItemBootDevice           = 0x000c,
56   QemuFwCfgItemNumaData             = 0x000d,
57   QemuFwCfgItemBootMenu             = 0x000e,
58   QemuFwCfgItemMaximumCpuCount      = 0x000f,
59   QemuFwCfgItemKernelEntry          = 0x0010,
60   QemuFwCfgItemKernelData           = 0x0011,
61   QemuFwCfgItemInitrdData           = 0x0012,
62   QemuFwCfgItemCommandLineAddress   = 0x0013,
63   QemuFwCfgItemCommandLineSize      = 0x0014,
64   QemuFwCfgItemCommandLineData      = 0x0015,
65   QemuFwCfgItemKernelSetupAddress   = 0x0016,
66   QemuFwCfgItemKernelSetupSize      = 0x0017,
67   QemuFwCfgItemKernelSetupData      = 0x0018,
68   QemuFwCfgItemFileDir              = 0x0019,
69 
70   QemuFwCfgItemX86AcpiTables        = 0x8000,
71   QemuFwCfgItemX86SmbiosTables      = 0x8001,
72   QemuFwCfgItemX86Irq0Override      = 0x8002,
73   QemuFwCfgItemX86E820Table         = 0x8003,
74   QemuFwCfgItemX86HpetData          = 0x8004,
75 
76 } FIRMWARE_CONFIG_ITEM;
77 
78 //
79 // Communication structure for the DMA access method. All fields are encoded in
80 // big endian.
81 //
82 #pragma pack (1)
83 typedef struct {
84   UINT32 Control;
85   UINT32 Length;
86   UINT64 Address;
87 } FW_CFG_DMA_ACCESS;
88 #pragma pack ()
89 
90 /**
91   Returns a boolean indicating if the firmware configuration interface
92   is available or not.
93 
94   This function may change fw_cfg state.
95 
96   @retval    TRUE   The interface is available
97   @retval    FALSE  The interface is not available
98 
99 **/
100 BOOLEAN
101 EFIAPI
102 QemuFwCfgIsAvailable (
103   VOID
104   );
105 
106 
107 /**
108   Selects a firmware configuration item for reading.
109 
110   Following this call, any data read from this item will start from
111   the beginning of the configuration item's data.
112 
113   @param[in] QemuFwCfgItem - Firmware Configuration item to read
114 
115 **/
116 VOID
117 EFIAPI
118 QemuFwCfgSelectItem (
119   IN FIRMWARE_CONFIG_ITEM   QemuFwCfgItem
120   );
121 
122 
123 /**
124   Reads firmware configuration bytes into a buffer
125 
126   If called multiple times, then the data read will
127   continue at the offset of the firmware configuration
128   item where the previous read ended.
129 
130   @param[in] Size - Size in bytes to read
131   @param[in] Buffer - Buffer to store data into
132 
133 **/
134 VOID
135 EFIAPI
136 QemuFwCfgReadBytes (
137   IN UINTN                  Size,
138   IN VOID                   *Buffer  OPTIONAL
139   );
140 
141 
142 /**
143   Writes firmware configuration bytes from a buffer
144 
145   If called multiple times, then the data written will
146   continue at the offset of the firmware configuration
147   item where the previous write ended.
148 
149   @param[in] Size - Size in bytes to write
150   @param[in] Buffer - Buffer to read data from
151 
152 **/
153 VOID
154 EFIAPI
155 QemuFwCfgWriteBytes (
156   IN UINTN                  Size,
157   IN VOID                   *Buffer
158   );
159 
160 
161 /**
162   Reads a UINT8 firmware configuration value
163 
164   @return    Value of Firmware Configuration item read
165 
166 **/
167 UINT8
168 EFIAPI
169 QemuFwCfgRead8 (
170   VOID
171   );
172 
173 
174 /**
175   Reads a UINT16 firmware configuration value
176 
177   @return    Value of Firmware Configuration item read
178 
179 **/
180 UINT16
181 EFIAPI
182 QemuFwCfgRead16 (
183   VOID
184   );
185 
186 
187 /**
188   Reads a UINT32 firmware configuration value
189 
190   @return    Value of Firmware Configuration item read
191 
192 **/
193 UINT32
194 EFIAPI
195 QemuFwCfgRead32 (
196   VOID
197   );
198 
199 
200 /**
201   Reads a UINT64 firmware configuration value
202 
203   @return    Value of Firmware Configuration item read
204 
205 **/
206 UINT64
207 EFIAPI
208 QemuFwCfgRead64 (
209   VOID
210   );
211 
212 
213 /**
214   Find the configuration item corresponding to the firmware configuration file.
215 
216   @param[in]  Name - Name of file to look up.
217   @param[out] Item - Configuration item corresponding to the file, to be passed
218                      to QemuFwCfgSelectItem ().
219   @param[out] Size - Number of bytes in the file.
220 
221   @return    RETURN_SUCCESS       If file is found.
222              RETURN_NOT_FOUND     If file is not found.
223              RETURN_UNSUPPORTED   If firmware configuration is unavailable.
224 
225 **/
226 RETURN_STATUS
227 EFIAPI
228 QemuFwCfgFindFile (
229   IN   CONST CHAR8           *Name,
230   OUT  FIRMWARE_CONFIG_ITEM  *Item,
231   OUT  UINTN                 *Size
232   );
233 
234 
235 /**
236   Determine if S3 support is explicitly enabled.
237 
238   @retval  TRUE   if S3 support is explicitly enabled.
239            FALSE  otherwise. This includes unavailability of the firmware
240                   configuration interface.
241 **/
242 BOOLEAN
243 EFIAPI
244 QemuFwCfgS3Enabled (
245   VOID
246   );
247 
248 #endif
249 
250