1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (C) 2014-2025 Etnaviv Project 4 */ 5 6 #ifndef __ETNAVIV_BUFFER_H__ 7 #define __ETNAVIV_BUFFER_H__ 8 9 #include "etnaviv_cmdbuf.h" 10 #include "etnaviv_gpu.h" 11 #include "etnaviv_gem.h" 12 #include "etnaviv_mmu.h" 13 14 #include "common.xml.h" 15 #include "linux/printk.h" 16 #include "state.xml.h" 17 #include "state_blt.xml.h" 18 #include "state_hi.xml.h" 19 #include "state_3d.xml.h" 20 #include "cmdstream.xml.h" 21 22 static inline void OUT(struct etnaviv_cmdbuf *buffer, u32 data) 23 { 24 u32 *vaddr = (u32 *)buffer->vaddr; 25 26 BUG_ON(buffer->user_size >= buffer->size); 27 28 vaddr[buffer->user_size / 4] = data; 29 buffer->user_size += 4; 30 } 31 32 static inline void CMD_LOAD_STATE(struct etnaviv_cmdbuf *buffer, u32 reg, 33 u32 value) 34 { 35 u32 index = reg >> VIV_FE_LOAD_STATE_HEADER_OFFSET__SHR; 36 37 buffer->user_size = ALIGN(buffer->user_size, 8); 38 39 /* write a register via cmd stream */ 40 OUT(buffer, VIV_FE_LOAD_STATE_HEADER_OP_LOAD_STATE | 41 VIV_FE_LOAD_STATE_HEADER_COUNT(1) | 42 VIV_FE_LOAD_STATE_HEADER_OFFSET(index)); 43 OUT(buffer, value); 44 } 45 46 static inline void CMD_LOAD_STATES_START(struct etnaviv_cmdbuf *buffer, u32 reg, 47 u32 nvalues) 48 { 49 u32 index = reg >> VIV_FE_LOAD_STATE_HEADER_OFFSET__SHR; 50 51 buffer->user_size = ALIGN(buffer->user_size, 8); 52 53 /* write a register via cmd stream */ 54 OUT(buffer, VIV_FE_LOAD_STATE_HEADER_OP_LOAD_STATE | 55 VIV_FE_LOAD_STATE_HEADER_OFFSET(index) | 56 VIV_FE_LOAD_STATE_HEADER_COUNT(nvalues)); 57 } 58 59 static inline void CMD_END(struct etnaviv_cmdbuf *buffer) 60 { 61 buffer->user_size = ALIGN(buffer->user_size, 8); 62 63 OUT(buffer, VIV_FE_END_HEADER_OP_END); 64 } 65 66 static inline void CMD_WAIT(struct etnaviv_cmdbuf *buffer, 67 unsigned int waitcycles) 68 { 69 buffer->user_size = ALIGN(buffer->user_size, 8); 70 71 OUT(buffer, VIV_FE_WAIT_HEADER_OP_WAIT | waitcycles); 72 } 73 74 static inline void CMD_LINK(struct etnaviv_cmdbuf *buffer, u16 prefetch, 75 u32 address) 76 { 77 buffer->user_size = ALIGN(buffer->user_size, 8); 78 79 OUT(buffer, 80 VIV_FE_LINK_HEADER_OP_LINK | VIV_FE_LINK_HEADER_PREFETCH(prefetch)); 81 OUT(buffer, address); 82 } 83 84 static inline void CMD_STALL(struct etnaviv_cmdbuf *buffer, u32 from, u32 to) 85 { 86 buffer->user_size = ALIGN(buffer->user_size, 8); 87 88 OUT(buffer, VIV_FE_STALL_HEADER_OP_STALL); 89 OUT(buffer, VIV_FE_STALL_TOKEN_FROM(from) | VIV_FE_STALL_TOKEN_TO(to)); 90 } 91 92 static inline void CMD_SEM(struct etnaviv_cmdbuf *buffer, u32 from, u32 to) 93 { 94 CMD_LOAD_STATE(buffer, VIVS_GL_SEMAPHORE_TOKEN, 95 VIVS_GL_SEMAPHORE_TOKEN_FROM(from) | 96 VIVS_GL_SEMAPHORE_TOKEN_TO(to)); 97 } 98 99 #endif /* __ETNAVIV_BUFFER_H__ */ 100