xref: /linux/drivers/gpu/drm/etnaviv/etnaviv_buffer.h (revision 939faf71cf7ca9ab3d1bd2912ac0e203d4d7156a)
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