/* * Copyright (c) 2014-2016 ARM Limited * All rights reserved * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Authors: Andreas Sandberg */ #ifndef _LIBNOMALI_NOMALI_HH #define _LIBNOMALI_NOMALI_HH #include #ifdef __cplusplus extern "C" { #endif /** * @file libnomali/nomali.h * @short This header defines the NoMali stub GPU model interface. * */ /** Opaque NoMali model handle. */ typedef void* nomali_handle_t; /** * NoMali error codes. */ enum { /** No error */ NOMALI_E_OK = 0, /** Unknown error */ NOMALI_E_UNKNOWN, /** Memory allocation failed */ NOMALI_E_MEMORY, /** Invalid model handle */ NOMALI_E_HANDLE, /** Invalid parameter */ NOMALI_E_INVALID, /** * Number of errors defined * * @note This error, and higher error numbers, can be issued if * the library is newer than the header file. Software should * tread this condition as an unknown error. */ NOMALI_E_NUM_ERRORS }; typedef int nomali_error_t; enum { NOMALI_GPU_T60X = 0, NOMALI_GPU_T62X, NOMALI_GPU_T76X, NOMALI_GPU_T760 = NOMALI_GPU_T76X, }; typedef int nomali_gpu_type_t; typedef struct { nomali_gpu_type_t type; unsigned ver_maj; unsigned ver_min; unsigned ver_status; } nomali_config_t; enum { /** Model is signalling an interrupt */ NOMALI_CALLBACK_INT = 0, /** Model read physical memory callback */ NOMALI_CALLBACK_MEMREAD, /** Model write physical memory callback */ NOMALI_CALLBACK_MEMWRITE, /** Model reset callback */ NOMALI_CALLBACK_RESET, /** Number of defined callbacks */ NOMALI_CALLBACK_NUM_CALLBACKS }; typedef int nomali_callback_type_t; enum { NOMALI_INT_GPU = 0, NOMALI_INT_JOB, NOMALI_INT_MMU, }; typedef int nomali_int_t; typedef uint64_t nomali_addr_t; typedef uint64_t nomali_size_t; /** * Callback information structure. */ typedef struct { /** Callback type */ nomali_callback_type_t type; /** Pointer to user-defined data associated with callback */ void *usr; /** Pointer to callback function */ union { /** * Interrupt state change * * @param h Model instance handle. * @param usr User-defined data associated with callback. * @param intno Interrupt number. * @param set Non-zero if raising an interrupt, zero if clearing. */ void (*interrupt)(nomali_handle_t h, void *usr, nomali_int_t intno, int set); void (*memwrite)(nomali_handle_t h, void *usr, nomali_addr_t addr, uint32_t value); uint32_t (*memread)(nomali_handle_t h, void *usr, nomali_addr_t addr); void (*reset)(nomali_handle_t h, void *usr); } func; } nomali_callback_t; /** * GPU information struct. See nomali_get_info(). */ typedef struct { /** Size (in bytes) of the register window used by the GPU */ nomali_size_t reg_size; } nomali_info_t; typedef uint32_t nomali_api_version_t; /** * Current version of the NoMali API * * This version number will increase whenever the API changes. * * @see nomali_api_version() */ #define NOMALI_API_VERSION 0 /** * Get the version of the API implemented by the library. * * Before instantiating a NoMali model, the driving application need * to ensure that the library implements a compatible version of the * NoMali API. This is done by calling this function and matching the * return value with the NOMALI_API_VERSION define. The result of any * call to the NoMali library is undefined if there is a miss-match * between the two. */ nomali_api_version_t nomali_api_version(); /** * Create an instance of the NoMali model. * * @param[out] h Handle of the new NoMali model instance, undefined on * error. * * @param[in] cfg NoMali GPU configuration. * * @errors * @error NOMALI_E_OK on success. * @error NOMALI_E_MEMORY if a memory allocation failed. * @error NOMALI_E_INVALID if a pointer to an output parameter is * invalid. */ nomali_error_t nomali_create(nomali_handle_t *h, const nomali_config_t *cfg); /** * Destroy and free resources used by an existing NoMali instance. * * @param[in] h Model instance handle. * * @errors * @error NOMALI_E_OK on success. * @error NOMALI_E_HANDLE if the handle was invalid. */ nomali_error_t nomali_destroy(nomali_handle_t h); /** * Get a textual description of an error number. * * @param[in] error Error number to resolve. * * @return Pointer to a constant, null-terminated, string describing * an error number. */ const char *nomali_errstr(nomali_error_t error); /** * Setup callbacks from the model. * * @param[in] h Model instance handle. * @param[in] callback Structure describing the new callback to be * installed. * * @errors * @error NOMALI_E_OK on success. * @error NOMALI_E_HANDLE if the handle was invalid. * @error NOMALI_E_INVALID if the callback type was invalid. * * @see nomali_callback_t */ nomali_error_t nomali_set_callback(nomali_handle_t h, const nomali_callback_t *callback); /** * Get information about the hardware simulated by the model. * * @param[in] h Model instance handle. * @param[out] info Structure describing the model. * * @errors * @error NOMALI_E_OK on success. * @error NOMALI_E_HANDLE if the handle was invalid. * @error NOMALI_E_INVALID if info is not pointing to a valid * location. * * @see nomali_info_t */ nomali_error_t nomali_get_info(nomali_handle_t h, nomali_info_t *info); /** * Perform a reset of the device. * * @param[in] h Model instance handle. * * @errors * @error NOMALI_E_OK on success. * @error NOMALI_E_HANDLE if the handle was invalid. */ nomali_error_t nomali_reset(nomali_handle_t h); /** * Read a register within the device. * * @param[in] h Model instance handle. * @param[out] value Pointer to output. * @param[in] addr Address to read. * * @errors * @error NOMALI_E_OK on success. * @error NOMALI_E_HANDLE if the handle was invalid. * @error NOMALI_E_INVALID if an invalid register was specified or if the * pointer to the output location was invalid. */ nomali_error_t nomali_reg_read(nomali_handle_t h, uint32_t *value, nomali_addr_t addr); /** * Write to a register within the device. * * @param[in] h Model instance handle. * @param[in] addr Address to read. * @param[in] value Value to write to the register. * * @errors * @error NOMALI_E_OK on success. * @error NOMALI_E_HANDLE if the handle was invalid. * @error NOMALI_E_INVALID if an invalid register was specified. */ nomali_error_t nomali_reg_write(nomali_handle_t h, nomali_addr_t addr, uint32_t value); /** * Read a register without side effects. * * @param[in] h Model instance handle. * @param[out] value Pointer to output. * @param[in] addr Address to read. * * @errors * @error NOMALI_E_OK on success. * @error NOMALI_E_HANDLE if the handle was invalid. * @error NOMALI_E_INVALID if an invalid register was specified or if the * pointer to the output location was invalid. */ nomali_error_t nomali_reg_read_raw(nomali_handle_t h, uint32_t *value, nomali_addr_t addr); /** * Write to a register without side effects. * * @param[in] h Model instance handle. * @param[in] addr Address to read. * @param[in] value Value to write to the register. * * @errors * @error NOMALI_E_OK on success. * @error NOMALI_E_HANDLE if the handle was invalid. * @error NOMALI_E_INVALID if an invalid register was specified. */ nomali_error_t nomali_reg_write_raw(nomali_handle_t h, nomali_addr_t addr, uint32_t value); /** * Get the state of an interrupt line * * This function queries the state of one of the GPU's interrupt * lines. The state of the interrupt line is returned in 'state', * which is 1 if the interrupt is being asserted and 0 otherwise. The * value of the state variable is undefined if the function call * fails. * * @param[in] h Model instance handle. * @param[out] state Pointer to output, 1 if the interrupt is * asserted, 0 otherwise. * @param[in] intno Interrupt to query. * * @errors * @error NOMALI_E_OK on success. * @error NOMALI_E_HANDLE if the handle was invalid. * @error NOMALI_E_INVALID if an invalid interrupt was specified or if * pointer to the output location was invalid. */ nomali_error_t nomali_int_state(nomali_handle_t h, int *state, nomali_int_t intno); #ifdef __cplusplus }; #endif #endif /* _LIBNOMALI_NOMALI_HH */