Skip to content

Commit

Permalink
Merge remote-tracking branch 'remotes/alistair/tags/pull-reg-to-apply…
Browse files Browse the repository at this point in the history
…-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>
  • Loading branch information
pm215 committed May 6, 2020
2 parents a36d64f + f08085f commit 570a921
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 10 deletions.
46 changes: 36 additions & 10 deletions hw/core/register.c
Expand Up @@ -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);
Expand All @@ -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,
};
Expand All @@ -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));
Expand Down
8 changes: 8 additions & 0 deletions include/hw/register.h
Expand Up @@ -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,
Expand Down

0 comments on commit 570a921

Please sign in to comment.