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:
parent
7cd3a2e0d5
commit
dde0c49103
@ -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);
|
||||||
|
@ -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 = {
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user