nomali.h revision 10915
110915Sandreas.sandberg@arm.com/* 210915Sandreas.sandberg@arm.com * Copyright (c) 2014-2015 ARM Limited 310915Sandreas.sandberg@arm.com * All rights reserved 410915Sandreas.sandberg@arm.com * 510915Sandreas.sandberg@arm.com * Licensed under the Apache License, Version 2.0 (the "License"); 610915Sandreas.sandberg@arm.com * you may not use this file except in compliance with the License. 710915Sandreas.sandberg@arm.com * You may obtain a copy of the License at 810915Sandreas.sandberg@arm.com * 910915Sandreas.sandberg@arm.com * http://www.apache.org/licenses/LICENSE-2.0 1010915Sandreas.sandberg@arm.com * 1110915Sandreas.sandberg@arm.com * Unless required by applicable law or agreed to in writing, software 1210915Sandreas.sandberg@arm.com * distributed under the License is distributed on an "AS IS" BASIS, 1310915Sandreas.sandberg@arm.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1410915Sandreas.sandberg@arm.com * See the License for the specific language governing permissions and 1510915Sandreas.sandberg@arm.com * limitations under the License. 1610915Sandreas.sandberg@arm.com * 1710915Sandreas.sandberg@arm.com * Authors: Andreas Sandberg 1810915Sandreas.sandberg@arm.com */ 1910915Sandreas.sandberg@arm.com 2010915Sandreas.sandberg@arm.com#ifndef _LIBNOMALI_NOMALI_HH 2110915Sandreas.sandberg@arm.com#define _LIBNOMALI_NOMALI_HH 2210915Sandreas.sandberg@arm.com 2310915Sandreas.sandberg@arm.com#include <stdint.h> 2410915Sandreas.sandberg@arm.com 2510915Sandreas.sandberg@arm.com#ifdef __cplusplus 2610915Sandreas.sandberg@arm.comextern "C" { 2710915Sandreas.sandberg@arm.com#endif 2810915Sandreas.sandberg@arm.com 2910915Sandreas.sandberg@arm.com/** 3010915Sandreas.sandberg@arm.com * @file libnomali/nomali.h 3110915Sandreas.sandberg@arm.com * @short This header defines the NoMali stub GPU model interface. 3210915Sandreas.sandberg@arm.com * 3310915Sandreas.sandberg@arm.com */ 3410915Sandreas.sandberg@arm.com 3510915Sandreas.sandberg@arm.com/** Opaque NoMali model handle. */ 3610915Sandreas.sandberg@arm.comtypedef void* nomali_handle_t; 3710915Sandreas.sandberg@arm.com 3810915Sandreas.sandberg@arm.com/** 3910915Sandreas.sandberg@arm.com * NoMali error codes. 4010915Sandreas.sandberg@arm.com */ 4110915Sandreas.sandberg@arm.comenum { 4210915Sandreas.sandberg@arm.com /** No error */ 4310915Sandreas.sandberg@arm.com NOMALI_E_OK = 0, 4410915Sandreas.sandberg@arm.com /** Unknown error */ 4510915Sandreas.sandberg@arm.com NOMALI_E_UNKNOWN, 4610915Sandreas.sandberg@arm.com /** Memory allocation failed */ 4710915Sandreas.sandberg@arm.com NOMALI_E_MEMORY, 4810915Sandreas.sandberg@arm.com /** Invalid model handle */ 4910915Sandreas.sandberg@arm.com NOMALI_E_HANDLE, 5010915Sandreas.sandberg@arm.com /** Invalid parameter */ 5110915Sandreas.sandberg@arm.com NOMALI_E_INVALID, 5210915Sandreas.sandberg@arm.com 5310915Sandreas.sandberg@arm.com /** 5410915Sandreas.sandberg@arm.com * Number of errors defined 5510915Sandreas.sandberg@arm.com * 5610915Sandreas.sandberg@arm.com * @note This error, and higher error numbers, can be issued if 5710915Sandreas.sandberg@arm.com * the library is newer than the header file. Software should 5810915Sandreas.sandberg@arm.com * tread this condition as an unknown error. 5910915Sandreas.sandberg@arm.com */ 6010915Sandreas.sandberg@arm.com NOMALI_E_NUM_ERRORS 6110915Sandreas.sandberg@arm.com}; 6210915Sandreas.sandberg@arm.comtypedef int nomali_error_t; 6310915Sandreas.sandberg@arm.com 6410915Sandreas.sandberg@arm.comenum { 6510915Sandreas.sandberg@arm.com NOMALI_GPU_T60X = 0, 6610915Sandreas.sandberg@arm.com NOMALI_GPU_T62X, 6710915Sandreas.sandberg@arm.com NOMALI_GPU_T76X, 6810915Sandreas.sandberg@arm.com 6910915Sandreas.sandberg@arm.com NOMALI_GPU_T760 = NOMALI_GPU_T76X, 7010915Sandreas.sandberg@arm.com}; 7110915Sandreas.sandberg@arm.comtypedef int nomali_gpu_type_t; 7210915Sandreas.sandberg@arm.com 7310915Sandreas.sandberg@arm.comtypedef struct { 7410915Sandreas.sandberg@arm.com nomali_gpu_type_t type; 7510915Sandreas.sandberg@arm.com 7610915Sandreas.sandberg@arm.com unsigned ver_maj; 7710915Sandreas.sandberg@arm.com unsigned ver_min; 7810915Sandreas.sandberg@arm.com unsigned ver_status; 7910915Sandreas.sandberg@arm.com} nomali_config_t; 8010915Sandreas.sandberg@arm.com 8110915Sandreas.sandberg@arm.comenum { 8210915Sandreas.sandberg@arm.com /** Model is signalling an interrupt */ 8310915Sandreas.sandberg@arm.com NOMALI_CALLBACK_INT = 0, 8410915Sandreas.sandberg@arm.com /** Model read physical memory callback */ 8510915Sandreas.sandberg@arm.com NOMALI_CALLBACK_MEMREAD, 8610915Sandreas.sandberg@arm.com /** Model write physical memory callback */ 8710915Sandreas.sandberg@arm.com NOMALI_CALLBACK_MEMWRITE, 8810915Sandreas.sandberg@arm.com 8910915Sandreas.sandberg@arm.com /** Number of defined callbacks */ 9010915Sandreas.sandberg@arm.com NOMALI_CALLBACK_NUM_CALLBACKS 9110915Sandreas.sandberg@arm.com}; 9210915Sandreas.sandberg@arm.comtypedef int nomali_callback_type_t; 9310915Sandreas.sandberg@arm.com 9410915Sandreas.sandberg@arm.comenum { 9510915Sandreas.sandberg@arm.com NOMALI_INT_GPU = 0, 9610915Sandreas.sandberg@arm.com NOMALI_INT_JOB, 9710915Sandreas.sandberg@arm.com NOMALI_INT_MMU, 9810915Sandreas.sandberg@arm.com}; 9910915Sandreas.sandberg@arm.comtypedef int nomali_int_t; 10010915Sandreas.sandberg@arm.com 10110915Sandreas.sandberg@arm.comtypedef uint64_t nomali_addr_t; 10210915Sandreas.sandberg@arm.comtypedef uint64_t nomali_size_t; 10310915Sandreas.sandberg@arm.com 10410915Sandreas.sandberg@arm.com/** 10510915Sandreas.sandberg@arm.com * Callback information structure. 10610915Sandreas.sandberg@arm.com */ 10710915Sandreas.sandberg@arm.comtypedef struct { 10810915Sandreas.sandberg@arm.com /** Callback type */ 10910915Sandreas.sandberg@arm.com nomali_callback_type_t type; 11010915Sandreas.sandberg@arm.com /** Pointer to user-defined data associated with callback */ 11110915Sandreas.sandberg@arm.com void *usr; 11210915Sandreas.sandberg@arm.com /** Pointer to callback function */ 11310915Sandreas.sandberg@arm.com union { 11410915Sandreas.sandberg@arm.com /** 11510915Sandreas.sandberg@arm.com * Interrupt state change 11610915Sandreas.sandberg@arm.com * 11710915Sandreas.sandberg@arm.com * @param h Model instance handle. 11810915Sandreas.sandberg@arm.com * @param usr User-defined data associated with callback. 11910915Sandreas.sandberg@arm.com * @param intno Interrupt number. 12010915Sandreas.sandberg@arm.com * @param set Non-zero if raising an interrupt, zero if clearing. 12110915Sandreas.sandberg@arm.com */ 12210915Sandreas.sandberg@arm.com void (*interrupt)(nomali_handle_t h, void *usr, 12310915Sandreas.sandberg@arm.com nomali_int_t intno, int set); 12410915Sandreas.sandberg@arm.com void (*memwrite)(nomali_handle_t h, void *usr, 12510915Sandreas.sandberg@arm.com nomali_addr_t addr, uint32_t value); 12610915Sandreas.sandberg@arm.com uint32_t (*memread)(nomali_handle_t h, void *usr, 12710915Sandreas.sandberg@arm.com nomali_addr_t addr); 12810915Sandreas.sandberg@arm.com } func; 12910915Sandreas.sandberg@arm.com} nomali_callback_t; 13010915Sandreas.sandberg@arm.com 13110915Sandreas.sandberg@arm.com/** 13210915Sandreas.sandberg@arm.com * GPU information struct. See nomali_get_info(). 13310915Sandreas.sandberg@arm.com */ 13410915Sandreas.sandberg@arm.comtypedef struct { 13510915Sandreas.sandberg@arm.com /** Size (in bytes) of the register window used by the GPU */ 13610915Sandreas.sandberg@arm.com nomali_size_t reg_size; 13710915Sandreas.sandberg@arm.com} nomali_info_t; 13810915Sandreas.sandberg@arm.com 13910915Sandreas.sandberg@arm.comtypedef uint32_t nomali_api_version_t; 14010915Sandreas.sandberg@arm.com 14110915Sandreas.sandberg@arm.com/** 14210915Sandreas.sandberg@arm.com * Current version of the NoMali API 14310915Sandreas.sandberg@arm.com * 14410915Sandreas.sandberg@arm.com * This version number will increase whenever the API changes. 14510915Sandreas.sandberg@arm.com * 14610915Sandreas.sandberg@arm.com * @see nomali_api_version() 14710915Sandreas.sandberg@arm.com */ 14810915Sandreas.sandberg@arm.com#define NOMALI_API_VERSION 0 14910915Sandreas.sandberg@arm.com 15010915Sandreas.sandberg@arm.com/** 15110915Sandreas.sandberg@arm.com * Get the version of the API implemented by the library. 15210915Sandreas.sandberg@arm.com * 15310915Sandreas.sandberg@arm.com * Before instantiating a NoMali model, the driving application need 15410915Sandreas.sandberg@arm.com * to ensure that the library implements a compatible version of the 15510915Sandreas.sandberg@arm.com * NoMali API. This is done by calling this function and matching the 15610915Sandreas.sandberg@arm.com * return value with the NOMALI_API_VERSION define. The result of any 15710915Sandreas.sandberg@arm.com * call to the NoMali library is undefined if there is a miss-match 15810915Sandreas.sandberg@arm.com * between the two. 15910915Sandreas.sandberg@arm.com */ 16010915Sandreas.sandberg@arm.comnomali_api_version_t nomali_api_version(); 16110915Sandreas.sandberg@arm.com 16210915Sandreas.sandberg@arm.com/** 16310915Sandreas.sandberg@arm.com * Create an instance of the NoMali model. 16410915Sandreas.sandberg@arm.com * 16510915Sandreas.sandberg@arm.com * @param[out] h Handle of the new NoMali model instance, undefined on 16610915Sandreas.sandberg@arm.com * error. 16710915Sandreas.sandberg@arm.com * 16810915Sandreas.sandberg@arm.com * @param[in] cfg NoMali GPU configuration. 16910915Sandreas.sandberg@arm.com * 17010915Sandreas.sandberg@arm.com * @errors 17110915Sandreas.sandberg@arm.com * @error NOMALI_E_OK on success. 17210915Sandreas.sandberg@arm.com * @error NOMALI_E_MEMORY if a memory allocation failed. 17310915Sandreas.sandberg@arm.com * @error NOMALI_E_INVALID if a pointer to an output parameter is 17410915Sandreas.sandberg@arm.com * invalid. 17510915Sandreas.sandberg@arm.com */ 17610915Sandreas.sandberg@arm.comnomali_error_t nomali_create(nomali_handle_t *h, const nomali_config_t *cfg); 17710915Sandreas.sandberg@arm.com/** 17810915Sandreas.sandberg@arm.com * Destroy and free resources used by an existing NoMali instance. 17910915Sandreas.sandberg@arm.com * 18010915Sandreas.sandberg@arm.com * @param[in] h Model instance handle. 18110915Sandreas.sandberg@arm.com * 18210915Sandreas.sandberg@arm.com * @errors 18310915Sandreas.sandberg@arm.com * @error NOMALI_E_OK on success. 18410915Sandreas.sandberg@arm.com * @error NOMALI_E_HANDLE if the handle was invalid. 18510915Sandreas.sandberg@arm.com */ 18610915Sandreas.sandberg@arm.comnomali_error_t nomali_destroy(nomali_handle_t h); 18710915Sandreas.sandberg@arm.com 18810915Sandreas.sandberg@arm.com 18910915Sandreas.sandberg@arm.com/** 19010915Sandreas.sandberg@arm.com * Get a textual description of an error number. 19110915Sandreas.sandberg@arm.com * 19210915Sandreas.sandberg@arm.com * @param[in] error Error number to resolve. 19310915Sandreas.sandberg@arm.com * 19410915Sandreas.sandberg@arm.com * @return Pointer to a constant, null-terminated, string describing 19510915Sandreas.sandberg@arm.com * an error number. 19610915Sandreas.sandberg@arm.com */ 19710915Sandreas.sandberg@arm.comconst char *nomali_errstr(nomali_error_t error); 19810915Sandreas.sandberg@arm.com 19910915Sandreas.sandberg@arm.com/** 20010915Sandreas.sandberg@arm.com * Setup callbacks from the model. 20110915Sandreas.sandberg@arm.com * 20210915Sandreas.sandberg@arm.com * @param[in] h Model instance handle. 20310915Sandreas.sandberg@arm.com * @param[in] callback Structure describing the new callback to be 20410915Sandreas.sandberg@arm.com * installed. 20510915Sandreas.sandberg@arm.com * 20610915Sandreas.sandberg@arm.com * @errors 20710915Sandreas.sandberg@arm.com * @error NOMALI_E_OK on success. 20810915Sandreas.sandberg@arm.com * @error NOMALI_E_HANDLE if the handle was invalid. 20910915Sandreas.sandberg@arm.com * @error NOMALI_E_INVALID if the callback type was invalid. 21010915Sandreas.sandberg@arm.com * 21110915Sandreas.sandberg@arm.com * @see nomali_callback_t 21210915Sandreas.sandberg@arm.com */ 21310915Sandreas.sandberg@arm.comnomali_error_t nomali_set_callback(nomali_handle_t h, 21410915Sandreas.sandberg@arm.com const nomali_callback_t *callback); 21510915Sandreas.sandberg@arm.com 21610915Sandreas.sandberg@arm.com/** 21710915Sandreas.sandberg@arm.com * Get information about the hardware simulated by the model. 21810915Sandreas.sandberg@arm.com * 21910915Sandreas.sandberg@arm.com * @param[in] h Model instance handle. 22010915Sandreas.sandberg@arm.com * @param[out] info Structure describing the model. 22110915Sandreas.sandberg@arm.com * 22210915Sandreas.sandberg@arm.com * @errors 22310915Sandreas.sandberg@arm.com * @error NOMALI_E_OK on success. 22410915Sandreas.sandberg@arm.com * @error NOMALI_E_HANDLE if the handle was invalid. 22510915Sandreas.sandberg@arm.com * @error NOMALI_E_INVALID if info is not pointing to a valid 22610915Sandreas.sandberg@arm.com * location. 22710915Sandreas.sandberg@arm.com * 22810915Sandreas.sandberg@arm.com * @see nomali_info_t 22910915Sandreas.sandberg@arm.com */ 23010915Sandreas.sandberg@arm.comnomali_error_t nomali_get_info(nomali_handle_t h, 23110915Sandreas.sandberg@arm.com nomali_info_t *info); 23210915Sandreas.sandberg@arm.com 23310915Sandreas.sandberg@arm.com/** 23410915Sandreas.sandberg@arm.com * Perform a reset of the device. 23510915Sandreas.sandberg@arm.com * 23610915Sandreas.sandberg@arm.com * @param[in] h Model instance handle. 23710915Sandreas.sandberg@arm.com * 23810915Sandreas.sandberg@arm.com * @errors 23910915Sandreas.sandberg@arm.com * @error NOMALI_E_OK on success. 24010915Sandreas.sandberg@arm.com * @error NOMALI_E_HANDLE if the handle was invalid. 24110915Sandreas.sandberg@arm.com */ 24210915Sandreas.sandberg@arm.comnomali_error_t nomali_reset(nomali_handle_t h); 24310915Sandreas.sandberg@arm.com 24410915Sandreas.sandberg@arm.com/** 24510915Sandreas.sandberg@arm.com * Read a register within the device. 24610915Sandreas.sandberg@arm.com * 24710915Sandreas.sandberg@arm.com * @param[in] h Model instance handle. 24810915Sandreas.sandberg@arm.com * @param[out] value Pointer to output. 24910915Sandreas.sandberg@arm.com * @param[in] addr Address to read. 25010915Sandreas.sandberg@arm.com * 25110915Sandreas.sandberg@arm.com * @errors 25210915Sandreas.sandberg@arm.com * @error NOMALI_E_OK on success. 25310915Sandreas.sandberg@arm.com * @error NOMALI_E_HANDLE if the handle was invalid. 25410915Sandreas.sandberg@arm.com * @error NOMALI_E_INVALID if an invalid register was specified or if the 25510915Sandreas.sandberg@arm.com * pointer to the output location was invalid. 25610915Sandreas.sandberg@arm.com */ 25710915Sandreas.sandberg@arm.comnomali_error_t nomali_reg_read(nomali_handle_t h, uint32_t *value, 25810915Sandreas.sandberg@arm.com nomali_addr_t addr); 25910915Sandreas.sandberg@arm.com 26010915Sandreas.sandberg@arm.com/** 26110915Sandreas.sandberg@arm.com * Write to a register within the device. 26210915Sandreas.sandberg@arm.com * 26310915Sandreas.sandberg@arm.com * @param[in] h Model instance handle. 26410915Sandreas.sandberg@arm.com * @param[in] addr Address to read. 26510915Sandreas.sandberg@arm.com * @param[in] value Value to write to the register. 26610915Sandreas.sandberg@arm.com * 26710915Sandreas.sandberg@arm.com * @errors 26810915Sandreas.sandberg@arm.com * @error NOMALI_E_OK on success. 26910915Sandreas.sandberg@arm.com * @error NOMALI_E_HANDLE if the handle was invalid. 27010915Sandreas.sandberg@arm.com * @error NOMALI_E_INVALID if an invalid register was specified. 27110915Sandreas.sandberg@arm.com */ 27210915Sandreas.sandberg@arm.comnomali_error_t nomali_reg_write(nomali_handle_t h, 27310915Sandreas.sandberg@arm.com nomali_addr_t addr, uint32_t value); 27410915Sandreas.sandberg@arm.com 27510915Sandreas.sandberg@arm.com/** 27610915Sandreas.sandberg@arm.com * Read a register without side effects. 27710915Sandreas.sandberg@arm.com * 27810915Sandreas.sandberg@arm.com * @param[in] h Model instance handle. 27910915Sandreas.sandberg@arm.com * @param[out] value Pointer to output. 28010915Sandreas.sandberg@arm.com * @param[in] addr Address to read. 28110915Sandreas.sandberg@arm.com * 28210915Sandreas.sandberg@arm.com * @errors 28310915Sandreas.sandberg@arm.com * @error NOMALI_E_OK on success. 28410915Sandreas.sandberg@arm.com * @error NOMALI_E_HANDLE if the handle was invalid. 28510915Sandreas.sandberg@arm.com * @error NOMALI_E_INVALID if an invalid register was specified or if the 28610915Sandreas.sandberg@arm.com * pointer to the output location was invalid. 28710915Sandreas.sandberg@arm.com */ 28810915Sandreas.sandberg@arm.comnomali_error_t nomali_reg_read_raw(nomali_handle_t h, uint32_t *value, 28910915Sandreas.sandberg@arm.com nomali_addr_t addr); 29010915Sandreas.sandberg@arm.com 29110915Sandreas.sandberg@arm.com/** 29210915Sandreas.sandberg@arm.com * Write to a register without side effects. 29310915Sandreas.sandberg@arm.com * 29410915Sandreas.sandberg@arm.com * @param[in] h Model instance handle. 29510915Sandreas.sandberg@arm.com * @param[in] addr Address to read. 29610915Sandreas.sandberg@arm.com * @param[in] value Value to write to the register. 29710915Sandreas.sandberg@arm.com * 29810915Sandreas.sandberg@arm.com * @errors 29910915Sandreas.sandberg@arm.com * @error NOMALI_E_OK on success. 30010915Sandreas.sandberg@arm.com * @error NOMALI_E_HANDLE if the handle was invalid. 30110915Sandreas.sandberg@arm.com * @error NOMALI_E_INVALID if an invalid register was specified. 30210915Sandreas.sandberg@arm.com */ 30310915Sandreas.sandberg@arm.comnomali_error_t nomali_reg_write_raw(nomali_handle_t h, 30410915Sandreas.sandberg@arm.com nomali_addr_t addr, uint32_t value); 30510915Sandreas.sandberg@arm.com 30610915Sandreas.sandberg@arm.com/** 30710915Sandreas.sandberg@arm.com * Get the state of an interrupt line 30810915Sandreas.sandberg@arm.com * 30910915Sandreas.sandberg@arm.com * This function queries the state of one of the GPU's interrupt 31010915Sandreas.sandberg@arm.com * lines. The state of the interrupt line is returned in 'state', 31110915Sandreas.sandberg@arm.com * which is 1 if the interrupt is being asserted and 0 otherwise. The 31210915Sandreas.sandberg@arm.com * value of the state variable is undefined if the function call 31310915Sandreas.sandberg@arm.com * fails. 31410915Sandreas.sandberg@arm.com * 31510915Sandreas.sandberg@arm.com * @param[in] h Model instance handle. 31610915Sandreas.sandberg@arm.com * @param[out] state Pointer to output, 1 if the interrupt is 31710915Sandreas.sandberg@arm.com * asserted, 0 otherwise. 31810915Sandreas.sandberg@arm.com * @param[in] intno Interrupt to query. 31910915Sandreas.sandberg@arm.com * 32010915Sandreas.sandberg@arm.com * @errors 32110915Sandreas.sandberg@arm.com * @error NOMALI_E_OK on success. 32210915Sandreas.sandberg@arm.com * @error NOMALI_E_HANDLE if the handle was invalid. 32310915Sandreas.sandberg@arm.com * @error NOMALI_E_INVALID if an invalid interrupt was specified or if 32410915Sandreas.sandberg@arm.com * pointer to the output location was invalid. 32510915Sandreas.sandberg@arm.com */ 32610915Sandreas.sandberg@arm.comnomali_error_t nomali_int_state(nomali_handle_t h, int *state, 32710915Sandreas.sandberg@arm.com nomali_int_t intno); 32810915Sandreas.sandberg@arm.com 32910915Sandreas.sandberg@arm.com#ifdef __cplusplus 33010915Sandreas.sandberg@arm.com}; 33110915Sandreas.sandberg@arm.com#endif 33210915Sandreas.sandberg@arm.com 33310915Sandreas.sandberg@arm.com#endif /* _LIBNOMALI_NOMALI_HH */ 334