2 Haiku ATI video driver adapted from the X.org ATI driver which has the
5 Copyright 1999, 2000 ATI Technologies Inc., Markham, Ontario,
6 Precision Insight, Inc., Cedar Park, Texas, and
7 VA Linux Systems Inc., Fremont, California.
9 Copyright 2009, 2011 Haiku, Inc. All rights reserved.
10 Distributed under the terms of the MIT license.
21 #define CURSOR_BYTES 1024 // bytes used for cursor image in video memory
23 #define R128_TIMEOUT 2000000 // Fall out of wait loops after this count
26 // Register MMIO addresses.
27 //-------------------------
29 #define R128_AUX_SC_CNTL 0x1660
31 #define R128_BUS_CNTL 0x0030
32 # define R128_BUS_MASTER_DIS (1 << 6)
33 # define R128_BUS_RD_DISCARD_EN (1 << 24)
34 # define R128_BUS_RD_ABORT_EN (1 << 25)
35 # define R128_BUS_MSTR_DISCONNECT_EN (1 << 28)
36 # define R128_BUS_WRT_BURST (1 << 29)
37 # define R128_BUS_READ_BURST (1 << 30)
39 #define R128_CAP0_TRIG_CNTL 0x0950 // ?
40 #define R128_CAP1_TRIG_CNTL 0x09c0 // ?
41 #define R128_CLOCK_CNTL_DATA 0x000c
42 #define R128_CLOCK_CNTL_INDEX 0x0008
43 # define R128_PLL_WR_EN (1 << 7)
44 # define R128_PLL_DIV_SEL (3 << 8)
45 #define R128_CONFIG_MEMSIZE 0x00f8
46 #define R128_CRTC_EXT_CNTL 0x0054
47 # define R128_CRTC_VGA_XOVERSCAN (1 << 0)
48 # define R128_VGA_ATI_LINEAR (1 << 3)
49 # define R128_XCRT_CNT_EN (1 << 6)
50 # define R128_CRTC_HSYNC_DIS (1 << 8)
51 # define R128_CRTC_VSYNC_DIS (1 << 9)
52 # define R128_CRTC_DISPLAY_DIS (1 << 10)
53 # define R128_CRTC_CRT_ON (1 << 15)
54 # define R128_FP_OUT_EN (1 << 22)
55 # define R128_FP_ACTIVE (1 << 23)
56 #define R128_CRTC_GEN_CNTL 0x0050
57 # define R128_CRTC_CUR_EN (1 << 16)
58 # define R128_CRTC_EXT_DISP_EN (1 << 24)
59 # define R128_CRTC_EN (1 << 25)
60 #define R128_CRTC_H_SYNC_STRT_WID 0x0204
61 # define R128_CRTC_H_SYNC_POL (1 << 23)
62 #define R128_CRTC_H_TOTAL_DISP 0x0200
63 #define R128_CRTC_OFFSET 0x0224
64 #define R128_CRTC_OFFSET_CNTL 0x0228
65 #define R128_CRTC_PITCH 0x022c
66 #define R128_CRTC_V_SYNC_STRT_WID 0x020c
67 # define R128_CRTC_V_SYNC_POL (1 << 23)
68 #define R128_CRTC_V_TOTAL_DISP 0x0208
69 #define R128_CUR_CLR0 0x026c
70 #define R128_CUR_CLR1 0x0270
71 #define R128_CUR_HORZ_VERT_OFF 0x0268
72 #define R128_CUR_HORZ_VERT_POSN 0x0264
73 #define R128_CUR_OFFSET 0x0260
74 # define R128_CUR_LOCK (1 << 31)
76 #define R128_DAC_CNTL 0x0058
77 # define R128_DAC_RANGE_CNTL (3 << 0)
78 # define R128_DAC_BLANKING (1 << 2)
79 # define R128_DAC_CRT_SEL_CRTC2 (1 << 4)
80 # define R128_DAC_PALETTE_ACC_CTL (1 << 5)
81 # define R128_DAC_8BIT_EN (1 << 8)
82 # define R128_DAC_VGA_ADR_EN (1 << 13)
83 # define R128_DAC_MASK_ALL (0xff << 24)
84 #define R128_DDA_CONFIG 0x02e0
85 #define R128_DDA_ON_OFF 0x02e4
86 #define R128_DEFAULT_OFFSET 0x16e0
87 #define R128_DEFAULT_PITCH 0x16e4
88 #define R128_DEFAULT_SC_BOTTOM_RIGHT 0x16e8
89 # define R128_DEFAULT_SC_RIGHT_MAX (0x1fff << 0)
90 # define R128_DEFAULT_SC_BOTTOM_MAX (0x1fff << 16)
91 #define R128_DP_BRUSH_BKGD_CLR 0x1478
92 #define R128_DP_BRUSH_FRGD_CLR 0x147c
93 #define R128_DP_CNTL 0x16c0
94 # define R128_DST_X_LEFT_TO_RIGHT (1 << 0)
95 # define R128_DST_Y_TOP_TO_BOTTOM (1 << 1)
96 #define R128_DP_DATATYPE 0x16c4
97 # define R128_HOST_BIG_ENDIAN_EN (1 << 29)
98 #define R128_DP_GUI_MASTER_CNTL 0x146c
99 # define R128_DP_SRC_SOURCE_MEMORY (2 << 24)
100 # define R128_GMC_AUX_CLIP_DIS (1 << 29)
101 # define R128_GMC_BRUSH_NONE (15 << 4)
102 # define R128_GMC_BRUSH_SOLID_COLOR (13 << 4)
103 # define R128_GMC_CLR_CMP_CNTL_DIS (1 << 28)
104 # define R128_GMC_DST_DATATYPE_SHIFT 8
105 # define R128_GMC_SRC_DATATYPE_COLOR (3 << 12)
106 # define R128_ROP3_Dn 0x00550000
107 # define R128_ROP3_P 0x00f00000
108 # define R128_ROP3_S 0x00cc0000
109 #define R128_DP_SRC_BKGD_CLR 0x15dc
110 #define R128_DP_SRC_FRGD_CLR 0x15d8
111 #define R128_DP_WRITE_MASK 0x16cc
112 #define R128_DST_BRES_DEC 0x1630
113 #define R128_DST_BRES_ERR 0x1628
114 #define R128_DST_BRES_INC 0x162c
115 #define R128_DST_HEIGHT_WIDTH 0x143c
116 #define R128_DST_WIDTH_HEIGHT 0x1598
117 #define R128_DST_Y_X 0x1438
119 #define R128_FP_CRTC_H_TOTAL_DISP 0x0250
120 #define R128_FP_CRTC_V_TOTAL_DISP 0x0254
121 #define R128_FP_GEN_CNTL 0x0284
122 # define R128_FP_FPON (1 << 0)
123 # define R128_FP_BLANK_DIS (1 << 1)
124 # define R128_FP_TDMS_EN (1 << 2)
125 # define R128_FP_DETECT_SENSE (1 << 8)
126 # define R128_FP_SEL_CRTC2 (1 << 13)
127 # define R128_FP_CRTC_DONT_SHADOW_VPAR (1 << 16)
128 # define R128_FP_CRTC_DONT_SHADOW_HEND (1 << 17)
129 # define R128_FP_CRTC_USE_SHADOW_VEND (1 << 18)
130 # define R128_FP_CRTC_USE_SHADOW_ROWCUR (1 << 19)
131 # define R128_FP_CRTC_HORZ_DIV2_EN (1 << 20)
132 # define R128_FP_CRTC_HOR_CRT_DIV2_DIS (1 << 21)
133 # define R128_FP_CRT_SYNC_SEL (1 << 23)
134 # define R128_FP_USE_SHADOW_EN (1 << 24)
135 #define R128_FP_H_SYNC_STRT_WID 0x02c4
136 #define R128_FP_HORZ_STRETCH 0x028c
137 # define R128_HORZ_STRETCH_RATIO_MASK 0xfff
138 # define R128_HORZ_STRETCH_RATIO_SHIFT 0
139 # define R128_HORZ_STRETCH_RATIO_MAX 4096
140 # define R128_HORZ_PANEL_SIZE (0xff << 16)
141 # define R128_HORZ_PANEL_SHIFT 16
142 # define R128_AUTO_HORZ_RATIO (0 << 24)
143 # define R128_HORZ_STRETCH_PIXREP (0 << 25)
144 # define R128_HORZ_STRETCH_BLEND (1 << 25)
145 # define R128_HORZ_STRETCH_ENABLE (1 << 26)
146 # define R128_HORZ_FP_LOOP_STRETCH (0x7 << 27)
147 # define R128_HORZ_STRETCH_RESERVED (1 << 30)
148 # define R128_HORZ_AUTO_RATIO_FIX_EN (1 << 31)
150 #define R128_FP_PANEL_CNTL 0x0288
151 # define R128_FP_DIGON (1 << 0)
152 # define R128_FP_BLON (1 << 1)
153 #define R128_FP_V_SYNC_STRT_WID 0x02c8
154 #define R128_FP_VERT_STRETCH 0x0290
155 # define R128_VERT_PANEL_SIZE (0x7ff << 0)
156 # define R128_VERT_PANEL_SHIFT 0
157 # define R128_VERT_STRETCH_RATIO_MASK 0x3ff
158 # define R128_VERT_STRETCH_RATIO_SHIFT 11
159 # define R128_VERT_STRETCH_RATIO_MAX 1024
160 # define R128_VERT_STRETCH_ENABLE (1 << 24)
161 # define R128_VERT_STRETCH_LINEREP (0 << 25)
162 # define R128_VERT_STRETCH_BLEND (1 << 25)
163 # define R128_VERT_AUTO_RATIO_EN (1 << 26)
164 # define R128_VERT_STRETCH_RESERVED 0xf8e00000
166 #define R128_GEN_INT_CNTL 0x0040
167 #define R128_GEN_RESET_CNTL 0x00f0
168 # define R128_SOFT_RESET_GUI (1 << 0)
169 #define R128_GPIO_MONID 0x0068
170 # define R128_GPIO_MONID_A_0 (1 << 0)
171 # define R128_GPIO_MONID_A_3 (1 << 3)
172 # define R128_GPIO_MONID_Y_0 (1 << 8)
173 # define R128_GPIO_MONID_Y_3 (1 << 11)
174 # define R128_GPIO_MONID_EN_0 (1 << 16)
175 # define R128_GPIO_MONID_EN_3 (1 << 19)
176 # define R128_GPIO_MONID_MASK_0 (1 << 24)
177 # define R128_GPIO_MONID_MASK_3 (1 << 27)
178 #define R128_GUI_PROBE 0x16bc
179 #define R128_GUI_STAT 0x1740
180 # define R128_GUI_FIFOCNT_MASK 0x0fff
181 # define R128_GUI_ACTIVE (1 << 31)
183 #define R128_HTOTAL_CNTL 0x0009 // PLL
185 #define R128_I2C_CNTL_1 0x0094 // ?
187 #define R128_LVDS_GEN_CNTL 0x02d0
188 # define R128_LVDS_ON (1 << 0)
189 # define R128_LVDS_DISPLAY_DIS (1 << 1)
190 # define R128_LVDS_EN (1 << 7)
191 # define R128_LVDS_DIGON (1 << 18)
192 # define R128_LVDS_BLON (1 << 19)
193 # define R128_LVDS_SEL_CRTC2 (1 << 23)
194 # define R128_HSYNC_DELAY_SHIFT 28
195 # define R128_HSYNC_DELAY_MASK (0xf << 28)
197 #define R128_MCLK_CNTL 0x000f /* PLL */
198 # define R128_FORCE_GCP (1 << 16)
199 # define R128_FORCE_PIPE3D_CP (1 << 17)
200 #define R128_MEM_CNTL 0x0140
201 #define R128_MPP_TB_CONFIG 0x01c0 // ?
202 #define R128_MPP_GP_CONFIG 0x01c8 // ?
204 #define R128_OVR_CLR 0x0230
205 #define R128_OVR_WID_LEFT_RIGHT 0x0234
206 #define R128_OVR_WID_TOP_BOTTOM 0x0238
208 #define R128_PALETTE_DATA 0x00b4
209 #define R128_PALETTE_INDEX 0x00b0
210 #define R128_PC_NGUI_CTLSTAT 0x0184
211 # define R128_PC_FLUSH_ALL 0x00ff
212 # define R128_PC_BUSY (1 << 31)
213 #define R128_PPLL_CNTL 0x0002 // PLL
214 # define R128_PPLL_RESET (1 << 0)
215 # define R128_PPLL_SLEEP (1 << 1)
216 # define R128_PPLL_ATOMIC_UPDATE_EN (1 << 16)
217 # define R128_PPLL_VGA_ATOMIC_UPDATE_EN (1 << 17)
218 #define R128_PPLL_DIV_3 0x0007 // PLL
219 # define R128_PPLL_FB3_DIV_MASK 0x07ff
220 # define R128_PPLL_POST3_DIV_MASK 0x00070000
221 #define R128_PPLL_REF_DIV 0x0003 // PLL
222 # define R128_PPLL_REF_DIV_MASK 0x03ff
223 # define R128_PPLL_ATOMIC_UPDATE_R (1 << 15) // same as _W
224 # define R128_PPLL_ATOMIC_UPDATE_W (1 << 15) // same as _R
226 #define R128_SC_BOTTOM_RIGHT 0x16f0
227 #define R128_SC_TOP_LEFT 0x16ec
228 #define R128_SCALE_3D_CNTL 0x1a00
229 #define R128_SRC_Y_X 0x1434
230 #define R128_SUBPIC_CNTL 0x0540 // ?
232 #define R128_TMDS_CRC 0x02a0
234 #define R128_VCLK_ECP_CNTL 0x0008 // PLL
235 # define R128_VCLK_SRC_SEL_MASK 0x03
236 # define R128_VCLK_SRC_SEL_CPUCLK 0x00
237 # define R128_VCLK_SRC_SEL_PPLLCLK 0x03
238 # define R128_ECP_DIV_MASK (3 << 8)
239 #define R128_VIPH_CONTROL 0x01D0 // ?
242 // Definitions used for overlays.
243 //===============================
245 #define R128_OV0_Y_X_START 0x0400
246 #define R128_OV0_Y_X_END 0x0404
247 #define R128_OV0_EXCLUSIVE_HORZ 0x0408
248 #define R128_OV0_REG_LOAD_CNTL 0x0410
249 #define R128_OV0_SCALE_CNTL 0x0420
250 #define R128_OV0_V_INC 0x0424
251 #define R128_OV0_P1_V_ACCUM_INIT 0x0428
252 #define R128_OV0_P23_V_ACCUM_INIT 0x042C
253 #define R128_OV0_P1_BLANK_LINES_AT_TOP 0x0430
254 #define R128_OV0_VID_BUF0_BASE_ADRS 0x0440
255 #define R128_OV0_VID_BUF_PITCH0_VALUE 0x0460
256 #define R128_OV0_AUTO_FLIP_CNTL 0x0470
257 #define R128_OV0_H_INC 0x0480
258 #define R128_OV0_STEP_BY 0x0484
259 #define R128_OV0_P1_H_ACCUM_INIT 0x0488
260 #define R128_OV0_P23_H_ACCUM_INIT 0x048C
261 #define R128_OV0_P1_X_START_END 0x0494
262 #define R128_OV0_P2_X_START_END 0x0498
263 #define R128_OV0_P3_X_START_END 0x049C
264 #define R128_OV0_FILTER_CNTL 0x04A0
265 #define R128_OV0_COLOUR_CNTL 0x04E0
266 #define R128_OV0_GRAPHICS_KEY_CLR 0x04EC
267 #define R128_OV0_GRAPHICS_KEY_MSK 0x04F0
268 #define R128_OV0_KEY_CNTL 0x04F4
269 # define R128_GRAPHIC_KEY_FN_EQ 0x00000040L
270 # define R128_GRAPHIC_KEY_FN_NE 0x00000050L
271 #define R128_OV0_TEST 0x04F8
275 // Functions to get/set PLL registers.
276 //=======================================
279 GetPLLReg(uint8 index
)
281 OUTREG8(R128_CLOCK_CNTL_INDEX
, index
& 0x3f);
282 return INREG(R128_CLOCK_CNTL_DATA
);
287 SetPLLReg(uint8 index
, uint32 value
)
289 OUTREG8(R128_CLOCK_CNTL_INDEX
, ((index
) & 0x3f) | R128_PLL_WR_EN
);
290 OUTREG(R128_CLOCK_CNTL_DATA
, value
);
295 SetPLLReg(uint8 index
, uint32 value
, uint32 mask
)
297 // Write a value to a PLL reg using a mask. The mask selects the
298 // bits to be modified.
300 SetPLLReg(index
, (GetPLLReg(index
) & ~mask
) | (value
& mask
));
304 #endif // __RAGE128_H__