xics: Add xics_find_source()

PAPR allows having multiple interrupt sources such as PHB.

This adds a source lookup function and makes use of it.

Since at the moment QEMU only supports a single source,
no change in behaviour is expected.

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
Alexey Kardashevskiy 2014-05-30 19:34:13 +10:00 committed by Alexander Graf
parent 4af88944d0
commit 641c349352
1 changed files with 25 additions and 5 deletions

View File

@ -633,14 +633,32 @@ static const TypeInfo ics_info = {
/* /*
* Exported functions * Exported functions
*/ */
static int xics_find_source(XICSState *icp, int irq)
{
int sources = 1;
int src;
/* FIXME: implement multiple sources */
for (src = 0; src < sources; ++src) {
ICSState *ics = &icp->ics[src];
if (ics_valid_irq(ics, irq)) {
return src;
}
}
return -1;
}
qemu_irq xics_get_qirq(XICSState *icp, int irq) qemu_irq xics_get_qirq(XICSState *icp, int irq)
{ {
if (!ics_valid_irq(icp->ics, irq)) { int src = xics_find_source(icp, irq);
return NULL;
if (src >= 0) {
ICSState *ics = &icp->ics[src];
return ics->qirqs[irq - ics->offset];
} }
return icp->ics->qirqs[irq - icp->ics->offset]; return NULL;
} }
static void ics_set_irq_type(ICSState *ics, int srcno, bool lsi) static void ics_set_irq_type(ICSState *ics, int srcno, bool lsi)
@ -653,10 +671,12 @@ static void ics_set_irq_type(ICSState *ics, int srcno, bool lsi)
void xics_set_irq_type(XICSState *icp, int irq, bool lsi) void xics_set_irq_type(XICSState *icp, int irq, bool lsi)
{ {
ICSState *ics = icp->ics; int src = xics_find_source(icp, irq);
ICSState *ics;
assert(ics_valid_irq(ics, irq)); assert(src >= 0);
ics = &icp->ics[src];
ics_set_irq_type(ics, irq - ics->offset, lsi); ics_set_irq_type(ics, irq - ics->offset, lsi);
} }