xics: Handle KVM interrupt presentation from "simple" ICS code
We want to use the "simple" ICS type in both KVM and non-KVM setups. Teach the "simple" ICS how to present interrupts to KVM and adapt sPAPR accordingly. Signed-off-by: Greg Kurz <groug@kaod.org> Message-Id: <155023082996.1011724.16237920586343905010.stgit@bahia.lan> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
f1f5b701b8
commit
557b456729
@ -466,6 +466,11 @@ void ics_simple_set_irq(void *opaque, int srcno, int val)
|
||||
{
|
||||
ICSState *ics = (ICSState *)opaque;
|
||||
|
||||
if (kvm_irqchip_in_kernel()) {
|
||||
ics_kvm_set_irq(ics, srcno, val);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ics->irqs[srcno].flags & XICS_FLAGS_IRQ_LSI) {
|
||||
ics_simple_set_irq_lsi(ics, srcno, val);
|
||||
} else {
|
||||
|
@ -259,9 +259,8 @@ int ics_set_kvm_state(ICSState *ics)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ics_kvm_set_irq(void *opaque, int srcno, int val)
|
||||
void ics_kvm_set_irq(ICSState *ics, int srcno, int val)
|
||||
{
|
||||
ICSState *ics = opaque;
|
||||
struct kvm_irq_level args;
|
||||
int rc;
|
||||
|
||||
|
@ -222,13 +222,8 @@ static int spapr_irq_post_load_xics(sPAPRMachineState *spapr, int version_id)
|
||||
static void spapr_irq_set_irq_xics(void *opaque, int srcno, int val)
|
||||
{
|
||||
sPAPRMachineState *spapr = opaque;
|
||||
MachineState *machine = MACHINE(opaque);
|
||||
|
||||
if (kvm_enabled() && machine_kernel_irqchip_allowed(machine)) {
|
||||
ics_kvm_set_irq(spapr->ics, srcno, val);
|
||||
} else {
|
||||
ics_simple_set_irq(spapr->ics, srcno, val);
|
||||
}
|
||||
ics_simple_set_irq(spapr->ics, srcno, val);
|
||||
}
|
||||
|
||||
static void spapr_irq_reset_xics(sPAPRMachineState *spapr, Error **errp)
|
||||
|
@ -180,7 +180,6 @@ void icp_eoi(ICPState *icp, uint32_t xirr);
|
||||
void ics_simple_write_xive(ICSState *ics, int nr, int server,
|
||||
uint8_t priority, uint8_t saved_priority);
|
||||
void ics_simple_set_irq(void *opaque, int srcno, int val);
|
||||
void ics_kvm_set_irq(void *opaque, int srcno, int val);
|
||||
|
||||
void ics_set_irq_type(ICSState *ics, int srcno, bool lsi);
|
||||
void icp_pic_print_info(ICPState *icp, Monitor *mon);
|
||||
@ -201,5 +200,6 @@ void icp_kvm_realize(DeviceState *dev, Error **errp);
|
||||
void ics_get_kvm_state(ICSState *ics);
|
||||
int ics_set_kvm_state(ICSState *ics);
|
||||
void ics_synchronize_state(ICSState *ics);
|
||||
void ics_kvm_set_irq(ICSState *ics, int srcno, int val);
|
||||
|
||||
#endif /* XICS_H */
|
||||
|
Loading…
Reference in New Issue
Block a user