1*3000c4acSMikko Perttunen /* SPDX-License-Identifier: GPL-2.0-only */
2*3000c4acSMikko Perttunen /*
3*3000c4acSMikko Perttunen * Tegra host1x opcodes
4*3000c4acSMikko Perttunen *
5*3000c4acSMikko Perttunen * Copyright (c) 2022 NVIDIA Corporation.
6*3000c4acSMikko Perttunen */
7*3000c4acSMikko Perttunen
8*3000c4acSMikko Perttunen #ifndef __HOST1X_OPCODES_H
9*3000c4acSMikko Perttunen #define __HOST1X_OPCODES_H
10*3000c4acSMikko Perttunen
11*3000c4acSMikko Perttunen #include <linux/types.h>
12*3000c4acSMikko Perttunen
host1x_class_host_wait_syncpt(unsigned indx,unsigned threshold)13*3000c4acSMikko Perttunen static inline u32 host1x_class_host_wait_syncpt(
14*3000c4acSMikko Perttunen unsigned indx, unsigned threshold)
15*3000c4acSMikko Perttunen {
16*3000c4acSMikko Perttunen return host1x_uclass_wait_syncpt_indx_f(indx)
17*3000c4acSMikko Perttunen | host1x_uclass_wait_syncpt_thresh_f(threshold);
18*3000c4acSMikko Perttunen }
19*3000c4acSMikko Perttunen
host1x_class_host_load_syncpt_base(unsigned indx,unsigned threshold)20*3000c4acSMikko Perttunen static inline u32 host1x_class_host_load_syncpt_base(
21*3000c4acSMikko Perttunen unsigned indx, unsigned threshold)
22*3000c4acSMikko Perttunen {
23*3000c4acSMikko Perttunen return host1x_uclass_load_syncpt_base_base_indx_f(indx)
24*3000c4acSMikko Perttunen | host1x_uclass_load_syncpt_base_value_f(threshold);
25*3000c4acSMikko Perttunen }
26*3000c4acSMikko Perttunen
host1x_class_host_wait_syncpt_base(unsigned indx,unsigned base_indx,unsigned offset)27*3000c4acSMikko Perttunen static inline u32 host1x_class_host_wait_syncpt_base(
28*3000c4acSMikko Perttunen unsigned indx, unsigned base_indx, unsigned offset)
29*3000c4acSMikko Perttunen {
30*3000c4acSMikko Perttunen return host1x_uclass_wait_syncpt_base_indx_f(indx)
31*3000c4acSMikko Perttunen | host1x_uclass_wait_syncpt_base_base_indx_f(base_indx)
32*3000c4acSMikko Perttunen | host1x_uclass_wait_syncpt_base_offset_f(offset);
33*3000c4acSMikko Perttunen }
34*3000c4acSMikko Perttunen
host1x_class_host_incr_syncpt_base(unsigned base_indx,unsigned offset)35*3000c4acSMikko Perttunen static inline u32 host1x_class_host_incr_syncpt_base(
36*3000c4acSMikko Perttunen unsigned base_indx, unsigned offset)
37*3000c4acSMikko Perttunen {
38*3000c4acSMikko Perttunen return host1x_uclass_incr_syncpt_base_base_indx_f(base_indx)
39*3000c4acSMikko Perttunen | host1x_uclass_incr_syncpt_base_offset_f(offset);
40*3000c4acSMikko Perttunen }
41*3000c4acSMikko Perttunen
host1x_class_host_incr_syncpt(unsigned cond,unsigned indx)42*3000c4acSMikko Perttunen static inline u32 host1x_class_host_incr_syncpt(
43*3000c4acSMikko Perttunen unsigned cond, unsigned indx)
44*3000c4acSMikko Perttunen {
45*3000c4acSMikko Perttunen return host1x_uclass_incr_syncpt_cond_f(cond)
46*3000c4acSMikko Perttunen | host1x_uclass_incr_syncpt_indx_f(indx);
47*3000c4acSMikko Perttunen }
48*3000c4acSMikko Perttunen
host1x_class_host_indoff_reg_write(unsigned mod_id,unsigned offset,bool auto_inc)49*3000c4acSMikko Perttunen static inline u32 host1x_class_host_indoff_reg_write(
50*3000c4acSMikko Perttunen unsigned mod_id, unsigned offset, bool auto_inc)
51*3000c4acSMikko Perttunen {
52*3000c4acSMikko Perttunen u32 v = host1x_uclass_indoff_indbe_f(0xf)
53*3000c4acSMikko Perttunen | host1x_uclass_indoff_indmodid_f(mod_id)
54*3000c4acSMikko Perttunen | host1x_uclass_indoff_indroffset_f(offset);
55*3000c4acSMikko Perttunen if (auto_inc)
56*3000c4acSMikko Perttunen v |= host1x_uclass_indoff_autoinc_f(1);
57*3000c4acSMikko Perttunen return v;
58*3000c4acSMikko Perttunen }
59*3000c4acSMikko Perttunen
host1x_class_host_indoff_reg_read(unsigned mod_id,unsigned offset,bool auto_inc)60*3000c4acSMikko Perttunen static inline u32 host1x_class_host_indoff_reg_read(
61*3000c4acSMikko Perttunen unsigned mod_id, unsigned offset, bool auto_inc)
62*3000c4acSMikko Perttunen {
63*3000c4acSMikko Perttunen u32 v = host1x_uclass_indoff_indmodid_f(mod_id)
64*3000c4acSMikko Perttunen | host1x_uclass_indoff_indroffset_f(offset)
65*3000c4acSMikko Perttunen | host1x_uclass_indoff_rwn_read_v();
66*3000c4acSMikko Perttunen if (auto_inc)
67*3000c4acSMikko Perttunen v |= host1x_uclass_indoff_autoinc_f(1);
68*3000c4acSMikko Perttunen return v;
69*3000c4acSMikko Perttunen }
70*3000c4acSMikko Perttunen
host1x_opcode_setclass(unsigned class_id,unsigned offset,unsigned mask)71*3000c4acSMikko Perttunen static inline u32 host1x_opcode_setclass(
72*3000c4acSMikko Perttunen unsigned class_id, unsigned offset, unsigned mask)
73*3000c4acSMikko Perttunen {
74*3000c4acSMikko Perttunen return (0 << 28) | (offset << 16) | (class_id << 6) | mask;
75*3000c4acSMikko Perttunen }
76*3000c4acSMikko Perttunen
host1x_opcode_incr(unsigned offset,unsigned count)77*3000c4acSMikko Perttunen static inline u32 host1x_opcode_incr(unsigned offset, unsigned count)
78*3000c4acSMikko Perttunen {
79*3000c4acSMikko Perttunen return (1 << 28) | (offset << 16) | count;
80*3000c4acSMikko Perttunen }
81*3000c4acSMikko Perttunen
host1x_opcode_nonincr(unsigned offset,unsigned count)82*3000c4acSMikko Perttunen static inline u32 host1x_opcode_nonincr(unsigned offset, unsigned count)
83*3000c4acSMikko Perttunen {
84*3000c4acSMikko Perttunen return (2 << 28) | (offset << 16) | count;
85*3000c4acSMikko Perttunen }
86*3000c4acSMikko Perttunen
host1x_opcode_mask(unsigned offset,unsigned mask)87*3000c4acSMikko Perttunen static inline u32 host1x_opcode_mask(unsigned offset, unsigned mask)
88*3000c4acSMikko Perttunen {
89*3000c4acSMikko Perttunen return (3 << 28) | (offset << 16) | mask;
90*3000c4acSMikko Perttunen }
91*3000c4acSMikko Perttunen
host1x_opcode_imm(unsigned offset,unsigned value)92*3000c4acSMikko Perttunen static inline u32 host1x_opcode_imm(unsigned offset, unsigned value)
93*3000c4acSMikko Perttunen {
94*3000c4acSMikko Perttunen return (4 << 28) | (offset << 16) | value;
95*3000c4acSMikko Perttunen }
96*3000c4acSMikko Perttunen
host1x_opcode_imm_incr_syncpt(unsigned cond,unsigned indx)97*3000c4acSMikko Perttunen static inline u32 host1x_opcode_imm_incr_syncpt(unsigned cond, unsigned indx)
98*3000c4acSMikko Perttunen {
99*3000c4acSMikko Perttunen return host1x_opcode_imm(host1x_uclass_incr_syncpt_r(),
100*3000c4acSMikko Perttunen host1x_class_host_incr_syncpt(cond, indx));
101*3000c4acSMikko Perttunen }
102*3000c4acSMikko Perttunen
host1x_opcode_restart(unsigned address)103*3000c4acSMikko Perttunen static inline u32 host1x_opcode_restart(unsigned address)
104*3000c4acSMikko Perttunen {
105*3000c4acSMikko Perttunen return (5 << 28) | (address >> 4);
106*3000c4acSMikko Perttunen }
107*3000c4acSMikko Perttunen
host1x_opcode_gather(unsigned count)108*3000c4acSMikko Perttunen static inline u32 host1x_opcode_gather(unsigned count)
109*3000c4acSMikko Perttunen {
110*3000c4acSMikko Perttunen return (6 << 28) | count;
111*3000c4acSMikko Perttunen }
112*3000c4acSMikko Perttunen
host1x_opcode_gather_nonincr(unsigned offset,unsigned count)113*3000c4acSMikko Perttunen static inline u32 host1x_opcode_gather_nonincr(unsigned offset, unsigned count)
114*3000c4acSMikko Perttunen {
115*3000c4acSMikko Perttunen return (6 << 28) | (offset << 16) | BIT(15) | count;
116*3000c4acSMikko Perttunen }
117*3000c4acSMikko Perttunen
host1x_opcode_gather_incr(unsigned offset,unsigned count)118*3000c4acSMikko Perttunen static inline u32 host1x_opcode_gather_incr(unsigned offset, unsigned count)
119*3000c4acSMikko Perttunen {
120*3000c4acSMikko Perttunen return (6 << 28) | (offset << 16) | BIT(15) | BIT(14) | count;
121*3000c4acSMikko Perttunen }
122*3000c4acSMikko Perttunen
host1x_opcode_setstreamid(unsigned streamid)123*3000c4acSMikko Perttunen static inline u32 host1x_opcode_setstreamid(unsigned streamid)
124*3000c4acSMikko Perttunen {
125*3000c4acSMikko Perttunen return (7 << 28) | streamid;
126*3000c4acSMikko Perttunen }
127*3000c4acSMikko Perttunen
host1x_opcode_setpayload(unsigned payload)128*3000c4acSMikko Perttunen static inline u32 host1x_opcode_setpayload(unsigned payload)
129*3000c4acSMikko Perttunen {
130*3000c4acSMikko Perttunen return (9 << 28) | payload;
131*3000c4acSMikko Perttunen }
132*3000c4acSMikko Perttunen
host1x_opcode_gather_wide(unsigned count)133*3000c4acSMikko Perttunen static inline u32 host1x_opcode_gather_wide(unsigned count)
134*3000c4acSMikko Perttunen {
135*3000c4acSMikko Perttunen return (12 << 28) | count;
136*3000c4acSMikko Perttunen }
137*3000c4acSMikko Perttunen
host1x_opcode_acquire_mlock(unsigned mlock)138*3000c4acSMikko Perttunen static inline u32 host1x_opcode_acquire_mlock(unsigned mlock)
139*3000c4acSMikko Perttunen {
140*3000c4acSMikko Perttunen return (14 << 28) | (0 << 24) | mlock;
141*3000c4acSMikko Perttunen }
142*3000c4acSMikko Perttunen
host1x_opcode_release_mlock(unsigned mlock)143*3000c4acSMikko Perttunen static inline u32 host1x_opcode_release_mlock(unsigned mlock)
144*3000c4acSMikko Perttunen {
145*3000c4acSMikko Perttunen return (14 << 28) | (1 << 24) | mlock;
146*3000c4acSMikko Perttunen }
147*3000c4acSMikko Perttunen
148*3000c4acSMikko Perttunen #define HOST1X_OPCODE_NOP host1x_opcode_nonincr(0, 0)
149*3000c4acSMikko Perttunen
150*3000c4acSMikko Perttunen #endif
151