mirror of
https://github.com/qemu/qemu.git
synced 2026-07-08 17:46:10 +00:00
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:
committed by
Philippe Mathieu-Daudé
parent
f66752961a
commit
5c6367bc1c
@@ -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(®ister_array_info);
|
||||
}
|
||||
|
||||
type_init(register_register_types)
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user