xref: /aosp_15_r20/external/coreboot/util/intelp2m/fields/cb/cb.go (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1package cb
2
3import (
4	"review.coreboot.org/coreboot.git/util/intelp2m/config"
5	"review.coreboot.org/coreboot.git/util/intelp2m/platforms/common"
6)
7
8type FieldMacros struct {}
9
10// field - data structure for creating a new bitfield macro object
11// PAD_FUNC(NF3)
12// prefix       : PAD_FUNC
13// name         : NF3; this value will be overridden if the configurator is used
14// unhide       : conditions for hiding macros
15// configurator : method for determining the current configuration of the bit field
16type field struct {
17	prefix       string
18	name         string
19	unhide       bool
20	configurator func()
21}
22
23// generate - wrapper for generating bitfield macros string
24// fields : field structure
25func generate(fields ...*field) {
26	macro := common.GetMacro()
27	var allhidden bool = true
28	for _, field := range fields {
29		if field.unhide {
30			allhidden = false
31			macro.Or()
32			if field.prefix != "" {
33				macro.Add(field.prefix).Add("(")
34			}
35			if field.name != "" {
36				macro.Add(field.name)
37			} else if field.configurator != nil {
38				field.configurator()
39			}
40			if field.prefix != "" {
41				macro.Add(")")
42			}
43		}
44	}
45	if allhidden { macro.Add("0") }
46}
47
48// DecodeDW0 - decode value of DW0 register
49func (FieldMacros) DecodeDW0() {
50	macro := common.GetMacro()
51	dw0 := macro.Register(common.PAD_CFG_DW0)
52	generate(
53		&field {
54			prefix : "PAD_FUNC",
55			// TODO: Find another way to hide PAD_FUNC(GPIO) in the comment with
56			// ignored fields
57			unhide : config.InfoLevelGet() < 3 || dw0.GetPadMode() != 0,
58			configurator : func() { macro.Padfn() },
59		},
60
61		&field {
62			prefix : "PAD_RESET",
63			unhide : dw0.GetResetConfig() != 0,
64			configurator : func() { macro.Rstsrc() },
65		},
66
67		&field {
68			prefix : "PAD_TRIG",
69			unhide : dw0.GetRXLevelEdgeConfiguration() != 0,
70			configurator : func() { macro.Trig() },
71		},
72
73		&field {
74			prefix : "PAD_IRQ_ROUTE",
75			name   : "IOAPIC",
76			unhide : dw0.GetGPIOInputRouteIOxAPIC() != 0,
77		},
78
79		&field {
80			prefix : "PAD_IRQ_ROUTE",
81			name   : "SCI",
82			unhide : dw0.GetGPIOInputRouteSCI() != 0,
83		},
84
85		&field {
86			prefix : "PAD_IRQ_ROUTE",
87			name   : "SMI",
88			unhide : dw0.GetGPIOInputRouteSMI() != 0,
89		},
90
91		&field {
92			prefix : "PAD_IRQ_ROUTE",
93			name   : "NMI",
94			unhide : dw0.GetGPIOInputRouteNMI() != 0,
95		},
96
97		&field {
98			prefix : "PAD_RX_POL",
99			unhide : dw0.GetRxInvert() != 0,
100			configurator : func() { macro.Invert() },
101		},
102
103		&field {
104			prefix : "PAD_BUF",
105			unhide : dw0.GetGPIORxTxDisableStatus() != 0,
106			configurator : func() { macro.Bufdis() },
107		},
108
109		&field {
110			name   : "(1 << 29)",
111			unhide : dw0.GetRXPadStateSelect() != 0,
112		},
113
114		&field {
115			name   : "(1 << 28)",
116			unhide : dw0.GetRXRawOverrideStatus() != 0,
117		},
118
119		&field {
120			name   : "(1 << 1)",
121			unhide : dw0.GetGPIORXState() != 0,
122		},
123
124		&field {
125			name   : "1",
126			unhide : dw0.GetGPIOTXState() != 0,
127		},
128	)
129}
130
131// DecodeDW1 - decode value of DW1 register
132func (FieldMacros) DecodeDW1() {
133	macro := common.GetMacro()
134	dw1 := macro.Register(common.PAD_CFG_DW1)
135	generate(
136		&field {
137			name   : "PAD_CFG1_TOL_1V8",
138			unhide : dw1.GetPadTol() != 0,
139		},
140
141		&field {
142			prefix : "PAD_PULL",
143			unhide : dw1.GetTermination() != 0,
144			configurator : func() { macro.Pull() },
145		},
146
147		&field {
148			prefix : "PAD_IOSSTATE",
149			unhide : dw1.GetIOStandbyState() != 0,
150			configurator : func() { macro.IOSstate() },
151		},
152
153		&field {
154			prefix : "PAD_IOSTERM",
155			unhide : dw1.GetIOStandbyTermination() != 0,
156			configurator : func() { macro.IOTerm() },
157		},
158
159		&field {
160			prefix : "PAD_CFG_OWN_GPIO",
161			unhide : macro.IsOwnershipDriver(),
162			configurator : func() { macro.Own() },
163		},
164	)
165}
166
167// GenerateString - generates the entire string of bitfield macros.
168func (bitfields FieldMacros) GenerateString() {
169	macro := common.GetMacro()
170	macro.Add("_PAD_CFG_STRUCT(").Id().Add(", ")
171	bitfields.DecodeDW0()
172	macro.Add(", ")
173	bitfields.DecodeDW1()
174	macro.Add("),")
175}
176