| /* | |
| * 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 <stdint.h> | |
| #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 */ |