xref: /aosp_15_r20/external/coreboot/util/intelp2m/main.go (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1package main
2
3import (
4	"flag"
5	"fmt"
6	"os"
7
8	"review.coreboot.org/coreboot.git/util/intelp2m/config"
9	"review.coreboot.org/coreboot.git/util/intelp2m/parser"
10)
11
12// generateOutputFile - generates include file
13// parser            : parser data structure
14func generateOutputFile(parser *parser.ParserData) (err error) {
15
16	config.OutputGenFile.WriteString(`/* SPDX-License-Identifier: GPL-2.0-only */
17
18#ifndef CFG_GPIO_H
19#define CFG_GPIO_H
20
21#include <gpio.h>
22
23/* Pad configuration was generated automatically using intelp2m utility */
24static const struct pad_config gpio_table[] = {`)
25	// Add the pads map
26	parser.PadMapFprint()
27	config.OutputGenFile.WriteString(`};
28
29#endif /* CFG_GPIO_H */
30`)
31	return nil
32}
33
34// main
35func main() {
36	// Command line arguments
37	inputFileName := flag.String("file",
38		"inteltool.log",
39		"the path to the inteltool log file\n")
40
41	outputFileName := flag.String("o",
42		"generate/gpio.h",
43		"the path to the generated file with GPIO configuration\n")
44
45	ignFlag := flag.Bool("ign",
46		false,
47		"exclude fields that should be ignored from advanced macros\n")
48
49	nonCheckFlag := flag.Bool("n",
50		false,
51		"Generate macros without checking.\n" +
52		"\tIn this case, some fields of the configuration registers\n" +
53		"\tDW0 will be ignored.\n")
54
55	infoLevels := []*bool {
56		flag.Bool("i",    false, "Show pads function in the comments"),
57		flag.Bool("ii",   false, "Show DW0/DW1 value in the comments"),
58		flag.Bool("iii",  false, "Show ignored bit fields in the comments"),
59		flag.Bool("iiii", false, "Show target PAD_CFG() macro in the comments"),
60	}
61
62	template := flag.Int("t", 0, "template type number\n"+
63		"\t0 - inteltool.log (default)\n"+
64		"\t1 - gpio.h\n"+
65		"\t2 - your template\n\t")
66
67	platform :=  flag.String("p", "snr", "set platform:\n"+
68		"\tsnr - Sunrise PCH or Skylake/Kaby Lake SoC\n"+
69		"\tlbg - Lewisburg PCH with Xeon SP\n"+
70		"\tapl - Apollo Lake SoC\n"+
71		"\tcnl - CannonLake-LP or Whiskeylake/Coffeelake/Cometlake-U SoC\n"+
72		"\ttgl - TigerLake-H SoC\n"+
73		"\tadl - AlderLake PCH\n"+
74		"\tjsl - Jasper Lake SoC\n"+
75		"\tmtl - MeteorLake SoC\n"+
76		"\tebg - Emmitsburg PCH with Xeon SP\n")
77
78	fieldstyle :=  flag.String("fld", "none", "set fields macros style:\n"+
79		"\tcb  - use coreboot style for bit fields macros\n"+
80		"\tfsp - use fsp style\n"+
81		"\traw - do not convert, print as is\n")
82
83	flag.Parse()
84
85	config.IgnoredFieldsFlagSet(*ignFlag)
86	config.NonCheckingFlagSet(*nonCheckFlag)
87
88	for level, flag := range infoLevels {
89		if *flag {
90			config.InfoLevelSet(level + 1)
91			fmt.Printf("Info level: Use level %d!\n", level + 1)
92			break
93		}
94	}
95
96	if !config.TemplateSet(*template) {
97		fmt.Printf("Error! Unknown template format of input file!\n")
98		os.Exit(1)
99	}
100
101	if valid := config.PlatformSet(*platform); valid != 0 {
102		fmt.Printf("Error: invalid platform -%s!\n", *platform)
103		os.Exit(1)
104	}
105
106	fmt.Println("Log file:", *inputFileName)
107	fmt.Println("Output generated file:", *outputFileName)
108
109	inputRegDumpFile, err := os.Open(*inputFileName)
110	if err != nil {
111		fmt.Printf("Error: inteltool log file was not found!\n")
112		os.Exit(1)
113	}
114
115	if config.FldStyleSet(*fieldstyle) != 0 {
116		fmt.Printf("Error! Unknown bit fields style option -%s!\n", *fieldstyle)
117		os.Exit(1)
118	}
119
120	// create dir for output files
121	err = os.MkdirAll("generate", os.ModePerm)
122	if err != nil {
123		fmt.Printf("Error! Can not create a directory for the generated files!\n")
124		os.Exit(1)
125	}
126
127	// create empty gpio.h file
128	outputGenFile, err := os.Create(*outputFileName)
129	if err != nil {
130		fmt.Printf("Error: unable to generate GPIO config file!\n")
131		os.Exit(1)
132	}
133
134	defer inputRegDumpFile.Close()
135	defer outputGenFile.Close()
136
137	config.OutputGenFile = outputGenFile
138	config.InputRegDumpFile = inputRegDumpFile
139
140	parser := parser.ParserData{}
141	parser.Parse()
142
143	// gpio.h
144	err = generateOutputFile(&parser)
145	if err != nil {
146		fmt.Printf("Error! Can not create the file with GPIO configuration!\n")
147		os.Exit(1)
148	}
149}
150