Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/dev/amdgpio/amdgpio.h
39507 views
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause
3
*
4
* Copyright (c) 2018 Advanced Micro Devices
5
* All rights reserved.
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
15
*
16
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26
* SUCH DAMAGE.
27
*/
28
29
#ifdef DEBUG
30
#define dprintf(fmt, args...) do { \
31
printf("%s(): ", __func__); \
32
printf(fmt,##args); \
33
} while (0)
34
#else
35
#define dprintf(fmt, args...)
36
#endif
37
38
#define AMD_GPIO_PREFIX "AMDGPIO"
39
40
#define AMD_GPIO_NUM_PIN_BANK 4
41
#define AMD_GPIO_PINS_PER_BANK 64
42
#define AMD_GPIO_PINS_MAX 256 /* 4 banks * 64 pins */
43
44
/* Number of pins in each bank */
45
#define AMD_GPIO_PINS_BANK0 63
46
#define AMD_GPIO_PINS_BANK1 64
47
#define AMD_GPIO_PINS_BANK2 56
48
#define AMD_GPIO_PINS_BANK3 32
49
#define AMD_GPIO_PIN_PRESENT (AMD_GPIO_PINS_BANK0 + \
50
AMD_GPIO_PINS_BANK1 + \
51
AMD_GPIO_PINS_BANK2 + \
52
AMD_GPIO_PINS_BANK3)
53
#define AMDGPIO_DEFAULT_CAPS (GPIO_PIN_INPUT | GPIO_PIN_OUTPUT | \
54
GPIO_PIN_PULLDOWN | GPIO_PIN_PULLUP)
55
56
/* Register related macros */
57
#define AMDGPIO_PIN_REGISTER(pin) (pin * 4)
58
59
#define WAKE_INT_MASTER_REG 0xfc
60
#define EOI_MASK (1 << 29)
61
#define WAKE_INT_STATUS_REG0 0x2f8
62
#define WAKE_INT_STATUS_REG1 0x2fc
63
64
/* Bit definition of 32 bits of each pin register */
65
#define DB_TMR_OUT_OFF 0
66
#define DB_TMR_OUT_UNIT_OFF 4
67
#define DB_CNTRL_OFF 5
68
#define DB_TMR_LARGE_OFF 7
69
#define LEVEL_TRIG_OFF 8
70
#define ACTIVE_LEVEL_OFF 9
71
#define INTERRUPT_ENABLE_OFF 11
72
#define INTERRUPT_MASK_OFF 12
73
#define WAKE_CNTRL_OFF_S0I3 13
74
#define WAKE_CNTRL_OFF_S3 14
75
#define WAKE_CNTRL_OFF_S4 15
76
#define PIN_STS_OFF 16
77
#define DRV_STRENGTH_SEL_OFF 17
78
#define PULL_UP_SEL_OFF 19
79
#define PULL_UP_ENABLE_OFF 20
80
#define PULL_DOWN_ENABLE_OFF 21
81
#define OUTPUT_VALUE_OFF 22
82
#define OUTPUT_ENABLE_OFF 23
83
#define SW_CNTRL_IN_OFF 24
84
#define SW_CNTRL_EN_OFF 25
85
#define INTERRUPT_STS_OFF 28
86
#define WAKE_STS_OFF 29
87
88
#define UNSERVICED_INTERRUPT_MASK \
89
((1 << INTERRUPT_STS_OFF) | (1 << WAKE_STS_OFF))
90
91
#define DB_TMR_OUT_MASK 0xFUL
92
#define DB_CNTRL_MASK 0x3UL
93
#define ACTIVE_LEVEL_MASK 0x3UL
94
#define DRV_STRENGTH_SEL_MASK 0x3UL
95
96
#define DB_TYPE_NO_DEBOUNCE 0x0UL
97
#define DB_TYPE_PRESERVE_LOW_GLITCH 0x1UL
98
#define DB_TYPE_PRESERVE_HIGH_GLITCH 0x2UL
99
#define DB_TYPE_REMOVE_GLITCH 0x3UL
100
101
#define EDGE_TRIGGER 0x0UL
102
#define LEVEL_TRIGGER 0x1UL
103
104
#define ACTIVE_HIGH 0x0UL
105
#define ACTIVE_LOW 0x1UL
106
#define BOTH_EDGE 0x2UL
107
108
#define ENABLE_INTERRUPT 0x1UL
109
#define DISABLE_INTERRUPT 0x0UL
110
111
#define ENABLE_INTERRUPT_MASK 0x0UL
112
#define DISABLE_INTERRUPT_MASK 0x1UL
113
#define CLR_INTR_STAT 0x1UL
114
115
#define BIT(bit) (1 << bit)
116
#define GPIO_PIN_INFO(p, n) { .pin_num = (p), .pin_name = (n) }
117
118
struct pin_info {
119
int pin_num;
120
char *pin_name;
121
};
122
123
/* Pins exposed to drivers */
124
static const struct pin_info kernzp_pins[] = {
125
GPIO_PIN_INFO(0, "PIN_0"),
126
GPIO_PIN_INFO(1, "PIN_1"),
127
GPIO_PIN_INFO(2, "PIN_2"),
128
GPIO_PIN_INFO(3, "PIN_3"),
129
GPIO_PIN_INFO(4, "PIN_4"),
130
GPIO_PIN_INFO(5, "PIN_5"),
131
GPIO_PIN_INFO(6, "PIN_6"),
132
GPIO_PIN_INFO(7, "PIN_7"),
133
GPIO_PIN_INFO(8, "PIN_8"),
134
GPIO_PIN_INFO(9, "PIN_9"),
135
GPIO_PIN_INFO(10, "PIN_10"),
136
GPIO_PIN_INFO(11, "PIN_11"),
137
GPIO_PIN_INFO(12, "PIN_12"),
138
GPIO_PIN_INFO(13, "PIN_13"),
139
GPIO_PIN_INFO(14, "PIN_14"),
140
GPIO_PIN_INFO(15, "PIN_15"),
141
GPIO_PIN_INFO(16, "PIN_16"),
142
GPIO_PIN_INFO(17, "PIN_17"),
143
GPIO_PIN_INFO(18, "PIN_18"),
144
GPIO_PIN_INFO(19, "PIN_19"),
145
GPIO_PIN_INFO(20, "PIN_20"),
146
GPIO_PIN_INFO(23, "PIN_23"),
147
GPIO_PIN_INFO(24, "PIN_24"),
148
GPIO_PIN_INFO(25, "PIN_25"),
149
GPIO_PIN_INFO(26, "PIN_26"),
150
GPIO_PIN_INFO(39, "PIN_39"),
151
GPIO_PIN_INFO(40, "PIN_40"),
152
GPIO_PIN_INFO(43, "PIN_43"),
153
GPIO_PIN_INFO(46, "PIN_46"),
154
GPIO_PIN_INFO(47, "PIN_47"),
155
GPIO_PIN_INFO(48, "PIN_48"),
156
GPIO_PIN_INFO(49, "PIN_49"),
157
GPIO_PIN_INFO(50, "PIN_50"),
158
GPIO_PIN_INFO(51, "PIN_51"),
159
GPIO_PIN_INFO(52, "PIN_52"),
160
GPIO_PIN_INFO(53, "PIN_53"),
161
GPIO_PIN_INFO(54, "PIN_54"),
162
GPIO_PIN_INFO(55, "PIN_55"),
163
GPIO_PIN_INFO(56, "PIN_56"),
164
GPIO_PIN_INFO(57, "PIN_57"),
165
GPIO_PIN_INFO(58, "PIN_58"),
166
GPIO_PIN_INFO(59, "PIN_59"),
167
GPIO_PIN_INFO(60, "PIN_60"),
168
GPIO_PIN_INFO(61, "PIN_61"),
169
GPIO_PIN_INFO(62, "PIN_62"),
170
GPIO_PIN_INFO(64, "PIN_64"),
171
GPIO_PIN_INFO(65, "PIN_65"),
172
GPIO_PIN_INFO(66, "PIN_66"),
173
GPIO_PIN_INFO(68, "PIN_68"),
174
GPIO_PIN_INFO(69, "PIN_69"),
175
GPIO_PIN_INFO(70, "PIN_70"),
176
GPIO_PIN_INFO(71, "PIN_71"),
177
GPIO_PIN_INFO(72, "PIN_72"),
178
GPIO_PIN_INFO(74, "PIN_74"),
179
GPIO_PIN_INFO(75, "PIN_75"),
180
GPIO_PIN_INFO(76, "PIN_76"),
181
GPIO_PIN_INFO(84, "PIN_84"),
182
GPIO_PIN_INFO(85, "PIN_85"),
183
GPIO_PIN_INFO(86, "PIN_86"),
184
GPIO_PIN_INFO(87, "PIN_87"),
185
GPIO_PIN_INFO(88, "PIN_88"),
186
GPIO_PIN_INFO(89, "PIN_89"),
187
GPIO_PIN_INFO(90, "PIN_90"),
188
GPIO_PIN_INFO(91, "PIN_91"),
189
GPIO_PIN_INFO(92, "PIN_92"),
190
GPIO_PIN_INFO(93, "PIN_93"),
191
GPIO_PIN_INFO(95, "PIN_95"),
192
GPIO_PIN_INFO(96, "PIN_96"),
193
GPIO_PIN_INFO(97, "PIN_97"),
194
GPIO_PIN_INFO(98, "PIN_98"),
195
GPIO_PIN_INFO(99, "PIN_99"),
196
GPIO_PIN_INFO(100, "PIN_100"),
197
GPIO_PIN_INFO(101, "PIN_101"),
198
GPIO_PIN_INFO(102, "PIN_102"),
199
GPIO_PIN_INFO(113, "PIN_113"),
200
GPIO_PIN_INFO(114, "PIN_114"),
201
GPIO_PIN_INFO(115, "PIN_115"),
202
GPIO_PIN_INFO(116, "PIN_116"),
203
GPIO_PIN_INFO(117, "PIN_117"),
204
GPIO_PIN_INFO(118, "PIN_118"),
205
GPIO_PIN_INFO(119, "PIN_119"),
206
GPIO_PIN_INFO(120, "PIN_120"),
207
GPIO_PIN_INFO(121, "PIN_121"),
208
GPIO_PIN_INFO(122, "PIN_122"),
209
GPIO_PIN_INFO(126, "PIN_126"),
210
GPIO_PIN_INFO(129, "PIN_129"),
211
GPIO_PIN_INFO(130, "PIN_130"),
212
GPIO_PIN_INFO(131, "PIN_131"),
213
GPIO_PIN_INFO(132, "PIN_132"),
214
GPIO_PIN_INFO(133, "PIN_133"),
215
GPIO_PIN_INFO(135, "PIN_135"),
216
GPIO_PIN_INFO(136, "PIN_136"),
217
GPIO_PIN_INFO(137, "PIN_137"),
218
GPIO_PIN_INFO(138, "PIN_138"),
219
GPIO_PIN_INFO(139, "PIN_139"),
220
GPIO_PIN_INFO(140, "PIN_140"),
221
GPIO_PIN_INFO(141, "PIN_141"),
222
GPIO_PIN_INFO(142, "PIN_142"),
223
GPIO_PIN_INFO(143, "PIN_143"),
224
GPIO_PIN_INFO(144, "PIN_144"),
225
GPIO_PIN_INFO(145, "PIN_145"),
226
GPIO_PIN_INFO(146, "PIN_146"),
227
GPIO_PIN_INFO(147, "PIN_147"),
228
GPIO_PIN_INFO(148, "PIN_148"),
229
GPIO_PIN_INFO(166, "PIN_166"),
230
GPIO_PIN_INFO(167, "PIN_167"),
231
GPIO_PIN_INFO(168, "PIN_168"),
232
GPIO_PIN_INFO(169, "PIN_169"),
233
GPIO_PIN_INFO(170, "PIN_170"),
234
GPIO_PIN_INFO(171, "PIN_171"),
235
GPIO_PIN_INFO(172, "PIN_172"),
236
GPIO_PIN_INFO(173, "PIN_173"),
237
GPIO_PIN_INFO(174, "PIN_174"),
238
GPIO_PIN_INFO(175, "PIN_175"),
239
GPIO_PIN_INFO(176, "PIN_176"),
240
GPIO_PIN_INFO(177, "PIN_177"),
241
};
242
243
#define AMD_GPIO_PINS_EXPOSED nitems(kernzp_pins)
244
245
static const unsigned i2c0_pins[] = {145, 146};
246
static const unsigned i2c1_pins[] = {147, 148};
247
static const unsigned i2c2_pins[] = {113, 114};
248
static const unsigned i2c3_pins[] = {19, 20};
249
static const unsigned i2c4_pins[] = {149, 150};
250
static const unsigned i2c5_pins[] = {151, 152};
251
252
static const unsigned uart0_pins[] = {135, 136, 137, 138, 139};
253
static const unsigned uart1_pins[] = {140, 141, 142, 143, 144};
254
255
struct amd_pingroup {
256
const char *name;
257
const unsigned *pins;
258
unsigned npins;
259
};
260
261
static const struct amd_pingroup kernzp_groups[] = {
262
{
263
.name = "i2c0",
264
.pins = i2c0_pins,
265
.npins = 2,
266
},
267
{
268
.name = "i2c1",
269
.pins = i2c1_pins,
270
.npins = 2,
271
},
272
{
273
.name = "i2c2",
274
.pins = i2c2_pins,
275
.npins = 2,
276
},
277
{
278
.name = "i2c3",
279
.pins = i2c3_pins,
280
.npins = 2,
281
},
282
{
283
.name = "i2c4",
284
.pins = i2c4_pins,
285
.npins = 2,
286
},
287
{
288
.name = "i2c5",
289
.pins = i2c5_pins,
290
.npins = 2,
291
},
292
{
293
.name = "uart0",
294
.pins = uart0_pins,
295
.npins = 5,
296
},
297
{
298
.name = "uart1",
299
.pins = uart1_pins,
300
.npins = 5,
301
},
302
};
303
304
/* Macros for driver mutex locking */
305
#define AMDGPIO_LOCK_INIT(_sc) \
306
mtx_init(&_sc->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
307
"amdgpio", MTX_SPIN)
308
#define AMDGPIO_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_mtx)
309
#define AMDGPIO_LOCK(_sc) mtx_lock_spin(&(_sc)->sc_mtx)
310
#define AMDGPIO_UNLOCK(_sc) mtx_unlock_spin(&(_sc)->sc_mtx)
311
#define AMDGPIO_ASSERT_LOCKED(_sc) mtx_assert(&(_sc)->sc_mtx, MA_OWNED)
312
#define AMDGPIO_ASSERT_UNLOCKED(_sc) mtx_assert(&(_sc)->sc_mtx, MA_NOTOWNED)
313
314
struct amdgpio_softc {
315
ACPI_HANDLE sc_handle;
316
device_t sc_dev;
317
device_t sc_busdev;
318
const char* sc_bank_prefix;
319
int sc_nbanks;
320
int sc_npins;
321
int sc_ngroups;
322
struct mtx sc_mtx;
323
struct resource *sc_res[2];
324
bus_space_tag_t sc_bst;
325
bus_space_handle_t sc_bsh;
326
struct gpio_pin sc_gpio_pins[AMD_GPIO_PINS_MAX];
327
const struct pin_info *sc_pin_info;
328
const struct amd_pingroup *sc_groups;
329
void *sc_intr_handle;
330
};
331
332
struct amdgpio_sysctl {
333
struct amdgpio_softc *sc;
334
uint32_t pin;
335
};
336
337