@@ -864,6 +864,21 @@ static int bind_ipi_to_irq(unsigned int ipi, unsigned int cpu)
864864 return irq ;
865865}
866866
867+ static int bind_interdomain_evtchn_to_irq (unsigned int remote_domain ,
868+ unsigned int remote_port )
869+ {
870+ struct evtchn_bind_interdomain bind_interdomain ;
871+ int err ;
872+
873+ bind_interdomain .remote_dom = remote_domain ;
874+ bind_interdomain .remote_port = remote_port ;
875+
876+ err = HYPERVISOR_event_channel_op (EVTCHNOP_bind_interdomain ,
877+ & bind_interdomain );
878+
879+ return err ? : bind_evtchn_to_irq (bind_interdomain .local_port );
880+ }
881+
867882
868883int bind_virq_to_irq (unsigned int virq , unsigned int cpu )
869884{
@@ -959,6 +974,29 @@ int bind_evtchn_to_irqhandler(unsigned int evtchn,
959974}
960975EXPORT_SYMBOL_GPL (bind_evtchn_to_irqhandler );
961976
977+ int bind_interdomain_evtchn_to_irqhandler (unsigned int remote_domain ,
978+ unsigned int remote_port ,
979+ irq_handler_t handler ,
980+ unsigned long irqflags ,
981+ const char * devname ,
982+ void * dev_id )
983+ {
984+ int irq , retval ;
985+
986+ irq = bind_interdomain_evtchn_to_irq (remote_domain , remote_port );
987+ if (irq < 0 )
988+ return irq ;
989+
990+ retval = request_irq (irq , handler , irqflags , devname , dev_id );
991+ if (retval != 0 ) {
992+ unbind_from_irq (irq );
993+ return retval ;
994+ }
995+
996+ return irq ;
997+ }
998+ EXPORT_SYMBOL_GPL (bind_interdomain_evtchn_to_irqhandler );
999+
9621000int bind_virq_to_irqhandler (unsigned int virq , unsigned int cpu ,
9631001 irq_handler_t handler ,
9641002 unsigned long irqflags , const char * devname , void * dev_id )
0 commit comments