1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
|
/*
* Copyright (C) 2008 Maarten Maathuis.
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice (including the
* next paragraph) shall be included in all copies or substantial
* portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
/* copied from ddx definitions, until rules-ng can handle this */
#define NV50_UPDATE_DISPLAY 0x80
#define NV50_UNK84 0x84
#define NV50_UNK88 0x88
#define NV50_DAC0_MODE_CTRL 0x400
#define NV50_DAC_MODE_CTRL_OFF (0 << 0)
#define NV50_DAC_MODE_CTRL_CRTC0 (1 << 0)
#define NV50_DAC_MODE_CTRL_CRTC1 (1 << 1)
#define NV50_DAC1_MODE_CTRL 0x480
#define NV50_DAC2_MODE_CTRL 0x500
#define NV50_DAC0_MODE_CTRL2 0x404
#define NV50_DAC_MODE_CTRL2_NHSYNC (1 << 0)
#define NV50_DAC_MODE_CTRL2_NVSYNC (2 << 0)
#define NV50_DAC1_MODE_CTRL2 0x484
#define NV50_DAC2_MODE_CTRL2 0x504
#define NV50_SOR0_MODE_CTRL 0x600
#define NV50_SOR_MODE_CTRL_OFF (0 << 0)
#define NV50_SOR_MODE_CTRL_CRTC0 (1 << 0)
#define NV50_SOR_MODE_CTRL_CRTC1 (1 << 1)
#define NV50_SOR_MODE_CTRL_LVDS (0 << 8)
#define NV50_SOR_MODE_CTRL_TMDS (1 << 8)
#define NV50_SOR_MODE_CTRL_TMDS_DUAL_LINK (4 << 8)
#define NV50_SOR_MODE_CTRL_NHSYNC (1 << 12)
#define NV50_SOR_MODE_CTRL_NVSYNC (2 << 12)
#define NV50_SOR1_MODE_CTRL 0x640
#define NV50_CRTC0_UNK800 0x800
#define NV50_CRTC0_CLOCK 0x804
#define NV50_CRTC0_INTERLACE 0x808
/* 0x810 is a reasonable guess, nothing more. */
#define NV50_CRTC0_DISPLAY_START 0x810
#define NV50_CRTC0_DISPLAY_TOTAL 0x814
#define NV50_CRTC0_SYNC_DURATION 0x818
#define NV50_CRTC0_SYNC_START_TO_BLANK_END 0x81C
#define NV50_CRTC0_MODE_UNK1 0x820
#define NV50_CRTC0_MODE_UNK2 0x824
#define NV50_CRTC0_UNK82C 0x82C
/* You can't have a palette in 8 bit mode (=OFF) */
#define NV50_CRTC0_CLUT_MODE 0x840
#define NV50_CRTC0_CLUT_MODE_BLANK 0x00000000
#define NV50_CRTC0_CLUT_MODE_OFF 0x80000000
#define NV50_CRTC0_CLUT_MODE_ON 0xC0000000
#define NV50_CRTC0_CLUT_OFFSET 0x844
/* Anyone know what part of the chip is triggered here precisely? */
#define NV84_CRTC0_BLANK_UNK1 0x85C
#define NV84_CRTC0_BLANK_UNK1_BLANK 0x0
#define NV84_CRTC0_BLANK_UNK1_UNBLANK 0x1
#define NV50_CRTC0_FB_OFFSET 0x860
#define NV50_CRTC0_FB_SIZE 0x868
#define NV50_CRTC0_FB_PITCH 0x86C
#define NV50_CRTC0_DEPTH 0x870
#define NV50_CRTC0_DEPTH_8BPP 0x1E00
#define NV50_CRTC0_DEPTH_15BPP 0xE900
#define NV50_CRTC0_DEPTH_16BPP 0xE800
#define NV50_CRTC0_DEPTH_24BPP 0xCF00
/* I'm openminded to better interpretations. */
/* This is an educated guess. */
/* NV50 has RAMDAC and TMDS offchip, so it's unlikely to be that. */
#define NV50_CRTC0_BLANK_CTRL 0x874
#define NV50_CRTC0_BLANK_CTRL_BLANK 0x0
#define NV50_CRTC0_BLANK_CTRL_UNBLANK 0x1
#define NV50_CRTC0_CURSOR_CTRL 0x880
#define NV50_CRTC0_CURSOR_CTRL_SHOW 0x85000000
#define NV50_CRTC0_CURSOR_CTRL_HIDE 0x05000000
#define NV50_CRTC0_CURSOR_OFFSET 0x884
/* Anyone know what part of the chip is triggered here precisely? */
#define NV84_CRTC0_BLANK_UNK2 0x89C
#define NV84_CRTC0_BLANK_UNK2_BLANK 0x0
#define NV84_CRTC0_BLANK_UNK2_UNBLANK 0x1
#define NV50_CRTC0_DITHERING_CTRL 0x8A0
#define NV50_CRTC0_DITHERING_CTRL_ON 0x11
#define NV50_CRTC0_DITHERING_CTRL_OFF 0x0
#define NV50_CRTC0_SCALE_CTRL 0x8A4
#define NV50_CRTC0_SCALE_CTRL_SCALER_INACTIVE (0 << 0)
/* It doesn't seem to be needed, hence i wonder what it does precisely. */
#define NV50_CRTC0_SCALE_CTRL_SCALER_ACTIVE (9 << 0)
#define NV50_CRTC0_COLOR_CTRL 0x8A8
#define NV50_CRTC_COLOR_CTRL_MODE_COLOR (4 << 16)
#define NV50_CRTC0_FB_POS 0x8C0
#define NV50_CRTC0_REAL_RES 0x8C8
/* Added a macro, because the signed stuff can cause you problems very quickly. */
#define NV50_CRTC0_SCALE_CENTER_OFFSET 0x8D4
#define NV50_CRTC_SCALE_CENTER_OFFSET_VAL(x, y) ((((unsigned)y << 16) & 0xFFFF0000) | (((unsigned)x) & 0x0000FFFF))
/* Both of these are needed, otherwise nothing happens. */
#define NV50_CRTC0_SCALE_RES1 0x8D8
#define NV50_CRTC0_SCALE_RES2 0x8DC
#define NV50_CRTC1_UNK800 0xC00
#define NV50_CRTC1_CLOCK 0xC04
#define NV50_CRTC1_INTERLACE 0xC08
/* 0xC10 is a reasonable guess, nothing more. */
#define NV50_CRTC1_DISPLAY_START 0xC10
#define NV50_CRTC1_DISPLAY_TOTAL 0xC14
#define NV50_CRTC1_SYNC_DURATION 0xC18
#define NV50_CRTC1_SYNC_START_TO_BLANK_END 0xC1C
#define NV50_CRTC1_MODE_UNK1 0xC20
#define NV50_CRTC1_MODE_UNK2 0xC24
#define NV50_CRTC1_CLUT_MODE 0xC40
#define NV50_CRTC1_CLUT_MODE_BLANK 0x00000000
#define NV50_CRTC1_CLUT_MODE_OFF 0x80000000
#define NV50_CRTC1_CLUT_MODE_ON 0xC0000000
#define NV50_CRTC1_CLUT_OFFSET 0xC44
/* Anyone know what part of the chip is triggered here precisely? */
#define NV84_CRTC1_BLANK_UNK1 0xC5C
#define NV84_CRTC1_BLANK_UNK1_BLANK 0x0
#define NV84_CRTC1_BLANK_UNK1_UNBLANK 0x1
#define NV50_CRTC1_FB_OFFSET 0xC60
#define NV50_CRTC1_FB_SIZE 0xC68
#define NV50_CRTC1_FB_PITCH 0xC6C
#define NV50_CRTC1_DEPTH 0xC70
#define NV50_CRTC1_DEPTH_8BPP 0x1E00
#define NV50_CRTC1_DEPTH_15BPP 0xE900
#define NV50_CRTC1_DEPTH_16BPP 0xE800
#define NV50_CRTC1_DEPTH_24BPP 0xCF00
/* I'm openminded to better interpretations. */
#define NV50_CRTC1_BLANK_CTRL 0xC74
#define NV50_CRTC1_BLANK_CTRL_BLANK 0x0
#define NV50_CRTC1_BLANK_CTRL_UNBLANK 0x1
#define NV50_CRTC1_CURSOR_CTRL 0xC80
#define NV50_CRTC1_CURSOR_CTRL_SHOW 0x85000000
#define NV50_CRTC1_CURSOR_CTRL_HIDE 0x05000000
#define NV50_CRTC1_CURSOR_OFFSET 0xC84
/* Anyone know what part of the chip is triggered here precisely? */
#define NV84_CRTC1_BLANK_UNK2 0xC9C
#define NV84_CRTC1_BLANK_UNK2_BLANK 0x0
#define NV84_CRTC1_BLANK_UNK2_UNBLANK 0x1
#define NV50_CRTC1_DITHERING_CTRL 0xCA0
#define NV50_CRTC1_DITHERING_CTRL_ON 0x11
#define NV50_CRTC1_DITHERING_CTRL_OFF 0x0
#define NV50_CRTC1_SCALE_CTRL 0xCA4
#define NV50_CRTC1_COLOR_CTRL 0xCA8
#define NV50_CRTC1_FB_POS 0xCC0
#define NV50_CRTC1_REAL_RES 0xCC8
#define NV50_CRTC1_SCALE_CENTER_OFFSET 0xCD4
/* Both of these are needed, otherwise nothing happens. */
#define NV50_CRTC1_SCALE_RES1 0xCD8
#define NV50_CRTC1_SCALE_RES2 0xCDC
|