@@ -32,6 +32,7 @@ LOG_MODULE_REGISTER(espi, CONFIG_ESPI_LOG_LEVEL);
32
32
#define IT8XXX2_PORT_80_IRQ DT_INST_IRQ_BY_IDX(0, 5, irq)
33
33
#define IT8XXX2_PMC2_IBF_IRQ DT_INST_IRQ_BY_IDX(0, 6, irq)
34
34
#define IT8XXX2_TRANS_IRQ DT_INST_IRQ_BY_IDX(0, 7, irq)
35
+ #define IT8XXX2_PMC3_IBF_IRQ DT_INST_IRQ_BY_IDX(0, 8, irq)
35
36
36
37
/* General Capabilities and Configuration 1 */
37
38
#define IT8XXX2_ESPI_MAX_FREQ_MASK GENMASK(2, 0)
@@ -306,8 +307,20 @@ struct pmc_regs {
306
307
volatile uint8_t MBXCTRL ;
307
308
/* 0x1a-0x1f: Reserved2 */
308
309
volatile uint8_t reserved2 [6 ];
309
- /* 0x20-0xff: Reserved3 */
310
- volatile uint8_t reserved3 [0xe0 ];
310
+ /* 0x20: Host Interface PM Channel 3 Status */
311
+ volatile uint8_t PM3STS ;
312
+ /* 0x21: Host Interface PM Channel 3 Data Out Port */
313
+ volatile uint8_t PM3DO ;
314
+ /* 0x22: Host Interface PM Channel 3 Data In Port */
315
+ volatile uint8_t PM3DI ;
316
+ /* 0x23: Host Interface PM Channel 3 Control */
317
+ volatile uint8_t PM3CTL ;
318
+ /* 0x24: Host Interface PM Channel 3 Interrupt Control */
319
+ volatile uint8_t PM3IC ;
320
+ /* 0x25: Host Interface PM Channel 3 Interrupt Enable */
321
+ volatile uint8_t PM3IE ;
322
+ /* 0x26-0xff: Reserved3 */
323
+ volatile uint8_t reserved3 [0xda ];
311
324
};
312
325
313
326
/* Input Buffer Full Interrupt Enable */
@@ -325,6 +338,8 @@ struct pmc_regs {
325
338
#define PMC_PM2CTL_IBFIE BIT(0)
326
339
/* General Purpose Flag */
327
340
#define PMC_PM2STS_GPF BIT(2)
341
+ /* PMC3 Input Buffer Full Interrupt Enable */
342
+ #define PMC_PM3CTL_IBFIE BIT(0)
328
343
329
344
/*
330
345
* Dedicated Interrupt
@@ -614,6 +629,12 @@ IT8XXX2_ESPI_REG_OFFSET_CHECK(pmc_regs, PM2DO, 0x11);
614
629
IT8XXX2_ESPI_REG_OFFSET_CHECK (pmc_regs , PM2DI , 0x14 );
615
630
IT8XXX2_ESPI_REG_OFFSET_CHECK (pmc_regs , PM2CTL , 0x16 );
616
631
IT8XXX2_ESPI_REG_OFFSET_CHECK (pmc_regs , MBXCTRL , 0x19 );
632
+ IT8XXX2_ESPI_REG_OFFSET_CHECK (pmc_regs , PM3STS , 0x20 );
633
+ IT8XXX2_ESPI_REG_OFFSET_CHECK (pmc_regs , PM3DO , 0x21 );
634
+ IT8XXX2_ESPI_REG_OFFSET_CHECK (pmc_regs , PM3DI , 0x22 );
635
+ IT8XXX2_ESPI_REG_OFFSET_CHECK (pmc_regs , PM3CTL , 0x23 );
636
+ IT8XXX2_ESPI_REG_OFFSET_CHECK (pmc_regs , PM3IC , 0x24 );
637
+ IT8XXX2_ESPI_REG_OFFSET_CHECK (pmc_regs , PM3IE , 0x25 );
617
638
618
639
/* eSPI slave register structure check */
619
640
IT8XXX2_ESPI_REG_SIZE_CHECK (espi_slave_regs , 0xd8 );
@@ -753,6 +774,29 @@ static const struct ec2i_t pmc1_settings[] = {
753
774
{HOST_INDEX_LDA , 0x01 },
754
775
};
755
776
777
+ #ifdef CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT
778
+ #define IT8XXX2_ESPI_HOST_IO_PVT_DATA_PORT_MSB \
779
+ ((CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT_PORT_NUM >> 8) & 0xff)
780
+ #define IT8XXX2_ESPI_HOST_IO_PVT_DATA_PORT_LSB (CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT_PORT_NUM & 0xff)
781
+ #define IT8XXX2_ESPI_HOST_IO_PVT_CMD_PORT_MSB \
782
+ (((CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT_PORT_NUM + 4) >> 8) & 0xff)
783
+ #define IT8XXX2_ESPI_HOST_IO_PVT_CMD_PORT_LSB \
784
+ ((CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT_PORT_NUM + 4) & 0xff)
785
+ static const struct ec2i_t pmc3_settings [] = {
786
+ /* Select logical device 17h(PMC3) */
787
+ {HOST_INDEX_LDN , LDN_PMC3 },
788
+ /* I/O Port Base Address (data/command ports) */
789
+ {HOST_INDEX_IOBAD0_MSB , IT8XXX2_ESPI_HOST_IO_PVT_DATA_PORT_MSB },
790
+ {HOST_INDEX_IOBAD0_LSB , IT8XXX2_ESPI_HOST_IO_PVT_DATA_PORT_LSB },
791
+ {HOST_INDEX_IOBAD1_MSB , IT8XXX2_ESPI_HOST_IO_PVT_CMD_PORT_MSB },
792
+ {HOST_INDEX_IOBAD1_LSB , IT8XXX2_ESPI_HOST_IO_PVT_CMD_PORT_LSB },
793
+ /* Set IRQ=00h for logical device */
794
+ {HOST_INDEX_IRQNUMX , 0x00 },
795
+ /* Enable logical device */
796
+ {HOST_INDEX_LDA , 0x01 },
797
+ };
798
+ #endif
799
+
756
800
#ifdef CONFIG_ESPI_PERIPHERAL_EC_HOST_CMD
757
801
#define IT8XXX2_ESPI_HC_DATA_PORT_MSB \
758
802
((CONFIG_ESPI_PERIPHERAL_HOST_CMD_DATA_PORT_NUM >> 8) & 0xff)
@@ -960,6 +1004,9 @@ static void pnpcfg_it8xxx2_init(const struct device *dev)
960
1004
#ifdef CONFIG_ESPI_PERIPHERAL_EC_HOST_CMD
961
1005
PNPCFG (pmc2 );
962
1006
#endif
1007
+ #ifdef CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT
1008
+ PNPCFG (pmc3 );
1009
+ #endif
963
1010
#if defined(CONFIG_ESPI_PERIPHERAL_EC_HOST_CMD ) || \
964
1011
defined(CONFIG_ESPI_PERIPHERAL_ACPI_SHM_REGION )
965
1012
PNPCFG (smfi );
@@ -1178,6 +1225,33 @@ static void pmc2_it8xxx2_init(const struct device *dev)
1178
1225
}
1179
1226
#endif
1180
1227
1228
+ #ifdef CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT
1229
+ /* PMC3 (Host private port) */
1230
+ static void pmc3_it8xxx2_ibf_isr (const struct device * dev )
1231
+ {
1232
+ const struct espi_it8xxx2_config * const config = dev -> config ;
1233
+ struct espi_it8xxx2_data * const data = dev -> data ;
1234
+ struct pmc_regs * const pmc_reg = (struct pmc_regs * )config -> base_pmc ;
1235
+ struct espi_event evt = {.evt_type = ESPI_BUS_PERIPHERAL_NOTIFICATION ,
1236
+ .evt_details = ESPI_PERIPHERAL_HOST_IO_PVT ,
1237
+ .evt_data = ESPI_PERIPHERAL_NODATA };
1238
+
1239
+ evt .evt_data = pmc_reg -> PM3DI ;
1240
+ espi_send_callbacks (& data -> callbacks , dev , evt );
1241
+ }
1242
+
1243
+ static void pmc3_it8xxx2_init (const struct device * dev )
1244
+ {
1245
+ const struct espi_it8xxx2_config * const config = dev -> config ;
1246
+ struct pmc_regs * const pmc_reg = (struct pmc_regs * )config -> base_pmc ;
1247
+
1248
+ /* Enable pmc3 input buffer full interrupt */
1249
+ pmc_reg -> PM3CTL |= PMC_PM3CTL_IBFIE ;
1250
+ IRQ_CONNECT (IT8XXX2_PMC3_IBF_IRQ , 0 , pmc3_it8xxx2_ibf_isr , DEVICE_DT_INST_GET (0 ), 0 );
1251
+ irq_enable (IT8XXX2_PMC3_IBF_IRQ );
1252
+ }
1253
+ #endif
1254
+
1181
1255
#define IT8XXX2_ESPI_VW_SEND_TIMEOUT_US (USEC_PER_MSEC * 10)
1182
1256
1183
1257
/* eSPI api functions */
@@ -2539,6 +2613,10 @@ static int espi_it8xxx2_init(const struct device *dev)
2539
2613
/* enable pmc2 for host command port */
2540
2614
pmc2_it8xxx2_init (dev );
2541
2615
#endif
2616
+ #ifdef CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT
2617
+ /* enable pmc3 for host private port */
2618
+ pmc3_it8xxx2_init (dev );
2619
+ #endif
2542
2620
2543
2621
/* Reset vwidx_cached_flag[] at initialization */
2544
2622
espi_it8xxx2_reset_vwidx_cache (dev );
0 commit comments