diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2020-05-06 15:38:02 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2020-05-06 15:38:02 +0100 |
commit | 570a9214827e3d42f7173c4d4c9f045b99834cf0 (patch) | |
tree | 8f88cdd57b9c0d59f80fa1c069c5d1a11400253f | |
parent | a36d64f43325fa503075cc9408ddabb69b32f829 (diff) | |
parent | f08085f49fb66a5cdc86653bd896d0e728bcee50 (diff) |
Merge remote-tracking branch 'remotes/alistair/tags/pull-reg-to-apply-20200505' into staging
Pull request for RegisterAPI
This is a single patch to add support to the RegisterAPI for different
data sizes.
# gpg: Signature made Wed 06 May 2020 00:08:15 BST
# gpg: using RSA key F6C4AC46D4934868D3B8CE8F21E10D29DF977054
# gpg: Good signature from "Alistair Francis <alistair@alistair23.me>" [full]
# Primary key fingerprint: F6C4 AC46 D493 4868 D3B8 CE8F 21E1 0D29 DF97 7054
* remotes/alistair/tags/pull-reg-to-apply-20200505:
hw/core/register: Add register_init_block8 helper.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r-- | hw/core/register.c | 46 | ||||
-rw-r--r-- | include/hw/register.h | 8 |
2 files changed, 44 insertions, 10 deletions
diff --git a/hw/core/register.c b/hw/core/register.c index 3c77396587..ddf91eb445 100644 --- a/hw/core/register.c +++ b/hw/core/register.c @@ -246,16 +246,18 @@ uint64_t register_read_memory(void *opaque, hwaddr addr, return extract64(read_val, 0, size * 8); } -RegisterInfoArray *register_init_block32(DeviceState *owner, - const RegisterAccessInfo *rae, - int num, RegisterInfo *ri, - uint32_t *data, - const MemoryRegionOps *ops, - bool debug_enabled, - uint64_t memory_size) +static RegisterInfoArray *register_init_block(DeviceState *owner, + const RegisterAccessInfo *rae, + int num, RegisterInfo *ri, + void *data, + const MemoryRegionOps *ops, + bool debug_enabled, + uint64_t memory_size, + size_t data_size_bits) { const char *device_prefix = object_get_typename(OBJECT(owner)); RegisterInfoArray *r_array = g_new0(RegisterInfoArray, 1); + int data_size = data_size_bits >> 3; int i; r_array->r = g_new0(RegisterInfo *, num); @@ -264,12 +266,12 @@ RegisterInfoArray *register_init_block32(DeviceState *owner, r_array->prefix = device_prefix; for (i = 0; i < num; i++) { - int index = rae[i].addr / 4; + int index = rae[i].addr / data_size; RegisterInfo *r = &ri[index]; *r = (RegisterInfo) { - .data = &data[index], - .data_size = sizeof(uint32_t), + .data = data + data_size * index, + .data_size = data_size, .access = &rae[i], .opaque = owner, }; @@ -284,6 +286,30 @@ RegisterInfoArray *register_init_block32(DeviceState *owner, return r_array; } +RegisterInfoArray *register_init_block8(DeviceState *owner, + const RegisterAccessInfo *rae, + int num, RegisterInfo *ri, + uint8_t *data, + const MemoryRegionOps *ops, + bool debug_enabled, + uint64_t memory_size) +{ + return register_init_block(owner, rae, num, ri, (void *) + data, ops, debug_enabled, memory_size, 8); +} + +RegisterInfoArray *register_init_block32(DeviceState *owner, + const RegisterAccessInfo *rae, + int num, RegisterInfo *ri, + uint32_t *data, + const MemoryRegionOps *ops, + bool debug_enabled, + uint64_t memory_size) +{ + return register_init_block(owner, rae, num, ri, (void *) + data, ops, debug_enabled, memory_size, 32); +} + void register_finalize_block(RegisterInfoArray *r_array) { object_unparent(OBJECT(&r_array->mem)); diff --git a/include/hw/register.h b/include/hw/register.h index 5796584588..5d2c565ae0 100644 --- a/include/hw/register.h +++ b/include/hw/register.h @@ -185,6 +185,14 @@ uint64_t register_read_memory(void *opaque, hwaddr addr, unsigned size); * memory region (r_array->mem) the caller should add to a container. */ +RegisterInfoArray *register_init_block8(DeviceState *owner, + const RegisterAccessInfo *rae, + int num, RegisterInfo *ri, + uint8_t *data, + const MemoryRegionOps *ops, + bool debug_enabled, + uint64_t memory_size); + RegisterInfoArray *register_init_block32(DeviceState *owner, const RegisterAccessInfo *rae, int num, RegisterInfo *ri, |