1 /* SPDX-License-Identifier: GPL-2.0-only */
2
3 #include <acpi/acpi_pm.h>
4 #include <device/mmio.h>
5 #include <device/device.h>
6 #include <console/console.h>
7 #include <elog.h>
8 #include <gpio.h>
9 #include <amdblocks/acpi.h>
10 #include <amdblocks/acpimmio.h>
11 #include <amdblocks/gpio.h>
12 #include <amdblocks/smi.h>
13 #include <soc/smi.h>
14 #include <assert.h>
15 #include <string.h>
16 #include <types.h>
17
18 /*
19 * acpimmio_gpio0, acpimmio_remote_gpio and acpimmio_iomux are defined in
20 * soc/amd/common/block/acpimmio/mmio_util.c and declared as extern variables/constants in
21 * amdblocks/acpimmio.h which is included in this file.
22 */
23
24 /* MMIO access of new-style GPIO bank configuration registers */
gpio_ctrl_ptr(gpio_t gpio_num)25 static inline void *gpio_ctrl_ptr(gpio_t gpio_num)
26 {
27 if (SOC_GPIO_TOTAL_PINS < AMD_GPIO_FIRST_REMOTE_GPIO_NUMBER ||
28 /* Verstage on PSP would need to map acpimmio_remote_gpio */
29 (CONFIG(VBOOT_STARTS_BEFORE_BOOTBLOCK) && ENV_SEPARATE_VERSTAGE) ||
30 gpio_num < AMD_GPIO_FIRST_REMOTE_GPIO_NUMBER)
31 return acpimmio_gpio0 + gpio_num * sizeof(uint32_t);
32 else
33 return acpimmio_remote_gpio +
34 (gpio_num - AMD_GPIO_FIRST_REMOTE_GPIO_NUMBER) * sizeof(uint32_t);
35 }
36
gpio_read32(gpio_t gpio_num)37 static inline uint32_t gpio_read32(gpio_t gpio_num)
38 {
39 return read32(gpio_ctrl_ptr(gpio_num));
40 }
41
gpio_write32(gpio_t gpio_num,uint32_t value)42 static inline void gpio_write32(gpio_t gpio_num, uint32_t value)
43 {
44 write32(gpio_ctrl_ptr(gpio_num), value);
45 }
46
gpio_mux_ptr(gpio_t gpio_num)47 static inline void *gpio_mux_ptr(gpio_t gpio_num)
48 {
49 if (SOC_GPIO_TOTAL_PINS < AMD_GPIO_FIRST_REMOTE_GPIO_NUMBER ||
50 /* Verstage on PSP would need to map acpimmio_remote_gpio */
51 (CONFIG(VBOOT_STARTS_BEFORE_BOOTBLOCK) && ENV_SEPARATE_VERSTAGE) ||
52 gpio_num < AMD_GPIO_FIRST_REMOTE_GPIO_NUMBER)
53 return acpimmio_iomux + gpio_num;
54 else
55 return acpimmio_remote_gpio + AMD_GPIO_REMOTE_GPIO_MUX_OFFSET +
56 (gpio_num - AMD_GPIO_FIRST_REMOTE_GPIO_NUMBER);
57 }
58
get_gpio_mux(gpio_t gpio_num)59 static uint8_t get_gpio_mux(gpio_t gpio_num)
60 {
61 return read8(gpio_mux_ptr(gpio_num));
62 }
63
set_gpio_mux(gpio_t gpio_num,uint8_t function)64 static void set_gpio_mux(gpio_t gpio_num, uint8_t function)
65 {
66 write8(gpio_mux_ptr(gpio_num), function & AMD_GPIO_MUX_MASK);
67 get_gpio_mux(gpio_num); /* Flush posted write */
68 }
69
get_gpio_gevent(gpio_t gpio,const struct soc_amd_event * table,size_t items)70 static int get_gpio_gevent(gpio_t gpio, const struct soc_amd_event *table,
71 size_t items)
72 {
73 size_t i;
74
75 for (i = 0; i < items; i++) {
76 if ((table + i)->gpio == gpio)
77 return (int)(table + i)->event;
78 }
79 return -1;
80 }
81
program_smi(uint32_t flags,unsigned int gevent_num)82 static void program_smi(uint32_t flags, unsigned int gevent_num)
83 {
84 uint8_t level;
85
86 if (!is_gpio_event_level_triggered(flags)) {
87 printk(BIOS_ERR, "%s - Only level trigger allowed for SMI!\n", __func__);
88 BUG();
89 return;
90 }
91
92 if (is_gpio_event_active_high(flags))
93 level = SMI_SCI_LVL_HIGH;
94 else
95 level = SMI_SCI_LVL_LOW;
96
97 configure_gevent_smi(gevent_num, SMI_MODE_SMI, level);
98 }
99
100 /*
101 * For each general purpose event, GPE, the choice of edge/level triggered
102 * event is represented as a single bit in SMI_SCI_LEVEL register.
103 *
104 * In a similar fashion, polarity (rising/falling, hi/lo) of each GPE is
105 * represented as a single bit in SMI_SCI_TRIG register.
106 */
program_sci(uint32_t flags,unsigned int gevent_num)107 static void program_sci(uint32_t flags, unsigned int gevent_num)
108 {
109 struct sci_source sci;
110
111 sci.scimap = gevent_num;
112 sci.gpe = gevent_num;
113
114 if (is_gpio_event_level_triggered(flags))
115 sci.level = SMI_SCI_LVL;
116 else
117 sci.level = SMI_SCI_EDG;
118
119 if (is_gpio_event_active_high(flags))
120 sci.direction = SMI_SCI_LVL_HIGH;
121 else
122 sci.direction = SMI_SCI_LVL_LOW;
123
124 configure_scimap(&sci);
125 }
126
gpio_update32(gpio_t gpio_num,uint32_t mask,uint32_t or)127 static void gpio_update32(gpio_t gpio_num, uint32_t mask, uint32_t or)
128 {
129 uint32_t reg;
130
131 reg = gpio_read32(gpio_num);
132 reg &= mask;
133 reg |= or;
134 gpio_write32(gpio_num, reg);
135 }
136
137 /* Set specified bits of a register to match those of ctrl. */
gpio_setbits32(gpio_t gpio_num,uint32_t mask,uint32_t ctrl)138 static void gpio_setbits32(gpio_t gpio_num, uint32_t mask, uint32_t ctrl)
139 {
140 gpio_update32(gpio_num, ~mask, ctrl & mask);
141 }
142
gpio_and32(gpio_t gpio_num,uint32_t mask)143 static void gpio_and32(gpio_t gpio_num, uint32_t mask)
144 {
145 gpio_update32(gpio_num, mask, 0);
146 }
147
gpio_or32(gpio_t gpio_num,uint32_t or)148 static void gpio_or32(gpio_t gpio_num, uint32_t or)
149 {
150 gpio_update32(gpio_num, 0xffffffff, or);
151 }
152
master_switch_clr(uint32_t mask)153 static void master_switch_clr(uint32_t mask)
154 {
155 const gpio_t master_reg = GPIO_MASTER_SWITCH / sizeof(uint32_t);
156 gpio_and32(master_reg, ~mask);
157 }
158
master_switch_set(uint32_t or)159 static void master_switch_set(uint32_t or)
160 {
161 const gpio_t master_reg = GPIO_MASTER_SWITCH / sizeof(uint32_t);
162 gpio_or32(master_reg, or);
163 }
164
gpio_get(gpio_t gpio_num)165 int gpio_get(gpio_t gpio_num)
166 {
167 uint32_t reg;
168
169 reg = gpio_read32(gpio_num);
170 return !!(reg & GPIO_PIN_STS);
171 }
172
gpio_set(gpio_t gpio_num,int value)173 void gpio_set(gpio_t gpio_num, int value)
174 {
175 gpio_setbits32(gpio_num, GPIO_OUTPUT_VALUE, value ? GPIO_OUTPUT_VALUE : 0);
176 }
177
gpio_input_pulldown(gpio_t gpio_num)178 void gpio_input_pulldown(gpio_t gpio_num)
179 {
180 gpio_setbits32(gpio_num, GPIO_PULL_MASK | GPIO_OUTPUT_ENABLE, GPIO_PULLDOWN_ENABLE);
181 }
182
gpio_input_pullup(gpio_t gpio_num)183 void gpio_input_pullup(gpio_t gpio_num)
184 {
185 gpio_setbits32(gpio_num, GPIO_PULL_MASK | GPIO_OUTPUT_ENABLE, GPIO_PULLUP_ENABLE);
186 }
187
gpio_input(gpio_t gpio_num)188 void gpio_input(gpio_t gpio_num)
189 {
190 gpio_and32(gpio_num, ~(GPIO_PULL_MASK | GPIO_OUTPUT_ENABLE));
191 }
192
gpio_output(gpio_t gpio_num,int value)193 void gpio_output(gpio_t gpio_num, int value)
194 {
195 /* set GPIO output value before setting the direction to output to avoid glitches */
196 gpio_set(gpio_num, value);
197 gpio_or32(gpio_num, GPIO_OUTPUT_ENABLE);
198 }
199
gpio_acpi_path(gpio_t gpio)200 const char *gpio_acpi_path(gpio_t gpio)
201 {
202 return "\\_SB.GPIO";
203 }
204
gpio_acpi_pin(gpio_t gpio)205 uint16_t gpio_acpi_pin(gpio_t gpio)
206 {
207 return gpio;
208 }
209
gpio_save_pin_registers(gpio_t gpio,struct soc_amd_gpio_register_save * save)210 void gpio_save_pin_registers(gpio_t gpio, struct soc_amd_gpio_register_save *save)
211 {
212 save->mux_value = get_gpio_mux(gpio);
213 save->control_value = gpio_read32(gpio);
214 }
215
gpio_restore_pin_registers(gpio_t gpio,struct soc_amd_gpio_register_save * save)216 void gpio_restore_pin_registers(gpio_t gpio, struct soc_amd_gpio_register_save *save)
217 {
218 set_gpio_mux(gpio, save->mux_value);
219 gpio_write32(gpio, save->control_value);
220 gpio_read32(gpio); /* Flush posted write */
221 }
222
set_single_gpio(const struct soc_amd_gpio * g)223 static void set_single_gpio(const struct soc_amd_gpio *g)
224 {
225 static const struct soc_amd_event *gev_tbl;
226 static size_t gev_items;
227 int gevent_num;
228 const bool can_set_smi_flags = !((CONFIG(VBOOT_STARTS_BEFORE_BOOTBLOCK) &&
229 ENV_SEPARATE_VERSTAGE) ||
230 CONFIG(SOC_AMD_COMMON_BLOCK_BANKED_GPIOS_NON_SOC_CODEBASE));
231
232 set_gpio_mux(g->gpio, g->function);
233
234 gpio_setbits32(g->gpio, PAD_CFG_MASK, g->control);
235 /* Clear interrupt and wake status (write 1-to-clear bits) */
236 gpio_or32(g->gpio, GPIO_INT_STATUS | GPIO_WAKE_STATUS);
237 if (g->flags == 0)
238 return;
239
240 /* Can't set SMI flags from PSP */
241 if (!can_set_smi_flags)
242 return;
243
244 if (gev_tbl == NULL)
245 soc_get_gpio_event_table(&gev_tbl, &gev_items);
246
247 gevent_num = get_gpio_gevent(g->gpio, gev_tbl, gev_items);
248 if (gevent_num < 0) {
249 printk(BIOS_WARNING, "GPIO pin %d has no associated gevent!\n",
250 g->gpio);
251 return;
252 }
253
254 if (g->flags & GPIO_FLAG_SMI) {
255 program_smi(g->flags, gevent_num);
256 } else if (g->flags & GPIO_FLAG_SCI) {
257 program_sci(g->flags, gevent_num);
258 }
259 }
260
gpio_configure_pads_with_override(const struct soc_amd_gpio * base_cfg,size_t base_num_pads,const struct soc_amd_gpio * override_cfg,size_t override_num_pads)261 void gpio_configure_pads_with_override(const struct soc_amd_gpio *base_cfg,
262 size_t base_num_pads,
263 const struct soc_amd_gpio *override_cfg,
264 size_t override_num_pads)
265 {
266 const struct soc_amd_gpio *c;
267 size_t i, j;
268
269 if (!base_cfg || !base_num_pads)
270 return;
271
272 /*
273 * Disable blocking wake/interrupt status generation while updating
274 * debounce registers. Otherwise when a debounce register is updated
275 * the whole GPIO controller will zero out all interrupt enable status
276 * bits while the delay happens. This could cause us to drop the bits
277 * due to the read-modify-write that happens on each register.
278 *
279 * Additionally disable interrupt generation so we don't get any
280 * spurious interrupts while updating the registers.
281 */
282 master_switch_clr(GPIO_MASK_STS_EN | GPIO_INTERRUPT_EN);
283
284 for (i = 0; i < base_num_pads; i++) {
285 c = &base_cfg[i];
286 /* Check if override exist for GPIO from the base configuration */
287 for (j = 0; override_cfg && j < override_num_pads; j++) {
288 if (c->gpio == override_cfg[j].gpio) {
289 c = &override_cfg[j];
290 break;
291 }
292 }
293 set_single_gpio(c);
294 }
295
296 /*
297 * Re-enable interrupt status generation.
298 *
299 * We leave MASK_STATUS disabled because the kernel may reconfigure the
300 * debounce registers while the drivers load. This will cause interrupts
301 * to be missed during boot.
302 */
303 master_switch_set(GPIO_INTERRUPT_EN);
304 }
305
gpio_configure_pads(const struct soc_amd_gpio * gpio_list_ptr,size_t size)306 void gpio_configure_pads(const struct soc_amd_gpio *gpio_list_ptr, size_t size)
307 {
308 gpio_configure_pads_with_override(gpio_list_ptr, size, NULL, 0);
309 }
310
gpio_interrupt_status(gpio_t gpio)311 int gpio_interrupt_status(gpio_t gpio)
312 {
313 uint32_t reg = gpio_read32(gpio);
314
315 if (reg & GPIO_INT_STATUS) {
316 /* Clear interrupt status, preserve wake status */
317 reg &= ~GPIO_WAKE_STATUS;
318 gpio_write32(gpio, reg);
319 return 1;
320 }
321
322 return 0;
323 }
324
check_and_add_wake_gpio(gpio_t begin,gpio_t end,struct gpio_wake_state * state)325 static void check_and_add_wake_gpio(gpio_t begin, gpio_t end, struct gpio_wake_state *state)
326 {
327 gpio_t i;
328 uint32_t reg;
329
330 for (i = begin; i < end; i++) {
331 reg = gpio_read32(i);
332 if (!(reg & GPIO_WAKE_STATUS))
333 continue;
334 printk(BIOS_INFO, "GPIO %d woke system.\n", i);
335 if (state->num_valid_wake_gpios >= ARRAY_SIZE(state->wake_gpios))
336 continue;
337 state->wake_gpios[state->num_valid_wake_gpios++] = i;
338 }
339 }
340
check_gpios(uint32_t wake_stat,unsigned int bit_limit,gpio_t gpio_base,struct gpio_wake_state * state)341 static void check_gpios(uint32_t wake_stat, unsigned int bit_limit, gpio_t gpio_base,
342 struct gpio_wake_state *state)
343 {
344 unsigned int i;
345 gpio_t begin;
346 gpio_t end;
347
348 for (i = 0; i < bit_limit; i++) {
349 if (!(wake_stat & BIT(i)))
350 continue;
351 /* Each wake status register bit is for 4 GPIOs that then will be checked */
352 begin = gpio_base + i * 4;
353 end = begin + 4;
354 /* There is no gpio 63. */
355 if (begin == 60)
356 end = 63;
357 check_and_add_wake_gpio(begin, end, state);
358 }
359 }
360
gpio_fill_wake_state(struct gpio_wake_state * state)361 void gpio_fill_wake_state(struct gpio_wake_state *state)
362 {
363 /* Turn the wake registers into "gpio" index to conform to existing API. */
364 const gpio_t stat0 = GPIO_WAKE_STAT_0 / sizeof(uint32_t);
365 const gpio_t stat1 = GPIO_WAKE_STAT_1 / sizeof(uint32_t);
366 const gpio_t control_switch = GPIO_MASTER_SWITCH / sizeof(uint32_t);
367
368 memset(state, 0, sizeof(*state));
369
370 state->control_switch = gpio_read32(control_switch);
371 state->wake_stat[0] = gpio_read32(stat0);
372 state->wake_stat[1] = gpio_read32(stat1);
373
374 printk(BIOS_INFO, "GPIO Control Switch: 0x%08x, Wake Stat 0: 0x%08x, Wake Stat 1: 0x%08x\n",
375 state->control_switch, state->wake_stat[0], state->wake_stat[1]);
376
377 check_gpios(state->wake_stat[0], 32, 0, state);
378 check_gpios(state->wake_stat[1], 14, 128, state);
379 }
380
gpio_add_events(void)381 void gpio_add_events(void)
382 {
383 const struct chipset_power_state *ps;
384 const struct gpio_wake_state *state;
385 unsigned int i;
386 unsigned int end;
387
388 if (acpi_fetch_pm_state(&ps, PS_CLAIMER_ELOG) < 0)
389 return;
390 state = &ps->gpio_state;
391
392 end = MIN(state->num_valid_wake_gpios, ARRAY_SIZE(state->wake_gpios));
393 for (i = 0; i < end; i++)
394 elog_add_event_wake(ELOG_WAKE_SOURCE_GPIO, state->wake_gpios[i]);
395 }
396