xref: /openbmc/qemu/hw/core/resetcontainer.c (revision 4c046ce3)
1*4c046ce3SPeter Maydell /*
2*4c046ce3SPeter Maydell  * Reset container
3*4c046ce3SPeter Maydell  *
4*4c046ce3SPeter Maydell  * Copyright (c) 2024 Linaro, Ltd
5*4c046ce3SPeter Maydell  *
6*4c046ce3SPeter Maydell  * This work is licensed under the terms of the GNU GPL, version 2 or later.
7*4c046ce3SPeter Maydell  * See the COPYING file in the top-level directory.
8*4c046ce3SPeter Maydell  */
9*4c046ce3SPeter Maydell 
10*4c046ce3SPeter Maydell /*
11*4c046ce3SPeter Maydell  * The "reset container" is an object which implements the Resettable
12*4c046ce3SPeter Maydell  * interface. It contains a list of arbitrary other objects which also
13*4c046ce3SPeter Maydell  * implement Resettable. Resetting the reset container resets all the
14*4c046ce3SPeter Maydell  * objects in it.
15*4c046ce3SPeter Maydell  */
16*4c046ce3SPeter Maydell 
17*4c046ce3SPeter Maydell #include "qemu/osdep.h"
18*4c046ce3SPeter Maydell #include "hw/resettable.h"
19*4c046ce3SPeter Maydell #include "hw/core/resetcontainer.h"
20*4c046ce3SPeter Maydell 
21*4c046ce3SPeter Maydell struct ResettableContainer {
22*4c046ce3SPeter Maydell     Object parent;
23*4c046ce3SPeter Maydell     ResettableState reset_state;
24*4c046ce3SPeter Maydell     GPtrArray *children;
25*4c046ce3SPeter Maydell };
26*4c046ce3SPeter Maydell 
27*4c046ce3SPeter Maydell OBJECT_DEFINE_SIMPLE_TYPE_WITH_INTERFACES(ResettableContainer, resettable_container, RESETTABLE_CONTAINER, OBJECT, { TYPE_RESETTABLE_INTERFACE }, { })
28*4c046ce3SPeter Maydell 
resettable_container_add(ResettableContainer * rc,Object * obj)29*4c046ce3SPeter Maydell void resettable_container_add(ResettableContainer *rc, Object *obj)
30*4c046ce3SPeter Maydell {
31*4c046ce3SPeter Maydell     INTERFACE_CHECK(void, obj, TYPE_RESETTABLE_INTERFACE);
32*4c046ce3SPeter Maydell     g_ptr_array_add(rc->children, obj);
33*4c046ce3SPeter Maydell }
34*4c046ce3SPeter Maydell 
resettable_container_remove(ResettableContainer * rc,Object * obj)35*4c046ce3SPeter Maydell void resettable_container_remove(ResettableContainer *rc, Object *obj)
36*4c046ce3SPeter Maydell {
37*4c046ce3SPeter Maydell     g_ptr_array_remove(rc->children, obj);
38*4c046ce3SPeter Maydell }
39*4c046ce3SPeter Maydell 
resettable_container_get_state(Object * obj)40*4c046ce3SPeter Maydell static ResettableState *resettable_container_get_state(Object *obj)
41*4c046ce3SPeter Maydell {
42*4c046ce3SPeter Maydell     ResettableContainer *rc = RESETTABLE_CONTAINER(obj);
43*4c046ce3SPeter Maydell     return &rc->reset_state;
44*4c046ce3SPeter Maydell }
45*4c046ce3SPeter Maydell 
resettable_container_child_foreach(Object * obj,ResettableChildCallback cb,void * opaque,ResetType type)46*4c046ce3SPeter Maydell static void resettable_container_child_foreach(Object *obj,
47*4c046ce3SPeter Maydell                                                ResettableChildCallback cb,
48*4c046ce3SPeter Maydell                                                void *opaque, ResetType type)
49*4c046ce3SPeter Maydell {
50*4c046ce3SPeter Maydell     ResettableContainer *rc = RESETTABLE_CONTAINER(obj);
51*4c046ce3SPeter Maydell     unsigned int len = rc->children->len;
52*4c046ce3SPeter Maydell 
53*4c046ce3SPeter Maydell     for (unsigned int i = 0; i < len; i++) {
54*4c046ce3SPeter Maydell         cb(g_ptr_array_index(rc->children, i), opaque, type);
55*4c046ce3SPeter Maydell         /* Detect callbacks trying to unregister themselves */
56*4c046ce3SPeter Maydell         assert(len == rc->children->len);
57*4c046ce3SPeter Maydell     }
58*4c046ce3SPeter Maydell }
59*4c046ce3SPeter Maydell 
resettable_container_init(Object * obj)60*4c046ce3SPeter Maydell static void resettable_container_init(Object *obj)
61*4c046ce3SPeter Maydell {
62*4c046ce3SPeter Maydell     ResettableContainer *rc = RESETTABLE_CONTAINER(obj);
63*4c046ce3SPeter Maydell 
64*4c046ce3SPeter Maydell     rc->children = g_ptr_array_new();
65*4c046ce3SPeter Maydell }
66*4c046ce3SPeter Maydell 
resettable_container_finalize(Object * obj)67*4c046ce3SPeter Maydell static void resettable_container_finalize(Object *obj)
68*4c046ce3SPeter Maydell {
69*4c046ce3SPeter Maydell }
70*4c046ce3SPeter Maydell 
resettable_container_class_init(ObjectClass * klass,void * data)71*4c046ce3SPeter Maydell static void resettable_container_class_init(ObjectClass *klass, void *data)
72*4c046ce3SPeter Maydell {
73*4c046ce3SPeter Maydell     ResettableClass *rc = RESETTABLE_CLASS(klass);
74*4c046ce3SPeter Maydell 
75*4c046ce3SPeter Maydell     rc->get_state = resettable_container_get_state;
76*4c046ce3SPeter Maydell     rc->child_foreach = resettable_container_child_foreach;
77*4c046ce3SPeter Maydell }
78