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