X-Git-Url: http://plrg.eecs.uci.edu/git/?p=firefly-linux-kernel-4.4.55.git;a=blobdiff_plain;f=drivers%2Fgpu%2Farm%2Fmali400%2Fmali%2Flinux%2Fmali_kernel_linux.c;h=ae4fad8d7588cc8fd6e4284236e46691cf14c024;hp=0a9ada95c52bfaf8f746a348fb3f68044a9585a4;hb=c0778d1eb7829ad92288004ae5bc18206aa7af43;hpb=b83f8495b22cbf5f4b689bed88d2d79a9ff581b0 diff --git a/drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c b/drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c index 0a9ada95c52b..ae4fad8d7588 100755 --- a/drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c +++ b/drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c @@ -1,5 +1,5 @@ /** - * Copyright (C) 2010-2014 ARM Limited. All rights reserved. + * Copyright (C) 2010-2015 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. @@ -14,6 +14,7 @@ * Implementation of the Linux device driver entrypoints */ #include "../platform/rk30/custom_log.h" +#include "../platform/rk30/rk_ext.h" #include /* kernel module definitions */ #include /* file system operations */ @@ -41,12 +42,15 @@ #include "mali_kernel_license.h" #include "mali_memory.h" #include "mali_memory_dma_buf.h" +#include "mali_memory_manager.h" +#include "mali_memory_swap_alloc.h" #if defined(CONFIG_MALI400_INTERNAL_PROFILING) #include "mali_profiling_internal.h" #endif #if defined(CONFIG_MALI400_PROFILING) && defined(CONFIG_MALI_DVFS) #include "mali_osk_profiling.h" #include "mali_dvfs_policy.h" + static int is_first_resume = 1; /*Store the clk and vol for boot/insmod and mali_resume*/ static struct mali_gpu_clk_item mali_gpu_clk[2]; @@ -105,6 +109,10 @@ extern int mali_max_pp_cores_group_2; module_param(mali_max_pp_cores_group_2, int, S_IRUSR | S_IRGRP | S_IROTH); MODULE_PARM_DESC(mali_max_pp_cores_group_2, "Limit the number of PP cores to use from second PP group (Mali-450 only)."); +extern unsigned int mali_mem_swap_out_threshold_value; +module_param(mali_mem_swap_out_threshold_value, uint, S_IRUSR | S_IRGRP | S_IROTH); +MODULE_PARM_DESC(mali_mem_swap_out_threshold_value, "Threshold value used to limit how much swappable memory cached in Mali driver."); + #if defined(CONFIG_MALI_DVFS) /** the max fps the same as display vsync default 60, can set by module insert parameter */ extern int mali_max_system_fps; @@ -206,7 +214,7 @@ static struct of_device_id base_dt_ids[] = { {.compatible = "arm,mali400"}, /*-------------------------------------------------------*/ {.compatible = "arm,mali-450"}, - {.compatible = "arm,mali-utgard"}, + {.compatible = "arm,mali-470"}, {}, }; @@ -366,9 +374,6 @@ void mali_init_cpu_time_counters_on_all_cpus(int print_only) } #endif -/** rk_ext : version of rk_ext on mali_ko, aka. rk_ko_ver. */ -#define ROCKCHIP_VERSION (1) - int mali_module_init(void) { int err = 0; @@ -377,11 +382,11 @@ int mali_module_init(void) MALI_DEBUG_PRINT(2, ("Compiled: %s, time: %s.\n", __DATE__, __TIME__)); MALI_DEBUG_PRINT(2, ("Driver revision: %s\n", SVN_REV_STRING)); - I("arm_release_ver of this mali_ko is '%s', rk_ko_ver is '%d', built at '%s', on '%s'.", - SVN_REV_STRING, - ROCKCHIP_VERSION, - __TIME__, - __DATE__); + I("svn_rev_string_from_arm of this mali_ko is '%s', rk_ko_ver is '%d', built at '%s', on '%s'.", + SVN_REV_STRING, + RK_KO_VER, + __TIME__, + __DATE__); #if MALI_ENABLE_CPU_CYCLES mali_init_cpu_time_counters_on_all_cpus(0); @@ -409,7 +414,7 @@ int mali_module_init(void) MALI_DEBUG_PRINT(2, ("mali_module_init() Failed to register driver (%d)\n", err)); #ifdef MALI_FAKE_PLATFORM_DEVICE #ifndef CONFIG_MALI_DT - mali_platform_device_unregister(); + mali_platform_device_unregister(); #endif #endif mali_platform_device = NULL; @@ -429,11 +434,11 @@ int mali_module_init(void) /* Just call mali_get_current_gpu_clk_item(),to record current clk info.*/ mali_get_current_gpu_clk_item(&mali_gpu_clk[0]); _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_SINGLE | - MALI_PROFILING_EVENT_CHANNEL_GPU | - MALI_PROFILING_EVENT_REASON_SINGLE_GPU_FREQ_VOLT_CHANGE, - mali_gpu_clk[0].clock, - mali_gpu_clk[0].vol / 1000, - 0, 0, 0); + MALI_PROFILING_EVENT_CHANNEL_GPU | + MALI_PROFILING_EVENT_REASON_SINGLE_GPU_FREQ_VOLT_CHANGE, + mali_gpu_clk[0].clock, + mali_gpu_clk[0].vol / 1000, + 0, 0, 0); #endif MALI_PRINT(("Mali device driver loaded\n")); @@ -492,8 +497,10 @@ static int mali_probe(struct platform_device *pdev) int i = 0; for(i = 0; i < mali_platform_device->num_resources; i++) - dev_info(&pdev->dev, "mali_platform_device->resource[%d].start = 0x%08x\n", - i, mali_platform_device->resource[i].start); + dev_info(&pdev->dev, + "resource[%d].start = 0x%pa\n", + i, + &mali_platform_device->resource[i].start); } #ifdef CONFIG_MALI_DT @@ -672,6 +679,8 @@ static int mali_open(struct inode *inode, struct file *filp) /* link in our session data */ filp->private_data = (void *)session_data; + filp->f_mapping = mali_mem_swap_get_global_swap_file()->f_mapping; + return 0; } @@ -762,10 +771,17 @@ static int mali_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, err = post_notification_wrapper(session_data, (_mali_uk_post_notification_s __user *)arg); break; + /* rk_ext : 从对 r5p0-01rel0 集成开始, 不再使用. */ +#if 0 case MALI_IOC_GET_MALI_VERSION_IN_RK30: err = get_mali_version_in_rk30_wrapper(session_data, (_mali_uk_get_mali_version_in_rk30_s __user *)arg); break; - +#else + case MALI_IOC_GET_RK_KO_VERSION: + err = get_rk_ko_version_wrapper(session_data, (_mali_rk_ko_version_s __user *)arg); + break; +#endif + case MALI_IOC_GET_USER_SETTINGS: BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_get_user_settings_s), sizeof(u64))); err = get_user_settings_wrapper(session_data, (_mali_uk_get_user_settings_s __user *)arg); @@ -776,6 +792,11 @@ static int mali_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, err = request_high_priority_wrapper(session_data, (_mali_uk_request_high_priority_s __user *)arg); break; + case MALI_IOC_PENDING_SUBMIT: + BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_pending_submit_s), sizeof(u64))); + err = pending_submit_wrapper(session_data, (_mali_uk_pending_submit_s __user *)arg); + break; + #if defined(CONFIG_MALI400_PROFILING) case MALI_IOC_PROFILING_ADD_EVENT: BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_profiling_add_event_s), sizeof(u64))); @@ -787,93 +808,88 @@ static int mali_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, err = profiling_report_sw_counters_wrapper(session_data, (_mali_uk_sw_counters_report_s __user *)arg); break; - - case MALI_IOC_PROFILING_MEMORY_USAGE_GET: - BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_profiling_memory_usage_get_s), sizeof(u64))); - err = profiling_memory_usage_get_wrapper(session_data, (_mali_uk_profiling_memory_usage_get_s __user *)arg); + case MALI_IOC_PROFILING_STREAM_FD_GET: + BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_profiling_stream_fd_get_s), sizeof(u64))); + err = profiling_get_stream_fd_wrapper(session_data, (_mali_uk_profiling_stream_fd_get_s __user *)arg); break; + case MALI_IOC_PROILING_CONTROL_SET: + BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_profiling_control_set_s), sizeof(u64))); + err = profiling_control_set_wrapper(session_data, (_mali_uk_profiling_control_set_s __user *)arg); + break; #else case MALI_IOC_PROFILING_ADD_EVENT: /* FALL-THROUGH */ case MALI_IOC_PROFILING_REPORT_SW_COUNTERS: /* FALL-THROUGH */ - case MALI_IOC_PROFILING_MEMORY_USAGE_GET: /* FALL-THROUGH */ MALI_DEBUG_PRINT(2, ("Profiling not supported\n")); err = -ENOTTY; break; - #endif - case MALI_IOC_MEM_WRITE_SAFE: - BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_mem_write_safe_s), sizeof(u64))); - err = mem_write_safe_wrapper(session_data, (_mali_uk_mem_write_safe_s __user *)arg); + case MALI_IOC_PROFILING_MEMORY_USAGE_GET: + BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_profiling_memory_usage_get_s), sizeof(u64))); + err = mem_usage_get_wrapper(session_data, (_mali_uk_profiling_memory_usage_get_s __user *)arg); break; - case MALI_IOC_MEM_MAP_EXT: - BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_map_external_mem_s), sizeof(u64))); - err = mem_map_ext_wrapper(session_data, (_mali_uk_map_external_mem_s __user *)arg); + case MALI_IOC_MEM_ALLOC: + BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_alloc_mem_s), sizeof(u64))); + err = mem_alloc_wrapper(session_data, (_mali_uk_alloc_mem_s __user *)arg); break; - case MALI_IOC_MEM_UNMAP_EXT: - BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_unmap_external_mem_s), sizeof(u64))); - err = mem_unmap_ext_wrapper(session_data, (_mali_uk_unmap_external_mem_s __user *)arg); + case MALI_IOC_MEM_FREE: + BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_free_mem_s), sizeof(u64))); + err = mem_free_wrapper(session_data, (_mali_uk_free_mem_s __user *)arg); break; - case MALI_IOC_MEM_QUERY_MMU_PAGE_TABLE_DUMP_SIZE: - BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_query_mmu_page_table_dump_size_s), sizeof(u64))); - err = mem_query_mmu_page_table_dump_size_wrapper(session_data, (_mali_uk_query_mmu_page_table_dump_size_s __user *)arg); + case MALI_IOC_MEM_BIND: + BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_bind_mem_s), sizeof(u64))); + err = mem_bind_wrapper(session_data, (_mali_uk_bind_mem_s __user *)arg); break; - case MALI_IOC_MEM_DUMP_MMU_PAGE_TABLE: - BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_dump_mmu_page_table_s), sizeof(u64))); - err = mem_dump_mmu_page_table_wrapper(session_data, (_mali_uk_dump_mmu_page_table_s __user *)arg); + case MALI_IOC_MEM_UNBIND: + BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_unbind_mem_s), sizeof(u64))); + err = mem_unbind_wrapper(session_data, (_mali_uk_unbind_mem_s __user *)arg); break; -#if defined(CONFIG_MALI400_UMP) - - case MALI_IOC_MEM_ATTACH_UMP: - BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_attach_ump_mem_s), sizeof(u64))); - err = mem_attach_ump_wrapper(session_data, (_mali_uk_attach_ump_mem_s __user *)arg); + case MALI_IOC_MEM_COW: + BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_cow_mem_s), sizeof(u64))); + err = mem_cow_wrapper(session_data, (_mali_uk_cow_mem_s __user *)arg); break; - case MALI_IOC_MEM_RELEASE_UMP: - BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_release_ump_mem_s), sizeof(u64))); - err = mem_release_ump_wrapper(session_data, (_mali_uk_release_ump_mem_s __user *)arg); + case MALI_IOC_MEM_COW_MODIFY_RANGE: + BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_cow_modify_range_s), sizeof(u64))); + err = mem_cow_modify_range_wrapper(session_data, (_mali_uk_cow_modify_range_s __user *)arg); break; -#else + case MALI_IOC_MEM_RESIZE: + BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_mem_resize_s), sizeof(u64))); + err = mem_resize_mem_wrapper(session_data, (_mali_uk_mem_resize_s __user *)arg); + break; - case MALI_IOC_MEM_ATTACH_UMP: - case MALI_IOC_MEM_RELEASE_UMP: /* FALL-THROUGH */ - MALI_DEBUG_PRINT(2, ("UMP not supported\n")); - err = -ENOTTY; + case MALI_IOC_MEM_WRITE_SAFE: + BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_mem_write_safe_s), sizeof(u64))); + err = mem_write_safe_wrapper(session_data, (_mali_uk_mem_write_safe_s __user *)arg); break; -#endif -#ifdef CONFIG_DMA_SHARED_BUFFER - case MALI_IOC_MEM_ATTACH_DMA_BUF: - BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_attach_dma_buf_s), sizeof(u64))); - err = mali_attach_dma_buf(session_data, (_mali_uk_attach_dma_buf_s __user *)arg); + case MALI_IOC_MEM_QUERY_MMU_PAGE_TABLE_DUMP_SIZE: + BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_query_mmu_page_table_dump_size_s), sizeof(u64))); + err = mem_query_mmu_page_table_dump_size_wrapper(session_data, (_mali_uk_query_mmu_page_table_dump_size_s __user *)arg); break; - case MALI_IOC_MEM_RELEASE_DMA_BUF: - BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_release_dma_buf_s), sizeof(u64))); - err = mali_release_dma_buf(session_data, (_mali_uk_release_dma_buf_s __user *)arg); + case MALI_IOC_MEM_DUMP_MMU_PAGE_TABLE: + BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_dump_mmu_page_table_s), sizeof(u64))); + err = mem_dump_mmu_page_table_wrapper(session_data, (_mali_uk_dump_mmu_page_table_s __user *)arg); break; case MALI_IOC_MEM_DMA_BUF_GET_SIZE: +#ifdef CONFIG_DMA_SHARED_BUFFER BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_dma_buf_get_size_s), sizeof(u64))); err = mali_dma_buf_get_size(session_data, (_mali_uk_dma_buf_get_size_s __user *)arg); - break; #else - - case MALI_IOC_MEM_ATTACH_DMA_BUF: /* FALL-THROUGH */ - case MALI_IOC_MEM_RELEASE_DMA_BUF: /* FALL-THROUGH */ - case MALI_IOC_MEM_DMA_BUF_GET_SIZE: /* FALL-THROUGH */ MALI_DEBUG_PRINT(2, ("DMA-BUF not supported\n")); err = -ENOTTY; - break; #endif + break; case MALI_IOC_PP_START_JOB: BUILD_BUG_ON(!IS_ALIGNED(sizeof(_mali_uk_pp_start_job_s), sizeof(u64))); @@ -954,8 +970,7 @@ static int mali_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, return err; } - -module_init(mali_module_init); +late_initcall_sync(mali_module_init); module_exit(mali_module_exit); MODULE_LICENSE(MALI_KERNEL_LINUX_LICENSE);