summaryrefslogtreecommitdiff
path: root/drivers/gpu/mali/ump/linux/ump_kernel_random_mapping.h
blob: 7f89ef827b6f18c9b07818b346a39ae2e9ad8967 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/*
 * Copyright (C) 2010-2011, 2013-2014 ARM Limited. All rights reserved.
 * 
 * This program is free software and is provided to you under the terms of the GNU General Public License version 2
 * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
 * 
 * A copy of the licence is included with the program, and can also be obtained from Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

/**
 * @file ump_kernel_random_mapping.h
 */

#ifndef __UMP_KERNEL_RANDOM_MAPPING_H__
#define __UMP_KERNEL_RANDOM_MAPPING_H__

#include "mali_osk.h"
#include <linux/rbtree.h>

#define UMP_RANDOM_MAP_DELAY 1
#define UMP_FAILED_LOOKUP_DELAY 10 /* ms */
#define UMP_FAILED_LOOKUPS_ALLOWED 10 /* number of allowed failed lookups */

/**
 * The random mapping object
 * Provides a separate namespace where we can map an integer to a pointer
 */
typedef struct ump_random_mapping {
	_mali_osk_mutex_rw_t *lock; /**< Lock protecting access to the mapping object */
	struct rb_root root;
#if UMP_RANDOM_MAP_DELAY
	struct {
		unsigned long count;
		unsigned long timestamp;
	} failed;
#endif
} ump_random_mapping;

/**
 * Create a random mapping object
 * Create a random mapping capable of holding 2^20 entries
 * @return Pointer to a random mapping object, NULL on failure
 */
ump_random_mapping *ump_random_mapping_create(void);

/**
 * Destroy a random mapping object
 * @param map The map to free
 */
void ump_random_mapping_destroy(ump_random_mapping *map);

/**
 * Allocate a new mapping entry (random ID)
 * Allocates a new entry in the map.
 * @param map The map to allocate a new entry in
 * @param target The value to map to
 * @return The random allocated, a negative value on error
 */
int ump_random_mapping_insert(ump_random_mapping *map, ump_dd_mem *mem);

/**
 * Get the value mapped to by a random ID
 *
 * If the lookup fails, punish the calling thread by applying a delay.
 *
 * @param map The map to lookup the random id in
 * @param id The ID to lookup
 * @param target Pointer to a pointer which will receive the stored value
 * @return ump_dd_mem pointer on successful lookup, NULL on error
 */
ump_dd_mem *ump_random_mapping_get(ump_random_mapping *map, int id);

void ump_random_mapping_put(ump_dd_mem *mem);

/**
 * Free the random ID
 * For the random to be reused it has to be freed
 * @param map The map to free the random from
 * @param id The ID to free
 */
ump_dd_mem *ump_random_mapping_remove(ump_random_mapping *map, int id);

#endif /* __UMP_KERNEL_RANDOM_MAPPING_H__ */