Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a33d42dd authored by Chris Wilson's avatar Chris Wilson Committed by Daniel Vetter
Browse files

drm: Add a simple generator of random permutations



When testing, we want a random but yet reproducible order in which to
process elements. Here we create an array which is a random (using the
Tausworthe PRNG) permutation of the order in which to execute.

Note these are simple helpers intended to be merged upstream in lib/

v2: Tidier code by David Herrmann
v3: Add reminder that this code is intended to be temporary, with at
least the bulk of the prandom changes going to lib/

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: David Herrmann <dh.herrmann@gmail.com>
Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20161222083641.2691-6-chris@chris-wilson.co.uk
parent cf4a7207
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -321,3 +321,7 @@ config DRM_SAVAGE
	  chipset. If M is selected the module will be called savage.

endif # DRM_LEGACY

config DRM_LIB_RANDOM
	bool
	default n
+1 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ drm-y := drm_auth.o drm_bufs.o drm_cache.o \
		drm_plane.o drm_color_mgmt.o drm_print.o \
		drm_dumb_buffers.o drm_mode_config.o

drm-$(CONFIG_DRM_LIB_RANDOM) += lib/drm_random.o
drm-$(CONFIG_COMPAT) += drm_ioc32.o
drm-$(CONFIG_DRM_GEM_CMA_HELPER) += drm_gem_cma_helper.o
drm-$(CONFIG_PCI) += ati_pcigart.o
+41 −0
Original line number Diff line number Diff line
#include <linux/bitops.h>
#include <linux/kernel.h>
#include <linux/random.h>
#include <linux/slab.h>
#include <linux/types.h>

#include "drm_random.h"

static inline u32 drm_prandom_u32_max_state(u32 ep_ro, struct rnd_state *state)
{
	return upper_32_bits((u64)prandom_u32_state(state) * ep_ro);
}

void drm_random_reorder(unsigned int *order, unsigned int count,
			struct rnd_state *state)
{
	unsigned int i, j;

	for (i = 0; i < count; ++i) {
		BUILD_BUG_ON(sizeof(unsigned int) > sizeof(u32));
		j = drm_prandom_u32_max_state(count, state);
		swap(order[i], order[j]);
	}
}
EXPORT_SYMBOL(drm_random_reorder);

unsigned int *drm_random_order(unsigned int count, struct rnd_state *state)
{
	unsigned int *order, i;

	order = kmalloc_array(count, sizeof(*order), GFP_TEMPORARY);
	if (!order)
		return order;

	for (i = 0; i < count; i++)
		order[i] = i;

	drm_random_reorder(order, count, state);
	return order;
}
EXPORT_SYMBOL(drm_random_order);
+25 −0
Original line number Diff line number Diff line
#ifndef __DRM_RANDOM_H__
#define __DRM_RANDOM_H__

/* This is a temporary home for a couple of utility functions that should
 * be transposed to lib/ at the earliest convenience.
 */

#include <linux/random.h>

#define DRM_RND_STATE_INITIALIZER(seed__) ({				\
	struct rnd_state state__;					\
	prandom_seed_state(&state__, (seed__));				\
	state__;							\
})

#define DRM_RND_STATE(name__, seed__) \
	struct rnd_state name__ = DRM_RND_STATE_INITIALIZER(seed__)

unsigned int *drm_random_order(unsigned int count,
			       struct rnd_state *state);
void drm_random_reorder(unsigned int *order,
			unsigned int count,
			struct rnd_state *state);

#endif /* !__DRM_RANDOM_H__ */