17
17
LOG_MODULE_REGISTER (espi , CONFIG_ESPI_LOG_LEVEL );
18
18
19
19
#include "espi_utils.h"
20
+ #include "reg/reg_acpi.h"
21
+ #include "reg/reg_emi.h"
20
22
#include "reg/reg_espi.h"
21
23
#include "reg/reg_port80.h"
22
24
@@ -26,6 +28,14 @@ struct espi_rts5912_config {
26
28
volatile struct espi_reg * const espi_reg ;
27
29
uint32_t espislv_clk_grp ;
28
30
uint32_t espislv_clk_idx ;
31
+ #ifdef CONFIG_ESPI_PERIPHERAL_EC_HOST_CMD
32
+ volatile struct acpi_reg * const promt0_reg ;
33
+ uint32_t promt0_clk_grp ;
34
+ uint32_t promt0_clk_idx ;
35
+ volatile struct emi_reg * const emi0_reg ;
36
+ uint32_t emi0_clk_grp ;
37
+ uint32_t emi0_clk_idx ;
38
+ #endif
29
39
#ifdef CONFIG_ESPI_PERIPHERAL_DEBUG_PORT_80
30
40
volatile struct port80_reg * const port80_reg ;
31
41
uint32_t port80_clk_grp ;
@@ -51,6 +61,88 @@ struct espi_rts5912_data {
51
61
#endif
52
62
};
53
63
64
+ /*
65
+ * =========================================================================
66
+ * ESPI Peripheral EC Host Command (Promt0)
67
+ * =========================================================================
68
+ */
69
+
70
+ #ifdef CONFIG_ESPI_PERIPHERAL_EC_HOST_CMD
71
+
72
+ #define ESPI_RTK_PERIPHERAL_HOST_CMD_PARAM_SIZE 256
73
+
74
+ static uint8_t ec_host_cmd_sram [ESPI_RTK_PERIPHERAL_HOST_CMD_PARAM_SIZE ] __aligned (256 );
75
+
76
+ static void espi_setup_host_cmd_shm (const struct espi_rts5912_config * const espi_config )
77
+ {
78
+ volatile struct emi_reg * const emi0_reg = espi_config -> emi0_reg ;
79
+
80
+ emi0_reg -> SAR = (uint32_t )& ec_host_cmd_sram [0 ];
81
+ }
82
+
83
+ static void promt0_ibf_isr (const struct device * dev )
84
+ {
85
+ const struct espi_rts5912_config * const espi_config = dev -> config ;
86
+ volatile struct acpi_reg * const promt0_reg = espi_config -> promt0_reg ;
87
+ struct espi_rts5912_data * data = dev -> data ;
88
+ struct espi_event evt = {.evt_type = ESPI_BUS_PERIPHERAL_NOTIFICATION ,
89
+ .evt_details = ESPI_PERIPHERAL_EC_HOST_CMD ,
90
+ .evt_data = ESPI_PERIPHERAL_NODATA };
91
+
92
+ promt0_reg -> STS |= ACPI_STS_STS0 ;
93
+ evt .evt_data = (uint8_t )promt0_reg -> IB ;
94
+ espi_send_callbacks (& data -> callbacks , dev , evt );
95
+ }
96
+
97
+ static int espi_promt0_setup (const struct device * dev )
98
+ {
99
+ const struct espi_rts5912_config * const espi_config = dev -> config ;
100
+ struct rts5912_sccon_subsys sccon ;
101
+ volatile struct acpi_reg * const promt0_reg = espi_config -> promt0_reg ;
102
+ int rc ;
103
+
104
+ if (!device_is_ready (espi_config -> clk_dev )) {
105
+ LOG_ERR ("Promt0 clock not ready" );
106
+ return - ENODEV ;
107
+ }
108
+
109
+ sccon .clk_grp = espi_config -> promt0_clk_grp ;
110
+ sccon .clk_idx = espi_config -> promt0_clk_idx ;
111
+
112
+ rc = clock_control_on (espi_config -> clk_dev , (clock_control_subsys_t )& sccon );
113
+ if (rc != 0 ) {
114
+ LOG_ERR ("Promt0 clock control on failed" );
115
+ return rc ;
116
+ }
117
+
118
+ promt0_reg -> STS = 0 ;
119
+
120
+ if (promt0_reg -> STS & ACPI_STS_IBF ) {
121
+ rc = promt0_reg -> IB ;
122
+ }
123
+
124
+ if (promt0_reg -> STS & ACPI_STS_IBF ) {
125
+ promt0_reg -> IB |= ACPI_IB_IBCLR ;
126
+ }
127
+
128
+ promt0_reg -> PTADDR =
129
+ CONFIG_ESPI_PERIPHERAL_HOST_CMD_DATA_PORT_NUM | (0x04 << ACPI_PTADDR_OFFSET_Pos );
130
+ promt0_reg -> VWCTRL1 = ACPI_VWCTRL1_ACTEN ;
131
+ promt0_reg -> INTEN = ACPI_INTEN_IBFINTEN ;
132
+
133
+ NVIC_ClearPendingIRQ (DT_IRQ_BY_NAME (DT_DRV_INST (0 ), promt0_ibf , irq ));
134
+
135
+ /* IBF */
136
+ IRQ_CONNECT (DT_IRQ_BY_NAME (DT_DRV_INST (0 ), promt0_ibf , irq ),
137
+ DT_IRQ_BY_NAME (DT_DRV_INST (0 ), promt0_ibf , priority ), promt0_ibf_isr ,
138
+ DEVICE_DT_GET (DT_DRV_INST (0 )), 0 );
139
+ irq_enable (DT_IRQ_BY_NAME (DT_DRV_INST (0 ), promt0_ibf , irq ));
140
+
141
+ return 0 ;
142
+ }
143
+
144
+ #endif /* CONFIG_ESPI_PERIPHERAL_EC_HOST_CMD */
145
+
54
146
/*
55
147
* =========================================================================
56
148
* ESPI Peripheral Debug Port 80
@@ -1635,6 +1727,16 @@ static int espi_rts5912_init(const struct device *dev)
1635
1727
/* Setup eSPI bus reset */
1636
1728
espi_bus_reset_setup (dev );
1637
1729
1730
+ #ifdef CONFIG_ESPI_PERIPHERAL_EC_HOST_CMD
1731
+ rc = espi_promt0_setup (dev );
1732
+ if (rc != 0 ) {
1733
+ LOG_ERR ("eSPI Promt0 setup failed" );
1734
+ goto exit ;
1735
+ }
1736
+
1737
+ espi_setup_host_cmd_shm (espi_config );
1738
+ #endif
1739
+
1638
1740
#ifdef CONFIG_ESPI_PERIPHERAL_DEBUG_PORT_80
1639
1741
/* Setup Port80 */
1640
1742
rc = espi_peri_ch_port80_setup (dev );
@@ -1679,6 +1781,15 @@ static const struct espi_rts5912_config espi_rts5912_config = {
1679
1781
.espi_reg = (volatile struct espi_reg * const )DT_INST_REG_ADDR_BY_NAME (0 , espi_target ),
1680
1782
.espislv_clk_grp = DT_CLOCKS_CELL_BY_NAME (DT_DRV_INST (0 ), espi_target , clk_grp ),
1681
1783
.espislv_clk_idx = DT_CLOCKS_CELL_BY_NAME (DT_DRV_INST (0 ), espi_target , clk_idx ),
1784
+ #ifdef CONFIG_ESPI_PERIPHERAL_EC_HOST_CMD
1785
+ .promt0_reg = (volatile struct acpi_reg * const )DT_INST_REG_ADDR_BY_NAME (0 , promt0 ),
1786
+ .promt0_clk_grp = DT_CLOCKS_CELL_BY_NAME (DT_DRV_INST (0 ), promt0 , clk_grp ),
1787
+ .promt0_clk_idx = DT_CLOCKS_CELL_BY_NAME (DT_DRV_INST (0 ), promt0 , clk_idx ),
1788
+
1789
+ .emi0_reg = (volatile struct emi_reg * const )DT_INST_REG_ADDR_BY_NAME (0 , emi0 ),
1790
+ .emi0_clk_grp = DT_CLOCKS_CELL_BY_NAME (DT_DRV_INST (0 ), emi0 , clk_grp ),
1791
+ .emi0_clk_idx = DT_CLOCKS_CELL_BY_NAME (DT_DRV_INST (0 ), emi0 , clk_idx ),
1792
+ #endif
1682
1793
#ifdef CONFIG_ESPI_PERIPHERAL_DEBUG_PORT_80
1683
1794
.port80_reg = (volatile struct port80_reg * const )DT_INST_REG_ADDR_BY_NAME (0 , port80 ),
1684
1795
.port80_clk_grp = DT_CLOCKS_CELL_BY_NAME (DT_DRV_INST (0 ), port80 , clk_grp ),
0 commit comments