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