// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2014-2025 Etnaviv Project */ #ifndef __ETNAVIV_BUFFER_H__ #define __ETNAVIV_BUFFER_H__ #include "etnaviv_cmdbuf.h" #include "etnaviv_gpu.h" #include "etnaviv_gem.h" #include "etnaviv_mmu.h" #include "common.xml.h" #include "linux/printk.h" #include "state.xml.h" #include "state_blt.xml.h" #include "state_hi.xml.h" #include "state_3d.xml.h" #include "cmdstream.xml.h" static inline void OUT(struct etnaviv_cmdbuf *buffer, u32 data) { u32 *vaddr = (u32 *)buffer->vaddr; BUG_ON(buffer->user_size >= buffer->size); vaddr[buffer->user_size / 4] = data; buffer->user_size += 4; } static inline void CMD_LOAD_STATE(struct etnaviv_cmdbuf *buffer, u32 reg, u32 value) { u32 index = reg >> VIV_FE_LOAD_STATE_HEADER_OFFSET__SHR; buffer->user_size = ALIGN(buffer->user_size, 8); /* write a register via cmd stream */ OUT(buffer, VIV_FE_LOAD_STATE_HEADER_OP_LOAD_STATE | VIV_FE_LOAD_STATE_HEADER_COUNT(1) | VIV_FE_LOAD_STATE_HEADER_OFFSET(index)); OUT(buffer, value); } static inline void CMD_LOAD_STATES_START(struct etnaviv_cmdbuf *buffer, u32 reg, u32 nvalues) { u32 index = reg >> VIV_FE_LOAD_STATE_HEADER_OFFSET__SHR; buffer->user_size = ALIGN(buffer->user_size, 8); /* write a register via cmd stream */ OUT(buffer, VIV_FE_LOAD_STATE_HEADER_OP_LOAD_STATE | VIV_FE_LOAD_STATE_HEADER_OFFSET(index) | VIV_FE_LOAD_STATE_HEADER_COUNT(nvalues)); } static inline void CMD_END(struct etnaviv_cmdbuf *buffer) { buffer->user_size = ALIGN(buffer->user_size, 8); OUT(buffer, VIV_FE_END_HEADER_OP_END); } static inline void CMD_WAIT(struct etnaviv_cmdbuf *buffer, unsigned int waitcycles) { buffer->user_size = ALIGN(buffer->user_size, 8); OUT(buffer, VIV_FE_WAIT_HEADER_OP_WAIT | waitcycles); } static inline void CMD_LINK(struct etnaviv_cmdbuf *buffer, u16 prefetch, u32 address) { buffer->user_size = ALIGN(buffer->user_size, 8); OUT(buffer, VIV_FE_LINK_HEADER_OP_LINK | VIV_FE_LINK_HEADER_PREFETCH(prefetch)); OUT(buffer, address); } static inline void CMD_STALL(struct etnaviv_cmdbuf *buffer, u32 from, u32 to) { buffer->user_size = ALIGN(buffer->user_size, 8); OUT(buffer, VIV_FE_STALL_HEADER_OP_STALL); OUT(buffer, VIV_FE_STALL_TOKEN_FROM(from) | VIV_FE_STALL_TOKEN_TO(to)); } static inline void CMD_SEM(struct etnaviv_cmdbuf *buffer, u32 from, u32 to) { CMD_LOAD_STATE(buffer, VIVS_GL_SEMAPHORE_TOKEN, VIVS_GL_SEMAPHORE_TOKEN_FROM(from) | VIVS_GL_SEMAPHORE_TOKEN_TO(to)); } #endif /* __ETNAVIV_BUFFER_H__ */