@@ -164,6 +164,11 @@ struct its_cmd_desc {
164
164
u32 event_id ;
165
165
} its_inv_cmd ;
166
166
167
+ struct {
168
+ struct its_device * dev ;
169
+ u32 event_id ;
170
+ } its_clear_cmd ;
171
+
167
172
struct {
168
173
struct its_device * dev ;
169
174
u32 event_id ;
@@ -380,6 +385,40 @@ static struct its_collection *its_build_inv_cmd(struct its_cmd_block *cmd,
380
385
return col ;
381
386
}
382
387
388
+ static struct its_collection * its_build_int_cmd (struct its_cmd_block * cmd ,
389
+ struct its_cmd_desc * desc )
390
+ {
391
+ struct its_collection * col ;
392
+
393
+ col = dev_event_to_col (desc -> its_int_cmd .dev ,
394
+ desc -> its_int_cmd .event_id );
395
+
396
+ its_encode_cmd (cmd , GITS_CMD_INT );
397
+ its_encode_devid (cmd , desc -> its_int_cmd .dev -> device_id );
398
+ its_encode_event_id (cmd , desc -> its_int_cmd .event_id );
399
+
400
+ its_fixup_cmd (cmd );
401
+
402
+ return col ;
403
+ }
404
+
405
+ static struct its_collection * its_build_clear_cmd (struct its_cmd_block * cmd ,
406
+ struct its_cmd_desc * desc )
407
+ {
408
+ struct its_collection * col ;
409
+
410
+ col = dev_event_to_col (desc -> its_clear_cmd .dev ,
411
+ desc -> its_clear_cmd .event_id );
412
+
413
+ its_encode_cmd (cmd , GITS_CMD_CLEAR );
414
+ its_encode_devid (cmd , desc -> its_clear_cmd .dev -> device_id );
415
+ its_encode_event_id (cmd , desc -> its_clear_cmd .event_id );
416
+
417
+ its_fixup_cmd (cmd );
418
+
419
+ return col ;
420
+ }
421
+
383
422
static struct its_collection * its_build_invall_cmd (struct its_cmd_block * cmd ,
384
423
struct its_cmd_desc * desc )
385
424
{
@@ -542,6 +581,26 @@ static void its_build_sync_cmd(struct its_cmd_block *sync_cmd,
542
581
static BUILD_SINGLE_CMD_FUNC (its_send_single_command , its_cmd_builder_t ,
543
582
struct its_collection , its_build_sync_cmd )
544
583
584
+ static void its_send_int (struct its_device * dev , u32 event_id )
585
+ {
586
+ struct its_cmd_desc desc ;
587
+
588
+ desc .its_int_cmd .dev = dev ;
589
+ desc .its_int_cmd .event_id = event_id ;
590
+
591
+ its_send_single_command (dev -> its , its_build_int_cmd , & desc );
592
+ }
593
+
594
+ static void its_send_clear (struct its_device * dev , u32 event_id )
595
+ {
596
+ struct its_cmd_desc desc ;
597
+
598
+ desc .its_clear_cmd .dev = dev ;
599
+ desc .its_clear_cmd .event_id = event_id ;
600
+
601
+ its_send_single_command (dev -> its , its_build_clear_cmd , & desc );
602
+ }
603
+
545
604
static void its_send_inv (struct its_device * dev , u32 event_id )
546
605
{
547
606
struct its_cmd_desc desc ;
@@ -708,13 +767,32 @@ static void its_irq_compose_msi_msg(struct irq_data *d, struct msi_msg *msg)
708
767
iommu_dma_map_msi_msg (d -> irq , msg );
709
768
}
710
769
770
+ static int its_irq_set_irqchip_state (struct irq_data * d ,
771
+ enum irqchip_irq_state which ,
772
+ bool state )
773
+ {
774
+ struct its_device * its_dev = irq_data_get_irq_chip_data (d );
775
+ u32 event = its_get_event_id (d );
776
+
777
+ if (which != IRQCHIP_STATE_PENDING )
778
+ return - EINVAL ;
779
+
780
+ if (state )
781
+ its_send_int (its_dev , event );
782
+ else
783
+ its_send_clear (its_dev , event );
784
+
785
+ return 0 ;
786
+ }
787
+
711
788
static struct irq_chip its_irq_chip = {
712
789
.name = "ITS" ,
713
790
.irq_mask = its_mask_irq ,
714
791
.irq_unmask = its_unmask_irq ,
715
792
.irq_eoi = irq_chip_eoi_parent ,
716
793
.irq_set_affinity = its_set_affinity ,
717
794
.irq_compose_msi_msg = its_irq_compose_msi_msg ,
795
+ .irq_set_irqchip_state = its_irq_set_irqchip_state ,
718
796
};
719
797
720
798
/*
0 commit comments