1 1.1 riastrad /* $NetBSD: drm_random.c,v 1.2 2021/12/18 23:45:31 riastradh Exp $ */ 2 1.1 riastrad 3 1.1 riastrad // SPDX-License-Identifier: GPL-2.0 4 1.1 riastrad #include <sys/cdefs.h> 5 1.1 riastrad __KERNEL_RCSID(0, "$NetBSD: drm_random.c,v 1.2 2021/12/18 23:45:31 riastradh Exp $"); 6 1.1 riastrad 7 1.1 riastrad #include <linux/bitops.h> 8 1.1 riastrad #include <linux/kernel.h> 9 1.1 riastrad #include <linux/random.h> 10 1.1 riastrad #include <linux/slab.h> 11 1.1 riastrad #include <linux/types.h> 12 1.1 riastrad 13 1.1 riastrad #include "drm_random.h" 14 1.1 riastrad 15 1.1 riastrad static inline u32 drm_prandom_u32_max_state(u32 ep_ro, struct rnd_state *state) 16 1.1 riastrad { 17 1.1 riastrad return upper_32_bits((u64)prandom_u32_state(state) * ep_ro); 18 1.1 riastrad } 19 1.1 riastrad 20 1.1 riastrad void drm_random_reorder(unsigned int *order, unsigned int count, 21 1.1 riastrad struct rnd_state *state) 22 1.1 riastrad { 23 1.1 riastrad unsigned int i, j; 24 1.1 riastrad 25 1.1 riastrad for (i = 0; i < count; ++i) { 26 1.1 riastrad BUILD_BUG_ON(sizeof(unsigned int) > sizeof(u32)); 27 1.1 riastrad j = drm_prandom_u32_max_state(count, state); 28 1.1 riastrad swap(order[i], order[j]); 29 1.1 riastrad } 30 1.1 riastrad } 31 1.1 riastrad EXPORT_SYMBOL(drm_random_reorder); 32 1.1 riastrad 33 1.1 riastrad unsigned int *drm_random_order(unsigned int count, struct rnd_state *state) 34 1.1 riastrad { 35 1.1 riastrad unsigned int *order, i; 36 1.1 riastrad 37 1.1 riastrad order = kmalloc_array(count, sizeof(*order), GFP_KERNEL); 38 1.1 riastrad if (!order) 39 1.1 riastrad return order; 40 1.1 riastrad 41 1.1 riastrad for (i = 0; i < count; i++) 42 1.1 riastrad order[i] = i; 43 1.1 riastrad 44 1.1 riastrad drm_random_reorder(order, count, state); 45 1.1 riastrad return order; 46 1.1 riastrad } 47 1.1 riastrad EXPORT_SYMBOL(drm_random_order); 48