From c2740578404b4e46d198de70af1cfd554033d99f Mon Sep 17 00:00:00 2001 From: Andreas Sandberg Date: Tue, 7 Jul 2015 10:03:13 +0100 Subject: ext: Add the NoMali GPU no-simulation library Add revision 9adf9d6e2d889a483a92136c96eb8a434d360561 of NoMali-model from https://github.com/ARM-software/nomali-model. This library implements the register interface of the Mali T6xx/T7xx series GPUs, but doesn't do any rendering. It can be used to hide the effects of software rendering. --- ext/nomali/include/libnomali/nomali.h | 333 ++++++++++++++++++++++++++++++++++ 1 file changed, 333 insertions(+) create mode 100644 ext/nomali/include/libnomali/nomali.h (limited to 'ext/nomali/include') diff --git a/ext/nomali/include/libnomali/nomali.h b/ext/nomali/include/libnomali/nomali.h new file mode 100644 index 000000000..9af2a417a --- /dev/null +++ b/ext/nomali/include/libnomali/nomali.h @@ -0,0 +1,333 @@ +/* + * Copyright (c) 2014-2015 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, + + /** 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); + } 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 */ -- cgit v1.2.3