Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/freedreno/registers/adreno/adreno_control_regs.xml
8444 views
1
<?xml version="1.0" encoding="UTF-8"?>
2
<database xmlns="http://nouveau.freedesktop.org/"
3
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
xsi:schemaLocation="http://nouveau.freedesktop.org/ rules-ng.xsd">
5
6
<!--
7
This documents the internal register space used by the CP firmware since
8
the afuc instruction set was introduced.
9
-->
10
11
<domain name="A5XX_CONTROL_REG" width="32">
12
<reg64 name="IB1_BASE" offset="0x0b0"/>
13
<reg32 name="IB1_DWORDS" offset="0x0b2"/>
14
<reg64 name="IB2_BASE" offset="0x0b4"/>
15
<reg32 name="IB2_DWORDS" offset="0x0b6"/>
16
17
<doc>
18
To use these, write the address and number of dwords, then read
19
the result from $addr.
20
</doc>
21
<reg64 name="MEM_READ_ADDR" offset="0x0b8"/>
22
<reg32 name="MEM_READ_DWORDS" offset="0x0ba"/>
23
</domain>
24
25
<domain name="A6XX_CONTROL_REG" width="32">
26
<reg32 name="RB_RPTR" offset="0x001"/>
27
<doc>
28
Instruction to jump to when the CP is preempted to perform a
29
context switch, initialized to entry 15 of the jump table at
30
bootup.
31
</doc>
32
<reg32 name="PREEMPT_INSTR" offset="0x004"/>
33
34
<reg64 name="IB1_BASE" offset="0x010"/>
35
<reg32 name="IB1_DWORDS" offset="0x012"/>
36
<reg64 name="IB2_BASE" offset="0x014"/>
37
<reg32 name="IB2_DWORDS" offset="0x016"/>
38
39
<reg64 name="MEM_READ_ADDR" offset="0x018"/>
40
<reg32 name="MEM_READ_DWORDS" offset="0x01a"/>
41
42
<reg32 name="REG_WRITE_ADDR" offset="0x024"/>
43
<doc>
44
Writing to this triggers a register write and auto-increments
45
REG_WRITE_ADDR.
46
47
Note that there seems to be some upper bits that are possilby
48
flags, ie:
49
50
l284: 0d12: 8a8c0003 mov $0c, 0x0003 &lt;&lt; 20
51
GPR: $0c: 00300000
52
0d13: 318c9e0b or $0c, $0c, 0x9e0b
53
GPR: $0c: 00309e0b
54
0d14: a80c0024 cwrite $0c, [$00 + @REG_WRITE_ADDR], 0x0
55
CTRL: @REG_WRITE_ADDR: 00309e0b
56
57
</doc>
58
<reg32 name="REG_WRITE" offset="0x025"/>
59
60
<doc> After setting these, read result from $addr2 </doc>
61
<reg32 name="REG_READ_DWORDS" offset="0x026"/>
62
<reg32 name="REG_READ_ADDR" offset="0x027"/>
63
64
<doc>
65
Write to increase WFI_PEND_CTR, decremented by WFI_PEND_DECR
66
pipe register.
67
</doc>
68
<reg32 name="WFI_PEND_INCR" offset="0x030"/>
69
<reg32 name="QUERY_PEND_INCR" offset="0x031"/>
70
<reg32 name="CACHE_FLUSH_PEND_INCR" offset="0x031"/>
71
72
<reg32 name="WFI_PEND_CTR" offset="0x038"/>
73
<reg32 name="QUERY_PEND_CTR" offset="0x039"/>
74
<reg32 name="CACHE_FLUSH_PEND_CTR" offset="0x03a"/>
75
76
<reg32 name="DRAW_STATE_SEL" offset="0x041">
77
<doc>
78
SQE writes DRAW_STATE_SEL to select the SDS state group, and
79
then reads out the SDS header (DRAW_STATE_HDR), ie. the first
80
dword in the state group entry (see CP_SET_DRAW_STATE), and
81
base address of the state group cmdstream (DRAW_STATE_BASE)
82
</doc>
83
</reg32>
84
<reg64 name="SDS_BASE" offset="0x042">
85
<doc>
86
base address for executing draw state group when IB_LEVEL
87
is set to 3 (ie. it's a bit like IB3 equiv of IBn_BASE)
88
89
Note that SDS_BASE/SDS_DWORDS seem to be per-state-group,
90
the values reflected switch when DRAW_STATE_SEL is written.
91
</doc>
92
</reg64>
93
<reg32 name="SDS_DWORDS" offset="0x044">
94
<doc>
95
state group equiv of IBn_DWORDS
96
</doc>
97
</reg32>
98
99
<reg64 name="DRAW_STATE_BASE" offset="0x045"/>
100
<reg32 name="DRAW_STATE_HDR" offset="0x047">
101
<doc>
102
Contains information from the first dword of the state group
103
entry in CP_SET_DRAW_STATE, but format isn't exactly the
104
same. The # of dwords is in low 16b, and mode mask is in
105
high 16 bits
106
</doc>
107
</reg32>
108
<reg32 name="DRAW_STATE_ACTIVE_BITMASK" offset="0x049"/>
109
<reg32 name="DRAW_STATE_SET" offset="0x04a"/>
110
111
<doc> Controls whether RB, IB1, or IB2 is executed </doc>
112
<reg32 name="IB_LEVEL" offset="0x054"/>
113
114
<doc> Controls high 32 bits used by load and store afuc instructions </doc>
115
<reg32 name="LOAD_STORE_HI" offset="0x058"/>
116
117
<doc> Used to initialize the jump table for handling packets at bootup </doc>
118
<reg32 name="PACKET_TABLE_WRITE_ADDR" offset="0x060"/>
119
<reg32 name="PACKET_TABLE_WRITE" offset="0x061"/>
120
121
<reg32 name="PREEMPT_ENABLE" offset="0x071"/>
122
<reg32 name="SECURE_MODE" offset="0x075"/>
123
124
<!--
125
Note: I think that registers above 0x100 are actually just a
126
scratch space which can be used by firmware however it wants,
127
so these might change if the the firmware is updated.
128
-->
129
130
<doc>
131
These are addresses of various preemption records for the
132
current context. When context switching, the CP will save the
133
current state into these buffers, restore the state of the
134
next context from the buffers in the corresponding
135
CP_CONTEXT_SWITCH_PRIV_* registers written by the kernel,
136
then set these internal registers to the contents of
137
those registers. The kernel sets the initial values via
138
CP_SET_PSEUDO_REG on startup, and from then on the firmware
139
keeps track of them.
140
</doc>
141
<reg64 name="SAVE_REGISTER_SMMU_INFO" offset="0x110"/>
142
<reg64 name="SAVE_REGISTER_PRIV_NON_SECURE" offset="0x112"/>
143
<reg64 name="SAVE_REGISTER_PRIV_SECURE" offset="0x114"/>
144
<reg64 name="SAVE_REGISTER_NON_PRIV" offset="0x116"/>
145
<reg64 name="SAVE_REGISTER_COUNTER" offset="0x118"/>
146
147
<doc>
148
Used only during preemption, saved and restored from the "info"
149
field of a6xx_preemption_record. From the downstream kernel:
150
151
"Type of record. Written non-zero (usually) by CP.
152
we must set to zero for all ringbuffers."
153
</doc>
154
155
<reg32 name="PREEMPTION_INFO" offset="0x126"/>
156
157
<doc>
158
Seems to be a shadow for PC_MARKER
159
</doc>
160
<reg32 name="MARKER" offset="0x12a"/>
161
162
<doc>
163
Set by SET_MARKER, used to conditionally execute
164
CP_COND_REG_EXEC and draw states.
165
</doc>
166
<reg32 name="MODE_BITMASK" offset="0x12b"/>
167
168
<reg32 name="SCRATCH_REG0" offset="0x170"/>
169
<reg32 name="SCRATCH_REG1" offset="0x171"/>
170
<reg32 name="SCRATCH_REG2" offset="0x172"/>
171
<reg32 name="SCRATCH_REG3" offset="0x173"/>
172
<reg32 name="SCRATCH_REG4" offset="0x174"/>
173
<reg32 name="SCRATCH_REG5" offset="0x175"/>
174
<reg32 name="SCRATCH_REG6" offset="0x176"/>
175
<reg32 name="SCRATCH_REG7" offset="0x177"/>
176
</domain>
177
178
</database>
179
180