mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-09 10:34:58 -06:00
hw/arm/xlnx-zynqmp: 'Or' the QSPI / QSPI DMA IRQs
'Or' the IRQs coming from the QSPI and QSPI DMA models. This is done for avoiding the situation where one of the models incorrectly deasserts an interrupt asserted from the other model (which will result in that the IRQ is lost and will not reach guest SW). Signed-off-by: Francisco Iglesias <francisco.iglesias@xilinx.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Luc Michel <luc@lmichel.fr> Message-id: 20220203151742.1457-1-francisco.iglesias@xilinx.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
a7b66ada6e
commit
c74ccb5dd6
2 changed files with 14 additions and 2 deletions
|
@ -50,6 +50,7 @@
|
||||||
#define LQSPI_ADDR 0xc0000000
|
#define LQSPI_ADDR 0xc0000000
|
||||||
#define QSPI_IRQ 15
|
#define QSPI_IRQ 15
|
||||||
#define QSPI_DMA_ADDR 0xff0f0800
|
#define QSPI_DMA_ADDR 0xff0f0800
|
||||||
|
#define NUM_QSPI_IRQ_LINES 2
|
||||||
|
|
||||||
#define DP_ADDR 0xfd4a0000
|
#define DP_ADDR 0xfd4a0000
|
||||||
#define DP_IRQ 113
|
#define DP_IRQ 113
|
||||||
|
@ -362,6 +363,8 @@ static void xlnx_zynqmp_init(Object *obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
object_initialize_child(obj, "qspi-dma", &s->qspi_dma, TYPE_XLNX_CSU_DMA);
|
object_initialize_child(obj, "qspi-dma", &s->qspi_dma, TYPE_XLNX_CSU_DMA);
|
||||||
|
object_initialize_child(obj, "qspi-irq-orgate",
|
||||||
|
&s->qspi_irq_orgate, TYPE_OR_IRQ);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
|
static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
|
||||||
|
@ -709,6 +712,11 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
|
||||||
gic_spi[adma_ch_intr[i]]);
|
gic_spi[adma_ch_intr[i]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object_property_set_int(OBJECT(&s->qspi_irq_orgate),
|
||||||
|
"num-lines", NUM_QSPI_IRQ_LINES, &error_fatal);
|
||||||
|
qdev_realize(DEVICE(&s->qspi_irq_orgate), NULL, &error_fatal);
|
||||||
|
qdev_connect_gpio_out(DEVICE(&s->qspi_irq_orgate), 0, gic_spi[QSPI_IRQ]);
|
||||||
|
|
||||||
if (!object_property_set_link(OBJECT(&s->qspi_dma), "dma",
|
if (!object_property_set_link(OBJECT(&s->qspi_dma), "dma",
|
||||||
OBJECT(system_memory), errp)) {
|
OBJECT(system_memory), errp)) {
|
||||||
return;
|
return;
|
||||||
|
@ -718,7 +726,8 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
|
||||||
}
|
}
|
||||||
|
|
||||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->qspi_dma), 0, QSPI_DMA_ADDR);
|
sysbus_mmio_map(SYS_BUS_DEVICE(&s->qspi_dma), 0, QSPI_DMA_ADDR);
|
||||||
sysbus_connect_irq(SYS_BUS_DEVICE(&s->qspi_dma), 0, gic_spi[QSPI_IRQ]);
|
sysbus_connect_irq(SYS_BUS_DEVICE(&s->qspi_dma), 0,
|
||||||
|
qdev_get_gpio_in(DEVICE(&s->qspi_irq_orgate), 0));
|
||||||
|
|
||||||
if (!object_property_set_link(OBJECT(&s->qspi), "stream-connected-dma",
|
if (!object_property_set_link(OBJECT(&s->qspi), "stream-connected-dma",
|
||||||
OBJECT(&s->qspi_dma), errp)) {
|
OBJECT(&s->qspi_dma), errp)) {
|
||||||
|
@ -729,7 +738,8 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
|
||||||
}
|
}
|
||||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->qspi), 0, QSPI_ADDR);
|
sysbus_mmio_map(SYS_BUS_DEVICE(&s->qspi), 0, QSPI_ADDR);
|
||||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->qspi), 1, LQSPI_ADDR);
|
sysbus_mmio_map(SYS_BUS_DEVICE(&s->qspi), 1, LQSPI_ADDR);
|
||||||
sysbus_connect_irq(SYS_BUS_DEVICE(&s->qspi), 0, gic_spi[QSPI_IRQ]);
|
sysbus_connect_irq(SYS_BUS_DEVICE(&s->qspi), 0,
|
||||||
|
qdev_get_gpio_in(DEVICE(&s->qspi_irq_orgate), 1));
|
||||||
|
|
||||||
for (i = 0; i < XLNX_ZYNQMP_NUM_QSPI_BUS; i++) {
|
for (i = 0; i < XLNX_ZYNQMP_NUM_QSPI_BUS; i++) {
|
||||||
g_autofree gchar *bus_name = g_strdup_printf("qspi%d", i);
|
g_autofree gchar *bus_name = g_strdup_printf("qspi%d", i);
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include "hw/dma/xlnx_csu_dma.h"
|
#include "hw/dma/xlnx_csu_dma.h"
|
||||||
#include "hw/nvram/xlnx-bbram.h"
|
#include "hw/nvram/xlnx-bbram.h"
|
||||||
#include "hw/nvram/xlnx-zynqmp-efuse.h"
|
#include "hw/nvram/xlnx-zynqmp-efuse.h"
|
||||||
|
#include "hw/or-irq.h"
|
||||||
|
|
||||||
#define TYPE_XLNX_ZYNQMP "xlnx-zynqmp"
|
#define TYPE_XLNX_ZYNQMP "xlnx-zynqmp"
|
||||||
OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPState, XLNX_ZYNQMP)
|
OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPState, XLNX_ZYNQMP)
|
||||||
|
@ -122,6 +123,7 @@ struct XlnxZynqMPState {
|
||||||
XlnxZDMA gdma[XLNX_ZYNQMP_NUM_GDMA_CH];
|
XlnxZDMA gdma[XLNX_ZYNQMP_NUM_GDMA_CH];
|
||||||
XlnxZDMA adma[XLNX_ZYNQMP_NUM_ADMA_CH];
|
XlnxZDMA adma[XLNX_ZYNQMP_NUM_ADMA_CH];
|
||||||
XlnxCSUDMA qspi_dma;
|
XlnxCSUDMA qspi_dma;
|
||||||
|
qemu_or_irq qspi_irq_orgate;
|
||||||
|
|
||||||
char *boot_cpu;
|
char *boot_cpu;
|
||||||
ARMCPU *boot_cpu_ptr;
|
ARMCPU *boot_cpu_ptr;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue