blob: d06c1455371ae06618b6995255cf1554695cce25 [file] [log] [blame]
/*
*
* (C) COPYRIGHT 2008-2013 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_descriptor_mapping.h
*/
#ifndef _UMP_KERNEL_DESCRIPTOR_MAPPING_H_
#define _UMP_KERNEL_DESCRIPTOR_MAPPING_H_
#include <linux/rwsem.h>
#include <linux/slab.h>
/**
* The actual descriptor mapping table, never directly accessed by clients
*/
typedef struct umpp_descriptor_table
{
/* keep as a unsigned long to rely on the OS's bitops support */
unsigned long * usage; /**< Pointer to bitpattern indicating if a descriptor is valid/used(1) or not(0) */
void** mappings; /**< Array of the pointers the descriptors map to */
} umpp_descriptor_table;
/**
* The descriptor mapping object
* Provides a separate namespace where we can map an integer to a pointer
*/
typedef struct umpp_descriptor_mapping
{
struct rw_semaphore lock; /**< Lock protecting access to the mapping object */
unsigned int max_nr_mappings_allowed; /**< Max number of mappings to support in this namespace */
unsigned int current_nr_mappings; /**< Current number of possible mappings */
umpp_descriptor_table * table; /**< Pointer to the current mapping table */
} umpp_descriptor_mapping;
/**
* Create a descriptor mapping object.
* Create a descriptor mapping capable of holding init_entries growable to max_entries.
* ID 0 is reserved so the number of available entries will be max - 1.
* @param init_entries Number of entries to preallocate memory for
* @param max_entries Number of entries to max support
* @return Pointer to a descriptor mapping object, NULL on failure
*/
umpp_descriptor_mapping * umpp_descriptor_mapping_create(unsigned int init_entries, unsigned int max_entries);
/**
* Destroy a descriptor mapping object
* @param[in] map The map to free
*/
void umpp_descriptor_mapping_destroy(umpp_descriptor_mapping * map);
/**
* Allocate a new mapping entry (descriptor ID)
* Allocates a new entry in the map.
* @param[in] map The map to allocate a new entry in
* @param[in] target The value to map to
* @return The descriptor allocated, ID 0 on failure.
*/
unsigned int umpp_descriptor_mapping_allocate(umpp_descriptor_mapping * map, void * target);
/**
* Get the value mapped to by a descriptor ID
* @param[in] map The map to lookup the descriptor id in
* @param[in] descriptor The descriptor ID to lookup
* @param[out] target Pointer to a pointer which will receive the stored value
*
* @return 0 on success lookup, -EINVAL on lookup failure.
*/
int umpp_descriptor_mapping_lookup(umpp_descriptor_mapping * map, unsigned int descriptor, void** const target);
/**
* Free the descriptor ID
* For the descriptor to be reused it has to be freed
* @param[in] map The map to free the descriptor from
* @param descriptor The descriptor ID to free
*/
void umpp_descriptor_mapping_remove(umpp_descriptor_mapping * map, unsigned int descriptor);
#endif /* _UMP_KERNEL_DESCRIPTOR_MAPPING_H_ */