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 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380
|
Intel Pad to Macro (intelp2m) converter
=======================================
The utility generates `output/gpio.h` with the GPIO configuration for SoC or PCH from intel.
Use it to create coreboot port for your motherboard in the `src/mainboard/your-motherboard`
directory. Depending on the settings, you can create several configuration formats:
- [coreboot macros](../../getting_started/gpio.md);
- [Intel FSP macros](../../soc/intel/fsp/index.md).
Installing the latest version:
```bash
go install review.coreboot.org/coreboot.git/util/intelp2m@master
```
Including in the project as an external library:
```bash
go get review.coreboot.org/coreboot.git/util/intelp2m@master
```
## Build
Since the utility is written in Go, you need to install the official
[go-compiler and go-tools](https://go.dev/dl/) to build the executive
image.
```bash
cd util/intelp2m
make
```
Set automatic argument completion:
```bash
complete -C `pwd`/intelp2m ./intelp2m
```
## Demo
```bash
./intelp2m -platform snr -file parser/testlog/inteltool_test.log
```
## Input data
The chipset register dump obtained using [inteltool](../../util.md) is used as input data.
```bash
cd util/inteltool
make
sudo ./inteltool -G > inteltool.log
```
After this step, you can generate `gpio.h`:
```bash
./intelp2m -file ../inteltool/inteltool.log
```
More details in the help:
```bash
./intelp2m -h
```
## Platforms
The utility supports the following chipsets from Intel:
* `adl` - Alder Lake PCH
* `apl` - Apollo Lake SoC
* `cnl` - CannonLake-LP or Whiskeylake/Coffeelake/Cometlake-U SoC
* `ebg` - Emmitsburg PCH with Xeon SP
* `ehl` - Elkhart Lake SoC
* `jsl` - Jasper Lake SoC
* `lbg` - Lewisburg PCH with Xeon SP
* `mtl` - MeteorLake SoC
* `snr` - Sunrise PCH or Skylake/Kaby Lake SoC
* `tgl` - TigerLake-H SoC
The `-platform` option allows you to identify one of the above platforms:
```bash
./intelp2m -platform <platform> -file path/to/inteltool.log
```
Show more details:
```bash
./intelp2m -platform ?
```
## Auto-check macro
The utility automatically checks the bit fields of the GPIO registers before generating the macro.
If the bit is set to 1 in a register but isn't used in the "short" macro, the "long" macro is
generated. This avoids data loss in the configuration.
```c
// the "short" macro:
PAD_CFG_NF_IOSSTATE_IOSTERM(GPIO_39, UP_20K, DEEP, NF1, TxLASTRxE, DISPUPD),
// the "long" macro:
_PAD_CFG_STRUCT(GPIO_39, PAD_FUNC(NF1) | PAD_RESET(DEEP) | PAD_TRIG(OFF), PAD_PULL(UP_20K) | PAD_IOSTERM(DISPUPD)),
// [*] PAD_TRIG(OFF) isn't used in the "short" macro.
```
The option `-u`, `-unchecked` is used to disable automatic verification.
In this case, all macros in `gpio.h` are generated in the "short" format:
```c
...
PAD_NC(GPP_F18, NONE),
PAD_CFG_NF(GPP_F19, NONE, PLTRST, NF1),
...
```
```bash
./intelp2m -unchecked -platform apl -file path/to/inteltool.log
```
## Excluding fields from the macro
The utility can generate "long" macros without fields that aren't used in "short" ones.
The `-e`, `-exclude` option is used to exclude these fields from the generated macros in
`gpio.h`:
```bash
./intelp2m -exclude -platform apl -file path/to/inteltool.log
```
```c
_PAD_CFG_STRUCT(GPIO_39, PAD_FUNC(NF1) | PAD_RESET(DEEP), PAD_PULL(UP_20K) | PAD_IOSTERM(DISPUPD)),
// [*] PAD_TRIG(OFF) field was excluded from the "long" macro.
```
## Packages
```text
+-------------------------------------------------------------------+
| main |
+-------------------------------------------------------------------+
| | |
V V V
+------------+ +--------------+ +-------------+ +-------------+
| template |<--| parser | | generator | | printer |
+------------+ +--------------+ +-------------+ +-------------+
|
V
+-------------------------------------------------------------------+
| platforms |
+-------------------------------------------------------------------+
| | | | | |
V V V V V V
+-------+ +-------+ +-------+ +-------+ +-------+ +-------+
| adl | | apl | | cnl | | lbg | | snr | * * * | other |
+-------+ +-------+ +-------+ +-------+ +-------+ +-------+
| | | | | |
V V V V V V
+-------------------------------------------------------------------+
| common |
+-------------------------------------------------------------------+
| | |
V | |
+------------------------------------+ | |
| fields | | |
+------------------------------------+ | |
| | | | |
V V V V V
+--------+ +---------+ +---------+ +-----------+ +------------+
| cb | | raw | | fsp | | macro | | register |
+--------+ +---------+ +---------+ +-----------+ +------------+
```
## Format
Depending on the options -i, -ii, -iii, -iiiii (information level),
the utility can generate the configuration in different formats:
```bash
./intelp2m [-i | -ii | -iii | -iiii] -platform apl -file path/to/inteltool.log
```
* i adding a function name:
```c
_PAD_CFG_STRUCT(GPIO_39, PAD_FUNC(NF1) | PAD_RESET(DEEP) | PAD_TRIG(OFF), PAD_PULL(UP_20K) | PAD_IOSTERM(DISPUPD)), /* LPSS_UART0_TXD */
```
* ii adds configuration register values:
```c
/* GPIO_39 - LPSS_UART0_TXD */
/* DW0: 0x44000400, DW1: 0x00003100 */
_PAD_CFG_STRUCT(GPIO_39, PAD_FUNC(NF1) | PAD_RESET(DEEP) | PAD_TRIG(OFF), PAD_PULL(UP_20K) | PAD_IOSTERM(DISPUPD)),
```
* iii adds information about ignored fields:
```c
/* GPIO_39 - LPSS_UART0_TXD */
/* DW0: 0x44000400, DW1: 0x00003100 */
/* DW0 : PAD_TRIG(OFF) - IGNORED */
_PAD_CFG_STRUCT(GPIO_39, PAD_FUNC(NF1) | PAD_RESET(DEEP) | PAD_TRIG(OFF), PAD_PULL(UP_20K) | PAD_IOSTERM(DISPUPD)),
```
* iiii adds the "short" macro corresponding to the current one (possibly after excluding unused fields):
```c
/* GPIO_39 - LPSS_UART0_TXD */
/* DW0: 0x44000400, DW1: 0x00003100 */
/* DW0: PAD_TRIG(OFF) - IGNORED */
/* PAD_CFG_NF_IOSSTATE_IOSTERM(GPIO_39, UP_20K, DEEP, NF1, TxLASTRxE, DISPUPD), */
_PAD_CFG_STRUCT(GPIO_39, PAD_FUNC(NF1) | PAD_RESET(DEEP) | PAD_TRIG(OFF), PAD_PULL(UP_20K) | PAD_IOSTERM(DISPUPD)),
```
The same without automatic check:
```c
/* GPIO_39 - LPSS_UART0_TXD */
/* DW0: 0x44000400, DW1: 0x00003100 */
/* DW0: PAD_TRIG(OFF) - IGNORED */
/* _PAD_CFG_STRUCT(GPIO_39, PAD_FUNC(NF1) | PAD_RESET(DEEP) | PAD_TRIG(OFF), PAD_PULL(UP_20K) | PAD_IOSTERM(DISPUPD)), */
PAD_CFG_NF_IOSSTATE_IOSTERM(GPIO_39, UP_20K, DEEP, NF1, TxLASTRxE, DISPUPD),
```
iiii generates an original macro in the comments.
## Long macros with fields collection
Depending on the value of the option -fields, the utility can generate
long macros with different styles of the field collection:
```bash
./intelp2m -fields [fsp | cb | raw] -platform apl -file ../apollo-inteltool.log
```
* fsp
```c
{ GPIO_SKL_H_GPP_A12, { GpioPadModeGpio, GpioHostOwnAcpi, GpioDirInInvOut, GpioOutLow, GpioIntSci | GpioIntLvlEdgDis, GpioResetNormal GpioTermNone, GpioPadConfigLock },
```
* cb
```c
_PAD_CFG_STRUCT(GPIO_39, PAD_FUNC(NF1) | PAD_RESET(DEEP) | PAD_TRIG(OFF), PAD_PULL(UP_20K) | PAD_IOSTERM(DISPUPD)),
```
* raw
```c
_PAD_CFG_STRUCT(GPP_A10, 0x44000500, 0x00000000),
```
Show more details:
```bash
./intelp2m -fields ?
```
## For developers
### Version
```bash
./intelp2m -version
```
The version string includes several parts:
```text
{major}.{minor}-{last commit in the intelp2m directory}-{?dirty}
```
`major` - incompatible API changes (e.g. remove or update a command line option);
`minor` - new platform, new feature or adding a new command line option.
The version is added to the generated `gpio.h` file and it is necessary to support the project.
```c
/* Pad configuration was generated automatically using intelp2m 2.5-870c694 */
static const struct pad_config gpio_table[] = {
...
```
Please do not remove this information, as it makes support easier!
### Adding support for new platforms
The platform-dependent code is located in `./platforms/`. Each PCH and SoC is in a separate
package with a name corresponding to this platform (adl, apl, snr, ...). The macro generation
code for all platforms is in the `common` directory.
The package file must contain the structure `BasePlatform struct{}` with methods for the
`PlatformIf interface{}` from the `common` package:
```Go
type PlatformIf interface {
RemapResetSource(*Macro)
Pull(*Macro)
AddGpiMacro(*Macro)
AddGpoMacro(*Macro)
AddNativeFunctionMacro(*Macro)
AddNoConnMacro(*Macro)
GetRegisterDW0() *register.DW0
GetRegisterDW1() *register.DW1
}
```
Some methods (for example, register access methods: `GetRegisterDW0()` and `GetRegisterDW1()`)
are already defined in the base platform from `common`. Therefore, embedding should be used in
the basic platform structure to avoid code duplication:
```Go
type BasePlatform struct {
common.BasePlatform
}
```
Since GPIO controllers are similar across intel platforms, the macro generation code can also be
reused. You can use any platform instead of `common.BasePlatform` from the catalog to reuse its
methods and redefine those that differ in logic.
The platform file should also contain the slice `GPPGroups[]` with templates for pad names from
`inteltool.log`, register masks `DW0` and `DW1` (the analysis will be only for the bits in these
masks), the base platform constructor - `InitBasePlatform()`, and `GetPlatform()` that provides
the platform interface.
```Go
const (
DW0Mask = (0b1 << 27) | (0b1 << 18) | (0b00111111 << 11) | (0b00111111 << 2) | (0b1 << 1)
DW1Mask = 0b11111101111111111100001111111111
)
// "GPP_A", "GPP_B", "GPP_C", "GPP_D", "GPP_E", "GPP_F", "GPP_G", "GPP_H", "GPP_R", "GPP_S",
// "GPP_T", "GPD", "HVMOS", "VGPIO5"
var GPPGroups = []string{"GPP_", "GPD", "VGPIO"}
type BasePlatform struct {
// based on the Cannon Lake platform
cnl.BasePlatform
}
func InitBasePlatform(dw0, dw0mask uint32, dw1, dw1mask uint32) BasePlatform {
return BasePlatform{cnl.InitBasePlatform(dw0, dw0mask, dw1, dw1mask)}
}
func GetPlatform(dw0, dw1 uint32) common.PlatformIf {
p := InitBasePlatform(dw0, DW0Mask, dw1, DW1Mask)
return &p
}
// Override BasePlatform.RemapResetSource()
func (p *BasePlatform) RemapResetSource(m *common.Macro) {
// Some code is here
}
```
- Use `GetPlatform()` and `GPPGroups[]` in the file `./platform/platform.go` to define the
resources for the parser.
- Add the platform argument for the options `-p` (`-platform`) to `cli/options.go`.
- Update the documentation in `Documentation/util/intelp2m/index.md`.
- Add unit tests.
[Here](https://review.coreboot.org/c/coreboot/+/84191) is an example of porting the Intel
Jasper lake platform.
### Unit testing
Please run the tests before creating a new commit:
```bash
make test
```
If successful, all tests contain the PASS prefix.
|