radeon_probe.h revision 68105dcb
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"
47209ff23fSmrg#ifdef USE_EXA
48209ff23fSmrg#include "exa.h"
49209ff23fSmrg#endif
50209ff23fSmrg#ifdef USE_XAA
51209ff23fSmrg#include "xaa.h"
52209ff23fSmrg#endif
53209ff23fSmrg
54209ff23fSmrgextern DriverRec RADEON;
55209ff23fSmrg
56ad43ddacSmrg#define RADEON_MAX_CRTC 6
57b7e1c893Smrg#define RADEON_MAX_BIOS_CONNECTOR 16
58b7e1c893Smrg
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
126209ff23fSmrgtypedef enum
127209ff23fSmrg{
128209ff23fSmrg    MT_UNKNOWN = -1,
129209ff23fSmrg    MT_NONE    = 0,
130209ff23fSmrg    MT_CRT     = 1,
131209ff23fSmrg    MT_LCD     = 2,
132209ff23fSmrg    MT_DFP     = 3,
133209ff23fSmrg    MT_CTV     = 4,
134209ff23fSmrg    MT_STV     = 5,
135209ff23fSmrg    MT_CV      = 6,
136209ff23fSmrg    MT_HDMI    = 7, // this should really just be MT_DFP
137209ff23fSmrg    MT_DP      = 8
138209ff23fSmrg} RADEONMonitorType;
139209ff23fSmrg
140209ff23fSmrgtypedef enum
141209ff23fSmrg{
142209ff23fSmrg    CONNECTOR_NONE,
143209ff23fSmrg    CONNECTOR_VGA,
144209ff23fSmrg    CONNECTOR_DVI_I,
145209ff23fSmrg    CONNECTOR_DVI_D,
146209ff23fSmrg    CONNECTOR_DVI_A,
147209ff23fSmrg    CONNECTOR_STV,
148209ff23fSmrg    CONNECTOR_CTV,
149209ff23fSmrg    CONNECTOR_LVDS,
150209ff23fSmrg    CONNECTOR_DIGITAL,
151209ff23fSmrg    CONNECTOR_SCART,
152209ff23fSmrg    CONNECTOR_HDMI_TYPE_A,
153209ff23fSmrg    CONNECTOR_HDMI_TYPE_B,
154209ff23fSmrg    CONNECTOR_0XC,
155209ff23fSmrg    CONNECTOR_0XD,
156209ff23fSmrg    CONNECTOR_DIN,
157209ff23fSmrg    CONNECTOR_DISPLAY_PORT,
158ad43ddacSmrg    CONNECTOR_EDP,
159209ff23fSmrg    CONNECTOR_UNSUPPORTED
160209ff23fSmrg} RADEONConnectorType;
161209ff23fSmrg
162209ff23fSmrgtypedef enum
163209ff23fSmrg{
164209ff23fSmrg    DVI_AUTO,
165209ff23fSmrg    DVI_DIGITAL,
166209ff23fSmrg    DVI_ANALOG
167209ff23fSmrg} RADEONDviType;
168209ff23fSmrg
169209ff23fSmrgtypedef enum
170209ff23fSmrg{
171209ff23fSmrg    RMX_OFF,
172209ff23fSmrg    RMX_FULL,
173b7e1c893Smrg    RMX_CENTER,
174b7e1c893Smrg    RMX_ASPECT
175209ff23fSmrg} RADEONRMXType;
176209ff23fSmrg
177209ff23fSmrgtypedef struct {
178209ff23fSmrg    uint32_t freq;
179209ff23fSmrg    uint32_t value;
180209ff23fSmrg}RADEONTMDSPll;
181209ff23fSmrg
182209ff23fSmrg/* standards */
183209ff23fSmrgtypedef enum
184209ff23fSmrg{
185209ff23fSmrg    TV_STD_NTSC      = 1,
186209ff23fSmrg    TV_STD_PAL       = 2,
187209ff23fSmrg    TV_STD_PAL_M     = 4,
188209ff23fSmrg    TV_STD_PAL_60    = 8,
189209ff23fSmrg    TV_STD_NTSC_J    = 16,
190209ff23fSmrg    TV_STD_SCART_PAL = 32,
191209ff23fSmrg    TV_STD_SECAM     = 64,
192209ff23fSmrg    TV_STD_PAL_CN    = 128,
193209ff23fSmrg} TVStd;
194209ff23fSmrg
195209ff23fSmrgtypedef struct
196209ff23fSmrg{
197209ff23fSmrg    Bool   valid;
198209ff23fSmrg    uint32_t mask_clk_reg;
199209ff23fSmrg    uint32_t mask_data_reg;
200b7e1c893Smrg    uint32_t a_clk_reg;
201b7e1c893Smrg    uint32_t a_data_reg;
202209ff23fSmrg    uint32_t put_clk_reg;
203209ff23fSmrg    uint32_t put_data_reg;
204209ff23fSmrg    uint32_t get_clk_reg;
205209ff23fSmrg    uint32_t get_data_reg;
206209ff23fSmrg    uint32_t mask_clk_mask;
207209ff23fSmrg    uint32_t mask_data_mask;
208209ff23fSmrg    uint32_t put_clk_mask;
209209ff23fSmrg    uint32_t put_data_mask;
210209ff23fSmrg    uint32_t get_clk_mask;
211209ff23fSmrg    uint32_t get_data_mask;
212b7e1c893Smrg    uint32_t a_clk_mask;
213b7e1c893Smrg    uint32_t a_data_mask;
214b7e1c893Smrg    int hw_line;
215b7e1c893Smrg    Bool hw_capable;
216209ff23fSmrg} RADEONI2CBusRec, *RADEONI2CBusPtr;
217209ff23fSmrg
2182f39173dSmrgenum radeon_pll_algo {
2192f39173dSmrg    RADEON_PLL_OLD,
2202f39173dSmrg    RADEON_PLL_NEW
2212f39173dSmrg};
2222f39173dSmrg
223209ff23fSmrgtypedef struct _RADEONCrtcPrivateRec {
224b7e1c893Smrg    void *crtc_rotate_mem;
225b7e1c893Smrg    void *cursor_mem;
226209ff23fSmrg    int crtc_id;
227209ff23fSmrg    int binding;
228209ff23fSmrg    uint32_t cursor_offset;
229209ff23fSmrg    /* Lookup table values to be set when the CRTC is enabled */
230b7e1c893Smrg    uint16_t lut_r[256], lut_g[256], lut_b[256];
231209ff23fSmrg
232209ff23fSmrg    uint32_t crtc_offset;
233209ff23fSmrg    int can_tile;
234209ff23fSmrg    Bool enabled;
235b7e1c893Smrg    Bool initialized;
236ad43ddacSmrg    Bool scaler_enabled;
237ad43ddacSmrg    float vsc;
238ad43ddacSmrg    float hsc;
239ad43ddacSmrg    int pll_id;
2402f39173dSmrg    enum radeon_pll_algo     pll_algo;
241209ff23fSmrg} RADEONCrtcPrivateRec, *RADEONCrtcPrivatePtr;
242209ff23fSmrg
243b7e1c893Smrgtypedef struct _radeon_encoder {
244b7e1c893Smrg    uint16_t encoder_id;
245209ff23fSmrg    int devices;
246209ff23fSmrg    void *dev_priv;
247b7e1c893Smrg} radeon_encoder_rec, *radeon_encoder_ptr;
248b7e1c893Smrg
249b7e1c893Smrgtypedef struct _radeon_tvout {
250b7e1c893Smrg    /* TV out */
251b7e1c893Smrg    TVStd             default_tvStd;
252b7e1c893Smrg    TVStd             tvStd;
253b7e1c893Smrg    int               hPos;
254b7e1c893Smrg    int               vPos;
255b7e1c893Smrg    int               hSize;
256b7e1c893Smrg    float             TVRefClk;
257b7e1c893Smrg    int               SupportedTVStds;
258b7e1c893Smrg    Bool              tv_on;
259b7e1c893Smrg} radeon_tvout_rec, *radeon_tvout_ptr;
260b7e1c893Smrg
261b7e1c893Smrgtypedef struct _radeon_native_mode {
262209ff23fSmrg    /* panel stuff */
263209ff23fSmrg    int               PanelXRes;
264209ff23fSmrg    int               PanelYRes;
265209ff23fSmrg    int               HOverPlus;
266209ff23fSmrg    int               HSyncWidth;
267209ff23fSmrg    int               HBlank;
268209ff23fSmrg    int               VOverPlus;
269209ff23fSmrg    int               VSyncWidth;
270209ff23fSmrg    int               VBlank;
271b7e1c893Smrg    int               Flags;
272209ff23fSmrg    int               DotClock;
273b7e1c893Smrg} radeon_native_mode_rec, *radeon_native_mode_ptr;
274b7e1c893Smrg
275b7e1c893Smrgtypedef struct _radeon_tvdac {
276b7e1c893Smrg    // tv dac
277b7e1c893Smrg    uint32_t          ps2_tvdac_adj;
278b7e1c893Smrg    uint32_t          pal_tvdac_adj;
279b7e1c893Smrg    uint32_t          ntsc_tvdac_adj;
280b7e1c893Smrg} radeon_tvdac_rec, *radeon_tvdac_ptr;
281b7e1c893Smrg
282b7e1c893Smrgtypedef struct _radeon_tmds {
283b7e1c893Smrg    // tmds
284209ff23fSmrg    RADEONTMDSPll     tmds_pll[4];
285b7e1c893Smrg} radeon_tmds_rec, *radeon_tmds_ptr;
286b7e1c893Smrg
287b7e1c893Smrgtypedef struct _radeon_lvds {
288b7e1c893Smrg    // panel mode
289b7e1c893Smrg    radeon_native_mode_rec native_mode;
290b7e1c893Smrg    // lvds
291b7e1c893Smrg    int               PanelPwrDly;
292b7e1c893Smrg    int               lvds_misc;
293b7e1c893Smrg    int               lvds_ss_id;
294b7e1c893Smrg} radeon_lvds_rec, *radeon_lvds_ptr;
295b7e1c893Smrg
296b7e1c893Smrgtypedef struct _radeon_dvo {
297209ff23fSmrg    /* dvo */
298c503f109Smrg    I2CBusPtr         pI2CBus;
299209ff23fSmrg    I2CDevPtr         DVOChip;
300209ff23fSmrg    RADEONI2CBusRec   dvo_i2c;
301209ff23fSmrg    int               dvo_i2c_slave_addr;
302209ff23fSmrg    Bool              dvo_duallink;
303b7e1c893Smrg} radeon_dvo_rec, *radeon_dvo_ptr;
304b7e1c893Smrg
305b7e1c893Smrgtypedef struct {
306b7e1c893Smrg    RADEONConnectorType ConnectorType;
307b7e1c893Smrg    Bool valid;
308b7e1c893Smrg    int output_id;
309b7e1c893Smrg    int devices;
310b7e1c893Smrg    int hpd_mask;
311b7e1c893Smrg    RADEONI2CBusRec ddc_i2c;
312209ff23fSmrg    int igp_lane_info;
313b7e1c893Smrg    Bool shared_ddc;
314b7e1c893Smrg    int i2c_line_mux;
315b7e1c893Smrg    Bool load_detection;
316b7e1c893Smrg    Bool linkb;
317b7e1c893Smrg    uint16_t connector_object;
318ad43ddacSmrg    uint16_t connector_object_id;
319ad43ddacSmrg    uint8_t ucI2cId;
320ad43ddacSmrg    uint8_t hpd_id;
321b7e1c893Smrg} RADEONBIOSConnector;
322209ff23fSmrg
323b7e1c893Smrgtypedef struct _RADEONOutputPrivateRec {
324b7e1c893Smrg    uint16_t connector_id;
325b7e1c893Smrg    uint32_t devices;
326b7e1c893Smrg    uint32_t active_device;
327209ff23fSmrg    Bool enabled;
328b7e1c893Smrg
329b7e1c893Smrg    int  load_detection;
330b7e1c893Smrg
331b7e1c893Smrg    // DVI/HDMI
332b7e1c893Smrg    Bool coherent_mode;
333b7e1c893Smrg    Bool linkb;
334b7e1c893Smrg
335b7e1c893Smrg    RADEONConnectorType ConnectorType;
336ad43ddacSmrg    uint16_t connector_object_id;
337b7e1c893Smrg    RADEONDviType DVIType;
338b7e1c893Smrg    RADEONMonitorType MonType;
339b7e1c893Smrg
340b7e1c893Smrg    // DDC info
341b7e1c893Smrg    I2CBusPtr         pI2CBus;
342b7e1c893Smrg    RADEONI2CBusRec   ddc_i2c;
343b7e1c893Smrg    Bool shared_ddc;
344ad43ddacSmrg
345ad43ddacSmrg    Bool custom_edid;
346ad43ddacSmrg    xf86MonPtr custom_mon;
347b7e1c893Smrg    // router info
348b7e1c893Smrg    // HDP info
349b7e1c893Smrg
350b7e1c893Smrg    // panel mode
351b7e1c893Smrg    radeon_native_mode_rec native_mode;
352b7e1c893Smrg
353b7e1c893Smrg    // RMX
354b7e1c893Smrg    RADEONRMXType     rmx_type;
355b7e1c893Smrg    int               Flags;
356b7e1c893Smrg
357b7e1c893Smrg    //tvout - move to encoder
358b7e1c893Smrg    radeon_tvout_rec tvout;
359b7e1c893Smrg
360b7e1c893Smrg    /* dce 3.x dig block */
361b7e1c893Smrg    int igp_lane_info;
362ad43ddacSmrg    int dig_encoder;
363b7e1c893Smrg
364b7e1c893Smrg    int pixel_clock;
365ad43ddacSmrg
366ad43ddacSmrg    /* DP - aux bus*/
367ad43ddacSmrg    I2CBusPtr dp_pI2CBus;
368ad43ddacSmrg    uint8_t ucI2cId;
369ad43ddacSmrg    char dp_bus_name[20];
370ad43ddacSmrg    uint32_t dp_i2c_addr;
371ad43ddacSmrg    Bool dp_i2c_running;
372ad43ddacSmrg    /* DP - general config */
373ad43ddacSmrg    uint8_t dpcd[8];
374ad43ddacSmrg    int dp_lane_count;
375ad43ddacSmrg    int dp_clock;
376ad43ddacSmrg    uint8_t hpd_id;
377ad43ddacSmrg    int pll_id;
378209ff23fSmrg} RADEONOutputPrivateRec, *RADEONOutputPrivatePtr;
379209ff23fSmrg
380209ff23fSmrgstruct avivo_pll_state {
381209ff23fSmrg    uint32_t ref_div_src;
382209ff23fSmrg    uint32_t ref_div;
383209ff23fSmrg    uint32_t fb_div;
384209ff23fSmrg    uint32_t post_div_src;
385209ff23fSmrg    uint32_t post_div;
386209ff23fSmrg    uint32_t ext_ppll_cntl;
387209ff23fSmrg    uint32_t pll_cntl;
388209ff23fSmrg    uint32_t int_ss_cntl;
389209ff23fSmrg};
390209ff23fSmrg
391209ff23fSmrgstruct avivo_crtc_state {
392209ff23fSmrg    uint32_t pll_source;
393209ff23fSmrg    uint32_t h_total;
394209ff23fSmrg    uint32_t h_blank_start_end;
395209ff23fSmrg    uint32_t h_sync_a;
396209ff23fSmrg    uint32_t h_sync_a_cntl;
397209ff23fSmrg    uint32_t h_sync_b;
398209ff23fSmrg    uint32_t h_sync_b_cntl;
399209ff23fSmrg    uint32_t v_total;
400209ff23fSmrg    uint32_t v_blank_start_end;
401209ff23fSmrg    uint32_t v_sync_a;
402209ff23fSmrg    uint32_t v_sync_a_cntl;
403209ff23fSmrg    uint32_t v_sync_b;
404209ff23fSmrg    uint32_t v_sync_b_cntl;
405209ff23fSmrg    uint32_t control;
406209ff23fSmrg    uint32_t blank_control;
407209ff23fSmrg    uint32_t interlace_control;
408209ff23fSmrg    uint32_t stereo_control;
409209ff23fSmrg    uint32_t cursor_control;
410209ff23fSmrg};
411209ff23fSmrg
412209ff23fSmrgstruct avivo_grph_state {
413209ff23fSmrg    uint32_t enable;
414209ff23fSmrg    uint32_t control;
415921a55d8Smrg    uint32_t swap_control;
416209ff23fSmrg    uint32_t prim_surf_addr;
417209ff23fSmrg    uint32_t sec_surf_addr;
418209ff23fSmrg    uint32_t pitch;
419921a55d8Smrg    uint32_t prim_surf_addr_hi;
420921a55d8Smrg    uint32_t sec_surf_addr_hi;
421209ff23fSmrg    uint32_t x_offset;
422209ff23fSmrg    uint32_t y_offset;
423209ff23fSmrg    uint32_t x_start;
424209ff23fSmrg    uint32_t y_start;
425209ff23fSmrg    uint32_t x_end;
426209ff23fSmrg    uint32_t y_end;
427209ff23fSmrg
428b7e1c893Smrg    uint32_t desktop_height;
429209ff23fSmrg    uint32_t viewport_start;
430209ff23fSmrg    uint32_t viewport_size;
431b7e1c893Smrg    uint32_t mode_data_format;
432209ff23fSmrg};
433209ff23fSmrg
434921a55d8Smrgstruct dce4_main_block_state {
435921a55d8Smrg    struct avivo_grph_state grph;
436921a55d8Smrg    uint32_t scl[6];
437921a55d8Smrg    uint32_t crtc[15];
438921a55d8Smrg    uint32_t fmt[10];
439921a55d8Smrg    uint32_t dig[20];
440921a55d8Smrg};
441921a55d8Smrg
442921a55d8Smrgstruct dce4_state
443921a55d8Smrg{
444921a55d8Smrg
445921a55d8Smrg    uint32_t vga1_cntl;
446921a55d8Smrg    uint32_t vga2_cntl;
447921a55d8Smrg    uint32_t vga3_cntl;
448921a55d8Smrg    uint32_t vga4_cntl;
449921a55d8Smrg    uint32_t vga5_cntl;
450921a55d8Smrg    uint32_t vga6_cntl;
451921a55d8Smrg    uint32_t vga_render_control;
452921a55d8Smrg
453921a55d8Smrg    struct dce4_main_block_state block[6];
454921a55d8Smrg
455921a55d8Smrg    uint32_t vga_pll[3][3];
456921a55d8Smrg    uint32_t pll[2][15];
457921a55d8Smrg    uint32_t pll_route[6];
458921a55d8Smrg
459921a55d8Smrg    uint32_t dac[2][26];
460921a55d8Smrg    uint32_t uniphy[6][10];
461921a55d8Smrg
462921a55d8Smrg    uint32_t dig[20];
463921a55d8Smrg};
464921a55d8Smrg
465209ff23fSmrgstruct avivo_state
466209ff23fSmrg{
467209ff23fSmrg    uint32_t hdp_fb_location;
468209ff23fSmrg    uint32_t mc_memory_map;
469209ff23fSmrg    uint32_t vga_memory_base;
470209ff23fSmrg    uint32_t vga_fb_start;
471209ff23fSmrg
472209ff23fSmrg    uint32_t vga1_cntl;
473209ff23fSmrg    uint32_t vga2_cntl;
474921a55d8Smrg    uint32_t vga3_cntl;
475921a55d8Smrg    uint32_t vga4_cntl;
476921a55d8Smrg    uint32_t vga5_cntl;
477921a55d8Smrg    uint32_t vga6_cntl;
478ad43ddacSmrg    uint32_t vga_render_control;
479209ff23fSmrg
480209ff23fSmrg    uint32_t crtc_master_en;
481209ff23fSmrg    uint32_t crtc_tv_control;
482b7e1c893Smrg    uint32_t dc_lb_memory_split;
483209ff23fSmrg
484921a55d8Smrg    struct avivo_pll_state pll[2];
485209ff23fSmrg
486b7e1c893Smrg    struct avivo_pll_state vga25_ppll;
487b7e1c893Smrg    struct avivo_pll_state vga28_ppll;
488b7e1c893Smrg    struct avivo_pll_state vga41_ppll;
489b7e1c893Smrg
490921a55d8Smrg    struct avivo_crtc_state crtc[2];
491209ff23fSmrg
492921a55d8Smrg    struct avivo_grph_state grph[2];
493209ff23fSmrg
494209ff23fSmrg    /* DDIA block on RS6xx chips */
495209ff23fSmrg    uint32_t ddia[37];
496209ff23fSmrg
497209ff23fSmrg    /* scalers */
498209ff23fSmrg    uint32_t d1scl[40];
499209ff23fSmrg    uint32_t d2scl[40];
500209ff23fSmrg    uint32_t dxscl[6+2];
501209ff23fSmrg
502209ff23fSmrg    /* dac regs */
503209ff23fSmrg    uint32_t daca[26];
504209ff23fSmrg    uint32_t dacb[26];
505209ff23fSmrg
506209ff23fSmrg    /* tmdsa */
507209ff23fSmrg    uint32_t tmdsa[31];
508209ff23fSmrg
509209ff23fSmrg    /* lvtma */
510209ff23fSmrg    uint32_t lvtma[39];
511209ff23fSmrg
512209ff23fSmrg    /* dvoa */
513209ff23fSmrg    uint32_t dvoa[16];
514209ff23fSmrg
515b7e1c893Smrg    /* DCE3+ chips */
516209ff23fSmrg    uint32_t fmt1[18];
517209ff23fSmrg    uint32_t fmt2[18];
518209ff23fSmrg    uint32_t dig1[19];
519209ff23fSmrg    uint32_t dig2[19];
520209ff23fSmrg    uint32_t hdmi1[57];
521209ff23fSmrg    uint32_t hdmi2[57];
522209ff23fSmrg    uint32_t aux_cntl1[14];
523209ff23fSmrg    uint32_t aux_cntl2[14];
524209ff23fSmrg    uint32_t aux_cntl3[14];
525209ff23fSmrg    uint32_t aux_cntl4[14];
526b7e1c893Smrg    uint32_t aux_cntl5[14];
527b7e1c893Smrg    uint32_t aux_cntl6[14];
528209ff23fSmrg    uint32_t phy[10];
529209ff23fSmrg    uint32_t uniphy1[8];
530209ff23fSmrg    uint32_t uniphy2[8];
531b7e1c893Smrg    uint32_t uniphy3[8];
532b7e1c893Smrg    uint32_t uniphy4[8];
533b7e1c893Smrg    uint32_t uniphy5[8];
534b7e1c893Smrg    uint32_t uniphy6[8];
535209ff23fSmrg
536209ff23fSmrg};
537209ff23fSmrg
538209ff23fSmrg/*
539209ff23fSmrg * Maximum length of horizontal/vertical code timing tables for state storage
540209ff23fSmrg */
541209ff23fSmrg#define MAX_H_CODE_TIMING_LEN 32
542209ff23fSmrg#define MAX_V_CODE_TIMING_LEN 32
543209ff23fSmrg
544209ff23fSmrgtypedef struct {
545209ff23fSmrg    struct avivo_state avivo;
546921a55d8Smrg    struct dce4_state dce4;
547209ff23fSmrg
548209ff23fSmrg				/* Common registers */
549209ff23fSmrg    uint32_t          ovr_clr;
550209ff23fSmrg    uint32_t          ovr_wid_left_right;
551209ff23fSmrg    uint32_t          ovr_wid_top_bottom;
552209ff23fSmrg    uint32_t          ov0_scale_cntl;
553209ff23fSmrg    uint32_t          mpp_tb_config;
554209ff23fSmrg    uint32_t          mpp_gp_config;
555209ff23fSmrg    uint32_t          subpic_cntl;
556209ff23fSmrg    uint32_t          viph_control;
557209ff23fSmrg    uint32_t          i2c_cntl_1;
558209ff23fSmrg    uint32_t          gen_int_cntl;
559209ff23fSmrg    uint32_t          cap0_trig_cntl;
560209ff23fSmrg    uint32_t          cap1_trig_cntl;
561209ff23fSmrg    uint32_t          bus_cntl;
562209ff23fSmrg
563209ff23fSmrg    uint32_t          bios_0_scratch;
564209ff23fSmrg    uint32_t          bios_1_scratch;
565209ff23fSmrg    uint32_t          bios_2_scratch;
566209ff23fSmrg    uint32_t          bios_3_scratch;
567209ff23fSmrg    uint32_t          bios_4_scratch;
568209ff23fSmrg    uint32_t          bios_5_scratch;
569209ff23fSmrg    uint32_t          bios_6_scratch;
570209ff23fSmrg    uint32_t          bios_7_scratch;
571209ff23fSmrg
572209ff23fSmrg    uint32_t          surface_cntl;
573209ff23fSmrg    uint32_t          surfaces[8][3];
574209ff23fSmrg    uint32_t          mc_agp_location;
575209ff23fSmrg    uint32_t          mc_agp_location_hi;
576209ff23fSmrg    uint32_t          mc_fb_location;
577209ff23fSmrg    uint32_t          display_base_addr;
578209ff23fSmrg    uint32_t          display2_base_addr;
579209ff23fSmrg    uint32_t          ov0_base_addr;
580209ff23fSmrg
581209ff23fSmrg				/* Other registers to save for VT switches */
582209ff23fSmrg    uint32_t          dp_datatype;
583209ff23fSmrg    uint32_t          rbbm_soft_reset;
584209ff23fSmrg    uint32_t          clock_cntl_index;
585209ff23fSmrg    uint32_t          amcgpio_en_reg;
586209ff23fSmrg    uint32_t          amcgpio_mask;
587209ff23fSmrg
588209ff23fSmrg				/* CRTC registers */
589209ff23fSmrg    uint32_t          crtc_gen_cntl;
590209ff23fSmrg    uint32_t          crtc_ext_cntl;
591209ff23fSmrg    uint32_t          dac_cntl;
592209ff23fSmrg    uint32_t          crtc_h_total_disp;
593209ff23fSmrg    uint32_t          crtc_h_sync_strt_wid;
594209ff23fSmrg    uint32_t          crtc_v_total_disp;
595209ff23fSmrg    uint32_t          crtc_v_sync_strt_wid;
596209ff23fSmrg    uint32_t          crtc_offset;
597209ff23fSmrg    uint32_t          crtc_offset_cntl;
598209ff23fSmrg    uint32_t          crtc_pitch;
599209ff23fSmrg    uint32_t          disp_merge_cntl;
600209ff23fSmrg    uint32_t          grph_buffer_cntl;
601209ff23fSmrg    uint32_t          crtc_more_cntl;
602209ff23fSmrg    uint32_t          crtc_tile_x0_y0;
603209ff23fSmrg
604209ff23fSmrg				/* CRTC2 registers */
605209ff23fSmrg    uint32_t          crtc2_gen_cntl;
606209ff23fSmrg    uint32_t          dac_macro_cntl;
607209ff23fSmrg    uint32_t          dac2_cntl;
608209ff23fSmrg    uint32_t          disp_output_cntl;
609209ff23fSmrg    uint32_t          disp_tv_out_cntl;
610209ff23fSmrg    uint32_t          disp_hw_debug;
611209ff23fSmrg    uint32_t          disp2_merge_cntl;
612209ff23fSmrg    uint32_t          grph2_buffer_cntl;
613209ff23fSmrg    uint32_t          crtc2_h_total_disp;
614209ff23fSmrg    uint32_t          crtc2_h_sync_strt_wid;
615209ff23fSmrg    uint32_t          crtc2_v_total_disp;
616209ff23fSmrg    uint32_t          crtc2_v_sync_strt_wid;
617209ff23fSmrg    uint32_t          crtc2_offset;
618209ff23fSmrg    uint32_t          crtc2_offset_cntl;
619209ff23fSmrg    uint32_t          crtc2_pitch;
620209ff23fSmrg    uint32_t          crtc2_tile_x0_y0;
621209ff23fSmrg
622209ff23fSmrg				/* Flat panel registers */
623209ff23fSmrg    uint32_t          fp_crtc_h_total_disp;
624209ff23fSmrg    uint32_t          fp_crtc_v_total_disp;
625209ff23fSmrg    uint32_t          fp_gen_cntl;
626209ff23fSmrg    uint32_t          fp2_gen_cntl;
627209ff23fSmrg    uint32_t          fp_h_sync_strt_wid;
628209ff23fSmrg    uint32_t          fp_h2_sync_strt_wid;
629209ff23fSmrg    uint32_t          fp_horz_stretch;
630209ff23fSmrg    uint32_t          fp_horz_vert_active;
631209ff23fSmrg    uint32_t          fp_panel_cntl;
632209ff23fSmrg    uint32_t          fp_v_sync_strt_wid;
633209ff23fSmrg    uint32_t          fp_v2_sync_strt_wid;
634209ff23fSmrg    uint32_t          fp_vert_stretch;
635209ff23fSmrg    uint32_t          lvds_gen_cntl;
636209ff23fSmrg    uint32_t          lvds_pll_cntl;
637209ff23fSmrg    uint32_t          tmds_pll_cntl;
638209ff23fSmrg    uint32_t          tmds_transmitter_cntl;
639209ff23fSmrg
640209ff23fSmrg				/* Computed values for PLL */
641209ff23fSmrg    uint32_t          dot_clock_freq;
642209ff23fSmrg    uint32_t          pll_output_freq;
643209ff23fSmrg    int               feedback_div;
644209ff23fSmrg    int               reference_div;
645209ff23fSmrg    int               post_div;
646209ff23fSmrg
647209ff23fSmrg				/* PLL registers */
648209ff23fSmrg    unsigned          ppll_ref_div;
649209ff23fSmrg    unsigned          ppll_div_3;
650209ff23fSmrg    uint32_t          htotal_cntl;
651209ff23fSmrg    uint32_t          vclk_ecp_cntl;
652209ff23fSmrg
653209ff23fSmrg				/* Computed values for PLL2 */
654209ff23fSmrg    uint32_t          dot_clock_freq_2;
655209ff23fSmrg    uint32_t          pll_output_freq_2;
656209ff23fSmrg    int               feedback_div_2;
657209ff23fSmrg    int               reference_div_2;
658209ff23fSmrg    int               post_div_2;
659209ff23fSmrg
660209ff23fSmrg				/* PLL2 registers */
661209ff23fSmrg    uint32_t          p2pll_ref_div;
662209ff23fSmrg    uint32_t          p2pll_div_0;
663209ff23fSmrg    uint32_t          htotal_cntl2;
664209ff23fSmrg    uint32_t          pixclks_cntl;
665209ff23fSmrg
666209ff23fSmrg				/* Pallet */
667209ff23fSmrg    Bool              palette_valid;
66840732134Srjs    Bool	      palette_saved[2];
66940732134Srjs    uint32_t          palette[2][256];
670209ff23fSmrg
671209ff23fSmrg    uint32_t          disp2_req_cntl1;
672209ff23fSmrg    uint32_t          disp2_req_cntl2;
673209ff23fSmrg    uint32_t          dmif_mem_cntl1;
674209ff23fSmrg    uint32_t          disp1_req_cntl1;
675209ff23fSmrg
676209ff23fSmrg    uint32_t          fp_2nd_gen_cntl;
677209ff23fSmrg    uint32_t          fp2_2_gen_cntl;
678209ff23fSmrg    uint32_t          tmds2_cntl;
679209ff23fSmrg    uint32_t          tmds2_transmitter_cntl;
680209ff23fSmrg
681209ff23fSmrg
682209ff23fSmrg    /* TV out registers */
683209ff23fSmrg    uint32_t 	      tv_master_cntl;
684209ff23fSmrg    uint32_t 	      tv_htotal;
685209ff23fSmrg    uint32_t 	      tv_hsize;
686209ff23fSmrg    uint32_t 	      tv_hdisp;
687209ff23fSmrg    uint32_t 	      tv_hstart;
688209ff23fSmrg    uint32_t 	      tv_vtotal;
689209ff23fSmrg    uint32_t 	      tv_vdisp;
690209ff23fSmrg    uint32_t 	      tv_timing_cntl;
691209ff23fSmrg    uint32_t 	      tv_vscaler_cntl1;
692209ff23fSmrg    uint32_t 	      tv_vscaler_cntl2;
693209ff23fSmrg    uint32_t 	      tv_sync_size;
694209ff23fSmrg    uint32_t 	      tv_vrestart;
695209ff23fSmrg    uint32_t 	      tv_hrestart;
696209ff23fSmrg    uint32_t 	      tv_frestart;
697209ff23fSmrg    uint32_t 	      tv_ftotal;
698209ff23fSmrg    uint32_t 	      tv_clock_sel_cntl;
699209ff23fSmrg    uint32_t 	      tv_clkout_cntl;
700209ff23fSmrg    uint32_t 	      tv_data_delay_a;
701209ff23fSmrg    uint32_t 	      tv_data_delay_b;
702209ff23fSmrg    uint32_t 	      tv_dac_cntl;
703209ff23fSmrg    uint32_t 	      tv_pll_cntl;
704209ff23fSmrg    uint32_t 	      tv_pll_cntl1;
705209ff23fSmrg    uint32_t	      tv_pll_fine_cntl;
706209ff23fSmrg    uint32_t 	      tv_modulator_cntl1;
707209ff23fSmrg    uint32_t 	      tv_modulator_cntl2;
708209ff23fSmrg    uint32_t 	      tv_frame_lock_cntl;
709209ff23fSmrg    uint32_t 	      tv_pre_dac_mux_cntl;
710209ff23fSmrg    uint32_t 	      tv_rgb_cntl;
711209ff23fSmrg    uint32_t 	      tv_y_saw_tooth_cntl;
712209ff23fSmrg    uint32_t 	      tv_y_rise_cntl;
713209ff23fSmrg    uint32_t 	      tv_y_fall_cntl;
714209ff23fSmrg    uint32_t 	      tv_uv_adr;
715209ff23fSmrg    uint32_t	      tv_upsamp_and_gain_cntl;
716209ff23fSmrg    uint32_t	      tv_gain_limit_settings;
717209ff23fSmrg    uint32_t	      tv_linear_gain_settings;
718209ff23fSmrg    uint32_t	      tv_crc_cntl;
719209ff23fSmrg    uint32_t          tv_sync_cntl;
720209ff23fSmrg    uint32_t	      gpiopad_a;
721209ff23fSmrg    uint32_t          pll_test_cntl;
722209ff23fSmrg
723209ff23fSmrg    uint16_t          h_code_timing[MAX_H_CODE_TIMING_LEN];
724209ff23fSmrg    uint16_t          v_code_timing[MAX_V_CODE_TIMING_LEN];
725209ff23fSmrg
726209ff23fSmrg} RADEONSaveRec, *RADEONSavePtr;
727209ff23fSmrg
728209ff23fSmrgtypedef struct
729209ff23fSmrg{
730209ff23fSmrg    Bool HasSecondary;
731209ff23fSmrg    Bool              HasCRTC2;         /* All cards except original Radeon  */
732209ff23fSmrg    /*
733209ff23fSmrg     * The next two are used to make sure CRTC2 is restored before CRTC_EXT,
734209ff23fSmrg     * otherwise it could lead to blank screens.
735209ff23fSmrg     */
736209ff23fSmrg    Bool IsSecondaryRestored;
737209ff23fSmrg    Bool RestorePrimary;
738209ff23fSmrg
739209ff23fSmrg    Bool ReversedDAC;	  /* TVDAC used as primary dac */
740209ff23fSmrg    Bool ReversedTMDS;    /* DDC_DVI is used for external TMDS */
741209ff23fSmrg    xf86CrtcPtr pCrtc[RADEON_MAX_CRTC];
742209ff23fSmrg    RADEONCrtcPrivatePtr Controller[RADEON_MAX_CRTC];
743209ff23fSmrg
744209ff23fSmrg    ScrnInfoPtr pSecondaryScrn;
745209ff23fSmrg    ScrnInfoPtr pPrimaryScrn;
746209ff23fSmrg
747209ff23fSmrg    RADEONSaveRec     ModeReg;          /* Current mode                      */
748209ff23fSmrg    RADEONSaveRec     SavedReg;         /* Original (text) mode              */
749209ff23fSmrg
750209ff23fSmrg    void              *MMIO;            /* Map of MMIO region                */
7512f39173dSmrg    int               MMIO_cnt;         /* Map of FB region refcount         */
7522f39173dSmrg    void              *FB;              /* Map of FB region                  */
7532f39173dSmrg    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 */
756921a55d8Smrg    int dri2_info_cnt;
757209ff23fSmrg} RADEONEntRec, *RADEONEntPtr;
758209ff23fSmrg
759209ff23fSmrg/* radeon_probe.c */
760209ff23fSmrgextern PciChipsets          RADEONPciChipsets[];
761209ff23fSmrg
762209ff23fSmrg/* radeon_driver.c */
763209ff23fSmrgextern Bool                 RADEONPreInit(ScrnInfoPtr, int);
76468105dcbSveegoextern Bool                 RADEONScreenInit(SCREEN_INIT_ARGS_DECL);
76568105dcbSveegoextern Bool                 RADEONSwitchMode(SWITCH_MODE_ARGS_DECL);
766209ff23fSmrg#ifdef X_XF86MiscPassMessage
767209ff23fSmrgextern Bool                 RADEONHandleMessage(int, const char*, const char*,
768209ff23fSmrg					        char**);
769209ff23fSmrg#endif
77068105dcbSveegoextern void                 RADEONAdjustFrame(ADJUST_FRAME_ARGS_DECL);
77168105dcbSveegoextern Bool                 RADEONEnterVT(VT_FUNC_ARGS_DECL);
77268105dcbSveegoextern void                 RADEONLeaveVT(VT_FUNC_ARGS_DECL);
77368105dcbSveegoextern void                 RADEONFreeScreen(FREE_SCREEN_ARGS_DECL);
77468105dcbSveegoextern ModeStatus           RADEONValidMode(SCRN_ARG_TYPE, DisplayModePtr, Bool, int);
775209ff23fSmrg
776209ff23fSmrgextern const OptionInfoRec *RADEONOptionsWeak(void);
777209ff23fSmrg
778ad43ddacSmrg#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);
786ad43ddacSmrg#endif
787ad43ddacSmrg
788209ff23fSmrg#endif /* _RADEON_PROBE_H_ */
789