mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 02:03:56 -06:00
spapr, xics, xive: Move irq claim and free from SpaprIrq to SpaprInterruptController
These methods, like cpu_intc_create, really belong to the interrupt controller, but need to be called on all possible intcs. Like cpu_intc_create, therefore, make them methods on the intc and always call it for all existing intcs. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Reviewed-by: Greg Kurz <groug@kaod.org> Reviewed-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
ebd6be089b
commit
0b0e52b131
5 changed files with 102 additions and 115 deletions
|
@ -487,6 +487,42 @@ static const VMStateDescription vmstate_spapr_xive = {
|
|||
},
|
||||
};
|
||||
|
||||
static int spapr_xive_claim_irq(SpaprInterruptController *intc, int lisn,
|
||||
bool lsi, Error **errp)
|
||||
{
|
||||
SpaprXive *xive = SPAPR_XIVE(intc);
|
||||
XiveSource *xsrc = &xive->source;
|
||||
|
||||
assert(lisn < xive->nr_irqs);
|
||||
|
||||
if (xive_eas_is_valid(&xive->eat[lisn])) {
|
||||
error_setg(errp, "IRQ %d is not free", lisn);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set default values when allocating an IRQ number
|
||||
*/
|
||||
xive->eat[lisn].w |= cpu_to_be64(EAS_VALID | EAS_MASKED);
|
||||
if (lsi) {
|
||||
xive_source_irq_set_lsi(xsrc, lisn);
|
||||
}
|
||||
|
||||
if (kvm_irqchip_in_kernel()) {
|
||||
return kvmppc_xive_source_reset_one(xsrc, lisn, errp);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void spapr_xive_free_irq(SpaprInterruptController *intc, int lisn)
|
||||
{
|
||||
SpaprXive *xive = SPAPR_XIVE(intc);
|
||||
assert(lisn < xive->nr_irqs);
|
||||
|
||||
xive->eat[lisn].w &= cpu_to_be64(~EAS_VALID);
|
||||
}
|
||||
|
||||
static Property spapr_xive_properties[] = {
|
||||
DEFINE_PROP_UINT32("nr-irqs", SpaprXive, nr_irqs, 0),
|
||||
DEFINE_PROP_UINT32("nr-ends", SpaprXive, nr_ends, 0),
|
||||
|
@ -536,6 +572,8 @@ static void spapr_xive_class_init(ObjectClass *klass, void *data)
|
|||
xrc->get_tctx = spapr_xive_get_tctx;
|
||||
|
||||
sicc->cpu_intc_create = spapr_xive_cpu_intc_create;
|
||||
sicc->claim_irq = spapr_xive_claim_irq;
|
||||
sicc->free_irq = spapr_xive_free_irq;
|
||||
}
|
||||
|
||||
static const TypeInfo spapr_xive_info = {
|
||||
|
@ -557,39 +595,6 @@ static void spapr_xive_register_types(void)
|
|||
|
||||
type_init(spapr_xive_register_types)
|
||||
|
||||
int spapr_xive_irq_claim(SpaprXive *xive, int lisn, bool lsi, Error **errp)
|
||||
{
|
||||
XiveSource *xsrc = &xive->source;
|
||||
|
||||
assert(lisn < xive->nr_irqs);
|
||||
|
||||
if (xive_eas_is_valid(&xive->eat[lisn])) {
|
||||
error_setg(errp, "IRQ %d is not free", lisn);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set default values when allocating an IRQ number
|
||||
*/
|
||||
xive->eat[lisn].w |= cpu_to_be64(EAS_VALID | EAS_MASKED);
|
||||
if (lsi) {
|
||||
xive_source_irq_set_lsi(xsrc, lisn);
|
||||
}
|
||||
|
||||
if (kvm_irqchip_in_kernel()) {
|
||||
return kvmppc_xive_source_reset_one(xsrc, lisn, errp);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void spapr_xive_irq_free(SpaprXive *xive, int lisn)
|
||||
{
|
||||
assert(lisn < xive->nr_irqs);
|
||||
|
||||
xive->eat[lisn].w &= cpu_to_be64(~EAS_VALID);
|
||||
}
|
||||
|
||||
/*
|
||||
* XIVE hcalls
|
||||
*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue