@@ -55,11 +55,129 @@ void kvm_arch_destroy_vm(struct kvm *kvm)
5555 kvm_riscv_aia_destroy_vm (kvm );
5656}
5757
58+ int kvm_vm_ioctl_irq_line (struct kvm * kvm , struct kvm_irq_level * irql ,
59+ bool line_status )
60+ {
61+ if (!irqchip_in_kernel (kvm ))
62+ return - ENXIO ;
63+
64+ return kvm_riscv_aia_inject_irq (kvm , irql -> irq , irql -> level );
65+ }
66+
67+ int kvm_set_msi (struct kvm_kernel_irq_routing_entry * e ,
68+ struct kvm * kvm , int irq_source_id ,
69+ int level , bool line_status )
70+ {
71+ struct kvm_msi msi ;
72+
73+ if (!level )
74+ return -1 ;
75+
76+ msi .address_lo = e -> msi .address_lo ;
77+ msi .address_hi = e -> msi .address_hi ;
78+ msi .data = e -> msi .data ;
79+ msi .flags = e -> msi .flags ;
80+ msi .devid = e -> msi .devid ;
81+
82+ return kvm_riscv_aia_inject_msi (kvm , & msi );
83+ }
84+
85+ static int kvm_riscv_set_irq (struct kvm_kernel_irq_routing_entry * e ,
86+ struct kvm * kvm , int irq_source_id ,
87+ int level , bool line_status )
88+ {
89+ return kvm_riscv_aia_inject_irq (kvm , e -> irqchip .pin , level );
90+ }
91+
92+ int kvm_riscv_setup_default_irq_routing (struct kvm * kvm , u32 lines )
93+ {
94+ struct kvm_irq_routing_entry * ents ;
95+ int i , rc ;
96+
97+ ents = kcalloc (lines , sizeof (* ents ), GFP_KERNEL );
98+ if (!ents )
99+ return - ENOMEM ;
100+
101+ for (i = 0 ; i < lines ; i ++ ) {
102+ ents [i ].gsi = i ;
103+ ents [i ].type = KVM_IRQ_ROUTING_IRQCHIP ;
104+ ents [i ].u .irqchip .irqchip = 0 ;
105+ ents [i ].u .irqchip .pin = i ;
106+ }
107+ rc = kvm_set_irq_routing (kvm , ents , lines , 0 );
108+ kfree (ents );
109+
110+ return rc ;
111+ }
112+
113+ bool kvm_arch_can_set_irq_routing (struct kvm * kvm )
114+ {
115+ return irqchip_in_kernel (kvm );
116+ }
117+
118+ int kvm_set_routing_entry (struct kvm * kvm ,
119+ struct kvm_kernel_irq_routing_entry * e ,
120+ const struct kvm_irq_routing_entry * ue )
121+ {
122+ int r = - EINVAL ;
123+
124+ switch (ue -> type ) {
125+ case KVM_IRQ_ROUTING_IRQCHIP :
126+ e -> set = kvm_riscv_set_irq ;
127+ e -> irqchip .irqchip = ue -> u .irqchip .irqchip ;
128+ e -> irqchip .pin = ue -> u .irqchip .pin ;
129+ if ((e -> irqchip .pin >= KVM_IRQCHIP_NUM_PINS ) ||
130+ (e -> irqchip .irqchip >= KVM_NR_IRQCHIPS ))
131+ goto out ;
132+ break ;
133+ case KVM_IRQ_ROUTING_MSI :
134+ e -> set = kvm_set_msi ;
135+ e -> msi .address_lo = ue -> u .msi .address_lo ;
136+ e -> msi .address_hi = ue -> u .msi .address_hi ;
137+ e -> msi .data = ue -> u .msi .data ;
138+ e -> msi .flags = ue -> flags ;
139+ e -> msi .devid = ue -> u .msi .devid ;
140+ break ;
141+ default :
142+ goto out ;
143+ }
144+ r = 0 ;
145+ out :
146+ return r ;
147+ }
148+
149+ int kvm_arch_set_irq_inatomic (struct kvm_kernel_irq_routing_entry * e ,
150+ struct kvm * kvm , int irq_source_id , int level ,
151+ bool line_status )
152+ {
153+ if (!level )
154+ return - EWOULDBLOCK ;
155+
156+ switch (e -> type ) {
157+ case KVM_IRQ_ROUTING_MSI :
158+ return kvm_set_msi (e , kvm , irq_source_id , level , line_status );
159+
160+ case KVM_IRQ_ROUTING_IRQCHIP :
161+ return kvm_riscv_set_irq (e , kvm , irq_source_id ,
162+ level , line_status );
163+ }
164+
165+ return - EWOULDBLOCK ;
166+ }
167+
168+ bool kvm_arch_irqchip_in_kernel (struct kvm * kvm )
169+ {
170+ return irqchip_in_kernel (kvm );
171+ }
172+
58173int kvm_vm_ioctl_check_extension (struct kvm * kvm , long ext )
59174{
60175 int r ;
61176
62177 switch (ext ) {
178+ case KVM_CAP_IRQCHIP :
179+ r = kvm_riscv_aia_available ();
180+ break ;
63181 case KVM_CAP_IOEVENTFD :
64182 case KVM_CAP_DEVICE_CTRL :
65183 case KVM_CAP_USER_MEMORY :
0 commit comments