xref: /openbsd-src/sys/dev/pci/drm/amd/display/dc/inc/reg_helper.h (revision 1bb76ff151c0aba8e3312a604e4cd2e5195cf4b7)
1fb4d8502Sjsg /*
2fb4d8502Sjsg  * Copyright 2016 Advanced Micro Devices, Inc.
3fb4d8502Sjsg  *
4fb4d8502Sjsg  * Permission is hereby granted, free of charge, to any person obtaining a
5fb4d8502Sjsg  * copy of this software and associated documentation files (the "Software"),
6fb4d8502Sjsg  * to deal in the Software without restriction, including without limitation
7fb4d8502Sjsg  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8fb4d8502Sjsg  * and/or sell copies of the Software, and to permit persons to whom the
9fb4d8502Sjsg  * Software is furnished to do so, subject to the following conditions:
10fb4d8502Sjsg  *
11fb4d8502Sjsg  * The above copyright notice and this permission notice shall be included in
12fb4d8502Sjsg  * all copies or substantial portions of the Software.
13fb4d8502Sjsg  *
14fb4d8502Sjsg  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15fb4d8502Sjsg  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16fb4d8502Sjsg  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17fb4d8502Sjsg  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18fb4d8502Sjsg  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19fb4d8502Sjsg  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20fb4d8502Sjsg  * OTHER DEALINGS IN THE SOFTWARE.
21fb4d8502Sjsg  *
22fb4d8502Sjsg  * Authors: AMD
23fb4d8502Sjsg  */
24fb4d8502Sjsg 
25fb4d8502Sjsg #ifndef DRIVERS_GPU_DRM_AMD_DC_DEV_DC_INC_REG_HELPER_H_
26fb4d8502Sjsg #define DRIVERS_GPU_DRM_AMD_DC_DEV_DC_INC_REG_HELPER_H_
27fb4d8502Sjsg 
28fb4d8502Sjsg #include "dm_services.h"
29fb4d8502Sjsg 
30fb4d8502Sjsg /* macro for register read/write
31fb4d8502Sjsg  * user of macro need to define
32fb4d8502Sjsg  *
33fb4d8502Sjsg  * CTX ==> macro to ptr to dc_context
34fb4d8502Sjsg  *    eg. aud110->base.ctx
35fb4d8502Sjsg  *
36fb4d8502Sjsg  * REG ==> macro to location of register offset
37fb4d8502Sjsg  *    eg. aud110->regs->reg
38fb4d8502Sjsg  */
39fb4d8502Sjsg #define REG_READ(reg_name) \
40fb4d8502Sjsg 		dm_read_reg(CTX, REG(reg_name))
41fb4d8502Sjsg 
42fb4d8502Sjsg #define REG_WRITE(reg_name, value) \
43fb4d8502Sjsg 		dm_write_reg(CTX, REG(reg_name), value)
44fb4d8502Sjsg 
45fb4d8502Sjsg #ifdef REG_SET
46fb4d8502Sjsg #undef REG_SET
47fb4d8502Sjsg #endif
48fb4d8502Sjsg 
49fb4d8502Sjsg #ifdef REG_GET
50fb4d8502Sjsg #undef REG_GET
51fb4d8502Sjsg #endif
52fb4d8502Sjsg 
53fb4d8502Sjsg /* macro to set register fields. */
54fb4d8502Sjsg #define REG_SET_N(reg_name, n, initial_val, ...)	\
55c349dbc7Sjsg 		generic_reg_set_ex(CTX, \
56fb4d8502Sjsg 				REG(reg_name), \
57fb4d8502Sjsg 				initial_val, \
58fb4d8502Sjsg 				n, __VA_ARGS__)
59fb4d8502Sjsg 
60fb4d8502Sjsg #define FN(reg_name, field) \
61fb4d8502Sjsg 	FD(reg_name##__##field)
62fb4d8502Sjsg 
63fb4d8502Sjsg #define REG_SET(reg_name, initial_val, field, val)	\
64fb4d8502Sjsg 		REG_SET_N(reg_name, 1, initial_val, \
65fb4d8502Sjsg 				FN(reg_name, field), val)
66fb4d8502Sjsg 
67fb4d8502Sjsg #define REG_SET_2(reg, init_value, f1, v1, f2, v2)	\
68fb4d8502Sjsg 		REG_SET_N(reg, 2, init_value, \
69fb4d8502Sjsg 				FN(reg, f1), v1,\
70fb4d8502Sjsg 				FN(reg, f2), v2)
71fb4d8502Sjsg 
72fb4d8502Sjsg #define REG_SET_3(reg, init_value, f1, v1, f2, v2, f3, v3)	\
73fb4d8502Sjsg 		REG_SET_N(reg, 3, init_value, \
74fb4d8502Sjsg 				FN(reg, f1), v1,\
75fb4d8502Sjsg 				FN(reg, f2), v2,\
76fb4d8502Sjsg 				FN(reg, f3), v3)
77fb4d8502Sjsg 
78fb4d8502Sjsg #define REG_SET_4(reg, init_value, f1, v1, f2, v2, f3, v3, f4, v4)	\
79fb4d8502Sjsg 		REG_SET_N(reg, 4, init_value, \
80fb4d8502Sjsg 				FN(reg, f1), v1,\
81fb4d8502Sjsg 				FN(reg, f2), v2,\
82fb4d8502Sjsg 				FN(reg, f3), v3,\
83fb4d8502Sjsg 				FN(reg, f4), v4)
84fb4d8502Sjsg 
85fb4d8502Sjsg #define REG_SET_5(reg, init_value, f1, v1, f2, v2, f3, v3, f4, v4,	\
86fb4d8502Sjsg 		f5, v5)	\
87fb4d8502Sjsg 		REG_SET_N(reg, 5, init_value, \
88fb4d8502Sjsg 				FN(reg, f1), v1,\
89fb4d8502Sjsg 				FN(reg, f2), v2,\
90fb4d8502Sjsg 				FN(reg, f3), v3,\
91fb4d8502Sjsg 				FN(reg, f4), v4,\
92fb4d8502Sjsg 				FN(reg, f5), v5)
93fb4d8502Sjsg 
94fb4d8502Sjsg #define REG_SET_6(reg, init_value, f1, v1, f2, v2, f3, v3, f4, v4,	\
95fb4d8502Sjsg 		f5, v5, f6, v6)	\
96fb4d8502Sjsg 		REG_SET_N(reg, 6, init_value, \
97fb4d8502Sjsg 				FN(reg, f1), v1,\
98fb4d8502Sjsg 				FN(reg, f2), v2,\
99fb4d8502Sjsg 				FN(reg, f3), v3,\
100fb4d8502Sjsg 				FN(reg, f4), v4,\
101fb4d8502Sjsg 				FN(reg, f5), v5,\
102fb4d8502Sjsg 				FN(reg, f6), v6)
103fb4d8502Sjsg 
104fb4d8502Sjsg #define REG_SET_7(reg, init_value, f1, v1, f2, v2, f3, v3, f4, v4,	\
105fb4d8502Sjsg 		f5, v5, f6, v6, f7, v7)	\
106fb4d8502Sjsg 		REG_SET_N(reg, 7, init_value, \
107fb4d8502Sjsg 				FN(reg, f1), v1,\
108fb4d8502Sjsg 				FN(reg, f2), v2,\
109fb4d8502Sjsg 				FN(reg, f3), v3,\
110fb4d8502Sjsg 				FN(reg, f4), v4,\
111fb4d8502Sjsg 				FN(reg, f5), v5,\
112fb4d8502Sjsg 				FN(reg, f6), v6,\
113fb4d8502Sjsg 				FN(reg, f7), v7)
114fb4d8502Sjsg 
115fb4d8502Sjsg #define REG_SET_8(reg, init_value, f1, v1, f2, v2, f3, v3, f4, v4,	\
116fb4d8502Sjsg 		f5, v5, f6, v6, f7, v7, f8, v8)	\
117fb4d8502Sjsg 		REG_SET_N(reg, 8, init_value, \
118fb4d8502Sjsg 				FN(reg, f1), v1,\
119fb4d8502Sjsg 				FN(reg, f2), v2,\
120fb4d8502Sjsg 				FN(reg, f3), v3,\
121fb4d8502Sjsg 				FN(reg, f4), v4,\
122fb4d8502Sjsg 				FN(reg, f5), v5,\
123fb4d8502Sjsg 				FN(reg, f6), v6,\
124fb4d8502Sjsg 				FN(reg, f7), v7,\
125fb4d8502Sjsg 				FN(reg, f8), v8)
126fb4d8502Sjsg 
127fb4d8502Sjsg #define REG_SET_9(reg, init_value, f1, v1, f2, v2, f3, v3, f4, v4, f5, \
128fb4d8502Sjsg 		v5, f6, v6, f7, v7, f8, v8, f9, v9)	\
129fb4d8502Sjsg 		REG_SET_N(reg, 9, init_value, \
130fb4d8502Sjsg 				FN(reg, f1), v1,\
131fb4d8502Sjsg 				FN(reg, f2), v2, \
132fb4d8502Sjsg 				FN(reg, f3), v3, \
133fb4d8502Sjsg 				FN(reg, f4), v4, \
134fb4d8502Sjsg 				FN(reg, f5), v5, \
135fb4d8502Sjsg 				FN(reg, f6), v6, \
136fb4d8502Sjsg 				FN(reg, f7), v7, \
137fb4d8502Sjsg 				FN(reg, f8), v8, \
138fb4d8502Sjsg 				FN(reg, f9), v9)
139fb4d8502Sjsg 
140fb4d8502Sjsg #define REG_SET_10(reg, init_value, f1, v1, f2, v2, f3, v3, f4, v4, f5, \
141fb4d8502Sjsg 		v5, f6, v6, f7, v7, f8, v8, f9, v9, f10, v10)	\
142fb4d8502Sjsg 		REG_SET_N(reg, 10, init_value, \
143fb4d8502Sjsg 				FN(reg, f1), v1,\
144fb4d8502Sjsg 				FN(reg, f2), v2, \
145fb4d8502Sjsg 				FN(reg, f3), v3, \
146fb4d8502Sjsg 				FN(reg, f4), v4, \
147fb4d8502Sjsg 				FN(reg, f5), v5, \
148fb4d8502Sjsg 				FN(reg, f6), v6, \
149fb4d8502Sjsg 				FN(reg, f7), v7, \
150fb4d8502Sjsg 				FN(reg, f8), v8, \
151fb4d8502Sjsg 				FN(reg, f9), v9, \
152fb4d8502Sjsg 				FN(reg, f10), v10)
153fb4d8502Sjsg 
154fb4d8502Sjsg /* macro to get register fields
155fb4d8502Sjsg  * read given register and fill in field value in output parameter */
156fb4d8502Sjsg #define REG_GET(reg_name, field, val)	\
157fb4d8502Sjsg 		generic_reg_get(CTX, REG(reg_name), \
158fb4d8502Sjsg 				FN(reg_name, field), val)
159fb4d8502Sjsg 
160fb4d8502Sjsg #define REG_GET_2(reg_name, f1, v1, f2, v2)	\
161fb4d8502Sjsg 		generic_reg_get2(CTX, REG(reg_name), \
162fb4d8502Sjsg 				FN(reg_name, f1), v1, \
163fb4d8502Sjsg 				FN(reg_name, f2), v2)
164fb4d8502Sjsg 
165fb4d8502Sjsg #define REG_GET_3(reg_name, f1, v1, f2, v2, f3, v3)	\
166fb4d8502Sjsg 		generic_reg_get3(CTX, REG(reg_name), \
167fb4d8502Sjsg 				FN(reg_name, f1), v1, \
168fb4d8502Sjsg 				FN(reg_name, f2), v2, \
169fb4d8502Sjsg 				FN(reg_name, f3), v3)
170fb4d8502Sjsg 
171fb4d8502Sjsg #define REG_GET_4(reg_name, f1, v1, f2, v2, f3, v3, f4, v4)	\
172fb4d8502Sjsg 		generic_reg_get4(CTX, REG(reg_name), \
173fb4d8502Sjsg 				FN(reg_name, f1), v1, \
174fb4d8502Sjsg 				FN(reg_name, f2), v2, \
175fb4d8502Sjsg 				FN(reg_name, f3), v3, \
176fb4d8502Sjsg 				FN(reg_name, f4), v4)
177fb4d8502Sjsg 
178fb4d8502Sjsg #define REG_GET_5(reg_name, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5)	\
179fb4d8502Sjsg 		generic_reg_get5(CTX, REG(reg_name), \
180fb4d8502Sjsg 				FN(reg_name, f1), v1, \
181fb4d8502Sjsg 				FN(reg_name, f2), v2, \
182fb4d8502Sjsg 				FN(reg_name, f3), v3, \
183fb4d8502Sjsg 				FN(reg_name, f4), v4, \
184fb4d8502Sjsg 				FN(reg_name, f5), v5)
185fb4d8502Sjsg 
186fb4d8502Sjsg #define REG_GET_6(reg_name, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6)	\
187fb4d8502Sjsg 		generic_reg_get6(CTX, REG(reg_name), \
188fb4d8502Sjsg 				FN(reg_name, f1), v1, \
189fb4d8502Sjsg 				FN(reg_name, f2), v2, \
190fb4d8502Sjsg 				FN(reg_name, f3), v3, \
191fb4d8502Sjsg 				FN(reg_name, f4), v4, \
192fb4d8502Sjsg 				FN(reg_name, f5), v5, \
193fb4d8502Sjsg 				FN(reg_name, f6), v6)
194fb4d8502Sjsg 
195fb4d8502Sjsg #define REG_GET_7(reg_name, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7)	\
196fb4d8502Sjsg 		generic_reg_get7(CTX, REG(reg_name), \
197fb4d8502Sjsg 				FN(reg_name, f1), v1, \
198fb4d8502Sjsg 				FN(reg_name, f2), v2, \
199fb4d8502Sjsg 				FN(reg_name, f3), v3, \
200fb4d8502Sjsg 				FN(reg_name, f4), v4, \
201fb4d8502Sjsg 				FN(reg_name, f5), v5, \
202fb4d8502Sjsg 				FN(reg_name, f6), v6, \
203fb4d8502Sjsg 				FN(reg_name, f7), v7)
204fb4d8502Sjsg 
205fb4d8502Sjsg #define REG_GET_8(reg_name, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8)	\
206fb4d8502Sjsg 		generic_reg_get8(CTX, REG(reg_name), \
207fb4d8502Sjsg 				FN(reg_name, f1), v1, \
208fb4d8502Sjsg 				FN(reg_name, f2), v2, \
209fb4d8502Sjsg 				FN(reg_name, f3), v3, \
210fb4d8502Sjsg 				FN(reg_name, f4), v4, \
211fb4d8502Sjsg 				FN(reg_name, f5), v5, \
212fb4d8502Sjsg 				FN(reg_name, f6), v6, \
213fb4d8502Sjsg 				FN(reg_name, f7), v7, \
214fb4d8502Sjsg 				FN(reg_name, f8), v8)
215fb4d8502Sjsg 
216fb4d8502Sjsg /* macro to poll and wait for a register field to read back given value */
217fb4d8502Sjsg 
218fb4d8502Sjsg #define REG_WAIT(reg_name, field, val, delay_between_poll_us, max_try)	\
219fb4d8502Sjsg 		generic_reg_wait(CTX, \
220fb4d8502Sjsg 				REG(reg_name), FN(reg_name, field), val,\
221fb4d8502Sjsg 				delay_between_poll_us, max_try, __func__, __LINE__)
222fb4d8502Sjsg 
223fb4d8502Sjsg /* macro to update (read, modify, write) register fields
224fb4d8502Sjsg  */
225fb4d8502Sjsg #define REG_UPDATE_N(reg_name, n, ...)	\
226fb4d8502Sjsg 		generic_reg_update_ex(CTX, \
227fb4d8502Sjsg 				REG(reg_name), \
228fb4d8502Sjsg 				n, __VA_ARGS__)
229fb4d8502Sjsg 
230fb4d8502Sjsg #define REG_UPDATE(reg_name, field, val)	\
231fb4d8502Sjsg 		REG_UPDATE_N(reg_name, 1, \
232fb4d8502Sjsg 				FN(reg_name, field), val)
233fb4d8502Sjsg 
234fb4d8502Sjsg #define REG_UPDATE_2(reg, f1, v1, f2, v2)	\
235fb4d8502Sjsg 		REG_UPDATE_N(reg, 2,\
236fb4d8502Sjsg 				FN(reg, f1), v1,\
237fb4d8502Sjsg 				FN(reg, f2), v2)
238fb4d8502Sjsg 
239fb4d8502Sjsg #define REG_UPDATE_3(reg, f1, v1, f2, v2, f3, v3)	\
240fb4d8502Sjsg 		REG_UPDATE_N(reg, 3, \
241fb4d8502Sjsg 				FN(reg, f1), v1,\
242fb4d8502Sjsg 				FN(reg, f2), v2, \
243fb4d8502Sjsg 				FN(reg, f3), v3)
244fb4d8502Sjsg 
245fb4d8502Sjsg #define REG_UPDATE_4(reg, f1, v1, f2, v2, f3, v3, f4, v4)	\
246fb4d8502Sjsg 		REG_UPDATE_N(reg, 4, \
247fb4d8502Sjsg 				FN(reg, f1), v1,\
248fb4d8502Sjsg 				FN(reg, f2), v2, \
249fb4d8502Sjsg 				FN(reg, f3), v3, \
250fb4d8502Sjsg 				FN(reg, f4), v4)
251fb4d8502Sjsg 
252fb4d8502Sjsg #define REG_UPDATE_5(reg, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5)	\
253fb4d8502Sjsg 		REG_UPDATE_N(reg, 5, \
254fb4d8502Sjsg 				FN(reg, f1), v1,\
255fb4d8502Sjsg 				FN(reg, f2), v2, \
256fb4d8502Sjsg 				FN(reg, f3), v3, \
257fb4d8502Sjsg 				FN(reg, f4), v4, \
258fb4d8502Sjsg 				FN(reg, f5), v5)
259fb4d8502Sjsg 
260fb4d8502Sjsg #define REG_UPDATE_6(reg, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6)	\
261fb4d8502Sjsg 		REG_UPDATE_N(reg, 6, \
262fb4d8502Sjsg 				FN(reg, f1), v1,\
263fb4d8502Sjsg 				FN(reg, f2), v2, \
264fb4d8502Sjsg 				FN(reg, f3), v3, \
265fb4d8502Sjsg 				FN(reg, f4), v4, \
266fb4d8502Sjsg 				FN(reg, f5), v5, \
267fb4d8502Sjsg 				FN(reg, f6), v6)
268fb4d8502Sjsg 
269fb4d8502Sjsg #define REG_UPDATE_7(reg, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7)	\
270fb4d8502Sjsg 		REG_UPDATE_N(reg, 7, \
271fb4d8502Sjsg 				FN(reg, f1), v1,\
272fb4d8502Sjsg 				FN(reg, f2), v2, \
273fb4d8502Sjsg 				FN(reg, f3), v3, \
274fb4d8502Sjsg 				FN(reg, f4), v4, \
275fb4d8502Sjsg 				FN(reg, f5), v5, \
276fb4d8502Sjsg 				FN(reg, f6), v6, \
277fb4d8502Sjsg 				FN(reg, f7), v7)
278fb4d8502Sjsg 
279fb4d8502Sjsg #define REG_UPDATE_8(reg, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8)	\
280fb4d8502Sjsg 		REG_UPDATE_N(reg, 8, \
281fb4d8502Sjsg 				FN(reg, f1), v1,\
282fb4d8502Sjsg 				FN(reg, f2), v2, \
283fb4d8502Sjsg 				FN(reg, f3), v3, \
284fb4d8502Sjsg 				FN(reg, f4), v4, \
285fb4d8502Sjsg 				FN(reg, f5), v5, \
286fb4d8502Sjsg 				FN(reg, f6), v6, \
287fb4d8502Sjsg 				FN(reg, f7), v7, \
288fb4d8502Sjsg 				FN(reg, f8), v8)
289fb4d8502Sjsg 
290fb4d8502Sjsg #define REG_UPDATE_9(reg, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8, f9, v9)	\
291fb4d8502Sjsg 		REG_UPDATE_N(reg, 9, \
292fb4d8502Sjsg 				FN(reg, f1), v1,\
293fb4d8502Sjsg 				FN(reg, f2), v2, \
294fb4d8502Sjsg 				FN(reg, f3), v3, \
295fb4d8502Sjsg 				FN(reg, f4), v4, \
296fb4d8502Sjsg 				FN(reg, f5), v5, \
297fb4d8502Sjsg 				FN(reg, f6), v6, \
298fb4d8502Sjsg 				FN(reg, f7), v7, \
299fb4d8502Sjsg 				FN(reg, f8), v8, \
300fb4d8502Sjsg 				FN(reg, f9), v9)
301fb4d8502Sjsg 
302fb4d8502Sjsg #define REG_UPDATE_10(reg, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8, f9, v9, f10, v10)\
303fb4d8502Sjsg 		REG_UPDATE_N(reg, 10, \
304fb4d8502Sjsg 				FN(reg, f1), v1,\
305fb4d8502Sjsg 				FN(reg, f2), v2, \
306fb4d8502Sjsg 				FN(reg, f3), v3, \
307fb4d8502Sjsg 				FN(reg, f4), v4, \
308fb4d8502Sjsg 				FN(reg, f5), v5, \
309fb4d8502Sjsg 				FN(reg, f6), v6, \
310fb4d8502Sjsg 				FN(reg, f7), v7, \
311fb4d8502Sjsg 				FN(reg, f8), v8, \
312fb4d8502Sjsg 				FN(reg, f9), v9, \
313fb4d8502Sjsg 				FN(reg, f10), v10)
314fb4d8502Sjsg 
315fb4d8502Sjsg #define REG_UPDATE_14(reg, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8, f9, v9, f10,\
316fb4d8502Sjsg 		v10, f11, v11, f12, v12, f13, v13, f14, v14)\
317fb4d8502Sjsg 		REG_UPDATE_N(reg, 14, \
318fb4d8502Sjsg 				FN(reg, f1), v1,\
319fb4d8502Sjsg 				FN(reg, f2), v2, \
320fb4d8502Sjsg 				FN(reg, f3), v3, \
321fb4d8502Sjsg 				FN(reg, f4), v4, \
322fb4d8502Sjsg 				FN(reg, f5), v5, \
323fb4d8502Sjsg 				FN(reg, f6), v6, \
324fb4d8502Sjsg 				FN(reg, f7), v7, \
325fb4d8502Sjsg 				FN(reg, f8), v8, \
326fb4d8502Sjsg 				FN(reg, f9), v9, \
327fb4d8502Sjsg 				FN(reg, f10), v10, \
328fb4d8502Sjsg 				FN(reg, f11), v11, \
329fb4d8502Sjsg 				FN(reg, f12), v12, \
330fb4d8502Sjsg 				FN(reg, f13), v13, \
331fb4d8502Sjsg 				FN(reg, f14), v14)
332fb4d8502Sjsg 
333fb4d8502Sjsg #define REG_UPDATE_19(reg, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8, f9, v9, f10,\
334fb4d8502Sjsg 		v10, f11, v11, f12, v12, f13, v13, f14, v14, f15, v15, f16, v16, f17, v17, f18, v18, f19, v19)\
335fb4d8502Sjsg 		REG_UPDATE_N(reg, 19, \
336fb4d8502Sjsg 				FN(reg, f1), v1,\
337fb4d8502Sjsg 				FN(reg, f2), v2, \
338fb4d8502Sjsg 				FN(reg, f3), v3, \
339fb4d8502Sjsg 				FN(reg, f4), v4, \
340fb4d8502Sjsg 				FN(reg, f5), v5, \
341fb4d8502Sjsg 				FN(reg, f6), v6, \
342fb4d8502Sjsg 				FN(reg, f7), v7, \
343fb4d8502Sjsg 				FN(reg, f8), v8, \
344fb4d8502Sjsg 				FN(reg, f9), v9, \
345fb4d8502Sjsg 				FN(reg, f10), v10, \
346fb4d8502Sjsg 				FN(reg, f11), v11, \
347fb4d8502Sjsg 				FN(reg, f12), v12, \
348fb4d8502Sjsg 				FN(reg, f13), v13, \
349fb4d8502Sjsg 				FN(reg, f14), v14, \
350fb4d8502Sjsg 				FN(reg, f15), v15, \
351fb4d8502Sjsg 				FN(reg, f16), v16, \
352fb4d8502Sjsg 				FN(reg, f17), v17, \
353fb4d8502Sjsg 				FN(reg, f18), v18, \
354fb4d8502Sjsg 				FN(reg, f19), v19)
355fb4d8502Sjsg 
356fb4d8502Sjsg #define REG_UPDATE_20(reg, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8, f9, v9, f10,\
357fb4d8502Sjsg 		v10, f11, v11, f12, v12, f13, v13, f14, v14, f15, v15, f16, v16, f17, v17, f18, v18, f19, v19, f20, v20)\
358fb4d8502Sjsg 		REG_UPDATE_N(reg, 20, \
359fb4d8502Sjsg 				FN(reg, f1), v1,\
360fb4d8502Sjsg 				FN(reg, f2), v2, \
361fb4d8502Sjsg 				FN(reg, f3), v3, \
362fb4d8502Sjsg 				FN(reg, f4), v4, \
363fb4d8502Sjsg 				FN(reg, f5), v5, \
364fb4d8502Sjsg 				FN(reg, f6), v6, \
365fb4d8502Sjsg 				FN(reg, f7), v7, \
366fb4d8502Sjsg 				FN(reg, f8), v8, \
367fb4d8502Sjsg 				FN(reg, f9), v9, \
368fb4d8502Sjsg 				FN(reg, f10), v10, \
369fb4d8502Sjsg 				FN(reg, f11), v11, \
370fb4d8502Sjsg 				FN(reg, f12), v12, \
371fb4d8502Sjsg 				FN(reg, f13), v13, \
372fb4d8502Sjsg 				FN(reg, f14), v14, \
373fb4d8502Sjsg 				FN(reg, f15), v15, \
374fb4d8502Sjsg 				FN(reg, f16), v16, \
375fb4d8502Sjsg 				FN(reg, f17), v17, \
376fb4d8502Sjsg 				FN(reg, f18), v18, \
377fb4d8502Sjsg 				FN(reg, f19), v19, \
378fb4d8502Sjsg 				FN(reg, f20), v20)
379fb4d8502Sjsg /* macro to update a register field to specified values in given sequences.
380fb4d8502Sjsg  * useful when toggling bits
381fb4d8502Sjsg  */
382c349dbc7Sjsg #define REG_UPDATE_SEQ_2(reg, f1, v1, f2, v2) \
383fb4d8502Sjsg {	uint32_t val = REG_UPDATE(reg, f1, v1); \
384fb4d8502Sjsg 	REG_SET(reg, val, f2, v2); }
385fb4d8502Sjsg 
386c349dbc7Sjsg #define REG_UPDATE_SEQ_3(reg, f1, v1, f2, v2, f3, v3) \
387fb4d8502Sjsg {	uint32_t val = REG_UPDATE(reg, f1, v1); \
388fb4d8502Sjsg 	val = REG_SET(reg, val, f2, v2); \
389fb4d8502Sjsg 	REG_SET(reg, val, f3, v3); }
390fb4d8502Sjsg 
391fb4d8502Sjsg uint32_t generic_reg_get(const struct dc_context *ctx, uint32_t addr,
392fb4d8502Sjsg 		uint8_t shift, uint32_t mask, uint32_t *field_value);
393fb4d8502Sjsg 
394fb4d8502Sjsg uint32_t generic_reg_get2(const struct dc_context *ctx, uint32_t addr,
395fb4d8502Sjsg 		uint8_t shift1, uint32_t mask1, uint32_t *field_value1,
396fb4d8502Sjsg 		uint8_t shift2, uint32_t mask2, uint32_t *field_value2);
397fb4d8502Sjsg 
398fb4d8502Sjsg uint32_t generic_reg_get3(const struct dc_context *ctx, uint32_t addr,
399fb4d8502Sjsg 		uint8_t shift1, uint32_t mask1, uint32_t *field_value1,
400fb4d8502Sjsg 		uint8_t shift2, uint32_t mask2, uint32_t *field_value2,
401fb4d8502Sjsg 		uint8_t shift3, uint32_t mask3, uint32_t *field_value3);
402fb4d8502Sjsg 
403fb4d8502Sjsg uint32_t generic_reg_get4(const struct dc_context *ctx, uint32_t addr,
404fb4d8502Sjsg 		uint8_t shift1, uint32_t mask1, uint32_t *field_value1,
405fb4d8502Sjsg 		uint8_t shift2, uint32_t mask2, uint32_t *field_value2,
406fb4d8502Sjsg 		uint8_t shift3, uint32_t mask3, uint32_t *field_value3,
407fb4d8502Sjsg 		uint8_t shift4, uint32_t mask4, uint32_t *field_value4);
408fb4d8502Sjsg 
409fb4d8502Sjsg uint32_t generic_reg_get5(const struct dc_context *ctx, uint32_t addr,
410fb4d8502Sjsg 		uint8_t shift1, uint32_t mask1, uint32_t *field_value1,
411fb4d8502Sjsg 		uint8_t shift2, uint32_t mask2, uint32_t *field_value2,
412fb4d8502Sjsg 		uint8_t shift3, uint32_t mask3, uint32_t *field_value3,
413fb4d8502Sjsg 		uint8_t shift4, uint32_t mask4, uint32_t *field_value4,
414fb4d8502Sjsg 		uint8_t shift5, uint32_t mask5, uint32_t *field_value5);
415fb4d8502Sjsg 
416fb4d8502Sjsg uint32_t generic_reg_get6(const struct dc_context *ctx, uint32_t addr,
417fb4d8502Sjsg 		uint8_t shift1, uint32_t mask1, uint32_t *field_value1,
418fb4d8502Sjsg 		uint8_t shift2, uint32_t mask2, uint32_t *field_value2,
419fb4d8502Sjsg 		uint8_t shift3, uint32_t mask3, uint32_t *field_value3,
420fb4d8502Sjsg 		uint8_t shift4, uint32_t mask4, uint32_t *field_value4,
421fb4d8502Sjsg 		uint8_t shift5, uint32_t mask5, uint32_t *field_value5,
422fb4d8502Sjsg 		uint8_t shift6, uint32_t mask6, uint32_t *field_value6);
423fb4d8502Sjsg 
424fb4d8502Sjsg uint32_t generic_reg_get7(const struct dc_context *ctx, uint32_t addr,
425fb4d8502Sjsg 		uint8_t shift1, uint32_t mask1, uint32_t *field_value1,
426fb4d8502Sjsg 		uint8_t shift2, uint32_t mask2, uint32_t *field_value2,
427fb4d8502Sjsg 		uint8_t shift3, uint32_t mask3, uint32_t *field_value3,
428fb4d8502Sjsg 		uint8_t shift4, uint32_t mask4, uint32_t *field_value4,
429fb4d8502Sjsg 		uint8_t shift5, uint32_t mask5, uint32_t *field_value5,
430fb4d8502Sjsg 		uint8_t shift6, uint32_t mask6, uint32_t *field_value6,
431fb4d8502Sjsg 		uint8_t shift7, uint32_t mask7, uint32_t *field_value7);
432fb4d8502Sjsg 
433fb4d8502Sjsg uint32_t generic_reg_get8(const struct dc_context *ctx, uint32_t addr,
434fb4d8502Sjsg 		uint8_t shift1, uint32_t mask1, uint32_t *field_value1,
435fb4d8502Sjsg 		uint8_t shift2, uint32_t mask2, uint32_t *field_value2,
436fb4d8502Sjsg 		uint8_t shift3, uint32_t mask3, uint32_t *field_value3,
437fb4d8502Sjsg 		uint8_t shift4, uint32_t mask4, uint32_t *field_value4,
438fb4d8502Sjsg 		uint8_t shift5, uint32_t mask5, uint32_t *field_value5,
439fb4d8502Sjsg 		uint8_t shift6, uint32_t mask6, uint32_t *field_value6,
440fb4d8502Sjsg 		uint8_t shift7, uint32_t mask7, uint32_t *field_value7,
441fb4d8502Sjsg 		uint8_t shift8, uint32_t mask8, uint32_t *field_value8);
442fb4d8502Sjsg 
443fb4d8502Sjsg 
444fb4d8502Sjsg /* indirect register access */
445fb4d8502Sjsg 
446fb4d8502Sjsg #define IX_REG_SET_N(index_reg_name, data_reg_name, index, n, initial_val, ...)	\
447fb4d8502Sjsg 		generic_indirect_reg_update_ex(CTX, \
448fb4d8502Sjsg 				REG(index_reg_name), REG(data_reg_name), IND_REG(index), \
449fb4d8502Sjsg 				initial_val, \
450fb4d8502Sjsg 				n, __VA_ARGS__)
451fb4d8502Sjsg 
452fb4d8502Sjsg #define IX_REG_SET_2(index_reg_name, data_reg_name, index, init_value, f1, v1, f2, v2)	\
453fb4d8502Sjsg 		IX_REG_SET_N(index_reg_name, data_reg_name, index, 2, init_value, \
454fb4d8502Sjsg 				FN(reg, f1), v1,\
455fb4d8502Sjsg 				FN(reg, f2), v2)
456fb4d8502Sjsg 
457fb4d8502Sjsg 
458fb4d8502Sjsg #define IX_REG_READ(index_reg_name, data_reg_name, index) \
459fb4d8502Sjsg 		generic_read_indirect_reg(CTX, REG(index_reg_name), REG(data_reg_name), IND_REG(index))
460fb4d8502Sjsg 
461c349dbc7Sjsg #define IX_REG_GET_N(index_reg_name, data_reg_name, index, n, ...) \
462c349dbc7Sjsg 		generic_indirect_reg_get(CTX, REG(index_reg_name), REG(data_reg_name), \
463c349dbc7Sjsg 				IND_REG(index), \
464c349dbc7Sjsg 				n, __VA_ARGS__)
465fb4d8502Sjsg 
466c349dbc7Sjsg #define IX_REG_GET(index_reg_name, data_reg_name, index, field, val) \
467c349dbc7Sjsg 		IX_REG_GET_N(index_reg_name, data_reg_name, index, 1, \
468c349dbc7Sjsg 				FN(data_reg_name, field), val)
469fb4d8502Sjsg 
470fb4d8502Sjsg #define IX_REG_UPDATE_N(index_reg_name, data_reg_name, index, n, ...)	\
471fb4d8502Sjsg 		generic_indirect_reg_update_ex(CTX, \
472fb4d8502Sjsg 				REG(index_reg_name), REG(data_reg_name), IND_REG(index), \
473fb4d8502Sjsg 				IX_REG_READ(index_reg_name, data_reg_name, index), \
474fb4d8502Sjsg 				n, __VA_ARGS__)
475fb4d8502Sjsg 
476fb4d8502Sjsg #define IX_REG_UPDATE_2(index_reg_name, data_reg_name, index, f1, v1, f2, v2)	\
477fb4d8502Sjsg 		IX_REG_UPDATE_N(index_reg_name, data_reg_name, index, 2,\
478fb4d8502Sjsg 				FN(reg, f1), v1,\
479fb4d8502Sjsg 				FN(reg, f2), v2)
480fb4d8502Sjsg 
481fb4d8502Sjsg void generic_write_indirect_reg(const struct dc_context *ctx,
482fb4d8502Sjsg 		uint32_t addr_index, uint32_t addr_data,
483fb4d8502Sjsg 		uint32_t index, uint32_t data);
484fb4d8502Sjsg 
485fb4d8502Sjsg uint32_t generic_read_indirect_reg(const struct dc_context *ctx,
486fb4d8502Sjsg 		uint32_t addr_index, uint32_t addr_data,
487fb4d8502Sjsg 		uint32_t index);
488fb4d8502Sjsg 
489c349dbc7Sjsg uint32_t generic_indirect_reg_get(const struct dc_context *ctx,
490c349dbc7Sjsg 		uint32_t addr_index, uint32_t addr_data,
491c349dbc7Sjsg 		uint32_t index, int n,
492c349dbc7Sjsg 		uint8_t shift1, uint32_t mask1, uint32_t *field_value1,
493c349dbc7Sjsg 		...);
494c349dbc7Sjsg 
495fb4d8502Sjsg uint32_t generic_indirect_reg_update_ex(const struct dc_context *ctx,
496fb4d8502Sjsg 		uint32_t addr_index, uint32_t addr_data,
497fb4d8502Sjsg 		uint32_t index, uint32_t reg_val, int n,
498fb4d8502Sjsg 		uint8_t shift1, uint32_t mask1, uint32_t field_value1,
499fb4d8502Sjsg 		...);
500fb4d8502Sjsg 
501*1bb76ff1Sjsg /* indirect register access
502*1bb76ff1Sjsg  * underlying implementation determines which index/data pair to be used
503*1bb76ff1Sjsg  * in a synchronous way
504*1bb76ff1Sjsg  */
505*1bb76ff1Sjsg #define IX_REG_SET_N_SYNC(index, n, initial_val, ...)	\
506*1bb76ff1Sjsg 		generic_indirect_reg_update_ex_sync(CTX, \
507*1bb76ff1Sjsg 				IND_REG(index), \
508*1bb76ff1Sjsg 				initial_val, \
509*1bb76ff1Sjsg 				n, __VA_ARGS__)
510*1bb76ff1Sjsg 
511*1bb76ff1Sjsg #define IX_REG_SET_2_SYNC(index, init_value, f1, v1, f2, v2)	\
512*1bb76ff1Sjsg 		IX_REG_SET_N_SYNC(index, 2, init_value, \
513*1bb76ff1Sjsg 				FN(reg, f1), v1,\
514*1bb76ff1Sjsg 				FN(reg, f2), v2)
515*1bb76ff1Sjsg 
516*1bb76ff1Sjsg #define IX_REG_GET_N_SYNC(index, n, ...) \
517*1bb76ff1Sjsg 		generic_indirect_reg_get_sync(CTX, \
518*1bb76ff1Sjsg 				IND_REG(index), \
519*1bb76ff1Sjsg 				n, __VA_ARGS__)
520*1bb76ff1Sjsg 
521*1bb76ff1Sjsg #define IX_REG_GET_SYNC(index, field, val) \
522*1bb76ff1Sjsg 		IX_REG_GET_N_SYNC(index, 1, \
523*1bb76ff1Sjsg 				FN(data_reg_name, field), val)
524*1bb76ff1Sjsg 
525*1bb76ff1Sjsg uint32_t generic_indirect_reg_get_sync(const struct dc_context *ctx,
526*1bb76ff1Sjsg 		uint32_t index, int n,
527*1bb76ff1Sjsg 		uint8_t shift1, uint32_t mask1, uint32_t *field_value1,
528*1bb76ff1Sjsg 		...);
529*1bb76ff1Sjsg 
530*1bb76ff1Sjsg uint32_t generic_indirect_reg_update_ex_sync(const struct dc_context *ctx,
531*1bb76ff1Sjsg 		uint32_t index, uint32_t reg_val, int n,
532*1bb76ff1Sjsg 		uint8_t shift1, uint32_t mask1, uint32_t field_value1,
533*1bb76ff1Sjsg 		...);
534*1bb76ff1Sjsg 
535c349dbc7Sjsg /* register offload macros
536c349dbc7Sjsg  *
537c349dbc7Sjsg  * instead of MMIO to register directly, in some cases we want
538c349dbc7Sjsg  * to gather register sequence and execute the register sequence
539c349dbc7Sjsg  * from another thread so we optimize time required for lengthy ops
540c349dbc7Sjsg  */
541c349dbc7Sjsg 
542c349dbc7Sjsg /* start gathering register sequence */
543c349dbc7Sjsg #define REG_SEQ_START() \
544c349dbc7Sjsg 	reg_sequence_start_gather(CTX)
545c349dbc7Sjsg 
546c349dbc7Sjsg /* start execution of register sequence gathered since REG_SEQ_START */
547c349dbc7Sjsg #define REG_SEQ_SUBMIT() \
548c349dbc7Sjsg 	reg_sequence_start_execute(CTX)
549c349dbc7Sjsg 
550c349dbc7Sjsg /* wait for the last REG_SEQ_SUBMIT to finish */
551c349dbc7Sjsg #define REG_SEQ_WAIT_DONE() \
552c349dbc7Sjsg 	reg_sequence_wait_done(CTX)
553c349dbc7Sjsg 
554fb4d8502Sjsg #endif /* DRIVERS_GPU_DRM_AMD_DC_DEV_DC_INC_REG_HELPER_H_ */
555