blob: c3bdfc88b1159df7fb507f201a1b97d229e739d5 [file] [log] [blame]
Matt DeVillier5eeead2d2020-08-09 14:13:56 -05001package cnl
2
3import "strings"
4import "fmt"
5
6// Local packages
7import "../common"
8import "../../config"
9import "../../fields"
10import "../snr"
11
12const (
13 PAD_CFG_DW0_RO_FIELDS = (0x1 << 27) | (0x1 << 24) | (0x3 << 21) | (0xf << 16) | 0xfc
14 PAD_CFG_DW1_RO_FIELDS = 0xfdffc3ff
15)
16
17const (
18 PAD_CFG_DW0 = common.PAD_CFG_DW0
19 PAD_CFG_DW1 = common.PAD_CFG_DW1
20 MAX_DW_NUM = common.MAX_DW_NUM
21)
22
23type InheritanceMacro interface {
24 GpoMacroAdd()
25 NativeFunctionMacroAdd()
26 NoConnMacroAdd()
27}
28
29type PlatformSpecific struct {
30 InheritanceMacro
31 InheritanceTemplate
32}
33
34// RemmapRstSrc - remmap Pad Reset Source Config
35func (PlatformSpecific) RemmapRstSrc() {
36 macro := common.GetMacro()
37 if config.TemplateGet() != config.TempInteltool {
38 // Use reset source remapping only if the input file is inteltool.log dump
39 return
40 }
41 if strings.Contains(macro.PadIdGet(), "GPP_A") ||
42 strings.Contains(macro.PadIdGet(), "GPP_B") ||
43 strings.Contains(macro.PadIdGet(), "GPP_G") {
44 // See reset map for the Cannonlake Groups the Community 0:
45 // https://github.com/coreboot/coreboot/blob/master/src/soc/intel/cannonlake/gpio.c#L14
46 // remmap is not required because it is the same as common.
47 return
48 }
49
50 dw0 := macro.Register(PAD_CFG_DW0)
51 var remapping = map[uint8]uint32{
52 0: common.RST_RSMRST << common.PadRstCfgShift,
53 1: common.RST_DEEP << common.PadRstCfgShift,
54 2: common.RST_PLTRST << common.PadRstCfgShift,
55 }
56 resetsrc, valid := remapping[dw0.GetResetConfig()]
57 if valid {
58 // dw0.SetResetConfig(resetsrc)
59 ResetConfigFieldVal := (dw0.ValueGet() & 0x3fffffff) | remapping[dw0.GetResetConfig()]
60 dw0.ValueSet(ResetConfigFieldVal)
61 } else {
62 fmt.Println("Invalid Pad Reset Config [ 0x", resetsrc ," ] for ", macro.PadIdGet())
63 }
64 dw0.CntrMaskFieldsClear(common.PadRstCfgMask)
65}
66
67// Adds The Pad Termination (TERM) parameter from PAD_CFG_DW1 to the macro
68// as a new argument
69func (PlatformSpecific) Pull() {
70 macro := common.GetMacro()
71 dw1 := macro.Register(PAD_CFG_DW1)
72 var pull = map[uint8]string{
73 0x0: "NONE",
74 0x2: "DN_5K",
75 0x4: "DN_20K",
76 0x9: "UP_1K",
77 0xa: "UP_5K",
78 0xb: "UP_2K",
79 0xc: "UP_20K",
80 0xd: "UP_667",
81 0xf: "NATIVE",
82 }
83 str, valid := pull[dw1.GetTermination()]
84 if !valid {
85 str = "INVALID"
86 fmt.Println("Error",
87 macro.PadIdGet(),
88 " invalid TERM value = ",
89 int(dw1.GetTermination()))
90 }
91 macro.Separator().Add(str)
92}
93
94// Generate macro to cause peripheral IRQ when configured in GPIO input mode
95func ioApicRoute() bool {
96 macro := common.GetMacro()
97 dw0 := macro.Register(PAD_CFG_DW0)
98 if dw0.GetGPIOInputRouteIOxAPIC() == 0 {
99 return false
100 }
101
102 macro.Add("_APIC")
103 // PAD_CFG_GPI_APIC(pad, pull, rst, trig, inv)
104 macro.Add("(").Id().Pull().Rstsrc().Trig().Invert().Add("),")
105 return true
106}
107
108// Generate macro to cause NMI when configured in GPIO input mode
109func nmiRoute() bool {
110 macro := common.GetMacro()
111 if macro.Register(PAD_CFG_DW0).GetGPIOInputRouteNMI() == 0 {
112 return false
113 }
114 // PAD_CFG_GPI_NMI(GPIO_24, UP_20K, DEEP, LEVEL, INVERT),
115 macro.Add("_NMI").Add("(").Id().Pull().Rstsrc().Trig().Invert().Add("),")
116 return true
117}
118
119// Generate macro to cause SCI when configured in GPIO input mode
120func sciRoute() bool {
121 macro := common.GetMacro()
122 dw0 := macro.Register(PAD_CFG_DW0)
123 if dw0.GetGPIOInputRouteSCI() == 0 {
124 return false
125 }
126 // PAD_CFG_GPI_SCI(pad, pull, rst, trig, inv)
127 macro.Add("_SCI").Add("(").Id().Pull().Rstsrc().Trig().Invert().Add("),")
128 return true
129}
130
131// Generate macro to cause SMI when configured in GPIO input mode
132func smiRoute() bool {
133 macro := common.GetMacro()
134 dw0 := macro.Register(PAD_CFG_DW0)
135 if dw0.GetGPIOInputRouteSMI() == 0 {
136 return false
137 }
138 // PAD_CFG_GPI_SMI(pad, pull, rst, trig, inv)
139 macro.Add("_SMI").Add("(").Id().Pull().Rstsrc().Trig().Invert().Add("),")
140 return true
141}
142
143// Adds PAD_CFG_GPI macro with arguments
144func (PlatformSpecific) GpiMacroAdd() {
145 macro := common.GetMacro()
146 var ids []string
147 macro.Set("PAD_CFG_GPI")
148 for routeid, isRoute := range map[string]func() (bool) {
149 "IOAPIC": ioApicRoute,
150 "SCI": sciRoute,
151 "SMI": smiRoute,
152 "NMI": nmiRoute,
153 } {
154 if isRoute() {
155 ids = append(ids, routeid)
156 }
157 }
158
159 switch argc := len(ids); argc {
160 case 0:
161 // e.g. PAD_CFG_GPI_TRIG_OWN(pad, pull, rst, trig, own)
162 macro.Add("_TRIG_OWN").Add("(").Id().Pull().Rstsrc().Trig().Own().Add("),")
163 case 1:
164 // GPI with IRQ route
165 if config.AreFieldsIgnored() {
166 // Set Host Software Ownership to ACPI mode
167 macro.SetPadOwnership(common.PAD_OWN_ACPI)
168 }
169
170 case 2:
171 // PAD_CFG_GPI_DUAL_ROUTE(pad, pull, rst, trig, inv, route1, route2)
172 macro.Set("PAD_CFG_GPI_DUAL_ROUTE(").Id().Pull().Rstsrc().Trig().Invert()
173 macro.Add(", " + ids[0] + ", " + ids[1] + "),")
174 if config.AreFieldsIgnored() {
175 // Set Host Software Ownership to ACPI mode
176 macro.SetPadOwnership(common.PAD_OWN_ACPI)
177 }
178 default:
179 // Clear the control mask so that the check fails and "Advanced" macro is
180 // generated
181 macro.Register(PAD_CFG_DW0).CntrMaskFieldsClear(common.AllFields)
182 }
183}
184
185// Adds PAD_CFG_GPO macro with arguments
186func (platform PlatformSpecific) GpoMacroAdd() {
187 platform.InheritanceMacro.GpoMacroAdd()
188}
189
190// Adds PAD_CFG_NF macro with arguments
191func (platform PlatformSpecific) NativeFunctionMacroAdd() {
192 platform.InheritanceMacro.NativeFunctionMacroAdd()
193}
194
195// Adds PAD_NC macro
196func (platform PlatformSpecific) NoConnMacroAdd() {
197 platform.InheritanceMacro.NoConnMacroAdd()
198}
199
200// GenMacro - generate pad macro
201// dw0 : DW0 config register value
202// dw1 : DW1 config register value
203// return: string of macro
204// error
205func (PlatformSpecific) GenMacro(id string, dw0 uint32, dw1 uint32, ownership uint8) string {
206 macro := common.GetInstanceMacro(PlatformSpecific{InheritanceMacro : snr.PlatformSpecific{}},
207 fields.InterfaceGet())
208 macro.Clear()
209 macro.Register(PAD_CFG_DW0).CntrMaskFieldsClear(common.AllFields)
210 macro.Register(PAD_CFG_DW0).CntrMaskFieldsClear(common.AllFields)
211 macro.PadIdSet(id).SetPadOwnership(ownership)
212 macro.Register(PAD_CFG_DW0).ValueSet(dw0).ReadOnlyFieldsSet(PAD_CFG_DW0_RO_FIELDS)
213 macro.Register(PAD_CFG_DW1).ValueSet(dw1).ReadOnlyFieldsSet(PAD_CFG_DW1_RO_FIELDS)
214 return macro.Generate()
215}