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