hw/core/register: add the REGISTER_ARRAY type

Introduce the REGISTER_ARRAY QOM type. This type reuses the existing
RegisterInfoArray struct. When `register_init_block' is called, it creates
a REGISTER_ARRAY object and parents it to the calling device. This way
it gets finalized when the device is. The memory region is parented to
the REGISTER_ARRAY object to ensure correct finalizing order.

The finalize function of the REGISTER_ARRAY type performs the necessary
cleaning that used to be done by `register_finalize_block'. The latter
is left empty and will be removed when all the register API users have
been refactored.

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Francisco Iglesias <francisco.iglesias@amd.com>
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
Signed-off-by: Luc Michel <luc.michel@amd.com>
Message-ID: <20251017161809.235740-3-luc.michel@amd.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
This commit is contained in:
Luc Michel
2025-10-17 18:18:01 +02:00
committed by Philippe Mathieu-Daudé
parent f66752961a
commit 5c6367bc1c
2 changed files with 26 additions and 4 deletions

View File

@@ -245,10 +245,16 @@ static RegisterInfoArray *register_init_block(DeviceState *owner,
size_t data_size_bits)
{
const char *device_prefix = object_get_typename(OBJECT(owner));
RegisterInfoArray *r_array = g_new0(RegisterInfoArray, 1);
Object *obj;
RegisterInfoArray *r_array;
int data_size = data_size_bits >> 3;
int i;
obj = object_new(TYPE_REGISTER_ARRAY);
object_property_add_child(OBJECT(owner), "reg-array[*]", obj);
object_unref(obj);
r_array = REGISTER_ARRAY(obj);
r_array->r = g_new0(RegisterInfo *, num);
r_array->num_elements = num;
r_array->debug = debug_enabled;
@@ -267,7 +273,7 @@ static RegisterInfoArray *register_init_block(DeviceState *owner,
r_array->r[i] = r;
}
memory_region_init_io(&r_array->mem, OBJECT(owner), ops, r_array,
memory_region_init_io(&r_array->mem, OBJECT(r_array), ops, r_array,
device_prefix, memory_size);
return r_array;
@@ -309,15 +315,27 @@ RegisterInfoArray *register_init_block64(DeviceState *owner,
data, ops, debug_enabled, memory_size, 64);
}
void register_finalize_block(RegisterInfoArray *r_array)
static void register_array_finalize(Object *obj)
{
RegisterInfoArray *r_array = REGISTER_ARRAY(obj);
g_free(r_array->r);
g_free(r_array);
}
void register_finalize_block(RegisterInfoArray *r_array)
{
}
static const TypeInfo register_array_info = {
.name = TYPE_REGISTER_ARRAY,
.parent = TYPE_OBJECT,
.instance_size = sizeof(RegisterInfoArray),
.instance_finalize = register_array_finalize,
};
static void register_register_types(void)
{
type_register_static(&register_array_info);
}
type_init(register_register_types)

View File

@@ -83,6 +83,8 @@ struct RegisterInfo {
void *opaque;
};
#define TYPE_REGISTER_ARRAY "qemu-register-array"
OBJECT_DECLARE_SIMPLE_TYPE(RegisterInfoArray, REGISTER_ARRAY)
/**
* This structure is used to group all of the individual registers which are
@@ -96,6 +98,8 @@ struct RegisterInfo {
*/
struct RegisterInfoArray {
Object parent_obj;
MemoryRegion mem;
int num_elements;