@@ -83,6 +83,40 @@ static inline int arm_gic_ppi_index(int cpu_nr, int ppi_index)
return GIC_NUM_SPI_INTR + cpu_nr * GIC_INTERNAL + ppi_index;
}
+static bool xlnx_zynqmp_get_has_rpu(Object *obj, Error **errp)
+{
+ XlnxZynqMPState *s = XLNX_ZYNQMP(obj);
+
+ return s->has_rpu;
+}
+
+static void xlnx_zynqmp_set_has_rpu(Object *obj, bool value, Error **errp)
+{
+ XlnxZynqMPState *s = XLNX_ZYNQMP(obj);
+ int i;
+
+ if (s->has_rpu == value) {
+ /* Nothing to do. */
+ return;
+ }
+
+ /* We don't support clearing the flag. */
+ if (s->has_rpu) {
+ error_setg(errp, "has_rpu is already set to %u",
+ s->has_rpu);
+ return;
+ }
+
+ /* Create the Cortex R5s. */
+ for (i = 0; i < XLNX_ZYNQMP_NUM_RPU_CPUS; i++) {
+ object_initialize(&s->rpu_cpu[i], sizeof(s->rpu_cpu[i]),
+ "cortex-r5-" TYPE_ARM_CPU);
+ object_property_add_child(obj, "rpu-cpu[*]", OBJECT(&s->rpu_cpu[i]),
+ &error_abort);
+ }
+ s->has_rpu = value;
+}
+
static void xlnx_zynqmp_setup_rpu(XlnxZynqMPState *s, const char *boot_cpu,
Error **errp)
{
@@ -118,6 +152,11 @@ static void xlnx_zynqmp_init(Object *obj)
XlnxZynqMPState *s = XLNX_ZYNQMP(obj);
int i;
+ object_property_add_bool(obj, "has_rpu",
+ xlnx_zynqmp_get_has_rpu,
+ xlnx_zynqmp_set_has_rpu,
+ &error_abort);
+
for (i = 0; i < XLNX_ZYNQMP_NUM_APU_CPUS; i++) {
object_initialize(&s->apu_cpu[i], sizeof(s->apu_cpu[i]),
"cortex-a53-" TYPE_ARM_CPU);
@@ -125,13 +164,6 @@ static void xlnx_zynqmp_init(Object *obj)
&error_abort);
}
- for (i = 0; i < XLNX_ZYNQMP_NUM_RPU_CPUS; i++) {
- object_initialize(&s->rpu_cpu[i], sizeof(s->rpu_cpu[i]),
- "cortex-r5-" TYPE_ARM_CPU);
- object_property_add_child(obj, "rpu-cpu[*]", OBJECT(&s->rpu_cpu[i]),
- &error_abort);
- }
-
object_property_add_link(obj, "ddr-ram", TYPE_MEMORY_REGION,
(Object **)&s->ddr_ram,
qdev_prop_allow_set_link_before_realize,
@@ -290,7 +322,9 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
qdev_connect_gpio_out(DEVICE(&s->apu_cpu[i]), 1, irq);
}
- xlnx_zynqmp_setup_rpu(s, boot_cpu, errp);
+ if (s->has_rpu) {
+ xlnx_zynqmp_setup_rpu(s, boot_cpu, errp);
+ }
if (!s->boot_cpu_ptr) {
error_setg(errp, "ZynqMP Boot cpu %s not found", boot_cpu);
@@ -87,6 +87,8 @@ typedef struct XlnxZynqMPState {
/* Has the ARM Security extensions? */
bool secure;
+ /* Has the RPU subsystem? */
+ bool has_rpu;
} XlnxZynqMPState;
#define XLNX_ZYNQMP_H