mirror of
https://github.com/qemu/qemu.git
synced 2025-08-09 10:25:06 +00:00
hw/arm/armsse: Wire up the MHUs
Create and connect the MHUs in the SSE-200. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20190219125808.25174-3-peter.maydell@linaro.org
This commit is contained in:
parent
cdf63440ea
commit
68d6b36f7f
@ -282,9 +282,9 @@ static void armsse_init(Object *obj)
|
|||||||
sizeof(s->sysinfo), TYPE_IOTKIT_SYSINFO);
|
sizeof(s->sysinfo), TYPE_IOTKIT_SYSINFO);
|
||||||
if (info->has_mhus) {
|
if (info->has_mhus) {
|
||||||
sysbus_init_child_obj(obj, "mhu0", &s->mhu[0], sizeof(s->mhu[0]),
|
sysbus_init_child_obj(obj, "mhu0", &s->mhu[0], sizeof(s->mhu[0]),
|
||||||
TYPE_UNIMPLEMENTED_DEVICE);
|
TYPE_ARMSSE_MHU);
|
||||||
sysbus_init_child_obj(obj, "mhu1", &s->mhu[1], sizeof(s->mhu[1]),
|
sysbus_init_child_obj(obj, "mhu1", &s->mhu[1], sizeof(s->mhu[1]),
|
||||||
TYPE_UNIMPLEMENTED_DEVICE);
|
TYPE_ARMSSE_MHU);
|
||||||
}
|
}
|
||||||
if (info->has_ppus) {
|
if (info->has_ppus) {
|
||||||
for (i = 0; i < info->num_cpus; i++) {
|
for (i = 0; i < info->num_cpus; i++) {
|
||||||
@ -766,22 +766,28 @@ static void armsse_realize(DeviceState *dev, Error **errp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (info->has_mhus) {
|
if (info->has_mhus) {
|
||||||
for (i = 0; i < ARRAY_SIZE(s->mhu); i++) {
|
/*
|
||||||
char *name;
|
* An SSE-200 with only one CPU should have only one MHU created,
|
||||||
char *port;
|
* with the region where the second MHU usually is being RAZ/WI.
|
||||||
|
* We don't implement that SSE-200 config; if we want to support
|
||||||
|
* it then this code needs to be enhanced to handle creating the
|
||||||
|
* RAZ/WI region instead of the second MHU.
|
||||||
|
*/
|
||||||
|
assert(info->num_cpus == ARRAY_SIZE(s->mhu));
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(s->mhu); i++) {
|
||||||
|
char *port;
|
||||||
|
int cpunum;
|
||||||
|
SysBusDevice *mhu_sbd = SYS_BUS_DEVICE(&s->mhu[i]);
|
||||||
|
|
||||||
name = g_strdup_printf("MHU%d", i);
|
|
||||||
qdev_prop_set_string(DEVICE(&s->mhu[i]), "name", name);
|
|
||||||
qdev_prop_set_uint64(DEVICE(&s->mhu[i]), "size", 0x1000);
|
|
||||||
object_property_set_bool(OBJECT(&s->mhu[i]), true,
|
object_property_set_bool(OBJECT(&s->mhu[i]), true,
|
||||||
"realized", &err);
|
"realized", &err);
|
||||||
g_free(name);
|
|
||||||
if (err) {
|
if (err) {
|
||||||
error_propagate(errp, err);
|
error_propagate(errp, err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
port = g_strdup_printf("port[%d]", i + 3);
|
port = g_strdup_printf("port[%d]", i + 3);
|
||||||
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->mhu[i]), 0);
|
mr = sysbus_mmio_get_region(mhu_sbd, 0);
|
||||||
object_property_set_link(OBJECT(&s->apb_ppc0), OBJECT(mr),
|
object_property_set_link(OBJECT(&s->apb_ppc0), OBJECT(mr),
|
||||||
port, &err);
|
port, &err);
|
||||||
g_free(port);
|
g_free(port);
|
||||||
@ -789,6 +795,20 @@ static void armsse_realize(DeviceState *dev, Error **errp)
|
|||||||
error_propagate(errp, err);
|
error_propagate(errp, err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Each MHU has an irq line for each CPU:
|
||||||
|
* MHU 0 irq line 0 -> CPU 0 IRQ 6
|
||||||
|
* MHU 0 irq line 1 -> CPU 1 IRQ 6
|
||||||
|
* MHU 1 irq line 0 -> CPU 0 IRQ 7
|
||||||
|
* MHU 1 irq line 1 -> CPU 1 IRQ 7
|
||||||
|
*/
|
||||||
|
for (cpunum = 0; cpunum < info->num_cpus; cpunum++) {
|
||||||
|
DeviceState *cpudev = DEVICE(&s->armv7m[cpunum]);
|
||||||
|
|
||||||
|
sysbus_connect_irq(mhu_sbd, cpunum,
|
||||||
|
qdev_get_gpio_in(cpudev, 6 + i));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,6 +95,7 @@
|
|||||||
#include "hw/misc/iotkit-sysctl.h"
|
#include "hw/misc/iotkit-sysctl.h"
|
||||||
#include "hw/misc/iotkit-sysinfo.h"
|
#include "hw/misc/iotkit-sysinfo.h"
|
||||||
#include "hw/misc/armsse-cpuid.h"
|
#include "hw/misc/armsse-cpuid.h"
|
||||||
|
#include "hw/misc/armsse-mhu.h"
|
||||||
#include "hw/misc/unimp.h"
|
#include "hw/misc/unimp.h"
|
||||||
#include "hw/or-irq.h"
|
#include "hw/or-irq.h"
|
||||||
#include "hw/core/split-irq.h"
|
#include "hw/core/split-irq.h"
|
||||||
@ -166,7 +167,7 @@ typedef struct ARMSSE {
|
|||||||
IoTKitSysCtl sysctl;
|
IoTKitSysCtl sysctl;
|
||||||
IoTKitSysCtl sysinfo;
|
IoTKitSysCtl sysinfo;
|
||||||
|
|
||||||
UnimplementedDeviceState mhu[2];
|
ARMSSEMHU mhu[2];
|
||||||
UnimplementedDeviceState ppu[NUM_PPUS];
|
UnimplementedDeviceState ppu[NUM_PPUS];
|
||||||
UnimplementedDeviceState cachectrl[SSE_MAX_CPUS];
|
UnimplementedDeviceState cachectrl[SSE_MAX_CPUS];
|
||||||
UnimplementedDeviceState cpusecctrl[SSE_MAX_CPUS];
|
UnimplementedDeviceState cpusecctrl[SSE_MAX_CPUS];
|
||||||
|
Loading…
Reference in New Issue
Block a user