mirror of https://github.com/xemu-project/xemu.git
pnv/psi: move the ICSState qemu_irq array under the PSI device model
Future changes of the ICSState object will remove the qemu_irq array from under the interrupt controller model. Prepare ground for the PSI interrupt sources and introduce a new one directly under the PSI device model. Signed-off-by: Cédric Le Goater <clg@kaod.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
734d9c8905
commit
f8df900316
|
@ -207,7 +207,6 @@ static const uint64_t stat_bits[] = {
|
||||||
|
|
||||||
void pnv_psi_irq_set(PnvPsi *psi, PnvPsiIrq irq, bool state)
|
void pnv_psi_irq_set(PnvPsi *psi, PnvPsiIrq irq, bool state)
|
||||||
{
|
{
|
||||||
ICSState *ics = &psi->ics;
|
|
||||||
uint32_t xivr_reg;
|
uint32_t xivr_reg;
|
||||||
uint32_t stat_reg;
|
uint32_t stat_reg;
|
||||||
uint32_t src;
|
uint32_t src;
|
||||||
|
@ -227,14 +226,14 @@ void pnv_psi_irq_set(PnvPsi *psi, PnvPsiIrq irq, bool state)
|
||||||
/* TODO: optimization, check mask here. That means
|
/* TODO: optimization, check mask here. That means
|
||||||
* re-evaluating when unmasking
|
* re-evaluating when unmasking
|
||||||
*/
|
*/
|
||||||
qemu_irq_raise(ics->qirqs[src]);
|
qemu_irq_raise(psi->qirqs[src]);
|
||||||
} else {
|
} else {
|
||||||
psi->regs[stat_reg] &= ~stat_bits[irq];
|
psi->regs[stat_reg] &= ~stat_bits[irq];
|
||||||
|
|
||||||
/* FSP and PSI are muxed so don't lower if either is still set */
|
/* FSP and PSI are muxed so don't lower if either is still set */
|
||||||
if (stat_reg != PSIHB_XSCOM_CR ||
|
if (stat_reg != PSIHB_XSCOM_CR ||
|
||||||
!(psi->regs[stat_reg] & (PSIHB_CR_PSI_IRQ | PSIHB_CR_FSP_IRQ))) {
|
!(psi->regs[stat_reg] & (PSIHB_CR_PSI_IRQ | PSIHB_CR_FSP_IRQ))) {
|
||||||
qemu_irq_lower(ics->qirqs[src]);
|
qemu_irq_lower(psi->qirqs[src]);
|
||||||
} else {
|
} else {
|
||||||
state = true;
|
state = true;
|
||||||
}
|
}
|
||||||
|
@ -491,6 +490,8 @@ static void pnv_psi_realize(DeviceState *dev, Error **errp)
|
||||||
ics_set_irq_type(ics, i, true);
|
ics_set_irq_type(ics, i, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
psi->qirqs = qemu_allocate_irqs(ics_simple_set_irq, ics, ics->nr_irqs);
|
||||||
|
|
||||||
/* XSCOM region for PSI registers */
|
/* XSCOM region for PSI registers */
|
||||||
pnv_xscom_region_init(&psi->xscom_regs, OBJECT(dev), &pnv_psi_xscom_ops,
|
pnv_xscom_region_init(&psi->xscom_regs, OBJECT(dev), &pnv_psi_xscom_ops,
|
||||||
psi, "xscom-psi", PNV_XSCOM_PSIHB_SIZE);
|
psi, "xscom-psi", PNV_XSCOM_PSIHB_SIZE);
|
||||||
|
|
|
@ -40,6 +40,7 @@ typedef struct PnvPsi {
|
||||||
|
|
||||||
/* Interrupt generation */
|
/* Interrupt generation */
|
||||||
ICSState ics;
|
ICSState ics;
|
||||||
|
qemu_irq *qirqs;
|
||||||
|
|
||||||
/* Registers */
|
/* Registers */
|
||||||
uint64_t regs[PSIHB_XSCOM_MAX];
|
uint64_t regs[PSIHB_XSCOM_MAX];
|
||||||
|
|
Loading…
Reference in New Issue