radeon_probe.h revision 40732134
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
5840732134Srjstypedef enum {
5940732134Srjs    CHIP_FAMILY_UNKNOW,
6040732134Srjs    CHIP_FAMILY_LEGACY,
6140732134Srjs    CHIP_FAMILY_RADEON,
6240732134Srjs    CHIP_FAMILY_RV100,
6340732134Srjs    CHIP_FAMILY_RS100,    /* U1 (IGP320M) or A3 (IGP320)*/
6440732134Srjs    CHIP_FAMILY_RV200,
6540732134Srjs    CHIP_FAMILY_RS200,    /* U2 (IGP330M/340M/350M) or A4 (IGP330/340/345/350), RS250 (IGP 7000) */
6640732134Srjs    CHIP_FAMILY_R200,
6740732134Srjs    CHIP_FAMILY_RV250,
6840732134Srjs    CHIP_FAMILY_RS300,    /* RS300/RS350 */
6940732134Srjs    CHIP_FAMILY_RV280,
7040732134Srjs    CHIP_FAMILY_R300,
7140732134Srjs    CHIP_FAMILY_R350,
7240732134Srjs    CHIP_FAMILY_RV350,
7340732134Srjs    CHIP_FAMILY_RV380,    /* RV370/RV380/M22/M24 */
7440732134Srjs    CHIP_FAMILY_R420,     /* R420/R423/M18 */
7540732134Srjs    CHIP_FAMILY_RV410,    /* RV410, M26 */
7640732134Srjs    CHIP_FAMILY_RS400,    /* xpress 200, 200m (RS400) Intel */
7740732134Srjs    CHIP_FAMILY_RS480,    /* xpress 200, 200m (RS410/480/482/485) AMD */
7840732134Srjs    CHIP_FAMILY_RV515,    /* rv515 */
7940732134Srjs    CHIP_FAMILY_R520,    /* r520 */
8040732134Srjs    CHIP_FAMILY_RV530,    /* rv530 */
8140732134Srjs    CHIP_FAMILY_R580,    /* r580 */
8240732134Srjs    CHIP_FAMILY_RV560,   /* rv560 */
8340732134Srjs    CHIP_FAMILY_RV570,   /* rv570 */
8440732134Srjs    CHIP_FAMILY_RS600,
8540732134Srjs    CHIP_FAMILY_RS690,
8640732134Srjs    CHIP_FAMILY_RS740,
8740732134Srjs    CHIP_FAMILY_R600,    /* r600 */
8840732134Srjs    CHIP_FAMILY_RV610,
8940732134Srjs    CHIP_FAMILY_RV630,
9040732134Srjs    CHIP_FAMILY_RV670,
9140732134Srjs    CHIP_FAMILY_RV620,
9240732134Srjs    CHIP_FAMILY_RV635,
9340732134Srjs    CHIP_FAMILY_RS780,
9440732134Srjs    CHIP_FAMILY_RS880,
9540732134Srjs    CHIP_FAMILY_RV770,   /* r700 */
9640732134Srjs    CHIP_FAMILY_RV730,
9740732134Srjs    CHIP_FAMILY_RV710,
9840732134Srjs    CHIP_FAMILY_RV740,
9940732134Srjs    CHIP_FAMILY_CEDAR,   /* evergreen */
10040732134Srjs    CHIP_FAMILY_REDWOOD,
10140732134Srjs    CHIP_FAMILY_JUNIPER,
10240732134Srjs    CHIP_FAMILY_CYPRESS,
10340732134Srjs    CHIP_FAMILY_HEMLOCK,
10440732134Srjs    CHIP_FAMILY_PALM,
10540732134Srjs    CHIP_FAMILY_SUMO,
10640732134Srjs    CHIP_FAMILY_SUMO2,
10740732134Srjs    CHIP_FAMILY_BARTS,
10840732134Srjs    CHIP_FAMILY_TURKS,
10940732134Srjs    CHIP_FAMILY_CAICOS,
11040732134Srjs    CHIP_FAMILY_CAYMAN,
11140732134Srjs    CHIP_FAMILY_ARUBA,
11240732134Srjs    CHIP_FAMILY_LAST
11340732134Srjs} RADEONChipFamily;
11440732134Srjs
11540732134Srjstypedef struct {
11640732134Srjs    uint32_t pci_device_id;
11740732134Srjs    RADEONChipFamily chip_family;
11840732134Srjs    int mobility;
11940732134Srjs    int igp;
12040732134Srjs    int nocrtc2;
12140732134Srjs    int nointtvout;
12240732134Srjs    int singledac;
12340732134Srjs} RADEONCardInfo;
12440732134Srjs
125209ff23fSmrgtypedef enum
126209ff23fSmrg{
127209ff23fSmrg    MT_UNKNOWN = -1,
128209ff23fSmrg    MT_NONE    = 0,
129209ff23fSmrg    MT_CRT     = 1,
130209ff23fSmrg    MT_LCD     = 2,
131209ff23fSmrg    MT_DFP     = 3,
132209ff23fSmrg    MT_CTV     = 4,
133209ff23fSmrg    MT_STV     = 5,
134209ff23fSmrg    MT_CV      = 6,
135209ff23fSmrg    MT_HDMI    = 7, // this should really just be MT_DFP
136209ff23fSmrg    MT_DP      = 8
137209ff23fSmrg} RADEONMonitorType;
138209ff23fSmrg
139209ff23fSmrgtypedef enum
140209ff23fSmrg{
141209ff23fSmrg    CONNECTOR_NONE,
142209ff23fSmrg    CONNECTOR_VGA,
143209ff23fSmrg    CONNECTOR_DVI_I,
144209ff23fSmrg    CONNECTOR_DVI_D,
145209ff23fSmrg    CONNECTOR_DVI_A,
146209ff23fSmrg    CONNECTOR_STV,
147209ff23fSmrg    CONNECTOR_CTV,
148209ff23fSmrg    CONNECTOR_LVDS,
149209ff23fSmrg    CONNECTOR_DIGITAL,
150209ff23fSmrg    CONNECTOR_SCART,
151209ff23fSmrg    CONNECTOR_HDMI_TYPE_A,
152209ff23fSmrg    CONNECTOR_HDMI_TYPE_B,
153209ff23fSmrg    CONNECTOR_0XC,
154209ff23fSmrg    CONNECTOR_0XD,
155209ff23fSmrg    CONNECTOR_DIN,
156209ff23fSmrg    CONNECTOR_DISPLAY_PORT,
157ad43ddacSmrg    CONNECTOR_EDP,
158209ff23fSmrg    CONNECTOR_UNSUPPORTED
159209ff23fSmrg} RADEONConnectorType;
160209ff23fSmrg
161209ff23fSmrgtypedef enum
162209ff23fSmrg{
163209ff23fSmrg    DVI_AUTO,
164209ff23fSmrg    DVI_DIGITAL,
165209ff23fSmrg    DVI_ANALOG
166209ff23fSmrg} RADEONDviType;
167209ff23fSmrg
168209ff23fSmrgtypedef enum
169209ff23fSmrg{
170209ff23fSmrg    RMX_OFF,
171209ff23fSmrg    RMX_FULL,
172b7e1c893Smrg    RMX_CENTER,
173b7e1c893Smrg    RMX_ASPECT
174209ff23fSmrg} RADEONRMXType;
175209ff23fSmrg
176209ff23fSmrgtypedef struct {
177209ff23fSmrg    uint32_t freq;
178209ff23fSmrg    uint32_t value;
179209ff23fSmrg}RADEONTMDSPll;
180209ff23fSmrg
181209ff23fSmrg/* standards */
182209ff23fSmrgtypedef enum
183209ff23fSmrg{
184209ff23fSmrg    TV_STD_NTSC      = 1,
185209ff23fSmrg    TV_STD_PAL       = 2,
186209ff23fSmrg    TV_STD_PAL_M     = 4,
187209ff23fSmrg    TV_STD_PAL_60    = 8,
188209ff23fSmrg    TV_STD_NTSC_J    = 16,
189209ff23fSmrg    TV_STD_SCART_PAL = 32,
190209ff23fSmrg    TV_STD_SECAM     = 64,
191209ff23fSmrg    TV_STD_PAL_CN    = 128,
192209ff23fSmrg} TVStd;
193209ff23fSmrg
194209ff23fSmrgtypedef struct
195209ff23fSmrg{
196209ff23fSmrg    Bool   valid;
197209ff23fSmrg    uint32_t mask_clk_reg;
198209ff23fSmrg    uint32_t mask_data_reg;
199b7e1c893Smrg    uint32_t a_clk_reg;
200b7e1c893Smrg    uint32_t a_data_reg;
201209ff23fSmrg    uint32_t put_clk_reg;
202209ff23fSmrg    uint32_t put_data_reg;
203209ff23fSmrg    uint32_t get_clk_reg;
204209ff23fSmrg    uint32_t get_data_reg;
205209ff23fSmrg    uint32_t mask_clk_mask;
206209ff23fSmrg    uint32_t mask_data_mask;
207209ff23fSmrg    uint32_t put_clk_mask;
208209ff23fSmrg    uint32_t put_data_mask;
209209ff23fSmrg    uint32_t get_clk_mask;
210209ff23fSmrg    uint32_t get_data_mask;
211b7e1c893Smrg    uint32_t a_clk_mask;
212b7e1c893Smrg    uint32_t a_data_mask;
213b7e1c893Smrg    int hw_line;
214b7e1c893Smrg    Bool hw_capable;
215209ff23fSmrg} RADEONI2CBusRec, *RADEONI2CBusPtr;
216209ff23fSmrg
2172f39173dSmrgenum radeon_pll_algo {
2182f39173dSmrg    RADEON_PLL_OLD,
2192f39173dSmrg    RADEON_PLL_NEW
2202f39173dSmrg};
2212f39173dSmrg
222209ff23fSmrgtypedef struct _RADEONCrtcPrivateRec {
223b7e1c893Smrg    void *crtc_rotate_mem;
224b7e1c893Smrg    void *cursor_mem;
225209ff23fSmrg    int crtc_id;
226209ff23fSmrg    int binding;
227209ff23fSmrg    uint32_t cursor_offset;
228209ff23fSmrg    /* Lookup table values to be set when the CRTC is enabled */
229b7e1c893Smrg    uint16_t lut_r[256], lut_g[256], lut_b[256];
230209ff23fSmrg
231209ff23fSmrg    uint32_t crtc_offset;
232209ff23fSmrg    int can_tile;
233209ff23fSmrg    Bool enabled;
234b7e1c893Smrg    Bool initialized;
235ad43ddacSmrg    Bool scaler_enabled;
236ad43ddacSmrg    float vsc;
237ad43ddacSmrg    float hsc;
238ad43ddacSmrg    int pll_id;
2392f39173dSmrg    enum radeon_pll_algo     pll_algo;
240209ff23fSmrg} RADEONCrtcPrivateRec, *RADEONCrtcPrivatePtr;
241209ff23fSmrg
242b7e1c893Smrgtypedef struct _radeon_encoder {
243b7e1c893Smrg    uint16_t encoder_id;
244209ff23fSmrg    int devices;
245209ff23fSmrg    void *dev_priv;
246b7e1c893Smrg} radeon_encoder_rec, *radeon_encoder_ptr;
247b7e1c893Smrg
248b7e1c893Smrgtypedef struct _radeon_tvout {
249b7e1c893Smrg    /* TV out */
250b7e1c893Smrg    TVStd             default_tvStd;
251b7e1c893Smrg    TVStd             tvStd;
252b7e1c893Smrg    int               hPos;
253b7e1c893Smrg    int               vPos;
254b7e1c893Smrg    int               hSize;
255b7e1c893Smrg    float             TVRefClk;
256b7e1c893Smrg    int               SupportedTVStds;
257b7e1c893Smrg    Bool              tv_on;
258b7e1c893Smrg} radeon_tvout_rec, *radeon_tvout_ptr;
259b7e1c893Smrg
260b7e1c893Smrgtypedef struct _radeon_native_mode {
261209ff23fSmrg    /* panel stuff */
262209ff23fSmrg    int               PanelXRes;
263209ff23fSmrg    int               PanelYRes;
264209ff23fSmrg    int               HOverPlus;
265209ff23fSmrg    int               HSyncWidth;
266209ff23fSmrg    int               HBlank;
267209ff23fSmrg    int               VOverPlus;
268209ff23fSmrg    int               VSyncWidth;
269209ff23fSmrg    int               VBlank;
270b7e1c893Smrg    int               Flags;
271209ff23fSmrg    int               DotClock;
272b7e1c893Smrg} radeon_native_mode_rec, *radeon_native_mode_ptr;
273b7e1c893Smrg
274b7e1c893Smrgtypedef struct _radeon_tvdac {
275b7e1c893Smrg    // tv dac
276b7e1c893Smrg    uint32_t          ps2_tvdac_adj;
277b7e1c893Smrg    uint32_t          pal_tvdac_adj;
278b7e1c893Smrg    uint32_t          ntsc_tvdac_adj;
279b7e1c893Smrg} radeon_tvdac_rec, *radeon_tvdac_ptr;
280b7e1c893Smrg
281b7e1c893Smrgtypedef struct _radeon_tmds {
282b7e1c893Smrg    // tmds
283209ff23fSmrg    RADEONTMDSPll     tmds_pll[4];
284b7e1c893Smrg} radeon_tmds_rec, *radeon_tmds_ptr;
285b7e1c893Smrg
286b7e1c893Smrgtypedef struct _radeon_lvds {
287b7e1c893Smrg    // panel mode
288b7e1c893Smrg    radeon_native_mode_rec native_mode;
289b7e1c893Smrg    // lvds
290b7e1c893Smrg    int               PanelPwrDly;
291b7e1c893Smrg    int               lvds_misc;
292b7e1c893Smrg    int               lvds_ss_id;
293b7e1c893Smrg} radeon_lvds_rec, *radeon_lvds_ptr;
294b7e1c893Smrg
295b7e1c893Smrgtypedef struct _radeon_dvo {
296209ff23fSmrg    /* dvo */
297c503f109Smrg    I2CBusPtr         pI2CBus;
298209ff23fSmrg    I2CDevPtr         DVOChip;
299209ff23fSmrg    RADEONI2CBusRec   dvo_i2c;
300209ff23fSmrg    int               dvo_i2c_slave_addr;
301209ff23fSmrg    Bool              dvo_duallink;
302b7e1c893Smrg} radeon_dvo_rec, *radeon_dvo_ptr;
303b7e1c893Smrg
304b7e1c893Smrgtypedef struct {
305b7e1c893Smrg    RADEONConnectorType ConnectorType;
306b7e1c893Smrg    Bool valid;
307b7e1c893Smrg    int output_id;
308b7e1c893Smrg    int devices;
309b7e1c893Smrg    int hpd_mask;
310b7e1c893Smrg    RADEONI2CBusRec ddc_i2c;
311209ff23fSmrg    int igp_lane_info;
312b7e1c893Smrg    Bool shared_ddc;
313b7e1c893Smrg    int i2c_line_mux;
314b7e1c893Smrg    Bool load_detection;
315b7e1c893Smrg    Bool linkb;
316b7e1c893Smrg    uint16_t connector_object;
317ad43ddacSmrg    uint16_t connector_object_id;
318ad43ddacSmrg    uint8_t ucI2cId;
319ad43ddacSmrg    uint8_t hpd_id;
320b7e1c893Smrg} RADEONBIOSConnector;
321209ff23fSmrg
322b7e1c893Smrgtypedef struct _RADEONOutputPrivateRec {
323b7e1c893Smrg    uint16_t connector_id;
324b7e1c893Smrg    uint32_t devices;
325b7e1c893Smrg    uint32_t active_device;
326209ff23fSmrg    Bool enabled;
327b7e1c893Smrg
328b7e1c893Smrg    int  load_detection;
329b7e1c893Smrg
330b7e1c893Smrg    // DVI/HDMI
331b7e1c893Smrg    Bool coherent_mode;
332b7e1c893Smrg    Bool linkb;
333b7e1c893Smrg
334b7e1c893Smrg    RADEONConnectorType ConnectorType;
335ad43ddacSmrg    uint16_t connector_object_id;
336b7e1c893Smrg    RADEONDviType DVIType;
337b7e1c893Smrg    RADEONMonitorType MonType;
338b7e1c893Smrg
339b7e1c893Smrg    // DDC info
340b7e1c893Smrg    I2CBusPtr         pI2CBus;
341b7e1c893Smrg    RADEONI2CBusRec   ddc_i2c;
342b7e1c893Smrg    Bool shared_ddc;
343ad43ddacSmrg
344ad43ddacSmrg    Bool custom_edid;
345ad43ddacSmrg    xf86MonPtr custom_mon;
346b7e1c893Smrg    // router info
347b7e1c893Smrg    // HDP info
348b7e1c893Smrg
349b7e1c893Smrg    // panel mode
350b7e1c893Smrg    radeon_native_mode_rec native_mode;
351b7e1c893Smrg
352b7e1c893Smrg    // RMX
353b7e1c893Smrg    RADEONRMXType     rmx_type;
354b7e1c893Smrg    int               Flags;
355b7e1c893Smrg
356b7e1c893Smrg    //tvout - move to encoder
357b7e1c893Smrg    radeon_tvout_rec tvout;
358b7e1c893Smrg
359b7e1c893Smrg    /* dce 3.x dig block */
360b7e1c893Smrg    int igp_lane_info;
361ad43ddacSmrg    int dig_encoder;
362b7e1c893Smrg
363b7e1c893Smrg    int pixel_clock;
364ad43ddacSmrg
365ad43ddacSmrg    /* DP - aux bus*/
366ad43ddacSmrg    I2CBusPtr dp_pI2CBus;
367ad43ddacSmrg    uint8_t ucI2cId;
368ad43ddacSmrg    char dp_bus_name[20];
369ad43ddacSmrg    uint32_t dp_i2c_addr;
370ad43ddacSmrg    Bool dp_i2c_running;
371ad43ddacSmrg    /* DP - general config */
372ad43ddacSmrg    uint8_t dpcd[8];
373ad43ddacSmrg    int dp_lane_count;
374ad43ddacSmrg    int dp_clock;
375ad43ddacSmrg    uint8_t hpd_id;
376ad43ddacSmrg    int pll_id;
377209ff23fSmrg} RADEONOutputPrivateRec, *RADEONOutputPrivatePtr;
378209ff23fSmrg
379209ff23fSmrgstruct avivo_pll_state {
380209ff23fSmrg    uint32_t ref_div_src;
381209ff23fSmrg    uint32_t ref_div;
382209ff23fSmrg    uint32_t fb_div;
383209ff23fSmrg    uint32_t post_div_src;
384209ff23fSmrg    uint32_t post_div;
385209ff23fSmrg    uint32_t ext_ppll_cntl;
386209ff23fSmrg    uint32_t pll_cntl;
387209ff23fSmrg    uint32_t int_ss_cntl;
388209ff23fSmrg};
389209ff23fSmrg
390209ff23fSmrgstruct avivo_crtc_state {
391209ff23fSmrg    uint32_t pll_source;
392209ff23fSmrg    uint32_t h_total;
393209ff23fSmrg    uint32_t h_blank_start_end;
394209ff23fSmrg    uint32_t h_sync_a;
395209ff23fSmrg    uint32_t h_sync_a_cntl;
396209ff23fSmrg    uint32_t h_sync_b;
397209ff23fSmrg    uint32_t h_sync_b_cntl;
398209ff23fSmrg    uint32_t v_total;
399209ff23fSmrg    uint32_t v_blank_start_end;
400209ff23fSmrg    uint32_t v_sync_a;
401209ff23fSmrg    uint32_t v_sync_a_cntl;
402209ff23fSmrg    uint32_t v_sync_b;
403209ff23fSmrg    uint32_t v_sync_b_cntl;
404209ff23fSmrg    uint32_t control;
405209ff23fSmrg    uint32_t blank_control;
406209ff23fSmrg    uint32_t interlace_control;
407209ff23fSmrg    uint32_t stereo_control;
408209ff23fSmrg    uint32_t cursor_control;
409209ff23fSmrg};
410209ff23fSmrg
411209ff23fSmrgstruct avivo_grph_state {
412209ff23fSmrg    uint32_t enable;
413209ff23fSmrg    uint32_t control;
414921a55d8Smrg    uint32_t swap_control;
415209ff23fSmrg    uint32_t prim_surf_addr;
416209ff23fSmrg    uint32_t sec_surf_addr;
417209ff23fSmrg    uint32_t pitch;
418921a55d8Smrg    uint32_t prim_surf_addr_hi;
419921a55d8Smrg    uint32_t sec_surf_addr_hi;
420209ff23fSmrg    uint32_t x_offset;
421209ff23fSmrg    uint32_t y_offset;
422209ff23fSmrg    uint32_t x_start;
423209ff23fSmrg    uint32_t y_start;
424209ff23fSmrg    uint32_t x_end;
425209ff23fSmrg    uint32_t y_end;
426209ff23fSmrg
427b7e1c893Smrg    uint32_t desktop_height;
428209ff23fSmrg    uint32_t viewport_start;
429209ff23fSmrg    uint32_t viewport_size;
430b7e1c893Smrg    uint32_t mode_data_format;
431209ff23fSmrg};
432209ff23fSmrg
433921a55d8Smrgstruct dce4_main_block_state {
434921a55d8Smrg    struct avivo_grph_state grph;
435921a55d8Smrg    uint32_t scl[6];
436921a55d8Smrg    uint32_t crtc[15];
437921a55d8Smrg    uint32_t fmt[10];
438921a55d8Smrg    uint32_t dig[20];
439921a55d8Smrg};
440921a55d8Smrg
441921a55d8Smrgstruct dce4_state
442921a55d8Smrg{
443921a55d8Smrg
444921a55d8Smrg    uint32_t vga1_cntl;
445921a55d8Smrg    uint32_t vga2_cntl;
446921a55d8Smrg    uint32_t vga3_cntl;
447921a55d8Smrg    uint32_t vga4_cntl;
448921a55d8Smrg    uint32_t vga5_cntl;
449921a55d8Smrg    uint32_t vga6_cntl;
450921a55d8Smrg    uint32_t vga_render_control;
451921a55d8Smrg
452921a55d8Smrg    struct dce4_main_block_state block[6];
453921a55d8Smrg
454921a55d8Smrg    uint32_t vga_pll[3][3];
455921a55d8Smrg    uint32_t pll[2][15];
456921a55d8Smrg    uint32_t pll_route[6];
457921a55d8Smrg
458921a55d8Smrg    uint32_t dac[2][26];
459921a55d8Smrg    uint32_t uniphy[6][10];
460921a55d8Smrg
461921a55d8Smrg    uint32_t dig[20];
462921a55d8Smrg};
463921a55d8Smrg
464209ff23fSmrgstruct avivo_state
465209ff23fSmrg{
466209ff23fSmrg    uint32_t hdp_fb_location;
467209ff23fSmrg    uint32_t mc_memory_map;
468209ff23fSmrg    uint32_t vga_memory_base;
469209ff23fSmrg    uint32_t vga_fb_start;
470209ff23fSmrg
471209ff23fSmrg    uint32_t vga1_cntl;
472209ff23fSmrg    uint32_t vga2_cntl;
473921a55d8Smrg    uint32_t vga3_cntl;
474921a55d8Smrg    uint32_t vga4_cntl;
475921a55d8Smrg    uint32_t vga5_cntl;
476921a55d8Smrg    uint32_t vga6_cntl;
477ad43ddacSmrg    uint32_t vga_render_control;
478209ff23fSmrg
479209ff23fSmrg    uint32_t crtc_master_en;
480209ff23fSmrg    uint32_t crtc_tv_control;
481b7e1c893Smrg    uint32_t dc_lb_memory_split;
482209ff23fSmrg
483921a55d8Smrg    struct avivo_pll_state pll[2];
484209ff23fSmrg
485b7e1c893Smrg    struct avivo_pll_state vga25_ppll;
486b7e1c893Smrg    struct avivo_pll_state vga28_ppll;
487b7e1c893Smrg    struct avivo_pll_state vga41_ppll;
488b7e1c893Smrg
489921a55d8Smrg    struct avivo_crtc_state crtc[2];
490209ff23fSmrg
491921a55d8Smrg    struct avivo_grph_state grph[2];
492209ff23fSmrg
493209ff23fSmrg    /* DDIA block on RS6xx chips */
494209ff23fSmrg    uint32_t ddia[37];
495209ff23fSmrg
496209ff23fSmrg    /* scalers */
497209ff23fSmrg    uint32_t d1scl[40];
498209ff23fSmrg    uint32_t d2scl[40];
499209ff23fSmrg    uint32_t dxscl[6+2];
500209ff23fSmrg
501209ff23fSmrg    /* dac regs */
502209ff23fSmrg    uint32_t daca[26];
503209ff23fSmrg    uint32_t dacb[26];
504209ff23fSmrg
505209ff23fSmrg    /* tmdsa */
506209ff23fSmrg    uint32_t tmdsa[31];
507209ff23fSmrg
508209ff23fSmrg    /* lvtma */
509209ff23fSmrg    uint32_t lvtma[39];
510209ff23fSmrg
511209ff23fSmrg    /* dvoa */
512209ff23fSmrg    uint32_t dvoa[16];
513209ff23fSmrg
514b7e1c893Smrg    /* DCE3+ chips */
515209ff23fSmrg    uint32_t fmt1[18];
516209ff23fSmrg    uint32_t fmt2[18];
517209ff23fSmrg    uint32_t dig1[19];
518209ff23fSmrg    uint32_t dig2[19];
519209ff23fSmrg    uint32_t hdmi1[57];
520209ff23fSmrg    uint32_t hdmi2[57];
521209ff23fSmrg    uint32_t aux_cntl1[14];
522209ff23fSmrg    uint32_t aux_cntl2[14];
523209ff23fSmrg    uint32_t aux_cntl3[14];
524209ff23fSmrg    uint32_t aux_cntl4[14];
525b7e1c893Smrg    uint32_t aux_cntl5[14];
526b7e1c893Smrg    uint32_t aux_cntl6[14];
527209ff23fSmrg    uint32_t phy[10];
528209ff23fSmrg    uint32_t uniphy1[8];
529209ff23fSmrg    uint32_t uniphy2[8];
530b7e1c893Smrg    uint32_t uniphy3[8];
531b7e1c893Smrg    uint32_t uniphy4[8];
532b7e1c893Smrg    uint32_t uniphy5[8];
533b7e1c893Smrg    uint32_t uniphy6[8];
534209ff23fSmrg
535209ff23fSmrg};
536209ff23fSmrg
537209ff23fSmrg/*
538209ff23fSmrg * Maximum length of horizontal/vertical code timing tables for state storage
539209ff23fSmrg */
540209ff23fSmrg#define MAX_H_CODE_TIMING_LEN 32
541209ff23fSmrg#define MAX_V_CODE_TIMING_LEN 32
542209ff23fSmrg
543209ff23fSmrgtypedef struct {
544209ff23fSmrg    struct avivo_state avivo;
545921a55d8Smrg    struct dce4_state dce4;
546209ff23fSmrg
547209ff23fSmrg				/* Common registers */
548209ff23fSmrg    uint32_t          ovr_clr;
549209ff23fSmrg    uint32_t          ovr_wid_left_right;
550209ff23fSmrg    uint32_t          ovr_wid_top_bottom;
551209ff23fSmrg    uint32_t          ov0_scale_cntl;
552209ff23fSmrg    uint32_t          mpp_tb_config;
553209ff23fSmrg    uint32_t          mpp_gp_config;
554209ff23fSmrg    uint32_t          subpic_cntl;
555209ff23fSmrg    uint32_t          viph_control;
556209ff23fSmrg    uint32_t          i2c_cntl_1;
557209ff23fSmrg    uint32_t          gen_int_cntl;
558209ff23fSmrg    uint32_t          cap0_trig_cntl;
559209ff23fSmrg    uint32_t          cap1_trig_cntl;
560209ff23fSmrg    uint32_t          bus_cntl;
561209ff23fSmrg
562209ff23fSmrg    uint32_t          bios_0_scratch;
563209ff23fSmrg    uint32_t          bios_1_scratch;
564209ff23fSmrg    uint32_t          bios_2_scratch;
565209ff23fSmrg    uint32_t          bios_3_scratch;
566209ff23fSmrg    uint32_t          bios_4_scratch;
567209ff23fSmrg    uint32_t          bios_5_scratch;
568209ff23fSmrg    uint32_t          bios_6_scratch;
569209ff23fSmrg    uint32_t          bios_7_scratch;
570209ff23fSmrg
571209ff23fSmrg    uint32_t          surface_cntl;
572209ff23fSmrg    uint32_t          surfaces[8][3];
573209ff23fSmrg    uint32_t          mc_agp_location;
574209ff23fSmrg    uint32_t          mc_agp_location_hi;
575209ff23fSmrg    uint32_t          mc_fb_location;
576209ff23fSmrg    uint32_t          display_base_addr;
577209ff23fSmrg    uint32_t          display2_base_addr;
578209ff23fSmrg    uint32_t          ov0_base_addr;
579209ff23fSmrg
580209ff23fSmrg				/* Other registers to save for VT switches */
581209ff23fSmrg    uint32_t          dp_datatype;
582209ff23fSmrg    uint32_t          rbbm_soft_reset;
583209ff23fSmrg    uint32_t          clock_cntl_index;
584209ff23fSmrg    uint32_t          amcgpio_en_reg;
585209ff23fSmrg    uint32_t          amcgpio_mask;
586209ff23fSmrg
587209ff23fSmrg				/* CRTC registers */
588209ff23fSmrg    uint32_t          crtc_gen_cntl;
589209ff23fSmrg    uint32_t          crtc_ext_cntl;
590209ff23fSmrg    uint32_t          dac_cntl;
591209ff23fSmrg    uint32_t          crtc_h_total_disp;
592209ff23fSmrg    uint32_t          crtc_h_sync_strt_wid;
593209ff23fSmrg    uint32_t          crtc_v_total_disp;
594209ff23fSmrg    uint32_t          crtc_v_sync_strt_wid;
595209ff23fSmrg    uint32_t          crtc_offset;
596209ff23fSmrg    uint32_t          crtc_offset_cntl;
597209ff23fSmrg    uint32_t          crtc_pitch;
598209ff23fSmrg    uint32_t          disp_merge_cntl;
599209ff23fSmrg    uint32_t          grph_buffer_cntl;
600209ff23fSmrg    uint32_t          crtc_more_cntl;
601209ff23fSmrg    uint32_t          crtc_tile_x0_y0;
602209ff23fSmrg
603209ff23fSmrg				/* CRTC2 registers */
604209ff23fSmrg    uint32_t          crtc2_gen_cntl;
605209ff23fSmrg    uint32_t          dac_macro_cntl;
606209ff23fSmrg    uint32_t          dac2_cntl;
607209ff23fSmrg    uint32_t          disp_output_cntl;
608209ff23fSmrg    uint32_t          disp_tv_out_cntl;
609209ff23fSmrg    uint32_t          disp_hw_debug;
610209ff23fSmrg    uint32_t          disp2_merge_cntl;
611209ff23fSmrg    uint32_t          grph2_buffer_cntl;
612209ff23fSmrg    uint32_t          crtc2_h_total_disp;
613209ff23fSmrg    uint32_t          crtc2_h_sync_strt_wid;
614209ff23fSmrg    uint32_t          crtc2_v_total_disp;
615209ff23fSmrg    uint32_t          crtc2_v_sync_strt_wid;
616209ff23fSmrg    uint32_t          crtc2_offset;
617209ff23fSmrg    uint32_t          crtc2_offset_cntl;
618209ff23fSmrg    uint32_t          crtc2_pitch;
619209ff23fSmrg    uint32_t          crtc2_tile_x0_y0;
620209ff23fSmrg
621209ff23fSmrg				/* Flat panel registers */
622209ff23fSmrg    uint32_t          fp_crtc_h_total_disp;
623209ff23fSmrg    uint32_t          fp_crtc_v_total_disp;
624209ff23fSmrg    uint32_t          fp_gen_cntl;
625209ff23fSmrg    uint32_t          fp2_gen_cntl;
626209ff23fSmrg    uint32_t          fp_h_sync_strt_wid;
627209ff23fSmrg    uint32_t          fp_h2_sync_strt_wid;
628209ff23fSmrg    uint32_t          fp_horz_stretch;
629209ff23fSmrg    uint32_t          fp_horz_vert_active;
630209ff23fSmrg    uint32_t          fp_panel_cntl;
631209ff23fSmrg    uint32_t          fp_v_sync_strt_wid;
632209ff23fSmrg    uint32_t          fp_v2_sync_strt_wid;
633209ff23fSmrg    uint32_t          fp_vert_stretch;
634209ff23fSmrg    uint32_t          lvds_gen_cntl;
635209ff23fSmrg    uint32_t          lvds_pll_cntl;
636209ff23fSmrg    uint32_t          tmds_pll_cntl;
637209ff23fSmrg    uint32_t          tmds_transmitter_cntl;
638209ff23fSmrg
639209ff23fSmrg				/* Computed values for PLL */
640209ff23fSmrg    uint32_t          dot_clock_freq;
641209ff23fSmrg    uint32_t          pll_output_freq;
642209ff23fSmrg    int               feedback_div;
643209ff23fSmrg    int               reference_div;
644209ff23fSmrg    int               post_div;
645209ff23fSmrg
646209ff23fSmrg				/* PLL registers */
647209ff23fSmrg    unsigned          ppll_ref_div;
648209ff23fSmrg    unsigned          ppll_div_3;
649209ff23fSmrg    uint32_t          htotal_cntl;
650209ff23fSmrg    uint32_t          vclk_ecp_cntl;
651209ff23fSmrg
652209ff23fSmrg				/* Computed values for PLL2 */
653209ff23fSmrg    uint32_t          dot_clock_freq_2;
654209ff23fSmrg    uint32_t          pll_output_freq_2;
655209ff23fSmrg    int               feedback_div_2;
656209ff23fSmrg    int               reference_div_2;
657209ff23fSmrg    int               post_div_2;
658209ff23fSmrg
659209ff23fSmrg				/* PLL2 registers */
660209ff23fSmrg    uint32_t          p2pll_ref_div;
661209ff23fSmrg    uint32_t          p2pll_div_0;
662209ff23fSmrg    uint32_t          htotal_cntl2;
663209ff23fSmrg    uint32_t          pixclks_cntl;
664209ff23fSmrg
665209ff23fSmrg				/* Pallet */
666209ff23fSmrg    Bool              palette_valid;
66740732134Srjs    Bool	      palette_saved[2];
66840732134Srjs    uint32_t          palette[2][256];
669209ff23fSmrg
670209ff23fSmrg    uint32_t          disp2_req_cntl1;
671209ff23fSmrg    uint32_t          disp2_req_cntl2;
672209ff23fSmrg    uint32_t          dmif_mem_cntl1;
673209ff23fSmrg    uint32_t          disp1_req_cntl1;
674209ff23fSmrg
675209ff23fSmrg    uint32_t          fp_2nd_gen_cntl;
676209ff23fSmrg    uint32_t          fp2_2_gen_cntl;
677209ff23fSmrg    uint32_t          tmds2_cntl;
678209ff23fSmrg    uint32_t          tmds2_transmitter_cntl;
679209ff23fSmrg
680209ff23fSmrg
681209ff23fSmrg    /* TV out registers */
682209ff23fSmrg    uint32_t 	      tv_master_cntl;
683209ff23fSmrg    uint32_t 	      tv_htotal;
684209ff23fSmrg    uint32_t 	      tv_hsize;
685209ff23fSmrg    uint32_t 	      tv_hdisp;
686209ff23fSmrg    uint32_t 	      tv_hstart;
687209ff23fSmrg    uint32_t 	      tv_vtotal;
688209ff23fSmrg    uint32_t 	      tv_vdisp;
689209ff23fSmrg    uint32_t 	      tv_timing_cntl;
690209ff23fSmrg    uint32_t 	      tv_vscaler_cntl1;
691209ff23fSmrg    uint32_t 	      tv_vscaler_cntl2;
692209ff23fSmrg    uint32_t 	      tv_sync_size;
693209ff23fSmrg    uint32_t 	      tv_vrestart;
694209ff23fSmrg    uint32_t 	      tv_hrestart;
695209ff23fSmrg    uint32_t 	      tv_frestart;
696209ff23fSmrg    uint32_t 	      tv_ftotal;
697209ff23fSmrg    uint32_t 	      tv_clock_sel_cntl;
698209ff23fSmrg    uint32_t 	      tv_clkout_cntl;
699209ff23fSmrg    uint32_t 	      tv_data_delay_a;
700209ff23fSmrg    uint32_t 	      tv_data_delay_b;
701209ff23fSmrg    uint32_t 	      tv_dac_cntl;
702209ff23fSmrg    uint32_t 	      tv_pll_cntl;
703209ff23fSmrg    uint32_t 	      tv_pll_cntl1;
704209ff23fSmrg    uint32_t	      tv_pll_fine_cntl;
705209ff23fSmrg    uint32_t 	      tv_modulator_cntl1;
706209ff23fSmrg    uint32_t 	      tv_modulator_cntl2;
707209ff23fSmrg    uint32_t 	      tv_frame_lock_cntl;
708209ff23fSmrg    uint32_t 	      tv_pre_dac_mux_cntl;
709209ff23fSmrg    uint32_t 	      tv_rgb_cntl;
710209ff23fSmrg    uint32_t 	      tv_y_saw_tooth_cntl;
711209ff23fSmrg    uint32_t 	      tv_y_rise_cntl;
712209ff23fSmrg    uint32_t 	      tv_y_fall_cntl;
713209ff23fSmrg    uint32_t 	      tv_uv_adr;
714209ff23fSmrg    uint32_t	      tv_upsamp_and_gain_cntl;
715209ff23fSmrg    uint32_t	      tv_gain_limit_settings;
716209ff23fSmrg    uint32_t	      tv_linear_gain_settings;
717209ff23fSmrg    uint32_t	      tv_crc_cntl;
718209ff23fSmrg    uint32_t          tv_sync_cntl;
719209ff23fSmrg    uint32_t	      gpiopad_a;
720209ff23fSmrg    uint32_t          pll_test_cntl;
721209ff23fSmrg
722209ff23fSmrg    uint16_t          h_code_timing[MAX_H_CODE_TIMING_LEN];
723209ff23fSmrg    uint16_t          v_code_timing[MAX_V_CODE_TIMING_LEN];
724209ff23fSmrg
725209ff23fSmrg} RADEONSaveRec, *RADEONSavePtr;
726209ff23fSmrg
727209ff23fSmrgtypedef struct
728209ff23fSmrg{
729209ff23fSmrg    Bool HasSecondary;
730209ff23fSmrg    Bool              HasCRTC2;         /* All cards except original Radeon  */
731209ff23fSmrg    /*
732209ff23fSmrg     * The next two are used to make sure CRTC2 is restored before CRTC_EXT,
733209ff23fSmrg     * otherwise it could lead to blank screens.
734209ff23fSmrg     */
735209ff23fSmrg    Bool IsSecondaryRestored;
736209ff23fSmrg    Bool RestorePrimary;
737209ff23fSmrg
738209ff23fSmrg    Bool ReversedDAC;	  /* TVDAC used as primary dac */
739209ff23fSmrg    Bool ReversedTMDS;    /* DDC_DVI is used for external TMDS */
740209ff23fSmrg    xf86CrtcPtr pCrtc[RADEON_MAX_CRTC];
741209ff23fSmrg    RADEONCrtcPrivatePtr Controller[RADEON_MAX_CRTC];
742209ff23fSmrg
743209ff23fSmrg    ScrnInfoPtr pSecondaryScrn;
744209ff23fSmrg    ScrnInfoPtr pPrimaryScrn;
745209ff23fSmrg
746209ff23fSmrg    RADEONSaveRec     ModeReg;          /* Current mode                      */
747209ff23fSmrg    RADEONSaveRec     SavedReg;         /* Original (text) mode              */
748209ff23fSmrg
749209ff23fSmrg    void              *MMIO;            /* Map of MMIO region                */
7502f39173dSmrg    int               MMIO_cnt;         /* Map of FB region refcount         */
7512f39173dSmrg    void              *FB;              /* Map of FB region                  */
7522f39173dSmrg    int               FB_cnt;           /* Map of FB region refcount         */
753ad43ddacSmrg    int fd;                             /* for sharing across zaphod heads   */
75440732134Srjs    unsigned long     fd_wakeup_registered; /* server generation for which fd has been registered for wakeup handling */
755921a55d8Smrg    int dri2_info_cnt;
756209ff23fSmrg} RADEONEntRec, *RADEONEntPtr;
757209ff23fSmrg
758209ff23fSmrg/* radeon_probe.c */
759209ff23fSmrgextern PciChipsets          RADEONPciChipsets[];
760209ff23fSmrg
761209ff23fSmrg/* radeon_driver.c */
762209ff23fSmrgextern Bool                 RADEONPreInit(ScrnInfoPtr, int);
763209ff23fSmrgextern Bool                 RADEONScreenInit(int, ScreenPtr, int, char **);
764209ff23fSmrgextern Bool                 RADEONSwitchMode(int, DisplayModePtr, int);
765209ff23fSmrg#ifdef X_XF86MiscPassMessage
766209ff23fSmrgextern Bool                 RADEONHandleMessage(int, const char*, const char*,
767209ff23fSmrg					        char**);
768209ff23fSmrg#endif
769209ff23fSmrgextern void                 RADEONAdjustFrame(int, int, int, int);
770209ff23fSmrgextern Bool                 RADEONEnterVT(int, int);
771209ff23fSmrgextern void                 RADEONLeaveVT(int, int);
772209ff23fSmrgextern void                 RADEONFreeScreen(int, int);
773209ff23fSmrgextern ModeStatus           RADEONValidMode(int, DisplayModePtr, Bool, int);
774209ff23fSmrg
775209ff23fSmrgextern const OptionInfoRec *RADEONOptionsWeak(void);
776209ff23fSmrg
777ad43ddacSmrg#ifdef XF86DRM_MODE
778ad43ddacSmrgextern Bool                 RADEONPreInit_KMS(ScrnInfoPtr, int);
779ad43ddacSmrgextern Bool                 RADEONScreenInit_KMS(int, ScreenPtr, int, char **);
780ad43ddacSmrgextern Bool                 RADEONSwitchMode_KMS(int, DisplayModePtr, int);
781ad43ddacSmrgextern void                 RADEONAdjustFrame_KMS(int, int, int, int);
782ad43ddacSmrgextern Bool                 RADEONEnterVT_KMS(int, int);
783ad43ddacSmrgextern void                 RADEONLeaveVT_KMS(int, int);
784ad43ddacSmrgextern void RADEONFreeScreen_KMS(int scrnIndex, int flags);
785ad43ddacSmrg#endif
786ad43ddacSmrg
787209ff23fSmrg#endif /* _RADEON_PROBE_H_ */
788