blob: 05b4099b6661dc34c03e1d4fa8684b5b3d663881 [file] [log] [blame]
/*
* 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 */