14c046ce3SPeter Maydell /*
24c046ce3SPeter Maydell * Reset container
34c046ce3SPeter Maydell *
44c046ce3SPeter Maydell * Copyright (c) 2024 Linaro, Ltd
54c046ce3SPeter Maydell *
64c046ce3SPeter Maydell * This work is licensed under the terms of the GNU GPL, version 2 or later.
74c046ce3SPeter Maydell * See the COPYING file in the top-level directory.
84c046ce3SPeter Maydell */
94c046ce3SPeter Maydell
104c046ce3SPeter Maydell /*
114c046ce3SPeter Maydell * The "reset container" is an object which implements the Resettable
124c046ce3SPeter Maydell * interface. It contains a list of arbitrary other objects which also
134c046ce3SPeter Maydell * implement Resettable. Resetting the reset container resets all the
144c046ce3SPeter Maydell * objects in it.
154c046ce3SPeter Maydell */
164c046ce3SPeter Maydell
174c046ce3SPeter Maydell #include "qemu/osdep.h"
184c046ce3SPeter Maydell #include "hw/resettable.h"
194c046ce3SPeter Maydell #include "hw/core/resetcontainer.h"
204c046ce3SPeter Maydell
214c046ce3SPeter Maydell struct ResettableContainer {
224c046ce3SPeter Maydell Object parent;
234c046ce3SPeter Maydell ResettableState reset_state;
244c046ce3SPeter Maydell GPtrArray *children;
254c046ce3SPeter Maydell };
264c046ce3SPeter Maydell
274c046ce3SPeter Maydell OBJECT_DEFINE_SIMPLE_TYPE_WITH_INTERFACES(ResettableContainer, resettable_container, RESETTABLE_CONTAINER, OBJECT, { TYPE_RESETTABLE_INTERFACE }, { })
284c046ce3SPeter Maydell
resettable_container_add(ResettableContainer * rc,Object * obj)294c046ce3SPeter Maydell void resettable_container_add(ResettableContainer *rc, Object *obj)
304c046ce3SPeter Maydell {
314c046ce3SPeter Maydell INTERFACE_CHECK(void, obj, TYPE_RESETTABLE_INTERFACE);
324c046ce3SPeter Maydell g_ptr_array_add(rc->children, obj);
334c046ce3SPeter Maydell }
344c046ce3SPeter Maydell
resettable_container_remove(ResettableContainer * rc,Object * obj)354c046ce3SPeter Maydell void resettable_container_remove(ResettableContainer *rc, Object *obj)
364c046ce3SPeter Maydell {
374c046ce3SPeter Maydell g_ptr_array_remove(rc->children, obj);
384c046ce3SPeter Maydell }
394c046ce3SPeter Maydell
resettable_container_get_state(Object * obj)404c046ce3SPeter Maydell static ResettableState *resettable_container_get_state(Object *obj)
414c046ce3SPeter Maydell {
424c046ce3SPeter Maydell ResettableContainer *rc = RESETTABLE_CONTAINER(obj);
434c046ce3SPeter Maydell return &rc->reset_state;
444c046ce3SPeter Maydell }
454c046ce3SPeter Maydell
resettable_container_child_foreach(Object * obj,ResettableChildCallback cb,void * opaque,ResetType type)464c046ce3SPeter Maydell static void resettable_container_child_foreach(Object *obj,
474c046ce3SPeter Maydell ResettableChildCallback cb,
484c046ce3SPeter Maydell void *opaque, ResetType type)
494c046ce3SPeter Maydell {
504c046ce3SPeter Maydell ResettableContainer *rc = RESETTABLE_CONTAINER(obj);
514c046ce3SPeter Maydell unsigned int len = rc->children->len;
524c046ce3SPeter Maydell
534c046ce3SPeter Maydell for (unsigned int i = 0; i < len; i++) {
544c046ce3SPeter Maydell cb(g_ptr_array_index(rc->children, i), opaque, type);
554c046ce3SPeter Maydell /* Detect callbacks trying to unregister themselves */
564c046ce3SPeter Maydell assert(len == rc->children->len);
574c046ce3SPeter Maydell }
584c046ce3SPeter Maydell }
594c046ce3SPeter Maydell
resettable_container_init(Object * obj)604c046ce3SPeter Maydell static void resettable_container_init(Object *obj)
614c046ce3SPeter Maydell {
624c046ce3SPeter Maydell ResettableContainer *rc = RESETTABLE_CONTAINER(obj);
634c046ce3SPeter Maydell
644c046ce3SPeter Maydell rc->children = g_ptr_array_new();
654c046ce3SPeter Maydell }
664c046ce3SPeter Maydell
resettable_container_finalize(Object * obj)674c046ce3SPeter Maydell static void resettable_container_finalize(Object *obj)
684c046ce3SPeter Maydell {
694c046ce3SPeter Maydell }
704c046ce3SPeter Maydell
resettable_container_class_init(ObjectClass * klass,const void * data)71*12d1a768SPhilippe Mathieu-Daudé static void resettable_container_class_init(ObjectClass *klass,
72*12d1a768SPhilippe Mathieu-Daudé const void *data)
734c046ce3SPeter Maydell {
744c046ce3SPeter Maydell ResettableClass *rc = RESETTABLE_CLASS(klass);
754c046ce3SPeter Maydell
764c046ce3SPeter Maydell rc->get_state = resettable_container_get_state;
774c046ce3SPeter Maydell rc->child_foreach = resettable_container_child_foreach;
784c046ce3SPeter Maydell }
79