summaryrefslogtreecommitdiff
path: root/src/soc/amd
diff options
context:
space:
mode:
Diffstat (limited to 'src/soc/amd')
-rw-r--r--src/soc/amd/common/block/include/amdblocks/espi.h8
-rw-r--r--src/soc/amd/common/block/lpc/espi_util.c29
2 files changed, 31 insertions, 6 deletions
diff --git a/src/soc/amd/common/block/include/amdblocks/espi.h b/src/soc/amd/common/block/include/amdblocks/espi.h
index 82bfcbe38e..5d758354c5 100644
--- a/src/soc/amd/common/block/include/amdblocks/espi.h
+++ b/src/soc/amd/common/block/include/amdblocks/espi.h
@@ -73,6 +73,12 @@ enum espi_op_freq {
ESPI_OP_FREQ_66_MHZ = ESPI_OP_FREQ_VALUE(2),
};
+enum espi_alert_pin {
+ ESPI_ALERT_PIN_IN_BAND,
+ ESPI_ALERT_PIN_PUSH_PULL,
+ ESPI_ALERT_PIN_OPEN_DRAIN,
+};
+
struct espi_config {
/* Bitmap for standard IO decodes. Use ESPI_DECODE_IO_* above. */
uint32_t std_io_decode_bitmap;
@@ -85,9 +91,9 @@ struct espi_config {
/* Slave configuration parameters */
enum espi_io_mode io_mode;
enum espi_op_freq op_freq_mhz;
+ enum espi_alert_pin alert_pin;
uint32_t crc_check_enable:1;
- uint32_t dedicated_alert_pin:1;
uint32_t periph_ch_en:1;
uint32_t vw_ch_en:1;
uint32_t oob_ch_en:1;
diff --git a/src/soc/amd/common/block/lpc/espi_util.c b/src/soc/amd/common/block/lpc/espi_util.c
index 519130a653..81056b0222 100644
--- a/src/soc/amd/common/block/lpc/espi_util.c
+++ b/src/soc/amd/common/block/lpc/espi_util.c
@@ -683,6 +683,29 @@ static void espi_set_op_freq_config(enum espi_op_freq mb_op_freq, uint32_t slave
}
}
+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)
+{
+ switch (alert_pin) {
+ case ESPI_ALERT_PIN_IN_BAND:
+ *slave_config |= ESPI_SLAVE_ALERT_MODE_IO1;
+ return;
+ case ESPI_ALERT_PIN_PUSH_PULL:
+ *slave_config |= ESPI_SLAVE_ALERT_MODE_PIN | ESPI_SLAVE_PUSH_PULL_ALERT_SEL;
+ *ctrlr_config |= ESPI_ALERT_MODE;
+ return;
+ case ESPI_ALERT_PIN_OPEN_DRAIN:
+ if (!(slave_caps & ESPI_SLAVE_OPEN_DRAIN_ALERT_SUPP))
+ die("eSPI peripheral does not support open drain alert!");
+
+ *slave_config |= ESPI_SLAVE_ALERT_MODE_PIN | ESPI_SLAVE_OPEN_DRAIN_ALERT_SEL;
+ *ctrlr_config |= ESPI_ALERT_MODE;
+ return;
+ default:
+ die("Unknown espi alert config: %u!\n", alert_pin);
+ }
+}
+
static int espi_set_general_configuration(const struct espi_config *mb_cfg, uint32_t slave_caps)
{
uint32_t slave_config = 0;
@@ -693,11 +716,7 @@ static int espi_set_general_configuration(const struct espi_config *mb_cfg, uint
ctrlr_config |= ESPI_CRC_CHECKING_EN;
}
- if (mb_cfg->dedicated_alert_pin) {
- slave_config |= ESPI_SLAVE_ALERT_MODE_PIN;
- ctrlr_config |= ESPI_ALERT_MODE;
- }
-
+ espi_set_alert_pin_config(mb_cfg->alert_pin, slave_caps, &slave_config, &ctrlr_config);
espi_set_io_mode_config(mb_cfg->io_mode, slave_caps, &slave_config, &ctrlr_config);
espi_set_op_freq_config(mb_cfg->op_freq_mhz, slave_caps, &slave_config, &ctrlr_config);