mirror of https://github.com/xemu-project/xemu.git
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:
parent
4af88944d0
commit
641c349352
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue