1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-14 06:42:58 +08:00
lvgl/libs/nema_gfx/include/nema_hal.h
2024-11-18 10:49:33 +08:00

219 lines
5.4 KiB
C

/* 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