9 #include <soc/pci_devs.h>
107 return !!(
val & decode);
142 if (
CONFIG(SOC_AMD_COMMON_BLOCK_ESPI_RETAIN_PORT80_EN))
163 if (size == 2 &&
base == 0x2e)
199 for (; size; size -= win_size,
base += win_size) {
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) {
212 printk(
BIOS_INFO,
"eSPI window at base: 0x%x resized from 0x%zx to 0x%zx\n",
213 base, curr_size, win_size);
291 for (; size; size -= win_size,
base += win_size) {
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) {
304 printk(
BIOS_INFO,
"eSPI window at base: 0x%x resized from 0x%zx to 0x%zx\n",
305 base, curr_size, win_size);
331 die(
"Common config structure is NULL!\n");
363 #define ESPI_CMD_TIMEOUT_US 100
364 #define ESPI_CH_READY_TIMEOUT_US 10000
490 "Error: eSPI timed out waiting for command to complete", 0);
581 #define ESPI_CONFIGURATION_HDATA0(a) (((a) >> 8) & 0xff)
582 #define ESPI_CONFIGURATION_HDATA1(a) ((a) & 0xff)
638 switch (mb_io_mode) {
645 printk(
BIOS_ERR,
"eSPI Quad I/O not supported. Dropping to dual mode.\n");
653 printk(
BIOS_ERR,
"eSPI Dual I/O not supported. Dropping to single mode.\n");
661 die(
"No supported eSPI I/O modes!\n");
670 switch (mb_op_freq) {
672 if (slave_max_speed_mhz >= 66) {
677 printk(
BIOS_ERR,
"eSPI 66MHz not supported. Dropping to 33MHz.\n");
680 if (slave_max_speed_mhz >= 33) {
685 printk(
BIOS_ERR,
"eSPI 33MHz not supported. Dropping to 16MHz.\n");
692 if (slave_max_speed_mhz > 0) {
699 die(
"No supported eSPI Operating Frequency!\n");
716 die(
"eSPI peripheral does not support open drain alert!");
722 die(
"Unknown espi alert config: %u!\n", alert_pin);
732 if (
mb_cfg->crc_check_enable) {
742 printk(
BIOS_INFO,
"Setting general configuration: slave: 0x%x controller: 0x%x\n",
743 slave_config, ctrlr_config);
767 printk(
BIOS_ERR,
"Channel is not ready after %d usec (slave addr: 0x%x)\n",
823 use_vw_count =
MIN(ctrlr_vw_count_supp, slave_vw_count_supp);
845 if (
mb_cfg->periph_ch_en) {
850 slave_config |= slave_en_mask;
852 slave_config &= ~slave_en_mask;
908 switch (
mb_cfg->alert_pin) {
916 die(
"Unknown espi alert config: %u!\n",
mb_cfg->alert_pin);
927 if (
mb_cfg->subtractive_decode) {
1041 if (
CONFIG(SOC_AMD_COMMON_BLOCK_HAS_ESPI_ALERT_ENABLE))
static void write8(void *addr, uint8_t val)
static void write32(void *addr, uint32_t val)
static uint16_t read16(const void *addr)
static uint32_t read32(const void *addr)
static uint8_t read8(const void *addr)
static void write16(void *addr, uint16_t val)
#define assert(statement)
cb_err
coreboot error codes
@ CB_ERR
Generic error code.
@ CB_SUCCESS
Call completed successfully.
const struct soc_amd_common_config * soc_get_common_config(void)
enum cb_err espi_open_io_window(uint16_t base, size_t size)
static enum cb_err espi_send_pltrst(const struct espi_config *mb_cfg, bool assert)
#define ESPI_CONFIGURATION_HDATA1(a)
static int espi_get_unused_mmio_window(void)
static void espi_write_mmio_window(int idx, uint32_t base, size_t size)
static int espi_get_unused_io_window(void)
#define ESPI_CMD_TIMEOUT_US
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)
static uint32_t espi_decode_mmio_range_en_bit(unsigned int idx)
static void espi_clear_status(void)
void espi_update_static_bar(uintptr_t bar)
static size_t espi_get_io_window_size(int idx)
static uint16_t espi_read16(unsigned int reg)
static uintptr_t espi_bar
static enum cb_err espi_setup_periph_channel(const struct espi_config *mb_cfg, uint32_t slave_caps)
static int espi_std_io_decode(uint16_t base, size_t size)
static void espi_write32(unsigned int reg, uint32_t val)
static unsigned int espi_io_range_size_reg(unsigned int idx)
static void espi_set_initial_config(const struct espi_config *mb_cfg)
enum cb_err espi_open_mmio_window(uint32_t base, size_t size)
static uint32_t espi_decode_io_range_en_bit(unsigned int idx)
static enum cb_err espi_set_channel_configuration(uint32_t slave_config, uint32_t slave_reg_addr, uint32_t ctrlr_enable)
static enum cb_err espi_send_command(const struct espi_cmd *cmd)
static enum cb_err espi_get_configuration(uint16_t slave_reg_addr, uint32_t *config)
static enum cb_err espi_wait_channel_ready(uint16_t slave_reg_addr)
static enum cb_err espi_send_reset(void)
static uint32_t espi_read32(unsigned int reg)
static void espi_clear_decodes(void)
static enum cb_err espi_setup_vw_channel(const struct espi_config *mb_cfg, uint32_t slave_caps)
static void espi_show_failure(const struct espi_cmd *cmd, const char *str, uint32_t status)
static uintptr_t espi_get_bar(void)
#define ESPI_CH_READY_TIMEOUT_US
static void espi_enable_decode(uint32_t decode_en)
static enum cb_err espi_open_generic_io_window(uint16_t base, size_t size)
union espi_txhdr0 __packed
static void espi_enable_ctrlr_channel(uint32_t channel_en)
static unsigned int espi_io_range_base_reg(unsigned int idx)
static int espi_find_io_window(uint16_t win_base)
static enum cb_err espi_poll_status(uint32_t *status)
static void espi_write8(unsigned int reg, uint8_t val)
void configure_espi_with_mb_hook(void)
static enum cb_err espi_get_general_configuration(uint32_t *config)
static enum cb_err espi_setup_flash_channel(const struct espi_config *mb_cfg, uint32_t slave_caps)
static enum cb_err espi_configure_decodes(const struct espi_config *cfg)
static unsigned int espi_mmio_range_size_reg(unsigned int idx)
static int espi_find_mmio_window(uint32_t win_base)
#define ESPI_CONFIGURATION_HDATA0(a)
enum cb_err espi_setup(void)
static enum cb_err espi_setup_oob_channel(const struct espi_config *mb_cfg, uint32_t slave_caps)
static bool espi_is_decode_enabled(uint32_t decode)
@ CMD_TYPE_GET_CONFIGURATION
@ CMD_TYPE_SET_CONFIGURATION
static void espi_setup_subtractive_decode(const struct espi_config *mb_cfg)
static size_t espi_get_mmio_window_size(int idx)
static void espi_write16(unsigned int reg, uint16_t val)
static const struct espi_config * espi_get_config(void)
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)
__weak void mb_set_up_early_espi(void)
static uint8_t espi_read8(unsigned int reg)
static enum cb_err espi_set_general_configuration(const struct espi_config *mb_cfg, uint32_t slave_caps)
static void espi_write_io_window(int idx, uint16_t base, size_t size)
static enum cb_err espi_wait_ready(void)
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)
static unsigned int espi_mmio_range_base_reg(unsigned int idx)
static enum cb_err espi_set_configuration(uint16_t slave_reg_addr, uint32_t config)
#define printk(level,...)
void __noreturn die(const char *fmt,...)
void espi_show_slave_general_configuration(uint32_t config)
void espi_show_slave_peripheral_channel_configuration(uint32_t config)
#define ESPI_BUS_MASTER_EN
#define ESPI_SUB_DECODE_EN
#define ESPI_VW_MAX_SIZE_SHIFT
#define ESPI_VW_MAX_SIZE_MASK
#define ESPI_SLAVE0_INT_STS
#define ESPI_GLOBAL_CONTROL_0
#define ESPI_SUB_DECODE_SLV_MASK
#define ESPI_GLOBAL_CONTROL_1
#define ESPI_STATUS_NO_RESPONSE
#define ESPI_SLAVE0_INT_EN
#define ESPI_RXVW_POLARITY
#define ESPI_STATUS_DNCMD_COMPLETE
#define ESPI_ALERT_ENABLE
#define ESPI_RGCMD_INT(irq)
#define ESPI_VW_SIGNAL_LOW(x)
#define ESPI_SLAVE_VW_CFG
#define ESPI_SLAVE_PUSH_PULL_ALERT_SEL
#define ESPI_SLAVE_VW_COUNT_SEL_VAL(x)
#define ESPI_SLAVE_OPEN_DRAIN_ALERT_SUPP
#define ESPI_SLAVE_ALERT_MODE_IO1
#define ESPI_SLAVE_OOB_CFG
static int espi_slave_max_speed_mhz_supported(uint32_t gen_caps)
#define ESPI_SLAVE_OP_FREQ_SEL_33_MHZ
static bool espi_slave_supports_periph_channel(uint32_t gen_caps)
#define ESPI_SLAVE_PERIPH_BUS_MASTER_ENABLE
#define ESPI_SLAVE_CRC_ENABLE
static bool espi_slave_supports_oob_channel(uint32_t gen_caps)
#define ESPI_SLAVE_IO_MODE_SEL_DUAL
#define ESPI_SLAVE_FLASH_CFG
#define ESPI_VW_INDEX_SYSTEM_EVENT_3
#define ESPI_SLAVE_ALERT_MODE_PIN
static bool espi_slave_supports_vw_channel(uint32_t gen_caps)
#define ESPI_SLAVE_OP_FREQ_SEL_66_MHZ
static bool espi_slave_supports_dual_io(uint32_t gen_caps)
#define ESPI_SLAVE_PERIPH_CFG
#define ESPI_VW_SIGNAL_HIGH(x)
#define ESPI_SLAVE_CHANNEL_ENABLE
static bool espi_slave_supports_quad_io(uint32_t gen_caps)
static uint32_t espi_slave_get_vw_count_supp(uint32_t vw_caps)
#define ESPI_SLAVE_OPEN_DRAIN_ALERT_SEL
#define ESPI_SLAVE_OP_FREQ_SEL_20_MHZ
#define ESPI_SLAVE_GENERAL_CFG
#define ESPI_SLAVE_IO_MODE_SEL_SINGLE
static bool espi_slave_supports_flash_channel(uint32_t gen_caps)
static bool espi_slave_is_channel_ready(uint32_t config)
#define ESPI_SLAVE_IO_MODE_SEL_QUAD
static int stopwatch_expired(struct stopwatch *sw)
static void stopwatch_init_usecs_expire(struct stopwatch *sw, long us)
#define BIOS_INFO
BIOS_INFO - Expected events.
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
#define BIOS_SPEW
BIOS_SPEW - Excessively verbose output.
const struct smm_save_state_ops *legacy_ops __weak
#define ESPI_MMIO_RANGE_SIZE(range)
#define ESPI_OFFSET_FROM_BAR
#define ESPI_GENERIC_MMIO_WIN_COUNT
#define ESPI_DECODE_IO_0X2E_0X2F_EN
#define ESPI_GENERIC_MMIO_MAX_WIN_SIZE
#define ESPI_DECODE_MMIO_RANGE_EN(range)
#define ESPI_GENERIC_IO_WIN_COUNT
#define ESPI_MMIO_RANGE_BASE(range)
#define ESPI_DECODE_IO_RANGE_EN(range)
#define ESPI_IO_RANGE_SIZE(range)
#define ESPI_PERIPH_CH_EN
#define ESPI_DECODE_IO_0x80_EN
#define ESPI_CRC_CHECKING_EN
#define ESPI_IO_RANGE_BASE(range)
#define ESPI_GENERIC_IO_MAX_WIN_SIZE
#define ESPI_SLAVE0_CONFIG
@ ESPI_ALERT_PIN_PUSH_PULL
@ ESPI_ALERT_PIN_OPEN_DRAIN
#define ESPI_DECODE_IO_0X60_0X64_EN
uintptr_t lpc_get_spibase(void)
uint32_t expected_status_codes
uint32_t std_io_decode_bitmap
struct espi_config::@401 generic_io_range[ESPI_GENERIC_IO_WIN_COUNT]
struct espi_config espi_config