Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
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);