radeon_probe.h revision 43df4709
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
4668105dcbSveego#include "compat-api.h"
4743df4709Smrg#ifdef USE_EXA
48209ff23fSmrg#include "exa.h"
4943df4709Smrg#endif
5043df4709Smrg#ifdef USE_XAA
5143df4709Smrg#include "xaa.h"
5243df4709Smrg#endif
53209ff23fSmrg
54209ff23fSmrgextern DriverRec RADEON;
55209ff23fSmrg
5643df4709Smrg#define RADEON_MAX_CRTC 6
5743df4709Smrg#define RADEON_MAX_BIOS_CONNECTOR 16
5843df4709Smrg
5940732134Srjstypedef enum {
6040732134Srjs    CHIP_FAMILY_UNKNOW,
6140732134Srjs    CHIP_FAMILY_LEGACY,
6240732134Srjs    CHIP_FAMILY_RADEON,
6340732134Srjs    CHIP_FAMILY_RV100,
6440732134Srjs    CHIP_FAMILY_RS100,    /* U1 (IGP320M) or A3 (IGP320)*/
6540732134Srjs    CHIP_FAMILY_RV200,
6640732134Srjs    CHIP_FAMILY_RS200,    /* U2 (IGP330M/340M/350M) or A4 (IGP330/340/345/350), RS250 (IGP 7000) */
6740732134Srjs    CHIP_FAMILY_R200,
6840732134Srjs    CHIP_FAMILY_RV250,
6940732134Srjs    CHIP_FAMILY_RS300,    /* RS300/RS350 */
7040732134Srjs    CHIP_FAMILY_RV280,
7140732134Srjs    CHIP_FAMILY_R300,
7240732134Srjs    CHIP_FAMILY_R350,
7340732134Srjs    CHIP_FAMILY_RV350,
7440732134Srjs    CHIP_FAMILY_RV380,    /* RV370/RV380/M22/M24 */
7540732134Srjs    CHIP_FAMILY_R420,     /* R420/R423/M18 */
7640732134Srjs    CHIP_FAMILY_RV410,    /* RV410, M26 */
7740732134Srjs    CHIP_FAMILY_RS400,    /* xpress 200, 200m (RS400) Intel */
7840732134Srjs    CHIP_FAMILY_RS480,    /* xpress 200, 200m (RS410/480/482/485) AMD */
7940732134Srjs    CHIP_FAMILY_RV515,    /* rv515 */
8040732134Srjs    CHIP_FAMILY_R520,    /* r520 */
8140732134Srjs    CHIP_FAMILY_RV530,    /* rv530 */
8240732134Srjs    CHIP_FAMILY_R580,    /* r580 */
8340732134Srjs    CHIP_FAMILY_RV560,   /* rv560 */
8440732134Srjs    CHIP_FAMILY_RV570,   /* rv570 */
8540732134Srjs    CHIP_FAMILY_RS600,
8640732134Srjs    CHIP_FAMILY_RS690,
8740732134Srjs    CHIP_FAMILY_RS740,
8840732134Srjs    CHIP_FAMILY_R600,    /* r600 */
8940732134Srjs    CHIP_FAMILY_RV610,
9040732134Srjs    CHIP_FAMILY_RV630,
9140732134Srjs    CHIP_FAMILY_RV670,
9240732134Srjs    CHIP_FAMILY_RV620,
9340732134Srjs    CHIP_FAMILY_RV635,
9440732134Srjs    CHIP_FAMILY_RS780,
9540732134Srjs    CHIP_FAMILY_RS880,
9640732134Srjs    CHIP_FAMILY_RV770,   /* r700 */
9740732134Srjs    CHIP_FAMILY_RV730,
9840732134Srjs    CHIP_FAMILY_RV710,
9940732134Srjs    CHIP_FAMILY_RV740,
10040732134Srjs    CHIP_FAMILY_CEDAR,   /* evergreen */
10140732134Srjs    CHIP_FAMILY_REDWOOD,
10240732134Srjs    CHIP_FAMILY_JUNIPER,
10340732134Srjs    CHIP_FAMILY_CYPRESS,
10440732134Srjs    CHIP_FAMILY_HEMLOCK,
10540732134Srjs    CHIP_FAMILY_PALM,
10640732134Srjs    CHIP_FAMILY_SUMO,
10740732134Srjs    CHIP_FAMILY_SUMO2,
10840732134Srjs    CHIP_FAMILY_BARTS,
10940732134Srjs    CHIP_FAMILY_TURKS,
11040732134Srjs    CHIP_FAMILY_CAICOS,
11140732134Srjs    CHIP_FAMILY_CAYMAN,
11240732134Srjs    CHIP_FAMILY_ARUBA,
11340732134Srjs    CHIP_FAMILY_LAST
11440732134Srjs} RADEONChipFamily;
11540732134Srjs
11640732134Srjstypedef struct {
11740732134Srjs    uint32_t pci_device_id;
11840732134Srjs    RADEONChipFamily chip_family;
11940732134Srjs    int mobility;
12040732134Srjs    int igp;
12140732134Srjs    int nocrtc2;
12240732134Srjs    int nointtvout;
12340732134Srjs    int singledac;
12440732134Srjs} RADEONCardInfo;
12540732134Srjs
12643df4709Smrgtypedef enum
12743df4709Smrg{
12843df4709Smrg    MT_UNKNOWN = -1,
12943df4709Smrg    MT_NONE    = 0,
13043df4709Smrg    MT_CRT     = 1,
13143df4709Smrg    MT_LCD     = 2,
13243df4709Smrg    MT_DFP     = 3,
13343df4709Smrg    MT_CTV     = 4,
13443df4709Smrg    MT_STV     = 5,
13543df4709Smrg    MT_CV      = 6,
13643df4709Smrg    MT_HDMI    = 7, // this should really just be MT_DFP
13743df4709Smrg    MT_DP      = 8
13843df4709Smrg} RADEONMonitorType;
13943df4709Smrg
14043df4709Smrgtypedef enum
14143df4709Smrg{
14243df4709Smrg    CONNECTOR_NONE,
14343df4709Smrg    CONNECTOR_VGA,
14443df4709Smrg    CONNECTOR_DVI_I,
14543df4709Smrg    CONNECTOR_DVI_D,
14643df4709Smrg    CONNECTOR_DVI_A,
14743df4709Smrg    CONNECTOR_STV,
14843df4709Smrg    CONNECTOR_CTV,
14943df4709Smrg    CONNECTOR_LVDS,
15043df4709Smrg    CONNECTOR_DIGITAL,
15143df4709Smrg    CONNECTOR_SCART,
15243df4709Smrg    CONNECTOR_HDMI_TYPE_A,
15343df4709Smrg    CONNECTOR_HDMI_TYPE_B,
15443df4709Smrg    CONNECTOR_0XC,
15543df4709Smrg    CONNECTOR_0XD,
15643df4709Smrg    CONNECTOR_DIN,
15743df4709Smrg    CONNECTOR_DISPLAY_PORT,
15843df4709Smrg    CONNECTOR_EDP,
15943df4709Smrg    CONNECTOR_UNSUPPORTED
16043df4709Smrg} RADEONConnectorType;
16143df4709Smrg
16243df4709Smrgtypedef enum
16343df4709Smrg{
16443df4709Smrg    DVI_AUTO,
16543df4709Smrg    DVI_DIGITAL,
16643df4709Smrg    DVI_ANALOG
16743df4709Smrg} RADEONDviType;
16843df4709Smrg
16943df4709Smrgtypedef enum
17043df4709Smrg{
17143df4709Smrg    RMX_OFF,
17243df4709Smrg    RMX_FULL,
17343df4709Smrg    RMX_CENTER,
17443df4709Smrg    RMX_ASPECT
17543df4709Smrg} RADEONRMXType;
17643df4709Smrg
17743df4709Smrgtypedef struct {
17843df4709Smrg    uint32_t freq;
17943df4709Smrg    uint32_t value;
18043df4709Smrg}RADEONTMDSPll;
18143df4709Smrg
18243df4709Smrg/* standards */
18343df4709Smrgtypedef enum
18443df4709Smrg{
18543df4709Smrg    TV_STD_NTSC      = 1,
18643df4709Smrg    TV_STD_PAL       = 2,
18743df4709Smrg    TV_STD_PAL_M     = 4,
18843df4709Smrg    TV_STD_PAL_60    = 8,
18943df4709Smrg    TV_STD_NTSC_J    = 16,
19043df4709Smrg    TV_STD_SCART_PAL = 32,
19143df4709Smrg    TV_STD_SECAM     = 64,
19243df4709Smrg    TV_STD_PAL_CN    = 128,
19343df4709Smrg} TVStd;
19443df4709Smrg
195209ff23fSmrgtypedef struct
196209ff23fSmrg{
19743df4709Smrg    Bool   valid;
19843df4709Smrg    uint32_t mask_clk_reg;
19943df4709Smrg    uint32_t mask_data_reg;
20043df4709Smrg    uint32_t a_clk_reg;
20143df4709Smrg    uint32_t a_data_reg;
20243df4709Smrg    uint32_t put_clk_reg;
20343df4709Smrg    uint32_t put_data_reg;
20443df4709Smrg    uint32_t get_clk_reg;
20543df4709Smrg    uint32_t get_data_reg;
20643df4709Smrg    uint32_t mask_clk_mask;
20743df4709Smrg    uint32_t mask_data_mask;
20843df4709Smrg    uint32_t put_clk_mask;
20943df4709Smrg    uint32_t put_data_mask;
21043df4709Smrg    uint32_t get_clk_mask;
21143df4709Smrg    uint32_t get_data_mask;
21243df4709Smrg    uint32_t a_clk_mask;
21343df4709Smrg    uint32_t a_data_mask;
21443df4709Smrg    int hw_line;
21543df4709Smrg    Bool hw_capable;
21643df4709Smrg} RADEONI2CBusRec, *RADEONI2CBusPtr;
21743df4709Smrg
21843df4709Smrgenum radeon_pll_algo {
21943df4709Smrg    RADEON_PLL_OLD,
22043df4709Smrg    RADEON_PLL_NEW
22143df4709Smrg};
22243df4709Smrg
22343df4709Smrgtypedef struct _RADEONCrtcPrivateRec {
22443df4709Smrg    void *crtc_rotate_mem;
22543df4709Smrg    void *cursor_mem;
22643df4709Smrg    int crtc_id;
22743df4709Smrg    int binding;
22843df4709Smrg    uint32_t cursor_offset;
22943df4709Smrg    /* Lookup table values to be set when the CRTC is enabled */
23043df4709Smrg    uint16_t lut_r[256], lut_g[256], lut_b[256];
23143df4709Smrg
23243df4709Smrg    uint32_t crtc_offset;
23343df4709Smrg    int can_tile;
23443df4709Smrg    Bool enabled;
23543df4709Smrg    Bool initialized;
23643df4709Smrg    Bool scaler_enabled;
23743df4709Smrg    float vsc;
23843df4709Smrg    float hsc;
23943df4709Smrg    int pll_id;
24043df4709Smrg    enum radeon_pll_algo     pll_algo;
24143df4709Smrg} RADEONCrtcPrivateRec, *RADEONCrtcPrivatePtr;
24243df4709Smrg
24343df4709Smrgtypedef struct _radeon_encoder {
24443df4709Smrg    uint16_t encoder_id;
24543df4709Smrg    int devices;
24643df4709Smrg    void *dev_priv;
24743df4709Smrg} radeon_encoder_rec, *radeon_encoder_ptr;
24843df4709Smrg
24943df4709Smrgtypedef struct _radeon_tvout {
25043df4709Smrg    /* TV out */
25143df4709Smrg    TVStd             default_tvStd;
25243df4709Smrg    TVStd             tvStd;
25343df4709Smrg    int               hPos;
25443df4709Smrg    int               vPos;
25543df4709Smrg    int               hSize;
25643df4709Smrg    float             TVRefClk;
25743df4709Smrg    int               SupportedTVStds;
25843df4709Smrg    Bool              tv_on;
25943df4709Smrg} radeon_tvout_rec, *radeon_tvout_ptr;
26043df4709Smrg
26143df4709Smrgtypedef struct _radeon_native_mode {
26243df4709Smrg    /* panel stuff */
26343df4709Smrg    int               PanelXRes;
26443df4709Smrg    int               PanelYRes;
26543df4709Smrg    int               HOverPlus;
26643df4709Smrg    int               HSyncWidth;
26743df4709Smrg    int               HBlank;
26843df4709Smrg    int               VOverPlus;
26943df4709Smrg    int               VSyncWidth;
27043df4709Smrg    int               VBlank;
27143df4709Smrg    int               Flags;
27243df4709Smrg    int               DotClock;
27343df4709Smrg} radeon_native_mode_rec, *radeon_native_mode_ptr;
27443df4709Smrg
27543df4709Smrgtypedef struct _radeon_tvdac {
27643df4709Smrg    // tv dac
27743df4709Smrg    uint32_t          ps2_tvdac_adj;
27843df4709Smrg    uint32_t          pal_tvdac_adj;
27943df4709Smrg    uint32_t          ntsc_tvdac_adj;
28043df4709Smrg} radeon_tvdac_rec, *radeon_tvdac_ptr;
28143df4709Smrg
28243df4709Smrgtypedef struct _radeon_tmds {
28343df4709Smrg    // tmds
28443df4709Smrg    RADEONTMDSPll     tmds_pll[4];
28543df4709Smrg} radeon_tmds_rec, *radeon_tmds_ptr;
28643df4709Smrg
28743df4709Smrgtypedef struct _radeon_lvds {
28843df4709Smrg    // panel mode
28943df4709Smrg    radeon_native_mode_rec native_mode;
29043df4709Smrg    // lvds
29143df4709Smrg    int               PanelPwrDly;
29243df4709Smrg    int               lvds_misc;
29343df4709Smrg    int               lvds_ss_id;
29443df4709Smrg} radeon_lvds_rec, *radeon_lvds_ptr;
29543df4709Smrg
29643df4709Smrgtypedef struct _radeon_dvo {
29743df4709Smrg    /* dvo */
29843df4709Smrg    I2CBusPtr         pI2CBus;
29943df4709Smrg    I2CDevPtr         DVOChip;
30043df4709Smrg    RADEONI2CBusRec   dvo_i2c;
30143df4709Smrg    int               dvo_i2c_slave_addr;
30243df4709Smrg    Bool              dvo_duallink;
30343df4709Smrg} radeon_dvo_rec, *radeon_dvo_ptr;
30443df4709Smrg
30543df4709Smrgtypedef struct {
30643df4709Smrg    RADEONConnectorType ConnectorType;
30743df4709Smrg    Bool valid;
30843df4709Smrg    int output_id;
30943df4709Smrg    int devices;
31043df4709Smrg    int hpd_mask;
31143df4709Smrg    RADEONI2CBusRec ddc_i2c;
31243df4709Smrg    int igp_lane_info;
31343df4709Smrg    Bool shared_ddc;
31443df4709Smrg    int i2c_line_mux;
31543df4709Smrg    Bool load_detection;
31643df4709Smrg    Bool linkb;
31743df4709Smrg    uint16_t connector_object;
31843df4709Smrg    uint16_t connector_object_id;
31943df4709Smrg    uint8_t ucI2cId;
32043df4709Smrg    uint8_t hpd_id;
32143df4709Smrg} RADEONBIOSConnector;
32243df4709Smrg
32343df4709Smrgtypedef struct _RADEONOutputPrivateRec {
32443df4709Smrg    uint16_t connector_id;
32543df4709Smrg    uint32_t devices;
32643df4709Smrg    uint32_t active_device;
32743df4709Smrg    Bool enabled;
32843df4709Smrg
32943df4709Smrg    int  load_detection;
33043df4709Smrg
33143df4709Smrg    // DVI/HDMI
33243df4709Smrg    Bool coherent_mode;
33343df4709Smrg    Bool linkb;
33443df4709Smrg
33543df4709Smrg    RADEONConnectorType ConnectorType;
33643df4709Smrg    uint16_t connector_object_id;
33743df4709Smrg    RADEONDviType DVIType;
33843df4709Smrg    RADEONMonitorType MonType;
33943df4709Smrg
34043df4709Smrg    // DDC info
34143df4709Smrg    I2CBusPtr         pI2CBus;
34243df4709Smrg    RADEONI2CBusRec   ddc_i2c;
34343df4709Smrg    Bool shared_ddc;
34443df4709Smrg
34543df4709Smrg    Bool custom_edid;
34643df4709Smrg    xf86MonPtr custom_mon;
34743df4709Smrg    // router info
34843df4709Smrg    // HDP info
34943df4709Smrg
35043df4709Smrg    // panel mode
35143df4709Smrg    radeon_native_mode_rec native_mode;
35243df4709Smrg
35343df4709Smrg    // RMX
35443df4709Smrg    RADEONRMXType     rmx_type;
35543df4709Smrg    int               Flags;
35643df4709Smrg
35743df4709Smrg    //tvout - move to encoder
35843df4709Smrg    radeon_tvout_rec tvout;
35943df4709Smrg
36043df4709Smrg    /* dce 3.x dig block */
36143df4709Smrg    int igp_lane_info;
36243df4709Smrg    int dig_encoder;
36343df4709Smrg
36443df4709Smrg    int pixel_clock;
36543df4709Smrg
36643df4709Smrg    /* DP - aux bus*/
36743df4709Smrg    I2CBusPtr dp_pI2CBus;
36843df4709Smrg    uint8_t ucI2cId;
36943df4709Smrg    char dp_bus_name[20];
37043df4709Smrg    uint32_t dp_i2c_addr;
37143df4709Smrg    Bool dp_i2c_running;
37243df4709Smrg    /* DP - general config */
37343df4709Smrg    uint8_t dpcd[8];
37443df4709Smrg    int dp_lane_count;
37543df4709Smrg    int dp_clock;
37643df4709Smrg    uint8_t hpd_id;
37743df4709Smrg    int pll_id;
37843df4709Smrg} RADEONOutputPrivateRec, *RADEONOutputPrivatePtr;
37943df4709Smrg
38043df4709Smrgstruct avivo_pll_state {
38143df4709Smrg    uint32_t ref_div_src;
38243df4709Smrg    uint32_t ref_div;
38343df4709Smrg    uint32_t fb_div;
38443df4709Smrg    uint32_t post_div_src;
38543df4709Smrg    uint32_t post_div;
38643df4709Smrg    uint32_t ext_ppll_cntl;
38743df4709Smrg    uint32_t pll_cntl;
38843df4709Smrg    uint32_t int_ss_cntl;
38943df4709Smrg};
39043df4709Smrg
39143df4709Smrgstruct avivo_crtc_state {
39243df4709Smrg    uint32_t pll_source;
39343df4709Smrg    uint32_t h_total;
39443df4709Smrg    uint32_t h_blank_start_end;
39543df4709Smrg    uint32_t h_sync_a;
39643df4709Smrg    uint32_t h_sync_a_cntl;
39743df4709Smrg    uint32_t h_sync_b;
39843df4709Smrg    uint32_t h_sync_b_cntl;
39943df4709Smrg    uint32_t v_total;
40043df4709Smrg    uint32_t v_blank_start_end;
40143df4709Smrg    uint32_t v_sync_a;
40243df4709Smrg    uint32_t v_sync_a_cntl;
40343df4709Smrg    uint32_t v_sync_b;
40443df4709Smrg    uint32_t v_sync_b_cntl;
40543df4709Smrg    uint32_t control;
40643df4709Smrg    uint32_t blank_control;
40743df4709Smrg    uint32_t interlace_control;
40843df4709Smrg    uint32_t stereo_control;
40943df4709Smrg    uint32_t cursor_control;
41043df4709Smrg};
41143df4709Smrg
41243df4709Smrgstruct avivo_grph_state {
41343df4709Smrg    uint32_t enable;
41443df4709Smrg    uint32_t control;
41543df4709Smrg    uint32_t swap_control;
41643df4709Smrg    uint32_t prim_surf_addr;
41743df4709Smrg    uint32_t sec_surf_addr;
41843df4709Smrg    uint32_t pitch;
41943df4709Smrg    uint32_t prim_surf_addr_hi;
42043df4709Smrg    uint32_t sec_surf_addr_hi;
42143df4709Smrg    uint32_t x_offset;
42243df4709Smrg    uint32_t y_offset;
42343df4709Smrg    uint32_t x_start;
42443df4709Smrg    uint32_t y_start;
42543df4709Smrg    uint32_t x_end;
42643df4709Smrg    uint32_t y_end;
42743df4709Smrg
42843df4709Smrg    uint32_t desktop_height;
42943df4709Smrg    uint32_t viewport_start;
43043df4709Smrg    uint32_t viewport_size;
43143df4709Smrg    uint32_t mode_data_format;
43243df4709Smrg};
43343df4709Smrg
43443df4709Smrgstruct dce4_main_block_state {
43543df4709Smrg    struct avivo_grph_state grph;
43643df4709Smrg    uint32_t scl[6];
43743df4709Smrg    uint32_t crtc[15];
43843df4709Smrg    uint32_t fmt[10];
43943df4709Smrg    uint32_t dig[20];
44043df4709Smrg};
44143df4709Smrg
44243df4709Smrgstruct dce4_state
44343df4709Smrg{
44443df4709Smrg
44543df4709Smrg    uint32_t vga1_cntl;
44643df4709Smrg    uint32_t vga2_cntl;
44743df4709Smrg    uint32_t vga3_cntl;
44843df4709Smrg    uint32_t vga4_cntl;
44943df4709Smrg    uint32_t vga5_cntl;
45043df4709Smrg    uint32_t vga6_cntl;
45143df4709Smrg    uint32_t vga_render_control;
45243df4709Smrg
45343df4709Smrg    struct dce4_main_block_state block[6];
45443df4709Smrg
45543df4709Smrg    uint32_t vga_pll[3][3];
45643df4709Smrg    uint32_t pll[2][15];
45743df4709Smrg    uint32_t pll_route[6];
45843df4709Smrg
45943df4709Smrg    uint32_t dac[2][26];
46043df4709Smrg    uint32_t uniphy[6][10];
46143df4709Smrg
46243df4709Smrg    uint32_t dig[20];
46343df4709Smrg};
46443df4709Smrg
46543df4709Smrgstruct avivo_state
46643df4709Smrg{
46743df4709Smrg    uint32_t hdp_fb_location;
46843df4709Smrg    uint32_t mc_memory_map;
46943df4709Smrg    uint32_t vga_memory_base;
47043df4709Smrg    uint32_t vga_fb_start;
47143df4709Smrg
47243df4709Smrg    uint32_t vga1_cntl;
47343df4709Smrg    uint32_t vga2_cntl;
47443df4709Smrg    uint32_t vga3_cntl;
47543df4709Smrg    uint32_t vga4_cntl;
47643df4709Smrg    uint32_t vga5_cntl;
47743df4709Smrg    uint32_t vga6_cntl;
47843df4709Smrg    uint32_t vga_render_control;
47943df4709Smrg
48043df4709Smrg    uint32_t crtc_master_en;
48143df4709Smrg    uint32_t crtc_tv_control;
48243df4709Smrg    uint32_t dc_lb_memory_split;
48343df4709Smrg
48443df4709Smrg    struct avivo_pll_state pll[2];
48543df4709Smrg
48643df4709Smrg    struct avivo_pll_state vga25_ppll;
48743df4709Smrg    struct avivo_pll_state vga28_ppll;
48843df4709Smrg    struct avivo_pll_state vga41_ppll;
48943df4709Smrg
49043df4709Smrg    struct avivo_crtc_state crtc[2];
49143df4709Smrg
49243df4709Smrg    struct avivo_grph_state grph[2];
49343df4709Smrg
49443df4709Smrg    /* DDIA block on RS6xx chips */
49543df4709Smrg    uint32_t ddia[37];
49643df4709Smrg
49743df4709Smrg    /* scalers */
49843df4709Smrg    uint32_t d1scl[40];
49943df4709Smrg    uint32_t d2scl[40];
50043df4709Smrg    uint32_t dxscl[6+2];
50143df4709Smrg
50243df4709Smrg    /* dac regs */
50343df4709Smrg    uint32_t daca[26];
50443df4709Smrg    uint32_t dacb[26];
50543df4709Smrg
50643df4709Smrg    /* tmdsa */
50743df4709Smrg    uint32_t tmdsa[31];
50843df4709Smrg
50943df4709Smrg    /* lvtma */
51043df4709Smrg    uint32_t lvtma[39];
51143df4709Smrg
51243df4709Smrg    /* dvoa */
51343df4709Smrg    uint32_t dvoa[16];
51443df4709Smrg
51543df4709Smrg    /* DCE3+ chips */
51643df4709Smrg    uint32_t fmt1[18];
51743df4709Smrg    uint32_t fmt2[18];
51843df4709Smrg    uint32_t dig1[19];
51943df4709Smrg    uint32_t dig2[19];
52043df4709Smrg    uint32_t hdmi1[57];
52143df4709Smrg    uint32_t hdmi2[57];
52243df4709Smrg    uint32_t aux_cntl1[14];
52343df4709Smrg    uint32_t aux_cntl2[14];
52443df4709Smrg    uint32_t aux_cntl3[14];
52543df4709Smrg    uint32_t aux_cntl4[14];
52643df4709Smrg    uint32_t aux_cntl5[14];
52743df4709Smrg    uint32_t aux_cntl6[14];
52843df4709Smrg    uint32_t phy[10];
52943df4709Smrg    uint32_t uniphy1[8];
53043df4709Smrg    uint32_t uniphy2[8];
53143df4709Smrg    uint32_t uniphy3[8];
53243df4709Smrg    uint32_t uniphy4[8];
53343df4709Smrg    uint32_t uniphy5[8];
53443df4709Smrg    uint32_t uniphy6[8];
53543df4709Smrg
53643df4709Smrg};
53743df4709Smrg
53843df4709Smrg/*
53943df4709Smrg * Maximum length of horizontal/vertical code timing tables for state storage
54043df4709Smrg */
54143df4709Smrg#define MAX_H_CODE_TIMING_LEN 32
54243df4709Smrg#define MAX_V_CODE_TIMING_LEN 32
54343df4709Smrg
54443df4709Smrgtypedef struct {
54543df4709Smrg    struct avivo_state avivo;
54643df4709Smrg    struct dce4_state dce4;
54743df4709Smrg
54843df4709Smrg				/* Common registers */
54943df4709Smrg    uint32_t          ovr_clr;
55043df4709Smrg    uint32_t          ovr_wid_left_right;
55143df4709Smrg    uint32_t          ovr_wid_top_bottom;
55243df4709Smrg    uint32_t          ov0_scale_cntl;
55343df4709Smrg    uint32_t          mpp_tb_config;
55443df4709Smrg    uint32_t          mpp_gp_config;
55543df4709Smrg    uint32_t          subpic_cntl;
55643df4709Smrg    uint32_t          viph_control;
55743df4709Smrg    uint32_t          i2c_cntl_1;
55843df4709Smrg    uint32_t          gen_int_cntl;
55943df4709Smrg    uint32_t          cap0_trig_cntl;
56043df4709Smrg    uint32_t          cap1_trig_cntl;
56143df4709Smrg    uint32_t          bus_cntl;
56243df4709Smrg
56343df4709Smrg    uint32_t          bios_0_scratch;
56443df4709Smrg    uint32_t          bios_1_scratch;
56543df4709Smrg    uint32_t          bios_2_scratch;
56643df4709Smrg    uint32_t          bios_3_scratch;
56743df4709Smrg    uint32_t          bios_4_scratch;
56843df4709Smrg    uint32_t          bios_5_scratch;
56943df4709Smrg    uint32_t          bios_6_scratch;
57043df4709Smrg    uint32_t          bios_7_scratch;
57143df4709Smrg
57243df4709Smrg    uint32_t          surface_cntl;
57343df4709Smrg    uint32_t          surfaces[8][3];
57443df4709Smrg    uint32_t          mc_agp_location;
57543df4709Smrg    uint32_t          mc_agp_location_hi;
57643df4709Smrg    uint32_t          mc_fb_location;
57743df4709Smrg    uint32_t          display_base_addr;
57843df4709Smrg    uint32_t          display2_base_addr;
57943df4709Smrg    uint32_t          ov0_base_addr;
58043df4709Smrg
58143df4709Smrg				/* Other registers to save for VT switches */
58243df4709Smrg    uint32_t          dp_datatype;
58343df4709Smrg    uint32_t          rbbm_soft_reset;
58443df4709Smrg    uint32_t          clock_cntl_index;
58543df4709Smrg    uint32_t          amcgpio_en_reg;
58643df4709Smrg    uint32_t          amcgpio_mask;
58743df4709Smrg
58843df4709Smrg				/* CRTC registers */
58943df4709Smrg    uint32_t          crtc_gen_cntl;
59043df4709Smrg    uint32_t          crtc_ext_cntl;
59143df4709Smrg    uint32_t          dac_cntl;
59243df4709Smrg    uint32_t          crtc_h_total_disp;
59343df4709Smrg    uint32_t          crtc_h_sync_strt_wid;
59443df4709Smrg    uint32_t          crtc_v_total_disp;
59543df4709Smrg    uint32_t          crtc_v_sync_strt_wid;
59643df4709Smrg    uint32_t          crtc_offset;
59743df4709Smrg    uint32_t          crtc_offset_cntl;
59843df4709Smrg    uint32_t          crtc_pitch;
59943df4709Smrg    uint32_t          disp_merge_cntl;
60043df4709Smrg    uint32_t          grph_buffer_cntl;
60143df4709Smrg    uint32_t          crtc_more_cntl;
60243df4709Smrg    uint32_t          crtc_tile_x0_y0;
60343df4709Smrg
60443df4709Smrg				/* CRTC2 registers */
60543df4709Smrg    uint32_t          crtc2_gen_cntl;
60643df4709Smrg    uint32_t          dac_macro_cntl;
60743df4709Smrg    uint32_t          dac2_cntl;
60843df4709Smrg    uint32_t          disp_output_cntl;
60943df4709Smrg    uint32_t          disp_tv_out_cntl;
61043df4709Smrg    uint32_t          disp_hw_debug;
61143df4709Smrg    uint32_t          disp2_merge_cntl;
61243df4709Smrg    uint32_t          grph2_buffer_cntl;
61343df4709Smrg    uint32_t          crtc2_h_total_disp;
61443df4709Smrg    uint32_t          crtc2_h_sync_strt_wid;
61543df4709Smrg    uint32_t          crtc2_v_total_disp;
61643df4709Smrg    uint32_t          crtc2_v_sync_strt_wid;
61743df4709Smrg    uint32_t          crtc2_offset;
61843df4709Smrg    uint32_t          crtc2_offset_cntl;
61943df4709Smrg    uint32_t          crtc2_pitch;
62043df4709Smrg    uint32_t          crtc2_tile_x0_y0;
62143df4709Smrg
62243df4709Smrg				/* Flat panel registers */
62343df4709Smrg    uint32_t          fp_crtc_h_total_disp;
62443df4709Smrg    uint32_t          fp_crtc_v_total_disp;
62543df4709Smrg    uint32_t          fp_gen_cntl;
62643df4709Smrg    uint32_t          fp2_gen_cntl;
62743df4709Smrg    uint32_t          fp_h_sync_strt_wid;
62843df4709Smrg    uint32_t          fp_h2_sync_strt_wid;
62943df4709Smrg    uint32_t          fp_horz_stretch;
63043df4709Smrg    uint32_t          fp_horz_vert_active;
63143df4709Smrg    uint32_t          fp_panel_cntl;
63243df4709Smrg    uint32_t          fp_v_sync_strt_wid;
63343df4709Smrg    uint32_t          fp_v2_sync_strt_wid;
63443df4709Smrg    uint32_t          fp_vert_stretch;
63543df4709Smrg    uint32_t          lvds_gen_cntl;
63643df4709Smrg    uint32_t          lvds_pll_cntl;
63743df4709Smrg    uint32_t          tmds_pll_cntl;
63843df4709Smrg    uint32_t          tmds_transmitter_cntl;
63943df4709Smrg
64043df4709Smrg				/* Computed values for PLL */
64143df4709Smrg    uint32_t          dot_clock_freq;
64243df4709Smrg    uint32_t          pll_output_freq;
64343df4709Smrg    int               feedback_div;
64443df4709Smrg    int               reference_div;
64543df4709Smrg    int               post_div;
64643df4709Smrg
64743df4709Smrg				/* PLL registers */
64843df4709Smrg    unsigned          ppll_ref_div;
64943df4709Smrg    unsigned          ppll_div_3;
65043df4709Smrg    uint32_t          htotal_cntl;
65143df4709Smrg    uint32_t          vclk_ecp_cntl;
65243df4709Smrg
65343df4709Smrg				/* Computed values for PLL2 */
65443df4709Smrg    uint32_t          dot_clock_freq_2;
65543df4709Smrg    uint32_t          pll_output_freq_2;
65643df4709Smrg    int               feedback_div_2;
65743df4709Smrg    int               reference_div_2;
65843df4709Smrg    int               post_div_2;
65943df4709Smrg
66043df4709Smrg				/* PLL2 registers */
66143df4709Smrg    uint32_t          p2pll_ref_div;
66243df4709Smrg    uint32_t          p2pll_div_0;
66343df4709Smrg    uint32_t          htotal_cntl2;
66443df4709Smrg    uint32_t          pixclks_cntl;
66543df4709Smrg
66643df4709Smrg				/* Pallet */
66743df4709Smrg    Bool              palette_valid;
66843df4709Smrg    Bool	      palette_saved[2];
66943df4709Smrg    uint32_t          palette[2][256];
67043df4709Smrg
67143df4709Smrg    uint32_t          disp2_req_cntl1;
67243df4709Smrg    uint32_t          disp2_req_cntl2;
67343df4709Smrg    uint32_t          dmif_mem_cntl1;
67443df4709Smrg    uint32_t          disp1_req_cntl1;
67543df4709Smrg
67643df4709Smrg    uint32_t          fp_2nd_gen_cntl;
67743df4709Smrg    uint32_t          fp2_2_gen_cntl;
67843df4709Smrg    uint32_t          tmds2_cntl;
67943df4709Smrg    uint32_t          tmds2_transmitter_cntl;
68043df4709Smrg
68143df4709Smrg
68243df4709Smrg    /* TV out registers */
68343df4709Smrg    uint32_t 	      tv_master_cntl;
68443df4709Smrg    uint32_t 	      tv_htotal;
68543df4709Smrg    uint32_t 	      tv_hsize;
68643df4709Smrg    uint32_t 	      tv_hdisp;
68743df4709Smrg    uint32_t 	      tv_hstart;
68843df4709Smrg    uint32_t 	      tv_vtotal;
68943df4709Smrg    uint32_t 	      tv_vdisp;
69043df4709Smrg    uint32_t 	      tv_timing_cntl;
69143df4709Smrg    uint32_t 	      tv_vscaler_cntl1;
69243df4709Smrg    uint32_t 	      tv_vscaler_cntl2;
69343df4709Smrg    uint32_t 	      tv_sync_size;
69443df4709Smrg    uint32_t 	      tv_vrestart;
69543df4709Smrg    uint32_t 	      tv_hrestart;
69643df4709Smrg    uint32_t 	      tv_frestart;
69743df4709Smrg    uint32_t 	      tv_ftotal;
69843df4709Smrg    uint32_t 	      tv_clock_sel_cntl;
69943df4709Smrg    uint32_t 	      tv_clkout_cntl;
70043df4709Smrg    uint32_t 	      tv_data_delay_a;
70143df4709Smrg    uint32_t 	      tv_data_delay_b;
70243df4709Smrg    uint32_t 	      tv_dac_cntl;
70343df4709Smrg    uint32_t 	      tv_pll_cntl;
70443df4709Smrg    uint32_t 	      tv_pll_cntl1;
70543df4709Smrg    uint32_t	      tv_pll_fine_cntl;
70643df4709Smrg    uint32_t 	      tv_modulator_cntl1;
70743df4709Smrg    uint32_t 	      tv_modulator_cntl2;
70843df4709Smrg    uint32_t 	      tv_frame_lock_cntl;
70943df4709Smrg    uint32_t 	      tv_pre_dac_mux_cntl;
71043df4709Smrg    uint32_t 	      tv_rgb_cntl;
71143df4709Smrg    uint32_t 	      tv_y_saw_tooth_cntl;
71243df4709Smrg    uint32_t 	      tv_y_rise_cntl;
71343df4709Smrg    uint32_t 	      tv_y_fall_cntl;
71443df4709Smrg    uint32_t 	      tv_uv_adr;
71543df4709Smrg    uint32_t	      tv_upsamp_and_gain_cntl;
71643df4709Smrg    uint32_t	      tv_gain_limit_settings;
71743df4709Smrg    uint32_t	      tv_linear_gain_settings;
71843df4709Smrg    uint32_t	      tv_crc_cntl;
71943df4709Smrg    uint32_t          tv_sync_cntl;
72043df4709Smrg    uint32_t	      gpiopad_a;
72143df4709Smrg    uint32_t          pll_test_cntl;
72243df4709Smrg
72343df4709Smrg    uint16_t          h_code_timing[MAX_H_CODE_TIMING_LEN];
72443df4709Smrg    uint16_t          v_code_timing[MAX_V_CODE_TIMING_LEN];
72543df4709Smrg
72643df4709Smrg} RADEONSaveRec, *RADEONSavePtr;
72743df4709Smrg
72843df4709Smrgtypedef struct
72943df4709Smrg{
73043df4709Smrg    Bool HasSecondary;
731209ff23fSmrg    Bool              HasCRTC2;         /* All cards except original Radeon  */
73243df4709Smrg    /*
73343df4709Smrg     * The next two are used to make sure CRTC2 is restored before CRTC_EXT,
73443df4709Smrg     * otherwise it could lead to blank screens.
73543df4709Smrg     */
73643df4709Smrg    Bool IsSecondaryRestored;
73743df4709Smrg    Bool RestorePrimary;
73843df4709Smrg
73943df4709Smrg    Bool ReversedDAC;	  /* TVDAC used as primary dac */
74043df4709Smrg    Bool ReversedTMDS;    /* DDC_DVI is used for external TMDS */
74143df4709Smrg    xf86CrtcPtr pCrtc[RADEON_MAX_CRTC];
74243df4709Smrg    RADEONCrtcPrivatePtr Controller[RADEON_MAX_CRTC];
74343df4709Smrg
74443df4709Smrg    ScrnInfoPtr pSecondaryScrn;
74543df4709Smrg    ScrnInfoPtr pPrimaryScrn;
746209ff23fSmrg
74743df4709Smrg    RADEONSaveRec     ModeReg;          /* Current mode                      */
74843df4709Smrg    RADEONSaveRec     SavedReg;         /* Original (text) mode              */
74943df4709Smrg
75043df4709Smrg    void              *MMIO;            /* Map of MMIO region                */
75143df4709Smrg    int               MMIO_cnt;         /* Map of FB region refcount         */
75243df4709Smrg    void              *FB;              /* Map of FB region                  */
75343df4709Smrg    int               FB_cnt;           /* Map of FB region refcount         */
754ad43ddacSmrg    int fd;                             /* for sharing across zaphod heads   */
75540732134Srjs    unsigned long     fd_wakeup_registered; /* server generation for which fd has been registered for wakeup handling */
75643df4709Smrg    int dri2_info_cnt;
7576322c902Smrg} RADEONEntRec, *RADEONEntPtr;
758209ff23fSmrg
75943df4709Smrg/* radeon_probe.c */
76043df4709Smrgextern PciChipsets          RADEONPciChipsets[];
76143df4709Smrg
76243df4709Smrg/* radeon_driver.c */
76343df4709Smrgextern Bool                 RADEONPreInit(ScrnInfoPtr, int);
76443df4709Smrgextern Bool                 RADEONScreenInit(SCREEN_INIT_ARGS_DECL);
76543df4709Smrgextern Bool                 RADEONSwitchMode(SWITCH_MODE_ARGS_DECL);
76643df4709Smrg#ifdef X_XF86MiscPassMessage
76743df4709Smrgextern Bool                 RADEONHandleMessage(int, const char*, const char*,
76843df4709Smrg					        char**);
76943df4709Smrg#endif
77043df4709Smrgextern void                 RADEONAdjustFrame(ADJUST_FRAME_ARGS_DECL);
77143df4709Smrgextern Bool                 RADEONEnterVT(VT_FUNC_ARGS_DECL);
77243df4709Smrgextern void                 RADEONLeaveVT(VT_FUNC_ARGS_DECL);
77343df4709Smrgextern void                 RADEONFreeScreen(FREE_SCREEN_ARGS_DECL);
77443df4709Smrgextern ModeStatus           RADEONValidMode(SCRN_ARG_TYPE, DisplayModePtr, Bool, int);
77543df4709Smrg
776209ff23fSmrgextern const OptionInfoRec *RADEONOptionsWeak(void);
777209ff23fSmrg
77843df4709Smrg#ifdef XF86DRM_MODE
779ad43ddacSmrgextern Bool                 RADEONPreInit_KMS(ScrnInfoPtr, int);
78068105dcbSveegoextern Bool                 RADEONScreenInit_KMS(SCREEN_INIT_ARGS_DECL);
78168105dcbSveegoextern Bool                 RADEONSwitchMode_KMS(SWITCH_MODE_ARGS_DECL);
78268105dcbSveegoextern void                 RADEONAdjustFrame_KMS(ADJUST_FRAME_ARGS_DECL);
78368105dcbSveegoextern Bool                 RADEONEnterVT_KMS(VT_FUNC_ARGS_DECL);
78468105dcbSveegoextern void                 RADEONLeaveVT_KMS(VT_FUNC_ARGS_DECL);
78568105dcbSveegoextern void RADEONFreeScreen_KMS(FREE_SCREEN_ARGS_DECL);
78643df4709Smrg#endif
787ad43ddacSmrg
788209ff23fSmrg#endif /* _RADEON_PROBE_H_ */
789