xref: /linux-6.15/drivers/gpu/drm/lib/drm_random.c (revision 0ee931c4)
1a33d42ddSChris Wilson #include <linux/bitops.h>
2a33d42ddSChris Wilson #include <linux/kernel.h>
3a33d42ddSChris Wilson #include <linux/random.h>
4a33d42ddSChris Wilson #include <linux/slab.h>
5a33d42ddSChris Wilson #include <linux/types.h>
6a33d42ddSChris Wilson 
7a33d42ddSChris Wilson #include "drm_random.h"
8a33d42ddSChris Wilson 
9a33d42ddSChris Wilson static inline u32 drm_prandom_u32_max_state(u32 ep_ro, struct rnd_state *state)
10a33d42ddSChris Wilson {
11a33d42ddSChris Wilson 	return upper_32_bits((u64)prandom_u32_state(state) * ep_ro);
12a33d42ddSChris Wilson }
13a33d42ddSChris Wilson 
14a33d42ddSChris Wilson void drm_random_reorder(unsigned int *order, unsigned int count,
15a33d42ddSChris Wilson 			struct rnd_state *state)
16a33d42ddSChris Wilson {
17a33d42ddSChris Wilson 	unsigned int i, j;
18a33d42ddSChris Wilson 
19a33d42ddSChris Wilson 	for (i = 0; i < count; ++i) {
20a33d42ddSChris Wilson 		BUILD_BUG_ON(sizeof(unsigned int) > sizeof(u32));
21a33d42ddSChris Wilson 		j = drm_prandom_u32_max_state(count, state);
22a33d42ddSChris Wilson 		swap(order[i], order[j]);
23a33d42ddSChris Wilson 	}
24a33d42ddSChris Wilson }
25a33d42ddSChris Wilson EXPORT_SYMBOL(drm_random_reorder);
26a33d42ddSChris Wilson 
27a33d42ddSChris Wilson unsigned int *drm_random_order(unsigned int count, struct rnd_state *state)
28a33d42ddSChris Wilson {
29a33d42ddSChris Wilson 	unsigned int *order, i;
30a33d42ddSChris Wilson 
31*0ee931c4SMichal Hocko 	order = kmalloc_array(count, sizeof(*order), GFP_KERNEL);
32a33d42ddSChris Wilson 	if (!order)
33a33d42ddSChris Wilson 		return order;
34a33d42ddSChris Wilson 
35a33d42ddSChris Wilson 	for (i = 0; i < count; i++)
36a33d42ddSChris Wilson 		order[i] = i;
37a33d42ddSChris Wilson 
38a33d42ddSChris Wilson 	drm_random_reorder(order, count, state);
39a33d42ddSChris Wilson 	return order;
40a33d42ddSChris Wilson }
41a33d42ddSChris Wilson EXPORT_SYMBOL(drm_random_order);
42