Files
skiboot/include/bitmap.h
Stewart Smith 49496485fe Re-license IBM written files as Apache 2.0 OR GPLv2+
SPDX makes it a simpler diff.

I have audited the commit history of each file to ensure that they are
exclusively authored by IBM and thus we have the right to relicense.

The motivation behind this is twofold:
1) We want to enable experiments with coreboot, which is GPLv2 licensed
2) An upcoming firmware component wants to incorporate code from skiboot
   and code from the Linux kernel, which is GPLv2 licensed.

I have gone through the IBM internal way of gaining approval for this.

The following files are not exclusively authored by IBM, so are *not*
included in this update (I will be seeking approval from contributors):

core/direct-controls.c
core/flash.c
core/pcie-slot.c
external/common/arch_flash_unknown.c
external/common/rules.mk
external/gard/Makefile
external/gard/rules.mk
external/opal-prd/Makefile
external/pflash/Makefile
external/xscom-utils/Makefile
hdata/vpd.c
hw/dts.c
hw/ipmi/ipmi-watchdog.c
hw/phb4.c
include/cpu.h
include/phb4.h
include/platform.h
libflash/libffs.c
libstb/mbedtls/sha512.c
libstb/mbedtls/sha512.h
platforms/astbmc/barreleye.c
platforms/astbmc/garrison.c
platforms/astbmc/mihawk.c
platforms/astbmc/nicole.c
platforms/astbmc/p8dnu.c
platforms/astbmc/p8dtu.c
platforms/astbmc/p9dsu.c
platforms/astbmc/vesnin.c
platforms/rhesus/ec/config.h
platforms/rhesus/ec/gpio.h
platforms/rhesus/gpio.c
platforms/rhesus/rhesus.c
platforms/astbmc/talos.c
platforms/astbmc/romulus.c

Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
[oliver: fixed up the drift]
Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
2020-03-12 20:33:18 +11:00

57 lines
1.7 KiB
C

// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
/* Copyright 2016-2017 IBM Corp. */
#ifndef __BITMAP_H
#define __BITMAP_H
#include <stdint.h>
#include <stdbool.h>
typedef unsigned long bitmap_elem_t;
typedef bitmap_elem_t bitmap_t[];
#define BITMAP_ELSZ (sizeof(bitmap_elem_t) << 3)
/* Number of elements for _n bits (rounded up) */
#define BITMAP_ELEMS(_n) (((_n) + (BITMAP_ELSZ - 1)) / BITMAP_ELSZ)
/* Number of bytes for _n bits (rounded up) */
#define BITMAP_BYTES(_n) (BITMAP_ELEMS(_n) * sizeof(bitmap_elem_t))
/* Bit number within an elemnt for bit _n */
#define BITMAP_BIT(_n) ((_n) & (BITMAP_ELSZ - 1))
/* Corresponding mask */
#define BITMAP_MASK(_n) (1ul << BITMAP_BIT(_n))
/* Element number for bit _n */
#define BITMAP_ELEM(_n) ((_n) / BITMAP_ELSZ)
static inline void bitmap_set_bit(bitmap_t map, unsigned int bit)
{
map[BITMAP_ELEM(bit)] |= BITMAP_MASK(bit);
}
static inline void bitmap_clr_bit(bitmap_t map, unsigned int bit)
{
map[BITMAP_ELEM(bit)] &= ~BITMAP_MASK(bit);
}
static inline bool bitmap_tst_bit(bitmap_t map, unsigned int bit)
{
return map[BITMAP_ELEM(bit)] & BITMAP_MASK(bit);
}
extern int bitmap_find_zero_bit(bitmap_t map, unsigned int start,
unsigned int count);
extern int bitmap_find_one_bit(bitmap_t map, unsigned int start,
unsigned int count);
#define bitmap_for_each_zero(map, size, bit) \
for (bit = bitmap_find_zero_bit(map, 0, size); \
bit >= 0; \
bit = bitmap_find_zero_bit(map, (bit) + 1, (size) - (bit) - 1))
#define bitmap_for_each_one(map, size, bit) \
for (bit = bitmap_find_one_bit(map, 0, size); \
bit >= 0; \
bit = bitmap_find_one_bit(map, (bit) + 1, (size) - (bit) - 1))
#endif /* __BITMAP_H */