drivers: espi: Microchip MEC172x eSPI VW initialization update

Change device tree VW routing to a form allowing overrides.
Add two new DT optional properties for specifying the reset
source and reset value of each virtual wire. Only virtual
wires that are enabled using the status property are modified.
NOTE: eSPI virtual wires are controlled in groups of 4 by
hardware. The optional reset signal source properties applies
to all four virtual wires in the group. If this field is
changed from the hardware default, it should be changed for
only one virtual wire in the group. If the property exists
in more than one wire in the group it must be set to the
same value.

Signed-off-by: Jay Vasanth <jay.vasanth@microchip.com>
This commit is contained in:
Jay Vasanth 2023-02-16 15:58:54 +05:30 committed by Anas Nashif
parent f6619a8688
commit b0ce525b90
5 changed files with 184 additions and 98 deletions

View file

@ -132,18 +132,18 @@ static const struct xec_signal vw_tbl[] = {
MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_SCI, vw_sci_n), MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_SCI, vw_sci_n),
MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_DNX_ACK, vw_dnx_ack), MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_DNX_ACK, vw_dnx_ack),
MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_SUS_ACK, vw_sus_ack_n), MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_SUS_ACK, vw_sus_ack_n),
MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_SLV_GPIO_0, vw_c2t_gpio_0), MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_SLV_GPIO_0, vw_t2c_gpio_0),
MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_SLV_GPIO_1, vw_c2t_gpio_1), MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_SLV_GPIO_1, vw_t2c_gpio_1),
MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_SLV_GPIO_2, vw_c2t_gpio_2), MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_SLV_GPIO_2, vw_t2c_gpio_2),
MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_SLV_GPIO_3, vw_c2t_gpio_3), MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_SLV_GPIO_3, vw_t2c_gpio_3),
MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_SLV_GPIO_4, vw_c2t_gpio_4), MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_SLV_GPIO_4, vw_t2c_gpio_4),
MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_SLV_GPIO_5, vw_c2t_gpio_5), MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_SLV_GPIO_5, vw_t2c_gpio_5),
MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_SLV_GPIO_6, vw_c2t_gpio_6), MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_SLV_GPIO_6, vw_t2c_gpio_6),
MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_SLV_GPIO_7, vw_c2t_gpio_7), MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_SLV_GPIO_7, vw_t2c_gpio_7),
MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_OCB_0, vw_c2t_gpio_8), MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_OCB_0, vw_t2c_gpio_8),
MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_OCB_1, vw_c2t_gpio_9), MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_OCB_1, vw_t2c_gpio_9),
MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_OCB_2, vw_c2t_gpio_10), MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_OCB_2, vw_t2c_gpio_10),
MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_OCB_3, vw_c2t_gpio_11), MCHP_DT_ESPI_VW_ENTRY(ESPI_VWIRE_SIGNAL_OCB_3, vw_t2c_gpio_11),
}; };
/* Buffer size are expressed in bytes */ /* Buffer size are expressed in bytes */
@ -305,11 +305,11 @@ static int espi_xec_send_vwire(const struct device *dev,
return -EINVAL; return -EINVAL;
} }
if (!((signal_info.flags >> ESPI_XEC_SIGNAL_FLAG_EN_POS) & BIT(0))) { if (!(signal_info.flags & BIT(MCHP_DT_ESPI_VW_FLAG_STATUS_POS))) {
return -EIO; /* VW not enabled */ return -EIO; /* VW not enabled */
} }
dir = (signal_info.flags >> ESPI_XEC_SIGNAL_FLAG_DIR_POS) & BIT(0); dir = (signal_info.flags >> MCHP_DT_ESPI_VW_FLAG_DIR_POS) & BIT(0);
if (dir == ESPI_MASTER_TO_SLAVE) { if (dir == ESPI_MASTER_TO_SLAVE) {
regaddr = xec_msvw_addr(dev, xec_id); regaddr = xec_msvw_addr(dev, xec_id);
@ -350,11 +350,11 @@ static int espi_xec_receive_vwire(const struct device *dev,
return -EINVAL; return -EINVAL;
} }
if (!((signal_info.flags >> ESPI_XEC_SIGNAL_FLAG_EN_POS) & BIT(0))) { if (!(signal_info.flags & BIT(MCHP_DT_ESPI_VW_FLAG_STATUS_POS))) {
return -EIO; /* VW not enabled */ return -EIO; /* VW not enabled */
} }
dir = (signal_info.flags >> ESPI_XEC_SIGNAL_FLAG_DIR_POS) & BIT(0); dir = (signal_info.flags >> MCHP_DT_ESPI_VW_FLAG_DIR_POS) & BIT(0);
if (dir == ESPI_MASTER_TO_SLAVE) { if (dir == ESPI_MASTER_TO_SLAVE) {
regaddr = xec_msvw_addr(dev, xec_id); regaddr = xec_msvw_addr(dev, xec_id);
@ -1339,26 +1339,75 @@ static void espi_xec_connect_irqs(const struct device *dev)
#endif #endif
} }
/* MSVW is a 96-bit register and SMVW is a 64-bit register.
* Each MSVW/SMVW controls a group of 4 eSPI virtual wires.
* Host index located in b[7:0]
* Reset source located in b[9:8]
* Reset VW values SRC[3:0] located in b[15:12].
* MSVW current VW state values located in bits[64, 72, 80, 88]
* SMVW current VW state values located in bits[32, 40, 48, 56]
*/
static void xec_vw_cfg_properties(const struct xec_signal *p, uint32_t regaddr, uint8_t dir)
{
uint32_t src_ofs = 4u;
uint8_t src_pos = (8u * p->bit);
uint8_t rst_state = (p->flags >> MCHP_DT_ESPI_VW_FLAG_RST_STATE_POS)
& MCHP_DT_ESPI_VW_FLAG_RST_STATE_MSK0;
uint8_t rst_src = rst_src = (p->flags >> MCHP_DT_ESPI_VW_FLAG_RST_SRC_POS)
& MCHP_DT_ESPI_VW_FLAG_RST_SRC_MSK0;
if (dir) {
src_ofs = 8u;
}
if (rst_state || rst_src) { /* change reset source or state ? */
sys_write8(0, regaddr); /* disable register */
uint8_t temp = sys_read8(regaddr + 1u);
if (rst_state) { /* change reset state and default value of this vwire? */
rst_state--;
if (rst_state) {
temp |= BIT(p->bit + 4u);
sys_set_bit(regaddr + src_ofs, src_pos);
} else {
temp |= ~BIT(p->bit + 4u);
sys_clear_bit(regaddr + src_ofs, src_pos);
}
}
if (rst_src) { /* change reset source of all vwires in this group? */
rst_src--;
temp = (temp & ~0x3u) | (rst_src & 0x3u);
}
sys_write8(temp, regaddr + 1u);
}
if (sys_read8(regaddr) != p->host_idx) {
sys_write8(p->host_idx, regaddr);
}
}
/* Check each VW register set host index is present. /* Check each VW register set host index is present.
* Some VW's power up with the host index and others do not. * Some VW's power up with the host index and others do not.
* NOTE: Virtual wires are in groups of 4. Disabling one wire in a group
* will disable all wires in the group. We do not implement disabling.
*/ */
static void xec_vw_config(const struct device *dev) static void xec_vw_config(const struct device *dev)
{ {
for (int i = 0; i < ARRAY_SIZE(vw_tbl); i++) { for (int i = ESPI_VWIRE_SIGNAL_SLV_GPIO_0; i < ARRAY_SIZE(vw_tbl); i++) {
const struct xec_signal *p = &vw_tbl[i]; const struct xec_signal *p = &vw_tbl[i];
uint32_t regaddr = xec_smvw_addr(dev, p->xec_reg_idx) + SMVW_BI_INDEX; uint32_t regaddr = xec_smvw_addr(dev, p->xec_reg_idx);
uint8_t dir = (p->flags >> ESPI_XEC_SIGNAL_FLAG_DIR_POS) & BIT(0); uint8_t dir = (p->flags >> MCHP_DT_ESPI_VW_FLAG_DIR_POS) & BIT(0);
uint8_t en = (p->flags & BIT(ESPI_XEC_SIGNAL_FLAG_EN_POS)); uint8_t en = (p->flags & BIT(MCHP_DT_ESPI_VW_FLAG_STATUS_POS));
if (dir) {
regaddr = xec_msvw_addr(dev, p->xec_reg_idx);
}
if (en) { if (en) {
if (dir) { xec_vw_cfg_properties(p, regaddr, dir);
regaddr = xec_msvw_addr(dev, p->xec_reg_idx);
regaddr += MSVW_BI_INDEX;
}
if (sys_read8(regaddr) != p->host_idx) {
sys_write8(p->host_idx, regaddr);
}
} }
} }
} }

View file

@ -61,9 +61,6 @@ struct espi_xec_data {
#define ESPI_XEC_DATA(dev) \ #define ESPI_XEC_DATA(dev) \
((struct espi_xec_data * const)(dev)->data) ((struct espi_xec_data * const)(dev)->data)
#define ESPI_XEC_SIGNAL_FLAG_EN_POS 0
#define ESPI_XEC_SIGNAL_FLAG_DIR_POS 4
struct xec_signal { struct xec_signal {
uint8_t host_idx; uint8_t host_idx;
uint8_t bit; uint8_t bit;

View file

@ -12,218 +12,218 @@
compatible = "microchip,xec-espi-vw-routing"; compatible = "microchip,xec-espi-vw-routing";
/* eSPI Virtual Vire (VW) routing */ /* eSPI Virtual Vire (VW) routing */
vw-slp-s3-n { vw_slp_s3_n: vw_slp_s3_n {
/* Host-index MSVW/SMVW MSVW/SMVW-index source */ /* Host-index MSVW/SMVW MSVW/SMVW-index source */
vw-reg = <0x02 MSVW 0 0>; vw-reg = <0x02 MSVW 0 0>;
vw-girq = <24 0>; vw-girq = <24 0>;
status = "okay"; status = "okay";
}; };
vw-slp-s4-n { vw_slp_s4_n: vw_slp_s4_n {
vw-reg = <0x02 MSVW 0 1>; vw-reg = <0x02 MSVW 0 1>;
vw-girq = <24 1>; vw-girq = <24 1>;
status = "okay"; status = "okay";
}; };
vw-slp-s5-n { vw_slp_s5_n: vw_slp_s5_n {
vw-reg = <0x02 MSVW 0 2>; vw-reg = <0x02 MSVW 0 2>;
vw-girq = <24 2>; vw-girq = <24 2>;
status = "okay"; status = "okay";
}; };
vw-sus-stat-n { vw_sus_stat_n: vw_sus_stat_n {
vw-reg = <0x03 MSVW 1 0>; vw-reg = <0x03 MSVW 1 0>;
vw-girq = <24 4>; vw-girq = <24 4>;
status = "okay"; status = "okay";
}; };
vw-pltrst-n { vw_pltrst_n: vw_pltrst_n {
vw-reg = <0x03 MSVW 1 1>; vw-reg = <0x03 MSVW 1 1>;
vw-girq = <24 5>; vw-girq = <24 5>;
status = "okay"; status = "okay";
}; };
vw-oob-rst-warn { vw_oob_rst_warn: vw_oob_rst_warn {
vw-reg = <0x03 MSVW 1 2>; vw-reg = <0x03 MSVW 1 2>;
vw-girq = <24 6>; vw-girq = <24 6>;
status = "okay"; status = "okay";
}; };
vw-host-rst-warn { vw_host_rst_warn: vw_host_rst_warn {
vw-reg = <0x07 MSVW 2 0>; vw-reg = <0x07 MSVW 2 0>;
vw-girq = <24 8>; vw-girq = <24 8>;
status = "okay"; status = "okay";
}; };
vw-smiout-n { vw_smiout_n: vw_smiout_n {
vw-reg = <0x07 MSVW 2 1>; vw-reg = <0x07 MSVW 2 1>;
vw-girq = <24 9>; vw-girq = <24 9>;
status = "disabled"; status = "disabled";
}; };
vw-nmiout-n { vw_nmiout_n: vw_nmiout_n {
vw-reg = <0x07 MSVW 2 2>; vw-reg = <0x07 MSVW 2 2>;
vw-girq = <24 10>; vw-girq = <24 10>;
status = "disabled"; status = "disabled";
}; };
vw-sus-warn-n { vw_sus_warn_n: vw_sus_warn_n {
vw-reg = <0x41 MSVW 3 0>; vw-reg = <0x41 MSVW 3 0>;
vw-girq = <24 12>; vw-girq = <24 12>;
status = "okay"; status = "okay";
}; };
vw-sus-pwrdn-ack { vw_sus_pwrdn_ack: vw_sus_pwrdn_ack {
vw-reg = <0x41 MSVW 3 1>; vw-reg = <0x41 MSVW 3 1>;
vw-girq = <24 13>; vw-girq = <24 13>;
status = "okay"; status = "okay";
}; };
vw-slp-a-n { vw_slp_a_n: vw_slp_a_n {
vw-reg = <0x41 MSVW 3 3>; vw-reg = <0x41 MSVW 3 3>;
vw-girq = <24 15>; vw-girq = <24 15>;
status = "okay"; status = "okay";
}; };
vw-slp-lan-n { vw_slp_lan_n: vw_slp_lan_n {
vw-reg = <0x42 MSVW 4 0>; vw-reg = <0x42 MSVW 4 0>;
vw-girq = <24 16>; vw-girq = <24 16>;
status = "okay"; status = "okay";
}; };
vw-slp-wlan-n { vw_slp_wlan_n: vw_slp_wlan_n {
vw-reg = <0x42 MSVW 4 1>; vw-reg = <0x42 MSVW 4 1>;
vw-girq = <24 17>; vw-girq = <24 17>;
status = "okay"; status = "okay";
}; };
vw-host-c10 { vw_host_c10: vw_host_c10 {
vw-reg = <0x47 MSVW 7 0>; vw-reg = <0x47 MSVW 7 0>;
vw-girq = <25 0>; vw-girq = <25 0>;
status = "okay"; status = "okay";
}; };
vw-dnx-warn { vw_dnx_warn: vw_dnx_warn {
vw-reg = <0x4a MSVW 8 1>; vw-reg = <0x4a MSVW 8 1>;
vw-girq = <25 5>; vw-girq = <25 5>;
status = "okay"; status = "okay";
}; };
/* Device to Host (SMVW) do not have SoC interrupts */ /* Device to Host (SMVW) do not have SoC interrupts */
vw-oob-rst-ack { vw_oob_rst_ack: vw_oob_rst_ack {
vw-reg = <0x04 SMVW 0 0>; vw-reg = <0x04 SMVW 0 0>;
status = "okay"; status = "okay";
}; };
vw-wake-n { vw_wake_n: vw_wake_n {
vw-reg = <0x04 SMVW 0 2>; vw-reg = <0x04 SMVW 0 2>;
status = "okay"; status = "okay";
}; };
vw-pme-n { vw_pme_n: vw_pme_n {
vw-reg = <0x04 SMVW 0 3>; vw-reg = <0x04 SMVW 0 3>;
status = "okay"; status = "okay";
}; };
vw-slave-boot-done { vw_slave_boot_done: vw_slave_boot_done {
vw-reg = <0x05 SMVW 1 0>; vw-reg = <0x05 SMVW 1 0>;
status = "okay"; status = "okay";
}; };
vw-error-fatal { vw_error_fatal: vw_error_fatal {
vw-reg = <0x05 SMVW 1 1>; vw-reg = <0x05 SMVW 1 1>;
status = "okay"; status = "okay";
}; };
vw-error-non-fatal { vw_error_non_fatal: vw_error_non_fatal {
vw-reg = <0x05 SMVW 1 2>; vw-reg = <0x05 SMVW 1 2>;
status = "okay"; status = "okay";
}; };
vw-slave-boot-status { vw_slave_boot_status: vw_slave_boot_status {
vw-reg = <0x05 SMVW 1 3>; vw-reg = <0x05 SMVW 1 3>;
status = "okay"; status = "okay";
}; };
vw-sci-n { vw_sci_n: vw_sci_n {
vw-reg = <0x06 SMVW 2 0>; vw-reg = <0x06 SMVW 2 0>;
status = "okay"; status = "okay";
}; };
vw-smi-n { vw_smi_n: vw_smi_n {
vw-reg = <0x06 SMVW 2 1>; vw-reg = <0x06 SMVW 2 1>;
status = "okay"; status = "okay";
}; };
vw-rcin-n { vw_rcin_n: vw_rcin_n {
vw-reg = <0x06 SMVW 2 2>; vw-reg = <0x06 SMVW 2 2>;
status = "okay"; status = "okay";
}; };
vw-host-rst-ack { vw_host_rst_ack: vw_host_rst_ack {
vw-reg = <0x06 SMVW 2 3>; vw-reg = <0x06 SMVW 2 3>;
status = "okay"; status = "okay";
}; };
vw-sus-ack-n { vw_sus_ack_n: vw_sus_ack_n {
vw-reg = <0x40 SMVW 3 0>; vw-reg = <0x40 SMVW 3 0>;
status = "okay"; status = "okay";
}; };
vw-dnx-ack { vw_dnx_ack: vw_dnx_ack {
vw-reg = <0x40 SMVW 3 1>; vw-reg = <0x40 SMVW 3 1>;
status = "okay"; status = "okay";
}; };
vw-c2t-gpio-0 { vw_t2c_gpio_0: vw_t2c_gpio_0 {
vw-reg = <0x50 SMVW 6 0>; vw-reg = <0x50 SMVW 6 0>;
status = "disabled"; status = "disabled";
}; };
vw-c2t-gpio-1 { vw_t2c_gpio_1: vw_t2c_gpio_1 {
vw-reg = <0x50 SMVW 6 1>; vw-reg = <0x50 SMVW 6 1>;
status = "disabled"; status = "disabled";
}; };
vw-c2t-gpio-2 { vw_t2c_gpio_2: vw_t2c_gpio_2 {
vw-reg = <0x50 SMVW 6 2>; vw-reg = <0x50 SMVW 6 2>;
status = "disabled"; status = "disabled";
}; };
vw-c2t-gpio-3 { vw_t2c_gpio_3: vw_t2c_gpio_3 {
vw-reg = <0x50 SMVW 6 3>; vw-reg = <0x50 SMVW 6 3>;
status = "disabled"; status = "disabled";
}; };
vw-c2t-gpio-4 { vw_t2c_gpio_4: vw_t2c_gpio_4 {
vw-reg = <0x51 SMVW 7 0>; vw-reg = <0x51 SMVW 7 0>;
status = "disabled"; status = "disabled";
}; };
vw-c2t-gpio-5 { vw_t2c_gpio_5: vw_t2c_gpio_5 {
vw-reg = <0x51 SMVW 7 1>; vw-reg = <0x51 SMVW 7 1>;
status = "disabled"; status = "disabled";
}; };
vw-c2t-gpio-6 { vw_t2c_gpio_6: vw_t2c_gpio_6 {
vw-reg = <0x51 SMVW 7 2>; vw-reg = <0x51 SMVW 7 2>;
status = "disabled"; status = "disabled";
}; };
vw-c2t-gpio-7 { vw_t2c_gpio_7: vw_t2c_gpio_7 {
vw-reg = <0x51 SMVW 7 3>; vw-reg = <0x51 SMVW 7 3>;
status = "disabled"; status = "disabled";
}; };
vw-c2t-gpio-8 { vw_t2c_gpio_8: vw_t2c_gpio_8 {
vw-reg = <0x52 SMVW 8 0>; vw-reg = <0x52 SMVW 8 0>;
status = "disabled"; status = "disabled";
}; };
vw-c2t-gpio-9 { vw_t2c_gpio_9: vw_t2c_gpio_9 {
vw-reg = <0x52 SMVW 8 1>; vw-reg = <0x52 SMVW 8 1>;
status = "disabled"; status = "disabled";
}; };
vw-c2t-gpio-10 { vw_t2c_gpio_10: vw_t2c_gpio_10 {
vw-reg = <0x52 SMVW 8 2>; vw-reg = <0x52 SMVW 8 2>;
status = "disabled"; status = "disabled";
}; };
vw-c2t-gpio-11 { vw_t2c_gpio_11: vw_t2c_gpio_11 {
vw-reg = <0x52 SMVW 8 3>; vw-reg = <0x52 SMVW 8 3>;
status = "disabled"; status = "disabled";
}; };
vw-c2t-gpio-12 { vw_t2c_gpio_12: vw_t2c_gpio_12 {
vw-reg = <0x53 SMVW 9 0>; vw-reg = <0x53 SMVW 9 0>;
status = "disabled"; status = "disabled";
}; };
vw-c2t-gpio-13 { vw_t2c_gpio_13: vw_t2c_gpio_13 {
vw-reg = <0x53 SMVW 9 1>; vw-reg = <0x53 SMVW 9 1>;
status = "disabled"; status = "disabled";
}; };
vw-c2t-gpio-14 { vw_t2c_gpio_14: vw_t2c_gpio_14 {
vw-reg = <0x53 SMVW 9 2>; vw-reg = <0x53 SMVW 9 2>;
status = "disabled"; status = "disabled";
}; };
vw-c2t-gpio-15 { vw_t2c_gpio_15: vw_t2c_gpio_15 {
vw-reg = <0x53 SMVW 9 3>; vw-reg = <0x53 SMVW 9 3>;
status = "disabled"; status = "disabled";
}; };
vw-c2t-gpio-16 { vw_t2c_gpio_16: vw_t2c_gpio_16 {
vw-reg = <0x54 SMVW 10 0>; vw-reg = <0x54 SMVW 10 0>;
status = "disabled"; status = "disabled";
}; };
vw-c2t-gpio-17 { vw_t2c_gpio_17: vw_t2c_gpio_17 {
vw-reg = <0x54 SMVW 10 1>; vw-reg = <0x54 SMVW 10 1>;
status = "disabled"; status = "disabled";
}; };
vw-c2t-gpio-18 { vw_t2c_gpio_18: vw_t2c_gpio_18 {
vw-reg = <0x54 SMVW 10 2>; vw-reg = <0x54 SMVW 10 2>;
status = "disabled"; status = "disabled";
}; };
vw-c2t-gpio-19 { vw_t2c_gpio_19: vw_t2c_gpio_19 {
vw-reg = <0x54 SMVW 10 3>; vw-reg = <0x54 SMVW 10 3>;
status = "disabled"; status = "disabled";
}; };

View file

@ -8,19 +8,44 @@ compatible: "microchip,xec-espi-vw-routing"
include: [base.yaml] include: [base.yaml]
child-binding: child-binding:
description: | description: |
Child node containing the routing of an eSPI virtual wire to the SoC Child node containing the routing of an eSPI virtual wire to the SoC
VW registers and ECIA GIRQ registers. VW registers and ECIA GIRQ registers.
properties: properties:
vw-reg: vw-reg:
type: array type: array
required: true required: true
description: vw signal's register index and vw bitmask. description: vw signal's register index and vw bitmask.
vw-girq: vw-girq:
type: array type: array
description: | description: |
Routing of MSVW source to aggregated GIRQs Routing of MSVW source to aggregated GIRQs
For example, OOB_RST_WARN is source 2 of MSVW01 routed For example, OOB_RST_WARN is source 2 of MSVW01 routed
to GIRQ24 b[5]. vw-girq = <24 5>; to GIRQ24 b[5]. vw-girq = <24 5>;
reset-state:
type: string
description: |
Optional default virtual wire state on reset (0 or 1).
If the property is not present hardware default is used.
enum:
- "HW_DFLT"
- "0"
- "1"
reset-source:
type: string
description: |
Optional reset source in addition to chip reset.
0 is ESPI_RESET, 1 is RESET_SYS, 2 is RESET_SIO,
and 3 is ESPI Platform Reset. If this property is not
present the hardware default is used. Note: reset source
affects all four virtual wires in the VW group.
enum:
- "HW_DFLT"
- "ESPI_RESET"
- "RESET_SYS"
- "RESET_SIO"
- "PLTRST"

View file

@ -25,13 +25,28 @@
#define MCHP_XEC_DRVSTR_12MA 0x4 #define MCHP_XEC_DRVSTR_12MA 0x4
#define MCHP_XEC_FUNC_INVERT 0x1 #define MCHP_XEC_FUNC_INVERT 0x1
#define MCHP_DT_ESPI_VW_FLAG_STATUS_POS 0
#define MCHP_DT_ESPI_VW_FLAG_DIR_POS 1
#define MCHP_DT_ESPI_VW_FLAG_RST_STATE_POS 2
#define MCHP_DT_ESPI_VW_FLAG_RST_STATE_MSK0 0x3
#define MCHP_DT_ESPI_VW_FLAG_RST_SRC_POS 4
#define MCHP_DT_ESPI_VW_FLAG_RST_SRC_MSK0 0x7
#define MCHP_DT_NODE_FROM_VWTABLE(name) DT_CHILD(DT_PATH(mchp_xec_espi_vw_routing), name) #define MCHP_DT_NODE_FROM_VWTABLE(name) DT_CHILD(DT_PATH(mchp_xec_espi_vw_routing), name)
#define MCHP_DT_VW_NODE_HAS_STATUS(name) DT_NODE_HAS_STATUS(MCHP_DT_NODE_FROM_VWTABLE(name), okay) #define MCHP_DT_VW_NODE_HAS_STATUS(name) DT_NODE_HAS_STATUS(MCHP_DT_NODE_FROM_VWTABLE(name), okay)
/* Macro to store DT status in bit 0 and VW direction in bit 4 of flags */ /* Macro to store eSPI virtual wire DT flags
#define MCHP_DT_ESPI_VW_FLAGS(vw) \ * b[0] = DT status property 0 is disabled, 1 enabled,
((uint8_t)(MCHP_DT_VW_NODE_HAS_STATUS(vw)) & 0x01U) \ * b[1] = VW direction 0(EC target to host controller), 1(host controller to EC target)
| (((uint8_t)DT_PROP_BY_IDX(MCHP_DT_NODE_FROM_VWTABLE(vw), vw_reg, 1)) << 4) * b[3:2] = default virtual wire state 0(HW default), 1(low), 2(high)
* b[6:4] = virtual wire state reset event:
* 0(HW default), 1(ESPI_RESET), 2(RESET_SYS), 3(RESET_SIO), 4(PLTRST)
*/
#define MCHP_DT_ESPI_VW_FLAGS(vw) \
((uint8_t)(MCHP_DT_VW_NODE_HAS_STATUS(vw)) & 0x01U) | \
((((uint8_t)DT_PROP_BY_IDX(MCHP_DT_NODE_FROM_VWTABLE(vw), vw_reg, 1)) & 0x1) << 1) | \
((((uint8_t)DT_ENUM_IDX_OR(MCHP_DT_NODE_FROM_VWTABLE(vw), reset_state, 0)) & 0x3) << 2) | \
((((uint8_t)DT_ENUM_IDX_OR(MCHP_DT_NODE_FROM_VWTABLE(vw), reset_source, 0)) & 0x7) << 4)
/* Macro for the eSPI driver VW table entries. /* Macro for the eSPI driver VW table entries.
* e is a symbol from enum espi_vwire_signal. * e is a symbol from enum espi_vwire_signal.