xref: /linux/drivers/gpu/tests/gpu_random.c (revision ba110db8e1bc206c13fd7d985e79b033f53bfdea)
14a9671a0SJoel Fernandes // SPDX-License-Identifier: GPL-2.0
24a9671a0SJoel Fernandes #include <linux/bitops.h>
34a9671a0SJoel Fernandes #include <linux/export.h>
44a9671a0SJoel Fernandes #include <linux/kernel.h>
54a9671a0SJoel Fernandes #include <linux/random.h>
64a9671a0SJoel Fernandes #include <linux/slab.h>
74a9671a0SJoel Fernandes #include <linux/types.h>
84a9671a0SJoel Fernandes 
94a9671a0SJoel Fernandes #include "gpu_random.h"
104a9671a0SJoel Fernandes 
11*ba110db8SJoel Fernandes u32 gpu_prandom_u32_max_state(u32 ep_ro, struct rnd_state *state)
124a9671a0SJoel Fernandes {
134a9671a0SJoel Fernandes 	return upper_32_bits((u64)prandom_u32_state(state) * ep_ro);
144a9671a0SJoel Fernandes }
15*ba110db8SJoel Fernandes EXPORT_SYMBOL(gpu_prandom_u32_max_state);
164a9671a0SJoel Fernandes 
17*ba110db8SJoel Fernandes void gpu_random_reorder(unsigned int *order, unsigned int count,
184a9671a0SJoel Fernandes 			struct rnd_state *state)
194a9671a0SJoel Fernandes {
204a9671a0SJoel Fernandes 	unsigned int i, j;
214a9671a0SJoel Fernandes 
224a9671a0SJoel Fernandes 	for (i = 0; i < count; ++i) {
234a9671a0SJoel Fernandes 		BUILD_BUG_ON(sizeof(unsigned int) > sizeof(u32));
24*ba110db8SJoel Fernandes 		j = gpu_prandom_u32_max_state(count, state);
254a9671a0SJoel Fernandes 		swap(order[i], order[j]);
264a9671a0SJoel Fernandes 	}
274a9671a0SJoel Fernandes }
28*ba110db8SJoel Fernandes EXPORT_SYMBOL(gpu_random_reorder);
294a9671a0SJoel Fernandes 
30*ba110db8SJoel Fernandes unsigned int *gpu_random_order(unsigned int count, struct rnd_state *state)
314a9671a0SJoel Fernandes {
324a9671a0SJoel Fernandes 	unsigned int *order, i;
334a9671a0SJoel Fernandes 
344a9671a0SJoel Fernandes 	order = kmalloc_array(count, sizeof(*order), GFP_KERNEL);
354a9671a0SJoel Fernandes 	if (!order)
364a9671a0SJoel Fernandes 		return order;
374a9671a0SJoel Fernandes 
384a9671a0SJoel Fernandes 	for (i = 0; i < count; i++)
394a9671a0SJoel Fernandes 		order[i] = i;
404a9671a0SJoel Fernandes 
41*ba110db8SJoel Fernandes 	gpu_random_reorder(order, count, state);
424a9671a0SJoel Fernandes 	return order;
434a9671a0SJoel Fernandes }
44*ba110db8SJoel Fernandes EXPORT_SYMBOL(gpu_random_order);
45