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