2024-11-15 14:56:38 +01:00
|
|
|
/* TSI 2023.xmo */
|
|
|
|
/*******************************************************************************
|
|
|
|
* Copyright (c) 2023 Think Silicon Single Member PC
|
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
* of this header file and/or associated documentation files to use, copy,
|
|
|
|
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
|
|
|
|
* Materials, and to permit persons to whom the Materials are furnished to do
|
|
|
|
* so, subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice shall be included in
|
|
|
|
* all copies or substantial portions of the Materials.
|
|
|
|
*
|
|
|
|
* MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS
|
|
|
|
* NEMAGFX API. THE UNMODIFIED, NORMATIVE VERSIONS OF THINK-SILICON NEMAGFX
|
|
|
|
* SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT:
|
|
|
|
* https://think-silicon.com/products/software/nemagfx-api
|
|
|
|
*
|
|
|
|
* The software is provided 'as is', without warranty of any kind, express or
|
|
|
|
* implied, including but not limited to the warranties of merchantability,
|
|
|
|
* fitness for a particular purpose and noninfringement. In no event shall
|
|
|
|
* Think Silicon Single Member PC be liable for any claim, damages or other
|
|
|
|
* liability, whether in an action of contract, tort or otherwise, arising
|
|
|
|
* from, out of or in connection with the software or the use or other dealings
|
|
|
|
* in the software.
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef NEMA_HAL_H__
|
|
|
|
#define NEMA_HAL_H__
|
|
|
|
|
|
|
|
#include "nema_sys_defs.h"
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef struct nema_buffer_t_ {
|
|
|
|
int size; /**< Size of buffer */
|
|
|
|
int fd; /**< File Descriptor of buffer */
|
|
|
|
void *base_virt; /**< Virtual address of buffer */
|
|
|
|
uintptr_t base_phys; /**< Physical address of buffer */
|
|
|
|
} nema_buffer_t;
|
|
|
|
|
|
|
|
/** \brief Initialize system. Implementor defined. Called in nema_init()
|
|
|
|
*
|
|
|
|
* \param void
|
|
|
|
* \return 0 if no errors occurred
|
|
|
|
* \see nema_init()
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
int32_t nema_sys_init(void);
|
|
|
|
|
|
|
|
|
|
|
|
/** \brief Wait for interrupt from the GPU
|
|
|
|
*
|
|
|
|
* \param void
|
|
|
|
* \return 0 on success
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
int nema_wait_irq(void);
|
|
|
|
|
|
|
|
/** \brief Wait for a Command List to finish
|
|
|
|
*
|
|
|
|
* \param cl_id Command List ID
|
|
|
|
* \return 0 on success
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
int nema_wait_irq_cl(int cl_id);
|
|
|
|
|
|
|
|
/** \brief Wait for a Breakpoint
|
|
|
|
*
|
|
|
|
* \param cl_id Breakpoint ID
|
|
|
|
* \return 0 on success
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
int nema_wait_irq_brk(int brk_id);
|
|
|
|
|
|
|
|
/** \brief Read Hardware register
|
|
|
|
*
|
|
|
|
* \param reg Register to read
|
|
|
|
* \return Value read from the register
|
|
|
|
* \see nema_reg_write
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
uint32_t nema_reg_read(uint32_t reg);
|
|
|
|
|
|
|
|
/** \brief Write Hardware Register
|
|
|
|
*
|
|
|
|
* \param reg Register to write
|
|
|
|
* \param value Value to be written
|
|
|
|
* \return void()
|
|
|
|
* \see nema_reg_read()
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void nema_reg_write(uint32_t reg, uint32_t value);
|
|
|
|
|
|
|
|
/** \brief Create memory buffer
|
|
|
|
*
|
|
|
|
* \param size Size of buffer in bytes
|
|
|
|
* \return nema_buffer_t struct
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
nema_buffer_t nema_buffer_create(int size);
|
|
|
|
|
|
|
|
/** \brief Create memory buffer at a specific pool
|
|
|
|
*
|
|
|
|
* \param pool ID of the desired memory pool
|
|
|
|
* \param size Size of buffer in bytes
|
|
|
|
* \return nema_buffer_t struct
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
nema_buffer_t nema_buffer_create_pool(int pool, int size);
|
|
|
|
|
|
|
|
/** \brief Maps buffer
|
|
|
|
*
|
|
|
|
* \param bo Pointer to buffer struct
|
|
|
|
* \return Virtual pointer of the buffer (same as in bo->base_virt)
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void *nema_buffer_map(nema_buffer_t *bo);
|
|
|
|
|
|
|
|
/** \brief Unmaps buffer
|
|
|
|
*
|
|
|
|
* \param bo Pointer to buffer struct
|
|
|
|
* \return void
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void nema_buffer_unmap(nema_buffer_t *bo);
|
|
|
|
|
|
|
|
/** \brief Destroy/deallocate buffer
|
|
|
|
*
|
|
|
|
* \param bo Pointer to buffer struct
|
|
|
|
* \return void
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void nema_buffer_destroy(nema_buffer_t *bo);
|
|
|
|
|
|
|
|
/** \brief Get physical (GPU) base address of a given buffer
|
|
|
|
*
|
|
|
|
* \param bo Pointer to buffer struct
|
|
|
|
* \return Physical base address of a given buffer
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
uintptr_t nema_buffer_phys(nema_buffer_t *bo);
|
|
|
|
|
|
|
|
/** \brief Write-back buffer from cache to main memory
|
|
|
|
*
|
|
|
|
* \param bo Pointer to buffer struct
|
|
|
|
* \return void
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void nema_buffer_flush(nema_buffer_t * bo);
|
|
|
|
|
|
|
|
/** \brief Allocate memory for CPU to use (typically, standard malloc() is called)
|
|
|
|
*
|
|
|
|
* \param size Size in bytes
|
|
|
|
* \return Pointer to allocated memory (virtual)
|
|
|
|
* \see nema_host_free()
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void *nema_host_malloc(size_t size);
|
|
|
|
|
|
|
|
/** \brief Free memory previously allocated with nema_host_malloc()
|
|
|
|
*
|
|
|
|
* \param ptr Pointer to allocated memory (virtual)
|
|
|
|
* \return void
|
|
|
|
* \see nema_host_malloc()
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void nema_host_free(void *ptr );
|
|
|
|
|
|
|
|
/** \private */
|
|
|
|
typedef struct nema_ringbuffer_t_ {
|
|
|
|
nema_buffer_t bo;
|
|
|
|
int offset; //number of 32-bit entries
|
|
|
|
int last_submission_id;
|
|
|
|
} nema_ringbuffer_t;
|
|
|
|
|
|
|
|
|
|
|
|
/** \brief Initialize Ring Buffer. Should be called from inside nema_sys_init().
|
|
|
|
* This is a private function, the user should never call it.
|
|
|
|
*
|
|
|
|
* \param *rb Pointer to nema_ring_buffer_t struct
|
|
|
|
* \param reset Resets the Ring Buffer if non-zero
|
|
|
|
* \return Negative number on error
|
|
|
|
* \see nema_sys_init()
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
/** \private */
|
|
|
|
int nema_rb_init(nema_ringbuffer_t *rb, int reset);
|
|
|
|
|
|
|
|
#define MUTEX_RB 0
|
|
|
|
#define MUTEX_MALLOC 1
|
|
|
|
#define MUTEX_FLUSH 2
|
|
|
|
#define MUTEX_MAX 2
|
|
|
|
|
|
|
|
/** \brief Mutex Lock for multiple processes/threads
|
|
|
|
*
|
|
|
|
* \param MUTEX_RB or MUTEX_MALLOC
|
|
|
|
* \return int
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
int nema_mutex_lock(int mutex_id);
|
|
|
|
|
|
|
|
/** \brief Mutex Unlock for multiple processes/threads
|
|
|
|
*
|
|
|
|
* \param MUTEX_RB or MUTEX_MALLOC
|
|
|
|
* \return int
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
int nema_mutex_unlock(int mutex_id);
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|