iotkit-sysinfo: Make SYS_VERSION and SYS_CONFIG configurable

The SYS_VERSION and SYS_CONFIG register values differ between the
IoTKit and SSE-200. Make them configurable via QOM properties rather
than hard-coded, and set them appropriately in the ARMSSE code that
instantiates the IOTKIT_SYSINFO device.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20190121185118.18550-15-peter.maydell@linaro.org
This commit is contained in:
Peter Maydell 2019-02-01 14:55:42 +00:00
parent 7cd3a2e0d5
commit dde0c49103
3 changed files with 70 additions and 2 deletions

View File

@ -18,10 +18,18 @@
#include "hw/arm/armsse.h" #include "hw/arm/armsse.h"
#include "hw/arm/arm.h" #include "hw/arm/arm.h"
/* Format of the System Information block SYS_CONFIG register */
typedef enum SysConfigFormat {
IoTKitFormat,
SSE200Format,
} SysConfigFormat;
struct ARMSSEInfo { struct ARMSSEInfo {
const char *name; const char *name;
int sram_banks; int sram_banks;
int num_cpus; int num_cpus;
uint32_t sys_version;
SysConfigFormat sys_config_format;
}; };
static const ARMSSEInfo armsse_variants[] = { static const ARMSSEInfo armsse_variants[] = {
@ -29,9 +37,39 @@ static const ARMSSEInfo armsse_variants[] = {
.name = TYPE_IOTKIT, .name = TYPE_IOTKIT,
.sram_banks = 1, .sram_banks = 1,
.num_cpus = 1, .num_cpus = 1,
.sys_version = 0x41743,
.sys_config_format = IoTKitFormat,
}, },
}; };
static uint32_t armsse_sys_config_value(ARMSSE *s, const ARMSSEInfo *info)
{
/* Return the SYS_CONFIG value for this SSE */
uint32_t sys_config;
switch (info->sys_config_format) {
case IoTKitFormat:
sys_config = 0;
sys_config = deposit32(sys_config, 0, 4, info->sram_banks);
sys_config = deposit32(sys_config, 4, 4, s->sram_addr_width - 12);
break;
case SSE200Format:
sys_config = 0;
sys_config = deposit32(sys_config, 0, 4, info->sram_banks);
sys_config = deposit32(sys_config, 4, 5, s->sram_addr_width);
sys_config = deposit32(sys_config, 24, 4, 2);
if (info->num_cpus > 1) {
sys_config = deposit32(sys_config, 10, 1, 1);
sys_config = deposit32(sys_config, 20, 4, info->sram_banks - 1);
sys_config = deposit32(sys_config, 28, 4, 2);
}
break;
default:
g_assert_not_reached();
}
return sys_config;
}
/* Clock frequency in HZ of the 32KHz "slow clock" */ /* Clock frequency in HZ of the 32KHz "slow clock" */
#define S32KCLK (32 * 1000) #define S32KCLK (32 * 1000)
@ -726,6 +764,19 @@ static void armsse_realize(DeviceState *dev, Error **errp)
qdev_get_gpio_in_named(dev_apb_ppc1, qdev_get_gpio_in_named(dev_apb_ppc1,
"cfg_sec_resp", 0)); "cfg_sec_resp", 0));
object_property_set_int(OBJECT(&s->sysinfo), info->sys_version,
"SYS_VERSION", &err);
if (err) {
error_propagate(errp, err);
return;
}
object_property_set_int(OBJECT(&s->sysinfo),
armsse_sys_config_value(s, info),
"SYS_CONFIG", &err);
if (err) {
error_propagate(errp, err);
return;
}
object_property_set_bool(OBJECT(&s->sysinfo), true, "realized", &err); object_property_set_bool(OBJECT(&s->sysinfo), true, "realized", &err);
if (err) { if (err) {
error_propagate(errp, err); error_propagate(errp, err);

View File

@ -51,15 +51,16 @@ static const int sysinfo_id[] = {
static uint64_t iotkit_sysinfo_read(void *opaque, hwaddr offset, static uint64_t iotkit_sysinfo_read(void *opaque, hwaddr offset,
unsigned size) unsigned size)
{ {
IoTKitSysInfo *s = IOTKIT_SYSINFO(opaque);
uint64_t r; uint64_t r;
switch (offset) { switch (offset) {
case A_SYS_VERSION: case A_SYS_VERSION:
r = 0x41743; r = s->sys_version;
break; break;
case A_SYS_CONFIG: case A_SYS_CONFIG:
r = 0x31; r = s->sys_config;
break; break;
case A_PID4 ... A_CID3: case A_PID4 ... A_CID3:
r = sysinfo_id[(offset - A_PID4) / 4]; r = sysinfo_id[(offset - A_PID4) / 4];
@ -94,6 +95,12 @@ static const MemoryRegionOps iotkit_sysinfo_ops = {
.valid.max_access_size = 4, .valid.max_access_size = 4,
}; };
static Property iotkit_sysinfo_props[] = {
DEFINE_PROP_UINT32("SYS_VERSION", IoTKitSysInfo, sys_version, 0),
DEFINE_PROP_UINT32("SYS_CONFIG", IoTKitSysInfo, sys_config, 0),
DEFINE_PROP_END_OF_LIST()
};
static void iotkit_sysinfo_init(Object *obj) static void iotkit_sysinfo_init(Object *obj)
{ {
SysBusDevice *sbd = SYS_BUS_DEVICE(obj); SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
@ -106,10 +113,14 @@ static void iotkit_sysinfo_init(Object *obj)
static void iotkit_sysinfo_class_init(ObjectClass *klass, void *data) static void iotkit_sysinfo_class_init(ObjectClass *klass, void *data)
{ {
DeviceClass *dc = DEVICE_CLASS(klass);
/* /*
* This device has no guest-modifiable state and so it * This device has no guest-modifiable state and so it
* does not need a reset function or VMState. * does not need a reset function or VMState.
*/ */
dc->props = iotkit_sysinfo_props;
} }
static const TypeInfo iotkit_sysinfo_info = { static const TypeInfo iotkit_sysinfo_info = {

View File

@ -14,6 +14,8 @@
* Arm IoTKit and documented in * Arm IoTKit and documented in
* http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ecm0601256/index.html * http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ecm0601256/index.html
* QEMU interface: * QEMU interface:
* + QOM property "SYS_VERSION": value to use for SYS_VERSION register
* + QOM property "SYS_CONFIG": value to use for SYS_CONFIG register
* + sysbus MMIO region 0: the system information register bank * + sysbus MMIO region 0: the system information register bank
*/ */
@ -32,6 +34,10 @@ typedef struct IoTKitSysInfo {
/*< public >*/ /*< public >*/
MemoryRegion iomem; MemoryRegion iomem;
/* Properties */
uint32_t sys_version;
uint32_t sys_config;
} IoTKitSysInfo; } IoTKitSysInfo;
#endif #endif