1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (C) 2020 Intel Corporation
4*4882a593Smuzhiyun */
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #include <linux/init.h>
9*4882a593Smuzhiyun #include <linux/module.h>
10*4882a593Smuzhiyun #include <linux/printk.h>
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun /* a tiny module only meant to test
13*4882a593Smuzhiyun *
14*4882a593Smuzhiyun * set/clear_bit
15*4882a593Smuzhiyun * get_count_order/long
16*4882a593Smuzhiyun */
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun /* use an enum because thats the most common BITMAP usage */
19*4882a593Smuzhiyun enum bitops_fun {
20*4882a593Smuzhiyun BITOPS_4 = 4,
21*4882a593Smuzhiyun BITOPS_7 = 7,
22*4882a593Smuzhiyun BITOPS_11 = 11,
23*4882a593Smuzhiyun BITOPS_31 = 31,
24*4882a593Smuzhiyun BITOPS_88 = 88,
25*4882a593Smuzhiyun BITOPS_LAST = 255,
26*4882a593Smuzhiyun BITOPS_LENGTH = 256
27*4882a593Smuzhiyun };
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun static DECLARE_BITMAP(g_bitmap, BITOPS_LENGTH);
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun static unsigned int order_comb[][2] = {
32*4882a593Smuzhiyun {0x00000003, 2},
33*4882a593Smuzhiyun {0x00000004, 2},
34*4882a593Smuzhiyun {0x00001fff, 13},
35*4882a593Smuzhiyun {0x00002000, 13},
36*4882a593Smuzhiyun {0x50000000, 31},
37*4882a593Smuzhiyun {0x80000000, 31},
38*4882a593Smuzhiyun {0x80003000, 32},
39*4882a593Smuzhiyun };
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun #ifdef CONFIG_64BIT
42*4882a593Smuzhiyun static unsigned long order_comb_long[][2] = {
43*4882a593Smuzhiyun {0x0000000300000000, 34},
44*4882a593Smuzhiyun {0x0000000400000000, 34},
45*4882a593Smuzhiyun {0x00001fff00000000, 45},
46*4882a593Smuzhiyun {0x0000200000000000, 45},
47*4882a593Smuzhiyun {0x5000000000000000, 63},
48*4882a593Smuzhiyun {0x8000000000000000, 63},
49*4882a593Smuzhiyun {0x8000300000000000, 64},
50*4882a593Smuzhiyun };
51*4882a593Smuzhiyun #endif
52*4882a593Smuzhiyun
test_bitops_startup(void)53*4882a593Smuzhiyun static int __init test_bitops_startup(void)
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun int i, bit_set;
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun pr_info("Starting bitops test\n");
58*4882a593Smuzhiyun set_bit(BITOPS_4, g_bitmap);
59*4882a593Smuzhiyun set_bit(BITOPS_7, g_bitmap);
60*4882a593Smuzhiyun set_bit(BITOPS_11, g_bitmap);
61*4882a593Smuzhiyun set_bit(BITOPS_31, g_bitmap);
62*4882a593Smuzhiyun set_bit(BITOPS_88, g_bitmap);
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(order_comb); i++) {
65*4882a593Smuzhiyun if (order_comb[i][1] != get_count_order(order_comb[i][0]))
66*4882a593Smuzhiyun pr_warn("get_count_order wrong for %x\n",
67*4882a593Smuzhiyun order_comb[i][0]);
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(order_comb); i++) {
71*4882a593Smuzhiyun if (order_comb[i][1] != get_count_order_long(order_comb[i][0]))
72*4882a593Smuzhiyun pr_warn("get_count_order_long wrong for %x\n",
73*4882a593Smuzhiyun order_comb[i][0]);
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun #ifdef CONFIG_64BIT
77*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(order_comb_long); i++) {
78*4882a593Smuzhiyun if (order_comb_long[i][1] !=
79*4882a593Smuzhiyun get_count_order_long(order_comb_long[i][0]))
80*4882a593Smuzhiyun pr_warn("get_count_order_long wrong for %lx\n",
81*4882a593Smuzhiyun order_comb_long[i][0]);
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun #endif
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun barrier();
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun clear_bit(BITOPS_4, g_bitmap);
88*4882a593Smuzhiyun clear_bit(BITOPS_7, g_bitmap);
89*4882a593Smuzhiyun clear_bit(BITOPS_11, g_bitmap);
90*4882a593Smuzhiyun clear_bit(BITOPS_31, g_bitmap);
91*4882a593Smuzhiyun clear_bit(BITOPS_88, g_bitmap);
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun bit_set = find_first_bit(g_bitmap, BITOPS_LAST);
94*4882a593Smuzhiyun if (bit_set != BITOPS_LAST)
95*4882a593Smuzhiyun pr_err("ERROR: FOUND SET BIT %d\n", bit_set);
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun pr_info("Completed bitops test\n");
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun return 0;
100*4882a593Smuzhiyun }
101*4882a593Smuzhiyun
test_bitops_unstartup(void)102*4882a593Smuzhiyun static void __exit test_bitops_unstartup(void)
103*4882a593Smuzhiyun {
104*4882a593Smuzhiyun }
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun module_init(test_bitops_startup);
107*4882a593Smuzhiyun module_exit(test_bitops_unstartup);
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun MODULE_AUTHOR("Jesse Brandeburg <jesse.brandeburg@intel.com>, Wei Yang <richard.weiyang@gmail.com>");
110*4882a593Smuzhiyun MODULE_LICENSE("GPL");
111*4882a593Smuzhiyun MODULE_DESCRIPTION("Bit testing module");
112