diff options
author | mcampbellsmith <mcampbellsmith@gmail.com> | 2013-11-20 22:34:44 +1100 |
---|---|---|
committer | sbrissen <sbrissen@hotmail.com> | 2013-12-10 14:54:28 -0500 |
commit | 74bcc029c6ab942f252477a74102877f7d093388 (patch) | |
tree | 044bd97b98693c073841663c62f57e1520509109 /drivers/media/video/samsung/mali/common/mali_kernel_mem_os.c | |
parent | 2a6649bf6aa50c44a05fc02e1efb8b788c58e82b (diff) | |
download | kernel_samsung_smdk4412-74bcc029c6ab942f252477a74102877f7d093388.zip kernel_samsung_smdk4412-74bcc029c6ab942f252477a74102877f7d093388.tar.gz kernel_samsung_smdk4412-74bcc029c6ab942f252477a74102877f7d093388.tar.bz2 |
mali: bulk import of r3p2-01rel3 drivers from i9300-update12
Courtesy of a similar commit from OMNI ROM. Requires updated mali blobs
Change-Id: I9ee55b653b57b7c390f8e0e8cd4fc068f1c751c3
Diffstat (limited to 'drivers/media/video/samsung/mali/common/mali_kernel_mem_os.c')
-rw-r--r-- | drivers/media/video/samsung/mali/common/mali_kernel_mem_os.c | 354 |
1 files changed, 0 insertions, 354 deletions
diff --git a/drivers/media/video/samsung/mali/common/mali_kernel_mem_os.c b/drivers/media/video/samsung/mali/common/mali_kernel_mem_os.c deleted file mode 100644 index 8ff3d37..0000000 --- a/drivers/media/video/samsung/mali/common/mali_kernel_mem_os.c +++ /dev/null @@ -1,354 +0,0 @@ -/* - * Copyright (C) 2010-2012 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. - */ - -#include "mali_kernel_common.h" -#include "mali_kernel_core.h" -#include "mali_kernel_memory_engine.h" -#include "mali_osk.h" - -typedef struct os_allocation -{ - u32 num_pages; - u32 offset_start; - mali_allocation_engine * engine; - mali_memory_allocation * descriptor; -} os_allocation; - -typedef struct os_allocator -{ - _mali_osk_lock_t *mutex; - - /** - * Maximum number of pages to allocate from the OS - */ - u32 num_pages_max; - - /** - * Number of pages allocated from the OS - */ - u32 num_pages_allocated; - - /** CPU Usage adjustment (add to mali physical address to get cpu physical address) */ - u32 cpu_usage_adjust; -} os_allocator; - -static mali_physical_memory_allocation_result os_allocator_allocate(void* ctx, mali_allocation_engine * engine, mali_memory_allocation * descriptor, u32* offset, mali_physical_memory_allocation * alloc_info); -static mali_physical_memory_allocation_result os_allocator_allocate_page_table_block(void * ctx, mali_page_table_block * block); -static void os_allocator_release(void * ctx, void * handle); -static void os_allocator_page_table_block_release( mali_page_table_block *page_table_block ); -static void os_allocator_destroy(mali_physical_memory_allocator * allocator); -static u32 os_allocator_stat(mali_physical_memory_allocator * allocator); - -mali_physical_memory_allocator * mali_os_allocator_create(u32 max_allocation, u32 cpu_usage_adjust, const char *name) -{ - mali_physical_memory_allocator * allocator; - os_allocator * info; - - max_allocation = (max_allocation + _MALI_OSK_CPU_PAGE_SIZE-1) & ~(_MALI_OSK_CPU_PAGE_SIZE-1); - - MALI_DEBUG_PRINT(2, ("Mali OS memory allocator created with max allocation size of 0x%X bytes, cpu_usage_adjust 0x%08X\n", max_allocation, cpu_usage_adjust)); - - allocator = _mali_osk_malloc(sizeof(mali_physical_memory_allocator)); - if (NULL != allocator) - { - info = _mali_osk_malloc(sizeof(os_allocator)); - if (NULL != info) - { - info->num_pages_max = max_allocation / _MALI_OSK_CPU_PAGE_SIZE; - info->num_pages_allocated = 0; - info->cpu_usage_adjust = cpu_usage_adjust; - - info->mutex = _mali_osk_lock_init( _MALI_OSK_LOCKFLAG_NONINTERRUPTABLE | _MALI_OSK_LOCKFLAG_ORDERED, 0, _MALI_OSK_LOCK_ORDER_MEM_INFO); - if (NULL != info->mutex) - { - allocator->allocate = os_allocator_allocate; - allocator->allocate_page_table_block = os_allocator_allocate_page_table_block; - allocator->destroy = os_allocator_destroy; - allocator->stat = os_allocator_stat; - allocator->ctx = info; - allocator->name = name; - - return allocator; - } - _mali_osk_free(info); - } - _mali_osk_free(allocator); - } - - return NULL; -} - -static u32 os_allocator_stat(mali_physical_memory_allocator * allocator) -{ - os_allocator * info; - info = (os_allocator*)allocator->ctx; - return info->num_pages_allocated * _MALI_OSK_MALI_PAGE_SIZE; -} - -static void os_allocator_destroy(mali_physical_memory_allocator * allocator) -{ - os_allocator * info; - MALI_DEBUG_ASSERT_POINTER(allocator); - MALI_DEBUG_ASSERT_POINTER(allocator->ctx); - info = (os_allocator*)allocator->ctx; - _mali_osk_lock_term(info->mutex); - _mali_osk_free(info); - _mali_osk_free(allocator); -} - -static mali_physical_memory_allocation_result os_allocator_allocate(void* ctx, mali_allocation_engine * engine, mali_memory_allocation * descriptor, u32* offset, mali_physical_memory_allocation * alloc_info) -{ - mali_physical_memory_allocation_result result = MALI_MEM_ALLOC_NONE; - u32 left; - os_allocator * info; - os_allocation * allocation; - int pages_allocated = 0; - _mali_osk_errcode_t err = _MALI_OSK_ERR_OK; - - MALI_DEBUG_ASSERT_POINTER(ctx); - MALI_DEBUG_ASSERT_POINTER(engine); - MALI_DEBUG_ASSERT_POINTER(descriptor); - MALI_DEBUG_ASSERT_POINTER(offset); - MALI_DEBUG_ASSERT_POINTER(alloc_info); - - info = (os_allocator*)ctx; - left = descriptor->size - *offset; - - if (_MALI_OSK_ERR_OK != _mali_osk_lock_wait(info->mutex, _MALI_OSK_LOCKMODE_RW)) return MALI_MEM_ALLOC_INTERNAL_FAILURE; - - /** @note this code may not work on Linux, or may require a more complex Linux implementation */ - allocation = _mali_osk_malloc(sizeof(os_allocation)); - if (NULL != allocation) - { - u32 os_mem_max_usage = info->num_pages_max * _MALI_OSK_CPU_PAGE_SIZE; - allocation->offset_start = *offset; - allocation->num_pages = ((left + _MALI_OSK_CPU_PAGE_SIZE - 1) & ~(_MALI_OSK_CPU_PAGE_SIZE - 1)) >> _MALI_OSK_CPU_PAGE_ORDER; - MALI_DEBUG_PRINT(6, ("Allocating page array of size %d bytes\n", allocation->num_pages * sizeof(struct page*))); - - while (left > 0) - { - err = mali_allocation_engine_map_physical(engine, descriptor, *offset, MALI_MEMORY_ALLOCATION_OS_ALLOCATED_PHYSADDR_MAGIC, info->cpu_usage_adjust, _MALI_OSK_CPU_PAGE_SIZE); - if ( _MALI_OSK_ERR_OK != err) - { - if ( _MALI_OSK_ERR_NOMEM == err) - { - /* 'Partial' allocation (or, out-of-memory on first page) */ - break; - } - - MALI_DEBUG_PRINT(1, ("Mapping of physical memory failed\n")); - - /* Fatal error, cleanup any previous pages allocated. */ - if ( pages_allocated > 0 ) - { - mali_allocation_engine_unmap_physical( engine, descriptor, allocation->offset_start, _MALI_OSK_CPU_PAGE_SIZE*pages_allocated, _MALI_OSK_MEM_MAPREGION_FLAG_OS_ALLOCATED_PHYSADDR ); - /* (*offset) doesn't need to be restored; it will not be used by the caller on failure */ - } - - pages_allocated = 0; - - result = MALI_MEM_ALLOC_INTERNAL_FAILURE; - break; - } - - /* Loop iteration */ - if (left < _MALI_OSK_CPU_PAGE_SIZE) left = 0; - else left -= _MALI_OSK_CPU_PAGE_SIZE; - - pages_allocated++; - - *offset += _MALI_OSK_CPU_PAGE_SIZE; - } - - if (left) MALI_PRINT(("Out of memory. Mali memory allocated: %d kB Configured maximum OS memory usage: %d kB\n", - (info->num_pages_allocated * _MALI_OSK_CPU_PAGE_SIZE)/1024, (info->num_pages_max* _MALI_OSK_CPU_PAGE_SIZE)/1024)); - - /* Loop termination; decide on result */ - if (pages_allocated) - { - MALI_DEBUG_PRINT(6, ("Allocated %d pages\n", pages_allocated)); - if (left) result = MALI_MEM_ALLOC_PARTIAL; - else result = MALI_MEM_ALLOC_FINISHED; - - /* Some OS do not perform a full cache flush (including all outer caches) for uncached mapped memory. - * They zero the memory through a cached mapping, then flush the inner caches but not the outer caches. - * This is required for MALI to have the correct view of the memory. - */ - _mali_osk_cache_ensure_uncached_range_flushed( (void *)descriptor, allocation->offset_start, pages_allocated *_MALI_OSK_CPU_PAGE_SIZE ); - allocation->num_pages = pages_allocated; - allocation->engine = engine; /* Necessary to make the engine's unmap call */ - allocation->descriptor = descriptor; /* Necessary to make the engine's unmap call */ - info->num_pages_allocated += pages_allocated; - - MALI_DEBUG_PRINT(6, ("%d out of %d pages now allocated\n", info->num_pages_allocated, info->num_pages_max)); - - alloc_info->ctx = info; - alloc_info->handle = allocation; - alloc_info->release = os_allocator_release; - } - else - { - MALI_DEBUG_PRINT(6, ("Releasing pages array due to no pages allocated\n")); - _mali_osk_free( allocation ); - } - } - - _mali_osk_lock_signal(info->mutex, _MALI_OSK_LOCKMODE_RW); - - return result; -} - -static void os_allocator_release(void * ctx, void * handle) -{ - os_allocator * info; - os_allocation * allocation; - mali_allocation_engine * engine; - mali_memory_allocation * descriptor; - - MALI_DEBUG_ASSERT_POINTER(ctx); - MALI_DEBUG_ASSERT_POINTER(handle); - - info = (os_allocator*)ctx; - allocation = (os_allocation*)handle; - engine = allocation->engine; - descriptor = allocation->descriptor; - - MALI_DEBUG_ASSERT_POINTER( engine ); - MALI_DEBUG_ASSERT_POINTER( descriptor ); - - if (_MALI_OSK_ERR_OK != _mali_osk_lock_wait(info->mutex, _MALI_OSK_LOCKMODE_RW)) - { - MALI_DEBUG_PRINT(1, ("allocator release: Failed to get mutex\n")); - return; - } - - MALI_DEBUG_PRINT(6, ("Releasing %d os pages\n", allocation->num_pages)); - - MALI_DEBUG_ASSERT( allocation->num_pages <= info->num_pages_allocated); - info->num_pages_allocated -= allocation->num_pages; - - mali_allocation_engine_unmap_physical( engine, descriptor, allocation->offset_start, _MALI_OSK_CPU_PAGE_SIZE*allocation->num_pages, _MALI_OSK_MEM_MAPREGION_FLAG_OS_ALLOCATED_PHYSADDR ); - - _mali_osk_lock_signal(info->mutex, _MALI_OSK_LOCKMODE_RW); - - _mali_osk_free(allocation); -} - -static mali_physical_memory_allocation_result os_allocator_allocate_page_table_block(void * ctx, mali_page_table_block * block) -{ -#if defined(CONFIG_MACH_KONA) -#ifndef CONFIG_FORCE_MAX_ZONEORDER - int allocation_order = 10; -#else - int allocation_order = CONFIG_FORCE_MAX_ZONEORDER - 1; -#endif -#else - int allocation_order = 11; /* _MALI_OSK_CPU_PAGE_SIZE << 6 */ -#endif - void *virt = NULL; - u32 size = _MALI_OSK_CPU_PAGE_SIZE << allocation_order; - os_allocator * info; - - u32 cpu_phys_base; - - MALI_DEBUG_ASSERT_POINTER(ctx); - info = (os_allocator*)ctx; - - /* Ensure we don't allocate more than we're supposed to from the ctx */ - if (_MALI_OSK_ERR_OK != _mali_osk_lock_wait(info->mutex, _MALI_OSK_LOCKMODE_RW)) return MALI_MEM_ALLOC_INTERNAL_FAILURE; - - /* if the number of pages to be requested lead to exceeding the memory - * limit in info->num_pages_max, reduce the size that is to be requested. */ - while ( (info->num_pages_allocated + (1 << allocation_order) > info->num_pages_max) - && _mali_osk_mem_check_allocated(info->num_pages_max * _MALI_OSK_CPU_PAGE_SIZE) ) - { - if ( allocation_order > 0 ) { - --allocation_order; - } else { - /* return OOM */ - _mali_osk_lock_signal(info->mutex, _MALI_OSK_LOCKMODE_RW); - return MALI_MEM_ALLOC_NONE; - } - } - - /* try to allocate 2^(allocation_order) pages, if that fails, try - * allocation_order-1 to allocation_order 0 (inclusive) */ - while ( allocation_order >= 0 ) - { - size = _MALI_OSK_CPU_PAGE_SIZE << allocation_order; - virt = _mali_osk_mem_allocioregion( &cpu_phys_base, size ); - - if (NULL != virt) break; - - --allocation_order; - } - - if ( NULL == virt ) - { - MALI_DEBUG_PRINT(1, ("Failed to allocate consistent memory. Is CONSISTENT_DMA_SIZE set too low?\n")); - /* return OOM */ - _mali_osk_lock_signal(info->mutex, _MALI_OSK_LOCKMODE_RW); - return MALI_MEM_ALLOC_NONE; - } - - MALI_DEBUG_PRINT(5, ("os_allocator_allocate_page_table_block: Allocation of order %i succeeded\n", - allocation_order)); - - /* we now know the size of the allocation since we know for what - * allocation_order the allocation succeeded */ - size = _MALI_OSK_CPU_PAGE_SIZE << allocation_order; - - - block->release = os_allocator_page_table_block_release; - block->ctx = ctx; - block->handle = (void*)allocation_order; - block->size = size; - block->phys_base = cpu_phys_base - info->cpu_usage_adjust; - block->mapping = virt; - - info->num_pages_allocated += (1 << allocation_order); - - _mali_osk_lock_signal(info->mutex, _MALI_OSK_LOCKMODE_RW); - - return MALI_MEM_ALLOC_FINISHED; -} - -static void os_allocator_page_table_block_release( mali_page_table_block *page_table_block ) -{ - os_allocator * info; - u32 allocation_order; - u32 pages_allocated; - - MALI_DEBUG_ASSERT_POINTER( page_table_block ); - - info = (os_allocator*)page_table_block->ctx; - - MALI_DEBUG_ASSERT_POINTER( info ); - - allocation_order = (u32)page_table_block->handle; - - pages_allocated = 1 << allocation_order; - - MALI_DEBUG_ASSERT( pages_allocated * _MALI_OSK_CPU_PAGE_SIZE == page_table_block->size ); - - if (_MALI_OSK_ERR_OK != _mali_osk_lock_wait(info->mutex, _MALI_OSK_LOCKMODE_RW)) - { - MALI_DEBUG_PRINT(1, ("allocator release: Failed to get mutex\n")); - return; - } - - MALI_DEBUG_ASSERT( pages_allocated <= info->num_pages_allocated); - info->num_pages_allocated -= pages_allocated; - - /* Adjust phys_base from mali physical address to CPU physical address */ - _mali_osk_mem_freeioregion( page_table_block->phys_base + info->cpu_usage_adjust, page_table_block->size, page_table_block->mapping ); - - _mali_osk_lock_signal(info->mutex, _MALI_OSK_LOCKMODE_RW); -} |