vdpa/mlx5: support queue update
[dpdk.git] / drivers / net / ice / base / ice_bitops.h
index bcdee63..3022116 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2001-2020
+ * Copyright(c) 2001-2020 Intel Corporation
  */
 
 #ifndef _ICE_BITOPS_H_
@@ -214,7 +214,7 @@ ice_or_bitmap(ice_bitmap_t *dst, const ice_bitmap_t *bmp1,
        ice_bitmap_t mask;
        u16 i;
 
-       /* Handle all but last chunk*/
+       /* Handle all but last chunk */
        for (i = 0; i < BITS_TO_CHUNKS(size) - 1; i++)
                dst[i] = bmp1[i] | bmp2[i];
 
@@ -245,7 +245,7 @@ ice_xor_bitmap(ice_bitmap_t *dst, const ice_bitmap_t *bmp1,
        ice_bitmap_t mask;
        u16 i;
 
-       /* Handle all but last chunk*/
+       /* Handle all but last chunk */
        for (i = 0; i < BITS_TO_CHUNKS(size) - 1; i++)
                dst[i] = bmp1[i] ^ bmp2[i];
 
@@ -258,6 +258,37 @@ ice_xor_bitmap(ice_bitmap_t *dst, const ice_bitmap_t *bmp1,
        dst[i] = (dst[i] & ~mask) | ((bmp1[i] ^ bmp2[i]) & mask);
 }
 
+/**
+ * ice_andnot_bitmap - bitwise ANDNOT 2 bitmaps and result in dst bitmap
+ * @dst: Destination bitmap that receive the result of the operation
+ * @bmp1: The first bitmap of ANDNOT operation
+ * @bmp2: The second bitmap to ANDNOT operation
+ * @size: Size of the bitmaps in bits
+ *
+ * This function performs a bitwise ANDNOT on two "source" bitmaps of the same
+ * size, and stores the result to "dst" bitmap. The "dst" bitmap must be of the
+ * same size as the "source" bitmaps to avoid buffer overflows.
+ */
+static inline void
+ice_andnot_bitmap(ice_bitmap_t *dst, const ice_bitmap_t *bmp1,
+                 const ice_bitmap_t *bmp2, u16 size)
+{
+       ice_bitmap_t mask;
+       u16 i;
+
+       /* Handle all but last chunk */
+       for (i = 0; i < BITS_TO_CHUNKS(size) - 1; i++)
+               dst[i] = bmp1[i] & ~bmp2[i];
+
+       /* We want to only clear bits within the size. Furthermore, we also do
+        * not want to modify destination bits which are beyond the specified
+        * size. Use a bitmask to ensure that we only modify the bits that are
+        * within the specified size.
+        */
+       mask = LAST_CHUNK_MASK(size);
+       dst[i] = (dst[i] & ~mask) | ((bmp1[i] & ~bmp2[i]) & mask);
+}
+
 /**
  * ice_find_next_bit - Find the index of the next set bit of a bitmap
  * @bitmap: the bitmap to scan
@@ -358,12 +389,12 @@ ice_cmp_bitmap(ice_bitmap_t *bmp1, ice_bitmap_t *bmp2, u16 size)
        ice_bitmap_t mask;
        u16 i;
 
-       /* Handle all but last chunk*/
+       /* Handle all but last chunk */
        for (i = 0; i < BITS_TO_CHUNKS(size) - 1; i++)
                if (bmp1[i] != bmp2[i])
                        return false;
 
-       /* We want to only compare bits within the size.*/
+       /* We want to only compare bits within the size */
        mask = LAST_CHUNK_MASK(size);
        if ((bmp1[i] & mask) != (bmp2[i] & mask))
                return false;