| /* |
| * Copyright(c) 2015-2017 Intel Corporation. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify it |
| * under the terms of version 2 of the GNU General Public License as |
| * published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, but |
| * WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * General Public License for more details. |
| */ |
| #ifndef _NDCTL_BITMAP_H_ |
| #define _NDCTL_BITMAP_H_ |
| |
| #include <util/size.h> |
| #include <ccan/short_types/short_types.h> |
| |
| #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) |
| |
| #define BIT(nr) (1UL << (nr)) |
| #define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) |
| #define BIT_WORD(nr) ((nr) / BITS_PER_LONG) |
| #define BITS_PER_BYTE 8 |
| #define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) |
| |
| #define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) & (BITS_PER_LONG - 1))) |
| #define BITMAP_LAST_WORD_MASK(nbits) (~0UL >> (-(nbits) & (BITS_PER_LONG - 1))) |
| |
| #define small_const_nbits(nbits) \ |
| (__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG) |
| |
| unsigned long *bitmap_alloc(unsigned long nbits); |
| void bitmap_set(unsigned long *map, unsigned int start, int len); |
| void bitmap_clear(unsigned long *map, unsigned int start, int len); |
| int test_bit(unsigned int nr, const volatile unsigned long *addr); |
| unsigned long find_next_bit(const unsigned long *addr, unsigned long size, |
| unsigned long offset); |
| unsigned long find_next_zero_bit(const unsigned long *addr, unsigned long size, |
| unsigned long offset); |
| int bitmap_full(const unsigned long *src, unsigned int nbits); |
| |
| |
| #endif /* _NDCTL_BITMAP_H_ */ |