1*7f9241d8SStefan Hajnoczi /*
2*7f9241d8SStefan Hajnoczi  * BlockBackend RAM Registrar
3*7f9241d8SStefan Hajnoczi  *
4*7f9241d8SStefan Hajnoczi  * SPDX-License-Identifier: GPL-2.0-or-later
5*7f9241d8SStefan Hajnoczi  */
6*7f9241d8SStefan Hajnoczi 
7*7f9241d8SStefan Hajnoczi #ifndef BLOCK_RAM_REGISTRAR_H
8*7f9241d8SStefan Hajnoczi #define BLOCK_RAM_REGISTRAR_H
9*7f9241d8SStefan Hajnoczi 
10*7f9241d8SStefan Hajnoczi #include "exec/ramlist.h"
11*7f9241d8SStefan Hajnoczi 
12*7f9241d8SStefan Hajnoczi /**
13*7f9241d8SStefan Hajnoczi  * struct BlockRAMRegistrar:
14*7f9241d8SStefan Hajnoczi  *
15*7f9241d8SStefan Hajnoczi  * Keeps RAMBlock memory registered with a BlockBackend using
16*7f9241d8SStefan Hajnoczi  * blk_register_buf() including hotplugged memory.
17*7f9241d8SStefan Hajnoczi  *
18*7f9241d8SStefan Hajnoczi  * Emulated devices or other BlockBackend users initialize a BlockRAMRegistrar
19*7f9241d8SStefan Hajnoczi  * with blk_ram_registrar_init() before submitting I/O requests with the
20*7f9241d8SStefan Hajnoczi  * BDRV_REQ_REGISTERED_BUF flag set.
21*7f9241d8SStefan Hajnoczi  */
22*7f9241d8SStefan Hajnoczi typedef struct {
23*7f9241d8SStefan Hajnoczi     BlockBackend *blk;
24*7f9241d8SStefan Hajnoczi     RAMBlockNotifier notifier;
25*7f9241d8SStefan Hajnoczi     bool ok;
26*7f9241d8SStefan Hajnoczi } BlockRAMRegistrar;
27*7f9241d8SStefan Hajnoczi 
28*7f9241d8SStefan Hajnoczi void blk_ram_registrar_init(BlockRAMRegistrar *r, BlockBackend *blk);
29*7f9241d8SStefan Hajnoczi void blk_ram_registrar_destroy(BlockRAMRegistrar *r);
30*7f9241d8SStefan Hajnoczi 
31*7f9241d8SStefan Hajnoczi /* Have all RAMBlocks been registered successfully? */
blk_ram_registrar_ok(BlockRAMRegistrar * r)32*7f9241d8SStefan Hajnoczi static inline bool blk_ram_registrar_ok(BlockRAMRegistrar *r)
33*7f9241d8SStefan Hajnoczi {
34*7f9241d8SStefan Hajnoczi     return r->ok;
35*7f9241d8SStefan Hajnoczi }
36*7f9241d8SStefan Hajnoczi 
37*7f9241d8SStefan Hajnoczi #endif /* BLOCK_RAM_REGISTRAR_H */
38