Skip to content

Commit

Permalink
xics: Implement xics_ics_free()
Browse files Browse the repository at this point in the history
This implements interrupt release function so IRQs can be returned back
to the pool for reuse in cases such as PCI hot plug.

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: Alexander Graf <agraf@suse.de>
  • Loading branch information
aik authored and agraf committed Jun 27, 2014
1 parent ba0e5bf commit 51bba71
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 0 deletions.
27 changes: 27 additions & 0 deletions hw/intc/xics.c
Expand Up @@ -775,6 +775,33 @@ int xics_alloc_block(XICSState *icp, int src, int num, bool lsi, bool align)
return first;
}

static void ics_free(ICSState *ics, int srcno, int num)
{
int i;

for (i = srcno; i < srcno + num; ++i) {
if (ICS_IRQ_FREE(ics, i)) {
trace_xics_ics_free_warn(ics - ics->icp->ics, i + ics->offset);
}
memset(&ics->irqs[i], 0, sizeof(ICSIRQState));
}
}

void xics_free(XICSState *icp, int irq, int num)
{
int src = xics_find_source(icp, irq);

if (src >= 0) {
ICSState *ics = &icp->ics[src];

/* FIXME: implement multiple sources */
assert(src == 0);

trace_xics_ics_free(ics - icp->ics, irq, num);
ics_free(ics, irq - ics->offset, num);
}
}

/*
* Guest interfaces
*/
Expand Down
1 change: 1 addition & 0 deletions include/hw/ppc/xics.h
Expand Up @@ -162,6 +162,7 @@ qemu_irq xics_get_qirq(XICSState *icp, int irq);
void xics_set_irq_type(XICSState *icp, int irq, bool lsi);
int xics_alloc(XICSState *icp, int src, int irq_hint, bool lsi);
int xics_alloc_block(XICSState *icp, int src, int num, bool lsi, bool align);
void xics_free(XICSState *icp, int irq, int num);

void xics_cpu_setup(XICSState *icp, PowerPCCPU *cpu);

Expand Down
2 changes: 2 additions & 0 deletions trace-events
Expand Up @@ -1192,6 +1192,8 @@ xics_alloc(int src, int irq) "source#%d, irq %d"
xics_alloc_failed_hint(int src, int irq) "source#%d, irq %d is already in use"
xics_alloc_failed_no_left(int src) "source#%d, no irq left"
xics_alloc_block(int src, int first, int num, bool lsi, int align) "source#%d, first irq %d, %d irqs, lsi=%d, alignnum %d"
xics_ics_free(int src, int irq, int num) "Source#%d, first irq %d, %d irqs"
xics_ics_free_warn(int src, int irq) "Source#%d, irq %d is already free"

# hw/ppc/spapr.c
spapr_cas_failed(unsigned long n) "DT diff buffer is too small: %ld bytes"
Expand Down

0 comments on commit 51bba71

Please sign in to comment.