summaryrefslogtreecommitdiffstats
path: root/IntelFsp2Pkg/Tools/UserManuals/GenCfgOptUserManual.md
blob: 938c18416d4d6b9c42a1d84303ce0522fab0e436 (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
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
#Name
**GenCfgOpt.py** The python script that generates UPD text (**.txt**) files for
the compiler, header files for the UPD regions, and generates a Boot Settings
File (**BSF**), all from an EDK II Platform Description (**DSC**) file.

#Synopsis
```
GenCfgOpt UPDTXT PlatformDscFile BuildFvDir [TxtOutFile] [-D Macros]
GenCfgOpt HEADER PlatformDscFile BuildFvDir [InputHFile] [-D Macros]
GenCfgOpt GENBSF PlatformDscFile BuildFvDir BsfOutFile [-D Macros]
```

#Description
**GenCfgOpt.py** is a script that generates configuration options from an
**EDK II Platform Description (DSC)** file. It has three functions.

  1. It produces a **.txt** file that is used by the compiler that summarizes
     the UPD section in the DSC file.
  2. It generates header files for the UPD regions.
  3. It generates a **Boot Settings File (BSF)** that can be used by the
     **Binary Configuration Tool (BCT)** to provide a graphical user
     interface for manipulating settings in the UPD regions.

The **GenCfgOpt.py** script generates important files that are vital parts of
your build process. The **UPDTXT** and **HEADER** use cases must be done before
the **'build'** command; the **GENBSF** use case may be done at any time.

The following sections explain the three use cases.

## 1. GenCfgOpt.py UPDTXT
The **UPDTXT** option creates a text file with all the UPD entries, offsets,
size in bytes, and values. **GenCfgOpt** reads this information from the
**[PcdsDynamicVpd.Upd]** section of the project's DSC file. The DSC file allows
you to specify offsets and sizes for each entry, opening up the possibility of
introducing gaps between entries. **GenCfgOpt** fills in these gaps with UPD
entries that have the generic names **UnusedUpdSpaceN** where N begins with 0
and increments. The command signature for **UPDTXT** is:

```
GenCfgOpt UPDTXT PlatformDscFile BuildFvDir [TxtOutFile] [-D Macros]
```

**PlatformDscFile** must be the location of the DSC file for the platform you're
building. **BuildFvDir** is the location where the binary will be stored. The
optional **TxtOutFile** is a name and location for the output of **GenCfgOpt**.
The default name and location is the ```<UPD_TOOL_GUID>.txt``` in the directory
specified by **BuildFvDir**. The macro ```UPD_TOOL_GUID``` must be defined in
the DSC file or in the optional Macros arguments. Each optional macro argument
must follow the form ```?D <MACRO_NAME>=<VALUE>```.

**GenCfgOpt** checks to see if the UPD txt file has already been created and
will only re-create it if the DSC was modified after it was created.

## 2. GenCfgOpt.py HEADER
The **HEADER** option creates header files in the build folder. Both header
files define the ```_UPD_DATA_REGION``` data structures in FspUpd.h, FsptUpd.h,
FspmUpd.h and FspsUpd.h. In these header files any undefined elements of
structures will be added as **ReservedUpdSpaceN** beginning with N=0. The
command signature for **HEADER** is

```GenCfgOpt HEADER PlatformDscFile BuildFvDir [InputHFile] [-D Macros]```

**PlatformDscFile** and **BuildFvDir** are described in the previous section.
The optional **InputHFile** is a header file that may contain data definitions
that are used by variables in the UPD regions. This header file must contain
the special keywords ```!EXPORT EXTERNAL_BOOTLOADER_STRUCT_BEGIN``` and
```!EXPORT EXTERNAL_BOOTLOADER_STRUCT_END``` in comments. Everything between
these two keywords will be included in the generated header file.
The mechanism to specify whether a variable appears as **ReservedUpdSpaceN** in
the FspUpd.h header file is in special commands that appear in the comments of
the DSC file. The special commands begin with ```!HDR```, for header. The
following table summarizes the two command options.

### HEADER
Use the **HEADER** command to hide specific variables in the public header file.
In your project DSC file, use ```!HDR HEADER:{OFF}``` at the beginning of the
section you wish to hide and ```!HDR HEADER:{ON}``` at the end.

### STRUCT
The **STRUCT** command allows you to specify a specific data type for a
variable. You can specify a pointer to a data struct, for example. You define
the data structure in the **InputHFile** between
```!EXPORT EXTERNAL_BOOTLOADER_STRUCT_BEGIN``` and
```!EXPORT EXTERNAL_BOOTLOADER_STRUCT_END```.

#####Example:
```!HDR STRUCT:{MY_DATA_STRUCT*}```

You then define ```MY_DATA_STRUCT``` in **InputHFile**.

### EMBED
The **EMBED** command allows you to put one or more UPD data into a specify data
structure. You can utilize it as a group of UPD for example. You must specify a
start and an end for the specify data structure.

#####Example:
```
  !HDR EMBED:{MY_DATA_STRUCT:MyDataStructure:START}
  gTokenSpaceGuid.Upd1  | 0x0020 | 0x01 | 0x00
  gTokenSpaceGuid.Upd2  | 0x0021 | 0x01 | 0x00
  !HDR EMBED:{MY_DATA_STRUCT:MyDataStructure:END}
  gTokenSpaceGuid.UpdN  | 0x0022 | 0x01 | 0x00
```

#####Result:
```
  typedef struct {
    /** Offset 0x0020
    **/
    UINT8                     Upd1;
    /** Offset 0x0021
    **/
    UINT8                     Upd2;
    /** Offset 0x0022
    **/
    UINT8                     UpdN;
  } MY_DATA_STRUCT;

  typedef struct _UPD_DATA_REGION {
    ...
    /** Offset 0x0020
    **/
    MY_DATA_STRUCT    MyDataStruct;
    ...
  } UPD_DATA_REGION;
```

## 3. GenCfgOpt .py GENBSF
The **GENBSF** option generates a BSF from the UPD entries in a package's DSC
file. It does this by parsing special commands found in the comments of the DSC
file. They roughly match the keywords that define the different sections of the
BSF.

The command signature for **GENBSF** is

```GenCfgOpt GENBSF PlatformDscFile BuildFvDir BsfOutFile [-D Macros]```

In this case, the **BsfOutFile** parameter is required; it should be the
relative path to where the BSF should be stored.

Every BSF command in the DSC file begins with **!BSF** or **@Bsf**. The
following table summarizes the options that come after **!BSF** or **@Bsf**:

# BSF Commands Description
###PAGES
**PAGES** maps abbreviations to friendly-text descriptions of the pages in a BSF.

#####Example:
```!BSF PAGES:{PG1:?Page 1?, PG2:?Page 2?}``` or

```@Bsf PAGES:{PG1:?Page 1?, PG2:?Page 2?}```

###PAGE
This marks the beginning of a page. Use the abbreviation specified in **PAGES**
command.

#####Example:
```!BSF PAGE:{PG1}``` or

```@Bsf PAGE:{PG1}```

All the entries that come after this command are assumed to be on that page,
until the next **PAGE** command

###FIND
FIND maps to the BSF **Find** command. It will be placed in the **StructDef**
region of the BSF and should come at the beginning of the UPD sections of the
DSC, immediately before the signatures that mark the beginning of these
sections. The content should be the plain-text equivalent of the signature. The
signature is usually 8 characters.

#####Example:
```!BSF FIND:{PROJSIG1}``` or

```@Bsf FIND:{PROJSIG1}```

###BLOCK
The BLOCK command maps to the **BeginInfoBlock** section of the BSF. There are
two elements: a version number and a plain-text description.

#####Example:
```!BSF BLOCK:{NAME:"My platform name", VER:"0.1"}``` or

```@Bsf BLOCK:{NAME:"My platform name", VER:"0.1"}```

###NAME
**NAME** gives a plain-text for a variable. This is the text label that will
appear next to the control in **BCT**.

#####Example:
```!BSF NAME:{Variable 0}``` or

```@Bsf NAME:{Variable 0}```

If the **!BSF NAME**  or **@Bsf NAME** command does not appear before an entry
in the UPD region of the DSC file, then that entry will not appear in the BSF.

###TYPE
The **TYPE** command is used either by itself or with the **NAME** command. It
is usually used by itself when defining an **EditNum** field for the BSF. You
specify the type of data in the second parameter and the range of valid values
in the third.

#####Example:
```!BSF TYPE:{EditNum, HEX, (0x00,0xFF)}``` or

```@Bsf TYPE:{EditNum, HEX, (0x00,0xFF)}```

**TYPE** appears on the same line as the **NAME** command when using a combo-box.

#####Example:
```!BSF NAME:{Variable 1} TYPE:{Combo}``` or
```@Bsf NAME:{Variable 1} TYPE:{Combo}```

There is a special **None** type that puts the variable in the **StructDef**
region of the BSF, but doesn?t put it in any **Page** section. This makes the
variable visible to BCT, but not to the end user.

###HELP
The **HELP** command defines what will appear in the help text for each control
in BCT.

#####Example:
```!BSF HELP:{Enable/disable LAN controller.}``` or

```@Bsf HELP:{Enable/disable LAN controller.}```

###OPTION
The **OPTION** command allows you to custom-define combo boxes and map integer
or hex values to friendly-text options.

#####Example:
```!BSF OPTION:{0:IDE, 1:AHCI, 2:RAID}```

```!BSF OPTION:{0x00:0 MB, 0x01:32 MB, 0x02:64 MB}```

or

```@Bsf OPTION:{0:IDE, 1:AHCI, 2:RAID}```

```@Bsf OPTION:{0x00:0 MB, 0x01:32 MB, 0x02:64 MB}```

###FIELD
The **FIELD** command can be used to define a section of a consolidated PCD
such that the PCD will be displayed in several fields via BCT interface instead
of one long entry.

#####Example:
```!BSF FIELD:{PcdDRAMSpeed:1}``` or

```@Bsf FIELD:{PcdDRAMSpeed:1}```

###ORDER
The **ORDER** command can be used to adjust the display order for the BSF items.
By default the order value for a BSF item is assigned to be the UPD item
```(Offset * 256)```. It can be overridden by declaring **ORDER** command using
format ORDER: ```{HexMajor.HexMinor}```. In this case the order value will be
```(HexMajor*256+HexMinor)```. The item order value will be used as the sort key
during the BSF item display.

#####Example:
```!BSF ORDER:{0x0040.01}``` or

```@Bsf ORDER:{0x0040.01}```

For **OPTION** and **HELP** commands, it allows to split the contents into
multiple lines by adding multiple **OPTION** and **HELP** command lines. The
lines except for the very first line need to start with **+** in the content to
tell the tool to append this string to the previous one.

For example, the statement

```!BSF OPTION:{0x00:0 MB, 0x01:32 MB, 0x02:64 MB}```

is equivalent to:

```!BSF OPTION:{0x00:0 MB, 0x01:32 MB,}```

```!BSF OPTION:{+ 0x02:64 MB}```

or

```@Bsf OPTION:{0x00:0 MB, 0x01:32 MB, 0x02:64 MB}```

is equivalent to:

```@Bsf OPTION:{0x00:0 MB, 0x01:32 MB,}```

```@Bsf OPTION:{+ 0x02:64 MB}```

The **NAME**, **OPTION**, **TYPE**, and **HELP** commands can all appear on the
same line following the **!BSF** or **@Bsf** keyword or they may appear on
separate lines to improve readability.

There are four alternative ways to replace current BSF commands.
### 1. ```# @Prompt```
An alternative way replacing **NAME** gives a plain-text for a
variable. This is the text label that will appear next to the control in BCT.

#####Example:
```# @Prompt Variable 0```

The above example can replace the two methods as below.

```!BSF NAME:{Variable 0}``` or

```@Bsf NAME:{Variable 0}```

If the ```# @Prompt``` command does not appear before an entry in the UPD region
of the DSC file, then that entry will not appear in the BSF.

### 2. ```##```
An alternative way replacing **HELP** command defines what will appear in the
help text for each control in BCT.

#####Example:
```## Enable/disable LAN controller.```

The above example can replace the two methods as below.

```!BSF HELP:{Enable/disable LAN controller.}``` or

```@Bsf HELP:{Enable/disable LAN controller.}```

### 3. ```# @ValidList```
An alternative way replacing **OPTION** command allows you to custom-define
combo boxes and map integer or hex values to friendly-text options.

#####Example:
``` # @ValidList 0x80000003 | 0, 1, 2 | IDE, AHCI, RAID
                   Error Code | Options | Descriptions
```

The above example can replace the two methods as below.

```!BSF OPTION:{0:IDE, 1:AHCI, 2:RAID}``` or

```@Bsf OPTION:{0:IDE, 1:AHCI, 2:RAID}```

### 4. ```# @ValidRange```
An alternative way replace **EditNum** field for the BSF.

#####Example:
```# @ValidRange 0x80000001 | 0x0 ? 0xFF
                    Error Code | Range
```

The above example can replace the two methods as below.

```!BSF TYPE:{EditNum, HEX, (0x00,0xFF)}``` or

```@Bsf TYPE:{EditNum, HEX, (0x00,0xFF)}```