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