diff options
Diffstat (limited to 'drivers/media/video/samsung/mali/common/mali_kernel_core.c')
-rw-r--r-- | drivers/media/video/samsung/mali/common/mali_kernel_core.c | 980 |
1 files changed, 0 insertions, 980 deletions
diff --git a/drivers/media/video/samsung/mali/common/mali_kernel_core.c b/drivers/media/video/samsung/mali/common/mali_kernel_core.c deleted file mode 100644 index 45e86d2..0000000 --- a/drivers/media/video/samsung/mali/common/mali_kernel_core.c +++ /dev/null @@ -1,980 +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_session.h" -#include "mali_osk.h" -#include "mali_osk_mali.h" -#include "mali_ukk.h" -#include "mali_kernel_core.h" -#include "mali_memory.h" -#include "mali_mem_validation.h" -#include "mali_mmu.h" -#include "mali_mmu_page_directory.h" -#include "mali_dlbu.h" -#include "mali_gp.h" -#include "mali_pp.h" -#include "mali_gp_scheduler.h" -#include "mali_pp_scheduler.h" -#include "mali_cluster.h" -#include "mali_group.h" -#include "mali_pm.h" -#include "mali_pmu.h" -#include "mali_scheduler.h" -#ifdef CONFIG_MALI400_GPU_UTILIZATION -#include "mali_kernel_utilization.h" -#endif -#include "mali_l2_cache.h" -#if MALI_TIMELINE_PROFILING_ENABLED -#include "mali_osk_profiling.h" -#endif - -/** Pointer to table of resource definitions available to the Mali driver. - * _mali_osk_resources_init() sets up the pointer to this table. - */ -static _mali_osk_resource_t *arch_configuration = NULL; - -/** Start profiling from module load? */ -int mali_boot_profiling = 0; - -/** Number of resources initialized by _mali_osk_resources_init() */ -static u32 num_resources; - -static _mali_product_id_t global_product_id = _MALI_PRODUCT_ID_UNKNOWN; -static u32 global_gpu_base_address = 0; -static u32 global_gpu_major_version = 0; -static u32 global_gpu_minor_version = 0; - -static u32 first_pp_offset = 0; - -#define HANG_CHECK_MSECS_DEFAULT 500 /* 500 ms */ -#define WATCHDOG_MSECS_DEFAULT 4000 /* 4 s */ - -/* timer related */ -int mali_max_job_runtime = WATCHDOG_MSECS_DEFAULT; -int mali_hang_check_interval = HANG_CHECK_MSECS_DEFAULT; - -static _mali_osk_resource_t *mali_find_resource(_mali_osk_resource_type_t type, u32 offset) -{ - int i; - u32 addr = global_gpu_base_address + offset; - - for (i = 0; i < num_resources; i++) - { - if (type == arch_configuration[i].type && arch_configuration[i].base == addr) - { - return &(arch_configuration[i]); - } - } - - return NULL; -} - -static u32 mali_count_resources(_mali_osk_resource_type_t type) -{ - int i; - u32 retval = 0; - - for (i = 0; i < num_resources; i++) - { - if (type == arch_configuration[i].type) - { - retval++; - } - } - - return retval; -} - - -static _mali_osk_errcode_t mali_parse_gpu_base_and_first_pp_offset_address(void) -{ - int i; - _mali_osk_resource_t *first_gp_resource = NULL; - _mali_osk_resource_t *first_pp_resource = NULL; - - for (i = 0; i < num_resources; i++) - { - if (MALI_GP == arch_configuration[i].type) - { - if (NULL == first_gp_resource || first_gp_resource->base > arch_configuration[i].base) - { - first_gp_resource = &(arch_configuration[i]); - } - } - if (MALI_PP == arch_configuration[i].type) - { - if (NULL == first_pp_resource || first_pp_resource->base > arch_configuration[i].base) - { - first_pp_resource = &(arch_configuration[i]); - } - } - } - - if (NULL == first_gp_resource || NULL == first_pp_resource) - { - MALI_PRINT_ERROR(("No GP+PP core specified in config file\n")); - return _MALI_OSK_ERR_FAULT; - } - - if (first_gp_resource->base < first_pp_resource->base) - { - /* GP is first, so we are dealing with Mali-300, Mali-400 or Mali-450 */ - global_gpu_base_address = first_gp_resource->base; - first_pp_offset = 0x8000; - } - else - { - /* PP is first, so we are dealing with Mali-200 */ - global_gpu_base_address = first_pp_resource->base; - first_pp_offset = 0x0; - } - MALI_SUCCESS; -} - -static _mali_osk_errcode_t mali_parse_product_info(void) -{ - _mali_osk_resource_t *first_pp_resource = NULL; - - /* Find the first PP core */ - first_pp_resource = mali_find_resource(MALI_PP, first_pp_offset); - if (NULL != first_pp_resource) - { - /* Create a dummy PP object for this core so that we can read the version register */ - struct mali_group *group = mali_group_create(NULL, NULL); - if (NULL != group) - { - /*struct mali_pp_core *pp_core = mali_pp_create(first_pp_resource, group, 0);*/ - struct mali_pp_core *pp_core = mali_pp_create(first_pp_resource, group); - if (NULL != pp_core) - { - u32 pp_version = mali_pp_core_get_version(pp_core); - mali_pp_delete(pp_core); - mali_group_delete(group); - - global_gpu_major_version = (pp_version >> 8) & 0xFF; - global_gpu_minor_version = pp_version & 0xFF; - - switch (pp_version >> 16) - { - case MALI200_PP_PRODUCT_ID: - global_product_id = _MALI_PRODUCT_ID_MALI200; - MALI_DEBUG_PRINT(2, ("Found Mali GPU Mali-200 r%up%u\n", global_gpu_major_version, global_gpu_minor_version)); - break; - case MALI300_PP_PRODUCT_ID: - global_product_id = _MALI_PRODUCT_ID_MALI300; - MALI_DEBUG_PRINT(2, ("Found Mali GPU Mali-300 r%up%u\n", global_gpu_major_version, global_gpu_minor_version)); - break; - case MALI400_PP_PRODUCT_ID: - global_product_id = _MALI_PRODUCT_ID_MALI400; - MALI_DEBUG_PRINT(2, ("Found Mali GPU Mali-400 MP r%up%u\n", global_gpu_major_version, global_gpu_minor_version)); - break; - case MALI450_PP_PRODUCT_ID: - global_product_id = _MALI_PRODUCT_ID_MALI450; - MALI_DEBUG_PRINT(2, ("Found Mali GPU Mali-450 MP r%up%u\n", global_gpu_major_version, global_gpu_minor_version)); - break; - default: - MALI_DEBUG_PRINT(2, ("Found unknown Mali GPU GPU (r%up%u)\n", global_gpu_major_version, global_gpu_minor_version)); - return _MALI_OSK_ERR_FAULT; - } - - return _MALI_OSK_ERR_OK; - } - else - { - MALI_PRINT_ERROR(("Failed to create initial PP object\n")); - } - } - else - { - MALI_PRINT_ERROR(("Failed to create initial group object\n")); - } - } - else - { - MALI_PRINT_ERROR(("First PP core not specified in config file\n")); - } - - return _MALI_OSK_ERR_FAULT; -} - -static void mali_delete_clusters(void) -{ - u32 i; - u32 number_of_clusters = mali_cluster_get_glob_num_clusters(); - - for (i = 0; i < number_of_clusters; i++) - { - mali_cluster_delete(mali_cluster_get_global_cluster(i)); - } -} - -static _mali_osk_errcode_t mali_create_cluster(_mali_osk_resource_t *resource) -{ - if (NULL != resource) - { - struct mali_l2_cache_core *l2_cache; - - if (mali_l2_cache_core_get_glob_num_l2_cores() >= mali_l2_cache_core_get_max_num_l2_cores()) - { - MALI_PRINT_ERROR(("Found too many L2 cache core objects, max %u is supported\n", mali_l2_cache_core_get_max_num_l2_cores())); - return _MALI_OSK_ERR_FAULT; - } - - MALI_DEBUG_PRINT(3, ("Found L2 cache %s, starting new cluster\n", resource->description)); - - /*l2_cache = mali_l2_cache_create(resource, global_num_l2_cache_cores);*/ - l2_cache = mali_l2_cache_create(resource); - if (NULL == l2_cache) - { - MALI_PRINT_ERROR(("Failed to create L2 cache object\n")); - return _MALI_OSK_ERR_FAULT; - } - - if (NULL == mali_cluster_create(l2_cache)) - { - MALI_PRINT_ERROR(("Failed to create cluster object\n")); - mali_l2_cache_delete(l2_cache); - return _MALI_OSK_ERR_FAULT; - } - } - else - { - mali_cluster_create(NULL); - if (NULL == mali_cluster_get_global_cluster(0)) - { - MALI_PRINT_ERROR(("Failed to create cluster object\n")); - return _MALI_OSK_ERR_FAULT; - } - } - - MALI_DEBUG_PRINT(3, ("Created cluster object\n")); - return _MALI_OSK_ERR_OK; -} - -static _mali_osk_errcode_t mali_parse_config_cluster(void) -{ - if (_MALI_PRODUCT_ID_MALI200 == global_product_id) - { - /* Create dummy cluster without L2 cache */ - return mali_create_cluster(NULL); - } - else if (_MALI_PRODUCT_ID_MALI300 == global_product_id || _MALI_PRODUCT_ID_MALI400 == global_product_id) - { - _mali_osk_resource_t *l2_resource = mali_find_resource(MALI_L2, 0x1000); - if (NULL == l2_resource) - { - MALI_DEBUG_PRINT(3, ("Did not find required Mali L2 cache in config file\n")); - return _MALI_OSK_ERR_FAULT; - } - - return mali_create_cluster(l2_resource); - } - else if (_MALI_PRODUCT_ID_MALI450 == global_product_id) - { - /* - * L2 for GP at 0x10000 - * L2 for PP0-3 at 0x01000 - * L2 for PP4-7 at 0x11000 (optional) - */ - - _mali_osk_resource_t *l2_gp_resource; - _mali_osk_resource_t *l2_pp_grp0_resource; - _mali_osk_resource_t *l2_pp_grp1_resource; - - /* Make cluster for GP's L2 */ - l2_gp_resource = mali_find_resource(MALI_L2, 0x10000); - if (NULL != l2_gp_resource) - { - _mali_osk_errcode_t ret; - MALI_DEBUG_PRINT(3, ("Creating Mali-450 cluster for GP\n")); - ret = mali_create_cluster(l2_gp_resource); - if (_MALI_OSK_ERR_OK != ret) - { - return ret; - } - } - else - { - MALI_DEBUG_PRINT(3, ("Did not find required Mali L2 cache for GP in config file\n")); - return _MALI_OSK_ERR_FAULT; - } - - /* Make cluster for first PP core group */ - l2_pp_grp0_resource = mali_find_resource(MALI_L2, 0x1000); - if (NULL != l2_pp_grp0_resource) - { - _mali_osk_errcode_t ret; - MALI_DEBUG_PRINT(3, ("Creating Mali-450 cluster for PP group 0\n")); - ret = mali_create_cluster(l2_pp_grp0_resource); - if (_MALI_OSK_ERR_OK != ret) - { - return ret; - } - } - else - { - MALI_DEBUG_PRINT(3, ("Did not find required Mali L2 cache for PP group 0 in config file\n")); - return _MALI_OSK_ERR_FAULT; - } - - /* Second PP core group is optional, don't fail if we don't find it */ - l2_pp_grp1_resource = mali_find_resource(MALI_L2, 0x11000); - if (NULL != l2_pp_grp1_resource) - { - _mali_osk_errcode_t ret; - MALI_DEBUG_PRINT(3, ("Creating Mali-450 cluster for PP group 0\n")); - ret = mali_create_cluster(l2_pp_grp1_resource); - if (_MALI_OSK_ERR_OK != ret) - { - return ret; - } - } - } - - return _MALI_OSK_ERR_OK; -} - -static _mali_osk_errcode_t mali_create_group(struct mali_cluster *cluster, - _mali_osk_resource_t *resource_mmu, - _mali_osk_resource_t *resource_gp, - _mali_osk_resource_t *resource_pp) -{ - struct mali_mmu_core *mmu; - struct mali_group *group; - struct mali_pp_core *pp; - - MALI_DEBUG_PRINT(3, ("Starting new group for MMU %s\n", resource_mmu->description)); - - /* Create the MMU object */ - mmu = mali_mmu_create(resource_mmu); - if (NULL == mmu) - { - MALI_PRINT_ERROR(("Failed to create MMU object\n")); - return _MALI_OSK_ERR_FAULT; - } - - /* Create the group object */ - group = mali_group_create(cluster, mmu); - if (NULL == group) - { - MALI_PRINT_ERROR(("Failed to create group object for MMU %s\n", resource_mmu->description)); - mali_mmu_delete(mmu); - return _MALI_OSK_ERR_FAULT; - } - - /* Set pointer back to group in mmu.*/ - mali_mmu_set_group(mmu, group); - - /* Add this group to current cluster */ - mali_cluster_add_group(cluster, group); - - if (NULL != resource_gp) - { - /* Create the GP core object inside this group */ - /* global_gp_core = mali_gp_create(resource_gp, group); */ - if (NULL == mali_gp_create(resource_gp, group)) - { - /* No need to clean up now, as we will clean up everything linked in from the cluster when we fail this function */ - MALI_PRINT_ERROR(("Failed to create GP object\n")); - return _MALI_OSK_ERR_FAULT; - } - - /* Add GP object to this group */ - MALI_DEBUG_PRINT(3, ("Adding GP %s to group\n", resource_gp->description)); - mali_group_add_gp_core(group, mali_gp_get_global_gp_core()); - } - - if (NULL != resource_pp) - { - /* Create the PP core object inside this group */ - pp = mali_pp_create(resource_pp, group); - - if (NULL == pp) - { - /* No need to clean up now, as we will clean up everything linked in from the cluster when we fail this function */ - MALI_PRINT_ERROR(("Failed to create PP object\n")); - return _MALI_OSK_ERR_FAULT; - } - - /* Add PP object to this group */ - MALI_DEBUG_PRINT(3, ("Adding PP %s to group\n", resource_pp->description)); - mali_group_add_pp_core(group, pp); - } - - return _MALI_OSK_ERR_OK; -} - -static _mali_osk_errcode_t mali_parse_config_groups(void) -{ - if (_MALI_PRODUCT_ID_MALI200 == global_product_id) - { - _mali_osk_resource_t *resource_gp; - _mali_osk_resource_t *resource_pp; - _mali_osk_resource_t *resource_mmu; - - MALI_DEBUG_ASSERT(1 == mali_cluster_get_glob_num_clusters()); - - resource_gp = mali_find_resource(MALI_GP, 0x02000); - resource_pp = mali_find_resource(MALI_PP, 0x00000); - resource_mmu = mali_find_resource(MMU, 0x03000); - - if (NULL == resource_mmu || NULL == resource_gp || NULL == resource_pp) - { - /* Missing mandatory core(s) */ - return _MALI_OSK_ERR_FAULT; - } - - /*return mali_create_group(global_clusters[0], resource_mmu, resource_gp, resource_pp);*/ - return mali_create_group(mali_cluster_get_global_cluster(0), resource_mmu, resource_gp, resource_pp); - } - else if (_MALI_PRODUCT_ID_MALI300 == global_product_id || - _MALI_PRODUCT_ID_MALI400 == global_product_id || - _MALI_PRODUCT_ID_MALI450 == global_product_id) - { - _mali_osk_errcode_t err; - int cluster_id_gp = 0; - int cluster_id_pp_grp0 = 0; - int cluster_id_pp_grp1 = 0; - int i; - _mali_osk_resource_t *resource_gp; - _mali_osk_resource_t *resource_gp_mmu; - _mali_osk_resource_t *resource_pp[mali_pp_get_max_num_pp_cores()]; - _mali_osk_resource_t *resource_pp_mmu[mali_pp_get_max_num_pp_cores()]; - u32 max_num_pp_cores = mali_pp_get_max_num_pp_cores(); - - if (_MALI_PRODUCT_ID_MALI450 == global_product_id) - { - /* Mali-450 has separate L2s for GP, and PP core group(s) */ - cluster_id_pp_grp0 = 1; - cluster_id_pp_grp1 = 2; - } - - resource_gp = mali_find_resource(MALI_GP, 0x00000); - resource_gp_mmu = mali_find_resource(MMU, 0x03000); - resource_pp[0] = mali_find_resource(MALI_PP, 0x08000); - resource_pp[1] = mali_find_resource(MALI_PP, 0x0A000); - resource_pp[2] = mali_find_resource(MALI_PP, 0x0C000); - resource_pp[3] = mali_find_resource(MALI_PP, 0x0E000); - resource_pp[4] = mali_find_resource(MALI_PP, 0x28000); - resource_pp[5] = mali_find_resource(MALI_PP, 0x2A000); - resource_pp[6] = mali_find_resource(MALI_PP, 0x2C000); - resource_pp[7] = mali_find_resource(MALI_PP, 0x2E000); - resource_pp_mmu[0] = mali_find_resource(MMU, 0x04000); - resource_pp_mmu[1] = mali_find_resource(MMU, 0x05000); - resource_pp_mmu[2] = mali_find_resource(MMU, 0x06000); - resource_pp_mmu[3] = mali_find_resource(MMU, 0x07000); - resource_pp_mmu[4] = mali_find_resource(MMU, 0x1C000); - resource_pp_mmu[5] = mali_find_resource(MMU, 0x1D000); - resource_pp_mmu[6] = mali_find_resource(MMU, 0x1E000); - resource_pp_mmu[7] = mali_find_resource(MMU, 0x1F000); - - if (NULL == resource_gp || NULL == resource_gp_mmu || NULL == resource_pp[0] || NULL == resource_pp_mmu[0]) - { - /* Missing mandatory core(s) */ - MALI_DEBUG_PRINT(2, ("Missing mandatory resource, need at least one GP and one PP, both with a separate MMU (0x%08X, 0x%08X, 0x%08X, 0x%08X)\n", - resource_gp, resource_gp_mmu, resource_pp[0], resource_pp_mmu[0])); - return _MALI_OSK_ERR_FAULT; - } - - MALI_DEBUG_ASSERT(1 <= mali_cluster_get_glob_num_clusters()); - err = mali_create_group(mali_cluster_get_global_cluster(cluster_id_gp), resource_gp_mmu, resource_gp, NULL); - if (err != _MALI_OSK_ERR_OK) - { - return err; - } - - /* Create group for first (and mandatory) PP core */ - MALI_DEBUG_ASSERT(mali_cluster_get_glob_num_clusters() >= (cluster_id_pp_grp0 + 1)); /* >= 1 on Mali-300 and Mali-400, >= 2 on Mali-450 */ - err = mali_create_group(mali_cluster_get_global_cluster(cluster_id_pp_grp0), resource_pp_mmu[0], NULL, resource_pp[0]); - if (err != _MALI_OSK_ERR_OK) - { - return err; - } - - /* Create groups for rest of the cores in the first PP core group */ - for (i = 1; i < 4; i++) /* First half of the PP cores belong to first core group */ - { - if (NULL != resource_pp[i]) - { - err = mali_create_group(mali_cluster_get_global_cluster(cluster_id_pp_grp0), resource_pp_mmu[i], NULL, resource_pp[i]); - if (err != _MALI_OSK_ERR_OK) - { - return err; - } - } - } - - /* Create groups for cores in the second PP core group */ - for (i = 4; i < max_num_pp_cores; i++) /* Second half of the PP cores belong to second core group */ - { - if (NULL != resource_pp[i]) - { - MALI_DEBUG_ASSERT(mali_cluster_get_glob_num_clusters() >= 2); /* Only Mali-450 have more than 4 PPs, and these cores belong to second core group */ - err = mali_create_group(mali_cluster_get_global_cluster(cluster_id_pp_grp1), resource_pp_mmu[i], NULL, resource_pp[i]); - if (err != _MALI_OSK_ERR_OK) - { - return err; - } - } - } - } - - return _MALI_OSK_ERR_OK; -} - -static _mali_osk_errcode_t mali_parse_config_pmu(void) -{ - _mali_osk_errcode_t err = _MALI_OSK_ERR_OK; - _mali_osk_resource_t *resource_pmu; - u32 number_of_pp_cores; - u32 number_of_l2_caches; - - resource_pmu = mali_find_resource(PMU, 0x02000); - number_of_pp_cores = mali_count_resources(MALI_PP); - number_of_l2_caches = mali_count_resources(MALI_L2); - - if (NULL != resource_pmu) - { - if (NULL == mali_pmu_create(resource_pmu, number_of_pp_cores, number_of_l2_caches)) - { - err = _MALI_OSK_ERR_FAULT; - } - } - return err; -} - -static _mali_osk_errcode_t mali_parse_config_memory(void) -{ - int i; - _mali_osk_errcode_t ret; - - for(i = 0; i < num_resources; i++) - { - switch(arch_configuration[i].type) - { - case OS_MEMORY: - ret = mali_memory_core_resource_os_memory(&arch_configuration[i]); - if (_MALI_OSK_ERR_OK != ret) - { - MALI_PRINT_ERROR(("Failed to register OS_MEMORY\n")); - mali_memory_terminate(); - return ret; - } - break; - case MEMORY: - ret = mali_memory_core_resource_dedicated_memory(&arch_configuration[i]); - if (_MALI_OSK_ERR_OK != ret) - { - MALI_PRINT_ERROR(("Failed to register MEMORY\n")); - mali_memory_terminate(); - return ret; - } - break; - case MEM_VALIDATION: - ret = mali_mem_validation_add_range(&arch_configuration[i]); - if (_MALI_OSK_ERR_OK != ret) - { - MALI_PRINT_ERROR(("Failed to register MEM_VALIDATION\n")); - mali_memory_terminate(); - return ret; - } - break; - default: - break; - } - } - return _MALI_OSK_ERR_OK; -} - -_mali_osk_errcode_t mali_initialize_subsystems(void) -{ - _mali_osk_errcode_t err; - mali_bool is_pmu_enabled; - - err = mali_session_initialize(); - if (_MALI_OSK_ERR_OK != err) goto session_init_failed; - -#if MALI_TIMELINE_PROFILING_ENABLED - err = _mali_osk_profiling_init(mali_boot_profiling ? MALI_TRUE : MALI_FALSE); - if (_MALI_OSK_ERR_OK != err) - { - /* No biggie if we wheren't able to initialize the profiling */ - MALI_PRINT_ERROR(("Failed to initialize profiling, feature will be unavailable\n")); - } -#endif - - /* Get data from config.h */ - err = _mali_osk_resources_init(&arch_configuration, &num_resources); - if (_MALI_OSK_ERR_OK != err) goto osk_resources_init_failed; - - /* Initialize driver subsystems */ - err = mali_memory_initialize(); - if (_MALI_OSK_ERR_OK != err) goto memory_init_failed; - - /* Configure memory early. Memory allocation needed for mali_mmu_initialize. */ - err = mali_parse_config_memory(); - if (_MALI_OSK_ERR_OK != err) goto parse_memory_config_failed; - - /* Parsing the GPU base address and first pp offset */ - err = mali_parse_gpu_base_and_first_pp_offset_address(); - if (_MALI_OSK_ERR_OK != err) goto parse_gpu_base_address_failed; - - /* Initialize the MALI PMU */ - err = mali_parse_config_pmu(); - if (_MALI_OSK_ERR_OK != err) goto parse_pmu_config_failed; - - is_pmu_enabled = mali_pmu_get_global_pmu_core() != NULL ? MALI_TRUE : MALI_FALSE; - - /* Initialize the power management module */ - err = mali_pm_initialize(); - if (_MALI_OSK_ERR_OK != err) goto pm_init_failed; - - /* Make sure the power stays on for the rest of this function */ - mali_pm_always_on(MALI_TRUE); - - /* Detect which Mali GPU we are dealing with */ - err = mali_parse_product_info(); - if (_MALI_OSK_ERR_OK != err) goto product_info_parsing_failed; - - /* The global_product_id is now populated with the correct Mali GPU */ - - /* Initialize MMU module */ - err = mali_mmu_initialize(); - if (_MALI_OSK_ERR_OK != err) goto mmu_init_failed; - - /* Initialize the DLBU module for Mali-450 */ - if (_MALI_PRODUCT_ID_MALI450 == global_product_id) - { - err = mali_dlbu_initialize(); - if (_MALI_OSK_ERR_OK != err) goto dlbu_init_failed; - } - - /* Start configuring the actual Mali hardware. */ - err = mali_parse_config_cluster(); - if (_MALI_OSK_ERR_OK != err) goto config_parsing_failed; - err = mali_parse_config_groups(); - if (_MALI_OSK_ERR_OK != err) goto config_parsing_failed; - - /* Initialize the schedulers */ - err = mali_scheduler_initialize(); - if (_MALI_OSK_ERR_OK != err) goto scheduler_init_failed; - err = mali_gp_scheduler_initialize(); - if (_MALI_OSK_ERR_OK != err) goto gp_scheduler_init_failed; - err = mali_pp_scheduler_initialize(); - if (_MALI_OSK_ERR_OK != err) goto pp_scheduler_init_failed; - -#ifdef CONFIG_MALI400_GPU_UTILIZATION - /* Initialize the GPU utilization tracking */ - err = mali_utilization_init(); - if (_MALI_OSK_ERR_OK != err) goto utilization_init_failed; -#endif - - /* We no longer need to stay */ - mali_pm_always_on(MALI_FALSE); - MALI_SUCCESS; /* all ok */ - - /* Error handling */ -#ifdef CONFIG_MALI400_GPU_UTILIZATION -utilization_init_failed: - mali_pp_scheduler_terminate(); -#endif -pp_scheduler_init_failed: - mali_gp_scheduler_terminate(); -gp_scheduler_init_failed: - mali_scheduler_terminate(); -scheduler_init_failed: -config_parsing_failed: - mali_delete_clusters(); /* Delete clusters even if config parsing failed. */ - if (_MALI_PRODUCT_ID_MALI450 == global_product_id) - { - mali_dlbu_terminate(); - } -dlbu_init_failed: - mali_mmu_terminate(); -mmu_init_failed: - /* Nothing to roll back */ -product_info_parsing_failed: - mali_pm_terminate(); -pm_init_failed: - if (is_pmu_enabled) - { - mali_pmu_delete(mali_pmu_get_global_pmu_core()); - } -parse_pmu_config_failed: -parse_gpu_base_address_failed: -parse_memory_config_failed: - mali_memory_terminate(); -memory_init_failed: - _mali_osk_resources_term(&arch_configuration, num_resources); -osk_resources_init_failed: -#if MALI_TIMELINE_PROFILING_ENABLED - _mali_osk_profiling_term(); -#endif - mali_session_terminate(); -session_init_failed: - return err; -} - -void mali_terminate_subsystems(void) -{ - struct mali_pmu_core *pmu; - - MALI_DEBUG_PRINT(2, ("terminate_subsystems() called\n")); - - /* shut down subsystems in reverse order from startup */ - - mali_pm_always_on(MALI_TRUE); /* Mali will be powered off once PM subsystem terminates */ - -#ifdef CONFIG_MALI400_GPU_UTILIZATION - mali_utilization_term(); -#endif - - mali_pp_scheduler_terminate(); - mali_gp_scheduler_terminate(); - mali_scheduler_terminate(); - - mali_delete_clusters(); /* Delete clusters even if config parsing failed. */ - - if (_MALI_PRODUCT_ID_MALI450 == global_product_id) - { - mali_dlbu_terminate(); - } - - mali_mmu_terminate(); - - pmu = mali_pmu_get_global_pmu_core(); - if (NULL != pmu) - { - mali_pmu_delete(pmu); - } - - mali_pm_terminate(); - - mali_memory_terminate(); - - _mali_osk_resources_term(&arch_configuration, num_resources); - -#if MALI_TIMELINE_PROFILING_ENABLED - _mali_osk_profiling_term(); -#endif - - mali_session_terminate(); -} - -_mali_product_id_t mali_kernel_core_get_product_id(void) -{ - return global_product_id; -} - -void mali_kernel_core_wakeup(void) -{ - u32 i; - u32 glob_num_clusters = mali_cluster_get_glob_num_clusters(); - struct mali_cluster *cluster; - - for (i = 0; i < glob_num_clusters; i++) - { - cluster = mali_cluster_get_global_cluster(i); - mali_cluster_reset(cluster); - } -} - -_mali_osk_errcode_t _mali_ukk_get_api_version( _mali_uk_get_api_version_s *args ) -{ - MALI_DEBUG_ASSERT_POINTER(args); - MALI_CHECK_NON_NULL(args->ctx, _MALI_OSK_ERR_INVALID_ARGS); - - /* check compatability */ - if ( args->version == _MALI_UK_API_VERSION ) - { - args->compatible = 1; - } - else - { - args->compatible = 0; - } - - args->version = _MALI_UK_API_VERSION; /* report our version */ - - /* success regardless of being compatible or not */ - MALI_SUCCESS; -} - -_mali_osk_errcode_t _mali_ukk_wait_for_notification( _mali_uk_wait_for_notification_s *args ) -{ - _mali_osk_errcode_t err; - _mali_osk_notification_t *notification; - _mali_osk_notification_queue_t *queue; - - /* check input */ - MALI_DEBUG_ASSERT_POINTER(args); - MALI_CHECK_NON_NULL(args->ctx, _MALI_OSK_ERR_INVALID_ARGS); - - queue = ((struct mali_session_data *)args->ctx)->ioctl_queue; - - /* if the queue does not exist we're currently shutting down */ - if (NULL == queue) - { - MALI_DEBUG_PRINT(1, ("No notification queue registered with the session. Asking userspace to stop querying\n")); - args->type = _MALI_NOTIFICATION_CORE_SHUTDOWN_IN_PROGRESS; - MALI_SUCCESS; - } - - /* receive a notification, might sleep */ - err = _mali_osk_notification_queue_receive(queue, ¬ification); - if (_MALI_OSK_ERR_OK != err) - { - MALI_ERROR(err); /* errcode returned, pass on to caller */ - } - - /* copy the buffer to the user */ - args->type = (_mali_uk_notification_type)notification->notification_type; - _mali_osk_memcpy(&args->data, notification->result_buffer, notification->result_buffer_size); - - /* finished with the notification */ - _mali_osk_notification_delete( notification ); - - MALI_SUCCESS; /* all ok */ -} - -_mali_osk_errcode_t _mali_ukk_post_notification( _mali_uk_post_notification_s *args ) -{ - _mali_osk_notification_t * notification; - _mali_osk_notification_queue_t *queue; - - /* check input */ - MALI_DEBUG_ASSERT_POINTER(args); - MALI_CHECK_NON_NULL(args->ctx, _MALI_OSK_ERR_INVALID_ARGS); - - queue = ((struct mali_session_data *)args->ctx)->ioctl_queue; - - /* if the queue does not exist we're currently shutting down */ - if (NULL == queue) - { - MALI_DEBUG_PRINT(1, ("No notification queue registered with the session. Asking userspace to stop querying\n")); - MALI_SUCCESS; - } - - notification = _mali_osk_notification_create(args->type, 0); - if ( NULL == notification) - { - MALI_PRINT_ERROR( ("Failed to create notification object\n")); - return _MALI_OSK_ERR_NOMEM; - } - - _mali_osk_notification_queue_send(queue, notification); - - MALI_SUCCESS; /* all ok */ -} - -_mali_osk_errcode_t _mali_ukk_open(void **context) -{ - struct mali_session_data *session_data; - - /* allocated struct to track this session */ - session_data = (struct mali_session_data *)_mali_osk_calloc(1, sizeof(struct mali_session_data)); - MALI_CHECK_NON_NULL(session_data, _MALI_OSK_ERR_NOMEM); - - MALI_DEBUG_PRINT(2, ("Session starting\n")); - - /* create a response queue for this session */ - session_data->ioctl_queue = _mali_osk_notification_queue_init(); - if (NULL == session_data->ioctl_queue) - { - _mali_osk_free(session_data); - MALI_ERROR(_MALI_OSK_ERR_NOMEM); - } - - session_data->page_directory = mali_mmu_pagedir_alloc(); - if (NULL == session_data->page_directory) - { - _mali_osk_notification_queue_term(session_data->ioctl_queue); - _mali_osk_free(session_data); - MALI_ERROR(_MALI_OSK_ERR_NOMEM); - } - - if (_MALI_OSK_ERR_OK != mali_mmu_pagedir_map(session_data->page_directory, MALI_DLB_VIRT_ADDR, _MALI_OSK_MALI_PAGE_SIZE)) - { - MALI_PRINT_ERROR(("Failed to map DLB page into session\n")); - _mali_osk_notification_queue_term(session_data->ioctl_queue); - _mali_osk_free(session_data); - MALI_ERROR(_MALI_OSK_ERR_NOMEM); - } - - if (0 != mali_dlbu_phys_addr) - { - mali_mmu_pagedir_update(session_data->page_directory, MALI_DLB_VIRT_ADDR, mali_dlbu_phys_addr, _MALI_OSK_MALI_PAGE_SIZE, MALI_CACHE_STANDARD); - } - - if (_MALI_OSK_ERR_OK != mali_memory_session_begin(session_data)) - { - mali_mmu_pagedir_free(session_data->page_directory); - _mali_osk_notification_queue_term(session_data->ioctl_queue); - _mali_osk_free(session_data); - MALI_ERROR(_MALI_OSK_ERR_NOMEM); - } - - *context = (void*)session_data; - - /* Add session to the list of all sessions. */ - mali_session_add(session_data); - - MALI_DEBUG_PRINT(3, ("Session started\n")); - MALI_SUCCESS; -} - -_mali_osk_errcode_t _mali_ukk_close(void **context) -{ - struct mali_session_data *session; - MALI_CHECK_NON_NULL(context, _MALI_OSK_ERR_INVALID_ARGS); - session = (struct mali_session_data *)*context; - - MALI_DEBUG_PRINT(3, ("Session ending\n")); - - /* Remove session from list of all sessions. */ - mali_session_remove(session); - - /* Abort queued and running jobs */ - mali_gp_scheduler_abort_session(session); - mali_pp_scheduler_abort_session(session); - - /* Flush pending work. - * Needed to make sure all bottom half processing related to this - * session has been completed, before we free internal data structures. - */ - _mali_osk_flush_workqueue(NULL); - - /* Free remaining memory allocated to this session */ - mali_memory_session_end(session); - - /* Free session data structures */ - mali_mmu_pagedir_free(session->page_directory); - _mali_osk_notification_queue_term(session->ioctl_queue); - _mali_osk_free(session); - - *context = NULL; - - MALI_DEBUG_PRINT(2, ("Session has ended\n")); - - MALI_SUCCESS; -} - -#if MALI_STATE_TRACKING -u32 _mali_kernel_core_dump_state(char* buf, u32 size) -{ - int n = 0; /* Number of bytes written to buf */ - - n += mali_gp_scheduler_dump_state(buf + n, size - n); - n += mali_pp_scheduler_dump_state(buf + n, size - n); - - return n; -} -#endif |