coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
espi_util.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <amdblocks/chip.h>
4 #include <amdblocks/espi.h>
5 #include <amdblocks/lpc.h>
6 #include <arch/mmio.h>
7 #include <console/console.h>
8 #include <espi.h>
9 #include <soc/pci_devs.h>
10 #include <timer.h>
11 #include <types.h>
12 
13 #include "espi_def.h"
14 
16 
18 {
19  espi_bar = bar;
20 }
21 
23 {
24 }
25 
26 static uintptr_t espi_get_bar(void)
27 {
28  if (ENV_X86 && !espi_bar)
30  return espi_bar;
31 }
32 
33 static uint32_t espi_read32(unsigned int reg)
34 {
35  return read32((void *)(espi_get_bar() + reg));
36 }
37 
38 static void espi_write32(unsigned int reg, uint32_t val)
39 {
40  write32((void *)(espi_get_bar() + reg), val);
41 }
42 
43 static uint16_t espi_read16(unsigned int reg)
44 {
45  return read16((void *)(espi_get_bar() + reg));
46 }
47 
48 static void espi_write16(unsigned int reg, uint16_t val)
49 {
50  write16((void *)(espi_get_bar() + reg), val);
51 }
52 
53 static uint8_t espi_read8(unsigned int reg)
54 {
55  return read8((void *)(espi_get_bar() + reg));
56 }
57 
58 static void espi_write8(unsigned int reg, uint8_t val)
59 {
60  write8((void *)(espi_get_bar() + reg), val);
61 }
62 
63 static inline uint32_t espi_decode_io_range_en_bit(unsigned int idx)
64 {
65  return ESPI_DECODE_IO_RANGE_EN(idx);
66 }
67 
68 static inline uint32_t espi_decode_mmio_range_en_bit(unsigned int idx)
69 {
70  return ESPI_DECODE_MMIO_RANGE_EN(idx);
71 }
72 
73 static inline unsigned int espi_io_range_base_reg(unsigned int idx)
74 {
75  return ESPI_IO_RANGE_BASE(idx);
76 }
77 
78 static inline unsigned int espi_io_range_size_reg(unsigned int idx)
79 {
80  return ESPI_IO_RANGE_SIZE(idx);
81 }
82 
83 static inline unsigned int espi_mmio_range_base_reg(unsigned int idx)
84 {
85  return ESPI_MMIO_RANGE_BASE(idx);
86 }
87 
88 static inline unsigned int espi_mmio_range_size_reg(unsigned int idx)
89 {
90  return ESPI_MMIO_RANGE_SIZE(idx);
91 }
92 
93 static void espi_enable_decode(uint32_t decode_en)
94 {
95  uint32_t val;
96 
98  val |= decode_en;
100 }
101 
102 static bool espi_is_decode_enabled(uint32_t decode)
103 {
104  uint32_t val;
105 
107  return !!(val & decode);
108 }
109 
110 static int espi_find_io_window(uint16_t win_base)
111 {
112  int i;
113 
114  for (i = 0; i < ESPI_GENERIC_IO_WIN_COUNT; i++) {
116  continue;
117 
118  if (espi_read16(espi_io_range_base_reg(i)) == win_base)
119  return i;
120  }
121 
122  return -1;
123 }
124 
126 {
127  int i;
128 
129  for (i = 0; i < ESPI_GENERIC_IO_WIN_COUNT; i++) {
131  return i;
132  }
133 
134  return -1;
135 }
136 
137 static void espi_clear_decodes(void)
138 {
139  unsigned int idx;
140 
141  /* First turn off all enable bits, then zero base, range, and size registers */
142  if (CONFIG(SOC_AMD_COMMON_BLOCK_ESPI_RETAIN_PORT80_EN))
144  else
146 
147  for (idx = 0; idx < ESPI_GENERIC_IO_WIN_COUNT; idx++) {
150  }
151  for (idx = 0; idx < ESPI_GENERIC_MMIO_WIN_COUNT; idx++) {
154  }
155 }
156 
157 /*
158  * Returns decode enable bits for standard IO port addresses. If port address is not supported
159  * by standard decode or if the size of window is not 1, then it returns -1.
160  */
161 static int espi_std_io_decode(uint16_t base, size_t size)
162 {
163  if (size == 2 && base == 0x2e)
165 
166  if (size != 1)
167  return -1;
168 
169  switch (base) {
170  case 0x80:
171  return ESPI_DECODE_IO_0x80_EN;
172  case 0x60:
173  case 0x64:
175  case 0x2e:
176  case 0x2f:
178  default:
179  return -1;
180  }
181 }
182 
183 static size_t espi_get_io_window_size(int idx)
184 {
185  return espi_read8(espi_io_range_size_reg(idx)) + 1;
186 }
187 
188 static void espi_write_io_window(int idx, uint16_t base, size_t size)
189 {
191  espi_write8(espi_io_range_size_reg(idx), size - 1);
192 }
193 
194 static enum cb_err espi_open_generic_io_window(uint16_t base, size_t size)
195 {
196  size_t win_size;
197  int idx;
198 
199  for (; size; size -= win_size, base += win_size) {
200  win_size = MIN(size, ESPI_GENERIC_IO_MAX_WIN_SIZE);
201 
202  idx = espi_find_io_window(base);
203  if (idx != -1) {
204  size_t curr_size = espi_get_io_window_size(idx);
205 
206  if (curr_size > win_size) {
207  printk(BIOS_INFO, "eSPI window already configured to be larger than requested! ");
208  printk(BIOS_INFO, "Base: 0x%x, Requested size: 0x%zx, Actual size: 0x%zx\n",
209  base, win_size, curr_size);
210  } else if (curr_size < win_size) {
211  espi_write_io_window(idx, base, win_size);
212  printk(BIOS_INFO, "eSPI window at base: 0x%x resized from 0x%zx to 0x%zx\n",
213  base, curr_size, win_size);
214  }
215 
216  continue;
217  }
218 
220  if (idx == -1) {
221  printk(BIOS_ERR, "Cannot open IO window base %x size %zx\n", base,
222  size);
223  printk(BIOS_ERR, "No more available IO windows!\n");
224  return CB_ERR;
225  }
226 
227  espi_write_io_window(idx, base, win_size);
229  }
230 
231  return CB_SUCCESS;
232 }
233 
234 enum cb_err espi_open_io_window(uint16_t base, size_t size)
235 {
236  int std_io;
237 
238  std_io = espi_std_io_decode(base, size);
239  if (std_io != -1) {
240  espi_enable_decode(std_io);
241  return CB_SUCCESS;
242  } else {
243  return espi_open_generic_io_window(base, size);
244  }
245 }
246 
247 static int espi_find_mmio_window(uint32_t win_base)
248 {
249  int i;
250 
251  for (i = 0; i < ESPI_GENERIC_MMIO_WIN_COUNT; i++) {
253  continue;
254 
255  if (espi_read32(espi_mmio_range_base_reg(i)) == win_base)
256  return i;
257  }
258 
259  return -1;
260 }
261 
263 {
264  int i;
265 
266  for (i = 0; i < ESPI_GENERIC_MMIO_WIN_COUNT; i++) {
268  return i;
269  }
270 
271  return -1;
272 
273 }
274 
275 static size_t espi_get_mmio_window_size(int idx)
276 {
277  return espi_read16(espi_mmio_range_size_reg(idx)) + 1;
278 }
279 
280 static void espi_write_mmio_window(int idx, uint32_t base, size_t size)
281 {
283  espi_write16(espi_mmio_range_size_reg(idx), size - 1);
284 }
285 
286 enum cb_err espi_open_mmio_window(uint32_t base, size_t size)
287 {
288  size_t win_size;
289  int idx;
290 
291  for (; size; size -= win_size, base += win_size) {
292  win_size = MIN(size, ESPI_GENERIC_MMIO_MAX_WIN_SIZE);
293 
295  if (idx != -1) {
296  size_t curr_size = espi_get_mmio_window_size(idx);
297 
298  if (curr_size > win_size) {
299  printk(BIOS_INFO, "eSPI window already configured to be larger than requested! ");
300  printk(BIOS_INFO, "Base: 0x%x, Requested size: 0x%zx, Actual size: 0x%zx\n",
301  base, win_size, curr_size);
302  } else if (curr_size < win_size) {
303  espi_write_mmio_window(idx, base, win_size);
304  printk(BIOS_INFO, "eSPI window at base: 0x%x resized from 0x%zx to 0x%zx\n",
305  base, curr_size, win_size);
306  }
307 
308  continue;
309  }
310 
312  if (idx == -1) {
313  printk(BIOS_ERR, "Cannot open IO window base %x size %zx\n", base,
314  size);
315  printk(BIOS_ERR, "No more available MMIO windows!\n");
316  return CB_ERR;
317  }
318 
319  espi_write_mmio_window(idx, base, win_size);
321  }
322 
323  return CB_SUCCESS;
324 }
325 
326 static const struct espi_config *espi_get_config(void)
327 {
328  const struct soc_amd_common_config *soc_cfg = soc_get_common_config();
329 
330  if (!soc_cfg)
331  die("Common config structure is NULL!\n");
332 
333  return &soc_cfg->espi_config;
334 }
335 
336 static enum cb_err espi_configure_decodes(const struct espi_config *cfg)
337 {
338  int i;
339 
341 
342  for (i = 0; i < ESPI_GENERIC_IO_WIN_COUNT; i++) {
343  if (cfg->generic_io_range[i].size == 0)
344  continue;
346  cfg->generic_io_range[i].size) != CB_SUCCESS)
347  return CB_ERR;
348  }
349 
350  return CB_SUCCESS;
351 }
352 
361 };
362 
363 #define ESPI_CMD_TIMEOUT_US 100
364 #define ESPI_CH_READY_TIMEOUT_US 10000
365 
366 union espi_txhdr0 {
368  struct {
376  };
378 
379 union espi_txhdr1 {
381  struct {
386  };
387 } __packed;
388 
389 union espi_txhdr2 {
391  struct {
394  };
395 } __packed;
396 
397 union espi_txdata {
399  struct {
404  };
405 } __packed;
406 
407 struct espi_cmd {
408  union espi_txhdr0 hdr0;
409  union espi_txhdr1 hdr1;
410  union espi_txhdr2 hdr2;
411  union espi_txdata data;
413 } __packed;
414 
415 /* Wait up to ESPI_CMD_TIMEOUT_US for hardware to clear DNCMD_STATUS bit. */
416 static enum cb_err espi_wait_ready(void)
417 {
418  struct stopwatch sw;
419  union espi_txhdr0 hdr0;
420 
422  do {
424  if (!hdr0.cmd_sts)
425  return CB_SUCCESS;
426  } while (!stopwatch_expired(&sw));
427 
428  return CB_ERR;
429 }
430 
431 /* Clear interrupt status register */
432 static void espi_clear_status(void)
433 {
435  if (status)
437 }
438 
439 /*
440  * Wait up to ESPI_CMD_TIMEOUT_US for interrupt status register to update after sending a
441  * command.
442  */
443 static enum cb_err espi_poll_status(uint32_t *status)
444 {
445  struct stopwatch sw;
446 
448  do {
449  *status = espi_read32(ESPI_SLAVE0_INT_STS);
450  if (*status)
451  return CB_SUCCESS;
452  } while (!stopwatch_expired(&sw));
453 
454  printk(BIOS_ERR, "eSPI timed out waiting for status update.\n");
455 
456  return CB_ERR;
457 }
458 
459 static void espi_show_failure(const struct espi_cmd *cmd, const char *str, uint32_t status)
460 {
461  printk(BIOS_ERR, "eSPI cmd0-cmd2: %08x %08x %08x data: %08x.\n",
462  cmd->hdr0.val, cmd->hdr1.val, cmd->hdr2.val, cmd->data.val);
463  printk(BIOS_ERR, "%s (Status = 0x%x)\n", str, status);
464 }
465 
466 static enum cb_err espi_send_command(const struct espi_cmd *cmd)
467 {
468  uint32_t status;
469 
470  if (CONFIG(ESPI_DEBUG))
471  printk(BIOS_DEBUG, "eSPI cmd0-cmd2: %08x %08x %08x data: %08x.\n",
472  cmd->hdr0.val, cmd->hdr1.val, cmd->hdr2.val, cmd->data.val);
473 
474  if (espi_wait_ready() != CB_SUCCESS) {
475  espi_show_failure(cmd, "Error: eSPI was not ready to accept a command", 0);
476  return CB_ERR;
477  }
478 
480 
484 
485  /* Dword 0 must be last as this write triggers the transaction */
487 
488  if (espi_wait_ready() != CB_SUCCESS) {
489  espi_show_failure(cmd,
490  "Error: eSPI timed out waiting for command to complete", 0);
491  return CB_ERR;
492  }
493 
494  if (espi_poll_status(&status) != CB_SUCCESS) {
495  espi_show_failure(cmd, "Error: eSPI poll status failed", 0);
496  return CB_ERR;
497  }
498 
499  /* If command did not complete downstream, return error. */
500  if (!(status & ESPI_STATUS_DNCMD_COMPLETE)) {
501  espi_show_failure(cmd, "Error: eSPI downstream command completion failure",
502  status);
503  return CB_ERR;
504  }
505 
506  if (status & ~(ESPI_STATUS_DNCMD_COMPLETE | cmd->expected_status_codes)) {
507  espi_show_failure(cmd, "Error: unexpected eSPI status register bits set",
508  status);
509  return CB_ERR;
510  }
511 
513 
514  return CB_SUCCESS;
515 }
516 
517 static enum cb_err espi_send_reset(void)
518 {
519  struct espi_cmd cmd = {
520  .hdr0 = {
522  .cmd_sts = 1,
523  },
524 
525  /*
526  * When performing an in-band reset the host controller and the
527  * peripheral can have mismatched IO configs.
528  *
529  * i.e., The eSPI peripheral can be in IO-4 mode while, the
530  * eSPI host will be in IO-1. This results in the peripheral
531  * getting invalid packets and thus not responding.
532  *
533  * If the peripheral is alerting when we perform an in-band
534  * reset, there is a race condition in espi_send_command.
535  * 1) espi_send_command clears the interrupt status.
536  * 2) eSPI host controller hardware notices the alert and sends
537  * a GET_STATUS.
538  * 3) espi_send_command writes the in-band reset command.
539  * 4) eSPI hardware enqueues the in-band reset until GET_STATUS
540  * is complete.
541  * 5) GET_STATUS fails with NO_RESPONSE and sets the interrupt
542  * status.
543  * 6) eSPI hardware performs in-band reset.
544  * 7) espi_send_command checks the status and sees a
545  * NO_RESPONSE bit.
546  *
547  * As a workaround we allow the NO_RESPONSE status code when
548  * we perform an in-band reset.
549  */
550  .expected_status_codes = ESPI_STATUS_NO_RESPONSE,
551  };
552 
553  return espi_send_command(&cmd);
554 }
555 
556 static enum cb_err espi_send_pltrst(const struct espi_config *mb_cfg, bool assert)
557 {
558  struct espi_cmd cmd = {
559  .hdr0 = {
561  .cmd_sts = 1,
562  .hdata0 = 0, /* 1 VW group */
563  },
564  .data = {
568  },
569  };
570 
571  if (!mb_cfg->vw_ch_en)
572  return CB_SUCCESS;
573 
574  return espi_send_command(&cmd);
575 }
576 
577 /*
578  * In case of get configuration command, hdata0 contains bits 15:8 of the slave register address
579  * and hdata1 contains bits 7:0 of the slave register address.
580  */
581 #define ESPI_CONFIGURATION_HDATA0(a) (((a) >> 8) & 0xff)
582 #define ESPI_CONFIGURATION_HDATA1(a) ((a) & 0xff)
583 
584 static enum cb_err espi_get_configuration(uint16_t slave_reg_addr, uint32_t *config)
585 {
586  struct espi_cmd cmd = {
587  .hdr0 = {
589  .cmd_sts = 1,
590  .hdata0 = ESPI_CONFIGURATION_HDATA0(slave_reg_addr),
591  .hdata1 = ESPI_CONFIGURATION_HDATA1(slave_reg_addr),
592  },
593  };
594 
595  *config = 0;
596 
597  if (espi_send_command(&cmd) != CB_SUCCESS)
598  return CB_ERR;
599 
601 
602  if (CONFIG(ESPI_DEBUG))
603  printk(BIOS_DEBUG, "Get configuration for slave register(0x%x): 0x%x\n",
604  slave_reg_addr, *config);
605 
606  return CB_SUCCESS;
607 }
608 
609 static enum cb_err espi_set_configuration(uint16_t slave_reg_addr, uint32_t config)
610 {
611  struct espi_cmd cmd = {
612  .hdr0 = {
614  .cmd_sts = 1,
615  .hdata0 = ESPI_CONFIGURATION_HDATA0(slave_reg_addr),
616  .hdata1 = ESPI_CONFIGURATION_HDATA1(slave_reg_addr),
617  },
618  .hdr1 = {
619  .val = config,
620  },
621  };
622 
623  return espi_send_command(&cmd);
624 }
625 
627 {
629  return CB_ERR;
630 
632  return CB_SUCCESS;
633 }
634 
635 static void espi_set_io_mode_config(enum espi_io_mode mb_io_mode, uint32_t slave_caps,
636  uint32_t *slave_config, uint32_t *ctrlr_config)
637 {
638  switch (mb_io_mode) {
639  case ESPI_IO_MODE_QUAD:
640  if (espi_slave_supports_quad_io(slave_caps)) {
641  *slave_config |= ESPI_SLAVE_IO_MODE_SEL_QUAD;
642  *ctrlr_config |= ESPI_IO_MODE_QUAD;
643  break;
644  }
645  printk(BIOS_ERR, "eSPI Quad I/O not supported. Dropping to dual mode.\n");
647  case ESPI_IO_MODE_DUAL:
648  if (espi_slave_supports_dual_io(slave_caps)) {
649  *slave_config |= ESPI_SLAVE_IO_MODE_SEL_DUAL;
650  *ctrlr_config |= ESPI_IO_MODE_DUAL;
651  break;
652  }
653  printk(BIOS_ERR, "eSPI Dual I/O not supported. Dropping to single mode.\n");
655  case ESPI_IO_MODE_SINGLE:
656  /* Single I/O mode is always supported. */
657  *slave_config |= ESPI_SLAVE_IO_MODE_SEL_SINGLE;
658  *ctrlr_config |= ESPI_IO_MODE_SINGLE;
659  break;
660  default:
661  die("No supported eSPI I/O modes!\n");
662  }
663 }
664 
665 static void espi_set_op_freq_config(enum espi_op_freq mb_op_freq, uint32_t slave_caps,
666  uint32_t *slave_config, uint32_t *ctrlr_config)
667 {
668  int slave_max_speed_mhz = espi_slave_max_speed_mhz_supported(slave_caps);
669 
670  switch (mb_op_freq) {
671  case ESPI_OP_FREQ_66_MHZ:
672  if (slave_max_speed_mhz >= 66) {
673  *slave_config |= ESPI_SLAVE_OP_FREQ_SEL_66_MHZ;
674  *ctrlr_config |= ESPI_OP_FREQ_66_MHZ;
675  break;
676  }
677  printk(BIOS_ERR, "eSPI 66MHz not supported. Dropping to 33MHz.\n");
679  case ESPI_OP_FREQ_33_MHZ:
680  if (slave_max_speed_mhz >= 33) {
681  *slave_config |= ESPI_SLAVE_OP_FREQ_SEL_33_MHZ;
682  *ctrlr_config |= ESPI_OP_FREQ_33_MHZ;
683  break;
684  }
685  printk(BIOS_ERR, "eSPI 33MHz not supported. Dropping to 16MHz.\n");
687  case ESPI_OP_FREQ_16_MHZ:
688  /*
689  * eSPI spec says the minimum frequency is 20MHz, but AMD datasheets support
690  * 16.7 Mhz.
691  */
692  if (slave_max_speed_mhz > 0) {
693  *slave_config |= ESPI_SLAVE_OP_FREQ_SEL_20_MHZ;
694  *ctrlr_config |= ESPI_OP_FREQ_16_MHZ;
695  break;
696  }
698  default:
699  die("No supported eSPI Operating Frequency!\n");
700  }
701 }
702 
703 static void espi_set_alert_pin_config(enum espi_alert_pin alert_pin, uint32_t slave_caps,
704  uint32_t *slave_config, uint32_t *ctrlr_config)
705 {
706  switch (alert_pin) {
708  *slave_config |= ESPI_SLAVE_ALERT_MODE_IO1;
709  return;
712  *ctrlr_config |= ESPI_ALERT_MODE;
713  return;
715  if (!(slave_caps & ESPI_SLAVE_OPEN_DRAIN_ALERT_SUPP))
716  die("eSPI peripheral does not support open drain alert!");
717 
719  *ctrlr_config |= ESPI_ALERT_MODE;
720  return;
721  default:
722  die("Unknown espi alert config: %u!\n", alert_pin);
723  }
724 }
725 
726 static enum cb_err espi_set_general_configuration(const struct espi_config *mb_cfg,
727  uint32_t slave_caps)
728 {
729  uint32_t slave_config = 0;
730  uint32_t ctrlr_config = 0;
731 
732  if (mb_cfg->crc_check_enable) {
733  slave_config |= ESPI_SLAVE_CRC_ENABLE;
734  ctrlr_config |= ESPI_CRC_CHECKING_EN;
735  }
736 
737  espi_set_alert_pin_config(mb_cfg->alert_pin, slave_caps, &slave_config, &ctrlr_config);
738  espi_set_io_mode_config(mb_cfg->io_mode, slave_caps, &slave_config, &ctrlr_config);
739  espi_set_op_freq_config(mb_cfg->op_freq_mhz, slave_caps, &slave_config, &ctrlr_config);
740 
741  if (CONFIG(ESPI_DEBUG))
742  printk(BIOS_INFO, "Setting general configuration: slave: 0x%x controller: 0x%x\n",
743  slave_config, ctrlr_config);
744 
746 
748  return CB_ERR;
749 
750  espi_write32(ESPI_SLAVE0_CONFIG, ctrlr_config);
751  return CB_SUCCESS;
752 }
753 
754 static enum cb_err espi_wait_channel_ready(uint16_t slave_reg_addr)
755 {
756  struct stopwatch sw;
758 
760  do {
761  if (espi_get_configuration(slave_reg_addr, &config) != CB_SUCCESS)
762  return CB_ERR;
764  return CB_SUCCESS;
765  } while (!stopwatch_expired(&sw));
766 
767  printk(BIOS_ERR, "Channel is not ready after %d usec (slave addr: 0x%x)\n",
768  ESPI_CH_READY_TIMEOUT_US, slave_reg_addr);
769  return CB_ERR;
770 
771 }
772 
773 static void espi_enable_ctrlr_channel(uint32_t channel_en)
774 {
776 
777  reg |= channel_en;
778 
780 }
781 
782 static enum cb_err espi_set_channel_configuration(uint32_t slave_config,
783  uint32_t slave_reg_addr,
784  uint32_t ctrlr_enable)
785 {
786  if (espi_set_configuration(slave_reg_addr, slave_config) != CB_SUCCESS)
787  return CB_ERR;
788 
789  if (!(slave_config & ESPI_SLAVE_CHANNEL_ENABLE))
790  return CB_SUCCESS;
791 
792  if (espi_wait_channel_ready(slave_reg_addr) != CB_SUCCESS)
793  return CB_ERR;
794 
795  espi_enable_ctrlr_channel(ctrlr_enable);
796  return CB_SUCCESS;
797 }
798 
799 static enum cb_err espi_setup_vw_channel(const struct espi_config *mb_cfg, uint32_t slave_caps)
800 {
801  uint32_t slave_vw_caps;
802  uint32_t ctrlr_vw_caps;
803  uint32_t slave_vw_count_supp;
804  uint32_t ctrlr_vw_count_supp;
805  uint32_t use_vw_count;
806  uint32_t slave_config;
807 
808  if (!mb_cfg->vw_ch_en)
809  return CB_SUCCESS;
810 
811  if (!espi_slave_supports_vw_channel(slave_caps)) {
812  printk(BIOS_ERR, "eSPI slave doesn't support VW channel!\n");
813  return CB_ERR;
814  }
815 
816  if (espi_get_configuration(ESPI_SLAVE_VW_CFG, &slave_vw_caps) != CB_SUCCESS)
817  return CB_ERR;
818 
819  ctrlr_vw_caps = espi_read32(ESPI_MASTER_CAP);
820  ctrlr_vw_count_supp = (ctrlr_vw_caps & ESPI_VW_MAX_SIZE_MASK) >> ESPI_VW_MAX_SIZE_SHIFT;
821 
822  slave_vw_count_supp = espi_slave_get_vw_count_supp(slave_vw_caps);
823  use_vw_count = MIN(ctrlr_vw_count_supp, slave_vw_count_supp);
824 
825  slave_config = ESPI_SLAVE_CHANNEL_ENABLE | ESPI_SLAVE_VW_COUNT_SEL_VAL(use_vw_count);
827 }
828 
829 static enum cb_err espi_setup_periph_channel(const struct espi_config *mb_cfg,
830  uint32_t slave_caps)
831 {
832  uint32_t slave_config;
833  /* Peripheral channel requires BME bit to be set when enabling the channel. */
834  const uint32_t slave_en_mask =
836 
838  return CB_ERR;
839 
840  /*
841  * Peripheral channel is the only one which is enabled on reset. So, if the mainboard
842  * wants to disable it, set configuration to disable peripheral channel. It also
843  * requires that BME bit be cleared.
844  */
845  if (mb_cfg->periph_ch_en) {
846  if (!espi_slave_supports_periph_channel(slave_caps)) {
847  printk(BIOS_ERR, "eSPI slave doesn't support periph channel!\n");
848  return CB_ERR;
849  }
850  slave_config |= slave_en_mask;
851  } else {
852  slave_config &= ~slave_en_mask;
853  }
854 
856 
859 }
860 
861 static enum cb_err espi_setup_oob_channel(const struct espi_config *mb_cfg, uint32_t slave_caps)
862 {
863  uint32_t slave_config;
864 
865  if (!mb_cfg->oob_ch_en)
866  return CB_SUCCESS;
867 
868  if (!espi_slave_supports_oob_channel(slave_caps)) {
869  printk(BIOS_ERR, "eSPI slave doesn't support OOB channel!\n");
870  return CB_ERR;
871  }
872 
874  return CB_ERR;
875 
876  slave_config |= ESPI_SLAVE_CHANNEL_ENABLE;
877 
880 }
881 
882 static enum cb_err espi_setup_flash_channel(const struct espi_config *mb_cfg,
883  uint32_t slave_caps)
884 {
885  uint32_t slave_config;
886 
887  if (!mb_cfg->flash_ch_en)
888  return CB_SUCCESS;
889 
890  if (!espi_slave_supports_flash_channel(slave_caps)) {
891  printk(BIOS_ERR, "eSPI slave doesn't support flash channel!\n");
892  return CB_ERR;
893  }
894 
896  return CB_ERR;
897 
898  slave_config |= ESPI_SLAVE_CHANNEL_ENABLE;
899 
902 }
903 
904 static void espi_set_initial_config(const struct espi_config *mb_cfg)
905 {
906  uint32_t espi_initial_mode = ESPI_OP_FREQ_16_MHZ | ESPI_IO_MODE_SINGLE;
907 
908  switch (mb_cfg->alert_pin) {
910  break;
913  espi_initial_mode |= ESPI_ALERT_MODE;
914  break;
915  default:
916  die("Unknown espi alert config: %u!\n", mb_cfg->alert_pin);
917  }
918 
919  espi_write32(ESPI_SLAVE0_CONFIG, espi_initial_mode);
920 }
921 
923 {
924  uint32_t global_ctrl_reg;
925  global_ctrl_reg = espi_read32(ESPI_GLOBAL_CONTROL_1);
926 
927  if (mb_cfg->subtractive_decode) {
928  global_ctrl_reg &= ~ESPI_SUB_DECODE_SLV_MASK;
929  global_ctrl_reg |= ESPI_SUB_DECODE_EN;
930 
931  } else {
932  global_ctrl_reg &= ~ESPI_SUB_DECODE_EN;
933  }
934  espi_write32(ESPI_GLOBAL_CONTROL_1, global_ctrl_reg);
935 }
936 
937 enum cb_err espi_setup(void)
938 {
939  uint32_t slave_caps, ctrl;
940  const struct espi_config *cfg = espi_get_config();
941 
942  printk(BIOS_SPEW, "Initializing ESPI.\n");
943 
949 
950  /*
951  * Boot sequence: Step 1
952  * Set correct initial configuration to talk to the slave:
953  * Set clock frequency to 16.7MHz and single IO mode.
954  */
956 
957  /*
958  * Boot sequence: Step 2
959  * Send in-band reset
960  * The resets affects both host and slave devices, so set initial config again.
961  */
962  if (espi_send_reset() != CB_SUCCESS) {
963  printk(BIOS_ERR, "In-band reset failed!\n");
964  return CB_ERR;
965  }
967 
968  /*
969  * Boot sequence: Step 3
970  * Get configuration of slave device.
971  */
972  if (espi_get_general_configuration(&slave_caps) != CB_SUCCESS) {
973  printk(BIOS_ERR, "Slave GET_CONFIGURATION failed!\n");
974  return CB_ERR;
975  }
976 
977  /*
978  * Boot sequence:
979  * Step 4: Write slave device general config
980  * Step 5: Set host slave config
981  */
982  if (espi_set_general_configuration(cfg, slave_caps) != CB_SUCCESS) {
983  printk(BIOS_ERR, "Slave SET_CONFIGURATION failed!\n");
984  return CB_ERR;
985  }
986 
987  /*
988  * Setup polarity before enabling the VW channel so any interrupts
989  * received will have the correct polarity.
990  */
992 
993  /*
994  * Boot Sequences: Steps 6 - 9
995  * Channel setup
996  */
997  /* Set up VW first so we can deassert PLTRST#. */
998  if (espi_setup_vw_channel(cfg, slave_caps) != CB_SUCCESS) {
999  printk(BIOS_ERR, "Setup VW channel failed!\n");
1000  return CB_ERR;
1001  }
1002 
1003  /* Assert PLTRST# if VW channel is enabled by mainboard. */
1004  if (espi_send_pltrst(cfg, true) != CB_SUCCESS) {
1005  printk(BIOS_ERR, "PLTRST# assertion failed!\n");
1006  return CB_ERR;
1007  }
1008 
1009  /* De-assert PLTRST# if VW channel is enabled by mainboard. */
1010  if (espi_send_pltrst(cfg, false) != CB_SUCCESS) {
1011  printk(BIOS_ERR, "PLTRST# deassertion failed!\n");
1012  return CB_ERR;
1013  }
1014 
1015  if (espi_setup_periph_channel(cfg, slave_caps) != CB_SUCCESS) {
1016  printk(BIOS_ERR, "Setup Periph channel failed!\n");
1017  return CB_ERR;
1018  }
1019 
1020  if (espi_setup_oob_channel(cfg, slave_caps) != CB_SUCCESS) {
1021  printk(BIOS_ERR, "Setup OOB channel failed!\n");
1022  return CB_ERR;
1023  }
1024 
1025  if (espi_setup_flash_channel(cfg, slave_caps) != CB_SUCCESS) {
1026  printk(BIOS_ERR, "Setup Flash channel failed!\n");
1027  return CB_ERR;
1028  }
1029 
1030  if (espi_configure_decodes(cfg) != CB_SUCCESS) {
1031  printk(BIOS_ERR, "Configuring decodes failed!\n");
1032  return CB_ERR;
1033  }
1034 
1035  /* Enable subtractive decode if configured */
1037 
1039  ctrl |= ESPI_BUS_MASTER_EN;
1040 
1041  if (CONFIG(SOC_AMD_COMMON_BLOCK_HAS_ESPI_ALERT_ENABLE))
1042  ctrl |= ESPI_ALERT_ENABLE;
1043 
1045 
1046  printk(BIOS_SPEW, "Finished initializing ESPI.\n");
1047 
1048  return CB_SUCCESS;
1049 }
1050 
1051 /* Setup eSPI with any mainboard specific initialization. */
1053 {
1055  espi_setup();
1056 }
static void write8(void *addr, uint8_t val)
Definition: mmio.h:30
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
static uint16_t read16(const void *addr)
Definition: mmio.h:17
static uint32_t read32(const void *addr)
Definition: mmio.h:22
static uint8_t read8(const void *addr)
Definition: mmio.h:12
static void write16(void *addr, uint16_t val)
Definition: mmio.h:35
#define assert(statement)
Definition: assert.h:74
#define MIN(a, b)
Definition: helpers.h:37
cb_err
coreboot error codes
Definition: cb_err.h:15
@ CB_ERR
Generic error code.
Definition: cb_err.h:17
@ CB_SUCCESS
Call completed successfully.
Definition: cb_err.h:16
const struct soc_amd_common_config * soc_get_common_config(void)
Definition: config.c:7
enum cb_err espi_open_io_window(uint16_t base, size_t size)
Definition: espi_util.c:234
static enum cb_err espi_send_pltrst(const struct espi_config *mb_cfg, bool assert)
Definition: espi_util.c:556
#define ESPI_CONFIGURATION_HDATA1(a)
Definition: espi_util.c:582
static int espi_get_unused_mmio_window(void)
Definition: espi_util.c:262
static void espi_write_mmio_window(int idx, uint32_t base, size_t size)
Definition: espi_util.c:280
static int espi_get_unused_io_window(void)
Definition: espi_util.c:125
#define ESPI_CMD_TIMEOUT_US
Definition: espi_util.c:363
static void espi_set_alert_pin_config(enum espi_alert_pin alert_pin, uint32_t slave_caps, uint32_t *slave_config, uint32_t *ctrlr_config)
Definition: espi_util.c:703
static uint32_t espi_decode_mmio_range_en_bit(unsigned int idx)
Definition: espi_util.c:68
static void espi_clear_status(void)
Definition: espi_util.c:432
void espi_update_static_bar(uintptr_t bar)
Definition: espi_util.c:17
static size_t espi_get_io_window_size(int idx)
Definition: espi_util.c:183
static uint16_t espi_read16(unsigned int reg)
Definition: espi_util.c:43
static uintptr_t espi_bar
Definition: espi_util.c:15
static enum cb_err espi_setup_periph_channel(const struct espi_config *mb_cfg, uint32_t slave_caps)
Definition: espi_util.c:829
static int espi_std_io_decode(uint16_t base, size_t size)
Definition: espi_util.c:161
static void espi_write32(unsigned int reg, uint32_t val)
Definition: espi_util.c:38
static unsigned int espi_io_range_size_reg(unsigned int idx)
Definition: espi_util.c:78
static void espi_set_initial_config(const struct espi_config *mb_cfg)
Definition: espi_util.c:904
enum cb_err espi_open_mmio_window(uint32_t base, size_t size)
Definition: espi_util.c:286
static uint32_t espi_decode_io_range_en_bit(unsigned int idx)
Definition: espi_util.c:63
static enum cb_err espi_set_channel_configuration(uint32_t slave_config, uint32_t slave_reg_addr, uint32_t ctrlr_enable)
Definition: espi_util.c:782
static enum cb_err espi_send_command(const struct espi_cmd *cmd)
Definition: espi_util.c:466
static enum cb_err espi_get_configuration(uint16_t slave_reg_addr, uint32_t *config)
Definition: espi_util.c:584
static enum cb_err espi_wait_channel_ready(uint16_t slave_reg_addr)
Definition: espi_util.c:754
static enum cb_err espi_send_reset(void)
Definition: espi_util.c:517
static uint32_t espi_read32(unsigned int reg)
Definition: espi_util.c:33
static void espi_clear_decodes(void)
Definition: espi_util.c:137
static enum cb_err espi_setup_vw_channel(const struct espi_config *mb_cfg, uint32_t slave_caps)
Definition: espi_util.c:799
static void espi_show_failure(const struct espi_cmd *cmd, const char *str, uint32_t status)
Definition: espi_util.c:459
static uintptr_t espi_get_bar(void)
Definition: espi_util.c:26
#define ESPI_CH_READY_TIMEOUT_US
Definition: espi_util.c:364
static void espi_enable_decode(uint32_t decode_en)
Definition: espi_util.c:93
static enum cb_err espi_open_generic_io_window(uint16_t base, size_t size)
Definition: espi_util.c:194
union espi_txhdr0 __packed
static void espi_enable_ctrlr_channel(uint32_t channel_en)
Definition: espi_util.c:773
static unsigned int espi_io_range_base_reg(unsigned int idx)
Definition: espi_util.c:73
static int espi_find_io_window(uint16_t win_base)
Definition: espi_util.c:110
static enum cb_err espi_poll_status(uint32_t *status)
Definition: espi_util.c:443
static void espi_write8(unsigned int reg, uint8_t val)
Definition: espi_util.c:58
void configure_espi_with_mb_hook(void)
Definition: espi_util.c:1052
static enum cb_err espi_get_general_configuration(uint32_t *config)
Definition: espi_util.c:626
static enum cb_err espi_setup_flash_channel(const struct espi_config *mb_cfg, uint32_t slave_caps)
Definition: espi_util.c:882
static enum cb_err espi_configure_decodes(const struct espi_config *cfg)
Definition: espi_util.c:336
static unsigned int espi_mmio_range_size_reg(unsigned int idx)
Definition: espi_util.c:88
static int espi_find_mmio_window(uint32_t win_base)
Definition: espi_util.c:247
#define ESPI_CONFIGURATION_HDATA0(a)
Definition: espi_util.c:581
enum cb_err espi_setup(void)
Definition: espi_util.c:937
static enum cb_err espi_setup_oob_channel(const struct espi_config *mb_cfg, uint32_t slave_caps)
Definition: espi_util.c:861
static bool espi_is_decode_enabled(uint32_t decode)
Definition: espi_util.c:102
espi_cmd_type
Definition: espi_util.c:353
@ CMD_TYPE_PERIPHERAL
Definition: espi_util.c:357
@ CMD_TYPE_GET_CONFIGURATION
Definition: espi_util.c:355
@ CMD_TYPE_OOB
Definition: espi_util.c:359
@ CMD_TYPE_FLASH
Definition: espi_util.c:360
@ CMD_TYPE_IN_BAND_RESET
Definition: espi_util.c:356
@ CMD_TYPE_VW
Definition: espi_util.c:358
@ CMD_TYPE_SET_CONFIGURATION
Definition: espi_util.c:354
static void espi_setup_subtractive_decode(const struct espi_config *mb_cfg)
Definition: espi_util.c:922
static size_t espi_get_mmio_window_size(int idx)
Definition: espi_util.c:275
static void espi_write16(unsigned int reg, uint16_t val)
Definition: espi_util.c:48
static const struct espi_config * espi_get_config(void)
Definition: espi_util.c:326
static void espi_set_op_freq_config(enum espi_op_freq mb_op_freq, uint32_t slave_caps, uint32_t *slave_config, uint32_t *ctrlr_config)
Definition: espi_util.c:665
__weak void mb_set_up_early_espi(void)
Definition: espi_util.c:22
static uint8_t espi_read8(unsigned int reg)
Definition: espi_util.c:53
static enum cb_err espi_set_general_configuration(const struct espi_config *mb_cfg, uint32_t slave_caps)
Definition: espi_util.c:726
static void espi_write_io_window(int idx, uint16_t base, size_t size)
Definition: espi_util.c:188
static enum cb_err espi_wait_ready(void)
Definition: espi_util.c:416
static void espi_set_io_mode_config(enum espi_io_mode mb_io_mode, uint32_t slave_caps, uint32_t *slave_config, uint32_t *ctrlr_config)
Definition: espi_util.c:635
static unsigned int espi_mmio_range_base_reg(unsigned int idx)
Definition: espi_util.c:83
static enum cb_err espi_set_configuration(uint16_t slave_reg_addr, uint32_t config)
Definition: espi_util.c:609
#define printk(level,...)
Definition: stdlib.h:16
#define __fallthrough
Definition: compiler.h:39
void __noreturn die(const char *fmt,...)
Definition: die.c:17
@ CONFIG
Definition: dsi_common.h:201
void espi_show_slave_general_configuration(uint32_t config)
Definition: espi_debug.c:7
void espi_show_slave_peripheral_channel_configuration(uint32_t config)
Definition: espi_debug.c:119
#define ESPI_MASTER_CAP
Definition: espi_def.h:11
#define ESPI_BUS_MASTER_EN
Definition: espi_def.h:40
#define ESPI_SUB_DECODE_EN
Definition: espi_def.h:39
#define ESPI_VW_MAX_SIZE_SHIFT
Definition: espi_def.h:12
#define ESPI_VW_MAX_SIZE_MASK
Definition: espi_def.h:13
#define ESPI_SLAVE0_INT_STS
Definition: espi_def.h:44
#define ESPI_GLOBAL_CONTROL_0
Definition: espi_def.h:15
#define ESPI_SUB_DECODE_SLV_MASK
Definition: espi_def.h:38
#define ESPI_GLOBAL_CONTROL_1
Definition: espi_def.h:27
#define ESPI_DN_TX_HDR0
Definition: espi_def.h:6
#define ESPI_STATUS_NO_RESPONSE
Definition: espi_def.h:48
#define ESPI_DN_TX_HDR1
Definition: espi_def.h:7
#define ESPI_SLAVE0_INT_EN
Definition: espi_def.h:43
#define ESPI_RXVW_POLARITY
Definition: espi_def.h:53
#define ESPI_DN_TX_HDR2
Definition: espi_def.h:8
#define ESPI_DN_TX_DATA
Definition: espi_def.h:9
#define ESPI_AL_STOP_EN
Definition: espi_def.h:22
#define ESPI_ERR_INT_SMI
Definition: espi_def.h:36
#define ESPI_STATUS_DNCMD_COMPLETE
Definition: espi_def.h:45
#define ESPI_ALERT_ENABLE
Definition: espi_def.h:28
#define ESPI_RGCMD_INT(irq)
Definition: espi_def.h:31
#define ESPI_VW_SIGNAL_LOW(x)
Definition: espi.h:229
#define ESPI_SLAVE_VW_CFG
Definition: espi.h:99
#define ESPI_SLAVE_PUSH_PULL_ALERT_SEL
Definition: espi.h:35
#define ESPI_SLAVE_VW_COUNT_SEL_VAL(x)
Definition: espi.h:103
#define ESPI_SLAVE_OPEN_DRAIN_ALERT_SUPP
Definition: espi.h:44
#define ESPI_SLAVE_ALERT_MODE_IO1
Definition: espi.h:20
#define ESPI_SLAVE_OOB_CFG
Definition: espi.h:109
static int espi_slave_max_speed_mhz_supported(uint32_t gen_caps)
Definition: espi.h:283
#define ESPI_SLAVE_OP_FREQ_SEL_33_MHZ
Definition: espi.h:41
static bool espi_slave_supports_periph_channel(uint32_t gen_caps)
Definition: espi.h:303
#define ESPI_SLAVE_PERIPH_BUS_MASTER_ENABLE
Definition: espi.h:97
#define ESPI_SLAVE_CRC_ENABLE
Definition: espi.h:15
static bool espi_slave_supports_oob_channel(uint32_t gen_caps)
Definition: espi.h:308
#define ESPI_SLAVE_IO_MODE_SEL_DUAL
Definition: espi.h:25
#define ESPI_SLAVE_FLASH_CFG
Definition: espi.h:133
#define ESPI_VW_INDEX_SYSTEM_EVENT_3
Definition: espi.h:203
#define ESPI_SLAVE_ALERT_MODE_PIN
Definition: espi.h:19
static bool espi_slave_supports_vw_channel(uint32_t gen_caps)
Definition: espi.h:298
#define ESPI_SLAVE_OP_FREQ_SEL_66_MHZ
Definition: espi.h:43
static bool espi_slave_supports_dual_io(uint32_t gen_caps)
Definition: espi.h:246
#define ESPI_SLAVE_PERIPH_CFG
Definition: espi.h:62
#define ESPI_VW_SIGNAL_HIGH(x)
Definition: espi.h:228
#define ESPI_SLAVE_CHANNEL_ENABLE
Definition: espi.h:191
static bool espi_slave_supports_quad_io(uint32_t gen_caps)
Definition: espi.h:239
static uint32_t espi_slave_get_vw_count_supp(uint32_t vw_caps)
Definition: espi.h:323
#define ESPI_SLAVE_OPEN_DRAIN_ALERT_SEL
Definition: espi.h:34
#define ESPI_SLAVE_OP_FREQ_SEL_20_MHZ
Definition: espi.h:39
#define ESPI_SLAVE_GENERAL_CFG
Definition: espi.h:14
#define ESPI_SLAVE_IO_MODE_SEL_SINGLE
Definition: espi.h:24
#define ESPI_VW_PLTRST
Definition: espi.h:205
static bool espi_slave_supports_flash_channel(uint32_t gen_caps)
Definition: espi.h:313
static bool espi_slave_is_channel_ready(uint32_t config)
Definition: espi.h:318
#define ESPI_SLAVE_IO_MODE_SEL_QUAD
Definition: espi.h:26
static int stopwatch_expired(struct stopwatch *sw)
Definition: timer.h:152
static void stopwatch_init_usecs_expire(struct stopwatch *sw, long us)
Definition: timer.h:127
#define BIOS_INFO
BIOS_INFO - Expected events.
Definition: loglevel.h:113
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
#define BIOS_SPEW
BIOS_SPEW - Excessively verbose output.
Definition: loglevel.h:142
enum board_config config
Definition: memory.c:448
#define ENV_X86
Definition: rules.h:248
const struct smm_save_state_ops *legacy_ops __weak
Definition: save_state.c:8
uintptr_t base
Definition: uart.c:17
#define ESPI_MMIO_RANGE_SIZE(range)
Definition: espi.h:31
#define ESPI_OFFSET_FROM_BAR
Definition: espi.h:9
#define ESPI_GENERIC_MMIO_WIN_COUNT
Definition: espi.h:35
espi_io_mode
Definition: espi.h:63
@ ESPI_IO_MODE_DUAL
Definition: espi.h:65
@ ESPI_IO_MODE_SINGLE
Definition: espi.h:64
@ ESPI_IO_MODE_QUAD
Definition: espi.h:66
#define ESPI_DECODE_IO_0X2E_0X2F_EN
Definition: espi.h:16
espi_op_freq
Definition: espi.h:69
@ ESPI_OP_FREQ_33_MHZ
Definition: espi.h:71
@ ESPI_OP_FREQ_16_MHZ
Definition: espi.h:70
@ ESPI_OP_FREQ_66_MHZ
Definition: espi.h:72
#define ESPI_GENERIC_MMIO_MAX_WIN_SIZE
Definition: espi.h:36
#define ESPI_DECODE_MMIO_RANGE_EN(range)
Definition: espi.h:12
#define ESPI_GENERIC_IO_WIN_COUNT
Definition: espi.h:33
#define ESPI_OOB_CH_EN
Definition: espi.h:52
#define ESPI_MMIO_RANGE_BASE(range)
Definition: espi.h:30
#define ESPI_DECODE_IO_RANGE_EN(range)
Definition: espi.h:13
#define ESPI_IO_RANGE_SIZE(range)
Definition: espi.h:29
#define ESPI_PERIPH_CH_EN
Definition: espi.h:50
#define ESPI_FLASH_CH_EN
Definition: espi.h:53
#define ESPI_VW_CH_EN
Definition: espi.h:51
#define ESPI_DECODE
Definition: espi.h:11
#define ESPI_DECODE_IO_0x80_EN
Definition: espi.h:14
#define ESPI_CRC_CHECKING_EN
Definition: espi.h:39
#define ESPI_IO_RANGE_BASE(range)
Definition: espi.h:28
#define ESPI_GENERIC_IO_MAX_WIN_SIZE
Definition: espi.h:34
#define ESPI_SLAVE0_CONFIG
Definition: espi.h:38
#define ESPI_ALERT_MODE
Definition: espi.h:40
espi_alert_pin
Definition: espi.h:75
@ ESPI_ALERT_PIN_PUSH_PULL
Definition: espi.h:77
@ ESPI_ALERT_PIN_IN_BAND
Definition: espi.h:76
@ ESPI_ALERT_PIN_OPEN_DRAIN
Definition: espi.h:78
#define ESPI_DECODE_IO_0X60_0X64_EN
Definition: espi.h:15
uintptr_t lpc_get_spibase(void)
Definition: lpc_util.c:309
unsigned short uint16_t
Definition: stdint.h:11
unsigned int uint32_t
Definition: stdint.h:14
unsigned long uintptr_t
Definition: stdint.h:21
unsigned char uint8_t
Definition: stdint.h:8
union espi_txhdr1 hdr1
Definition: espi_util.c:409
union espi_txhdr2 hdr2
Definition: espi_util.c:410
union espi_txhdr0 hdr0
Definition: espi_util.c:408
uint32_t expected_status_codes
Definition: espi_util.c:412
union espi_txdata data
Definition: espi_util.c:411
uint32_t std_io_decode_bitmap
Definition: espi.h:83
struct espi_config::@401 generic_io_range[ESPI_GENERIC_IO_WIN_COUNT]
uint16_t base
Definition: espi.h:86
uint32_t vw_irq_polarity
Definition: espi.h:103
size_t size
Definition: espi.h:87
Definition: meminit.h:71
struct espi_config espi_config
Definition: chip.h:24
u8 val
Definition: sys.c:300
uint32_t byte2
Definition: espi_util.c:402
uint32_t byte0
Definition: espi_util.c:400
uint32_t byte3
Definition: espi_util.c:403
uint32_t val
Definition: espi_util.c:398
uint32_t byte1
Definition: espi_util.c:401
uint32_t slave_sel
Definition: espi_util.c:371
uint32_t hdata1
Definition: espi_util.c:374
uint32_t val
Definition: espi_util.c:367
uint32_t hdata0
Definition: espi_util.c:373
uint32_t rsvd
Definition: espi_util.c:372
uint32_t hdata2
Definition: espi_util.c:375
uint32_t cmd_type
Definition: espi_util.c:369
uint32_t cmd_sts
Definition: espi_util.c:370
uint32_t hdata6
Definition: espi_util.c:385
uint32_t hdata5
Definition: espi_util.c:384
uint32_t val
Definition: espi_util.c:380
uint32_t hdata3
Definition: espi_util.c:382
uint32_t hdata4
Definition: espi_util.c:383
uint32_t hdata7
Definition: espi_util.c:392
uint32_t rsvd
Definition: espi_util.c:393
uint32_t val
Definition: espi_util.c:390