drm_random.c 949 B

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