xref: /spdk/lib/ftl/utils/ftl_bitmap.h (revision a6dbe3721eb3b5990707fc3e378c95e505dd8ab5)
1f1b079b4SArtur Paszkiewicz /*   SPDX-License-Identifier: BSD-3-Clause
2*a6dbe372Spaul luse  *   Copyright (C) 2022 Intel Corporation.
3f1b079b4SArtur Paszkiewicz  *   All rights reserved.
4f1b079b4SArtur Paszkiewicz  */
5f1b079b4SArtur Paszkiewicz 
6f1b079b4SArtur Paszkiewicz #ifndef FTL_BITMAP_H_
7f1b079b4SArtur Paszkiewicz #define FTL_BITMAP_H_
8f1b079b4SArtur Paszkiewicz 
9f1b079b4SArtur Paszkiewicz #include "spdk/stdinc.h"
10f1b079b4SArtur Paszkiewicz 
11f1b079b4SArtur Paszkiewicz struct ftl_bitmap;
12f1b079b4SArtur Paszkiewicz 
13f1b079b4SArtur Paszkiewicz /**
14f1b079b4SArtur Paszkiewicz  * @brief The required alignment for buffer used for bitmap
15f1b079b4SArtur Paszkiewicz  */
16f1b079b4SArtur Paszkiewicz extern const size_t ftl_bitmap_buffer_alignment;
17f1b079b4SArtur Paszkiewicz 
18f1b079b4SArtur Paszkiewicz /**
19f1b079b4SArtur Paszkiewicz  * @brief Converts number of bits to bitmap size need to create it
20f1b079b4SArtur Paszkiewicz  *
21f1b079b4SArtur Paszkiewicz  * @param bits Number of bits
22f1b079b4SArtur Paszkiewicz  *
23f1b079b4SArtur Paszkiewicz  * @return Size needed to create bitmap which will hold space for specified number of bits
24f1b079b4SArtur Paszkiewicz  */
25f1b079b4SArtur Paszkiewicz uint64_t ftl_bitmap_bits_to_size(uint64_t bits);
26f1b079b4SArtur Paszkiewicz 
27f1b079b4SArtur Paszkiewicz /**
28f1b079b4SArtur Paszkiewicz  * @brief Converts number of bits to blocks
29f1b079b4SArtur Paszkiewicz  *
30f1b079b4SArtur Paszkiewicz  * @param bits Number of bits
31f1b079b4SArtur Paszkiewicz  *
32f1b079b4SArtur Paszkiewicz  * @return Number of blocks needed to create bitmap which will hold space for specified number of bits
33f1b079b4SArtur Paszkiewicz  */
34f1b079b4SArtur Paszkiewicz uint64_t ftl_bitmap_bits_to_blocks(uint64_t bits);
35f1b079b4SArtur Paszkiewicz 
36f1b079b4SArtur Paszkiewicz /**
37f1b079b4SArtur Paszkiewicz  * @brief Creates a bitmap object using a preallocated buffer
38f1b079b4SArtur Paszkiewicz  *
39f1b079b4SArtur Paszkiewicz  * @param buf The buffer
40f1b079b4SArtur Paszkiewicz  * @param size Size of the buffer
41f1b079b4SArtur Paszkiewicz  *
42f1b079b4SArtur Paszkiewicz  * @return On success - pointer to the allocated bitmap object, otherwise NULL
43f1b079b4SArtur Paszkiewicz  */
44f1b079b4SArtur Paszkiewicz struct ftl_bitmap *ftl_bitmap_create(void *buf, size_t size);
45f1b079b4SArtur Paszkiewicz 
46f1b079b4SArtur Paszkiewicz /**
47f1b079b4SArtur Paszkiewicz  * @brief Destroys the bitmap object
48f1b079b4SArtur Paszkiewicz  *
49f1b079b4SArtur Paszkiewicz  * @param bitmap The bitmap
50f1b079b4SArtur Paszkiewicz  */
51f1b079b4SArtur Paszkiewicz void ftl_bitmap_destroy(struct ftl_bitmap *bitmap);
52f1b079b4SArtur Paszkiewicz 
53f1b079b4SArtur Paszkiewicz /**
54f1b079b4SArtur Paszkiewicz  * @brief Gets the value of the specified bit
55f1b079b4SArtur Paszkiewicz  *
56f1b079b4SArtur Paszkiewicz  * @param bitmap The bitmap
57f1b079b4SArtur Paszkiewicz  * @param bit Index of the bit
58f1b079b4SArtur Paszkiewicz  *
59f1b079b4SArtur Paszkiewicz  * @return True if bit is set, otherwise false
60f1b079b4SArtur Paszkiewicz  */
61f1b079b4SArtur Paszkiewicz bool ftl_bitmap_get(const struct ftl_bitmap *bitmap, uint64_t bit);
62f1b079b4SArtur Paszkiewicz 
63f1b079b4SArtur Paszkiewicz /**
64f1b079b4SArtur Paszkiewicz  * @brief Sets the specified bit
65f1b079b4SArtur Paszkiewicz  *
66f1b079b4SArtur Paszkiewicz  * @param bitmap The bitmap
67f1b079b4SArtur Paszkiewicz  * @param bit Index of the bit
68f1b079b4SArtur Paszkiewicz  */
69f1b079b4SArtur Paszkiewicz void ftl_bitmap_set(struct ftl_bitmap *bitmap, uint64_t bit);
70f1b079b4SArtur Paszkiewicz 
71f1b079b4SArtur Paszkiewicz /**
72f1b079b4SArtur Paszkiewicz  * @brief Clears the specified bit
73f1b079b4SArtur Paszkiewicz  *
74f1b079b4SArtur Paszkiewicz  * @param bitmap The bitmap
75f1b079b4SArtur Paszkiewicz  * @param bit Index of the bit
76f1b079b4SArtur Paszkiewicz  */
77f1b079b4SArtur Paszkiewicz void ftl_bitmap_clear(struct ftl_bitmap *bitmap, uint64_t bit);
78f1b079b4SArtur Paszkiewicz 
79f1b079b4SArtur Paszkiewicz /**
80f1b079b4SArtur Paszkiewicz  * @brief Finds the first set bit
81f1b079b4SArtur Paszkiewicz  *
82f1b079b4SArtur Paszkiewicz  * @param bitmap The bitmap
83f1b079b4SArtur Paszkiewicz  * @param start_bit Index of the bit from which to begin searching
84f1b079b4SArtur Paszkiewicz  * @param end_bit Index of the bit up to which to search
85f1b079b4SArtur Paszkiewicz  *
86f1b079b4SArtur Paszkiewicz  * @return Index of the first set bit or UINT64_MAX if none found
87f1b079b4SArtur Paszkiewicz  */
88f1b079b4SArtur Paszkiewicz uint64_t ftl_bitmap_find_first_set(struct ftl_bitmap *bitmap, uint64_t start_bit, uint64_t end_bit);
89f1b079b4SArtur Paszkiewicz 
90f1b079b4SArtur Paszkiewicz /**
91f1b079b4SArtur Paszkiewicz  * @brief Finds the first clear bit
92f1b079b4SArtur Paszkiewicz  *
93f1b079b4SArtur Paszkiewicz  * @param bitmap The bitmap
94f1b079b4SArtur Paszkiewicz  * @param start_bit Index of the bit from which to begin searching
95f1b079b4SArtur Paszkiewicz  * @param end_bit Index of the bit up to which to search
96f1b079b4SArtur Paszkiewicz  *
97f1b079b4SArtur Paszkiewicz  * @return Index of the first clear bit or UINT64_MAX if none found
98f1b079b4SArtur Paszkiewicz  */
99f1b079b4SArtur Paszkiewicz uint64_t ftl_bitmap_find_first_clear(struct ftl_bitmap *bitmap, uint64_t start_bit,
100f1b079b4SArtur Paszkiewicz 				     uint64_t end_bit);
101f1b079b4SArtur Paszkiewicz 
102f1b079b4SArtur Paszkiewicz /**
103f1b079b4SArtur Paszkiewicz  * @brief Iterates over and counts set bits
104f1b079b4SArtur Paszkiewicz  *
105f1b079b4SArtur Paszkiewicz  * @param bitmap The bitmap
106f1b079b4SArtur Paszkiewicz  *
107f1b079b4SArtur Paszkiewicz  * @return Count of sets bits
108f1b079b4SArtur Paszkiewicz  */
109f1b079b4SArtur Paszkiewicz uint64_t ftl_bitmap_count_set(struct ftl_bitmap *bitmap);
110f1b079b4SArtur Paszkiewicz 
111f1b079b4SArtur Paszkiewicz #endif /* FTL_BITMAP_H_ */
112