| /* |
| * Copyright (C) 2010-2016 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. |
| |
| * Class Path Exception |
| * Linking this library statically or dynamically with other modules is making a combined work based on this library. |
| * Thus, the terms and conditions of the GNU General Public License cover the whole combination. |
| * As a special exception, the copyright holders of this library give you permission to link this library with independent modules |
| * to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting |
| * executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions |
| * of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify |
| * this library, you may extend this exception to your version of the library, but you are not obligated to do so. |
| * If you do not wish to do so, delete this exception statement from your version. |
| */ |
| |
| /** |
| * @file mali_uk_types.h |
| * Defines the types and constants used in the user-kernel interface |
| */ |
| |
| #ifndef __MALI_UTGARD_UK_TYPES_H__ |
| #define __MALI_UTGARD_UK_TYPES_H__ |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /* Iteration functions depend on these values being consecutive. */ |
| #define MALI_UK_TIMELINE_GP 0 |
| #define MALI_UK_TIMELINE_PP 1 |
| #define MALI_UK_TIMELINE_SOFT 2 |
| #define MALI_UK_TIMELINE_MAX 3 |
| |
| #define MALI_UK_BIG_VARYING_SIZE (1024*1024*2) |
| |
| typedef struct { |
| u32 points[MALI_UK_TIMELINE_MAX]; |
| s32 sync_fd; |
| } _mali_uk_fence_t; |
| |
| /** |
| * @addtogroup uddapi Unified Device Driver (UDD) APIs |
| * |
| * @{ |
| */ |
| |
| /** |
| * @addtogroup u_k_api UDD User/Kernel Interface (U/K) APIs |
| * |
| * @{ |
| */ |
| |
| /** @defgroup _mali_uk_core U/K Core |
| * @{ */ |
| |
| /** Definition of subsystem numbers, to assist in creating a unique identifier |
| * for each U/K call. |
| * |
| * @see _mali_uk_functions */ |
| typedef enum { |
| _MALI_UK_CORE_SUBSYSTEM, /**< Core Group of U/K calls */ |
| _MALI_UK_MEMORY_SUBSYSTEM, /**< Memory Group of U/K calls */ |
| _MALI_UK_PP_SUBSYSTEM, /**< Fragment Processor Group of U/K calls */ |
| _MALI_UK_GP_SUBSYSTEM, /**< Vertex Processor Group of U/K calls */ |
| _MALI_UK_PROFILING_SUBSYSTEM, /**< Profiling Group of U/K calls */ |
| _MALI_UK_VSYNC_SUBSYSTEM, /**< VSYNC Group of U/K calls */ |
| } _mali_uk_subsystem_t; |
| |
| /** Within a function group each function has its unique sequence number |
| * to assist in creating a unique identifier for each U/K call. |
| * |
| * An ordered pair of numbers selected from |
| * ( \ref _mali_uk_subsystem_t,\ref _mali_uk_functions) will uniquely identify the |
| * U/K call across all groups of functions, and all functions. */ |
| typedef enum { |
| /** Core functions */ |
| |
| _MALI_UK_OPEN = 0, /**< _mali_ukk_open() */ |
| _MALI_UK_CLOSE, /**< _mali_ukk_close() */ |
| _MALI_UK_WAIT_FOR_NOTIFICATION, /**< _mali_ukk_wait_for_notification() */ |
| _MALI_UK_GET_API_VERSION, /**< _mali_ukk_get_api_version() */ |
| _MALI_UK_POST_NOTIFICATION, /**< _mali_ukk_post_notification() */ |
| _MALI_UK_GET_USER_SETTING, /**< _mali_ukk_get_user_setting() *//**< [out] */ |
| _MALI_UK_GET_USER_SETTINGS, /**< _mali_ukk_get_user_settings() *//**< [out] */ |
| _MALI_UK_REQUEST_HIGH_PRIORITY, /**< _mali_ukk_request_high_priority() */ |
| _MALI_UK_TIMELINE_GET_LATEST_POINT, /**< _mali_ukk_timeline_get_latest_point() */ |
| _MALI_UK_TIMELINE_WAIT, /**< _mali_ukk_timeline_wait() */ |
| _MALI_UK_TIMELINE_CREATE_SYNC_FENCE, /**< _mali_ukk_timeline_create_sync_fence() */ |
| _MALI_UK_SOFT_JOB_START, /**< _mali_ukk_soft_job_start() */ |
| _MALI_UK_SOFT_JOB_SIGNAL, /**< _mali_ukk_soft_job_signal() */ |
| _MALI_UK_PENDING_SUBMIT, /**< _mali_ukk_pending_submit() */ |
| |
| /** Memory functions */ |
| |
| _MALI_UK_ALLOC_MEM = 0, /**< _mali_ukk_alloc_mem() */ |
| _MALI_UK_FREE_MEM, /**< _mali_ukk_free_mem() */ |
| _MALI_UK_BIND_MEM, /**< _mali_ukk_mem_bind() */ |
| _MALI_UK_UNBIND_MEM, /**< _mali_ukk_mem_unbind() */ |
| _MALI_UK_COW_MEM, /**< _mali_ukk_mem_cow() */ |
| _MALI_UK_COW_MODIFY_RANGE, /**< _mali_ukk_mem_cow_modify_range() */ |
| _MALI_UK_RESIZE_MEM, /**<._mali_ukk_mem_resize() */ |
| _MALI_UK_QUERY_MMU_PAGE_TABLE_DUMP_SIZE, /**< _mali_ukk_mem_get_mmu_page_table_dump_size() */ |
| _MALI_UK_DUMP_MMU_PAGE_TABLE, /**< _mali_ukk_mem_dump_mmu_page_table() */ |
| _MALI_UK_DMA_BUF_GET_SIZE, /**< _mali_ukk_dma_buf_get_size() */ |
| _MALI_UK_MEM_WRITE_SAFE, /**< _mali_uku_mem_write_safe() */ |
| |
| /** Common functions for each core */ |
| |
| _MALI_UK_START_JOB = 0, /**< Start a Fragment/Vertex Processor Job on a core */ |
| _MALI_UK_GET_NUMBER_OF_CORES, /**< Get the number of Fragment/Vertex Processor cores */ |
| _MALI_UK_GET_CORE_VERSION, /**< Get the Fragment/Vertex Processor version compatible with all cores */ |
| |
| /** Fragment Processor Functions */ |
| |
| _MALI_UK_PP_START_JOB = _MALI_UK_START_JOB, /**< _mali_ukk_pp_start_job() */ |
| _MALI_UK_GET_PP_NUMBER_OF_CORES = _MALI_UK_GET_NUMBER_OF_CORES, /**< _mali_ukk_get_pp_number_of_cores() */ |
| _MALI_UK_GET_PP_CORE_VERSION = _MALI_UK_GET_CORE_VERSION, /**< _mali_ukk_get_pp_core_version() */ |
| _MALI_UK_PP_DISABLE_WB, /**< _mali_ukk_pp_job_disable_wb() */ |
| _MALI_UK_PP_AND_GP_START_JOB, /**< _mali_ukk_pp_and_gp_start_job() */ |
| |
| /** Vertex Processor Functions */ |
| |
| _MALI_UK_GP_START_JOB = _MALI_UK_START_JOB, /**< _mali_ukk_gp_start_job() */ |
| _MALI_UK_GET_GP_NUMBER_OF_CORES = _MALI_UK_GET_NUMBER_OF_CORES, /**< _mali_ukk_get_gp_number_of_cores() */ |
| _MALI_UK_GET_GP_CORE_VERSION = _MALI_UK_GET_CORE_VERSION, /**< _mali_ukk_get_gp_core_version() */ |
| _MALI_UK_GP_SUSPEND_RESPONSE, /**< _mali_ukk_gp_suspend_response() */ |
| |
| /** Profiling functions */ |
| |
| _MALI_UK_PROFILING_ADD_EVENT = 0, /**< __mali_uku_profiling_add_event() */ |
| _MALI_UK_PROFILING_REPORT_SW_COUNTERS,/**< __mali_uku_profiling_report_sw_counters() */ |
| _MALI_UK_PROFILING_MEMORY_USAGE_GET, /**< __mali_uku_profiling_memory_usage_get() */ |
| _MALI_UK_PROFILING_STREAM_FD_GET, /** < __mali_uku_profiling_stream_fd_get() */ |
| _MALI_UK_PROFILING_CONTROL_SET, /** < __mali_uku_profiling_control_set() */ |
| |
| /** VSYNC reporting fuctions */ |
| _MALI_UK_VSYNC_EVENT_REPORT = 0, /**< _mali_ukk_vsync_event_report() */ |
| } _mali_uk_functions; |
| |
| /** @defgroup _mali_uk_getsysteminfo U/K Get System Info |
| * @{ */ |
| |
| /** |
| * Type definition for the core version number. |
| * Used when returning the version number read from a core |
| * |
| * Its format is that of the 32-bit Version register for a particular core. |
| * Refer to the "Mali200 and MaliGP2 3D Graphics Processor Technical Reference |
| * Manual", ARM DDI 0415C, for more information. |
| */ |
| typedef u32 _mali_core_version; |
| |
| /** @} */ /* end group _mali_uk_core */ |
| |
| |
| /** @defgroup _mali_uk_gp U/K Vertex Processor |
| * @{ */ |
| |
| /** @defgroup _mali_uk_gp_suspend_response_s Vertex Processor Suspend Response |
| * @{ */ |
| |
| /** @brief Arguments for _mali_ukk_gp_suspend_response() |
| * |
| * When _mali_wait_for_notification() receives notification that a |
| * Vertex Processor job was suspended, you need to send a response to indicate |
| * what needs to happen with this job. You can either abort or resume the job. |
| * |
| * - set @c code to indicate response code. This is either @c _MALIGP_JOB_ABORT or |
| * @c _MALIGP_JOB_RESUME_WITH_NEW_HEAP to indicate you will provide a new heap |
| * for the job that will resolve the out of memory condition for the job. |
| * - copy the @c cookie value from the @c _mali_uk_gp_job_suspended_s notification; |
| * this is an identifier for the suspended job |
| * - set @c arguments[0] and @c arguments[1] to zero if you abort the job. If |
| * you resume it, @c argument[0] should specify the Mali start address for the new |
| * heap and @c argument[1] the Mali end address of the heap. |
| * - pass in the user-kernel context @c ctx that was returned from _mali_ukk_open() |
| * |
| */ |
| typedef enum _maligp_job_suspended_response_code { |
| _MALIGP_JOB_ABORT, /**< Abort the Vertex Processor job */ |
| _MALIGP_JOB_RESUME_WITH_NEW_HEAP /**< Resume the Vertex Processor job with a new heap */ |
| } _maligp_job_suspended_response_code; |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u32 cookie; /**< [in] cookie from the _mali_uk_gp_job_suspended_s notification */ |
| _maligp_job_suspended_response_code code; /**< [in] abort or resume response code, see \ref _maligp_job_suspended_response_code */ |
| u32 arguments[2]; /**< [in] 0 when aborting a job. When resuming a job, the Mali start and end address for a new heap to resume the job with */ |
| } _mali_uk_gp_suspend_response_s; |
| |
| /** @} */ /* end group _mali_uk_gp_suspend_response_s */ |
| |
| /** @defgroup _mali_uk_gpstartjob_s Vertex Processor Start Job |
| * @{ */ |
| |
| /** @brief Status indicating the result of the execution of a Vertex or Fragment processor job */ |
| typedef enum { |
| _MALI_UK_JOB_STATUS_END_SUCCESS = 1 << (16 + 0), |
| _MALI_UK_JOB_STATUS_END_OOM = 1 << (16 + 1), |
| _MALI_UK_JOB_STATUS_END_ABORT = 1 << (16 + 2), |
| _MALI_UK_JOB_STATUS_END_TIMEOUT_SW = 1 << (16 + 3), |
| _MALI_UK_JOB_STATUS_END_HANG = 1 << (16 + 4), |
| _MALI_UK_JOB_STATUS_END_SEG_FAULT = 1 << (16 + 5), |
| _MALI_UK_JOB_STATUS_END_ILLEGAL_JOB = 1 << (16 + 6), |
| _MALI_UK_JOB_STATUS_END_UNKNOWN_ERR = 1 << (16 + 7), |
| _MALI_UK_JOB_STATUS_END_SHUTDOWN = 1 << (16 + 8), |
| _MALI_UK_JOB_STATUS_END_SYSTEM_UNUSABLE = 1 << (16 + 9) |
| } _mali_uk_job_status; |
| |
| #define MALIGP2_NUM_REGS_FRAME (6) |
| |
| /** @brief Arguments for _mali_ukk_gp_start_job() |
| * |
| * To start a Vertex Processor job |
| * - associate the request with a reference to a @c mali_gp_job_info by setting |
| * user_job_ptr to the address of the @c mali_gp_job_info of the job. |
| * - set @c priority to the priority of the @c mali_gp_job_info |
| * - specify a timeout for the job by setting @c watchdog_msecs to the number of |
| * milliseconds the job is allowed to run. Specifying a value of 0 selects the |
| * default timeout in use by the device driver. |
| * - copy the frame registers from the @c mali_gp_job_info into @c frame_registers. |
| * - set the @c perf_counter_flag, @c perf_counter_src0 and @c perf_counter_src1 to zero |
| * for a non-instrumented build. For an instrumented build you can use up |
| * to two performance counters. Set the corresponding bit in @c perf_counter_flag |
| * to enable them. @c perf_counter_src0 and @c perf_counter_src1 specify |
| * the source of what needs to get counted (e.g. number of vertex loader |
| * cache hits). For source id values, see ARM DDI0415A, Table 3-60. |
| * - pass in the user-kernel context @c ctx that was returned from _mali_ukk_open() |
| * |
| * When @c _mali_ukk_gp_start_job() returns @c _MALI_OSK_ERR_OK, status contains the |
| * result of the request (see \ref _mali_uk_start_job_status). If the job could |
| * not get started (@c _MALI_UK_START_JOB_NOT_STARTED_DO_REQUEUE) it should be |
| * tried again. |
| * |
| * After the job has started, @c _mali_wait_for_notification() will be notified |
| * that the job finished or got suspended. It may get suspended due to |
| * resource shortage. If it finished (see _mali_ukk_wait_for_notification()) |
| * the notification will contain a @c _mali_uk_gp_job_finished_s result. If |
| * it got suspended the notification will contain a @c _mali_uk_gp_job_suspended_s |
| * result. |
| * |
| * The @c _mali_uk_gp_job_finished_s contains the job status (see \ref _mali_uk_job_status), |
| * the number of milliseconds the job took to render, and values of core registers |
| * when the job finished (irq status, performance counters, renderer list |
| * address). A job has finished succesfully when its status is |
| * @c _MALI_UK_JOB_STATUS_FINISHED. If the hardware detected a timeout while rendering |
| * the job, or software detected the job is taking more than watchdog_msecs to |
| * complete, the status will indicate @c _MALI_UK_JOB_STATUS_HANG. |
| * If the hardware detected a bus error while accessing memory associated with the |
| * job, status will indicate @c _MALI_UK_JOB_STATUS_SEG_FAULT. |
| * status will indicate @c _MALI_UK_JOB_STATUS_NOT_STARTED if the driver had to |
| * stop the job but the job didn't start on the hardware yet, e.g. when the |
| * driver shutdown. |
| * |
| * In case the job got suspended, @c _mali_uk_gp_job_suspended_s contains |
| * the @c user_job_ptr identifier used to start the job with, the @c reason |
| * why the job stalled (see \ref _maligp_job_suspended_reason) and a @c cookie |
| * to identify the core on which the job stalled. This @c cookie will be needed |
| * when responding to this nofication by means of _mali_ukk_gp_suspend_response(). |
| * (see _mali_ukk_gp_suspend_response()). The response is either to abort or |
| * resume the job. If the job got suspended due to an out of memory condition |
| * you may be able to resolve this by providing more memory and resuming the job. |
| * |
| */ |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u64 user_job_ptr; /**< [in] identifier for the job in user space, a @c mali_gp_job_info* */ |
| u32 priority; /**< [in] job priority. A lower number means higher priority */ |
| u32 frame_registers[MALIGP2_NUM_REGS_FRAME]; /**< [in] core specific registers associated with this job */ |
| u32 perf_counter_flag; /**< [in] bitmask indicating which performance counters to enable, see \ref _MALI_PERFORMANCE_COUNTER_FLAG_SRC0_ENABLE and related macro definitions */ |
| u32 perf_counter_src0; /**< [in] source id for performance counter 0 (see ARM DDI0415A, Table 3-60) */ |
| u32 perf_counter_src1; /**< [in] source id for performance counter 1 (see ARM DDI0415A, Table 3-60) */ |
| u32 frame_builder_id; /**< [in] id of the originating frame builder */ |
| u32 flush_id; /**< [in] flush id within the originating frame builder */ |
| _mali_uk_fence_t fence; /**< [in] fence this job must wait on */ |
| u64 timeline_point_ptr; /**< [in,out] pointer to u32: location where point on gp timeline for this job will be written */ |
| u32 varying_memsize; /** < [in] size of varying memory to use deffer bind*/ |
| u32 deferred_mem_num; |
| u64 deferred_mem_list; /** < [in] memory hanlde list of varying buffer to use deffer bind */ |
| } _mali_uk_gp_start_job_s; |
| |
| #define _MALI_PERFORMANCE_COUNTER_FLAG_SRC0_ENABLE (1<<0) /**< Enable performance counter SRC0 for a job */ |
| #define _MALI_PERFORMANCE_COUNTER_FLAG_SRC1_ENABLE (1<<1) /**< Enable performance counter SRC1 for a job */ |
| #define _MALI_PERFORMANCE_COUNTER_FLAG_HEATMAP_ENABLE (1<<2) /**< Enable per tile (aka heatmap) generation with for a job (using the enabled counter sources) */ |
| |
| /** @} */ /* end group _mali_uk_gpstartjob_s */ |
| |
| typedef struct { |
| u64 user_job_ptr; /**< [out] identifier for the job in user space */ |
| _mali_uk_job_status status; /**< [out] status of finished job */ |
| u32 heap_current_addr; /**< [out] value of the GP PLB PL heap start address register */ |
| u32 perf_counter0; /**< [out] value of performance counter 0 (see ARM DDI0415A) */ |
| u32 perf_counter1; /**< [out] value of performance counter 1 (see ARM DDI0415A) */ |
| u32 pending_big_job_num; |
| } _mali_uk_gp_job_finished_s; |
| |
| typedef struct { |
| u64 user_job_ptr; /**< [out] identifier for the job in user space */ |
| u32 cookie; /**< [out] identifier for the core in kernel space on which the job stalled */ |
| } _mali_uk_gp_job_suspended_s; |
| |
| /** @} */ /* end group _mali_uk_gp */ |
| |
| |
| /** @defgroup _mali_uk_pp U/K Fragment Processor |
| * @{ */ |
| |
| #define _MALI_PP_MAX_SUB_JOBS 8 |
| |
| #define _MALI_PP_MAX_FRAME_REGISTERS ((0x058/4)+1) |
| |
| #define _MALI_PP_MAX_WB_REGISTERS ((0x02C/4)+1) |
| |
| #define _MALI_DLBU_MAX_REGISTERS 4 |
| |
| /** Flag for _mali_uk_pp_start_job_s */ |
| #define _MALI_PP_JOB_FLAG_NO_NOTIFICATION (1<<0) |
| #define _MALI_PP_JOB_FLAG_IS_WINDOW_SURFACE (1<<1) |
| #define _MALI_PP_JOB_FLAG_PROTECTED (1<<2) |
| |
| /** @defgroup _mali_uk_ppstartjob_s Fragment Processor Start Job |
| * @{ */ |
| |
| /** @brief Arguments for _mali_ukk_pp_start_job() |
| * |
| * To start a Fragment Processor job |
| * - associate the request with a reference to a mali_pp_job by setting |
| * @c user_job_ptr to the address of the @c mali_pp_job of the job. |
| * - set @c priority to the priority of the mali_pp_job |
| * - specify a timeout for the job by setting @c watchdog_msecs to the number of |
| * milliseconds the job is allowed to run. Specifying a value of 0 selects the |
| * default timeout in use by the device driver. |
| * - copy the frame registers from the @c mali_pp_job into @c frame_registers. |
| * For MALI200 you also need to copy the write back 0,1 and 2 registers. |
| * - set the @c perf_counter_flag, @c perf_counter_src0 and @c perf_counter_src1 to zero |
| * for a non-instrumented build. For an instrumented build you can use up |
| * to two performance counters. Set the corresponding bit in @c perf_counter_flag |
| * to enable them. @c perf_counter_src0 and @c perf_counter_src1 specify |
| * the source of what needs to get counted (e.g. number of vertex loader |
| * cache hits). For source id values, see ARM DDI0415A, Table 3-60. |
| * - pass in the user-kernel context in @c ctx that was returned from _mali_ukk_open() |
| * |
| * When _mali_ukk_pp_start_job() returns @c _MALI_OSK_ERR_OK, @c status contains the |
| * result of the request (see \ref _mali_uk_start_job_status). If the job could |
| * not get started (@c _MALI_UK_START_JOB_NOT_STARTED_DO_REQUEUE) it should be |
| * tried again. |
| * |
| * After the job has started, _mali_wait_for_notification() will be notified |
| * when the job finished. The notification will contain a |
| * @c _mali_uk_pp_job_finished_s result. It contains the @c user_job_ptr |
| * identifier used to start the job with, the job @c status (see \ref _mali_uk_job_status), |
| * the number of milliseconds the job took to render, and values of core registers |
| * when the job finished (irq status, performance counters, renderer list |
| * address). A job has finished succesfully when its status is |
| * @c _MALI_UK_JOB_STATUS_FINISHED. If the hardware detected a timeout while rendering |
| * the job, or software detected the job is taking more than @c watchdog_msecs to |
| * complete, the status will indicate @c _MALI_UK_JOB_STATUS_HANG. |
| * If the hardware detected a bus error while accessing memory associated with the |
| * job, status will indicate @c _MALI_UK_JOB_STATUS_SEG_FAULT. |
| * status will indicate @c _MALI_UK_JOB_STATUS_NOT_STARTED if the driver had to |
| * stop the job but the job didn't start on the hardware yet, e.g. when the |
| * driver shutdown. |
| * |
| */ |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u64 user_job_ptr; /**< [in] identifier for the job in user space */ |
| u32 priority; /**< [in] job priority. A lower number means higher priority */ |
| u32 frame_registers[_MALI_PP_MAX_FRAME_REGISTERS]; /**< [in] core specific registers associated with first sub job, see ARM DDI0415A */ |
| u32 frame_registers_addr_frame[_MALI_PP_MAX_SUB_JOBS - 1]; /**< [in] ADDR_FRAME registers for sub job 1-7 */ |
| u32 frame_registers_addr_stack[_MALI_PP_MAX_SUB_JOBS - 1]; /**< [in] ADDR_STACK registers for sub job 1-7 */ |
| u32 wb0_registers[_MALI_PP_MAX_WB_REGISTERS]; |
| u32 wb1_registers[_MALI_PP_MAX_WB_REGISTERS]; |
| u32 wb2_registers[_MALI_PP_MAX_WB_REGISTERS]; |
| u32 dlbu_registers[_MALI_DLBU_MAX_REGISTERS]; /**< [in] Dynamic load balancing unit registers */ |
| u32 num_cores; /**< [in] Number of cores to set up (valid range: 1-8(M450) or 4(M400)) */ |
| u32 perf_counter_flag; /**< [in] bitmask indicating which performance counters to enable, see \ref _MALI_PERFORMANCE_COUNTER_FLAG_SRC0_ENABLE and related macro definitions */ |
| u32 perf_counter_src0; /**< [in] source id for performance counter 0 (see ARM DDI0415A, Table 3-60) */ |
| u32 perf_counter_src1; /**< [in] source id for performance counter 1 (see ARM DDI0415A, Table 3-60) */ |
| u32 frame_builder_id; /**< [in] id of the originating frame builder */ |
| u32 flush_id; /**< [in] flush id within the originating frame builder */ |
| u32 flags; /**< [in] See _MALI_PP_JOB_FLAG_* for a list of avaiable flags */ |
| u32 tilesx; /**< [in] number of tiles in the x direction (needed for heatmap generation */ |
| u32 tilesy; /**< [in] number of tiles in y direction (needed for reading the heatmap memory) */ |
| u32 heatmap_mem; /**< [in] memory address to store counter values per tile (aka heatmap) */ |
| u32 num_memory_cookies; /**< [in] number of memory cookies attached to job */ |
| u64 memory_cookies; /**< [in] pointer to array of u32 memory cookies attached to job */ |
| _mali_uk_fence_t fence; /**< [in] fence this job must wait on */ |
| u64 timeline_point_ptr; /**< [in,out] pointer to location of u32 where point on pp timeline for this job will be written */ |
| } _mali_uk_pp_start_job_s; |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u64 gp_args; /**< [in,out] GP uk arguments (see _mali_uk_gp_start_job_s) */ |
| u64 pp_args; /**< [in,out] PP uk arguments (see _mali_uk_pp_start_job_s) */ |
| } _mali_uk_pp_and_gp_start_job_s; |
| |
| /** @} */ /* end group _mali_uk_ppstartjob_s */ |
| |
| typedef struct { |
| u64 user_job_ptr; /**< [out] identifier for the job in user space */ |
| _mali_uk_job_status status; /**< [out] status of finished job */ |
| u32 perf_counter0[_MALI_PP_MAX_SUB_JOBS]; /**< [out] value of perfomance counter 0 (see ARM DDI0415A), one for each sub job */ |
| u32 perf_counter1[_MALI_PP_MAX_SUB_JOBS]; /**< [out] value of perfomance counter 1 (see ARM DDI0415A), one for each sub job */ |
| u32 perf_counter_src0; |
| u32 perf_counter_src1; |
| } _mali_uk_pp_job_finished_s; |
| |
| typedef struct { |
| u32 number_of_enabled_cores; /**< [out] the new number of enabled cores */ |
| } _mali_uk_pp_num_cores_changed_s; |
| |
| |
| |
| /** |
| * Flags to indicate write-back units |
| */ |
| typedef enum { |
| _MALI_UK_PP_JOB_WB0 = 1, |
| _MALI_UK_PP_JOB_WB1 = 2, |
| _MALI_UK_PP_JOB_WB2 = 4, |
| } _mali_uk_pp_job_wbx_flag; |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u32 fb_id; /**< [in] Frame builder ID of job to disable WB units for */ |
| u32 wb0_memory; |
| u32 wb1_memory; |
| u32 wb2_memory; |
| } _mali_uk_pp_disable_wb_s; |
| |
| |
| /** @} */ /* end group _mali_uk_pp */ |
| |
| /** @defgroup _mali_uk_soft_job U/K Soft Job |
| * @{ */ |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u64 user_job; /**< [in] identifier for the job in user space */ |
| u64 job_id_ptr; /**< [in,out] pointer to location of u32 where job id will be written */ |
| _mali_uk_fence_t fence; /**< [in] fence this job must wait on */ |
| u32 point; /**< [out] point on soft timeline for this job */ |
| u32 type; /**< [in] type of soft job */ |
| } _mali_uk_soft_job_start_s; |
| |
| typedef struct { |
| u64 user_job; /**< [out] identifier for the job in user space */ |
| } _mali_uk_soft_job_activated_s; |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u32 job_id; /**< [in] id for soft job */ |
| } _mali_uk_soft_job_signal_s; |
| |
| /** @} */ /* end group _mali_uk_soft_job */ |
| |
| typedef struct { |
| u32 counter_id; |
| u32 key; |
| int enable; |
| } _mali_uk_annotate_profiling_mem_counter_s; |
| |
| typedef struct { |
| u32 sampling_rate; |
| int enable; |
| } _mali_uk_annotate_profiling_enable_s; |
| |
| |
| /** @addtogroup _mali_uk_core U/K Core |
| * @{ */ |
| |
| /** @defgroup _mali_uk_waitfornotification_s Wait For Notification |
| * @{ */ |
| |
| /** @brief Notification type encodings |
| * |
| * Each Notification type is an ordered pair of (subsystem,id), and is unique. |
| * |
| * The encoding of subsystem,id into a 32-bit word is: |
| * encoding = (( subsystem << _MALI_NOTIFICATION_SUBSYSTEM_SHIFT ) & _MALI_NOTIFICATION_SUBSYSTEM_MASK) |
| * | (( id << _MALI_NOTIFICATION_ID_SHIFT ) & _MALI_NOTIFICATION_ID_MASK) |
| * |
| * @see _mali_uk_wait_for_notification_s |
| */ |
| typedef enum { |
| /** core notifications */ |
| |
| _MALI_NOTIFICATION_CORE_SHUTDOWN_IN_PROGRESS = (_MALI_UK_CORE_SUBSYSTEM << 16) | 0x20, |
| _MALI_NOTIFICATION_APPLICATION_QUIT = (_MALI_UK_CORE_SUBSYSTEM << 16) | 0x40, |
| _MALI_NOTIFICATION_SETTINGS_CHANGED = (_MALI_UK_CORE_SUBSYSTEM << 16) | 0x80, |
| _MALI_NOTIFICATION_SOFT_ACTIVATED = (_MALI_UK_CORE_SUBSYSTEM << 16) | 0x100, |
| |
| /** Fragment Processor notifications */ |
| |
| _MALI_NOTIFICATION_PP_FINISHED = (_MALI_UK_PP_SUBSYSTEM << 16) | 0x10, |
| _MALI_NOTIFICATION_PP_NUM_CORE_CHANGE = (_MALI_UK_PP_SUBSYSTEM << 16) | 0x20, |
| |
| /** Vertex Processor notifications */ |
| |
| _MALI_NOTIFICATION_GP_FINISHED = (_MALI_UK_GP_SUBSYSTEM << 16) | 0x10, |
| _MALI_NOTIFICATION_GP_STALLED = (_MALI_UK_GP_SUBSYSTEM << 16) | 0x20, |
| |
| /** Profiling notifications */ |
| _MALI_NOTIFICATION_ANNOTATE_PROFILING_MEM_COUNTER = (_MALI_UK_PROFILING_SUBSYSTEM << 16) | 0x10, |
| _MALI_NOTIFICATION_ANNOTATE_PROFILING_ENABLE = (_MALI_UK_PROFILING_SUBSYSTEM << 16) | 0x20, |
| } _mali_uk_notification_type; |
| |
| /** to assist in splitting up 32-bit notification value in subsystem and id value */ |
| #define _MALI_NOTIFICATION_SUBSYSTEM_MASK 0xFFFF0000 |
| #define _MALI_NOTIFICATION_SUBSYSTEM_SHIFT 16 |
| #define _MALI_NOTIFICATION_ID_MASK 0x0000FFFF |
| #define _MALI_NOTIFICATION_ID_SHIFT 0 |
| |
| |
| /** @brief Enumeration of possible settings which match mali_setting_t in user space |
| * |
| * |
| */ |
| typedef enum { |
| _MALI_UK_USER_SETTING_SW_EVENTS_ENABLE = 0, |
| _MALI_UK_USER_SETTING_COLORBUFFER_CAPTURE_ENABLED, |
| _MALI_UK_USER_SETTING_DEPTHBUFFER_CAPTURE_ENABLED, |
| _MALI_UK_USER_SETTING_STENCILBUFFER_CAPTURE_ENABLED, |
| _MALI_UK_USER_SETTING_PER_TILE_COUNTERS_CAPTURE_ENABLED, |
| _MALI_UK_USER_SETTING_BUFFER_CAPTURE_COMPOSITOR, |
| _MALI_UK_USER_SETTING_BUFFER_CAPTURE_WINDOW, |
| _MALI_UK_USER_SETTING_BUFFER_CAPTURE_OTHER, |
| _MALI_UK_USER_SETTING_BUFFER_CAPTURE_N_FRAMES, |
| _MALI_UK_USER_SETTING_BUFFER_CAPTURE_RESIZE_FACTOR, |
| _MALI_UK_USER_SETTING_SW_COUNTER_ENABLED, |
| _MALI_UK_USER_SETTING_MAX, |
| } _mali_uk_user_setting_t; |
| |
| /* See mali_user_settings_db.c */ |
| extern const char *_mali_uk_user_setting_descriptions[]; |
| #define _MALI_UK_USER_SETTING_DESCRIPTIONS \ |
| { \ |
| "sw_events_enable", \ |
| "colorbuffer_capture_enable", \ |
| "depthbuffer_capture_enable", \ |
| "stencilbuffer_capture_enable", \ |
| "per_tile_counters_enable", \ |
| "buffer_capture_compositor", \ |
| "buffer_capture_window", \ |
| "buffer_capture_other", \ |
| "buffer_capture_n_frames", \ |
| "buffer_capture_resize_factor", \ |
| "sw_counters_enable", \ |
| }; |
| |
| /** @brief struct to hold the value to a particular setting as seen in the kernel space |
| */ |
| typedef struct { |
| _mali_uk_user_setting_t setting; |
| u32 value; |
| } _mali_uk_settings_changed_s; |
| |
| /** @brief Arguments for _mali_ukk_wait_for_notification() |
| * |
| * On successful return from _mali_ukk_wait_for_notification(), the members of |
| * this structure will indicate the reason for notification. |
| * |
| * Specifically, the source of the notification can be identified by the |
| * subsystem and id fields of the mali_uk_notification_type in the code.type |
| * member. The type member is encoded in a way to divide up the types into a |
| * subsystem field, and a per-subsystem ID field. See |
| * _mali_uk_notification_type for more information. |
| * |
| * Interpreting the data union member depends on the notification type: |
| * |
| * - type == _MALI_NOTIFICATION_CORE_SHUTDOWN_IN_PROGRESS |
| * - The kernel side is shutting down. No further |
| * _mali_uk_wait_for_notification() calls should be made. |
| * - In this case, the value of the data union member is undefined. |
| * - This is used to indicate to the user space client that it should close |
| * the connection to the Mali Device Driver. |
| * - type == _MALI_NOTIFICATION_PP_FINISHED |
| * - The notification data is of type _mali_uk_pp_job_finished_s. It contains the user_job_ptr |
| * identifier used to start the job with, the job status, the number of milliseconds the job took to render, |
| * and values of core registers when the job finished (irq status, performance counters, renderer list |
| * address). |
| * - A job has finished succesfully when its status member is _MALI_UK_JOB_STATUS_FINISHED. |
| * - If the hardware detected a timeout while rendering the job, or software detected the job is |
| * taking more than watchdog_msecs (see _mali_ukk_pp_start_job()) to complete, the status member will |
| * indicate _MALI_UK_JOB_STATUS_HANG. |
| * - If the hardware detected a bus error while accessing memory associated with the job, status will |
| * indicate _MALI_UK_JOB_STATUS_SEG_FAULT. |
| * - Status will indicate MALI_UK_JOB_STATUS_NOT_STARTED if the driver had to stop the job but the job |
| * didn't start the hardware yet, e.g. when the driver closes. |
| * - type == _MALI_NOTIFICATION_GP_FINISHED |
| * - The notification data is of type _mali_uk_gp_job_finished_s. The notification is similar to that of |
| * type == _MALI_NOTIFICATION_PP_FINISHED, except that several other GP core register values are returned. |
| * The status values have the same meaning for type == _MALI_NOTIFICATION_PP_FINISHED. |
| * - type == _MALI_NOTIFICATION_GP_STALLED |
| * - The nofication data is of type _mali_uk_gp_job_suspended_s. It contains the user_job_ptr |
| * identifier used to start the job with, the reason why the job stalled and a cookie to identify the core on |
| * which the job stalled. |
| * - The reason member of gp_job_suspended is set to _MALIGP_JOB_SUSPENDED_OUT_OF_MEMORY |
| * when the polygon list builder unit has run out of memory. |
| */ |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| _mali_uk_notification_type type; /**< [out] Type of notification available */ |
| union { |
| _mali_uk_gp_job_suspended_s gp_job_suspended;/**< [out] Notification data for _MALI_NOTIFICATION_GP_STALLED notification type */ |
| _mali_uk_gp_job_finished_s gp_job_finished; /**< [out] Notification data for _MALI_NOTIFICATION_GP_FINISHED notification type */ |
| _mali_uk_pp_job_finished_s pp_job_finished; /**< [out] Notification data for _MALI_NOTIFICATION_PP_FINISHED notification type */ |
| _mali_uk_settings_changed_s setting_changed;/**< [out] Notification data for _MALI_NOTIFICAATION_SETTINGS_CHANGED notification type */ |
| _mali_uk_soft_job_activated_s soft_job_activated; /**< [out] Notification data for _MALI_NOTIFICATION_SOFT_ACTIVATED notification type */ |
| _mali_uk_annotate_profiling_mem_counter_s profiling_mem_counter; |
| _mali_uk_annotate_profiling_enable_s profiling_enable; |
| } data; |
| } _mali_uk_wait_for_notification_s; |
| |
| /** @brief Arguments for _mali_ukk_post_notification() |
| * |
| * Posts the specified notification to the notification queue for this application. |
| * This is used to send a quit message to the callback thread. |
| */ |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| _mali_uk_notification_type type; /**< [in] Type of notification to post */ |
| } _mali_uk_post_notification_s; |
| |
| /** @} */ /* end group _mali_uk_waitfornotification_s */ |
| |
| /** @defgroup _mali_uk_getapiversion_s Get API Version |
| * @{ */ |
| |
| /** helpers for Device Driver API version handling */ |
| |
| /** @brief Encode a version ID from a 16-bit input |
| * |
| * @note the input is assumed to be 16 bits. It must not exceed 16 bits. */ |
| #define _MAKE_VERSION_ID(x) (((x) << 16UL) | (x)) |
| |
| /** @brief Check whether a 32-bit value is likely to be Device Driver API |
| * version ID. */ |
| #define _IS_VERSION_ID(x) (((x) & 0xFFFF) == (((x) >> 16UL) & 0xFFFF)) |
| |
| /** @brief Decode a 16-bit version number from a 32-bit Device Driver API version |
| * ID */ |
| #define _GET_VERSION(x) (((x) >> 16UL) & 0xFFFF) |
| |
| /** @brief Determine whether two 32-bit encoded version IDs match */ |
| #define _IS_API_MATCH(x, y) (IS_VERSION_ID((x)) && IS_VERSION_ID((y)) && (GET_VERSION((x)) == GET_VERSION((y)))) |
| |
| /** |
| * API version define. |
| * Indicates the version of the kernel API |
| * The version is a 16bit integer incremented on each API change. |
| * The 16bit integer is stored twice in a 32bit integer |
| * For example, for version 1 the value would be 0x00010001 |
| */ |
| #define _MALI_API_VERSION 900 |
| #define _MALI_UK_API_VERSION _MAKE_VERSION_ID(_MALI_API_VERSION) |
| |
| /** |
| * The API version is a 16-bit integer stored in both the lower and upper 16-bits |
| * of a 32-bit value. The 16-bit API version value is incremented on each API |
| * change. Version 1 would be 0x00010001. Used in _mali_uk_get_api_version_s. |
| */ |
| typedef u32 _mali_uk_api_version; |
| |
| /** @brief Arguments for _mali_uk_get_api_version() |
| * |
| * The user-side interface version must be written into the version member, |
| * encoded using _MAKE_VERSION_ID(). It will be compared to the API version of |
| * the kernel-side interface. |
| * |
| * On successful return, the version member will be the API version of the |
| * kernel-side interface. _MALI_UK_API_VERSION macro defines the current version |
| * of the API. |
| * |
| * The compatible member must be checked to see if the version of the user-side |
| * interface is compatible with the kernel-side interface, since future versions |
| * of the interface may be backwards compatible. |
| */ |
| typedef struct { |
| u32 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| _mali_uk_api_version version; /**< [in,out] API version of user-side interface. */ |
| int compatible; /**< [out] @c 1 when @version is compatible, @c 0 otherwise */ |
| } _mali_uk_get_api_version_s; |
| |
| /** @brief Arguments for _mali_uk_get_api_version_v2() |
| * |
| * The user-side interface version must be written into the version member, |
| * encoded using _MAKE_VERSION_ID(). It will be compared to the API version of |
| * the kernel-side interface. |
| * |
| * On successful return, the version member will be the API version of the |
| * kernel-side interface. _MALI_UK_API_VERSION macro defines the current version |
| * of the API. |
| * |
| * The compatible member must be checked to see if the version of the user-side |
| * interface is compatible with the kernel-side interface, since future versions |
| * of the interface may be backwards compatible. |
| */ |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| _mali_uk_api_version version; /**< [in,out] API version of user-side interface. */ |
| int compatible; /**< [out] @c 1 when @version is compatible, @c 0 otherwise */ |
| } _mali_uk_get_api_version_v2_s; |
| |
| /** @} */ /* end group _mali_uk_getapiversion_s */ |
| |
| /** @defgroup _mali_uk_get_user_settings_s Get user space settings */ |
| |
| /** @brief struct to keep the matching values of the user space settings within certain context |
| * |
| * Each member of the settings array corresponds to a matching setting in the user space and its value is the value |
| * of that particular setting. |
| * |
| * All settings are given reference to the context pointed to by the ctx pointer. |
| * |
| */ |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u32 settings[_MALI_UK_USER_SETTING_MAX]; /**< [out] The values for all settings */ |
| } _mali_uk_get_user_settings_s; |
| |
| /** @brief struct to hold the value of a particular setting from the user space within a given context |
| */ |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| _mali_uk_user_setting_t setting; /**< [in] setting to get */ |
| u32 value; /**< [out] value of setting */ |
| } _mali_uk_get_user_setting_s; |
| |
| /** @brief Arguments for _mali_ukk_request_high_priority() */ |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| } _mali_uk_request_high_priority_s; |
| |
| /** @brief Arguments for _mali_ukk_pending_submit() */ |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| } _mali_uk_pending_submit_s; |
| |
| /** @} */ /* end group _mali_uk_core */ |
| |
| |
| /** @defgroup _mali_uk_memory U/K Memory |
| * @{ */ |
| |
| #define _MALI_MEMORY_ALLOCATE_RESIZEABLE (1<<4) /* BUFFER can trim dow/grow*/ |
| #define _MALI_MEMORY_ALLOCATE_NO_BIND_GPU (1<<5) /*Not map to GPU when allocate, must call bind later*/ |
| #define _MALI_MEMORY_ALLOCATE_SWAPPABLE (1<<6) /* Allocate swappale memory. */ |
| #define _MALI_MEMORY_ALLOCATE_DEFER_BIND (1<<7) /*Not map to GPU when allocate, must call bind later*/ |
| #define _MALI_MEMORY_ALLOCATE_SECURE (1<<8) /* Allocate secure memory. */ |
| |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u32 gpu_vaddr; /**< [in] GPU virtual address */ |
| u32 vsize; /**< [in] vitrual size of the allocation */ |
| u32 psize; /**< [in] physical size of the allocation */ |
| u32 flags; |
| u64 backend_handle; /**< [out] backend handle */ |
| s32 secure_shared_fd; /** < [in] the mem handle for secure mem */ |
| } _mali_uk_alloc_mem_s; |
| |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u32 gpu_vaddr; /**< [in] use as handle to free allocation */ |
| u32 free_pages_nr; /** < [out] record the number of free pages */ |
| } _mali_uk_free_mem_s; |
| |
| |
| #define _MALI_MEMORY_BIND_BACKEND_UMP (1<<8) |
| #define _MALI_MEMORY_BIND_BACKEND_DMA_BUF (1<<9) |
| #define _MALI_MEMORY_BIND_BACKEND_MALI_MEMORY (1<<10) |
| #define _MALI_MEMORY_BIND_BACKEND_EXTERNAL_MEMORY (1<<11) |
| #define _MALI_MEMORY_BIND_BACKEND_EXT_COW (1<<12) |
| #define _MALI_MEMORY_BIND_BACKEND_HAVE_ALLOCATION (1<<13) |
| |
| |
| #define _MALI_MEMORY_BIND_BACKEND_MASK (_MALI_MEMORY_BIND_BACKEND_UMP| \ |
| _MALI_MEMORY_BIND_BACKEND_DMA_BUF |\ |
| _MALI_MEMORY_BIND_BACKEND_MALI_MEMORY |\ |
| _MALI_MEMORY_BIND_BACKEND_EXTERNAL_MEMORY |\ |
| _MALI_MEMORY_BIND_BACKEND_EXT_COW |\ |
| _MALI_MEMORY_BIND_BACKEND_HAVE_ALLOCATION) |
| |
| |
| #define _MALI_MEMORY_GPU_READ_ALLOCATE (1<<16) |
| |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u32 vaddr; /**< [in] mali address to map the physical memory to */ |
| u32 size; /**< [in] size */ |
| u32 flags; /**< [in] see_MALI_MEMORY_BIND_BACKEND_* */ |
| u32 padding; /** padding for 32/64 struct alignment */ |
| union { |
| struct { |
| u32 secure_id; /**< [in] secure id */ |
| u32 rights; /**< [in] rights necessary for accessing memory */ |
| u32 flags; /**< [in] flags, see \ref _MALI_MAP_EXTERNAL_MAP_GUARD_PAGE */ |
| } bind_ump; |
| struct { |
| u32 mem_fd; /**< [in] Memory descriptor */ |
| u32 rights; /**< [in] rights necessary for accessing memory */ |
| u32 flags; /**< [in] flags, see \ref _MALI_MAP_EXTERNAL_MAP_GUARD_PAGE */ |
| } bind_dma_buf; |
| struct { |
| u32 phys_addr; /**< [in] physical address */ |
| u32 rights; /**< [in] rights necessary for accessing memory */ |
| u32 flags; /**< [in] flags, see \ref _MALI_MAP_EXTERNAL_MAP_GUARD_PAGE */ |
| } bind_ext_memory; |
| } mem_union; |
| } _mali_uk_bind_mem_s; |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u32 flags; /**< [in] see_MALI_MEMORY_BIND_BACKEND_* */ |
| u32 vaddr; /**< [in] identifier for mapped memory object in kernel space */ |
| } _mali_uk_unbind_mem_s; |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u32 target_handle; /**< [in] handle of allocation need to do COW */ |
| u32 target_offset; /**< [in] offset in target allocation to do COW(for support COW a memory allocated from memory_bank, PAGE_SIZE align)*/ |
| u32 target_size; /**< [in] size of target allocation to do COW (for support memory bank, PAGE_SIZE align)(in byte) */ |
| u32 range_start; /**< [in] re allocate range start offset, offset from the start of allocation (PAGE_SIZE align)*/ |
| u32 range_size; /**< [in] re allocate size (PAGE_SIZE align)*/ |
| u32 vaddr; /**< [in] mali address for the new allocaiton */ |
| u32 backend_handle; /**< [out] backend handle */ |
| u32 flags; |
| } _mali_uk_cow_mem_s; |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u32 range_start; /**< [in] re allocate range start offset, offset from the start of allocation */ |
| u32 size; /**< [in] re allocate size*/ |
| u32 vaddr; /**< [in] mali address for the new allocaiton */ |
| s32 change_pages_nr; /**< [out] record the page number change for cow operation */ |
| } _mali_uk_cow_modify_range_s; |
| |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u32 mem_fd; /**< [in] Memory descriptor */ |
| u32 size; /**< [out] size */ |
| } _mali_uk_dma_buf_get_size_s; |
| |
| /** Flag for _mali_uk_map_external_mem_s, _mali_uk_attach_ump_mem_s and _mali_uk_attach_dma_buf_s */ |
| #define _MALI_MAP_EXTERNAL_MAP_GUARD_PAGE (1<<0) |
| |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u64 vaddr; /* the buffer to do resize*/ |
| u32 psize; /* wanted physical size of this memory */ |
| } _mali_uk_mem_resize_s; |
| |
| /** |
| * @brief Arguments for _mali_uk[uk]_mem_write_safe() |
| */ |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u64 src; /**< [in] Pointer to source data */ |
| u64 dest; /**< [in] Destination Mali buffer */ |
| u32 size; /**< [in,out] Number of bytes to write/copy on input, number of bytes actually written/copied on output */ |
| } _mali_uk_mem_write_safe_s; |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u32 size; /**< [out] size of MMU page table information (registers + page tables) */ |
| } _mali_uk_query_mmu_page_table_dump_size_s; |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u32 size; /**< [in] size of buffer to receive mmu page table information */ |
| u64 buffer; /**< [in,out] buffer to receive mmu page table information */ |
| u32 register_writes_size; /**< [out] size of MMU register dump */ |
| u64 register_writes; /**< [out] pointer within buffer where MMU register dump is stored */ |
| u32 page_table_dump_size; /**< [out] size of MMU page table dump */ |
| u64 page_table_dump; /**< [out] pointer within buffer where MMU page table dump is stored */ |
| } _mali_uk_dump_mmu_page_table_s; |
| |
| /** @} */ /* end group _mali_uk_memory */ |
| |
| |
| /** @addtogroup _mali_uk_pp U/K Fragment Processor |
| * @{ */ |
| |
| /** @brief Arguments for _mali_ukk_get_pp_number_of_cores() |
| * |
| * - pass in the user-kernel context @c ctx that was returned from _mali_ukk_open() |
| * - Upon successful return from _mali_ukk_get_pp_number_of_cores(), @c number_of_cores |
| * will contain the number of Fragment Processor cores in the system. |
| */ |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u32 number_of_total_cores; /**< [out] Total number of Fragment Processor cores in the system */ |
| u32 number_of_enabled_cores; /**< [out] Number of enabled Fragment Processor cores */ |
| } _mali_uk_get_pp_number_of_cores_s; |
| |
| /** @brief Arguments for _mali_ukk_get_pp_core_version() |
| * |
| * - pass in the user-kernel context @c ctx that was returned from _mali_ukk_open() |
| * - Upon successful return from _mali_ukk_get_pp_core_version(), @c version contains |
| * the version that all Fragment Processor cores are compatible with. |
| */ |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| _mali_core_version version; /**< [out] version returned from core, see \ref _mali_core_version */ |
| u32 padding; |
| } _mali_uk_get_pp_core_version_s; |
| |
| /** @} */ /* end group _mali_uk_pp */ |
| |
| |
| /** @addtogroup _mali_uk_gp U/K Vertex Processor |
| * @{ */ |
| |
| /** @brief Arguments for _mali_ukk_get_gp_number_of_cores() |
| * |
| * - pass in the user-kernel context @c ctx that was returned from _mali_ukk_open() |
| * - Upon successful return from _mali_ukk_get_gp_number_of_cores(), @c number_of_cores |
| * will contain the number of Vertex Processor cores in the system. |
| */ |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u32 number_of_cores; /**< [out] number of Vertex Processor cores in the system */ |
| } _mali_uk_get_gp_number_of_cores_s; |
| |
| /** @brief Arguments for _mali_ukk_get_gp_core_version() |
| * |
| * - pass in the user-kernel context @c ctx that was returned from _mali_ukk_open() |
| * - Upon successful return from _mali_ukk_get_gp_core_version(), @c version contains |
| * the version that all Vertex Processor cores are compatible with. |
| */ |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| _mali_core_version version; /**< [out] version returned from core, see \ref _mali_core_version */ |
| } _mali_uk_get_gp_core_version_s; |
| |
| /** @} */ /* end group _mali_uk_gp */ |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u32 event_id; /**< [in] event id to register (see enum mali_profiling_events for values) */ |
| u32 data[5]; /**< [in] event specific data */ |
| } _mali_uk_profiling_add_event_s; |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u32 memory_usage; /**< [out] total memory usage */ |
| u32 vaddr; /**< [in] mali address for the cow allocaiton */ |
| s32 change_pages_nr; /**< [out] record the page number change for cow operation */ |
| } _mali_uk_profiling_memory_usage_get_s; |
| |
| |
| /** @addtogroup _mali_uk_memory U/K Memory |
| * @{ */ |
| |
| /** @brief Arguments to _mali_ukk_mem_mmap() |
| * |
| * Use of the phys_addr member depends on whether the driver is compiled for |
| * Mali-MMU or nonMMU: |
| * - in the nonMMU case, this is the physical address of the memory as seen by |
| * the CPU (which may be a constant offset from that used by Mali) |
| * - in the MMU case, this is the Mali Virtual base address of the memory to |
| * allocate, and the particular physical pages used to back the memory are |
| * entirely determined by _mali_ukk_mem_mmap(). The details of the physical pages |
| * are not reported to user-space for security reasons. |
| * |
| * The cookie member must be stored for use later when freeing the memory by |
| * calling _mali_ukk_mem_munmap(). In the Mali-MMU case, the cookie is secure. |
| * |
| * The ukk_private word must be set to zero when calling from user-space. On |
| * Kernel-side, the OS implementation of the U/K interface can use it to |
| * communicate data to the OS implementation of the OSK layer. In particular, |
| * _mali_ukk_get_big_block() directly calls _mali_ukk_mem_mmap directly, and |
| * will communicate its own ukk_private word through the ukk_private member |
| * here. The common code itself will not inspect or modify the ukk_private |
| * word, and so it may be safely used for whatever purposes necessary to |
| * integrate Mali Memory handling into the OS. |
| * |
| * The uku_private member is currently reserved for use by the user-side |
| * implementation of the U/K interface. Its value must be zero. |
| */ |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| void *mapping; /**< [out] Returns user-space virtual address for the mapping */ |
| u32 size; /**< [in] Size of the requested mapping */ |
| u32 phys_addr; /**< [in] Physical address - could be offset, depending on caller+callee convention */ |
| mali_bool writeable; |
| } _mali_uk_mem_mmap_s; |
| |
| /** @brief Arguments to _mali_ukk_mem_munmap() |
| * |
| * The cookie and mapping members must be that returned from the same previous |
| * call to _mali_ukk_mem_mmap(). The size member must correspond to cookie |
| * and mapping - that is, it must be the value originally supplied to a call to |
| * _mali_ukk_mem_mmap that returned the values of mapping and cookie. |
| * |
| * An error will be returned if an attempt is made to unmap only part of the |
| * originally obtained range, or to unmap more than was originally obtained. |
| */ |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| void *mapping; /**< [in] The mapping returned from mmap call */ |
| u32 size; /**< [in] The size passed to mmap call */ |
| } _mali_uk_mem_munmap_s; |
| /** @} */ /* end group _mali_uk_memory */ |
| |
| /** @defgroup _mali_uk_vsync U/K VSYNC Wait Reporting Module |
| * @{ */ |
| |
| /** @brief VSYNC events |
| * |
| * These events are reported when DDK starts to wait for vsync and when the |
| * vsync has occured and the DDK can continue on the next frame. |
| */ |
| typedef enum _mali_uk_vsync_event { |
| _MALI_UK_VSYNC_EVENT_BEGIN_WAIT = 0, |
| _MALI_UK_VSYNC_EVENT_END_WAIT |
| } _mali_uk_vsync_event; |
| |
| /** @brief Arguments to _mali_ukk_vsync_event() |
| * |
| */ |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| _mali_uk_vsync_event event; /**< [in] VSYNCH event type */ |
| } _mali_uk_vsync_event_report_s; |
| |
| /** @} */ /* end group _mali_uk_vsync */ |
| |
| /** @defgroup _mali_uk_sw_counters_report U/K Software Counter Reporting |
| * @{ */ |
| |
| /** @brief Software counter values |
| * |
| * Values recorded for each of the software counters during a single renderpass. |
| */ |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u64 counters; /**< [in] The array of u32 counter values */ |
| u32 num_counters; /**< [in] The number of elements in counters array */ |
| } _mali_uk_sw_counters_report_s; |
| |
| /** @} */ /* end group _mali_uk_sw_counters_report */ |
| |
| /** @defgroup _mali_uk_timeline U/K Mali Timeline |
| * @{ */ |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u32 timeline; /**< [in] timeline id */ |
| u32 point; /**< [out] latest point on timeline */ |
| } _mali_uk_timeline_get_latest_point_s; |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| _mali_uk_fence_t fence; /**< [in] fence */ |
| u32 timeout; /**< [in] timeout (0 for no wait, -1 for blocking) */ |
| u32 status; /**< [out] status of fence (1 if signaled, 0 if timeout) */ |
| } _mali_uk_timeline_wait_s; |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| _mali_uk_fence_t fence; /**< [in] mali fence to create linux sync fence from */ |
| s32 sync_fd; /**< [out] file descriptor for new linux sync fence */ |
| } _mali_uk_timeline_create_sync_fence_s; |
| |
| /** @} */ /* end group _mali_uk_timeline */ |
| |
| /** @} */ /* end group u_k_api */ |
| |
| /** @} */ /* end group uddapi */ |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| s32 stream_fd; /**< [in] The profiling kernel base stream fd handle */ |
| } _mali_uk_profiling_stream_fd_get_s; |
| |
| typedef struct { |
| u64 ctx; /**< [in,out] user-kernel context (trashed on output) */ |
| u64 control_packet_data; /**< [in] the control packet data for control settings */ |
| u32 control_packet_size; /**< [in] The control packet size */ |
| u64 response_packet_data; /** < [out] The response packet data */ |
| u32 response_packet_size; /** < [in,out] The response packet data */ |
| } _mali_uk_profiling_control_set_s; |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* __MALI_UTGARD_UK_TYPES_H__ */ |