@@ -33,6 +33,8 @@ LOG_MODULE_REGISTER(espi, CONFIG_ESPI_LOG_LEVEL);
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
35
#define IT8XXX2_PMC3_IBF_IRQ DT_INST_IRQ_BY_IDX(0, 8, irq)
36
+ #define IT8XXX2_PMC4_IBF_IRQ DT_INST_IRQ_BY_IDX(0, 9, irq)
37
+ #define IT8XXX2_PMC5_IBF_IRQ DT_INST_IRQ_BY_IDX(0, 10, irq)
36
38
37
39
/* General Capabilities and Configuration 1 */
38
40
#define IT8XXX2_ESPI_MAX_FREQ_MASK GENMASK(2, 0)
@@ -319,8 +321,36 @@ struct pmc_regs {
319
321
volatile uint8_t PM3IC ;
320
322
/* 0x25: Host Interface PM Channel 3 Interrupt Enable */
321
323
volatile uint8_t PM3IE ;
322
- /* 0x26-0xff: Reserved3 */
323
- volatile uint8_t reserved3 [0xda ];
324
+ /* 0x26-0x2f: reserved_26_2f */
325
+ volatile uint8_t reserved_26_2f [10 ];
326
+ /* 0x30: PMC4 Status Register */
327
+ volatile uint8_t PM4STS ;
328
+ /* 0x31: PMC4 Data Out Port */
329
+ volatile uint8_t PM4DO ;
330
+ /* 0x32: PMC4 Data In Port */
331
+ volatile uint8_t PM4DI ;
332
+ /* 0x33: PMC4 Control */
333
+ volatile uint8_t PM4CTL ;
334
+ /* 0x34: PMC4 Interrupt Control */
335
+ volatile uint8_t PM4IC ;
336
+ /* 0x35: PMC4 Interrupt Enable*/
337
+ volatile uint8_t PM4IE ;
338
+ /* 0x36-0x3f: reserved_36_3f */
339
+ volatile uint8_t reserved_36_3f [10 ];
340
+ /* 0x40: PMC5 Status Register */
341
+ volatile uint8_t PM5STS ;
342
+ /* 0x41: PMC5 Data Out Port */
343
+ volatile uint8_t PM5DO ;
344
+ /* 0x42: PMC5 Data In Port */
345
+ volatile uint8_t PM5DI ;
346
+ /* 0x43: PMC5 Control */
347
+ volatile uint8_t PM5CTL ;
348
+ /* 0x44: PMC5 Interrupt Control */
349
+ volatile uint8_t PM5IC ;
350
+ /* 0x45: PMC5 Interrupt Enable*/
351
+ volatile uint8_t PM5IE ;
352
+ /* 0x46-0xff: reserved_46_ff */
353
+ volatile uint8_t reserved_46_ff [0xba ];
324
354
};
325
355
326
356
/* Input Buffer Full Interrupt Enable */
@@ -338,8 +368,19 @@ struct pmc_regs {
338
368
#define PMC_PM2CTL_IBFIE BIT(0)
339
369
/* General Purpose Flag */
340
370
#define PMC_PM2STS_GPF BIT(2)
371
+
341
372
/* PMC3 Input Buffer Full Interrupt Enable */
342
- #define PMC_PM3CTL_IBFIE BIT(0)
373
+ #define PMC_PM3CTL_IBFIE BIT(0)
374
+ /* A2 Address (A2) */
375
+ #define PMC_PM3STS_A2_ADDR BIT(3)
376
+ /* Input Buffer Full Interrupt Enable */
377
+ #define PMC_PM4CTL_IBFIE BIT(0)
378
+ /* A2 Address (A2) */
379
+ #define PMC_PM4STS_A2_ADDR BIT(3)
380
+ /* Input Buffer Full Interrupt Enable */
381
+ #define PMC_PM5CTL_IBFIE BIT(0)
382
+ /* A2 Address (A2) */
383
+ #define PMC_PM5STS_A2_ADDR BIT(3)
343
384
344
385
/*
345
386
* Dedicated Interrupt
@@ -797,6 +838,54 @@ static const struct ec2i_t pmc3_settings[] = {
797
838
};
798
839
#endif
799
840
841
+ #ifdef CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT2
842
+ #define IT8XXX2_ESPI_HOST_IO_PVT2_DATA_PORT_MSB \
843
+ ((CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT2_PORT_NUM >> 8) & 0xff)
844
+ #define IT8XXX2_ESPI_HOST_IO_PVT2_DATA_PORT_LSB \
845
+ (CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT2_PORT_NUM & 0xff)
846
+ #define IT8XXX2_ESPI_HOST_IO_PVT2_CMD_PORT_MSB \
847
+ (((CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT2_PORT_NUM + 4) >> 8) & 0xff)
848
+ #define IT8XXX2_ESPI_HOST_IO_PVT2_CMD_PORT_LSB \
849
+ ((CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT2_PORT_NUM + 4) & 0xff)
850
+ static const struct ec2i_t pmc4_settings [] = {
851
+ /* Select logical device 18h(PMC4) */
852
+ {HOST_INDEX_LDN , LDN_PMC4 },
853
+ /* I/O Port Base Address (data/command ports) */
854
+ {HOST_INDEX_IOBAD0_MSB , IT8XXX2_ESPI_HOST_IO_PVT2_DATA_PORT_MSB },
855
+ {HOST_INDEX_IOBAD0_LSB , IT8XXX2_ESPI_HOST_IO_PVT2_DATA_PORT_LSB },
856
+ {HOST_INDEX_IOBAD1_MSB , IT8XXX2_ESPI_HOST_IO_PVT2_CMD_PORT_MSB },
857
+ {HOST_INDEX_IOBAD1_LSB , IT8XXX2_ESPI_HOST_IO_PVT2_CMD_PORT_LSB },
858
+ /* Set IRQ=00h for logical device */
859
+ {HOST_INDEX_IRQNUMX , 0x00 },
860
+ /* Enable logical device */
861
+ {HOST_INDEX_LDA , 0x01 },
862
+ };
863
+ #endif /* CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT2 */
864
+
865
+ #ifdef CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT3
866
+ #define IT8XXX2_ESPI_HOST_IO_PVT3_DATA_PORT_MSB \
867
+ ((CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT3_PORT_NUM >> 8) & 0xff)
868
+ #define IT8XXX2_ESPI_HOST_IO_PVT3_DATA_PORT_LSB \
869
+ (CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT3_PORT_NUM & 0xff)
870
+ #define IT8XXX2_ESPI_HOST_IO_PVT3_CMD_PORT_MSB \
871
+ (((CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT3_PORT_NUM + 4) >> 8) & 0xff)
872
+ #define IT8XXX2_ESPI_HOST_IO_PVT3_CMD_PORT_LSB \
873
+ ((CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT3_PORT_NUM + 4) & 0xff)
874
+ static const struct ec2i_t pmc5_settings [] = {
875
+ /* Select logical device 19h(PMC5) */
876
+ {HOST_INDEX_LDN , LDN_PMC5 },
877
+ /* I/O Port Base Address (data/command ports) */
878
+ {HOST_INDEX_IOBAD0_MSB , IT8XXX2_ESPI_HOST_IO_PVT3_DATA_PORT_MSB },
879
+ {HOST_INDEX_IOBAD0_LSB , IT8XXX2_ESPI_HOST_IO_PVT3_DATA_PORT_LSB },
880
+ {HOST_INDEX_IOBAD1_MSB , IT8XXX2_ESPI_HOST_IO_PVT3_CMD_PORT_MSB },
881
+ {HOST_INDEX_IOBAD1_LSB , IT8XXX2_ESPI_HOST_IO_PVT3_CMD_PORT_LSB },
882
+ /* Set IRQ=00h for logical device */
883
+ {HOST_INDEX_IRQNUMX , 0x00 },
884
+ /* Enable logical device */
885
+ {HOST_INDEX_LDA , 0x01 },
886
+ };
887
+ #endif /* CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT3 */
888
+
800
889
#ifdef CONFIG_ESPI_PERIPHERAL_EC_HOST_CMD
801
890
#define IT8XXX2_ESPI_HC_DATA_PORT_MSB \
802
891
((CONFIG_ESPI_PERIPHERAL_HOST_CMD_DATA_PORT_NUM >> 8) & 0xff)
@@ -1007,6 +1096,12 @@ static void pnpcfg_it8xxx2_init(const struct device *dev)
1007
1096
#ifdef CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT
1008
1097
PNPCFG (pmc3 );
1009
1098
#endif
1099
+ #ifdef CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT2
1100
+ PNPCFG (pmc4 );
1101
+ #endif
1102
+ #ifdef CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT3
1103
+ PNPCFG (pmc5 );
1104
+ #endif
1010
1105
#if defined(CONFIG_ESPI_PERIPHERAL_EC_HOST_CMD ) || \
1011
1106
defined(CONFIG_ESPI_PERIPHERAL_ACPI_SHM_REGION )
1012
1107
PNPCFG (smfi );
@@ -1252,6 +1347,60 @@ static void pmc3_it8xxx2_init(const struct device *dev)
1252
1347
}
1253
1348
#endif
1254
1349
1350
+ /* PMC4 (Host private port 2) */
1351
+ #ifdef CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT2
1352
+ static void pmc4_it8xxx2_ibf_isr (const struct device * dev )
1353
+ {
1354
+ const struct espi_it8xxx2_config * const config = dev -> config ;
1355
+ struct espi_it8xxx2_data * const data = dev -> data ;
1356
+ struct pmc_regs * const pmc_reg = (struct pmc_regs * )config -> base_pmc ;
1357
+ struct espi_event evt = {.evt_type = ESPI_BUS_PERIPHERAL_NOTIFICATION ,
1358
+ .evt_details = ESPI_PERIPHERAL_HOST_IO_PVT2 ,
1359
+ .evt_data = ESPI_PERIPHERAL_NODATA };
1360
+
1361
+ evt .evt_data = pmc_reg -> PM4DI ;
1362
+ espi_send_callbacks (& data -> callbacks , dev , evt );
1363
+ }
1364
+
1365
+ static void pmc4_it8xxx2_init (const struct device * dev )
1366
+ {
1367
+ const struct espi_it8xxx2_config * const config = dev -> config ;
1368
+ struct pmc_regs * const pmc_reg = (struct pmc_regs * )config -> base_pmc ;
1369
+
1370
+ /* Enable pmc4 input buffer full interrupt */
1371
+ pmc_reg -> PM4CTL |= PMC_PM4CTL_IBFIE ;
1372
+ IRQ_CONNECT (IT8XXX2_PMC4_IBF_IRQ , 0 , pmc4_it8xxx2_ibf_isr , DEVICE_DT_INST_GET (0 ), 0 );
1373
+ irq_enable (IT8XXX2_PMC4_IBF_IRQ );
1374
+ }
1375
+ #endif /* CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT2 */
1376
+
1377
+ /* PMC5 (Host private port 3) */
1378
+ #ifdef CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT3
1379
+ static void pmc5_it8xxx2_ibf_isr (const struct device * dev )
1380
+ {
1381
+ const struct espi_it8xxx2_config * const config = dev -> config ;
1382
+ struct espi_it8xxx2_data * const data = dev -> data ;
1383
+ struct pmc_regs * const pmc_reg = (struct pmc_regs * )config -> base_pmc ;
1384
+ struct espi_event evt = {.evt_type = ESPI_BUS_PERIPHERAL_NOTIFICATION ,
1385
+ .evt_details = ESPI_PERIPHERAL_HOST_IO_PVT3 ,
1386
+ .evt_data = ESPI_PERIPHERAL_NODATA };
1387
+
1388
+ evt .evt_data = pmc_reg -> PM5DI ;
1389
+ espi_send_callbacks (& data -> callbacks , dev , evt );
1390
+ }
1391
+
1392
+ static void pmc5_it8xxx2_init (const struct device * dev )
1393
+ {
1394
+ const struct espi_it8xxx2_config * const config = dev -> config ;
1395
+ struct pmc_regs * const pmc_reg = (struct pmc_regs * )config -> base_pmc ;
1396
+
1397
+ /* Enable pmc5 input buffer full interrupt */
1398
+ pmc_reg -> PM5CTL |= PMC_PM5CTL_IBFIE ;
1399
+ IRQ_CONNECT (IT8XXX2_PMC5_IBF_IRQ , 0 , pmc5_it8xxx2_ibf_isr , DEVICE_DT_INST_GET (0 ), 0 );
1400
+ irq_enable (IT8XXX2_PMC5_IBF_IRQ );
1401
+ }
1402
+ #endif /* CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT3 */
1403
+
1255
1404
#define IT8XXX2_ESPI_VW_SEND_TIMEOUT_US (USEC_PER_MSEC * 10)
1256
1405
1257
1406
/* eSPI api functions */
@@ -2617,6 +2766,14 @@ static int espi_it8xxx2_init(const struct device *dev)
2617
2766
/* enable pmc3 for host private port */
2618
2767
pmc3_it8xxx2_init (dev );
2619
2768
#endif
2769
+ #ifdef CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT2
2770
+ /* enable pmc4 for host private port */
2771
+ pmc4_it8xxx2_init (dev );
2772
+ #endif
2773
+ #ifdef CONFIG_ESPI_PERIPHERAL_HOST_IO_PVT3
2774
+ /* enable pmc5 for host private port */
2775
+ pmc5_it8xxx2_init (dev );
2776
+ #endif
2620
2777
2621
2778
/* Reset vwidx_cached_flag[] at initialization */
2622
2779
espi_it8xxx2_reset_vwidx_cache (dev );
0 commit comments