110915Sandreas.sandberg@arm.com/* 211313Sandreas.sandberg@arm.com * Copyright (c) 2014-2016 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, 8811313Sandreas.sandberg@arm.com /** Model reset callback */ 8911313Sandreas.sandberg@arm.com NOMALI_CALLBACK_RESET, 9010915Sandreas.sandberg@arm.com 9110915Sandreas.sandberg@arm.com /** Number of defined callbacks */ 9210915Sandreas.sandberg@arm.com NOMALI_CALLBACK_NUM_CALLBACKS 9310915Sandreas.sandberg@arm.com}; 9410915Sandreas.sandberg@arm.comtypedef int nomali_callback_type_t; 9510915Sandreas.sandberg@arm.com 9610915Sandreas.sandberg@arm.comenum { 9710915Sandreas.sandberg@arm.com NOMALI_INT_GPU = 0, 9810915Sandreas.sandberg@arm.com NOMALI_INT_JOB, 9910915Sandreas.sandberg@arm.com NOMALI_INT_MMU, 10010915Sandreas.sandberg@arm.com}; 10110915Sandreas.sandberg@arm.comtypedef int nomali_int_t; 10210915Sandreas.sandberg@arm.com 10310915Sandreas.sandberg@arm.comtypedef uint64_t nomali_addr_t; 10410915Sandreas.sandberg@arm.comtypedef uint64_t nomali_size_t; 10510915Sandreas.sandberg@arm.com 10610915Sandreas.sandberg@arm.com/** 10710915Sandreas.sandberg@arm.com * Callback information structure. 10810915Sandreas.sandberg@arm.com */ 10910915Sandreas.sandberg@arm.comtypedef struct { 11010915Sandreas.sandberg@arm.com /** Callback type */ 11110915Sandreas.sandberg@arm.com nomali_callback_type_t type; 11210915Sandreas.sandberg@arm.com /** Pointer to user-defined data associated with callback */ 11310915Sandreas.sandberg@arm.com void *usr; 11410915Sandreas.sandberg@arm.com /** Pointer to callback function */ 11510915Sandreas.sandberg@arm.com union { 11610915Sandreas.sandberg@arm.com /** 11710915Sandreas.sandberg@arm.com * Interrupt state change 11810915Sandreas.sandberg@arm.com * 11910915Sandreas.sandberg@arm.com * @param h Model instance handle. 12010915Sandreas.sandberg@arm.com * @param usr User-defined data associated with callback. 12110915Sandreas.sandberg@arm.com * @param intno Interrupt number. 12210915Sandreas.sandberg@arm.com * @param set Non-zero if raising an interrupt, zero if clearing. 12310915Sandreas.sandberg@arm.com */ 12410915Sandreas.sandberg@arm.com void (*interrupt)(nomali_handle_t h, void *usr, 12510915Sandreas.sandberg@arm.com nomali_int_t intno, int set); 12610915Sandreas.sandberg@arm.com void (*memwrite)(nomali_handle_t h, void *usr, 12710915Sandreas.sandberg@arm.com nomali_addr_t addr, uint32_t value); 12810915Sandreas.sandberg@arm.com uint32_t (*memread)(nomali_handle_t h, void *usr, 12910915Sandreas.sandberg@arm.com nomali_addr_t addr); 13011313Sandreas.sandberg@arm.com void (*reset)(nomali_handle_t h, void *usr); 13110915Sandreas.sandberg@arm.com } func; 13210915Sandreas.sandberg@arm.com} nomali_callback_t; 13310915Sandreas.sandberg@arm.com 13410915Sandreas.sandberg@arm.com/** 13510915Sandreas.sandberg@arm.com * GPU information struct. See nomali_get_info(). 13610915Sandreas.sandberg@arm.com */ 13710915Sandreas.sandberg@arm.comtypedef struct { 13810915Sandreas.sandberg@arm.com /** Size (in bytes) of the register window used by the GPU */ 13910915Sandreas.sandberg@arm.com nomali_size_t reg_size; 14010915Sandreas.sandberg@arm.com} nomali_info_t; 14110915Sandreas.sandberg@arm.com 14210915Sandreas.sandberg@arm.comtypedef uint32_t nomali_api_version_t; 14310915Sandreas.sandberg@arm.com 14410915Sandreas.sandberg@arm.com/** 14510915Sandreas.sandberg@arm.com * Current version of the NoMali API 14610915Sandreas.sandberg@arm.com * 14710915Sandreas.sandberg@arm.com * This version number will increase whenever the API changes. 14810915Sandreas.sandberg@arm.com * 14910915Sandreas.sandberg@arm.com * @see nomali_api_version() 15010915Sandreas.sandberg@arm.com */ 15110915Sandreas.sandberg@arm.com#define NOMALI_API_VERSION 0 15210915Sandreas.sandberg@arm.com 15310915Sandreas.sandberg@arm.com/** 15410915Sandreas.sandberg@arm.com * Get the version of the API implemented by the library. 15510915Sandreas.sandberg@arm.com * 15610915Sandreas.sandberg@arm.com * Before instantiating a NoMali model, the driving application need 15710915Sandreas.sandberg@arm.com * to ensure that the library implements a compatible version of the 15810915Sandreas.sandberg@arm.com * NoMali API. This is done by calling this function and matching the 15910915Sandreas.sandberg@arm.com * return value with the NOMALI_API_VERSION define. The result of any 16010915Sandreas.sandberg@arm.com * call to the NoMali library is undefined if there is a miss-match 16110915Sandreas.sandberg@arm.com * between the two. 16210915Sandreas.sandberg@arm.com */ 16310915Sandreas.sandberg@arm.comnomali_api_version_t nomali_api_version(); 16410915Sandreas.sandberg@arm.com 16510915Sandreas.sandberg@arm.com/** 16610915Sandreas.sandberg@arm.com * Create an instance of the NoMali model. 16710915Sandreas.sandberg@arm.com * 16810915Sandreas.sandberg@arm.com * @param[out] h Handle of the new NoMali model instance, undefined on 16910915Sandreas.sandberg@arm.com * error. 17010915Sandreas.sandberg@arm.com * 17110915Sandreas.sandberg@arm.com * @param[in] cfg NoMali GPU configuration. 17210915Sandreas.sandberg@arm.com * 17310915Sandreas.sandberg@arm.com * @errors 17410915Sandreas.sandberg@arm.com * @error NOMALI_E_OK on success. 17510915Sandreas.sandberg@arm.com * @error NOMALI_E_MEMORY if a memory allocation failed. 17610915Sandreas.sandberg@arm.com * @error NOMALI_E_INVALID if a pointer to an output parameter is 17710915Sandreas.sandberg@arm.com * invalid. 17810915Sandreas.sandberg@arm.com */ 17910915Sandreas.sandberg@arm.comnomali_error_t nomali_create(nomali_handle_t *h, const nomali_config_t *cfg); 18010915Sandreas.sandberg@arm.com/** 18110915Sandreas.sandberg@arm.com * Destroy and free resources used by an existing NoMali instance. 18210915Sandreas.sandberg@arm.com * 18310915Sandreas.sandberg@arm.com * @param[in] h Model instance handle. 18410915Sandreas.sandberg@arm.com * 18510915Sandreas.sandberg@arm.com * @errors 18610915Sandreas.sandberg@arm.com * @error NOMALI_E_OK on success. 18710915Sandreas.sandberg@arm.com * @error NOMALI_E_HANDLE if the handle was invalid. 18810915Sandreas.sandberg@arm.com */ 18910915Sandreas.sandberg@arm.comnomali_error_t nomali_destroy(nomali_handle_t h); 19010915Sandreas.sandberg@arm.com 19110915Sandreas.sandberg@arm.com 19210915Sandreas.sandberg@arm.com/** 19310915Sandreas.sandberg@arm.com * Get a textual description of an error number. 19410915Sandreas.sandberg@arm.com * 19510915Sandreas.sandberg@arm.com * @param[in] error Error number to resolve. 19610915Sandreas.sandberg@arm.com * 19710915Sandreas.sandberg@arm.com * @return Pointer to a constant, null-terminated, string describing 19810915Sandreas.sandberg@arm.com * an error number. 19910915Sandreas.sandberg@arm.com */ 20010915Sandreas.sandberg@arm.comconst char *nomali_errstr(nomali_error_t error); 20110915Sandreas.sandberg@arm.com 20210915Sandreas.sandberg@arm.com/** 20310915Sandreas.sandberg@arm.com * Setup callbacks from the model. 20410915Sandreas.sandberg@arm.com * 20510915Sandreas.sandberg@arm.com * @param[in] h Model instance handle. 20610915Sandreas.sandberg@arm.com * @param[in] callback Structure describing the new callback to be 20710915Sandreas.sandberg@arm.com * installed. 20810915Sandreas.sandberg@arm.com * 20910915Sandreas.sandberg@arm.com * @errors 21010915Sandreas.sandberg@arm.com * @error NOMALI_E_OK on success. 21110915Sandreas.sandberg@arm.com * @error NOMALI_E_HANDLE if the handle was invalid. 21210915Sandreas.sandberg@arm.com * @error NOMALI_E_INVALID if the callback type was invalid. 21310915Sandreas.sandberg@arm.com * 21410915Sandreas.sandberg@arm.com * @see nomali_callback_t 21510915Sandreas.sandberg@arm.com */ 21610915Sandreas.sandberg@arm.comnomali_error_t nomali_set_callback(nomali_handle_t h, 21710915Sandreas.sandberg@arm.com const nomali_callback_t *callback); 21810915Sandreas.sandberg@arm.com 21910915Sandreas.sandberg@arm.com/** 22010915Sandreas.sandberg@arm.com * Get information about the hardware simulated by the model. 22110915Sandreas.sandberg@arm.com * 22210915Sandreas.sandberg@arm.com * @param[in] h Model instance handle. 22310915Sandreas.sandberg@arm.com * @param[out] info Structure describing the model. 22410915Sandreas.sandberg@arm.com * 22510915Sandreas.sandberg@arm.com * @errors 22610915Sandreas.sandberg@arm.com * @error NOMALI_E_OK on success. 22710915Sandreas.sandberg@arm.com * @error NOMALI_E_HANDLE if the handle was invalid. 22810915Sandreas.sandberg@arm.com * @error NOMALI_E_INVALID if info is not pointing to a valid 22910915Sandreas.sandberg@arm.com * location. 23010915Sandreas.sandberg@arm.com * 23110915Sandreas.sandberg@arm.com * @see nomali_info_t 23210915Sandreas.sandberg@arm.com */ 23310915Sandreas.sandberg@arm.comnomali_error_t nomali_get_info(nomali_handle_t h, 23410915Sandreas.sandberg@arm.com nomali_info_t *info); 23510915Sandreas.sandberg@arm.com 23610915Sandreas.sandberg@arm.com/** 23710915Sandreas.sandberg@arm.com * Perform a reset of the device. 23810915Sandreas.sandberg@arm.com * 23910915Sandreas.sandberg@arm.com * @param[in] h Model instance handle. 24010915Sandreas.sandberg@arm.com * 24110915Sandreas.sandberg@arm.com * @errors 24210915Sandreas.sandberg@arm.com * @error NOMALI_E_OK on success. 24310915Sandreas.sandberg@arm.com * @error NOMALI_E_HANDLE if the handle was invalid. 24410915Sandreas.sandberg@arm.com */ 24510915Sandreas.sandberg@arm.comnomali_error_t nomali_reset(nomali_handle_t h); 24610915Sandreas.sandberg@arm.com 24710915Sandreas.sandberg@arm.com/** 24810915Sandreas.sandberg@arm.com * Read a register within the device. 24910915Sandreas.sandberg@arm.com * 25010915Sandreas.sandberg@arm.com * @param[in] h Model instance handle. 25110915Sandreas.sandberg@arm.com * @param[out] value Pointer to output. 25210915Sandreas.sandberg@arm.com * @param[in] addr Address to read. 25310915Sandreas.sandberg@arm.com * 25410915Sandreas.sandberg@arm.com * @errors 25510915Sandreas.sandberg@arm.com * @error NOMALI_E_OK on success. 25610915Sandreas.sandberg@arm.com * @error NOMALI_E_HANDLE if the handle was invalid. 25710915Sandreas.sandberg@arm.com * @error NOMALI_E_INVALID if an invalid register was specified or if the 25810915Sandreas.sandberg@arm.com * pointer to the output location was invalid. 25910915Sandreas.sandberg@arm.com */ 26010915Sandreas.sandberg@arm.comnomali_error_t nomali_reg_read(nomali_handle_t h, uint32_t *value, 26110915Sandreas.sandberg@arm.com nomali_addr_t addr); 26210915Sandreas.sandberg@arm.com 26310915Sandreas.sandberg@arm.com/** 26410915Sandreas.sandberg@arm.com * Write to a register within the device. 26510915Sandreas.sandberg@arm.com * 26610915Sandreas.sandberg@arm.com * @param[in] h Model instance handle. 26710915Sandreas.sandberg@arm.com * @param[in] addr Address to read. 26810915Sandreas.sandberg@arm.com * @param[in] value Value to write to the register. 26910915Sandreas.sandberg@arm.com * 27010915Sandreas.sandberg@arm.com * @errors 27110915Sandreas.sandberg@arm.com * @error NOMALI_E_OK on success. 27210915Sandreas.sandberg@arm.com * @error NOMALI_E_HANDLE if the handle was invalid. 27310915Sandreas.sandberg@arm.com * @error NOMALI_E_INVALID if an invalid register was specified. 27410915Sandreas.sandberg@arm.com */ 27510915Sandreas.sandberg@arm.comnomali_error_t nomali_reg_write(nomali_handle_t h, 27610915Sandreas.sandberg@arm.com nomali_addr_t addr, uint32_t value); 27710915Sandreas.sandberg@arm.com 27810915Sandreas.sandberg@arm.com/** 27910915Sandreas.sandberg@arm.com * Read a register without side effects. 28010915Sandreas.sandberg@arm.com * 28110915Sandreas.sandberg@arm.com * @param[in] h Model instance handle. 28210915Sandreas.sandberg@arm.com * @param[out] value Pointer to output. 28310915Sandreas.sandberg@arm.com * @param[in] addr Address to read. 28410915Sandreas.sandberg@arm.com * 28510915Sandreas.sandberg@arm.com * @errors 28610915Sandreas.sandberg@arm.com * @error NOMALI_E_OK on success. 28710915Sandreas.sandberg@arm.com * @error NOMALI_E_HANDLE if the handle was invalid. 28810915Sandreas.sandberg@arm.com * @error NOMALI_E_INVALID if an invalid register was specified or if the 28910915Sandreas.sandberg@arm.com * pointer to the output location was invalid. 29010915Sandreas.sandberg@arm.com */ 29110915Sandreas.sandberg@arm.comnomali_error_t nomali_reg_read_raw(nomali_handle_t h, uint32_t *value, 29210915Sandreas.sandberg@arm.com nomali_addr_t addr); 29310915Sandreas.sandberg@arm.com 29410915Sandreas.sandberg@arm.com/** 29510915Sandreas.sandberg@arm.com * Write to a register without side effects. 29610915Sandreas.sandberg@arm.com * 29710915Sandreas.sandberg@arm.com * @param[in] h Model instance handle. 29810915Sandreas.sandberg@arm.com * @param[in] addr Address to read. 29910915Sandreas.sandberg@arm.com * @param[in] value Value to write to the register. 30010915Sandreas.sandberg@arm.com * 30110915Sandreas.sandberg@arm.com * @errors 30210915Sandreas.sandberg@arm.com * @error NOMALI_E_OK on success. 30310915Sandreas.sandberg@arm.com * @error NOMALI_E_HANDLE if the handle was invalid. 30410915Sandreas.sandberg@arm.com * @error NOMALI_E_INVALID if an invalid register was specified. 30510915Sandreas.sandberg@arm.com */ 30610915Sandreas.sandberg@arm.comnomali_error_t nomali_reg_write_raw(nomali_handle_t h, 30710915Sandreas.sandberg@arm.com nomali_addr_t addr, uint32_t value); 30810915Sandreas.sandberg@arm.com 30910915Sandreas.sandberg@arm.com/** 31010915Sandreas.sandberg@arm.com * Get the state of an interrupt line 31110915Sandreas.sandberg@arm.com * 31210915Sandreas.sandberg@arm.com * This function queries the state of one of the GPU's interrupt 31310915Sandreas.sandberg@arm.com * lines. The state of the interrupt line is returned in 'state', 31410915Sandreas.sandberg@arm.com * which is 1 if the interrupt is being asserted and 0 otherwise. The 31510915Sandreas.sandberg@arm.com * value of the state variable is undefined if the function call 31610915Sandreas.sandberg@arm.com * fails. 31710915Sandreas.sandberg@arm.com * 31810915Sandreas.sandberg@arm.com * @param[in] h Model instance handle. 31910915Sandreas.sandberg@arm.com * @param[out] state Pointer to output, 1 if the interrupt is 32010915Sandreas.sandberg@arm.com * asserted, 0 otherwise. 32110915Sandreas.sandberg@arm.com * @param[in] intno Interrupt to query. 32210915Sandreas.sandberg@arm.com * 32310915Sandreas.sandberg@arm.com * @errors 32410915Sandreas.sandberg@arm.com * @error NOMALI_E_OK on success. 32510915Sandreas.sandberg@arm.com * @error NOMALI_E_HANDLE if the handle was invalid. 32610915Sandreas.sandberg@arm.com * @error NOMALI_E_INVALID if an invalid interrupt was specified or if 32710915Sandreas.sandberg@arm.com * pointer to the output location was invalid. 32810915Sandreas.sandberg@arm.com */ 32910915Sandreas.sandberg@arm.comnomali_error_t nomali_int_state(nomali_handle_t h, int *state, 33010915Sandreas.sandberg@arm.com nomali_int_t intno); 33110915Sandreas.sandberg@arm.com 33210915Sandreas.sandberg@arm.com#ifdef __cplusplus 33310915Sandreas.sandberg@arm.com}; 33410915Sandreas.sandberg@arm.com#endif 33510915Sandreas.sandberg@arm.com 33610915Sandreas.sandberg@arm.com#endif /* _LIBNOMALI_NOMALI_HH */ 337