radeon_probe.h revision 2f39173d
1209ff23fSmrg/*
2209ff23fSmrg * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and
3209ff23fSmrg *                VA Linux Systems Inc., Fremont, California.
4209ff23fSmrg *
5209ff23fSmrg * All Rights Reserved.
6209ff23fSmrg *
7209ff23fSmrg * Permission is hereby granted, free of charge, to any person obtaining
8209ff23fSmrg * a copy of this software and associated documentation files (the
9209ff23fSmrg * "Software"), to deal in the Software without restriction, including
10209ff23fSmrg * without limitation on the rights to use, copy, modify, merge,
11209ff23fSmrg * publish, distribute, sublicense, and/or sell copies of the Software,
12209ff23fSmrg * and to permit persons to whom the Software is furnished to do so,
13209ff23fSmrg * subject to the following conditions:
14209ff23fSmrg *
15209ff23fSmrg * The above copyright notice and this permission notice (including the
16209ff23fSmrg * next paragraph) shall be included in all copies or substantial
17209ff23fSmrg * portions of the Software.
18209ff23fSmrg *
19209ff23fSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20209ff23fSmrg * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21209ff23fSmrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22209ff23fSmrg * NON-INFRINGEMENT.  IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR
23209ff23fSmrg * THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
24209ff23fSmrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25209ff23fSmrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26209ff23fSmrg * DEALINGS IN THE SOFTWARE.
27209ff23fSmrg */
28209ff23fSmrg
29209ff23fSmrg/*
30209ff23fSmrg * Authors:
31209ff23fSmrg *   Kevin E. Martin <martin@xfree86.org>
32209ff23fSmrg *
33209ff23fSmrg * Modified by Marc Aurele La France <tsi@xfree86.org> for ATI driver merge.
34209ff23fSmrg */
35209ff23fSmrg
36209ff23fSmrg#ifndef _RADEON_PROBE_H_
37209ff23fSmrg#define _RADEON_PROBE_H_ 1
38209ff23fSmrg
39209ff23fSmrg#include <stdint.h>
40209ff23fSmrg#include "xf86str.h"
41209ff23fSmrg#include "xf86DDC.h"
42209ff23fSmrg#include "randrstr.h"
43209ff23fSmrg
44209ff23fSmrg#include "xf86Crtc.h"
45209ff23fSmrg
46209ff23fSmrg#ifdef USE_EXA
47209ff23fSmrg#include "exa.h"
48209ff23fSmrg#endif
49209ff23fSmrg#ifdef USE_XAA
50209ff23fSmrg#include "xaa.h"
51209ff23fSmrg#endif
52209ff23fSmrg
53209ff23fSmrgextern DriverRec RADEON;
54209ff23fSmrg
55ad43ddacSmrg#define RADEON_MAX_CRTC 6
56b7e1c893Smrg#define RADEON_MAX_BIOS_CONNECTOR 16
57b7e1c893Smrg
58209ff23fSmrgtypedef enum
59209ff23fSmrg{
60209ff23fSmrg    MT_UNKNOWN = -1,
61209ff23fSmrg    MT_NONE    = 0,
62209ff23fSmrg    MT_CRT     = 1,
63209ff23fSmrg    MT_LCD     = 2,
64209ff23fSmrg    MT_DFP     = 3,
65209ff23fSmrg    MT_CTV     = 4,
66209ff23fSmrg    MT_STV     = 5,
67209ff23fSmrg    MT_CV      = 6,
68209ff23fSmrg    MT_HDMI    = 7, // this should really just be MT_DFP
69209ff23fSmrg    MT_DP      = 8
70209ff23fSmrg} RADEONMonitorType;
71209ff23fSmrg
72209ff23fSmrgtypedef enum
73209ff23fSmrg{
74209ff23fSmrg    CONNECTOR_NONE,
75209ff23fSmrg    CONNECTOR_VGA,
76209ff23fSmrg    CONNECTOR_DVI_I,
77209ff23fSmrg    CONNECTOR_DVI_D,
78209ff23fSmrg    CONNECTOR_DVI_A,
79209ff23fSmrg    CONNECTOR_STV,
80209ff23fSmrg    CONNECTOR_CTV,
81209ff23fSmrg    CONNECTOR_LVDS,
82209ff23fSmrg    CONNECTOR_DIGITAL,
83209ff23fSmrg    CONNECTOR_SCART,
84209ff23fSmrg    CONNECTOR_HDMI_TYPE_A,
85209ff23fSmrg    CONNECTOR_HDMI_TYPE_B,
86209ff23fSmrg    CONNECTOR_0XC,
87209ff23fSmrg    CONNECTOR_0XD,
88209ff23fSmrg    CONNECTOR_DIN,
89209ff23fSmrg    CONNECTOR_DISPLAY_PORT,
90ad43ddacSmrg    CONNECTOR_EDP,
91209ff23fSmrg    CONNECTOR_UNSUPPORTED
92209ff23fSmrg} RADEONConnectorType;
93209ff23fSmrg
94209ff23fSmrgtypedef enum
95209ff23fSmrg{
96209ff23fSmrg    DVI_AUTO,
97209ff23fSmrg    DVI_DIGITAL,
98209ff23fSmrg    DVI_ANALOG
99209ff23fSmrg} RADEONDviType;
100209ff23fSmrg
101209ff23fSmrgtypedef enum
102209ff23fSmrg{
103209ff23fSmrg    RMX_OFF,
104209ff23fSmrg    RMX_FULL,
105b7e1c893Smrg    RMX_CENTER,
106b7e1c893Smrg    RMX_ASPECT
107209ff23fSmrg} RADEONRMXType;
108209ff23fSmrg
109209ff23fSmrgtypedef struct {
110209ff23fSmrg    uint32_t freq;
111209ff23fSmrg    uint32_t value;
112209ff23fSmrg}RADEONTMDSPll;
113209ff23fSmrg
114209ff23fSmrg/* standards */
115209ff23fSmrgtypedef enum
116209ff23fSmrg{
117209ff23fSmrg    TV_STD_NTSC      = 1,
118209ff23fSmrg    TV_STD_PAL       = 2,
119209ff23fSmrg    TV_STD_PAL_M     = 4,
120209ff23fSmrg    TV_STD_PAL_60    = 8,
121209ff23fSmrg    TV_STD_NTSC_J    = 16,
122209ff23fSmrg    TV_STD_SCART_PAL = 32,
123209ff23fSmrg    TV_STD_SECAM     = 64,
124209ff23fSmrg    TV_STD_PAL_CN    = 128,
125209ff23fSmrg} TVStd;
126209ff23fSmrg
127209ff23fSmrgtypedef struct
128209ff23fSmrg{
129209ff23fSmrg    Bool   valid;
130209ff23fSmrg    uint32_t mask_clk_reg;
131209ff23fSmrg    uint32_t mask_data_reg;
132b7e1c893Smrg    uint32_t a_clk_reg;
133b7e1c893Smrg    uint32_t a_data_reg;
134209ff23fSmrg    uint32_t put_clk_reg;
135209ff23fSmrg    uint32_t put_data_reg;
136209ff23fSmrg    uint32_t get_clk_reg;
137209ff23fSmrg    uint32_t get_data_reg;
138209ff23fSmrg    uint32_t mask_clk_mask;
139209ff23fSmrg    uint32_t mask_data_mask;
140209ff23fSmrg    uint32_t put_clk_mask;
141209ff23fSmrg    uint32_t put_data_mask;
142209ff23fSmrg    uint32_t get_clk_mask;
143209ff23fSmrg    uint32_t get_data_mask;
144b7e1c893Smrg    uint32_t a_clk_mask;
145b7e1c893Smrg    uint32_t a_data_mask;
146b7e1c893Smrg    int hw_line;
147b7e1c893Smrg    Bool hw_capable;
148209ff23fSmrg} RADEONI2CBusRec, *RADEONI2CBusPtr;
149209ff23fSmrg
1502f39173dSmrgenum radeon_pll_algo {
1512f39173dSmrg    RADEON_PLL_OLD,
1522f39173dSmrg    RADEON_PLL_NEW
1532f39173dSmrg};
1542f39173dSmrg
155209ff23fSmrgtypedef struct _RADEONCrtcPrivateRec {
156b7e1c893Smrg    void *crtc_rotate_mem;
157b7e1c893Smrg    void *cursor_mem;
158209ff23fSmrg    int crtc_id;
159209ff23fSmrg    int binding;
160209ff23fSmrg    uint32_t cursor_offset;
161209ff23fSmrg    /* Lookup table values to be set when the CRTC is enabled */
162b7e1c893Smrg    uint16_t lut_r[256], lut_g[256], lut_b[256];
163209ff23fSmrg
164209ff23fSmrg    uint32_t crtc_offset;
165209ff23fSmrg    int can_tile;
166209ff23fSmrg    Bool enabled;
167b7e1c893Smrg    Bool initialized;
168ad43ddacSmrg    Bool scaler_enabled;
169ad43ddacSmrg    float vsc;
170ad43ddacSmrg    float hsc;
171ad43ddacSmrg    int pll_id;
1722f39173dSmrg    enum radeon_pll_algo     pll_algo;
173209ff23fSmrg} RADEONCrtcPrivateRec, *RADEONCrtcPrivatePtr;
174209ff23fSmrg
175b7e1c893Smrgtypedef struct _radeon_encoder {
176b7e1c893Smrg    uint16_t encoder_id;
177209ff23fSmrg    int devices;
178209ff23fSmrg    void *dev_priv;
179b7e1c893Smrg} radeon_encoder_rec, *radeon_encoder_ptr;
180b7e1c893Smrg
181b7e1c893Smrgtypedef struct _radeon_tvout {
182b7e1c893Smrg    /* TV out */
183b7e1c893Smrg    TVStd             default_tvStd;
184b7e1c893Smrg    TVStd             tvStd;
185b7e1c893Smrg    int               hPos;
186b7e1c893Smrg    int               vPos;
187b7e1c893Smrg    int               hSize;
188b7e1c893Smrg    float             TVRefClk;
189b7e1c893Smrg    int               SupportedTVStds;
190b7e1c893Smrg    Bool              tv_on;
191b7e1c893Smrg} radeon_tvout_rec, *radeon_tvout_ptr;
192b7e1c893Smrg
193b7e1c893Smrgtypedef struct _radeon_native_mode {
194209ff23fSmrg    /* panel stuff */
195209ff23fSmrg    int               PanelXRes;
196209ff23fSmrg    int               PanelYRes;
197209ff23fSmrg    int               HOverPlus;
198209ff23fSmrg    int               HSyncWidth;
199209ff23fSmrg    int               HBlank;
200209ff23fSmrg    int               VOverPlus;
201209ff23fSmrg    int               VSyncWidth;
202209ff23fSmrg    int               VBlank;
203b7e1c893Smrg    int               Flags;
204209ff23fSmrg    int               DotClock;
205b7e1c893Smrg} radeon_native_mode_rec, *radeon_native_mode_ptr;
206b7e1c893Smrg
207b7e1c893Smrgtypedef struct _radeon_tvdac {
208b7e1c893Smrg    // tv dac
209b7e1c893Smrg    uint32_t          ps2_tvdac_adj;
210b7e1c893Smrg    uint32_t          pal_tvdac_adj;
211b7e1c893Smrg    uint32_t          ntsc_tvdac_adj;
212b7e1c893Smrg} radeon_tvdac_rec, *radeon_tvdac_ptr;
213b7e1c893Smrg
214b7e1c893Smrgtypedef struct _radeon_tmds {
215b7e1c893Smrg    // tmds
216209ff23fSmrg    RADEONTMDSPll     tmds_pll[4];
217b7e1c893Smrg} radeon_tmds_rec, *radeon_tmds_ptr;
218b7e1c893Smrg
219b7e1c893Smrgtypedef struct _radeon_lvds {
220b7e1c893Smrg    // panel mode
221b7e1c893Smrg    radeon_native_mode_rec native_mode;
222b7e1c893Smrg    // lvds
223b7e1c893Smrg    int               PanelPwrDly;
224b7e1c893Smrg    int               lvds_misc;
225b7e1c893Smrg    int               lvds_ss_id;
226b7e1c893Smrg} radeon_lvds_rec, *radeon_lvds_ptr;
227b7e1c893Smrg
228b7e1c893Smrgtypedef struct _radeon_dvo {
229209ff23fSmrg    /* dvo */
230c503f109Smrg    I2CBusPtr         pI2CBus;
231209ff23fSmrg    I2CDevPtr         DVOChip;
232209ff23fSmrg    RADEONI2CBusRec   dvo_i2c;
233209ff23fSmrg    int               dvo_i2c_slave_addr;
234209ff23fSmrg    Bool              dvo_duallink;
235b7e1c893Smrg} radeon_dvo_rec, *radeon_dvo_ptr;
236b7e1c893Smrg
237b7e1c893Smrgtypedef struct {
238b7e1c893Smrg    RADEONConnectorType ConnectorType;
239b7e1c893Smrg    Bool valid;
240b7e1c893Smrg    int output_id;
241b7e1c893Smrg    int devices;
242b7e1c893Smrg    int hpd_mask;
243b7e1c893Smrg    RADEONI2CBusRec ddc_i2c;
244209ff23fSmrg    int igp_lane_info;
245b7e1c893Smrg    Bool shared_ddc;
246b7e1c893Smrg    int i2c_line_mux;
247b7e1c893Smrg    Bool load_detection;
248b7e1c893Smrg    Bool linkb;
249b7e1c893Smrg    uint16_t connector_object;
250ad43ddacSmrg    uint16_t connector_object_id;
251ad43ddacSmrg    uint8_t ucI2cId;
252ad43ddacSmrg    uint8_t hpd_id;
253b7e1c893Smrg} RADEONBIOSConnector;
254209ff23fSmrg
255b7e1c893Smrgtypedef struct _RADEONOutputPrivateRec {
256b7e1c893Smrg    uint16_t connector_id;
257b7e1c893Smrg    uint32_t devices;
258b7e1c893Smrg    uint32_t active_device;
259209ff23fSmrg    Bool enabled;
260b7e1c893Smrg
261b7e1c893Smrg    int  load_detection;
262b7e1c893Smrg
263b7e1c893Smrg    // DVI/HDMI
264b7e1c893Smrg    Bool coherent_mode;
265b7e1c893Smrg    Bool linkb;
266b7e1c893Smrg
267b7e1c893Smrg    RADEONConnectorType ConnectorType;
268ad43ddacSmrg    uint16_t connector_object_id;
269b7e1c893Smrg    RADEONDviType DVIType;
270b7e1c893Smrg    RADEONMonitorType MonType;
271b7e1c893Smrg
272b7e1c893Smrg    // DDC info
273b7e1c893Smrg    I2CBusPtr         pI2CBus;
274b7e1c893Smrg    RADEONI2CBusRec   ddc_i2c;
275b7e1c893Smrg    Bool shared_ddc;
276ad43ddacSmrg
277ad43ddacSmrg    Bool custom_edid;
278ad43ddacSmrg    xf86MonPtr custom_mon;
279b7e1c893Smrg    // router info
280b7e1c893Smrg    // HDP info
281b7e1c893Smrg
282b7e1c893Smrg    // panel mode
283b7e1c893Smrg    radeon_native_mode_rec native_mode;
284b7e1c893Smrg
285b7e1c893Smrg    // RMX
286b7e1c893Smrg    RADEONRMXType     rmx_type;
287b7e1c893Smrg    int               Flags;
288b7e1c893Smrg
289b7e1c893Smrg    //tvout - move to encoder
290b7e1c893Smrg    radeon_tvout_rec tvout;
291b7e1c893Smrg
292b7e1c893Smrg    /* dce 3.x dig block */
293b7e1c893Smrg    int igp_lane_info;
294ad43ddacSmrg    int dig_encoder;
295b7e1c893Smrg
296b7e1c893Smrg    int pixel_clock;
297ad43ddacSmrg
298ad43ddacSmrg    /* DP - aux bus*/
299ad43ddacSmrg    I2CBusPtr dp_pI2CBus;
300ad43ddacSmrg    uint8_t ucI2cId;
301ad43ddacSmrg    char dp_bus_name[20];
302ad43ddacSmrg    uint32_t dp_i2c_addr;
303ad43ddacSmrg    Bool dp_i2c_running;
304ad43ddacSmrg    /* DP - general config */
305ad43ddacSmrg    uint8_t dpcd[8];
306ad43ddacSmrg    int dp_lane_count;
307ad43ddacSmrg    int dp_clock;
308ad43ddacSmrg    uint8_t hpd_id;
309ad43ddacSmrg    int pll_id;
310209ff23fSmrg} RADEONOutputPrivateRec, *RADEONOutputPrivatePtr;
311209ff23fSmrg
312209ff23fSmrgstruct avivo_pll_state {
313209ff23fSmrg    uint32_t ref_div_src;
314209ff23fSmrg    uint32_t ref_div;
315209ff23fSmrg    uint32_t fb_div;
316209ff23fSmrg    uint32_t post_div_src;
317209ff23fSmrg    uint32_t post_div;
318209ff23fSmrg    uint32_t ext_ppll_cntl;
319209ff23fSmrg    uint32_t pll_cntl;
320209ff23fSmrg    uint32_t int_ss_cntl;
321209ff23fSmrg};
322209ff23fSmrg
323209ff23fSmrgstruct avivo_crtc_state {
324209ff23fSmrg    uint32_t pll_source;
325209ff23fSmrg    uint32_t h_total;
326209ff23fSmrg    uint32_t h_blank_start_end;
327209ff23fSmrg    uint32_t h_sync_a;
328209ff23fSmrg    uint32_t h_sync_a_cntl;
329209ff23fSmrg    uint32_t h_sync_b;
330209ff23fSmrg    uint32_t h_sync_b_cntl;
331209ff23fSmrg    uint32_t v_total;
332209ff23fSmrg    uint32_t v_blank_start_end;
333209ff23fSmrg    uint32_t v_sync_a;
334209ff23fSmrg    uint32_t v_sync_a_cntl;
335209ff23fSmrg    uint32_t v_sync_b;
336209ff23fSmrg    uint32_t v_sync_b_cntl;
337209ff23fSmrg    uint32_t control;
338209ff23fSmrg    uint32_t blank_control;
339209ff23fSmrg    uint32_t interlace_control;
340209ff23fSmrg    uint32_t stereo_control;
341209ff23fSmrg    uint32_t cursor_control;
342209ff23fSmrg};
343209ff23fSmrg
344209ff23fSmrgstruct avivo_grph_state {
345209ff23fSmrg    uint32_t enable;
346209ff23fSmrg    uint32_t control;
347209ff23fSmrg    uint32_t prim_surf_addr;
348209ff23fSmrg    uint32_t sec_surf_addr;
349209ff23fSmrg    uint32_t pitch;
350209ff23fSmrg    uint32_t x_offset;
351209ff23fSmrg    uint32_t y_offset;
352209ff23fSmrg    uint32_t x_start;
353209ff23fSmrg    uint32_t y_start;
354209ff23fSmrg    uint32_t x_end;
355209ff23fSmrg    uint32_t y_end;
356209ff23fSmrg
357b7e1c893Smrg    uint32_t desktop_height;
358209ff23fSmrg    uint32_t viewport_start;
359209ff23fSmrg    uint32_t viewport_size;
360b7e1c893Smrg    uint32_t mode_data_format;
361209ff23fSmrg};
362209ff23fSmrg
363209ff23fSmrgstruct avivo_state
364209ff23fSmrg{
365209ff23fSmrg    uint32_t hdp_fb_location;
366209ff23fSmrg    uint32_t mc_memory_map;
367209ff23fSmrg    uint32_t vga_memory_base;
368209ff23fSmrg    uint32_t vga_fb_start;
369209ff23fSmrg
370209ff23fSmrg    uint32_t vga1_cntl;
371209ff23fSmrg    uint32_t vga2_cntl;
372ad43ddacSmrg    uint32_t vga_render_control;
373209ff23fSmrg
374209ff23fSmrg    uint32_t crtc_master_en;
375209ff23fSmrg    uint32_t crtc_tv_control;
376b7e1c893Smrg    uint32_t dc_lb_memory_split;
377209ff23fSmrg
378209ff23fSmrg    struct avivo_pll_state pll1;
379209ff23fSmrg    struct avivo_pll_state pll2;
380209ff23fSmrg
381b7e1c893Smrg    struct avivo_pll_state vga25_ppll;
382b7e1c893Smrg    struct avivo_pll_state vga28_ppll;
383b7e1c893Smrg    struct avivo_pll_state vga41_ppll;
384b7e1c893Smrg
385209ff23fSmrg    struct avivo_crtc_state crtc1;
386209ff23fSmrg    struct avivo_crtc_state crtc2;
387209ff23fSmrg
388209ff23fSmrg    struct avivo_grph_state grph1;
389209ff23fSmrg    struct avivo_grph_state grph2;
390209ff23fSmrg
391209ff23fSmrg    /* DDIA block on RS6xx chips */
392209ff23fSmrg    uint32_t ddia[37];
393209ff23fSmrg
394209ff23fSmrg    /* scalers */
395209ff23fSmrg    uint32_t d1scl[40];
396209ff23fSmrg    uint32_t d2scl[40];
397209ff23fSmrg    uint32_t dxscl[6+2];
398209ff23fSmrg
399209ff23fSmrg    /* dac regs */
400209ff23fSmrg    uint32_t daca[26];
401209ff23fSmrg    uint32_t dacb[26];
402209ff23fSmrg
403209ff23fSmrg    /* tmdsa */
404209ff23fSmrg    uint32_t tmdsa[31];
405209ff23fSmrg
406209ff23fSmrg    /* lvtma */
407209ff23fSmrg    uint32_t lvtma[39];
408209ff23fSmrg
409209ff23fSmrg    /* dvoa */
410209ff23fSmrg    uint32_t dvoa[16];
411209ff23fSmrg
412b7e1c893Smrg    /* DCE3+ chips */
413209ff23fSmrg    uint32_t fmt1[18];
414209ff23fSmrg    uint32_t fmt2[18];
415209ff23fSmrg    uint32_t dig1[19];
416209ff23fSmrg    uint32_t dig2[19];
417209ff23fSmrg    uint32_t hdmi1[57];
418209ff23fSmrg    uint32_t hdmi2[57];
419209ff23fSmrg    uint32_t aux_cntl1[14];
420209ff23fSmrg    uint32_t aux_cntl2[14];
421209ff23fSmrg    uint32_t aux_cntl3[14];
422209ff23fSmrg    uint32_t aux_cntl4[14];
423b7e1c893Smrg    uint32_t aux_cntl5[14];
424b7e1c893Smrg    uint32_t aux_cntl6[14];
425209ff23fSmrg    uint32_t phy[10];
426209ff23fSmrg    uint32_t uniphy1[8];
427209ff23fSmrg    uint32_t uniphy2[8];
428b7e1c893Smrg    uint32_t uniphy3[8];
429b7e1c893Smrg    uint32_t uniphy4[8];
430b7e1c893Smrg    uint32_t uniphy5[8];
431b7e1c893Smrg    uint32_t uniphy6[8];
432209ff23fSmrg
433209ff23fSmrg};
434209ff23fSmrg
435209ff23fSmrg/*
436209ff23fSmrg * Maximum length of horizontal/vertical code timing tables for state storage
437209ff23fSmrg */
438209ff23fSmrg#define MAX_H_CODE_TIMING_LEN 32
439209ff23fSmrg#define MAX_V_CODE_TIMING_LEN 32
440209ff23fSmrg
441209ff23fSmrgtypedef struct {
442209ff23fSmrg    struct avivo_state avivo;
443209ff23fSmrg
444209ff23fSmrg				/* Common registers */
445209ff23fSmrg    uint32_t          ovr_clr;
446209ff23fSmrg    uint32_t          ovr_wid_left_right;
447209ff23fSmrg    uint32_t          ovr_wid_top_bottom;
448209ff23fSmrg    uint32_t          ov0_scale_cntl;
449209ff23fSmrg    uint32_t          mpp_tb_config;
450209ff23fSmrg    uint32_t          mpp_gp_config;
451209ff23fSmrg    uint32_t          subpic_cntl;
452209ff23fSmrg    uint32_t          viph_control;
453209ff23fSmrg    uint32_t          i2c_cntl_1;
454209ff23fSmrg    uint32_t          gen_int_cntl;
455209ff23fSmrg    uint32_t          cap0_trig_cntl;
456209ff23fSmrg    uint32_t          cap1_trig_cntl;
457209ff23fSmrg    uint32_t          bus_cntl;
458209ff23fSmrg
459209ff23fSmrg    uint32_t          bios_0_scratch;
460209ff23fSmrg    uint32_t          bios_1_scratch;
461209ff23fSmrg    uint32_t          bios_2_scratch;
462209ff23fSmrg    uint32_t          bios_3_scratch;
463209ff23fSmrg    uint32_t          bios_4_scratch;
464209ff23fSmrg    uint32_t          bios_5_scratch;
465209ff23fSmrg    uint32_t          bios_6_scratch;
466209ff23fSmrg    uint32_t          bios_7_scratch;
467209ff23fSmrg
468209ff23fSmrg    uint32_t          surface_cntl;
469209ff23fSmrg    uint32_t          surfaces[8][3];
470209ff23fSmrg    uint32_t          mc_agp_location;
471209ff23fSmrg    uint32_t          mc_agp_location_hi;
472209ff23fSmrg    uint32_t          mc_fb_location;
473209ff23fSmrg    uint32_t          display_base_addr;
474209ff23fSmrg    uint32_t          display2_base_addr;
475209ff23fSmrg    uint32_t          ov0_base_addr;
476209ff23fSmrg
477209ff23fSmrg				/* Other registers to save for VT switches */
478209ff23fSmrg    uint32_t          dp_datatype;
479209ff23fSmrg    uint32_t          rbbm_soft_reset;
480209ff23fSmrg    uint32_t          clock_cntl_index;
481209ff23fSmrg    uint32_t          amcgpio_en_reg;
482209ff23fSmrg    uint32_t          amcgpio_mask;
483209ff23fSmrg
484209ff23fSmrg				/* CRTC registers */
485209ff23fSmrg    uint32_t          crtc_gen_cntl;
486209ff23fSmrg    uint32_t          crtc_ext_cntl;
487209ff23fSmrg    uint32_t          dac_cntl;
488209ff23fSmrg    uint32_t          crtc_h_total_disp;
489209ff23fSmrg    uint32_t          crtc_h_sync_strt_wid;
490209ff23fSmrg    uint32_t          crtc_v_total_disp;
491209ff23fSmrg    uint32_t          crtc_v_sync_strt_wid;
492209ff23fSmrg    uint32_t          crtc_offset;
493209ff23fSmrg    uint32_t          crtc_offset_cntl;
494209ff23fSmrg    uint32_t          crtc_pitch;
495209ff23fSmrg    uint32_t          disp_merge_cntl;
496209ff23fSmrg    uint32_t          grph_buffer_cntl;
497209ff23fSmrg    uint32_t          crtc_more_cntl;
498209ff23fSmrg    uint32_t          crtc_tile_x0_y0;
499209ff23fSmrg
500209ff23fSmrg				/* CRTC2 registers */
501209ff23fSmrg    uint32_t          crtc2_gen_cntl;
502209ff23fSmrg    uint32_t          dac_macro_cntl;
503209ff23fSmrg    uint32_t          dac2_cntl;
504209ff23fSmrg    uint32_t          disp_output_cntl;
505209ff23fSmrg    uint32_t          disp_tv_out_cntl;
506209ff23fSmrg    uint32_t          disp_hw_debug;
507209ff23fSmrg    uint32_t          disp2_merge_cntl;
508209ff23fSmrg    uint32_t          grph2_buffer_cntl;
509209ff23fSmrg    uint32_t          crtc2_h_total_disp;
510209ff23fSmrg    uint32_t          crtc2_h_sync_strt_wid;
511209ff23fSmrg    uint32_t          crtc2_v_total_disp;
512209ff23fSmrg    uint32_t          crtc2_v_sync_strt_wid;
513209ff23fSmrg    uint32_t          crtc2_offset;
514209ff23fSmrg    uint32_t          crtc2_offset_cntl;
515209ff23fSmrg    uint32_t          crtc2_pitch;
516209ff23fSmrg    uint32_t          crtc2_tile_x0_y0;
517209ff23fSmrg
518209ff23fSmrg				/* Flat panel registers */
519209ff23fSmrg    uint32_t          fp_crtc_h_total_disp;
520209ff23fSmrg    uint32_t          fp_crtc_v_total_disp;
521209ff23fSmrg    uint32_t          fp_gen_cntl;
522209ff23fSmrg    uint32_t          fp2_gen_cntl;
523209ff23fSmrg    uint32_t          fp_h_sync_strt_wid;
524209ff23fSmrg    uint32_t          fp_h2_sync_strt_wid;
525209ff23fSmrg    uint32_t          fp_horz_stretch;
526209ff23fSmrg    uint32_t          fp_horz_vert_active;
527209ff23fSmrg    uint32_t          fp_panel_cntl;
528209ff23fSmrg    uint32_t          fp_v_sync_strt_wid;
529209ff23fSmrg    uint32_t          fp_v2_sync_strt_wid;
530209ff23fSmrg    uint32_t          fp_vert_stretch;
531209ff23fSmrg    uint32_t          lvds_gen_cntl;
532209ff23fSmrg    uint32_t          lvds_pll_cntl;
533209ff23fSmrg    uint32_t          tmds_pll_cntl;
534209ff23fSmrg    uint32_t          tmds_transmitter_cntl;
535209ff23fSmrg
536209ff23fSmrg				/* Computed values for PLL */
537209ff23fSmrg    uint32_t          dot_clock_freq;
538209ff23fSmrg    uint32_t          pll_output_freq;
539209ff23fSmrg    int               feedback_div;
540209ff23fSmrg    int               reference_div;
541209ff23fSmrg    int               post_div;
542209ff23fSmrg
543209ff23fSmrg				/* PLL registers */
544209ff23fSmrg    unsigned          ppll_ref_div;
545209ff23fSmrg    unsigned          ppll_div_3;
546209ff23fSmrg    uint32_t          htotal_cntl;
547209ff23fSmrg    uint32_t          vclk_ecp_cntl;
548209ff23fSmrg
549209ff23fSmrg				/* Computed values for PLL2 */
550209ff23fSmrg    uint32_t          dot_clock_freq_2;
551209ff23fSmrg    uint32_t          pll_output_freq_2;
552209ff23fSmrg    int               feedback_div_2;
553209ff23fSmrg    int               reference_div_2;
554209ff23fSmrg    int               post_div_2;
555209ff23fSmrg
556209ff23fSmrg				/* PLL2 registers */
557209ff23fSmrg    uint32_t          p2pll_ref_div;
558209ff23fSmrg    uint32_t          p2pll_div_0;
559209ff23fSmrg    uint32_t          htotal_cntl2;
560209ff23fSmrg    uint32_t          pixclks_cntl;
561209ff23fSmrg
562209ff23fSmrg				/* Pallet */
563209ff23fSmrg    Bool              palette_valid;
564209ff23fSmrg    uint32_t          palette[256];
565209ff23fSmrg    uint32_t          palette2[256];
566209ff23fSmrg
567209ff23fSmrg    uint32_t          disp2_req_cntl1;
568209ff23fSmrg    uint32_t          disp2_req_cntl2;
569209ff23fSmrg    uint32_t          dmif_mem_cntl1;
570209ff23fSmrg    uint32_t          disp1_req_cntl1;
571209ff23fSmrg
572209ff23fSmrg    uint32_t          fp_2nd_gen_cntl;
573209ff23fSmrg    uint32_t          fp2_2_gen_cntl;
574209ff23fSmrg    uint32_t          tmds2_cntl;
575209ff23fSmrg    uint32_t          tmds2_transmitter_cntl;
576209ff23fSmrg
577209ff23fSmrg
578209ff23fSmrg    /* TV out registers */
579209ff23fSmrg    uint32_t 	      tv_master_cntl;
580209ff23fSmrg    uint32_t 	      tv_htotal;
581209ff23fSmrg    uint32_t 	      tv_hsize;
582209ff23fSmrg    uint32_t 	      tv_hdisp;
583209ff23fSmrg    uint32_t 	      tv_hstart;
584209ff23fSmrg    uint32_t 	      tv_vtotal;
585209ff23fSmrg    uint32_t 	      tv_vdisp;
586209ff23fSmrg    uint32_t 	      tv_timing_cntl;
587209ff23fSmrg    uint32_t 	      tv_vscaler_cntl1;
588209ff23fSmrg    uint32_t 	      tv_vscaler_cntl2;
589209ff23fSmrg    uint32_t 	      tv_sync_size;
590209ff23fSmrg    uint32_t 	      tv_vrestart;
591209ff23fSmrg    uint32_t 	      tv_hrestart;
592209ff23fSmrg    uint32_t 	      tv_frestart;
593209ff23fSmrg    uint32_t 	      tv_ftotal;
594209ff23fSmrg    uint32_t 	      tv_clock_sel_cntl;
595209ff23fSmrg    uint32_t 	      tv_clkout_cntl;
596209ff23fSmrg    uint32_t 	      tv_data_delay_a;
597209ff23fSmrg    uint32_t 	      tv_data_delay_b;
598209ff23fSmrg    uint32_t 	      tv_dac_cntl;
599209ff23fSmrg    uint32_t 	      tv_pll_cntl;
600209ff23fSmrg    uint32_t 	      tv_pll_cntl1;
601209ff23fSmrg    uint32_t	      tv_pll_fine_cntl;
602209ff23fSmrg    uint32_t 	      tv_modulator_cntl1;
603209ff23fSmrg    uint32_t 	      tv_modulator_cntl2;
604209ff23fSmrg    uint32_t 	      tv_frame_lock_cntl;
605209ff23fSmrg    uint32_t 	      tv_pre_dac_mux_cntl;
606209ff23fSmrg    uint32_t 	      tv_rgb_cntl;
607209ff23fSmrg    uint32_t 	      tv_y_saw_tooth_cntl;
608209ff23fSmrg    uint32_t 	      tv_y_rise_cntl;
609209ff23fSmrg    uint32_t 	      tv_y_fall_cntl;
610209ff23fSmrg    uint32_t 	      tv_uv_adr;
611209ff23fSmrg    uint32_t	      tv_upsamp_and_gain_cntl;
612209ff23fSmrg    uint32_t	      tv_gain_limit_settings;
613209ff23fSmrg    uint32_t	      tv_linear_gain_settings;
614209ff23fSmrg    uint32_t	      tv_crc_cntl;
615209ff23fSmrg    uint32_t          tv_sync_cntl;
616209ff23fSmrg    uint32_t	      gpiopad_a;
617209ff23fSmrg    uint32_t          pll_test_cntl;
618209ff23fSmrg
619209ff23fSmrg    uint16_t          h_code_timing[MAX_H_CODE_TIMING_LEN];
620209ff23fSmrg    uint16_t          v_code_timing[MAX_V_CODE_TIMING_LEN];
621209ff23fSmrg
622209ff23fSmrg} RADEONSaveRec, *RADEONSavePtr;
623209ff23fSmrg
624209ff23fSmrgtypedef struct
625209ff23fSmrg{
626209ff23fSmrg    Bool HasSecondary;
627209ff23fSmrg    Bool              HasCRTC2;         /* All cards except original Radeon  */
628209ff23fSmrg    /*
629209ff23fSmrg     * The next two are used to make sure CRTC2 is restored before CRTC_EXT,
630209ff23fSmrg     * otherwise it could lead to blank screens.
631209ff23fSmrg     */
632209ff23fSmrg    Bool IsSecondaryRestored;
633209ff23fSmrg    Bool RestorePrimary;
634209ff23fSmrg
635209ff23fSmrg    Bool ReversedDAC;	  /* TVDAC used as primary dac */
636209ff23fSmrg    Bool ReversedTMDS;    /* DDC_DVI is used for external TMDS */
637209ff23fSmrg    xf86CrtcPtr pCrtc[RADEON_MAX_CRTC];
638209ff23fSmrg    RADEONCrtcPrivatePtr Controller[RADEON_MAX_CRTC];
639209ff23fSmrg
640209ff23fSmrg    ScrnInfoPtr pSecondaryScrn;
641209ff23fSmrg    ScrnInfoPtr pPrimaryScrn;
642209ff23fSmrg
643209ff23fSmrg    RADEONSaveRec     ModeReg;          /* Current mode                      */
644209ff23fSmrg    RADEONSaveRec     SavedReg;         /* Original (text) mode              */
645209ff23fSmrg
646209ff23fSmrg    void              *MMIO;            /* Map of MMIO region                */
6472f39173dSmrg    int               MMIO_cnt;         /* Map of FB region refcount         */
6482f39173dSmrg    void              *FB;              /* Map of FB region                  */
6492f39173dSmrg    int               FB_cnt;           /* Map of FB region refcount         */
650ad43ddacSmrg    int fd;                             /* for sharing across zaphod heads   */
651209ff23fSmrg} RADEONEntRec, *RADEONEntPtr;
652209ff23fSmrg
653209ff23fSmrg/* radeon_probe.c */
654209ff23fSmrgextern PciChipsets          RADEONPciChipsets[];
655209ff23fSmrg
656209ff23fSmrg/* radeon_driver.c */
657209ff23fSmrgextern Bool                 RADEONPreInit(ScrnInfoPtr, int);
658209ff23fSmrgextern Bool                 RADEONScreenInit(int, ScreenPtr, int, char **);
659209ff23fSmrgextern Bool                 RADEONSwitchMode(int, DisplayModePtr, int);
660209ff23fSmrg#ifdef X_XF86MiscPassMessage
661209ff23fSmrgextern Bool                 RADEONHandleMessage(int, const char*, const char*,
662209ff23fSmrg					        char**);
663209ff23fSmrg#endif
664209ff23fSmrgextern void                 RADEONAdjustFrame(int, int, int, int);
665209ff23fSmrgextern Bool                 RADEONEnterVT(int, int);
666209ff23fSmrgextern void                 RADEONLeaveVT(int, int);
667209ff23fSmrgextern void                 RADEONFreeScreen(int, int);
668209ff23fSmrgextern ModeStatus           RADEONValidMode(int, DisplayModePtr, Bool, int);
669209ff23fSmrg
670209ff23fSmrgextern const OptionInfoRec *RADEONOptionsWeak(void);
671209ff23fSmrg
672ad43ddacSmrg#ifdef XF86DRM_MODE
673ad43ddacSmrgextern Bool                 RADEONPreInit_KMS(ScrnInfoPtr, int);
674ad43ddacSmrgextern Bool                 RADEONScreenInit_KMS(int, ScreenPtr, int, char **);
675ad43ddacSmrgextern Bool                 RADEONSwitchMode_KMS(int, DisplayModePtr, int);
676ad43ddacSmrgextern void                 RADEONAdjustFrame_KMS(int, int, int, int);
677ad43ddacSmrgextern Bool                 RADEONEnterVT_KMS(int, int);
678ad43ddacSmrgextern void                 RADEONLeaveVT_KMS(int, int);
679ad43ddacSmrgextern void RADEONFreeScreen_KMS(int scrnIndex, int flags);
680ad43ddacSmrg#endif
681ad43ddacSmrg
682209ff23fSmrg#endif /* _RADEON_PROBE_H_ */
683