@@ -138,6 +138,11 @@ static void xlnx_zynq_devcfg_update_ixr(XlnxZynqDevcfg *s)
qemu_set_irq(s->irq, ~s->regs[R_INT_MASK] & s->regs[R_INT_STS]);
}
+static void slcr_reset (DeviceState *dev) {
+ XlnxZynqDevcfg *s = XLNX_ZYNQ_DEVCFG(dev);
+ s->regs[R_INT_STS] |= R_INT_STS_PCFG_DONE_MASK;
+}
+
static void xlnx_zynq_devcfg_reset(DeviceState *dev)
{
XlnxZynqDevcfg *s = XLNX_ZYNQ_DEVCFG(dev);
@@ -374,6 +379,8 @@ static void xlnx_zynq_devcfg_init(Object *obj)
XlnxZynqDevcfg *s = XLNX_ZYNQ_DEVCFG(obj);
RegisterInfoArray *reg_array;
+ s->slcr_reset_handler = slcr_reset;
+
sysbus_init_irq(sbd, &s->irq);
memory_region_init(&s->iomem, obj, "devcfg", XLNX_ZYNQ_DEVCFG_R_MAX * 4);
@@ -26,6 +26,7 @@
#include "qom/object.h"
#include "hw/qdev-properties.h"
#include "qapi/error.h"
+#include "hw/dma/xlnx-zynq-devcfg.h"
#ifndef ZYNQ_SLCR_ERR_DEBUG
#define ZYNQ_SLCR_ERR_DEBUG 0
@@ -576,6 +577,21 @@ static void zynq_slcr_write(void *opaque, hwaddr offset,
zynq_slcr_compute_clocks(s);
zynq_slcr_propagate_clocks(s);
break;
+ case R_FPGA_RST_CTRL:
+ if (val == 0) {
+ Object *devcfgObject =
+ object_resolve_type_unambiguous("xlnx.ps7-dev-cfg", NULL);
+ if (!devcfgObject) {
+ break;
+ }
+ DeviceState *devcfg = OBJECT_CHECK(DeviceState, devcfgObject,
+ "xlnx.ps7-dev-cfg");
+ XlnxZynqDevcfg *zynqdevcfg = XLNX_ZYNQ_DEVCFG(devcfg);
+ if (zynqdevcfg) {
+ zynqdevcfg->slcr_reset_handler(devcfg);
+ }
+ }
+ break;
}
}
@@ -56,6 +56,7 @@ struct XlnxZynqDevcfg {
uint8_t dma_cmd_fifo_num;
bool is_initialized;
+ void (*slcr_reset_handler) (DeviceState *dev);
uint32_t regs[XLNX_ZYNQ_DEVCFG_R_MAX];
RegisterInfo regs_info[XLNX_ZYNQ_DEVCFG_R_MAX];