legacy_crtc.c revision 51b40f85
1/*
2 * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and
3 *                VA Linux Systems Inc., Fremont, California.
4 *
5 * All Rights Reserved.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining
8 * a copy of this software and associated documentation files (the
9 * "Software"), to deal in the Software without restriction, including
10 * without limitation on the rights to use, copy, modify, merge,
11 * publish, distribute, sublicense, and/or sell copies of the Software,
12 * and to permit persons to whom the Software is furnished to do so,
13 * subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the
16 * next paragraph) shall be included in all copies or substantial
17 * portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22 * NON-INFRINGEMENT.  IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR
23 * THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
24 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26 * DEALINGS IN THE SOFTWARE.
27 */
28
29#ifdef HAVE_CONFIG_H
30#include "config.h"
31#endif
32
33#include <string.h>
34#include <stdio.h>
35
36/* X and server generic header files */
37#include "xf86.h"
38#include "xf86_OSproc.h"
39#include "vgaHW.h"
40#include "xf86Modes.h"
41
42/* Driver data structures */
43#include "radeon.h"
44#include "radeon_reg.h"
45#include "radeon_macros.h"
46#include "radeon_probe.h"
47#include "radeon_version.h"
48#include "radeon_atombios.h"
49
50#ifdef XF86DRI
51#define _XF86DRI_SERVER_
52#include "radeon_drm.h"
53#include "sarea.h"
54#ifdef DRM_IOCTL_MODESET_CTL
55#include <sys/ioctl.h>
56#endif
57#endif
58
59/* Write common registers */
60void
61RADEONRestoreCommonRegisters(ScrnInfoPtr pScrn,
62			     RADEONSavePtr restore)
63{
64    RADEONInfoPtr  info       = RADEONPTR(pScrn);
65    RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
66    unsigned char *RADEONMMIO = info->MMIO;
67
68    if (info->IsSecondary)
69      return;
70
71    OUTREG(RADEON_OVR_CLR,            restore->ovr_clr);
72    OUTREG(RADEON_OVR_WID_LEFT_RIGHT, restore->ovr_wid_left_right);
73    OUTREG(RADEON_OVR_WID_TOP_BOTTOM, restore->ovr_wid_top_bottom);
74    OUTREG(RADEON_OV0_SCALE_CNTL,     restore->ov0_scale_cntl);
75    OUTREG(RADEON_SUBPIC_CNTL,        restore->subpic_cntl);
76    OUTREG(RADEON_VIPH_CONTROL,       restore->viph_control);
77    OUTREG(RADEON_I2C_CNTL_1,         restore->i2c_cntl_1);
78    OUTREG(RADEON_GEN_INT_CNTL,       restore->gen_int_cntl);
79    OUTREG(RADEON_CAP0_TRIG_CNTL,     restore->cap0_trig_cntl);
80    OUTREG(RADEON_CAP1_TRIG_CNTL,     restore->cap1_trig_cntl);
81    OUTREG(RADEON_BUS_CNTL,           restore->bus_cntl);
82    OUTREG(RADEON_SURFACE_CNTL,       restore->surface_cntl);
83
84    if ((info->ChipFamily == CHIP_FAMILY_RS400)  ||
85	(info->ChipFamily == CHIP_FAMILY_RS480)) {
86	OUTREG(RS400_DISP2_REQ_CNTL1, restore->disp2_req_cntl1);
87	OUTREG(RS400_DISP2_REQ_CNTL2, restore->disp2_req_cntl2);
88	OUTREG(RS400_DMIF_MEM_CNTL1,  restore->dmif_mem_cntl1);
89	OUTREG(RS400_DISP1_REQ_CNTL1, restore->disp1_req_cntl1);
90    }
91
92    /* Workaround for the VT switching problem in dual-head mode.  This
93     * problem only occurs on RV style chips, typically when a FP and
94     * CRT are connected.
95     */
96    if (pRADEONEnt->HasCRTC2 &&
97	info->ChipFamily != CHIP_FAMILY_R200 &&
98	!IS_R300_VARIANT) {
99	uint32_t tmp;
100
101	tmp = INREG(RADEON_DAC_CNTL2);
102	OUTREG(RADEON_DAC_CNTL2, tmp & ~RADEON_DAC2_DAC_CLK_SEL);
103	usleep(100000);
104    }
105}
106
107void
108RADEONRestoreCrtcBase(ScrnInfoPtr pScrn,
109		      RADEONSavePtr restore)
110{
111    RADEONInfoPtr  info       = RADEONPTR(pScrn);
112    unsigned char *RADEONMMIO = info->MMIO;
113
114    if (IS_R300_VARIANT)
115	OUTREG(R300_CRTC_TILE_X0_Y0,    restore->crtc_tile_x0_y0);
116    OUTREG(RADEON_CRTC_OFFSET_CNTL,     restore->crtc_offset_cntl);
117    OUTREG(RADEON_CRTC_OFFSET,          restore->crtc_offset);
118}
119
120void
121RADEONRestoreCrtc2Base(ScrnInfoPtr pScrn,
122		       RADEONSavePtr restore)
123{
124    RADEONInfoPtr  info       = RADEONPTR(pScrn);
125    unsigned char *RADEONMMIO = info->MMIO;
126
127    if (IS_R300_VARIANT)
128	OUTREG(R300_CRTC2_TILE_X0_Y0,    restore->crtc2_tile_x0_y0);
129    OUTREG(RADEON_CRTC2_OFFSET_CNTL,     restore->crtc2_offset_cntl);
130    OUTREG(RADEON_CRTC2_OFFSET,          restore->crtc2_offset);
131}
132
133/* Write CRTC registers */
134void
135RADEONRestoreCrtcRegisters(ScrnInfoPtr pScrn,
136			   RADEONSavePtr restore)
137{
138    RADEONInfoPtr  info       = RADEONPTR(pScrn);
139    unsigned char *RADEONMMIO = info->MMIO;
140
141    xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
142		   "Programming CRTC1, offset: 0x%08x\n",
143		   (unsigned)restore->crtc_offset);
144
145    /* We prevent the CRTC from hitting the memory controller until
146     * fully programmed
147     */
148    OUTREG(RADEON_CRTC_GEN_CNTL, restore->crtc_gen_cntl |
149	   RADEON_CRTC_DISP_REQ_EN_B);
150
151    OUTREGP(RADEON_CRTC_EXT_CNTL,
152	    restore->crtc_ext_cntl,
153	    RADEON_CRTC_VSYNC_DIS |
154	    RADEON_CRTC_HSYNC_DIS |
155	    RADEON_CRTC_DISPLAY_DIS);
156
157    OUTREG(RADEON_CRTC_H_TOTAL_DISP,    restore->crtc_h_total_disp);
158    OUTREG(RADEON_CRTC_H_SYNC_STRT_WID, restore->crtc_h_sync_strt_wid);
159    OUTREG(RADEON_CRTC_V_TOTAL_DISP,    restore->crtc_v_total_disp);
160    OUTREG(RADEON_CRTC_V_SYNC_STRT_WID, restore->crtc_v_sync_strt_wid);
161
162    RADEONRestoreCrtcBase(pScrn, restore);
163
164    OUTREG(RADEON_CRTC_PITCH,           restore->crtc_pitch);
165    OUTREG(RADEON_DISP_MERGE_CNTL,      restore->disp_merge_cntl);
166
167    if (info->IsDellServer) {
168	OUTREG(RADEON_TV_DAC_CNTL, restore->tv_dac_cntl);
169	OUTREG(RADEON_DISP_HW_DEBUG, restore->disp_hw_debug);
170	OUTREG(RADEON_DAC_CNTL2, restore->dac2_cntl);
171	OUTREG(RADEON_CRTC2_GEN_CNTL, restore->crtc2_gen_cntl);
172    }
173
174    OUTREG(RADEON_CRTC_GEN_CNTL, restore->crtc_gen_cntl);
175}
176
177/* Write CRTC2 registers */
178void
179RADEONRestoreCrtc2Registers(ScrnInfoPtr pScrn,
180			    RADEONSavePtr restore)
181{
182    RADEONInfoPtr  info       = RADEONPTR(pScrn);
183    unsigned char *RADEONMMIO = info->MMIO;
184    /*    uint32_t	   crtc2_gen_cntl;*/
185
186    xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
187		   "Programming CRTC2, offset: 0x%08x\n",
188		   (unsigned)restore->crtc2_offset);
189
190    /* We prevent the CRTC from hitting the memory controller until
191     * fully programmed
192     */
193    OUTREG(RADEON_CRTC2_GEN_CNTL,
194	   restore->crtc2_gen_cntl | RADEON_CRTC2_VSYNC_DIS |
195	   RADEON_CRTC2_HSYNC_DIS | RADEON_CRTC2_DISP_DIS |
196	   RADEON_CRTC2_DISP_REQ_EN_B);
197
198    OUTREG(RADEON_CRTC2_H_TOTAL_DISP,    restore->crtc2_h_total_disp);
199    OUTREG(RADEON_CRTC2_H_SYNC_STRT_WID, restore->crtc2_h_sync_strt_wid);
200    OUTREG(RADEON_CRTC2_V_TOTAL_DISP,    restore->crtc2_v_total_disp);
201    OUTREG(RADEON_CRTC2_V_SYNC_STRT_WID, restore->crtc2_v_sync_strt_wid);
202
203    OUTREG(RADEON_FP_H2_SYNC_STRT_WID,   restore->fp_h2_sync_strt_wid);
204    OUTREG(RADEON_FP_V2_SYNC_STRT_WID,   restore->fp_v2_sync_strt_wid);
205
206    RADEONRestoreCrtc2Base(pScrn, restore);
207
208    OUTREG(RADEON_CRTC2_PITCH,           restore->crtc2_pitch);
209    OUTREG(RADEON_DISP2_MERGE_CNTL,      restore->disp2_merge_cntl);
210
211    OUTREG(RADEON_CRTC2_GEN_CNTL, restore->crtc2_gen_cntl);
212
213}
214
215static void
216RADEONPLLWaitForReadUpdateComplete(ScrnInfoPtr pScrn)
217{
218    int i = 0;
219
220    /* FIXME: Certain revisions of R300 can't recover here.  Not sure of
221       the cause yet, but this workaround will mask the problem for now.
222       Other chips usually will pass at the very first test, so the
223       workaround shouldn't have any effect on them. */
224    for (i = 0;
225	 (i < 10000 &&
226	  INPLL(pScrn, RADEON_PPLL_REF_DIV) & RADEON_PPLL_ATOMIC_UPDATE_R);
227	 i++);
228}
229
230static void
231RADEONPLLWriteUpdate(ScrnInfoPtr pScrn)
232{
233    while (INPLL(pScrn, RADEON_PPLL_REF_DIV) & RADEON_PPLL_ATOMIC_UPDATE_R);
234
235    OUTPLLP(pScrn, RADEON_PPLL_REF_DIV,
236	    RADEON_PPLL_ATOMIC_UPDATE_W,
237	    ~(RADEON_PPLL_ATOMIC_UPDATE_W));
238}
239
240static void
241RADEONPLL2WaitForReadUpdateComplete(ScrnInfoPtr pScrn)
242{
243    int i = 0;
244
245    /* FIXME: Certain revisions of R300 can't recover here.  Not sure of
246       the cause yet, but this workaround will mask the problem for now.
247       Other chips usually will pass at the very first test, so the
248       workaround shouldn't have any effect on them. */
249    for (i = 0;
250	 (i < 10000 &&
251	  INPLL(pScrn, RADEON_P2PLL_REF_DIV) & RADEON_P2PLL_ATOMIC_UPDATE_R);
252	 i++);
253}
254
255static void
256RADEONPLL2WriteUpdate(ScrnInfoPtr pScrn)
257{
258    while (INPLL(pScrn, RADEON_P2PLL_REF_DIV) & RADEON_P2PLL_ATOMIC_UPDATE_R);
259
260    OUTPLLP(pScrn, RADEON_P2PLL_REF_DIV,
261	    RADEON_P2PLL_ATOMIC_UPDATE_W,
262	    ~(RADEON_P2PLL_ATOMIC_UPDATE_W));
263}
264
265static uint8_t
266RADEONComputePLLGain(uint16_t reference_freq, uint16_t ref_div,
267		     uint16_t fb_div)
268{
269    unsigned vcoFreq;
270
271    if (!ref_div)
272	return 1;
273
274    vcoFreq = ((unsigned)reference_freq * fb_div) / ref_div;
275
276    /*
277     * This is horribly crude: the VCO frequency range is divided into
278     * 3 parts, each part having a fixed PLL gain value.
279     */
280    if (vcoFreq >= 30000)
281	/*
282	 * [300..max] MHz : 7
283	 */
284	return 7;
285    else if (vcoFreq >= 18000)
286	/*
287	 * [180..300) MHz : 4
288	 */
289        return 4;
290    else
291	/*
292	 * [0..180) MHz : 1
293	 */
294        return 1;
295}
296
297/* Write PLL registers */
298void
299RADEONRestorePLLRegisters(ScrnInfoPtr pScrn,
300			  RADEONSavePtr restore)
301{
302    RADEONInfoPtr  info       = RADEONPTR(pScrn);
303    unsigned char *RADEONMMIO = info->MMIO;
304    uint8_t pllGain;
305
306#if defined(__powerpc__)
307    /* apparently restoring the pll causes a hang??? */
308    if ((info->MacModel == RADEON_MAC_IBOOK) ||
309        (info->MacModel == RADEON_MAC_MINI_INTERNAL))
310	return;
311#endif
312
313    pllGain = RADEONComputePLLGain(info->pll.reference_freq,
314				   restore->ppll_ref_div & RADEON_PPLL_REF_DIV_MASK,
315				   restore->ppll_div_3 & RADEON_PPLL_FB3_DIV_MASK);
316
317    if (info->IsMobility) {
318        /* A temporal workaround for the occational blanking on certain laptop panels.
319           This appears to related to the PLL divider registers (fail to lock?).
320	   It occurs even when all dividers are the same with their old settings.
321           In this case we really don't need to fiddle with PLL registers.
322           By doing this we can avoid the blanking problem with some panels.
323        */
324        if ((restore->ppll_ref_div == (INPLL(pScrn, RADEON_PPLL_REF_DIV) & RADEON_PPLL_REF_DIV_MASK)) &&
325	    (restore->ppll_div_3 == (INPLL(pScrn, RADEON_PPLL_DIV_3) &
326				     (RADEON_PPLL_POST3_DIV_MASK | RADEON_PPLL_FB3_DIV_MASK)))) {
327	    OUTREGP(RADEON_CLOCK_CNTL_INDEX,
328		    RADEON_PLL_DIV_SEL,
329		    ~(RADEON_PLL_DIV_SEL));
330	    RADEONPllErrataAfterIndex(info);
331	    return;
332	}
333    }
334
335    OUTPLLP(pScrn, RADEON_VCLK_ECP_CNTL,
336	    RADEON_VCLK_SRC_SEL_CPUCLK,
337	    ~(RADEON_VCLK_SRC_SEL_MASK));
338
339    OUTPLLP(pScrn,
340	    RADEON_PPLL_CNTL,
341	    RADEON_PPLL_RESET
342	    | RADEON_PPLL_ATOMIC_UPDATE_EN
343	    | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN
344	    | ((uint32_t)pllGain << RADEON_PPLL_PVG_SHIFT),
345	    ~(RADEON_PPLL_RESET
346	      | RADEON_PPLL_ATOMIC_UPDATE_EN
347	      | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN
348	      | RADEON_PPLL_PVG_MASK));
349
350    OUTREGP(RADEON_CLOCK_CNTL_INDEX,
351	    RADEON_PLL_DIV_SEL,
352	    ~(RADEON_PLL_DIV_SEL));
353    RADEONPllErrataAfterIndex(info);
354
355    if (IS_R300_VARIANT ||
356	(info->ChipFamily == CHIP_FAMILY_RS300) ||
357	(info->ChipFamily == CHIP_FAMILY_RS400) ||
358	(info->ChipFamily == CHIP_FAMILY_RS480)) {
359	if (restore->ppll_ref_div & R300_PPLL_REF_DIV_ACC_MASK) {
360	    /* When restoring console mode, use saved PPLL_REF_DIV
361	     * setting.
362	     */
363	    OUTPLLP(pScrn, RADEON_PPLL_REF_DIV,
364		    restore->ppll_ref_div,
365		    0);
366	} else {
367	    /* R300 uses ref_div_acc field as real ref divider */
368	    OUTPLLP(pScrn, RADEON_PPLL_REF_DIV,
369		    (restore->ppll_ref_div << R300_PPLL_REF_DIV_ACC_SHIFT),
370		    ~R300_PPLL_REF_DIV_ACC_MASK);
371	}
372    } else {
373	OUTPLLP(pScrn, RADEON_PPLL_REF_DIV,
374		restore->ppll_ref_div,
375		~RADEON_PPLL_REF_DIV_MASK);
376    }
377
378    OUTPLLP(pScrn, RADEON_PPLL_DIV_3,
379	    restore->ppll_div_3,
380	    ~RADEON_PPLL_FB3_DIV_MASK);
381
382    OUTPLLP(pScrn, RADEON_PPLL_DIV_3,
383	    restore->ppll_div_3,
384	    ~RADEON_PPLL_POST3_DIV_MASK);
385
386    RADEONPLLWriteUpdate(pScrn);
387    RADEONPLLWaitForReadUpdateComplete(pScrn);
388
389    OUTPLL(pScrn, RADEON_HTOTAL_CNTL, restore->htotal_cntl);
390
391    OUTPLLP(pScrn, RADEON_PPLL_CNTL,
392	    0,
393	    ~(RADEON_PPLL_RESET
394	      | RADEON_PPLL_SLEEP
395	      | RADEON_PPLL_ATOMIC_UPDATE_EN
396	      | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN));
397
398    xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
399		   "Wrote: 0x%08x 0x%08x 0x%08x (0x%08x)\n",
400		   restore->ppll_ref_div,
401		   restore->ppll_div_3,
402		   (unsigned)restore->htotal_cntl,
403		   INPLL(pScrn, RADEON_PPLL_CNTL));
404    xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
405		   "Wrote: rd=%d, fd=%d, pd=%d\n",
406		   restore->ppll_ref_div & RADEON_PPLL_REF_DIV_MASK,
407		   restore->ppll_div_3 & RADEON_PPLL_FB3_DIV_MASK,
408		   (restore->ppll_div_3 & RADEON_PPLL_POST3_DIV_MASK) >> 16);
409
410    usleep(50000); /* Let the clock to lock */
411
412    OUTPLLP(pScrn, RADEON_VCLK_ECP_CNTL,
413	    RADEON_VCLK_SRC_SEL_PPLLCLK,
414	    ~(RADEON_VCLK_SRC_SEL_MASK));
415
416    /*OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL, restore->vclk_ecp_cntl);*/
417
418    ErrorF("finished PLL1\n");
419
420}
421
422/* Write PLL2 registers */
423void
424RADEONRestorePLL2Registers(ScrnInfoPtr pScrn,
425			   RADEONSavePtr restore)
426{
427    RADEONInfoPtr  info       = RADEONPTR(pScrn);
428    uint8_t pllGain;
429
430    pllGain = RADEONComputePLLGain(info->pll.reference_freq,
431                                   restore->p2pll_ref_div & RADEON_P2PLL_REF_DIV_MASK,
432                                   restore->p2pll_div_0 & RADEON_P2PLL_FB0_DIV_MASK);
433
434
435    OUTPLLP(pScrn, RADEON_PIXCLKS_CNTL,
436	    RADEON_PIX2CLK_SRC_SEL_CPUCLK,
437	    ~(RADEON_PIX2CLK_SRC_SEL_MASK));
438
439    OUTPLLP(pScrn,
440	    RADEON_P2PLL_CNTL,
441	    RADEON_P2PLL_RESET
442	    | RADEON_P2PLL_ATOMIC_UPDATE_EN
443	    | ((uint32_t)pllGain << RADEON_P2PLL_PVG_SHIFT),
444	    ~(RADEON_P2PLL_RESET
445	      | RADEON_P2PLL_ATOMIC_UPDATE_EN
446	      | RADEON_P2PLL_PVG_MASK));
447
448
449    OUTPLLP(pScrn, RADEON_P2PLL_REF_DIV,
450	    restore->p2pll_ref_div,
451	    ~RADEON_P2PLL_REF_DIV_MASK);
452
453    OUTPLLP(pScrn, RADEON_P2PLL_DIV_0,
454	    restore->p2pll_div_0,
455	    ~RADEON_P2PLL_FB0_DIV_MASK);
456
457    OUTPLLP(pScrn, RADEON_P2PLL_DIV_0,
458	    restore->p2pll_div_0,
459	    ~RADEON_P2PLL_POST0_DIV_MASK);
460
461    RADEONPLL2WriteUpdate(pScrn);
462    RADEONPLL2WaitForReadUpdateComplete(pScrn);
463
464    OUTPLL(pScrn, RADEON_HTOTAL2_CNTL, restore->htotal_cntl2);
465
466    OUTPLLP(pScrn, RADEON_P2PLL_CNTL,
467	    0,
468	    ~(RADEON_P2PLL_RESET
469	      | RADEON_P2PLL_SLEEP
470	      | RADEON_P2PLL_ATOMIC_UPDATE_EN));
471
472    xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
473		   "Wrote2: 0x%08x 0x%08x 0x%08x (0x%08x)\n",
474		   (unsigned)restore->p2pll_ref_div,
475		   (unsigned)restore->p2pll_div_0,
476		   (unsigned)restore->htotal_cntl2,
477		   INPLL(pScrn, RADEON_P2PLL_CNTL));
478    xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
479		   "Wrote2: rd=%u, fd=%u, pd=%u\n",
480		   (unsigned)restore->p2pll_ref_div & RADEON_P2PLL_REF_DIV_MASK,
481		   (unsigned)restore->p2pll_div_0 & RADEON_P2PLL_FB0_DIV_MASK,
482		   (unsigned)((restore->p2pll_div_0 &
483			       RADEON_P2PLL_POST0_DIV_MASK) >>16));
484
485    usleep(5000); /* Let the clock to lock */
486
487    OUTPLLP(pScrn, RADEON_PIXCLKS_CNTL,
488	    RADEON_PIX2CLK_SRC_SEL_P2PLLCLK,
489	    ~(RADEON_PIX2CLK_SRC_SEL_MASK));
490
491    OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, restore->pixclks_cntl);
492
493    ErrorF("finished PLL2\n");
494
495}
496
497/* Read common registers */
498void
499RADEONSaveCommonRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save)
500{
501    RADEONInfoPtr  info       = RADEONPTR(pScrn);
502    unsigned char *RADEONMMIO = info->MMIO;
503
504    save->ovr_clr            = INREG(RADEON_OVR_CLR);
505    save->ovr_wid_left_right = INREG(RADEON_OVR_WID_LEFT_RIGHT);
506    save->ovr_wid_top_bottom = INREG(RADEON_OVR_WID_TOP_BOTTOM);
507    save->ov0_scale_cntl     = INREG(RADEON_OV0_SCALE_CNTL);
508    save->subpic_cntl        = INREG(RADEON_SUBPIC_CNTL);
509    save->viph_control       = INREG(RADEON_VIPH_CONTROL);
510    save->i2c_cntl_1         = INREG(RADEON_I2C_CNTL_1);
511    save->gen_int_cntl       = INREG(RADEON_GEN_INT_CNTL);
512    save->cap0_trig_cntl     = INREG(RADEON_CAP0_TRIG_CNTL);
513    save->cap1_trig_cntl     = INREG(RADEON_CAP1_TRIG_CNTL);
514    save->bus_cntl           = INREG(RADEON_BUS_CNTL);
515    save->surface_cntl	     = INREG(RADEON_SURFACE_CNTL);
516    save->grph_buffer_cntl   = INREG(RADEON_GRPH_BUFFER_CNTL);
517    save->grph2_buffer_cntl  = INREG(RADEON_GRPH2_BUFFER_CNTL);
518
519    if ((info->ChipFamily == CHIP_FAMILY_RS400) ||
520	(info->ChipFamily == CHIP_FAMILY_RS480)) {
521	save->disp2_req_cntl1 = INREG(RS400_DISP2_REQ_CNTL1);
522	save->disp2_req_cntl2 = INREG(RS400_DISP2_REQ_CNTL2);
523	save->dmif_mem_cntl1  = INREG(RS400_DMIF_MEM_CNTL1);
524	save->disp1_req_cntl1 = INREG(RS400_DISP1_REQ_CNTL1);
525    }
526}
527
528/* Read CRTC registers */
529void
530RADEONSaveCrtcRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save)
531{
532    RADEONInfoPtr  info       = RADEONPTR(pScrn);
533    unsigned char *RADEONMMIO = info->MMIO;
534
535    save->crtc_gen_cntl        = INREG(RADEON_CRTC_GEN_CNTL);
536    save->crtc_ext_cntl        = INREG(RADEON_CRTC_EXT_CNTL);
537    save->crtc_h_total_disp    = INREG(RADEON_CRTC_H_TOTAL_DISP);
538    save->crtc_h_sync_strt_wid = INREG(RADEON_CRTC_H_SYNC_STRT_WID);
539    save->crtc_v_total_disp    = INREG(RADEON_CRTC_V_TOTAL_DISP);
540    save->crtc_v_sync_strt_wid = INREG(RADEON_CRTC_V_SYNC_STRT_WID);
541
542    save->crtc_offset          = INREG(RADEON_CRTC_OFFSET);
543    save->crtc_offset_cntl     = INREG(RADEON_CRTC_OFFSET_CNTL);
544    save->crtc_pitch           = INREG(RADEON_CRTC_PITCH);
545    save->disp_merge_cntl      = INREG(RADEON_DISP_MERGE_CNTL);
546
547    if (IS_R300_VARIANT)
548	save->crtc_tile_x0_y0 =  INREG(R300_CRTC_TILE_X0_Y0);
549
550    if (info->IsDellServer) {
551	save->tv_dac_cntl      = INREG(RADEON_TV_DAC_CNTL);
552	save->dac2_cntl        = INREG(RADEON_DAC_CNTL2);
553	save->disp_hw_debug    = INREG (RADEON_DISP_HW_DEBUG);
554	save->crtc2_gen_cntl   = INREG(RADEON_CRTC2_GEN_CNTL);
555    }
556
557    /* track if the crtc is enabled for text restore */
558    if (save->crtc_ext_cntl & RADEON_CRTC_DISPLAY_DIS)
559	info->crtc_on = FALSE;
560    else
561	info->crtc_on = TRUE;
562
563}
564
565/* Read CRTC2 registers */
566void
567RADEONSaveCrtc2Registers(ScrnInfoPtr pScrn, RADEONSavePtr save)
568{
569    RADEONInfoPtr  info       = RADEONPTR(pScrn);
570    unsigned char *RADEONMMIO = info->MMIO;
571
572    save->crtc2_gen_cntl        = INREG(RADEON_CRTC2_GEN_CNTL);
573    save->crtc2_h_total_disp    = INREG(RADEON_CRTC2_H_TOTAL_DISP);
574    save->crtc2_h_sync_strt_wid = INREG(RADEON_CRTC2_H_SYNC_STRT_WID);
575    save->crtc2_v_total_disp    = INREG(RADEON_CRTC2_V_TOTAL_DISP);
576    save->crtc2_v_sync_strt_wid = INREG(RADEON_CRTC2_V_SYNC_STRT_WID);
577
578    save->crtc2_offset          = INREG(RADEON_CRTC2_OFFSET);
579    save->crtc2_offset_cntl     = INREG(RADEON_CRTC2_OFFSET_CNTL);
580    save->crtc2_pitch           = INREG(RADEON_CRTC2_PITCH);
581
582    if (IS_R300_VARIANT)
583	save->crtc2_tile_x0_y0 =  INREG(R300_CRTC2_TILE_X0_Y0);
584
585    save->fp_h2_sync_strt_wid   = INREG (RADEON_FP_H2_SYNC_STRT_WID);
586    save->fp_v2_sync_strt_wid   = INREG (RADEON_FP_V2_SYNC_STRT_WID);
587
588    save->disp2_merge_cntl      = INREG(RADEON_DISP2_MERGE_CNTL);
589
590    /* track if the crtc is enabled for text restore */
591    if (save->crtc2_gen_cntl & RADEON_CRTC2_DISP_DIS)
592	info->crtc2_on = FALSE;
593    else
594	info->crtc2_on = TRUE;
595
596}
597
598/* Read PLL registers */
599void
600RADEONSavePLLRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save)
601{
602    save->ppll_ref_div = INPLL(pScrn, RADEON_PPLL_REF_DIV);
603    save->ppll_div_3   = INPLL(pScrn, RADEON_PPLL_DIV_3);
604    save->htotal_cntl  = INPLL(pScrn, RADEON_HTOTAL_CNTL);
605    save->vclk_ecp_cntl = INPLL(pScrn, RADEON_VCLK_ECP_CNTL);
606
607    xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
608		   "Read: 0x%08x 0x%08x 0x%08x\n",
609		   save->ppll_ref_div,
610		   save->ppll_div_3,
611		   (unsigned)save->htotal_cntl);
612    xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
613		   "Read: rd=%d, fd=%d, pd=%d\n",
614		   save->ppll_ref_div & RADEON_PPLL_REF_DIV_MASK,
615		   save->ppll_div_3 & RADEON_PPLL_FB3_DIV_MASK,
616		   (save->ppll_div_3 & RADEON_PPLL_POST3_DIV_MASK) >> 16);
617}
618
619/* Read PLL registers */
620void
621RADEONSavePLL2Registers(ScrnInfoPtr pScrn, RADEONSavePtr save)
622{
623    save->p2pll_ref_div = INPLL(pScrn, RADEON_P2PLL_REF_DIV);
624    save->p2pll_div_0   = INPLL(pScrn, RADEON_P2PLL_DIV_0);
625    save->htotal_cntl2  = INPLL(pScrn, RADEON_HTOTAL2_CNTL);
626    save->pixclks_cntl  = INPLL(pScrn, RADEON_PIXCLKS_CNTL);
627
628    xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
629		   "Read: 0x%08x 0x%08x 0x%08x\n",
630		   (unsigned)save->p2pll_ref_div,
631		   (unsigned)save->p2pll_div_0,
632		   (unsigned)save->htotal_cntl2);
633    xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
634		   "Read: rd=%u, fd=%u, pd=%u\n",
635		   (unsigned)(save->p2pll_ref_div & RADEON_P2PLL_REF_DIV_MASK),
636		   (unsigned)(save->p2pll_div_0 & RADEON_P2PLL_FB0_DIV_MASK),
637		   (unsigned)((save->p2pll_div_0 & RADEON_P2PLL_POST0_DIV_MASK)
638			      >> 16));
639}
640
641void
642radeon_crtc_modeset_ioctl(xf86CrtcPtr crtc, Bool post)
643{
644#if defined(XF86DRI) && defined(DRM_IOCTL_MODESET_CTL)
645    RADEONInfoPtr info = RADEONPTR(crtc->scrn);
646    RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
647    struct drm_modeset_ctl modeset;
648    unsigned char *RADEONMMIO = info->MMIO;
649
650    if (!info->directRenderingEnabled)
651	return;
652
653    if (info->ChipFamily >= CHIP_FAMILY_R600)
654	return;
655
656    modeset.crtc = radeon_crtc->crtc_id;
657    modeset.cmd = post ? _DRM_POST_MODESET : _DRM_PRE_MODESET;
658
659    ioctl(info->dri->drmFD, DRM_IOCTL_MODESET_CTL, &modeset);
660
661    info->ModeReg->gen_int_cntl = INREG( RADEON_GEN_INT_CNTL );
662#endif
663}
664
665void
666legacy_crtc_dpms(xf86CrtcPtr crtc, int mode)
667{
668    uint32_t mask;
669    RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
670    RADEONEntPtr pRADEONEnt = RADEONEntPriv(crtc->scrn);
671    unsigned char *RADEONMMIO = pRADEONEnt->MMIO;
672
673    if (radeon_crtc->crtc_id)
674	mask = (RADEON_CRTC2_DISP_DIS |
675		RADEON_CRTC2_VSYNC_DIS |
676		RADEON_CRTC2_HSYNC_DIS |
677		RADEON_CRTC2_DISP_REQ_EN_B);
678    else
679	mask = (RADEON_CRTC_DISPLAY_DIS |
680		RADEON_CRTC_HSYNC_DIS |
681		RADEON_CRTC_VSYNC_DIS);
682
683    switch(mode) {
684    case DPMSModeOn:
685	if (radeon_crtc->crtc_id) {
686	    OUTREGP(RADEON_CRTC2_GEN_CNTL, RADEON_CRTC2_EN, ~(RADEON_CRTC2_EN | mask));
687	} else {
688	    OUTREGP(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_EN, ~(RADEON_CRTC_EN | RADEON_CRTC_DISP_REQ_EN_B));
689	    OUTREGP(RADEON_CRTC_EXT_CNTL, 0, ~mask);
690	}
691	break;
692    case DPMSModeStandby:
693    case DPMSModeSuspend:
694    case DPMSModeOff:
695	if (radeon_crtc->crtc_id) {
696	    OUTREGP(RADEON_CRTC2_GEN_CNTL, mask, ~(RADEON_CRTC2_EN | mask));
697	} else {
698	    OUTREGP(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_DISP_REQ_EN_B, ~(RADEON_CRTC_EN | RADEON_CRTC_DISP_REQ_EN_B));
699	    OUTREGP(RADEON_CRTC_EXT_CNTL, mask, ~mask);
700	}
701	break;
702    }
703}
704
705
706/* Define common registers for requested video mode */
707void
708RADEONInitCommonRegisters(RADEONSavePtr save, RADEONInfoPtr info)
709{
710    save->ovr_clr            = 0;
711    save->ovr_wid_left_right = 0;
712    save->ovr_wid_top_bottom = 0;
713    save->ov0_scale_cntl     = 0;
714    save->subpic_cntl        = 0;
715    save->viph_control       = 0;
716    save->i2c_cntl_1         = 0;
717    save->rbbm_soft_reset    = 0;
718    save->cap0_trig_cntl     = 0;
719    save->cap1_trig_cntl     = 0;
720    save->bus_cntl           = info->BusCntl;
721
722    if ((info->ChipFamily == CHIP_FAMILY_RS400) ||
723	(info->ChipFamily == CHIP_FAMILY_RS480)) {
724	save->disp2_req_cntl1 = info->SavedReg->disp2_req_cntl1;
725	save->disp2_req_cntl2 = info->SavedReg->disp2_req_cntl2;
726	save->dmif_mem_cntl1  = info->SavedReg->dmif_mem_cntl1;
727	save->disp1_req_cntl1 = info->SavedReg->disp1_req_cntl1;
728    }
729
730    /*
731     * If bursts are enabled, turn on discards
732     * Radeon doesn't have write bursts
733     */
734    if (save->bus_cntl & (RADEON_BUS_READ_BURST))
735	save->bus_cntl |= RADEON_BUS_RD_DISCARD_EN;
736}
737
738void
739RADEONInitSurfaceCntl(xf86CrtcPtr crtc, RADEONSavePtr save)
740{
741    save->surface_cntl = 0;
742
743#if X_BYTE_ORDER == X_BIG_ENDIAN
744    /* We must set both apertures as they can be both used to map the entire
745     * video memory. -BenH.
746     */
747    switch (crtc->scrn->bitsPerPixel) {
748    case 16:
749	save->surface_cntl |= RADEON_NONSURF_AP0_SWP_16BPP;
750	save->surface_cntl |= RADEON_NONSURF_AP1_SWP_16BPP;
751	break;
752
753    case 32:
754	save->surface_cntl |= RADEON_NONSURF_AP0_SWP_32BPP;
755	save->surface_cntl |= RADEON_NONSURF_AP1_SWP_32BPP;
756	break;
757    }
758#endif
759
760}
761
762void
763RADEONInitCrtcBase(xf86CrtcPtr crtc, RADEONSavePtr save,
764		   int x, int y)
765{
766    ScrnInfoPtr pScrn = crtc->scrn;
767    RADEONInfoPtr  info       = RADEONPTR(pScrn);
768    int    Base;
769#ifdef XF86DRI
770    drm_radeon_sarea_t *pSAREAPriv;
771    XF86DRISAREAPtr pSAREA;
772#endif
773
774    save->crtc_offset      = pScrn->fbOffset;
775#ifdef XF86DRI
776    if (info->dri && info->dri->allowPageFlip)
777	save->crtc_offset_cntl = RADEON_CRTC_OFFSET_FLIP_CNTL;
778    else
779#endif
780	save->crtc_offset_cntl = 0;
781
782    if (info->tilingEnabled && (crtc->rotatedData == NULL)) {
783       if (IS_R300_VARIANT)
784          save->crtc_offset_cntl |= (R300_CRTC_X_Y_MODE_EN |
785				     R300_CRTC_MICRO_TILE_BUFFER_DIS |
786				     R300_CRTC_MACRO_TILE_EN);
787       else
788          save->crtc_offset_cntl |= RADEON_CRTC_TILE_EN;
789    }
790    else {
791       if (IS_R300_VARIANT)
792          save->crtc_offset_cntl &= ~(R300_CRTC_X_Y_MODE_EN |
793				      R300_CRTC_MICRO_TILE_BUFFER_DIS |
794				      R300_CRTC_MACRO_TILE_EN);
795       else
796          save->crtc_offset_cntl &= ~RADEON_CRTC_TILE_EN;
797    }
798
799    Base = pScrn->fbOffset;
800
801    if (info->tilingEnabled && (crtc->rotatedData == NULL)) {
802        if (IS_R300_VARIANT) {
803	/* On r300/r400 when tiling is enabled crtc_offset is set to the address of
804	 * the surface.  the x/y offsets are handled by the X_Y tile reg for each crtc
805	 * Makes tiling MUCH easier.
806	 */
807             save->crtc_tile_x0_y0 = x | (y << 16);
808             Base &= ~0x7ff;
809         } else {
810	     /* note we cannot really simply use the info->ModeReg.crtc_offset_cntl value, since the
811		drm might have set FLIP_CNTL since we wrote that. Unfortunately FLIP_CNTL causes
812		flickering when scrolling vertically in a virtual screen, possibly because crtc will
813		pick up the new offset value at the end of each scanline, but the new offset_cntl value
814		only after a vsync. We'd probably need to wait (in drm) for vsync and only then update
815		OFFSET and OFFSET_CNTL, if the y coord has changed. Seems hard to fix. */
816	     /*save->crtc_offset_cntl = INREG(RADEON_CRTC_OFFSET_CNTL) & ~0xf;*/
817#if 0
818	     /* try to get rid of flickering when scrolling at least for 2d */
819#ifdef XF86DRI
820	     if (!info->have3DWindows)
821#endif
822		 save->crtc_offset_cntl &= ~RADEON_CRTC_OFFSET_FLIP_CNTL;
823#endif
824
825             int byteshift = info->CurrentLayout.bitsPerPixel >> 4;
826             /* crtc uses 256(bytes)x8 "half-tile" start addresses? */
827             int tile_addr = (((y >> 3) * info->CurrentLayout.displayWidth + x) >> (8 - byteshift)) << 11;
828             Base += tile_addr + ((x << byteshift) % 256) + ((y % 8) << 8);
829             save->crtc_offset_cntl = save->crtc_offset_cntl | (y % 16);
830         }
831    }
832    else {
833       int offset = y * info->CurrentLayout.displayWidth + x;
834       switch (info->CurrentLayout.pixel_code) {
835       case 15:
836       case 16: offset *= 2; break;
837       case 24: offset *= 3; break;
838       case 32: offset *= 4; break;
839       }
840       Base += offset;
841    }
842
843    if (crtc->rotatedData != NULL) {
844	Base = pScrn->fbOffset + (char *)crtc->rotatedData - (char *)info->FB;
845    }
846
847    Base &= ~7;                 /* 3 lower bits are always 0 */
848
849
850#ifdef XF86DRI
851    if (info->directRenderingInited) {
852	/* note cannot use pScrn->pScreen since this is unitialized when called from
853	   RADEONScreenInit, and we need to call from there to get mergedfb + pageflip working */
854        /*** NOTE: r3/4xx will need sarea and drm pageflip updates to handle the xytile regs for
855	 *** pageflipping!
856	 ***/
857	pSAREAPriv = DRIGetSAREAPrivate(screenInfo.screens[pScrn->scrnIndex]);
858	/* can't get at sarea in a semi-sane way? */
859	pSAREA = (void *)((char*)pSAREAPriv - sizeof(XF86DRISAREARec));
860
861	pSAREA->frame.x = (Base  / info->CurrentLayout.pixel_bytes)
862	    % info->CurrentLayout.displayWidth;
863	pSAREA->frame.y = (Base / info->CurrentLayout.pixel_bytes)
864	    / info->CurrentLayout.displayWidth;
865	pSAREA->frame.width = pScrn->frameX1 - x + 1;
866	pSAREA->frame.height = pScrn->frameY1 - y + 1;
867
868	if (pSAREAPriv->pfCurrentPage == 1) {
869	    Base += info->dri->backOffset - info->dri->frontOffset;
870	}
871    }
872#endif
873    save->crtc_offset = Base;
874
875}
876
877/* Define CRTC registers for requested video mode */
878static Bool
879RADEONInitCrtcRegisters(xf86CrtcPtr crtc, RADEONSavePtr save,
880			DisplayModePtr mode)
881{
882    ScrnInfoPtr pScrn = crtc->scrn;
883    RADEONInfoPtr  info       = RADEONPTR(pScrn);
884    int    format;
885    int    hsync_start;
886    int    hsync_wid;
887    int    vsync_wid;
888
889    switch (info->CurrentLayout.pixel_code) {
890    case 4:  format = 1; break;
891    case 8:  format = 2; break;
892    case 15: format = 3; break;      /*  555 */
893    case 16: format = 4; break;      /*  565 */
894    case 24: format = 5; break;      /*  RGB */
895    case 32: format = 6; break;      /* xRGB */
896    default:
897	xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
898		   "Unsupported pixel depth (%d)\n",
899		   info->CurrentLayout.bitsPerPixel);
900	return FALSE;
901    }
902
903    /*save->bios_4_scratch = info->SavedReg->bios_4_scratch;*/
904    save->crtc_gen_cntl = (RADEON_CRTC_EXT_DISP_EN
905			   | (format << 8)
906			   | ((mode->Flags & V_DBLSCAN)
907			      ? RADEON_CRTC_DBL_SCAN_EN
908			      : 0)
909			   | ((mode->Flags & V_CSYNC)
910			      ? RADEON_CRTC_CSYNC_EN
911			      : 0)
912			   | ((mode->Flags & V_INTERLACE)
913			      ? RADEON_CRTC_INTERLACE_EN
914			      : 0));
915
916    /* 200M freezes on VT switch sometimes if CRTC is disabled */
917    if ((info->ChipFamily == CHIP_FAMILY_RS400) ||
918	(info->ChipFamily == CHIP_FAMILY_RS480))
919	save->crtc_gen_cntl |= RADEON_CRTC_EN;
920
921    save->crtc_ext_cntl |= (RADEON_XCRT_CNT_EN|
922			    RADEON_CRTC_VSYNC_DIS |
923			    RADEON_CRTC_HSYNC_DIS |
924			    RADEON_CRTC_DISPLAY_DIS);
925
926    save->disp_merge_cntl = info->SavedReg->disp_merge_cntl;
927    save->disp_merge_cntl &= ~RADEON_DISP_RGB_OFFSET_EN;
928
929    save->crtc_h_total_disp = ((((mode->CrtcHTotal / 8) - 1) & 0x3ff)
930			       | ((((mode->CrtcHDisplay / 8) - 1) & 0x1ff)
931				  << 16));
932
933    hsync_wid = (mode->CrtcHSyncEnd - mode->CrtcHSyncStart) / 8;
934    if (!hsync_wid)       hsync_wid = 1;
935    hsync_start = mode->CrtcHSyncStart - 8;
936
937    save->crtc_h_sync_strt_wid = ((hsync_start & 0x1fff)
938				  | ((hsync_wid & 0x3f) << 16)
939				  | ((mode->Flags & V_NHSYNC)
940				     ? RADEON_CRTC_H_SYNC_POL
941				     : 0));
942
943				/* This works for double scan mode. */
944    save->crtc_v_total_disp = (((mode->CrtcVTotal - 1) & 0xffff)
945			       | ((mode->CrtcVDisplay - 1) << 16));
946
947    vsync_wid = mode->CrtcVSyncEnd - mode->CrtcVSyncStart;
948    if (!vsync_wid)       vsync_wid = 1;
949
950    save->crtc_v_sync_strt_wid = (((mode->CrtcVSyncStart - 1) & 0xfff)
951				  | ((vsync_wid & 0x1f) << 16)
952				  | ((mode->Flags & V_NVSYNC)
953				     ? RADEON_CRTC_V_SYNC_POL
954				     : 0));
955
956    save->crtc_pitch  = (((pScrn->displayWidth * pScrn->bitsPerPixel) +
957			  ((pScrn->bitsPerPixel * 8) -1)) /
958			 (pScrn->bitsPerPixel * 8));
959    save->crtc_pitch |= save->crtc_pitch << 16;
960
961    if (info->IsDellServer) {
962	save->dac2_cntl = info->SavedReg->dac2_cntl;
963	save->tv_dac_cntl = info->SavedReg->tv_dac_cntl;
964	save->crtc2_gen_cntl = info->SavedReg->crtc2_gen_cntl;
965	save->disp_hw_debug = info->SavedReg->disp_hw_debug;
966
967	save->dac2_cntl &= ~RADEON_DAC2_DAC_CLK_SEL;
968	save->dac2_cntl |= RADEON_DAC2_DAC2_CLK_SEL;
969
970	/* For CRT on DAC2, don't turn it on if BIOS didn't
971	   enable it, even it's detected.
972	*/
973	save->disp_hw_debug |= RADEON_CRT2_DISP1_SEL;
974	save->tv_dac_cntl &= ~((1<<2) | (3<<8) | (7<<24) | (0xff<<16));
975	save->tv_dac_cntl |= (0x03 | (2<<8) | (0x58<<16));
976    }
977
978    return TRUE;
979}
980
981
982void
983RADEONInitCrtc2Base(xf86CrtcPtr crtc, RADEONSavePtr save,
984		    int x, int y)
985{
986    ScrnInfoPtr pScrn = crtc->scrn;
987    RADEONInfoPtr  info       = RADEONPTR(pScrn);
988    int    Base;
989#ifdef XF86DRI
990    drm_radeon_sarea_t *pSAREAPriv;
991    XF86DRISAREAPtr pSAREA;
992#endif
993
994    /* It seems all fancy options apart from pflip can be safely disabled
995     */
996    save->crtc2_offset      = pScrn->fbOffset;
997#ifdef XF86DRI
998    if (info->dri && info->dri->allowPageFlip)
999	save->crtc2_offset_cntl = RADEON_CRTC_OFFSET_FLIP_CNTL;
1000    else
1001#endif
1002	save->crtc2_offset_cntl = 0;
1003
1004    if (info->tilingEnabled && (crtc->rotatedData == NULL)) {
1005       if (IS_R300_VARIANT)
1006          save->crtc2_offset_cntl |= (R300_CRTC_X_Y_MODE_EN |
1007				      R300_CRTC_MICRO_TILE_BUFFER_DIS |
1008				      R300_CRTC_MACRO_TILE_EN);
1009       else
1010          save->crtc2_offset_cntl |= RADEON_CRTC_TILE_EN;
1011    }
1012    else {
1013       if (IS_R300_VARIANT)
1014          save->crtc2_offset_cntl &= ~(R300_CRTC_X_Y_MODE_EN |
1015				      R300_CRTC_MICRO_TILE_BUFFER_DIS |
1016				      R300_CRTC_MACRO_TILE_EN);
1017       else
1018          save->crtc2_offset_cntl &= ~RADEON_CRTC_TILE_EN;
1019    }
1020
1021    Base = pScrn->fbOffset;
1022
1023    if (info->tilingEnabled && (crtc->rotatedData == NULL)) {
1024        if (IS_R300_VARIANT) {
1025	/* On r300/r400 when tiling is enabled crtc_offset is set to the address of
1026	 * the surface.  the x/y offsets are handled by the X_Y tile reg for each crtc
1027	 * Makes tiling MUCH easier.
1028	 */
1029             save->crtc2_tile_x0_y0 = x | (y << 16);
1030             Base &= ~0x7ff;
1031         } else {
1032	     /* note we cannot really simply use the info->ModeReg.crtc_offset_cntl value, since the
1033		drm might have set FLIP_CNTL since we wrote that. Unfortunately FLIP_CNTL causes
1034		flickering when scrolling vertically in a virtual screen, possibly because crtc will
1035		pick up the new offset value at the end of each scanline, but the new offset_cntl value
1036		only after a vsync. We'd probably need to wait (in drm) for vsync and only then update
1037		OFFSET and OFFSET_CNTL, if the y coord has changed. Seems hard to fix. */
1038	     /*save->crtc2_offset_cntl = INREG(RADEON_CRTC2_OFFSET_CNTL) & ~0xf;*/
1039#if 0
1040	     /* try to get rid of flickering when scrolling at least for 2d */
1041#ifdef XF86DRI
1042	     if (!info->have3DWindows)
1043#endif
1044		 save->crtc2_offset_cntl &= ~RADEON_CRTC_OFFSET_FLIP_CNTL;
1045#endif
1046
1047             int byteshift = info->CurrentLayout.bitsPerPixel >> 4;
1048             /* crtc uses 256(bytes)x8 "half-tile" start addresses? */
1049             int tile_addr = (((y >> 3) * info->CurrentLayout.displayWidth + x) >> (8 - byteshift)) << 11;
1050             Base += tile_addr + ((x << byteshift) % 256) + ((y % 8) << 8);
1051             save->crtc2_offset_cntl = save->crtc_offset_cntl | (y % 16);
1052         }
1053    }
1054    else {
1055       int offset = y * info->CurrentLayout.displayWidth + x;
1056       switch (info->CurrentLayout.pixel_code) {
1057       case 15:
1058       case 16: offset *= 2; break;
1059       case 24: offset *= 3; break;
1060       case 32: offset *= 4; break;
1061       }
1062       Base += offset;
1063    }
1064
1065    if (crtc->rotatedData != NULL) {
1066	Base = pScrn->fbOffset + (char *)crtc->rotatedData - (char *)info->FB;
1067    }
1068
1069    Base &= ~7;                 /* 3 lower bits are always 0 */
1070
1071#ifdef XF86DRI
1072    if (info->directRenderingInited) {
1073	/* note cannot use pScrn->pScreen since this is unitialized when called from
1074	   RADEONScreenInit, and we need to call from there to get mergedfb + pageflip working */
1075        /*** NOTE: r3/4xx will need sarea and drm pageflip updates to handle the xytile regs for
1076	 *** pageflipping!
1077	 ***/
1078	pSAREAPriv = DRIGetSAREAPrivate(screenInfo.screens[pScrn->scrnIndex]);
1079	/* can't get at sarea in a semi-sane way? */
1080	pSAREA = (void *)((char*)pSAREAPriv - sizeof(XF86DRISAREARec));
1081
1082	pSAREAPriv->crtc2_base = Base;
1083
1084	if (pSAREAPriv->pfCurrentPage == 1) {
1085	    Base += info->dri->backOffset - info->dri->frontOffset;
1086	}
1087    }
1088#endif
1089    save->crtc2_offset = Base;
1090
1091}
1092
1093
1094/* Define CRTC2 registers for requested video mode */
1095static Bool
1096RADEONInitCrtc2Registers(xf86CrtcPtr crtc, RADEONSavePtr save,
1097			 DisplayModePtr mode)
1098{
1099    ScrnInfoPtr pScrn = crtc->scrn;
1100    RADEONInfoPtr  info       = RADEONPTR(pScrn);
1101    int    format;
1102    int    hsync_start;
1103    int    hsync_wid;
1104    int    vsync_wid;
1105
1106    switch (info->CurrentLayout.pixel_code) {
1107    case 4:  format = 1; break;
1108    case 8:  format = 2; break;
1109    case 15: format = 3; break;      /*  555 */
1110    case 16: format = 4; break;      /*  565 */
1111    case 24: format = 5; break;      /*  RGB */
1112    case 32: format = 6; break;      /* xRGB */
1113    default:
1114	xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
1115		   "Unsupported pixel depth (%d)\n",
1116		   info->CurrentLayout.bitsPerPixel);
1117	return FALSE;
1118    }
1119
1120    save->crtc2_h_total_disp =
1121	((((mode->CrtcHTotal / 8) - 1) & 0x3ff)
1122	 | ((((mode->CrtcHDisplay / 8) - 1) & 0x1ff) << 16));
1123
1124    hsync_wid = (mode->CrtcHSyncEnd - mode->CrtcHSyncStart) / 8;
1125    if (!hsync_wid)       hsync_wid = 1;
1126    hsync_start = mode->CrtcHSyncStart - 8;
1127
1128    save->crtc2_h_sync_strt_wid = ((hsync_start & 0x1fff)
1129				   | ((hsync_wid & 0x3f) << 16)
1130				   | ((mode->Flags & V_NHSYNC)
1131				      ? RADEON_CRTC_H_SYNC_POL
1132				      : 0));
1133
1134				/* This works for double scan mode. */
1135    save->crtc2_v_total_disp = (((mode->CrtcVTotal - 1) & 0xffff)
1136				| ((mode->CrtcVDisplay - 1) << 16));
1137
1138    vsync_wid = mode->CrtcVSyncEnd - mode->CrtcVSyncStart;
1139    if (!vsync_wid)       vsync_wid = 1;
1140
1141    save->crtc2_v_sync_strt_wid = (((mode->CrtcVSyncStart - 1) & 0xfff)
1142				   | ((vsync_wid & 0x1f) << 16)
1143				   | ((mode->Flags & V_NVSYNC)
1144				      ? RADEON_CRTC2_V_SYNC_POL
1145				      : 0));
1146
1147    save->crtc2_pitch  = ((pScrn->displayWidth * pScrn->bitsPerPixel) +
1148			  ((pScrn->bitsPerPixel * 8) -1)) / (pScrn->bitsPerPixel * 8);
1149    save->crtc2_pitch |= save->crtc2_pitch << 16;
1150
1151    /* check to see if TV DAC is enabled for another crtc and keep it enabled */
1152    if (save->crtc2_gen_cntl & RADEON_CRTC2_CRT2_ON)
1153	save->crtc2_gen_cntl = RADEON_CRTC2_CRT2_ON;
1154    else
1155	save->crtc2_gen_cntl = 0;
1156
1157    save->crtc2_gen_cntl |= ((format << 8)
1158			     | RADEON_CRTC2_VSYNC_DIS
1159			     | RADEON_CRTC2_HSYNC_DIS
1160			     | RADEON_CRTC2_DISP_DIS
1161			     | ((mode->Flags & V_DBLSCAN)
1162				? RADEON_CRTC2_DBL_SCAN_EN
1163				: 0)
1164			     | ((mode->Flags & V_CSYNC)
1165				? RADEON_CRTC2_CSYNC_EN
1166				: 0)
1167			     | ((mode->Flags & V_INTERLACE)
1168				? RADEON_CRTC2_INTERLACE_EN
1169				: 0));
1170
1171    /* 200M freezes on VT switch sometimes if CRTC is disabled */
1172    if ((info->ChipFamily == CHIP_FAMILY_RS400) ||
1173	(info->ChipFamily == CHIP_FAMILY_RS480))
1174	save->crtc2_gen_cntl |= RADEON_CRTC2_EN;
1175
1176    save->disp2_merge_cntl = info->SavedReg->disp2_merge_cntl;
1177    save->disp2_merge_cntl &= ~(RADEON_DISP2_RGB_OFFSET_EN);
1178
1179    save->fp_h2_sync_strt_wid = save->crtc2_h_sync_strt_wid;
1180    save->fp_v2_sync_strt_wid = save->crtc2_v_sync_strt_wid;
1181
1182    return TRUE;
1183}
1184
1185
1186/* Define PLL registers for requested video mode */
1187static void
1188RADEONInitPLLRegisters(xf86CrtcPtr crtc, RADEONSavePtr save,
1189		       RADEONPLLPtr pll, DisplayModePtr mode,
1190		       int flags)
1191{
1192    RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
1193    ScrnInfoPtr pScrn = crtc->scrn;
1194    RADEONInfoPtr  info       = RADEONPTR(pScrn);
1195    uint32_t feedback_div = 0;
1196    uint32_t frac_fb_div = 0;
1197    uint32_t reference_div = 0;
1198    uint32_t post_divider = 0;
1199    uint32_t freq = 0;
1200
1201    struct {
1202	int divider;
1203	int bitvalue;
1204    } *post_div, post_divs[]   = {
1205				/* From RAGE 128 VR/RAGE 128 GL Register
1206				 * Reference Manual (Technical Reference
1207				 * Manual P/N RRG-G04100-C Rev. 0.04), page
1208				 * 3-17 (PLL_DIV_[3:0]).
1209				 */
1210	{  1, 0 },              /* VCLK_SRC                 */
1211	{  2, 1 },              /* VCLK_SRC/2               */
1212	{  4, 2 },              /* VCLK_SRC/4               */
1213	{  8, 3 },              /* VCLK_SRC/8               */
1214	{  3, 4 },              /* VCLK_SRC/3               */
1215	{ 16, 5 },              /* VCLK_SRC/16              */
1216	{  6, 6 },              /* VCLK_SRC/6               */
1217	{ 12, 7 },              /* VCLK_SRC/12              */
1218	{  0, 0 }
1219    };
1220
1221
1222    if ((flags & RADEON_PLL_USE_BIOS_DIVS) && info->UseBiosDividers) {
1223       save->ppll_ref_div = info->RefDivider;
1224       save->ppll_div_3   = info->FeedbackDivider | (info->PostDivider << 16);
1225       save->htotal_cntl  = 0;
1226       return;
1227    }
1228
1229    if (xf86ReturnOptValBool(info->Options, OPTION_NEW_PLL, FALSE))
1230	radeon_crtc->pll_algo = RADEON_PLL_NEW;
1231    else
1232	radeon_crtc->pll_algo = RADEON_PLL_OLD;
1233
1234    RADEONComputePLL(crtc, pll, mode->Clock, &freq,
1235		     &feedback_div, &frac_fb_div, &reference_div, &post_divider, flags);
1236
1237    for (post_div = &post_divs[0]; post_div->divider; ++post_div) {
1238	if (post_div->divider == post_divider)
1239	    break;
1240    }
1241
1242    if (!post_div->divider) {
1243	save->pll_output_freq = freq;
1244	post_div = &post_divs[0];
1245    }
1246
1247    save->dot_clock_freq = freq;
1248    save->feedback_div   = feedback_div;
1249    save->reference_div  = reference_div;
1250    save->post_div       = post_divider;
1251
1252    xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
1253		   "dc=%u, of=%u, fd=%d, rd=%d, pd=%d\n",
1254		   (unsigned)save->dot_clock_freq,
1255		   (unsigned)save->pll_output_freq,
1256		   save->feedback_div,
1257		   save->reference_div,
1258		   save->post_div);
1259
1260    save->ppll_ref_div   = save->reference_div;
1261
1262#if defined(__powerpc__)
1263    /* apparently programming this otherwise causes a hang??? */
1264    if ((info->MacModel == RADEON_MAC_IBOOK) ||
1265        (info->MacModel == RADEON_MAC_MINI_INTERNAL))
1266	save->ppll_div_3 = 0x000600ad;
1267    else
1268#endif
1269    save->ppll_div_3     = (save->feedback_div | (post_div->bitvalue << 16));
1270
1271    save->htotal_cntl    = mode->HTotal & 0x7;
1272
1273    save->vclk_ecp_cntl = (info->SavedReg->vclk_ecp_cntl &
1274	    ~RADEON_VCLK_SRC_SEL_MASK) | RADEON_VCLK_SRC_SEL_PPLLCLK;
1275}
1276
1277/* Define PLL2 registers for requested video mode */
1278static void
1279RADEONInitPLL2Registers(xf86CrtcPtr crtc, RADEONSavePtr save,
1280			RADEONPLLPtr pll, DisplayModePtr mode,
1281			int flags)
1282{
1283    RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
1284    ScrnInfoPtr pScrn = crtc->scrn;
1285    RADEONInfoPtr  info       = RADEONPTR(pScrn);
1286    uint32_t feedback_div = 0;
1287    uint32_t frac_fb_div = 0;
1288    uint32_t reference_div = 0;
1289    uint32_t post_divider = 0;
1290    uint32_t freq = 0;
1291
1292    struct {
1293	int divider;
1294	int bitvalue;
1295    } *post_div, post_divs[]   = {
1296				/* From RAGE 128 VR/RAGE 128 GL Register
1297				 * Reference Manual (Technical Reference
1298				 * Manual P/N RRG-G04100-C Rev. 0.04), page
1299				 * 3-17 (PLL_DIV_[3:0]).
1300				 */
1301	{  1, 0 },              /* VCLK_SRC                 */
1302	{  2, 1 },              /* VCLK_SRC/2               */
1303	{  4, 2 },              /* VCLK_SRC/4               */
1304	{  8, 3 },              /* VCLK_SRC/8               */
1305	{  3, 4 },              /* VCLK_SRC/3               */
1306	{  6, 6 },              /* VCLK_SRC/6               */
1307	{ 12, 7 },              /* VCLK_SRC/12              */
1308	{  0, 0 }
1309    };
1310
1311    if ((flags & RADEON_PLL_USE_BIOS_DIVS) && info->UseBiosDividers) {
1312       save->p2pll_ref_div = info->RefDivider;
1313       save->p2pll_div_0   = info->FeedbackDivider | (info->PostDivider << 16);
1314       save->htotal_cntl2  = 0;
1315       return;
1316    }
1317
1318    if (xf86ReturnOptValBool(info->Options, OPTION_NEW_PLL, FALSE))
1319	radeon_crtc->pll_algo = RADEON_PLL_NEW;
1320    else
1321	radeon_crtc->pll_algo = RADEON_PLL_OLD;
1322
1323    RADEONComputePLL(crtc, pll, mode->Clock, &freq,
1324		     &feedback_div, &frac_fb_div, &reference_div, &post_divider, flags);
1325
1326    for (post_div = &post_divs[0]; post_div->divider; ++post_div) {
1327	if (post_div->divider == post_divider)
1328	    break;
1329    }
1330
1331    if (!post_div->divider) {
1332	save->pll_output_freq_2 = freq;
1333	post_div = &post_divs[0];
1334    }
1335
1336    save->dot_clock_freq_2 = freq;
1337    save->feedback_div_2   = feedback_div;
1338    save->reference_div_2  = reference_div;
1339    save->post_div_2       = post_divider;
1340
1341    xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
1342		   "dc=%u, of=%u, fd=%d, rd=%d, pd=%d\n",
1343		   (unsigned)save->dot_clock_freq_2,
1344		   (unsigned)save->pll_output_freq_2,
1345		   save->feedback_div_2,
1346		   save->reference_div_2,
1347		   save->post_div_2);
1348
1349    save->p2pll_ref_div    = save->reference_div_2;
1350
1351    save->p2pll_div_0      = (save->feedback_div_2 |
1352			      (post_div->bitvalue << 16));
1353
1354    save->htotal_cntl2     = mode->HTotal & 0x7;
1355
1356    save->pixclks_cntl     = ((info->SavedReg->pixclks_cntl &
1357			       ~(RADEON_PIX2CLK_SRC_SEL_MASK)) |
1358			      RADEON_PIX2CLK_SRC_SEL_P2PLLCLK);
1359}
1360
1361static void
1362radeon_update_tv_routing(ScrnInfoPtr pScrn, RADEONSavePtr restore)
1363{
1364    /* pixclks_cntl controls tv clock routing */
1365    OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, restore->pixclks_cntl);
1366}
1367
1368/* Calculate display buffer watermark to prevent buffer underflow */
1369void
1370RADEONInitDispBandwidthLegacy(ScrnInfoPtr pScrn,
1371			      DisplayModePtr mode1, int pixel_bytes1,
1372			      DisplayModePtr mode2, int pixel_bytes2)
1373{
1374    RADEONInfoPtr info = RADEONPTR(pScrn);
1375    RADEONEntPtr pRADEONEnt   = RADEONEntPriv(pScrn);
1376    unsigned char *RADEONMMIO = info->MMIO;
1377
1378    uint32_t temp, data, mem_trcd, mem_trp, mem_tras, mem_trbs=0;
1379    float mem_tcas;
1380    int k1, c;
1381
1382    float MemTcas[8]  = {0, 1, 2, 3, 0, 1.5, 2.5, 0.0};
1383    float MemTcas_rs480[8]  = {0, 1, 2, 3, 0, 1.5, 2.5, 3.5};
1384    float MemTcas2[8] = {0, 1, 2, 3, 4, 5, 6, 7};
1385    float MemTrbs[8]  = {1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5};
1386    float MemTrbs_r4xx[8]  = {4, 5, 6, 7, 8, 9, 10, 11};
1387
1388    float mem_bw, peak_disp_bw;
1389    float min_mem_eff = 0.8;
1390    float sclk_eff, sclk_delay;
1391    float mc_latency_mclk, mc_latency_sclk, cur_latency_mclk, cur_latency_sclk;
1392    float disp_latency, disp_latency_overhead, disp_drain_rate = 0, disp_drain_rate2;
1393    float pix_clk, pix_clk2; /* in MHz */
1394    int cur_size = 16;       /* in octawords */
1395    int critical_point = 0, critical_point2;
1396    int stop_req, max_stop_req;
1397    float read_return_rate, time_disp1_drop_priority;
1398
1399    /*
1400     * Set display0/1 priority up on r3/4xx in the memory controller for
1401     * high res modes if the user specifies HIGH for displaypriority
1402     * option.
1403     */
1404    if ((info->DispPriority == 2) && IS_R300_VARIANT) {
1405	uint32_t mc_init_misc_lat_timer = INREG(R300_MC_INIT_MISC_LAT_TIMER);
1406	mc_init_misc_lat_timer &= ~(R300_MC_DISP1R_INIT_LAT_MASK << R300_MC_DISP1R_INIT_LAT_SHIFT);
1407	mc_init_misc_lat_timer &= ~(R300_MC_DISP0R_INIT_LAT_MASK << R300_MC_DISP0R_INIT_LAT_SHIFT);
1408	if (pRADEONEnt->pCrtc[1]->enabled)
1409	    mc_init_misc_lat_timer |= (1 << R300_MC_DISP1R_INIT_LAT_SHIFT); /* display 1 */
1410	if (pRADEONEnt->pCrtc[0]->enabled)
1411	    mc_init_misc_lat_timer |= (1 << R300_MC_DISP0R_INIT_LAT_SHIFT); /* display 0 */
1412	OUTREG(R300_MC_INIT_MISC_LAT_TIMER, mc_init_misc_lat_timer);
1413    }
1414
1415    /*
1416     * Determine if there is enough bandwidth for current display mode
1417     */
1418    mem_bw = info->mclk * (info->RamWidth / 8) * (info->IsDDR ? 2 : 1);
1419
1420    pix_clk = 0;
1421    pix_clk2 = 0;
1422    peak_disp_bw = 0;
1423    if (mode1) {
1424	pix_clk = mode1->Clock/1000.0;
1425	peak_disp_bw += (pix_clk * pixel_bytes1);
1426    }
1427    if (mode2) {
1428	pix_clk2 = mode2->Clock/1000.0;
1429	peak_disp_bw += (pix_clk2 * pixel_bytes2);
1430    }
1431
1432    if (peak_disp_bw >= mem_bw * min_mem_eff) {
1433	xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
1434		   "You may not have enough display bandwidth for current mode\n"
1435		   "If you have flickering problem, try to lower resolution, refresh rate, or color depth\n");
1436    }
1437
1438    /*  Get values from the EXT_MEM_CNTL register...converting its contents. */
1439    temp = INREG(RADEON_MEM_TIMING_CNTL);
1440    if ((info->ChipFamily == CHIP_FAMILY_RV100) || info->IsIGP) { /* RV100, M6, IGPs */
1441	mem_trcd = ((temp >> 2) & 0x3) + 1;
1442	mem_trp  = ((temp & 0x3)) + 1;
1443	mem_tras = ((temp & 0x70) >> 4) + 1;
1444    } else if (info->ChipFamily == CHIP_FAMILY_R300 ||
1445	       info->ChipFamily == CHIP_FAMILY_R350) { /* r300, r350 */
1446	mem_trcd = (temp & 0x7) + 1;
1447	mem_trp = ((temp >> 8) & 0x7) + 1;
1448	mem_tras = ((temp >> 11) & 0xf) + 4;
1449    } else if (info->ChipFamily == CHIP_FAMILY_RV350 ||
1450	       info->ChipFamily <= CHIP_FAMILY_RV380) {
1451	/* rv3x0 */
1452	mem_trcd = (temp & 0x7) + 3;
1453	mem_trp = ((temp >> 8) & 0x7) + 3;
1454	mem_tras = ((temp >> 11) & 0xf) + 6;
1455    } else if (info->ChipFamily == CHIP_FAMILY_R420 ||
1456	       info->ChipFamily == CHIP_FAMILY_RV410) {
1457	/* r4xx */
1458	mem_trcd = (temp & 0xf) + 3;
1459	if (mem_trcd > 15)
1460	    mem_trcd = 15;
1461	mem_trp = ((temp >> 8) & 0xf) + 3;
1462	if (mem_trp > 15)
1463	    mem_trp = 15;
1464	mem_tras = ((temp >> 12) & 0x1f) + 6;
1465	if (mem_tras > 31)
1466	    mem_tras = 31;
1467    } else { /* RV200, R200 */
1468	mem_trcd = (temp & 0x7) + 1;
1469	mem_trp = ((temp >> 8) & 0x7) + 1;
1470	mem_tras = ((temp >> 12) & 0xf) + 4;
1471    }
1472
1473    /* Get values from the MEM_SDRAM_MODE_REG register...converting its */
1474    temp = INREG(RADEON_MEM_SDRAM_MODE_REG);
1475    data = (temp & (7<<20)) >> 20;
1476    if ((info->ChipFamily == CHIP_FAMILY_RV100) || info->IsIGP) { /* RV100, M6, IGPs */
1477	if (info->ChipFamily == CHIP_FAMILY_RS480) /* don't think rs400 */
1478	    mem_tcas = MemTcas_rs480[data];
1479	else
1480	    mem_tcas = MemTcas[data];
1481    } else {
1482	mem_tcas = MemTcas2 [data];
1483    }
1484    if (info->ChipFamily == CHIP_FAMILY_RS400 ||
1485	info->ChipFamily == CHIP_FAMILY_RS480) {
1486	/* extra cas latency stored in bits 23-25 0-4 clocks */
1487	data = (temp >> 23) & 0x7;
1488	if (data < 5)
1489	    mem_tcas += data;
1490    }
1491
1492    if (IS_R300_VARIANT && !info->IsIGP) {
1493	/* on the R300, Tcas is included in Trbs.
1494	 */
1495	temp = INREG(RADEON_MEM_CNTL);
1496	data = (R300_MEM_NUM_CHANNELS_MASK & temp);
1497	if (data == 1) {
1498	    if (R300_MEM_USE_CD_CH_ONLY & temp) {
1499		temp  = INREG(R300_MC_IND_INDEX);
1500		temp &= ~R300_MC_IND_ADDR_MASK;
1501		temp |= R300_MC_READ_CNTL_CD_mcind;
1502		OUTREG(R300_MC_IND_INDEX, temp);
1503		temp  = INREG(R300_MC_IND_DATA);
1504		data = (R300_MEM_RBS_POSITION_C_MASK & temp);
1505	    } else {
1506		temp = INREG(R300_MC_READ_CNTL_AB);
1507		data = (R300_MEM_RBS_POSITION_A_MASK & temp);
1508	    }
1509	} else {
1510	    temp = INREG(R300_MC_READ_CNTL_AB);
1511	    data = (R300_MEM_RBS_POSITION_A_MASK & temp);
1512	}
1513
1514	if (info->ChipFamily == CHIP_FAMILY_RV410 ||
1515	    info->ChipFamily == CHIP_FAMILY_R420)
1516	    mem_trbs = MemTrbs_r4xx[data];
1517	else
1518	    mem_trbs = MemTrbs[data];
1519	mem_tcas += mem_trbs;
1520    }
1521
1522    if ((info->ChipFamily == CHIP_FAMILY_RV100) || info->IsIGP) { /* RV100, M6, IGPs */
1523	/* DDR64 SCLK_EFF = SCLK for analysis */
1524	sclk_eff = info->sclk;
1525    } else {
1526#ifdef XF86DRI
1527	if (info->directRenderingEnabled)
1528	    sclk_eff = info->sclk - (info->dri->agpMode * 50.0 / 3.0);
1529	else
1530#endif
1531	    sclk_eff = info->sclk;
1532    }
1533
1534    /*
1535      Find the memory controller latency for the display client.
1536    */
1537    if (IS_R300_VARIANT) {
1538	/*not enough for R350 ???*/
1539	/*
1540	if (!mode2) sclk_delay = 150;
1541	else {
1542	    if (info->RamWidth == 256) sclk_delay = 87;
1543	    else sclk_delay = 97;
1544	}
1545	*/
1546	sclk_delay = 250;
1547    } else {
1548	if ((info->ChipFamily == CHIP_FAMILY_RV100) ||
1549	    info->IsIGP) {
1550	    if (info->IsDDR) sclk_delay = 41;
1551	    else sclk_delay = 33;
1552	} else {
1553	    if (info->RamWidth == 128) sclk_delay = 57;
1554	    else sclk_delay = 41;
1555	}
1556    }
1557
1558    mc_latency_sclk = sclk_delay / sclk_eff;
1559
1560    if (info->IsDDR) {
1561	if (info->RamWidth == 32) {
1562	    k1 = 40;
1563	    c  = 3;
1564	} else {
1565	    k1 = 20;
1566	    c  = 1;
1567	}
1568    } else {
1569	k1 = 40;
1570	c  = 3;
1571    }
1572    mc_latency_mclk = ((2.0*mem_trcd + mem_tcas*c + 4.0*mem_tras + 4.0*mem_trp + k1) /
1573		       info->mclk) + (4.0 / sclk_eff);
1574
1575    /*
1576      HW cursor time assuming worst case of full size colour cursor.
1577    */
1578    cur_latency_mclk = (mem_trp + MAX(mem_tras, (mem_trcd + 2*(cur_size - (info->IsDDR+1))))) / info->mclk;
1579    cur_latency_sclk = cur_size / sclk_eff;
1580
1581    /*
1582      Find the total latency for the display data.
1583    */
1584    disp_latency_overhead = 8.0 / info->sclk;
1585    mc_latency_mclk = mc_latency_mclk + disp_latency_overhead + cur_latency_mclk;
1586    mc_latency_sclk = mc_latency_sclk + disp_latency_overhead + cur_latency_sclk;
1587    disp_latency = MAX(mc_latency_mclk, mc_latency_sclk);
1588
1589    /* setup Max GRPH_STOP_REQ default value */
1590    if (IS_RV100_VARIANT)
1591	max_stop_req = 0x5c;
1592    else
1593	max_stop_req  = 0x7c;
1594
1595    if (mode1) {
1596	/*  CRTC1
1597	    Set GRPH_BUFFER_CNTL register using h/w defined optimal values.
1598	    GRPH_STOP_REQ <= MIN[ 0x7C, (CRTC_H_DISP + 1) * (bit depth) / 0x10 ]
1599	*/
1600	stop_req = mode1->HDisplay * pixel_bytes1 / 16;
1601
1602	if (stop_req > max_stop_req)
1603	    stop_req = max_stop_req;
1604
1605	/*
1606	  Find the drain rate of the display buffer.
1607	*/
1608	disp_drain_rate = pix_clk / (16.0/pixel_bytes1);
1609
1610	/*
1611	  Find the critical point of the display buffer.
1612	*/
1613	critical_point= (uint32_t)(disp_drain_rate * disp_latency + 0.5);
1614
1615	/* ???? */
1616	/*
1617	  temp = (info->SavedReg.grph_buffer_cntl & RADEON_GRPH_CRITICAL_POINT_MASK) >> RADEON_GRPH_CRITICAL_POINT_SHIFT;
1618	  if (critical_point < temp) critical_point = temp;
1619	*/
1620	if (info->DispPriority == 2) {
1621	    critical_point = 0;
1622	}
1623
1624	/*
1625	  The critical point should never be above max_stop_req-4.  Setting
1626	  GRPH_CRITICAL_CNTL = 0 will thus force high priority all the time.
1627	*/
1628	if (max_stop_req - critical_point < 4) critical_point = 0;
1629
1630	if (critical_point == 0 && mode2 && info->ChipFamily == CHIP_FAMILY_R300) {
1631	    /* some R300 cards have problem with this set to 0, when CRTC2 is enabled.*/
1632	    critical_point = 0x10;
1633	}
1634
1635	temp = info->SavedReg->grph_buffer_cntl;
1636	temp &= ~(RADEON_GRPH_STOP_REQ_MASK);
1637	temp |= (stop_req << RADEON_GRPH_STOP_REQ_SHIFT);
1638	temp &= ~(RADEON_GRPH_START_REQ_MASK);
1639	if ((info->ChipFamily == CHIP_FAMILY_R350) &&
1640	    (stop_req > 0x15)) {
1641	    stop_req -= 0x10;
1642	}
1643	temp |= (stop_req << RADEON_GRPH_START_REQ_SHIFT);
1644
1645	temp |= RADEON_GRPH_BUFFER_SIZE;
1646	temp &= ~(RADEON_GRPH_CRITICAL_CNTL   |
1647		  RADEON_GRPH_CRITICAL_AT_SOF |
1648		  RADEON_GRPH_STOP_CNTL);
1649	/*
1650	  Write the result into the register.
1651	*/
1652	OUTREG(RADEON_GRPH_BUFFER_CNTL, ((temp & ~RADEON_GRPH_CRITICAL_POINT_MASK) |
1653					 (critical_point << RADEON_GRPH_CRITICAL_POINT_SHIFT)));
1654
1655#if 0
1656	if ((info->ChipFamily == CHIP_FAMILY_RS400) ||
1657	    (info->ChipFamily == CHIP_FAMILY_RS480)) {
1658	    /* attempt to program RS400 disp regs correctly ??? */
1659	    temp = info->SavedReg->disp1_req_cntl1;
1660	    temp &= ~(RS400_DISP1_START_REQ_LEVEL_MASK |
1661		      RS400_DISP1_STOP_REQ_LEVEL_MASK);
1662	    OUTREG(RS400_DISP1_REQ_CNTL1, (temp |
1663					   (critical_point << RS400_DISP1_START_REQ_LEVEL_SHIFT) |
1664					   (critical_point << RS400_DISP1_STOP_REQ_LEVEL_SHIFT)));
1665	    temp = info->SavedReg->dmif_mem_cntl1;
1666	    temp &= ~(RS400_DISP1_CRITICAL_POINT_START_MASK |
1667		      RS400_DISP1_CRITICAL_POINT_STOP_MASK);
1668	    OUTREG(RS400_DMIF_MEM_CNTL1, (temp |
1669					  (critical_point << RS400_DISP1_CRITICAL_POINT_START_SHIFT) |
1670					  (critical_point << RS400_DISP1_CRITICAL_POINT_STOP_SHIFT)));
1671	}
1672#endif
1673
1674	xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
1675		       "GRPH_BUFFER_CNTL from %x to %x\n",
1676		       (unsigned int)info->SavedReg->grph_buffer_cntl,
1677		       (unsigned int)INREG(RADEON_GRPH_BUFFER_CNTL));
1678    }
1679
1680    if (mode2) {
1681	stop_req = mode2->HDisplay * pixel_bytes2 / 16;
1682
1683	if (stop_req > max_stop_req) stop_req = max_stop_req;
1684
1685	/*
1686	  Find the drain rate of the display buffer.
1687	*/
1688	disp_drain_rate2 = pix_clk2 / (16.0/pixel_bytes2);
1689
1690	temp = info->SavedReg->grph2_buffer_cntl;
1691	temp &= ~(RADEON_GRPH_STOP_REQ_MASK);
1692	temp |= (stop_req << RADEON_GRPH_STOP_REQ_SHIFT);
1693	temp &= ~(RADEON_GRPH_START_REQ_MASK);
1694	if ((info->ChipFamily == CHIP_FAMILY_R350) &&
1695	    (stop_req > 0x15)) {
1696	    stop_req -= 0x10;
1697	}
1698	temp |= (stop_req << RADEON_GRPH_START_REQ_SHIFT);
1699	temp |= RADEON_GRPH_BUFFER_SIZE;
1700	temp &= ~(RADEON_GRPH_CRITICAL_CNTL   |
1701		  RADEON_GRPH_CRITICAL_AT_SOF |
1702		  RADEON_GRPH_STOP_CNTL);
1703
1704	if ((info->ChipFamily == CHIP_FAMILY_RS100) ||
1705	    (info->ChipFamily == CHIP_FAMILY_RS200))
1706	    critical_point2 = 0;
1707	else {
1708	    read_return_rate = MIN(info->sclk, info->mclk*(info->RamWidth*(info->IsDDR+1)/128));
1709	    if (mode1)
1710		time_disp1_drop_priority = critical_point / (read_return_rate - disp_drain_rate);
1711	    else
1712		time_disp1_drop_priority = 0;
1713
1714	    critical_point2 = (uint32_t)((disp_latency + time_disp1_drop_priority +
1715					disp_latency) * disp_drain_rate2 + 0.5);
1716
1717	    if (info->DispPriority == 2) {
1718		critical_point2 = 0;
1719	    }
1720
1721	    if (max_stop_req - critical_point2 < 4) critical_point2 = 0;
1722
1723	}
1724
1725	if (critical_point2 == 0 && info->ChipFamily == CHIP_FAMILY_R300) {
1726	    /* some R300 cards have problem with this set to 0 */
1727	    critical_point2 = 0x10;
1728	}
1729
1730	OUTREG(RADEON_GRPH2_BUFFER_CNTL, ((temp & ~RADEON_GRPH_CRITICAL_POINT_MASK) |
1731					  (critical_point2 << RADEON_GRPH_CRITICAL_POINT_SHIFT)));
1732
1733	if ((info->ChipFamily == CHIP_FAMILY_RS400) ||
1734	    (info->ChipFamily == CHIP_FAMILY_RS480)) {
1735#if 0
1736	    /* attempt to program RS400 disp2 regs correctly ??? */
1737	    temp = info->SavedReg->disp2_req_cntl1;
1738	    temp &= ~(RS400_DISP2_START_REQ_LEVEL_MASK |
1739		      RS400_DISP2_STOP_REQ_LEVEL_MASK);
1740	    OUTREG(RS400_DISP2_REQ_CNTL1, (temp |
1741					   (critical_point2 << RS400_DISP1_START_REQ_LEVEL_SHIFT) |
1742					   (critical_point2 << RS400_DISP1_STOP_REQ_LEVEL_SHIFT)));
1743	    temp = info->SavedReg->disp2_req_cntl2;
1744	    temp &= ~(RS400_DISP2_CRITICAL_POINT_START_MASK |
1745		      RS400_DISP2_CRITICAL_POINT_STOP_MASK);
1746	    OUTREG(RS400_DISP2_REQ_CNTL2, (temp |
1747					   (critical_point2 << RS400_DISP2_CRITICAL_POINT_START_SHIFT) |
1748					   (critical_point2 << RS400_DISP2_CRITICAL_POINT_STOP_SHIFT)));
1749#endif
1750	    OUTREG(RS400_DISP2_REQ_CNTL1, 0x105DC1CC);
1751	    OUTREG(RS400_DISP2_REQ_CNTL2, 0x2749D000);
1752	    OUTREG(RS400_DMIF_MEM_CNTL1,  0x29CA71DC);
1753	    OUTREG(RS400_DISP1_REQ_CNTL1, 0x28FBC3AC);
1754	}
1755
1756	xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
1757		       "GRPH2_BUFFER_CNTL from %x to %x\n",
1758		       (unsigned int)info->SavedReg->grph2_buffer_cntl,
1759		       (unsigned int)INREG(RADEON_GRPH2_BUFFER_CNTL));
1760    }
1761}
1762
1763void
1764legacy_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode,
1765		     DisplayModePtr adjusted_mode, int x, int y)
1766{
1767    ScrnInfoPtr pScrn = crtc->scrn;
1768    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
1769    RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
1770    RADEONInfoPtr info = RADEONPTR(pScrn);
1771    int i = 0;
1772    double dot_clock = 0;
1773    int pll_flags = RADEON_PLL_LEGACY;
1774    Bool update_tv_routing = FALSE;
1775    Bool tilingChanged = FALSE;
1776
1777    if (adjusted_mode->Clock > 200000) /* range limits??? */
1778	pll_flags |= RADEON_PLL_PREFER_HIGH_FB_DIV;
1779    else
1780	pll_flags |= RADEON_PLL_PREFER_LOW_REF_DIV;
1781
1782    if (info->allowColorTiling) {
1783	radeon_crtc->can_tile = (adjusted_mode->Flags & (V_DBLSCAN | V_INTERLACE)) ? FALSE : TRUE;
1784	tilingChanged = RADEONSetTiling(pScrn);
1785    }
1786
1787    for (i = 0; i < xf86_config->num_output; i++) {
1788	xf86OutputPtr output = xf86_config->output[i];
1789	RADEONOutputPrivatePtr radeon_output = output->driver_private;
1790
1791	if (output->crtc == crtc) {
1792	    if (radeon_output->active_device & (ATOM_DEVICE_LCD_SUPPORT |
1793						ATOM_DEVICE_DFP_SUPPORT))
1794		pll_flags |= RADEON_PLL_NO_ODD_POST_DIV;
1795	    if (radeon_output->active_device & (ATOM_DEVICE_LCD_SUPPORT))
1796		pll_flags |= (RADEON_PLL_USE_BIOS_DIVS | RADEON_PLL_USE_REF_DIV);
1797	}
1798    }
1799
1800
1801    ErrorF("init memmap\n");
1802    RADEONInitMemMapRegisters(pScrn, info->ModeReg, info);
1803    ErrorF("init common\n");
1804    RADEONInitCommonRegisters(info->ModeReg, info);
1805
1806    RADEONInitSurfaceCntl(crtc, info->ModeReg);
1807
1808    switch (radeon_crtc->crtc_id) {
1809    case 0:
1810	ErrorF("init crtc1\n");
1811	RADEONInitCrtcRegisters(crtc, info->ModeReg, adjusted_mode);
1812	RADEONInitCrtcBase(crtc, info->ModeReg, x, y);
1813	dot_clock = adjusted_mode->Clock / 1000.0;
1814	if (dot_clock) {
1815	    ErrorF("init pll1\n");
1816	    RADEONInitPLLRegisters(crtc, info->ModeReg, &info->pll, adjusted_mode, pll_flags);
1817	} else {
1818	    info->ModeReg->ppll_ref_div = info->SavedReg->ppll_ref_div;
1819	    info->ModeReg->ppll_div_3   = info->SavedReg->ppll_div_3;
1820	    info->ModeReg->htotal_cntl  = info->SavedReg->htotal_cntl;
1821	}
1822	break;
1823    case 1:
1824	ErrorF("init crtc2\n");
1825	RADEONInitCrtc2Registers(crtc, info->ModeReg, adjusted_mode);
1826	RADEONInitCrtc2Base(crtc, info->ModeReg, x, y);
1827	dot_clock = adjusted_mode->Clock / 1000.0;
1828	if (dot_clock) {
1829	    ErrorF("init pll2\n");
1830	    RADEONInitPLL2Registers(crtc, info->ModeReg, &info->pll, adjusted_mode, pll_flags);
1831	}
1832	break;
1833    }
1834
1835    for (i = 0; i < xf86_config->num_output; i++) {
1836	xf86OutputPtr output = xf86_config->output[i];
1837	RADEONOutputPrivatePtr radeon_output = output->driver_private;
1838
1839	if (output->crtc == crtc) {
1840	    if (radeon_output->active_device & (ATOM_DEVICE_TV_SUPPORT)) {
1841		switch (radeon_crtc->crtc_id) {
1842		case 0:
1843		    RADEONAdjustCrtcRegistersForTV(pScrn, info->ModeReg, adjusted_mode, output);
1844		    RADEONAdjustPLLRegistersForTV(pScrn, info->ModeReg, adjusted_mode, output);
1845		    update_tv_routing = TRUE;
1846		    break;
1847		case 1:
1848		    RADEONAdjustCrtc2RegistersForTV(pScrn, info->ModeReg, adjusted_mode, output);
1849		    RADEONAdjustPLL2RegistersForTV(pScrn, info->ModeReg, adjusted_mode, output);
1850		    break;
1851		}
1852	    }
1853	}
1854    }
1855
1856    ErrorF("restore memmap\n");
1857    RADEONRestoreMemMapRegisters(pScrn, info->ModeReg);
1858    ErrorF("restore common\n");
1859    RADEONRestoreCommonRegisters(pScrn, info->ModeReg);
1860
1861    switch (radeon_crtc->crtc_id) {
1862    case 0:
1863	ErrorF("restore crtc1\n");
1864	RADEONRestoreCrtcRegisters(pScrn, info->ModeReg);
1865	ErrorF("restore pll1\n");
1866	RADEONRestorePLLRegisters(pScrn, info->ModeReg);
1867	break;
1868    case 1:
1869	ErrorF("restore crtc2\n");
1870	RADEONRestoreCrtc2Registers(pScrn, info->ModeReg);
1871	ErrorF("restore pll2\n");
1872	RADEONRestorePLL2Registers(pScrn, info->ModeReg);
1873	break;
1874    }
1875
1876    /* pixclks_cntl handles tv-out clock routing */
1877    if (update_tv_routing)
1878	radeon_update_tv_routing(pScrn, info->ModeReg);
1879
1880    if (info->DispPriority)
1881	RADEONInitDispBandwidth(pScrn);
1882
1883    radeon_crtc->initialized = TRUE;
1884
1885    if (tilingChanged) {
1886	/* need to redraw front buffer, I guess this can be considered a hack ? */
1887	/* if this is called during ScreenInit() we don't have pScrn->pScreen yet */
1888	if (pScrn->pScreen)
1889	    xf86EnableDisableFBAccess(pScrn->scrnIndex, FALSE);
1890	RADEONChangeSurfaces(pScrn);
1891	if (pScrn->pScreen)
1892	    xf86EnableDisableFBAccess(pScrn->scrnIndex, TRUE);
1893	/* xf86SetRootClip would do, but can't access that here */
1894    }
1895
1896    /* reset ecp_div for Xv */
1897    info->ecp_div = -1;
1898
1899}
1900
1901