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