mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-10 11:04:58 -06:00
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
4 changed files with 8 additions and 9 deletions
|
@ -466,6 +466,11 @@ void ics_simple_set_irq(void *opaque, int srcno, int val)
|
||||||
{
|
{
|
||||||
ICSState *ics = (ICSState *)opaque;
|
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) {
|
if (ics->irqs[srcno].flags & XICS_FLAGS_IRQ_LSI) {
|
||||||
ics_simple_set_irq_lsi(ics, srcno, val);
|
ics_simple_set_irq_lsi(ics, srcno, val);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -259,9 +259,8 @@ int ics_set_kvm_state(ICSState *ics)
|
||||||
return 0;
|
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;
|
struct kvm_irq_level args;
|
||||||
int rc;
|
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)
|
static void spapr_irq_set_irq_xics(void *opaque, int srcno, int val)
|
||||||
{
|
{
|
||||||
sPAPRMachineState *spapr = opaque;
|
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)
|
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,
|
void ics_simple_write_xive(ICSState *ics, int nr, int server,
|
||||||
uint8_t priority, uint8_t saved_priority);
|
uint8_t priority, uint8_t saved_priority);
|
||||||
void ics_simple_set_irq(void *opaque, int srcno, int val);
|
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 ics_set_irq_type(ICSState *ics, int srcno, bool lsi);
|
||||||
void icp_pic_print_info(ICPState *icp, Monitor *mon);
|
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);
|
void ics_get_kvm_state(ICSState *ics);
|
||||||
int ics_set_kvm_state(ICSState *ics);
|
int ics_set_kvm_state(ICSState *ics);
|
||||||
void ics_synchronize_state(ICSState *ics);
|
void ics_synchronize_state(ICSState *ics);
|
||||||
|
void ics_kvm_set_irq(ICSState *ics, int srcno, int val);
|
||||||
|
|
||||||
#endif /* XICS_H */
|
#endif /* XICS_H */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue