_mali_osk_errcode_t mali_kernel_core_translate_cpu_to_mali_phys_range( u32 *phys_base, u32 size ) { u32 mali_phys_base; mali_phys_base = *phys_base - mem_validator.cpu_usage_adjust; MALI_CHECK( 0 == ( mali_phys_base & (~_MALI_OSK_CPU_PAGE_MASK)), _MALI_OSK_ERR_FAULT ); MALI_CHECK( 0 == ( size & (~_MALI_OSK_CPU_PAGE_MASK)), _MALI_OSK_ERR_FAULT ); MALI_CHECK_NO_ERROR( mali_kernel_core_validate_mali_phys_range( mali_phys_base, size ) ); *phys_base = mali_phys_base; MALI_SUCCESS; }
_mali_osk_errcode_t _mali_kernel_core_register_resource_handler(_mali_osk_resource_type_t type, mali_kernel_resource_registrator handler) { MALI_CHECK(type < RESOURCE_TYPE_COUNT, _MALI_OSK_ERR_INVALID_ARGS); MALI_DEBUG_ASSERT(NULL == resource_handler[type]); /* A handler for resource already exists */ resource_handler[type] = handler; MALI_SUCCESS; }
/** @note munmap handler is done by vma close handler */ static int mali_mmap(struct file * filp, struct vm_area_struct * vma) { struct mali_session_data * session_data; _mali_uk_mem_mmap_s args = {0, }; session_data = (struct mali_session_data *)filp->private_data; if (NULL == session_data) { MALI_PRINT_ERROR(("mmap called without any session data available\n")); return -EFAULT; } MALI_DEBUG_PRINT(4, ("MMap() handler: start=0x%08X, phys=0x%08X, size=0x%08X\n", (unsigned int)vma->vm_start, (unsigned int)(vma->vm_pgoff << PAGE_SHIFT), (unsigned int)(vma->vm_end - vma->vm_start)) ); /* Re-pack the arguments that mmap() packed for us */ args.ctx = session_data; args.phys_addr = vma->vm_pgoff << PAGE_SHIFT; args.size = vma->vm_end - vma->vm_start; args.ukk_private = vma; /* Call the common mmap handler */ MALI_CHECK(_MALI_OSK_ERR_OK ==_mali_ukk_mem_mmap( &args ), -EFAULT); return 0; }
_mali_osk_errcode_t mali_platform_init(struct device *dev) { MALI_CHECK(init_mali_clock(), _MALI_OSK_ERR_FAULT); mali_platform_power_mode_change(dev, MALI_POWER_MODE_ON); MALI_SUCCESS; }
/* MEM_VALIDATION resource handler */ static _mali_osk_errcode_t mali_kernel_core_resource_mem_validation(_mali_osk_resource_t * resource) { /* Check that no other MEM_VALIDATION resources exist */ MALI_CHECK( ((u32)-1) == mem_validator.phys_base, _MALI_OSK_ERR_FAULT ); /* Check restrictions on page alignment */ MALI_CHECK( 0 == (resource->base & (~_MALI_OSK_CPU_PAGE_MASK)), _MALI_OSK_ERR_FAULT ); MALI_CHECK( 0 == (resource->size & (~_MALI_OSK_CPU_PAGE_MASK)), _MALI_OSK_ERR_FAULT ); MALI_CHECK( 0 == (resource->cpu_usage_adjust & (~_MALI_OSK_CPU_PAGE_MASK)), _MALI_OSK_ERR_FAULT ); mem_validator.phys_base = resource->base; mem_validator.size = resource->size; mem_validator.cpu_usage_adjust = resource->cpu_usage_adjust; MALI_DEBUG_PRINT( 2, ("Memory Validator '%s' installed for Mali physical address base==0x%08X, size==0x%08X, cpu_adjust==0x%08X\n", resource->description, mem_validator.phys_base, mem_validator.size, mem_validator.cpu_usage_adjust )); MALI_SUCCESS; }
_mali_osk_errcode_t mali_platform_init() { MALI_CHECK(init_mali_clock(), _MALI_OSK_ERR_FAULT); #if MALI_DVFS_ENABLED if (!clk_register_map) clk_register_map = _mali_osk_mem_mapioregion( CLK_DIV_STAT_G3D, 0x20, CLK_DESC ); if(!init_mali_dvfs_status(MALI_DVFS_DEFAULT_STEP)) MALI_DEBUG_PRINT(1, ("mali_platform_init failed\n")); #endif MALI_SUCCESS; }
_mali_osk_errcode_t mali_platform_init(struct device *dev) { MALI_CHECK(init_mali_clock(), _MALI_OSK_ERR_FAULT); #ifdef CONFIG_MALI_DVFS if (!clk_register_map) clk_register_map = _mali_osk_mem_mapioregion(CLK_DIV_STAT_G3D, 0x20, CLK_DESC); maliDvfsStatus.currentStep = MALI_DVFS_DEFAULT_STEP; #endif mali_platform_power_mode_change(dev, MALI_POWER_MODE_ON); MALI_SUCCESS; }
int mem_dump_mmu_page_table_wrapper(struct mali_session_data *session_data, _mali_uk_dump_mmu_page_table_s __user * uargs) { _mali_uk_dump_mmu_page_table_s kargs; _mali_osk_errcode_t err; void *buffer; int rc = -EFAULT; /* validate input */ MALI_CHECK_NON_NULL(uargs, -EINVAL); /* the session_data pointer was validated by caller */ kargs.buffer = NULL; /* get location of user buffer */ if (0 != get_user(buffer, &uargs->buffer)) goto err_exit; /* get size of mmu page table info buffer from user space */ if ( 0 != get_user(kargs.size, &uargs->size) ) goto err_exit; /* verify we can access the whole of the user buffer */ if (!access_ok(VERIFY_WRITE, buffer, kargs.size)) goto err_exit; /* allocate temporary buffer (kernel side) to store mmu page table info */ MALI_CHECK(kargs.size > 0, -ENOMEM); kargs.buffer = _mali_osk_valloc(kargs.size); if (NULL == kargs.buffer) { rc = -ENOMEM; goto err_exit; } kargs.ctx = session_data; err = _mali_ukk_dump_mmu_page_table(&kargs); if (_MALI_OSK_ERR_OK != err) { rc = map_errcode(err); goto err_exit; } /* copy mmu page table info back to user space and update pointers */ if (0 != copy_to_user(uargs->buffer, kargs.buffer, kargs.size) ) goto err_exit; if (0 != put_user((kargs.register_writes - (u32 *)kargs.buffer) + (u32 *)uargs->buffer, &uargs->register_writes)) goto err_exit; if (0 != put_user((kargs.page_table_dump - (u32 *)kargs.buffer) + (u32 *)uargs->buffer, &uargs->page_table_dump)) goto err_exit; if (0 != put_user(kargs.register_writes_size, &uargs->register_writes_size)) goto err_exit; if (0 != put_user(kargs.page_table_dump_size, &uargs->page_table_dump_size)) goto err_exit; rc = 0; err_exit: if (kargs.buffer) _mali_osk_vfree(kargs.buffer); return rc; }
_mali_osk_errcode_t mali_pegasus_platform_init() { mali_gpu_clk = 266; mali_gpu_vol = 900000; MALI_CHECK(init_mali_pegasus_clock(), _MALI_OSK_ERR_FAULT); #ifdef CONFIG_EXYNOS_TMU_TC _mali_osk_atomic_init(&voltage_lock_status, 0); #endif #if MALI_DVFS_ENABLED if (!clk_pegasus_register_map) clk_pegasus_register_map = _mali_osk_mem_mapioregion( CLK_DIV_STAT_G3D, 0x20, CLK_DESC ); if(!init_mali_pegasus_dvfs_status(MALI_DVFS_DEFAULT_STEP)) MALI_DEBUG_PRINT(1, ("mali_platform_init failed\n")); #endif MALI_SUCCESS; }
/** @note munmap handler is done by vma close handler */ static int mali_mmap(struct file * filp, struct vm_area_struct * vma) { struct mali_session_data * session_data; _mali_uk_mem_mmap_s args = {0, }; session_data = (struct mali_session_data *)filp->private_data; if (NULL == session_data) { MALI_PRINT_ERROR(("mmap called without any session data available\n")); return -EFAULT; } MALI_DEBUG_PRINT(4, ("MMap() handler: start=0x%08X, phys=0x%08X, size=0x%08X vma->flags 0x%08x\n", (unsigned int)vma->vm_start, (unsigned int)(vma->vm_pgoff << PAGE_SHIFT), (unsigned int)(vma->vm_end - vma->vm_start), vma->vm_flags)); /* Re-pack the arguments that mmap() packed for us */ args.ctx = session_data; args.phys_addr = vma->vm_pgoff << PAGE_SHIFT; args.size = vma->vm_end - vma->vm_start; args.ukk_private = vma; if ( VM_SHARED== (VM_SHARED & vma->vm_flags)) { args.cache_settings = MALI_CACHE_STANDARD ; MALI_DEBUG_PRINT(3,("Allocate - Standard - Size: %d kb\n", args.size/1024)); } else { args.cache_settings = MALI_CACHE_GP_READ_ALLOCATE; MALI_DEBUG_PRINT(3,("Allocate - GP Cached - Size: %d kb\n", args.size/1024)); } /* Setting it equal to VM_SHARED and not Private, which would have made the later io_remap fail for MALI_CACHE_GP_READ_ALLOCATE */ vma->vm_flags = 0x000000fb; /* Call the common mmap handler */ MALI_CHECK(_MALI_OSK_ERR_OK ==_mali_ukk_mem_mmap( &args ), -EFAULT); return 0; }
_mali_osk_errcode_t mali_platform_init(_mali_osk_resource_t *resource) { MALI_CHECK(init_mali_clock(), _MALI_OSK_ERR_FAULT); MALI_SUCCESS; }
_mali_osk_errcode_t mali_platform_init(void) { MALI_CHECK(init_mali_clock(), _MALI_OSK_ERR_FAULT); MALI_SUCCESS; }