1a33d42ddSChris Wilson #include <linux/bitops.h> 2a33d42ddSChris Wilson #include <linux/kernel.h> 3a33d42ddSChris Wilson #include <linux/random.h> 4a33d42ddSChris Wilson #include <linux/slab.h> 5a33d42ddSChris Wilson #include <linux/types.h> 6a33d42ddSChris Wilson 7a33d42ddSChris Wilson #include "drm_random.h" 8a33d42ddSChris Wilson 9a33d42ddSChris Wilson static inline u32 drm_prandom_u32_max_state(u32 ep_ro, struct rnd_state *state) 10a33d42ddSChris Wilson { 11a33d42ddSChris Wilson return upper_32_bits((u64)prandom_u32_state(state) * ep_ro); 12a33d42ddSChris Wilson } 13a33d42ddSChris Wilson 14a33d42ddSChris Wilson void drm_random_reorder(unsigned int *order, unsigned int count, 15a33d42ddSChris Wilson struct rnd_state *state) 16a33d42ddSChris Wilson { 17a33d42ddSChris Wilson unsigned int i, j; 18a33d42ddSChris Wilson 19a33d42ddSChris Wilson for (i = 0; i < count; ++i) { 20a33d42ddSChris Wilson BUILD_BUG_ON(sizeof(unsigned int) > sizeof(u32)); 21a33d42ddSChris Wilson j = drm_prandom_u32_max_state(count, state); 22a33d42ddSChris Wilson swap(order[i], order[j]); 23a33d42ddSChris Wilson } 24a33d42ddSChris Wilson } 25a33d42ddSChris Wilson EXPORT_SYMBOL(drm_random_reorder); 26a33d42ddSChris Wilson 27a33d42ddSChris Wilson unsigned int *drm_random_order(unsigned int count, struct rnd_state *state) 28a33d42ddSChris Wilson { 29a33d42ddSChris Wilson unsigned int *order, i; 30a33d42ddSChris Wilson 31*0ee931c4SMichal Hocko order = kmalloc_array(count, sizeof(*order), GFP_KERNEL); 32a33d42ddSChris Wilson if (!order) 33a33d42ddSChris Wilson return order; 34a33d42ddSChris Wilson 35a33d42ddSChris Wilson for (i = 0; i < count; i++) 36a33d42ddSChris Wilson order[i] = i; 37a33d42ddSChris Wilson 38a33d42ddSChris Wilson drm_random_reorder(order, count, state); 39a33d42ddSChris Wilson return order; 40a33d42ddSChris Wilson } 41a33d42ddSChris Wilson EXPORT_SYMBOL(drm_random_order); 42