@@ -254,13 +254,15 @@ struct gpio_irq_desc {
254
254
uint8_t level ; /* level value */
255
255
uint64_t mode ; /* interrupt trigger mode */
256
256
void * data ; /* virtio gpio instance */
257
+ uint64_t intr_stat ; /* interrupts count */
257
258
};
258
259
259
260
struct gpio_irq_chip {
260
261
pthread_mutex_t intr_mtx ;
261
262
struct gpio_irq_desc descs [VIRTIO_GPIO_MAX_VLINES ];
262
263
uint64_t intr_pending ; /* pending interrupts */
263
264
uint64_t intr_service ; /* service interrupts */
265
+ uint64_t intr_stat ; /* all interrupts count */
264
266
};
265
267
266
268
struct virtio_gpio {
@@ -278,6 +280,8 @@ struct virtio_gpio {
278
280
static void print_gpio_info (struct virtio_gpio * gpio );
279
281
static void print_virtio_gpio_info (struct virtio_gpio_request * req ,
280
282
struct virtio_gpio_response * rsp , bool in );
283
+ static void print_intr_statistics (struct gpio_irq_chip * chip );
284
+ static void record_intr_statistics (struct gpio_irq_chip * chip , uint64_t mask );
281
285
282
286
static void
283
287
native_gpio_update_line_info (struct gpio_line * line )
@@ -868,6 +872,9 @@ gpio_irq_deliver_intr(struct virtio_gpio *gpio, uint64_t mask)
868
872
/* Generate interrupt if appropriate. */
869
873
vq_endchains (vq , 1 );
870
874
875
+ /* interrupt statistics */
876
+ record_intr_statistics (& gpio -> irq_chip , mask );
877
+
871
878
} else
872
879
DPRINTF ("virtio gpio failed to send an IRQ, mask %lu" , mask );
873
880
}
@@ -1117,12 +1124,16 @@ virtio_gpio_irq_proc(struct virtio_gpio *gpio, struct iovec *iov, uint16_t flag)
1117
1124
* if gpio_irq_enable failure.
1118
1125
*/
1119
1126
gpio_irq_enable (gpio , req -> pin , req -> mode );
1127
+
1128
+ /* print IRQ statistics */
1129
+ print_intr_statistics (chip );
1120
1130
break ;
1121
1131
case IRQ_ACTION_DISABLE :
1122
1132
gpio_irq_disable (chip , req -> pin );
1123
1133
1124
- /* reopen the GPIO */
1125
- native_gpio_open_line (desc -> gpio , 0 , 0 );
1134
+
1135
+ /* print IRQ statistics */
1136
+ print_intr_statistics (chip );
1126
1137
break ;
1127
1138
case IRQ_ACTION_ACK :
1128
1139
/*
@@ -1435,4 +1446,35 @@ print_virtio_gpio_info(struct virtio_gpio_request *req,
1435
1446
rsp -> data );
1436
1447
}
1437
1448
1449
+ static void
1450
+ record_intr_statistics (struct gpio_irq_chip * chip , uint64_t mask )
1451
+ {
1452
+ struct gpio_irq_desc * desc ;
1453
+ int i ;
1454
+
1455
+ for (i = 0 ; i < VIRTIO_GPIO_MAX_VLINES ; i ++ ) {
1456
+ desc = & chip -> descs [i ];
1457
+ if (mask & BIT (desc -> pin ))
1458
+ desc -> intr_stat ++ ;
1459
+ }
1460
+ chip -> intr_stat ++ ;
1461
+ }
1462
+
1463
+ static void
1464
+ print_intr_statistics (struct gpio_irq_chip * chip )
1465
+ {
1466
+ struct gpio_irq_desc * desc ;
1467
+ int i ;
1468
+
1469
+ DPRINTF ("virtio gpio generated interrupts %lu\n" , chip -> intr_stat );
1470
+ for (i = 0 ; i < VIRTIO_GPIO_MAX_VLINES ; i ++ ) {
1471
+ desc = & chip -> descs [i ];
1472
+ if (!desc -> gpio || desc -> intr_stat == 0 )
1473
+ continue ;
1474
+ DPRINTF ("Chip %s GPIO %d generated interrupts %lu\n" ,
1475
+ desc -> gpio -> chip -> dev_name , desc -> gpio -> offset ,
1476
+ desc -> intr_stat );
1477
+ }
1478
+ }
1479
+
1438
1480
DEFINE_PCI_DEVTYPE (pci_ops_virtio_gpio );
0 commit comments