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 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 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 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 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 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 67*4c046ce3SPeter Maydell static void resettable_container_finalize(Object *obj) 68*4c046ce3SPeter Maydell { 69*4c046ce3SPeter Maydell } 70*4c046ce3SPeter Maydell 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