0001
0002 #include <linux/bitops.h>
0003 #include <linux/kernel.h>
0004 #include <linux/random.h>
0005 #include <linux/slab.h>
0006 #include <linux/types.h>
0007
0008 #include "drm_random.h"
0009
0010 u32 drm_prandom_u32_max_state(u32 ep_ro, struct rnd_state *state)
0011 {
0012 return upper_32_bits((u64)prandom_u32_state(state) * ep_ro);
0013 }
0014 EXPORT_SYMBOL(drm_prandom_u32_max_state);
0015
0016 void drm_random_reorder(unsigned int *order, unsigned int count,
0017 struct rnd_state *state)
0018 {
0019 unsigned int i, j;
0020
0021 for (i = 0; i < count; ++i) {
0022 BUILD_BUG_ON(sizeof(unsigned int) > sizeof(u32));
0023 j = drm_prandom_u32_max_state(count, state);
0024 swap(order[i], order[j]);
0025 }
0026 }
0027 EXPORT_SYMBOL(drm_random_reorder);
0028
0029 unsigned int *drm_random_order(unsigned int count, struct rnd_state *state)
0030 {
0031 unsigned int *order, i;
0032
0033 order = kmalloc_array(count, sizeof(*order), GFP_KERNEL);
0034 if (!order)
0035 return order;
0036
0037 for (i = 0; i < count; i++)
0038 order[i] = i;
0039
0040 drm_random_reorder(order, count, state);
0041 return order;
0042 }
0043 EXPORT_SYMBOL(drm_random_order);