mali_descriptor_mapping * mali_descriptor_mapping_create(int init_entries, int max_entries) { mali_descriptor_mapping * map = _mali_osk_calloc(1, sizeof(mali_descriptor_mapping)); init_entries = MALI_PAD_INT(init_entries); max_entries = MALI_PAD_INT(max_entries); if (NULL != map) { map->table = descriptor_table_alloc(init_entries); if (NULL != map->table) { #if !USING_MMU map->lock = _mali_osk_lock_init( (_mali_osk_lock_flags_t)(_MALI_OSK_LOCKFLAG_ORDERED | _MALI_OSK_LOCKFLAG_READERWRITER | _MALI_OSK_LOCKFLAG_NONINTERRUPTABLE), 0, 20); #else map->lock = _mali_osk_lock_init( (_mali_osk_lock_flags_t)(_MALI_OSK_LOCKFLAG_ORDERED | _MALI_OSK_LOCKFLAG_READERWRITER | _MALI_OSK_LOCKFLAG_NONINTERRUPTABLE), 0, 116); #endif if (NULL != map->lock) { _mali_osk_set_nonatomic_bit(0, map->table->usage); /* reserve bit 0 to prevent NULL/zero logic to kick in */ map->max_nr_mappings_allowed = max_entries; map->current_nr_mappings = init_entries; return map; } descriptor_table_free(map->table); } _mali_osk_free(map); } return NULL; }
mali_descriptor_mapping * mali_descriptor_mapping_create(int init_entries, int max_entries) { mali_descriptor_mapping * map = _mali_osk_calloc(1, sizeof(mali_descriptor_mapping)); init_entries = MALI_PAD_INT(init_entries); max_entries = MALI_PAD_INT(max_entries); if (NULL != map) { map->table = descriptor_table_alloc(init_entries); if (NULL != map->table) { map->lock = _mali_osk_lock_init( (_mali_osk_lock_flags_t)(_MALI_OSK_LOCKFLAG_ORDERED | _MALI_OSK_LOCKFLAG_READERWRITER | _MALI_OSK_LOCKFLAG_NONINTERRUPTABLE), 0, _MALI_OSK_LOCK_ORDER_DESCRIPTOR_MAP); if (NULL != map->lock) { _mali_osk_set_nonatomic_bit(0, map->table->usage); map->max_nr_mappings_allowed = max_entries; map->current_nr_mappings = init_entries; return map; } descriptor_table_free(map->table); } _mali_osk_free(map); } return NULL; }
_mali_osk_errcode_t mali_descriptor_mapping_allocate_mapping(mali_descriptor_mapping *map, void *target, int *odescriptor) { _mali_osk_errcode_t err = _MALI_OSK_ERR_FAULT; int new_descriptor; mali_mem_allocation *descriptor; struct mali_session_data *session; MALI_DEBUG_ASSERT_POINTER(map); MALI_DEBUG_ASSERT_POINTER(odescriptor); MALI_DEBUG_ASSERT_POINTER(target); _mali_osk_mutex_rw_wait(map->lock, _MALI_OSK_LOCKMODE_RW); new_descriptor = _mali_osk_find_first_zero_bit(map->table->usage, map->current_nr_mappings); if (new_descriptor == map->current_nr_mappings) { /* no free descriptor, try to expand the table */ mali_descriptor_table *new_table, * old_table; if (map->current_nr_mappings >= map->max_nr_mappings_allowed) goto unlock_and_exit; map->current_nr_mappings += BITS_PER_LONG; new_table = descriptor_table_alloc(map->current_nr_mappings); if (NULL == new_table) goto unlock_and_exit; old_table = map->table; _mali_osk_memcpy(new_table->usage, old_table->usage, (sizeof(unsigned long)*map->current_nr_mappings) / BITS_PER_LONG); _mali_osk_memcpy(new_table->mappings, old_table->mappings, map->current_nr_mappings * sizeof(void *)); map->table = new_table; descriptor_table_free(old_table); } /* we have found a valid descriptor, set the value and usage bit */ _mali_osk_set_nonatomic_bit(new_descriptor, map->table->usage); map->table->mappings[new_descriptor] = target; *odescriptor = new_descriptor; /* To calculate the mali mem usage for the session */ descriptor = (mali_mem_allocation *)target; session = descriptor->session; MALI_DEBUG_ASSERT_POINTER(session); session->mali_mem_array[descriptor->type] += descriptor->size; if ((MALI_MEM_OS == descriptor->type || MALI_MEM_BLOCK == descriptor->type) && (session->mali_mem_array[MALI_MEM_OS] + session->mali_mem_array[MALI_MEM_BLOCK] > session->max_mali_mem_allocated)) { session->max_mali_mem_allocated = session->mali_mem_array[MALI_MEM_OS] + session->mali_mem_array[MALI_MEM_BLOCK]; } err = _MALI_OSK_ERR_OK; unlock_and_exit: _mali_osk_mutex_rw_signal(map->lock, _MALI_OSK_LOCKMODE_RW); MALI_ERROR(err); }
int ump_descriptor_mapping_allocate_mapping(ump_descriptor_mapping *map, void *target) { int descriptor = -1;/*-EFAULT;*/ _mali_osk_mutex_rw_wait(map->lock, _MALI_OSK_LOCKMODE_RW); descriptor = _mali_osk_find_first_zero_bit(map->table->usage, map->current_nr_mappings); if (descriptor == map->current_nr_mappings) { int nr_mappings_new; /* no free descriptor, try to expand the table */ ump_descriptor_table *new_table; ump_descriptor_table *old_table = map->table; nr_mappings_new = map->current_nr_mappings * 2; if (map->current_nr_mappings >= map->max_nr_mappings_allowed) { descriptor = -1; goto unlock_and_exit; } new_table = descriptor_table_alloc(nr_mappings_new); if (NULL == new_table) { descriptor = -1; goto unlock_and_exit; } _mali_osk_memcpy(new_table->usage, old_table->usage, (sizeof(unsigned long)*map->current_nr_mappings) / BITS_PER_LONG); _mali_osk_memcpy(new_table->mappings, old_table->mappings, map->current_nr_mappings * sizeof(void *)); map->table = new_table; map->current_nr_mappings = nr_mappings_new; descriptor_table_free(old_table); } /* we have found a valid descriptor, set the value and usage bit */ _mali_osk_set_nonatomic_bit(descriptor, map->table->usage); map->table->mappings[descriptor] = target; unlock_and_exit: _mali_osk_mutex_rw_signal(map->lock, _MALI_OSK_LOCKMODE_RW); return descriptor; }
ump_descriptor_mapping *ump_descriptor_mapping_create(int init_entries, int max_entries) { ump_descriptor_mapping *map = _mali_osk_calloc(1, sizeof(ump_descriptor_mapping)); init_entries = MALI_PAD_INT(init_entries); max_entries = MALI_PAD_INT(max_entries); if (NULL != map) { map->table = descriptor_table_alloc(init_entries); if (NULL != map->table) { map->lock = _mali_osk_mutex_rw_init(_MALI_OSK_LOCKFLAG_UNORDERED, 0); if (NULL != map->lock) { _mali_osk_set_nonatomic_bit(0, map->table->usage); /* reserve bit 0 to prevent NULL/zero logic to kick in */ map->max_nr_mappings_allowed = max_entries; map->current_nr_mappings = init_entries; return map; } descriptor_table_free(map->table); } _mali_osk_free(map); } return NULL; }
_mali_osk_errcode_t mali_descriptor_mapping_allocate_mapping(mali_descriptor_mapping * map, void * target, int *odescriptor) { _mali_osk_errcode_t err = _MALI_OSK_ERR_FAULT; int new_descriptor; MALI_DEBUG_ASSERT_POINTER(map); MALI_DEBUG_ASSERT_POINTER(odescriptor); _mali_osk_lock_wait(map->lock, _MALI_OSK_LOCKMODE_RW); new_descriptor = _mali_osk_find_first_zero_bit(map->table->usage, map->current_nr_mappings); if (new_descriptor == map->current_nr_mappings) { /* no free descriptor, try to expand the table */ mali_descriptor_table * new_table, * old_table; if (map->current_nr_mappings >= map->max_nr_mappings_allowed) goto unlock_and_exit; map->current_nr_mappings += BITS_PER_LONG; new_table = descriptor_table_alloc(map->current_nr_mappings); if (NULL == new_table) goto unlock_and_exit; old_table = map->table; _mali_osk_memcpy(new_table->usage, old_table->usage, (sizeof(unsigned long)*map->current_nr_mappings) / BITS_PER_LONG); _mali_osk_memcpy(new_table->mappings, old_table->mappings, map->current_nr_mappings * sizeof(void*)); map->table = new_table; descriptor_table_free(old_table); } /* we have found a valid descriptor, set the value and usage bit */ _mali_osk_set_nonatomic_bit(new_descriptor, map->table->usage); map->table->mappings[new_descriptor] = target; *odescriptor = new_descriptor; err = _MALI_OSK_ERR_OK; unlock_and_exit: _mali_osk_lock_signal(map->lock, _MALI_OSK_LOCKMODE_RW); MALI_ERROR(err); }