Subversion Repositories Kolibri OS

Rev

Rev 6104 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6104 Rev 6938
1
/*
1
/*
2
 * Copyright 2007-8 Advanced Micro Devices, Inc.
2
 * Copyright 2007-8 Advanced Micro Devices, Inc.
3
 * Copyright 2008 Red Hat Inc.
3
 * Copyright 2008 Red Hat Inc.
4
 *
4
 *
5
 * Permission is hereby granted, free of charge, to any person obtaining a
5
 * Permission is hereby granted, free of charge, to any person obtaining a
6
 * copy of this software and associated documentation files (the "Software"),
6
 * copy of this software and associated documentation files (the "Software"),
7
 * to deal in the Software without restriction, including without limitation
7
 * to deal in the Software without restriction, including without limitation
8
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9
 * and/or sell copies of the Software, and to permit persons to whom the
9
 * and/or sell copies of the Software, and to permit persons to whom the
10
 * Software is furnished to do so, subject to the following conditions:
10
 * Software is furnished to do so, subject to the following conditions:
11
 *
11
 *
12
 * The above copyright notice and this permission notice shall be included in
12
 * The above copyright notice and this permission notice shall be included in
13
 * all copies or substantial portions of the Software.
13
 * all copies or substantial portions of the Software.
14
 *
14
 *
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21
 * OTHER DEALINGS IN THE SOFTWARE.
21
 * OTHER DEALINGS IN THE SOFTWARE.
22
 *
22
 *
23
 * Authors: Dave Airlie
23
 * Authors: Dave Airlie
24
 *          Alex Deucher
24
 *          Alex Deucher
25
 */
25
 */
26
#include 
26
#include 
27
#include 
27
#include 
-
 
28
#include 
28
#include 
29
#include 
29
#include 
30
#include 
30
#include "radeon.h"
31
#include "radeon.h"
31
#include "atom.h"
32
#include "atom.h"
32
 
33
 
33
static void radeon_overscan_setup(struct drm_crtc *crtc,
34
static void radeon_overscan_setup(struct drm_crtc *crtc,
34
				  struct drm_display_mode *mode)
35
				  struct drm_display_mode *mode)
35
{
36
{
36
	struct drm_device *dev = crtc->dev;
37
	struct drm_device *dev = crtc->dev;
37
	struct radeon_device *rdev = dev->dev_private;
38
	struct radeon_device *rdev = dev->dev_private;
38
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
39
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
39
 
40
 
40
	WREG32(RADEON_OVR_CLR + radeon_crtc->crtc_offset, 0);
41
	WREG32(RADEON_OVR_CLR + radeon_crtc->crtc_offset, 0);
41
	WREG32(RADEON_OVR_WID_LEFT_RIGHT + radeon_crtc->crtc_offset, 0);
42
	WREG32(RADEON_OVR_WID_LEFT_RIGHT + radeon_crtc->crtc_offset, 0);
42
	WREG32(RADEON_OVR_WID_TOP_BOTTOM + radeon_crtc->crtc_offset, 0);
43
	WREG32(RADEON_OVR_WID_TOP_BOTTOM + radeon_crtc->crtc_offset, 0);
43
}
44
}
44
 
45
 
45
static void radeon_legacy_rmx_mode_set(struct drm_crtc *crtc,
46
static void radeon_legacy_rmx_mode_set(struct drm_crtc *crtc,
46
				       struct drm_display_mode *mode)
47
				       struct drm_display_mode *mode)
47
{
48
{
48
	struct drm_device *dev = crtc->dev;
49
	struct drm_device *dev = crtc->dev;
49
	struct radeon_device *rdev = dev->dev_private;
50
	struct radeon_device *rdev = dev->dev_private;
50
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
51
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
51
	int xres = mode->hdisplay;
52
	int xres = mode->hdisplay;
52
	int yres = mode->vdisplay;
53
	int yres = mode->vdisplay;
53
	bool hscale = true, vscale = true;
54
	bool hscale = true, vscale = true;
54
	int hsync_wid;
55
	int hsync_wid;
55
	int vsync_wid;
56
	int vsync_wid;
56
	int hsync_start;
57
	int hsync_start;
57
	int blank_width;
58
	int blank_width;
58
	u32 scale, inc, crtc_more_cntl;
59
	u32 scale, inc, crtc_more_cntl;
59
	u32 fp_horz_stretch, fp_vert_stretch, fp_horz_vert_active;
60
	u32 fp_horz_stretch, fp_vert_stretch, fp_horz_vert_active;
60
	u32 fp_h_sync_strt_wid, fp_crtc_h_total_disp;
61
	u32 fp_h_sync_strt_wid, fp_crtc_h_total_disp;
61
	u32 fp_v_sync_strt_wid, fp_crtc_v_total_disp;
62
	u32 fp_v_sync_strt_wid, fp_crtc_v_total_disp;
62
	struct drm_display_mode *native_mode = &radeon_crtc->native_mode;
63
	struct drm_display_mode *native_mode = &radeon_crtc->native_mode;
63
 
64
 
64
	fp_vert_stretch = RREG32(RADEON_FP_VERT_STRETCH) &
65
	fp_vert_stretch = RREG32(RADEON_FP_VERT_STRETCH) &
65
		(RADEON_VERT_STRETCH_RESERVED |
66
		(RADEON_VERT_STRETCH_RESERVED |
66
		 RADEON_VERT_AUTO_RATIO_INC);
67
		 RADEON_VERT_AUTO_RATIO_INC);
67
	fp_horz_stretch = RREG32(RADEON_FP_HORZ_STRETCH) &
68
	fp_horz_stretch = RREG32(RADEON_FP_HORZ_STRETCH) &
68
		(RADEON_HORZ_FP_LOOP_STRETCH |
69
		(RADEON_HORZ_FP_LOOP_STRETCH |
69
		 RADEON_HORZ_AUTO_RATIO_INC);
70
		 RADEON_HORZ_AUTO_RATIO_INC);
70
 
71
 
71
	crtc_more_cntl = 0;
72
	crtc_more_cntl = 0;
72
	if ((rdev->family == CHIP_RS100) ||
73
	if ((rdev->family == CHIP_RS100) ||
73
	    (rdev->family == CHIP_RS200)) {
74
	    (rdev->family == CHIP_RS200)) {
74
		/* This is to workaround the asic bug for RMX, some versions
75
		/* This is to workaround the asic bug for RMX, some versions
75
		   of BIOS dosen't have this register initialized correctly. */
76
		   of BIOS dosen't have this register initialized correctly. */
76
		crtc_more_cntl |= RADEON_CRTC_H_CUTOFF_ACTIVE_EN;
77
		crtc_more_cntl |= RADEON_CRTC_H_CUTOFF_ACTIVE_EN;
77
	}
78
	}
78
 
79
 
79
 
80
 
80
	fp_crtc_h_total_disp = ((((mode->crtc_htotal / 8) - 1) & 0x3ff)
81
	fp_crtc_h_total_disp = ((((mode->crtc_htotal / 8) - 1) & 0x3ff)
81
				| ((((mode->crtc_hdisplay / 8) - 1) & 0x1ff) << 16));
82
				| ((((mode->crtc_hdisplay / 8) - 1) & 0x1ff) << 16));
82
 
83
 
83
	hsync_wid = (mode->crtc_hsync_end - mode->crtc_hsync_start) / 8;
84
	hsync_wid = (mode->crtc_hsync_end - mode->crtc_hsync_start) / 8;
84
	if (!hsync_wid)
85
	if (!hsync_wid)
85
		hsync_wid = 1;
86
		hsync_wid = 1;
86
	hsync_start = mode->crtc_hsync_start - 8;
87
	hsync_start = mode->crtc_hsync_start - 8;
87
 
88
 
88
	fp_h_sync_strt_wid = ((hsync_start & 0x1fff)
89
	fp_h_sync_strt_wid = ((hsync_start & 0x1fff)
89
			      | ((hsync_wid & 0x3f) << 16)
90
			      | ((hsync_wid & 0x3f) << 16)
90
			      | ((mode->flags & DRM_MODE_FLAG_NHSYNC)
91
			      | ((mode->flags & DRM_MODE_FLAG_NHSYNC)
91
				 ? RADEON_CRTC_H_SYNC_POL
92
				 ? RADEON_CRTC_H_SYNC_POL
92
				 : 0));
93
				 : 0));
93
 
94
 
94
	fp_crtc_v_total_disp = (((mode->crtc_vtotal - 1) & 0xffff)
95
	fp_crtc_v_total_disp = (((mode->crtc_vtotal - 1) & 0xffff)
95
				| ((mode->crtc_vdisplay - 1) << 16));
96
				| ((mode->crtc_vdisplay - 1) << 16));
96
 
97
 
97
	vsync_wid = mode->crtc_vsync_end - mode->crtc_vsync_start;
98
	vsync_wid = mode->crtc_vsync_end - mode->crtc_vsync_start;
98
	if (!vsync_wid)
99
	if (!vsync_wid)
99
		vsync_wid = 1;
100
		vsync_wid = 1;
100
 
101
 
101
	fp_v_sync_strt_wid = (((mode->crtc_vsync_start - 1) & 0xfff)
102
	fp_v_sync_strt_wid = (((mode->crtc_vsync_start - 1) & 0xfff)
102
			      | ((vsync_wid & 0x1f) << 16)
103
			      | ((vsync_wid & 0x1f) << 16)
103
			      | ((mode->flags & DRM_MODE_FLAG_NVSYNC)
104
			      | ((mode->flags & DRM_MODE_FLAG_NVSYNC)
104
				 ? RADEON_CRTC_V_SYNC_POL
105
				 ? RADEON_CRTC_V_SYNC_POL
105
				 : 0));
106
				 : 0));
106
 
107
 
107
	fp_horz_vert_active = 0;
108
	fp_horz_vert_active = 0;
108
 
109
 
109
	if (native_mode->hdisplay == 0 ||
110
	if (native_mode->hdisplay == 0 ||
110
	    native_mode->vdisplay == 0) {
111
	    native_mode->vdisplay == 0) {
111
		hscale = false;
112
		hscale = false;
112
		vscale = false;
113
		vscale = false;
113
	} else {
114
	} else {
114
		if (xres > native_mode->hdisplay)
115
		if (xres > native_mode->hdisplay)
115
			xres = native_mode->hdisplay;
116
			xres = native_mode->hdisplay;
116
		if (yres > native_mode->vdisplay)
117
		if (yres > native_mode->vdisplay)
117
			yres = native_mode->vdisplay;
118
			yres = native_mode->vdisplay;
118
 
119
 
119
		if (xres == native_mode->hdisplay)
120
		if (xres == native_mode->hdisplay)
120
			hscale = false;
121
			hscale = false;
121
		if (yres == native_mode->vdisplay)
122
		if (yres == native_mode->vdisplay)
122
			vscale = false;
123
			vscale = false;
123
	}
124
	}
124
 
125
 
125
	switch (radeon_crtc->rmx_type) {
126
	switch (radeon_crtc->rmx_type) {
126
	case RMX_FULL:
127
	case RMX_FULL:
127
	case RMX_ASPECT:
128
	case RMX_ASPECT:
128
		if (!hscale)
129
		if (!hscale)
129
			fp_horz_stretch |= ((xres/8-1) << 16);
130
			fp_horz_stretch |= ((xres/8-1) << 16);
130
		else {
131
		else {
131
			inc = (fp_horz_stretch & RADEON_HORZ_AUTO_RATIO_INC) ? 1 : 0;
132
			inc = (fp_horz_stretch & RADEON_HORZ_AUTO_RATIO_INC) ? 1 : 0;
132
			scale = ((xres + inc) * RADEON_HORZ_STRETCH_RATIO_MAX)
133
			scale = ((xres + inc) * RADEON_HORZ_STRETCH_RATIO_MAX)
133
				/ native_mode->hdisplay + 1;
134
				/ native_mode->hdisplay + 1;
134
			fp_horz_stretch |= (((scale) & RADEON_HORZ_STRETCH_RATIO_MASK) |
135
			fp_horz_stretch |= (((scale) & RADEON_HORZ_STRETCH_RATIO_MASK) |
135
					RADEON_HORZ_STRETCH_BLEND |
136
					RADEON_HORZ_STRETCH_BLEND |
136
					RADEON_HORZ_STRETCH_ENABLE |
137
					RADEON_HORZ_STRETCH_ENABLE |
137
					((native_mode->hdisplay/8-1) << 16));
138
					((native_mode->hdisplay/8-1) << 16));
138
		}
139
		}
139
 
140
 
140
		if (!vscale)
141
		if (!vscale)
141
			fp_vert_stretch |= ((yres-1) << 12);
142
			fp_vert_stretch |= ((yres-1) << 12);
142
		else {
143
		else {
143
			inc = (fp_vert_stretch & RADEON_VERT_AUTO_RATIO_INC) ? 1 : 0;
144
			inc = (fp_vert_stretch & RADEON_VERT_AUTO_RATIO_INC) ? 1 : 0;
144
			scale = ((yres + inc) * RADEON_VERT_STRETCH_RATIO_MAX)
145
			scale = ((yres + inc) * RADEON_VERT_STRETCH_RATIO_MAX)
145
				/ native_mode->vdisplay + 1;
146
				/ native_mode->vdisplay + 1;
146
			fp_vert_stretch |= (((scale) & RADEON_VERT_STRETCH_RATIO_MASK) |
147
			fp_vert_stretch |= (((scale) & RADEON_VERT_STRETCH_RATIO_MASK) |
147
					RADEON_VERT_STRETCH_ENABLE |
148
					RADEON_VERT_STRETCH_ENABLE |
148
					RADEON_VERT_STRETCH_BLEND |
149
					RADEON_VERT_STRETCH_BLEND |
149
					((native_mode->vdisplay-1) << 12));
150
					((native_mode->vdisplay-1) << 12));
150
		}
151
		}
151
		break;
152
		break;
152
	case RMX_CENTER:
153
	case RMX_CENTER:
153
		fp_horz_stretch |= ((xres/8-1) << 16);
154
		fp_horz_stretch |= ((xres/8-1) << 16);
154
		fp_vert_stretch |= ((yres-1) << 12);
155
		fp_vert_stretch |= ((yres-1) << 12);
155
 
156
 
156
		crtc_more_cntl |= (RADEON_CRTC_AUTO_HORZ_CENTER_EN |
157
		crtc_more_cntl |= (RADEON_CRTC_AUTO_HORZ_CENTER_EN |
157
				RADEON_CRTC_AUTO_VERT_CENTER_EN);
158
				RADEON_CRTC_AUTO_VERT_CENTER_EN);
158
 
159
 
159
		blank_width = (mode->crtc_hblank_end - mode->crtc_hblank_start) / 8;
160
		blank_width = (mode->crtc_hblank_end - mode->crtc_hblank_start) / 8;
160
		if (blank_width > 110)
161
		if (blank_width > 110)
161
			blank_width = 110;
162
			blank_width = 110;
162
 
163
 
163
		fp_crtc_h_total_disp = (((blank_width) & 0x3ff)
164
		fp_crtc_h_total_disp = (((blank_width) & 0x3ff)
164
				| ((((mode->crtc_hdisplay / 8) - 1) & 0x1ff) << 16));
165
				| ((((mode->crtc_hdisplay / 8) - 1) & 0x1ff) << 16));
165
 
166
 
166
		hsync_wid = (mode->crtc_hsync_end - mode->crtc_hsync_start) / 8;
167
		hsync_wid = (mode->crtc_hsync_end - mode->crtc_hsync_start) / 8;
167
		if (!hsync_wid)
168
		if (!hsync_wid)
168
			hsync_wid = 1;
169
			hsync_wid = 1;
169
 
170
 
170
		fp_h_sync_strt_wid = ((((mode->crtc_hsync_start - mode->crtc_hblank_start) / 8) & 0x1fff)
171
		fp_h_sync_strt_wid = ((((mode->crtc_hsync_start - mode->crtc_hblank_start) / 8) & 0x1fff)
171
				| ((hsync_wid & 0x3f) << 16)
172
				| ((hsync_wid & 0x3f) << 16)
172
				| ((mode->flags & DRM_MODE_FLAG_NHSYNC)
173
				| ((mode->flags & DRM_MODE_FLAG_NHSYNC)
173
					? RADEON_CRTC_H_SYNC_POL
174
					? RADEON_CRTC_H_SYNC_POL
174
					: 0));
175
					: 0));
175
 
176
 
176
		fp_crtc_v_total_disp = (((mode->crtc_vblank_end - mode->crtc_vblank_start) & 0xffff)
177
		fp_crtc_v_total_disp = (((mode->crtc_vblank_end - mode->crtc_vblank_start) & 0xffff)
177
				| ((mode->crtc_vdisplay - 1) << 16));
178
				| ((mode->crtc_vdisplay - 1) << 16));
178
 
179
 
179
		vsync_wid = mode->crtc_vsync_end - mode->crtc_vsync_start;
180
		vsync_wid = mode->crtc_vsync_end - mode->crtc_vsync_start;
180
		if (!vsync_wid)
181
		if (!vsync_wid)
181
			vsync_wid = 1;
182
			vsync_wid = 1;
182
 
183
 
183
		fp_v_sync_strt_wid = ((((mode->crtc_vsync_start - mode->crtc_vblank_start) & 0xfff)
184
		fp_v_sync_strt_wid = ((((mode->crtc_vsync_start - mode->crtc_vblank_start) & 0xfff)
184
					| ((vsync_wid & 0x1f) << 16)
185
					| ((vsync_wid & 0x1f) << 16)
185
					| ((mode->flags & DRM_MODE_FLAG_NVSYNC)
186
					| ((mode->flags & DRM_MODE_FLAG_NVSYNC)
186
						? RADEON_CRTC_V_SYNC_POL
187
						? RADEON_CRTC_V_SYNC_POL
187
						: 0)));
188
						: 0)));
188
 
189
 
189
		fp_horz_vert_active = (((native_mode->vdisplay) & 0xfff) |
190
		fp_horz_vert_active = (((native_mode->vdisplay) & 0xfff) |
190
				(((native_mode->hdisplay / 8) & 0x1ff) << 16));
191
				(((native_mode->hdisplay / 8) & 0x1ff) << 16));
191
		break;
192
		break;
192
	case RMX_OFF:
193
	case RMX_OFF:
193
	default:
194
	default:
194
		fp_horz_stretch |= ((xres/8-1) << 16);
195
		fp_horz_stretch |= ((xres/8-1) << 16);
195
		fp_vert_stretch |= ((yres-1) << 12);
196
		fp_vert_stretch |= ((yres-1) << 12);
196
		break;
197
		break;
197
	}
198
	}
198
 
199
 
199
	WREG32(RADEON_FP_HORZ_STRETCH,      fp_horz_stretch);
200
	WREG32(RADEON_FP_HORZ_STRETCH,      fp_horz_stretch);
200
	WREG32(RADEON_FP_VERT_STRETCH,      fp_vert_stretch);
201
	WREG32(RADEON_FP_VERT_STRETCH,      fp_vert_stretch);
201
	WREG32(RADEON_CRTC_MORE_CNTL,       crtc_more_cntl);
202
	WREG32(RADEON_CRTC_MORE_CNTL,       crtc_more_cntl);
202
	WREG32(RADEON_FP_HORZ_VERT_ACTIVE,  fp_horz_vert_active);
203
	WREG32(RADEON_FP_HORZ_VERT_ACTIVE,  fp_horz_vert_active);
203
	WREG32(RADEON_FP_H_SYNC_STRT_WID,   fp_h_sync_strt_wid);
204
	WREG32(RADEON_FP_H_SYNC_STRT_WID,   fp_h_sync_strt_wid);
204
	WREG32(RADEON_FP_V_SYNC_STRT_WID,   fp_v_sync_strt_wid);
205
	WREG32(RADEON_FP_V_SYNC_STRT_WID,   fp_v_sync_strt_wid);
205
	WREG32(RADEON_FP_CRTC_H_TOTAL_DISP, fp_crtc_h_total_disp);
206
	WREG32(RADEON_FP_CRTC_H_TOTAL_DISP, fp_crtc_h_total_disp);
206
	WREG32(RADEON_FP_CRTC_V_TOTAL_DISP, fp_crtc_v_total_disp);
207
	WREG32(RADEON_FP_CRTC_V_TOTAL_DISP, fp_crtc_v_total_disp);
207
}
208
}
208
 
209
 
209
static void radeon_pll_wait_for_read_update_complete(struct drm_device *dev)
210
static void radeon_pll_wait_for_read_update_complete(struct drm_device *dev)
210
{
211
{
211
	struct radeon_device *rdev = dev->dev_private;
212
	struct radeon_device *rdev = dev->dev_private;
212
	int i = 0;
213
	int i = 0;
213
 
214
 
214
	/* FIXME: Certain revisions of R300 can't recover here.  Not sure of
215
	/* FIXME: Certain revisions of R300 can't recover here.  Not sure of
215
	   the cause yet, but this workaround will mask the problem for now.
216
	   the cause yet, but this workaround will mask the problem for now.
216
	   Other chips usually will pass at the very first test, so the
217
	   Other chips usually will pass at the very first test, so the
217
	   workaround shouldn't have any effect on them. */
218
	   workaround shouldn't have any effect on them. */
218
	for (i = 0;
219
	for (i = 0;
219
	     (i < 10000 &&
220
	     (i < 10000 &&
220
	      RREG32_PLL(RADEON_PPLL_REF_DIV) & RADEON_PPLL_ATOMIC_UPDATE_R);
221
	      RREG32_PLL(RADEON_PPLL_REF_DIV) & RADEON_PPLL_ATOMIC_UPDATE_R);
221
	     i++);
222
	     i++);
222
}
223
}
223
 
224
 
224
static void radeon_pll_write_update(struct drm_device *dev)
225
static void radeon_pll_write_update(struct drm_device *dev)
225
{
226
{
226
	struct radeon_device *rdev = dev->dev_private;
227
	struct radeon_device *rdev = dev->dev_private;
227
 
228
 
228
	while (RREG32_PLL(RADEON_PPLL_REF_DIV) & RADEON_PPLL_ATOMIC_UPDATE_R);
229
	while (RREG32_PLL(RADEON_PPLL_REF_DIV) & RADEON_PPLL_ATOMIC_UPDATE_R);
229
 
230
 
230
	WREG32_PLL_P(RADEON_PPLL_REF_DIV,
231
	WREG32_PLL_P(RADEON_PPLL_REF_DIV,
231
			   RADEON_PPLL_ATOMIC_UPDATE_W,
232
			   RADEON_PPLL_ATOMIC_UPDATE_W,
232
			   ~(RADEON_PPLL_ATOMIC_UPDATE_W));
233
			   ~(RADEON_PPLL_ATOMIC_UPDATE_W));
233
}
234
}
234
 
235
 
235
static void radeon_pll2_wait_for_read_update_complete(struct drm_device *dev)
236
static void radeon_pll2_wait_for_read_update_complete(struct drm_device *dev)
236
{
237
{
237
	struct radeon_device *rdev = dev->dev_private;
238
	struct radeon_device *rdev = dev->dev_private;
238
	int i = 0;
239
	int i = 0;
239
 
240
 
240
 
241
 
241
	/* FIXME: Certain revisions of R300 can't recover here.  Not sure of
242
	/* FIXME: Certain revisions of R300 can't recover here.  Not sure of
242
	   the cause yet, but this workaround will mask the problem for now.
243
	   the cause yet, but this workaround will mask the problem for now.
243
	   Other chips usually will pass at the very first test, so the
244
	   Other chips usually will pass at the very first test, so the
244
	   workaround shouldn't have any effect on them. */
245
	   workaround shouldn't have any effect on them. */
245
	for (i = 0;
246
	for (i = 0;
246
	     (i < 10000 &&
247
	     (i < 10000 &&
247
	      RREG32_PLL(RADEON_P2PLL_REF_DIV) & RADEON_P2PLL_ATOMIC_UPDATE_R);
248
	      RREG32_PLL(RADEON_P2PLL_REF_DIV) & RADEON_P2PLL_ATOMIC_UPDATE_R);
248
	     i++);
249
	     i++);
249
}
250
}
250
 
251
 
251
static void radeon_pll2_write_update(struct drm_device *dev)
252
static void radeon_pll2_write_update(struct drm_device *dev)
252
{
253
{
253
	struct radeon_device *rdev = dev->dev_private;
254
	struct radeon_device *rdev = dev->dev_private;
254
 
255
 
255
	while (RREG32_PLL(RADEON_P2PLL_REF_DIV) & RADEON_P2PLL_ATOMIC_UPDATE_R);
256
	while (RREG32_PLL(RADEON_P2PLL_REF_DIV) & RADEON_P2PLL_ATOMIC_UPDATE_R);
256
 
257
 
257
	WREG32_PLL_P(RADEON_P2PLL_REF_DIV,
258
	WREG32_PLL_P(RADEON_P2PLL_REF_DIV,
258
			   RADEON_P2PLL_ATOMIC_UPDATE_W,
259
			   RADEON_P2PLL_ATOMIC_UPDATE_W,
259
			   ~(RADEON_P2PLL_ATOMIC_UPDATE_W));
260
			   ~(RADEON_P2PLL_ATOMIC_UPDATE_W));
260
}
261
}
261
 
262
 
262
static uint8_t radeon_compute_pll_gain(uint16_t ref_freq, uint16_t ref_div,
263
static uint8_t radeon_compute_pll_gain(uint16_t ref_freq, uint16_t ref_div,
263
				       uint16_t fb_div)
264
				       uint16_t fb_div)
264
{
265
{
265
	unsigned int vcoFreq;
266
	unsigned int vcoFreq;
266
 
267
 
267
	if (!ref_div)
268
	if (!ref_div)
268
		return 1;
269
		return 1;
269
 
270
 
270
	vcoFreq = ((unsigned)ref_freq * fb_div) / ref_div;
271
	vcoFreq = ((unsigned)ref_freq * fb_div) / ref_div;
271
 
272
 
272
	/*
273
	/*
273
	 * This is horribly crude: the VCO frequency range is divided into
274
	 * This is horribly crude: the VCO frequency range is divided into
274
	 * 3 parts, each part having a fixed PLL gain value.
275
	 * 3 parts, each part having a fixed PLL gain value.
275
	 */
276
	 */
276
	if (vcoFreq >= 30000)
277
	if (vcoFreq >= 30000)
277
		/*
278
		/*
278
		 * [300..max] MHz : 7
279
		 * [300..max] MHz : 7
279
		 */
280
		 */
280
		return 7;
281
		return 7;
281
	else if (vcoFreq >= 18000)
282
	else if (vcoFreq >= 18000)
282
		/*
283
		/*
283
		 * [180..300) MHz : 4
284
		 * [180..300) MHz : 4
284
		 */
285
		 */
285
		return 4;
286
		return 4;
286
	else
287
	else
287
		/*
288
		/*
288
		 * [0..180) MHz : 1
289
		 * [0..180) MHz : 1
289
		 */
290
		 */
290
		return 1;
291
		return 1;
291
}
292
}
292
 
293
 
293
static void radeon_crtc_dpms(struct drm_crtc *crtc, int mode)
294
static void radeon_crtc_dpms(struct drm_crtc *crtc, int mode)
294
{
295
{
295
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
296
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
296
	struct drm_device *dev = crtc->dev;
297
	struct drm_device *dev = crtc->dev;
297
	struct radeon_device *rdev = dev->dev_private;
298
	struct radeon_device *rdev = dev->dev_private;
298
	uint32_t crtc_ext_cntl = 0;
299
	uint32_t crtc_ext_cntl = 0;
299
	uint32_t mask;
300
	uint32_t mask;
300
 
301
 
301
	if (radeon_crtc->crtc_id)
302
	if (radeon_crtc->crtc_id)
302
		mask = (RADEON_CRTC2_DISP_DIS |
303
		mask = (RADEON_CRTC2_DISP_DIS |
303
			RADEON_CRTC2_VSYNC_DIS |
304
			RADEON_CRTC2_VSYNC_DIS |
304
			RADEON_CRTC2_HSYNC_DIS |
305
			RADEON_CRTC2_HSYNC_DIS |
305
			RADEON_CRTC2_DISP_REQ_EN_B);
306
			RADEON_CRTC2_DISP_REQ_EN_B);
306
	else
307
	else
307
		mask = (RADEON_CRTC_DISPLAY_DIS |
308
		mask = (RADEON_CRTC_DISPLAY_DIS |
308
			RADEON_CRTC_VSYNC_DIS |
309
			RADEON_CRTC_VSYNC_DIS |
309
			RADEON_CRTC_HSYNC_DIS);
310
			RADEON_CRTC_HSYNC_DIS);
310
 
311
 
311
	/*
312
	/*
312
	 * On all dual CRTC GPUs this bit controls the CRTC of the primary DAC.
313
	 * On all dual CRTC GPUs this bit controls the CRTC of the primary DAC.
313
	 * Therefore it is set in the DAC DMPS function.
314
	 * Therefore it is set in the DAC DMPS function.
314
	 * This is different for GPU's with a single CRTC but a primary and a
315
	 * This is different for GPU's with a single CRTC but a primary and a
315
	 * TV DAC: here it controls the single CRTC no matter where it is
316
	 * TV DAC: here it controls the single CRTC no matter where it is
316
	 * routed. Therefore we set it here.
317
	 * routed. Therefore we set it here.
317
	 */
318
	 */
318
	if (rdev->flags & RADEON_SINGLE_CRTC)
319
	if (rdev->flags & RADEON_SINGLE_CRTC)
319
		crtc_ext_cntl = RADEON_CRTC_CRT_ON;
320
		crtc_ext_cntl = RADEON_CRTC_CRT_ON;
320
	
321
	
321
	switch (mode) {
322
	switch (mode) {
322
	case DRM_MODE_DPMS_ON:
323
	case DRM_MODE_DPMS_ON:
323
		radeon_crtc->enabled = true;
324
		radeon_crtc->enabled = true;
324
		/* adjust pm to dpms changes BEFORE enabling crtcs */
325
		/* adjust pm to dpms changes BEFORE enabling crtcs */
325
		radeon_pm_compute_clocks(rdev);
326
		radeon_pm_compute_clocks(rdev);
326
		if (radeon_crtc->crtc_id)
327
		if (radeon_crtc->crtc_id)
327
			WREG32_P(RADEON_CRTC2_GEN_CNTL, RADEON_CRTC2_EN, ~(RADEON_CRTC2_EN | mask));
328
			WREG32_P(RADEON_CRTC2_GEN_CNTL, RADEON_CRTC2_EN, ~(RADEON_CRTC2_EN | mask));
328
		else {
329
		else {
329
			WREG32_P(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_EN, ~(RADEON_CRTC_EN |
330
			WREG32_P(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_EN, ~(RADEON_CRTC_EN |
330
									 RADEON_CRTC_DISP_REQ_EN_B));
331
									 RADEON_CRTC_DISP_REQ_EN_B));
331
			WREG32_P(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl, ~(mask | crtc_ext_cntl));
332
			WREG32_P(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl, ~(mask | crtc_ext_cntl));
332
		}
333
		}
333
		drm_vblank_post_modeset(dev, radeon_crtc->crtc_id);
334
		drm_vblank_post_modeset(dev, radeon_crtc->crtc_id);
334
		radeon_crtc_load_lut(crtc);
335
		radeon_crtc_load_lut(crtc);
335
		break;
336
		break;
336
	case DRM_MODE_DPMS_STANDBY:
337
	case DRM_MODE_DPMS_STANDBY:
337
	case DRM_MODE_DPMS_SUSPEND:
338
	case DRM_MODE_DPMS_SUSPEND:
338
	case DRM_MODE_DPMS_OFF:
339
	case DRM_MODE_DPMS_OFF:
339
		drm_vblank_pre_modeset(dev, radeon_crtc->crtc_id);
340
		drm_vblank_pre_modeset(dev, radeon_crtc->crtc_id);
340
		if (radeon_crtc->crtc_id)
341
		if (radeon_crtc->crtc_id)
341
			WREG32_P(RADEON_CRTC2_GEN_CNTL, mask, ~(RADEON_CRTC2_EN | mask));
342
			WREG32_P(RADEON_CRTC2_GEN_CNTL, mask, ~(RADEON_CRTC2_EN | mask));
342
		else {
343
		else {
343
			WREG32_P(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_DISP_REQ_EN_B, ~(RADEON_CRTC_EN |
344
			WREG32_P(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_DISP_REQ_EN_B, ~(RADEON_CRTC_EN |
344
										    RADEON_CRTC_DISP_REQ_EN_B));
345
										    RADEON_CRTC_DISP_REQ_EN_B));
345
			WREG32_P(RADEON_CRTC_EXT_CNTL, mask, ~(mask | crtc_ext_cntl));
346
			WREG32_P(RADEON_CRTC_EXT_CNTL, mask, ~(mask | crtc_ext_cntl));
346
		}
347
		}
347
		radeon_crtc->enabled = false;
348
		radeon_crtc->enabled = false;
348
		/* adjust pm to dpms changes AFTER disabling crtcs */
349
		/* adjust pm to dpms changes AFTER disabling crtcs */
349
		radeon_pm_compute_clocks(rdev);
350
		radeon_pm_compute_clocks(rdev);
350
		break;
351
		break;
351
	}
352
	}
352
}
353
}
353
 
354
 
354
int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y,
355
int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y,
355
			 struct drm_framebuffer *old_fb)
356
			 struct drm_framebuffer *old_fb)
356
{
357
{
357
	return radeon_crtc_do_set_base(crtc, old_fb, x, y, 0);
358
	return radeon_crtc_do_set_base(crtc, old_fb, x, y, 0);
358
}
359
}
359
 
360
 
360
int radeon_crtc_set_base_atomic(struct drm_crtc *crtc,
361
int radeon_crtc_set_base_atomic(struct drm_crtc *crtc,
361
				struct drm_framebuffer *fb,
362
				struct drm_framebuffer *fb,
362
				int x, int y, enum mode_set_atomic state)
363
				int x, int y, enum mode_set_atomic state)
363
{
364
{
364
	return radeon_crtc_do_set_base(crtc, fb, x, y, 1);
365
	return radeon_crtc_do_set_base(crtc, fb, x, y, 1);
365
}
366
}
366
 
367
 
367
int radeon_crtc_do_set_base(struct drm_crtc *crtc,
368
int radeon_crtc_do_set_base(struct drm_crtc *crtc,
368
			 struct drm_framebuffer *fb,
369
			 struct drm_framebuffer *fb,
369
			 int x, int y, int atomic)
370
			 int x, int y, int atomic)
370
{
371
{
371
	struct drm_device *dev = crtc->dev;
372
	struct drm_device *dev = crtc->dev;
372
	struct radeon_device *rdev = dev->dev_private;
373
	struct radeon_device *rdev = dev->dev_private;
373
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
374
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
374
	struct radeon_framebuffer *radeon_fb;
375
	struct radeon_framebuffer *radeon_fb;
375
	struct drm_framebuffer *target_fb;
376
	struct drm_framebuffer *target_fb;
376
	struct drm_gem_object *obj;
377
	struct drm_gem_object *obj;
377
	struct radeon_bo *rbo;
378
	struct radeon_bo *rbo;
378
	uint64_t base;
379
	uint64_t base;
379
	uint32_t crtc_offset, crtc_offset_cntl, crtc_tile_x0_y0 = 0;
380
	uint32_t crtc_offset, crtc_offset_cntl, crtc_tile_x0_y0 = 0;
380
	uint32_t crtc_pitch, pitch_pixels;
381
	uint32_t crtc_pitch, pitch_pixels;
381
	uint32_t tiling_flags;
382
	uint32_t tiling_flags;
382
	int format;
383
	int format;
383
	uint32_t gen_cntl_reg, gen_cntl_val;
384
	uint32_t gen_cntl_reg, gen_cntl_val;
384
	int r;
385
	int r;
385
 
386
 
386
	DRM_DEBUG_KMS("\n");
387
	DRM_DEBUG_KMS("\n");
387
	/* no fb bound */
388
	/* no fb bound */
388
	if (!atomic && !crtc->primary->fb) {
389
	if (!atomic && !crtc->primary->fb) {
389
		DRM_DEBUG_KMS("No FB bound\n");
390
		DRM_DEBUG_KMS("No FB bound\n");
390
		return 0;
391
		return 0;
391
	}
392
	}
392
 
393
 
393
	if (atomic) {
394
	if (atomic) {
394
		radeon_fb = to_radeon_framebuffer(fb);
395
		radeon_fb = to_radeon_framebuffer(fb);
395
		target_fb = fb;
396
		target_fb = fb;
396
	}
397
	}
397
	else {
398
	else {
398
		radeon_fb = to_radeon_framebuffer(crtc->primary->fb);
399
		radeon_fb = to_radeon_framebuffer(crtc->primary->fb);
399
		target_fb = crtc->primary->fb;
400
		target_fb = crtc->primary->fb;
400
	}
401
	}
401
 
402
 
402
	switch (target_fb->bits_per_pixel) {
403
	switch (target_fb->bits_per_pixel) {
403
	case 8:
404
	case 8:
404
		format = 2;
405
		format = 2;
405
		break;
406
		break;
406
	case 15:      /*  555 */
407
	case 15:      /*  555 */
407
		format = 3;
408
		format = 3;
408
		break;
409
		break;
409
	case 16:      /*  565 */
410
	case 16:      /*  565 */
410
		format = 4;
411
		format = 4;
411
		break;
412
		break;
412
	case 24:      /*  RGB */
413
	case 24:      /*  RGB */
413
		format = 5;
414
		format = 5;
414
		break;
415
		break;
415
	case 32:      /* xRGB */
416
	case 32:      /* xRGB */
416
		format = 6;
417
		format = 6;
417
		break;
418
		break;
418
	default:
419
	default:
419
		return false;
420
		return false;
420
	}
421
	}
421
 
422
 
422
	/* Pin framebuffer & get tilling informations */
423
	/* Pin framebuffer & get tilling informations */
423
	obj = radeon_fb->obj;
424
	obj = radeon_fb->obj;
424
	rbo = gem_to_radeon_bo(obj);
425
	rbo = gem_to_radeon_bo(obj);
425
retry:
426
retry:
426
	r = radeon_bo_reserve(rbo, false);
427
	r = radeon_bo_reserve(rbo, false);
427
	if (unlikely(r != 0))
428
	if (unlikely(r != 0))
428
		return r;
429
		return r;
429
	/* Only 27 bit offset for legacy CRTC */
430
	/* Only 27 bit offset for legacy CRTC */
430
	r = radeon_bo_pin_restricted(rbo, RADEON_GEM_DOMAIN_VRAM, 1 << 27,
431
	r = radeon_bo_pin_restricted(rbo, RADEON_GEM_DOMAIN_VRAM, 1 << 27,
431
				     &base);
432
				     &base);
432
	if (unlikely(r != 0)) {
433
	if (unlikely(r != 0)) {
433
		radeon_bo_unreserve(rbo);
434
		radeon_bo_unreserve(rbo);
434
 
435
 
435
		/* On old GPU like RN50 with little vram pining can fails because
436
		/* On old GPU like RN50 with little vram pining can fails because
436
		 * current fb is taking all space needed. So instead of unpining
437
		 * current fb is taking all space needed. So instead of unpining
437
		 * the old buffer after pining the new one, first unpin old one
438
		 * the old buffer after pining the new one, first unpin old one
438
		 * and then retry pining new one.
439
		 * and then retry pining new one.
439
		 *
440
		 *
440
		 * As only master can set mode only master can pin and it is
441
		 * As only master can set mode only master can pin and it is
441
		 * unlikely the master client will race with itself especialy
442
		 * unlikely the master client will race with itself especialy
442
		 * on those old gpu with single crtc.
443
		 * on those old gpu with single crtc.
443
		 *
444
		 *
444
		 * We don't shutdown the display controller because new buffer
445
		 * We don't shutdown the display controller because new buffer
445
		 * will end up in same spot.
446
		 * will end up in same spot.
446
		 */
447
		 */
447
		if (!atomic && fb && fb != crtc->primary->fb) {
448
		if (!atomic && fb && fb != crtc->primary->fb) {
448
			struct radeon_bo *old_rbo;
449
			struct radeon_bo *old_rbo;
449
			unsigned long nsize, osize;
450
			unsigned long nsize, osize;
450
 
451
 
451
			old_rbo = gem_to_radeon_bo(to_radeon_framebuffer(fb)->obj);
452
			old_rbo = gem_to_radeon_bo(to_radeon_framebuffer(fb)->obj);
452
			osize = radeon_bo_size(old_rbo);
453
			osize = radeon_bo_size(old_rbo);
453
			nsize = radeon_bo_size(rbo);
454
			nsize = radeon_bo_size(rbo);
454
			if (nsize <= osize && !radeon_bo_reserve(old_rbo, false)) {
455
			if (nsize <= osize && !radeon_bo_reserve(old_rbo, false)) {
455
				radeon_bo_unpin(old_rbo);
456
				radeon_bo_unpin(old_rbo);
456
				radeon_bo_unreserve(old_rbo);
457
				radeon_bo_unreserve(old_rbo);
457
				fb = NULL;
458
				fb = NULL;
458
				goto retry;
459
				goto retry;
459
			}
460
			}
460
		}
461
		}
461
		return -EINVAL;
462
		return -EINVAL;
462
	}
463
	}
463
	radeon_bo_get_tiling_flags(rbo, &tiling_flags, NULL);
464
	radeon_bo_get_tiling_flags(rbo, &tiling_flags, NULL);
464
	radeon_bo_unreserve(rbo);
465
	radeon_bo_unreserve(rbo);
465
	if (tiling_flags & RADEON_TILING_MICRO)
466
	if (tiling_flags & RADEON_TILING_MICRO)
466
		DRM_ERROR("trying to scanout microtiled buffer\n");
467
		DRM_ERROR("trying to scanout microtiled buffer\n");
467
 
468
 
468
	/* if scanout was in GTT this really wouldn't work */
469
	/* if scanout was in GTT this really wouldn't work */
469
	/* crtc offset is from display base addr not FB location */
470
	/* crtc offset is from display base addr not FB location */
470
	radeon_crtc->legacy_display_base_addr = rdev->mc.vram_start;
471
	radeon_crtc->legacy_display_base_addr = rdev->mc.vram_start;
471
 
472
 
472
	base -= radeon_crtc->legacy_display_base_addr;
473
	base -= radeon_crtc->legacy_display_base_addr;
473
 
474
 
474
	crtc_offset_cntl = 0;
475
	crtc_offset_cntl = 0;
475
 
476
 
476
	pitch_pixels = target_fb->pitches[0] / (target_fb->bits_per_pixel / 8);
477
	pitch_pixels = target_fb->pitches[0] / (target_fb->bits_per_pixel / 8);
477
	crtc_pitch  = (((pitch_pixels * target_fb->bits_per_pixel) +
478
	crtc_pitch  = (((pitch_pixels * target_fb->bits_per_pixel) +
478
			((target_fb->bits_per_pixel * 8) - 1)) /
479
			((target_fb->bits_per_pixel * 8) - 1)) /
479
		       (target_fb->bits_per_pixel * 8));
480
		       (target_fb->bits_per_pixel * 8));
480
	crtc_pitch |= crtc_pitch << 16;
481
	crtc_pitch |= crtc_pitch << 16;
481
 
482
 
482
	crtc_offset_cntl |= RADEON_CRTC_GUI_TRIG_OFFSET_LEFT_EN;
483
	crtc_offset_cntl |= RADEON_CRTC_GUI_TRIG_OFFSET_LEFT_EN;
483
	if (tiling_flags & RADEON_TILING_MACRO) {
484
	if (tiling_flags & RADEON_TILING_MACRO) {
484
		if (ASIC_IS_R300(rdev))
485
		if (ASIC_IS_R300(rdev))
485
			crtc_offset_cntl |= (R300_CRTC_X_Y_MODE_EN |
486
			crtc_offset_cntl |= (R300_CRTC_X_Y_MODE_EN |
486
					     R300_CRTC_MICRO_TILE_BUFFER_DIS |
487
					     R300_CRTC_MICRO_TILE_BUFFER_DIS |
487
					     R300_CRTC_MACRO_TILE_EN);
488
					     R300_CRTC_MACRO_TILE_EN);
488
		else
489
		else
489
			crtc_offset_cntl |= RADEON_CRTC_TILE_EN;
490
			crtc_offset_cntl |= RADEON_CRTC_TILE_EN;
490
	} else {
491
	} else {
491
		if (ASIC_IS_R300(rdev))
492
		if (ASIC_IS_R300(rdev))
492
			crtc_offset_cntl &= ~(R300_CRTC_X_Y_MODE_EN |
493
			crtc_offset_cntl &= ~(R300_CRTC_X_Y_MODE_EN |
493
					      R300_CRTC_MICRO_TILE_BUFFER_DIS |
494
					      R300_CRTC_MICRO_TILE_BUFFER_DIS |
494
					      R300_CRTC_MACRO_TILE_EN);
495
					      R300_CRTC_MACRO_TILE_EN);
495
		else
496
		else
496
			crtc_offset_cntl &= ~RADEON_CRTC_TILE_EN;
497
			crtc_offset_cntl &= ~RADEON_CRTC_TILE_EN;
497
	}
498
	}
498
 
499
 
499
	if (tiling_flags & RADEON_TILING_MACRO) {
500
	if (tiling_flags & RADEON_TILING_MACRO) {
500
		if (ASIC_IS_R300(rdev)) {
501
		if (ASIC_IS_R300(rdev)) {
501
			crtc_tile_x0_y0 = x | (y << 16);
502
			crtc_tile_x0_y0 = x | (y << 16);
502
			base &= ~0x7ff;
503
			base &= ~0x7ff;
503
		} else {
504
		} else {
504
			int byteshift = target_fb->bits_per_pixel >> 4;
505
			int byteshift = target_fb->bits_per_pixel >> 4;
505
			int tile_addr = (((y >> 3) * pitch_pixels +  x) >> (8 - byteshift)) << 11;
506
			int tile_addr = (((y >> 3) * pitch_pixels +  x) >> (8 - byteshift)) << 11;
506
			base += tile_addr + ((x << byteshift) % 256) + ((y % 8) << 8);
507
			base += tile_addr + ((x << byteshift) % 256) + ((y % 8) << 8);
507
			crtc_offset_cntl |= (y % 16);
508
			crtc_offset_cntl |= (y % 16);
508
		}
509
		}
509
	} else {
510
	} else {
510
		int offset = y * pitch_pixels + x;
511
		int offset = y * pitch_pixels + x;
511
		switch (target_fb->bits_per_pixel) {
512
		switch (target_fb->bits_per_pixel) {
512
		case 8:
513
		case 8:
513
			offset *= 1;
514
			offset *= 1;
514
			break;
515
			break;
515
		case 15:
516
		case 15:
516
		case 16:
517
		case 16:
517
			offset *= 2;
518
			offset *= 2;
518
			break;
519
			break;
519
		case 24:
520
		case 24:
520
			offset *= 3;
521
			offset *= 3;
521
			break;
522
			break;
522
		case 32:
523
		case 32:
523
			offset *= 4;
524
			offset *= 4;
524
			break;
525
			break;
525
		default:
526
		default:
526
			return false;
527
			return false;
527
		}
528
		}
528
		base += offset;
529
		base += offset;
529
	}
530
	}
530
 
531
 
531
	base &= ~7;
532
	base &= ~7;
532
 
533
 
533
	if (radeon_crtc->crtc_id == 1)
534
	if (radeon_crtc->crtc_id == 1)
534
		gen_cntl_reg = RADEON_CRTC2_GEN_CNTL;
535
		gen_cntl_reg = RADEON_CRTC2_GEN_CNTL;
535
	else
536
	else
536
		gen_cntl_reg = RADEON_CRTC_GEN_CNTL;
537
		gen_cntl_reg = RADEON_CRTC_GEN_CNTL;
537
 
538
 
538
	gen_cntl_val = RREG32(gen_cntl_reg);
539
	gen_cntl_val = RREG32(gen_cntl_reg);
539
	gen_cntl_val &= ~(0xf << 8);
540
	gen_cntl_val &= ~(0xf << 8);
540
	gen_cntl_val |= (format << 8);
541
	gen_cntl_val |= (format << 8);
541
	gen_cntl_val &= ~RADEON_CRTC_VSTAT_MODE_MASK;
542
	gen_cntl_val &= ~RADEON_CRTC_VSTAT_MODE_MASK;
542
	WREG32(gen_cntl_reg, gen_cntl_val);
543
	WREG32(gen_cntl_reg, gen_cntl_val);
543
 
544
 
544
	crtc_offset = (u32)base;
545
	crtc_offset = (u32)base;
545
 
546
 
546
	WREG32(RADEON_DISPLAY_BASE_ADDR + radeon_crtc->crtc_offset, radeon_crtc->legacy_display_base_addr);
547
	WREG32(RADEON_DISPLAY_BASE_ADDR + radeon_crtc->crtc_offset, radeon_crtc->legacy_display_base_addr);
547
 
548
 
548
	if (ASIC_IS_R300(rdev)) {
549
	if (ASIC_IS_R300(rdev)) {
549
		if (radeon_crtc->crtc_id)
550
		if (radeon_crtc->crtc_id)
550
			WREG32(R300_CRTC2_TILE_X0_Y0, crtc_tile_x0_y0);
551
			WREG32(R300_CRTC2_TILE_X0_Y0, crtc_tile_x0_y0);
551
		else
552
		else
552
			WREG32(R300_CRTC_TILE_X0_Y0, crtc_tile_x0_y0);
553
			WREG32(R300_CRTC_TILE_X0_Y0, crtc_tile_x0_y0);
553
	}
554
	}
554
	WREG32(RADEON_CRTC_OFFSET_CNTL + radeon_crtc->crtc_offset, crtc_offset_cntl);
555
	WREG32(RADEON_CRTC_OFFSET_CNTL + radeon_crtc->crtc_offset, crtc_offset_cntl);
555
	WREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset, crtc_offset);
556
	WREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset, crtc_offset);
556
	WREG32(RADEON_CRTC_PITCH + radeon_crtc->crtc_offset, crtc_pitch);
557
	WREG32(RADEON_CRTC_PITCH + radeon_crtc->crtc_offset, crtc_pitch);
557
 
558
 
558
	if (!atomic && fb && fb != crtc->primary->fb) {
559
	if (!atomic && fb && fb != crtc->primary->fb) {
559
		radeon_fb = to_radeon_framebuffer(fb);
560
		radeon_fb = to_radeon_framebuffer(fb);
560
		rbo = gem_to_radeon_bo(radeon_fb->obj);
561
		rbo = gem_to_radeon_bo(radeon_fb->obj);
561
		r = radeon_bo_reserve(rbo, false);
562
		r = radeon_bo_reserve(rbo, false);
562
		if (unlikely(r != 0))
563
		if (unlikely(r != 0))
563
			return r;
564
			return r;
564
		radeon_bo_unpin(rbo);
565
		radeon_bo_unpin(rbo);
565
		radeon_bo_unreserve(rbo);
566
		radeon_bo_unreserve(rbo);
566
	}
567
	}
567
 
568
 
568
	/* Bytes per pixel may have changed */
569
	/* Bytes per pixel may have changed */
569
	radeon_bandwidth_update(rdev);
570
	radeon_bandwidth_update(rdev);
570
 
571
 
571
	return 0;
572
	return 0;
572
}
573
}
573
 
574
 
574
static bool radeon_set_crtc_timing(struct drm_crtc *crtc, struct drm_display_mode *mode)
575
static bool radeon_set_crtc_timing(struct drm_crtc *crtc, struct drm_display_mode *mode)
575
{
576
{
576
	struct drm_device *dev = crtc->dev;
577
	struct drm_device *dev = crtc->dev;
577
	struct radeon_device *rdev = dev->dev_private;
578
	struct radeon_device *rdev = dev->dev_private;
578
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
579
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
579
	struct drm_encoder *encoder;
580
	struct drm_encoder *encoder;
580
	int format;
581
	int format;
581
	int hsync_start;
582
	int hsync_start;
582
	int hsync_wid;
583
	int hsync_wid;
583
	int vsync_wid;
584
	int vsync_wid;
584
	uint32_t crtc_h_total_disp;
585
	uint32_t crtc_h_total_disp;
585
	uint32_t crtc_h_sync_strt_wid;
586
	uint32_t crtc_h_sync_strt_wid;
586
	uint32_t crtc_v_total_disp;
587
	uint32_t crtc_v_total_disp;
587
	uint32_t crtc_v_sync_strt_wid;
588
	uint32_t crtc_v_sync_strt_wid;
588
	bool is_tv = false;
589
	bool is_tv = false;
589
 
590
 
590
	DRM_DEBUG_KMS("\n");
591
	DRM_DEBUG_KMS("\n");
591
	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
592
	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
592
		if (encoder->crtc == crtc) {
593
		if (encoder->crtc == crtc) {
593
			struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
594
			struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
594
			if (radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT) {
595
			if (radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT) {
595
				is_tv = true;
596
				is_tv = true;
596
				DRM_INFO("crtc %d is connected to a TV\n", radeon_crtc->crtc_id);
597
				DRM_INFO("crtc %d is connected to a TV\n", radeon_crtc->crtc_id);
597
				break;
598
				break;
598
			}
599
			}
599
		}
600
		}
600
	}
601
	}
601
 
602
 
602
	switch (crtc->primary->fb->bits_per_pixel) {
603
	switch (crtc->primary->fb->bits_per_pixel) {
603
	case 8:
604
	case 8:
604
		format = 2;
605
		format = 2;
605
		break;
606
		break;
606
	case 15:      /*  555 */
607
	case 15:      /*  555 */
607
		format = 3;
608
		format = 3;
608
		break;
609
		break;
609
	case 16:      /*  565 */
610
	case 16:      /*  565 */
610
		format = 4;
611
		format = 4;
611
		break;
612
		break;
612
	case 24:      /*  RGB */
613
	case 24:      /*  RGB */
613
		format = 5;
614
		format = 5;
614
		break;
615
		break;
615
	case 32:      /* xRGB */
616
	case 32:      /* xRGB */
616
		format = 6;
617
		format = 6;
617
		break;
618
		break;
618
	default:
619
	default:
619
		return false;
620
		return false;
620
	}
621
	}
621
 
622
 
622
	crtc_h_total_disp = ((((mode->crtc_htotal / 8) - 1) & 0x3ff)
623
	crtc_h_total_disp = ((((mode->crtc_htotal / 8) - 1) & 0x3ff)
623
			     | ((((mode->crtc_hdisplay / 8) - 1) & 0x1ff) << 16));
624
			     | ((((mode->crtc_hdisplay / 8) - 1) & 0x1ff) << 16));
624
 
625
 
625
	hsync_wid = (mode->crtc_hsync_end - mode->crtc_hsync_start) / 8;
626
	hsync_wid = (mode->crtc_hsync_end - mode->crtc_hsync_start) / 8;
626
	if (!hsync_wid)
627
	if (!hsync_wid)
627
		hsync_wid = 1;
628
		hsync_wid = 1;
628
	hsync_start = mode->crtc_hsync_start - 8;
629
	hsync_start = mode->crtc_hsync_start - 8;
629
 
630
 
630
	crtc_h_sync_strt_wid = ((hsync_start & 0x1fff)
631
	crtc_h_sync_strt_wid = ((hsync_start & 0x1fff)
631
				| ((hsync_wid & 0x3f) << 16)
632
				| ((hsync_wid & 0x3f) << 16)
632
				| ((mode->flags & DRM_MODE_FLAG_NHSYNC)
633
				| ((mode->flags & DRM_MODE_FLAG_NHSYNC)
633
				   ? RADEON_CRTC_H_SYNC_POL
634
				   ? RADEON_CRTC_H_SYNC_POL
634
				   : 0));
635
				   : 0));
635
 
636
 
636
	/* This works for double scan mode. */
637
	/* This works for double scan mode. */
637
	crtc_v_total_disp = (((mode->crtc_vtotal - 1) & 0xffff)
638
	crtc_v_total_disp = (((mode->crtc_vtotal - 1) & 0xffff)
638
			     | ((mode->crtc_vdisplay - 1) << 16));
639
			     | ((mode->crtc_vdisplay - 1) << 16));
639
 
640
 
640
	vsync_wid = mode->crtc_vsync_end - mode->crtc_vsync_start;
641
	vsync_wid = mode->crtc_vsync_end - mode->crtc_vsync_start;
641
	if (!vsync_wid)
642
	if (!vsync_wid)
642
		vsync_wid = 1;
643
		vsync_wid = 1;
643
 
644
 
644
	crtc_v_sync_strt_wid = (((mode->crtc_vsync_start - 1) & 0xfff)
645
	crtc_v_sync_strt_wid = (((mode->crtc_vsync_start - 1) & 0xfff)
645
				| ((vsync_wid & 0x1f) << 16)
646
				| ((vsync_wid & 0x1f) << 16)
646
				| ((mode->flags & DRM_MODE_FLAG_NVSYNC)
647
				| ((mode->flags & DRM_MODE_FLAG_NVSYNC)
647
				   ? RADEON_CRTC_V_SYNC_POL
648
				   ? RADEON_CRTC_V_SYNC_POL
648
				   : 0));
649
				   : 0));
649
 
650
 
650
	if (radeon_crtc->crtc_id) {
651
	if (radeon_crtc->crtc_id) {
651
		uint32_t crtc2_gen_cntl;
652
		uint32_t crtc2_gen_cntl;
652
		uint32_t disp2_merge_cntl;
653
		uint32_t disp2_merge_cntl;
653
 
654
 
654
		/* if TV DAC is enabled for another crtc and keep it enabled */
655
		/* if TV DAC is enabled for another crtc and keep it enabled */
655
		crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL) & 0x00718080;
656
		crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL) & 0x00718080;
656
		crtc2_gen_cntl |= ((format << 8)
657
		crtc2_gen_cntl |= ((format << 8)
657
				   | RADEON_CRTC2_VSYNC_DIS
658
				   | RADEON_CRTC2_VSYNC_DIS
658
				   | RADEON_CRTC2_HSYNC_DIS
659
				   | RADEON_CRTC2_HSYNC_DIS
659
				   | RADEON_CRTC2_DISP_DIS
660
				   | RADEON_CRTC2_DISP_DIS
660
				   | RADEON_CRTC2_DISP_REQ_EN_B
661
				   | RADEON_CRTC2_DISP_REQ_EN_B
661
				   | ((mode->flags & DRM_MODE_FLAG_DBLSCAN)
662
				   | ((mode->flags & DRM_MODE_FLAG_DBLSCAN)
662
				      ? RADEON_CRTC2_DBL_SCAN_EN
663
				      ? RADEON_CRTC2_DBL_SCAN_EN
663
				      : 0)
664
				      : 0)
664
				   | ((mode->flags & DRM_MODE_FLAG_CSYNC)
665
				   | ((mode->flags & DRM_MODE_FLAG_CSYNC)
665
				      ? RADEON_CRTC2_CSYNC_EN
666
				      ? RADEON_CRTC2_CSYNC_EN
666
				      : 0)
667
				      : 0)
667
				   | ((mode->flags & DRM_MODE_FLAG_INTERLACE)
668
				   | ((mode->flags & DRM_MODE_FLAG_INTERLACE)
668
				      ? RADEON_CRTC2_INTERLACE_EN
669
				      ? RADEON_CRTC2_INTERLACE_EN
669
				      : 0));
670
				      : 0));
670
 
671
 
671
		/* rs4xx chips seem to like to have the crtc enabled when the timing is set */
672
		/* rs4xx chips seem to like to have the crtc enabled when the timing is set */
672
		if ((rdev->family == CHIP_RS400) || (rdev->family == CHIP_RS480))
673
		if ((rdev->family == CHIP_RS400) || (rdev->family == CHIP_RS480))
673
			crtc2_gen_cntl |= RADEON_CRTC2_EN;
674
			crtc2_gen_cntl |= RADEON_CRTC2_EN;
674
 
675
 
675
		disp2_merge_cntl = RREG32(RADEON_DISP2_MERGE_CNTL);
676
		disp2_merge_cntl = RREG32(RADEON_DISP2_MERGE_CNTL);
676
		disp2_merge_cntl &= ~RADEON_DISP2_RGB_OFFSET_EN;
677
		disp2_merge_cntl &= ~RADEON_DISP2_RGB_OFFSET_EN;
677
 
678
 
678
		WREG32(RADEON_DISP2_MERGE_CNTL, disp2_merge_cntl);
679
		WREG32(RADEON_DISP2_MERGE_CNTL, disp2_merge_cntl);
679
		WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl);
680
		WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl);
680
 
681
 
681
		WREG32(RADEON_FP_H2_SYNC_STRT_WID, crtc_h_sync_strt_wid);
682
		WREG32(RADEON_FP_H2_SYNC_STRT_WID, crtc_h_sync_strt_wid);
682
		WREG32(RADEON_FP_V2_SYNC_STRT_WID, crtc_v_sync_strt_wid);
683
		WREG32(RADEON_FP_V2_SYNC_STRT_WID, crtc_v_sync_strt_wid);
683
	} else {
684
	} else {
684
		uint32_t crtc_gen_cntl;
685
		uint32_t crtc_gen_cntl;
685
		uint32_t crtc_ext_cntl;
686
		uint32_t crtc_ext_cntl;
686
		uint32_t disp_merge_cntl;
687
		uint32_t disp_merge_cntl;
687
 
688
 
688
		crtc_gen_cntl = RREG32(RADEON_CRTC_GEN_CNTL) & 0x00718000;
689
		crtc_gen_cntl = RREG32(RADEON_CRTC_GEN_CNTL) & 0x00718000;
689
		crtc_gen_cntl |= (RADEON_CRTC_EXT_DISP_EN
690
		crtc_gen_cntl |= (RADEON_CRTC_EXT_DISP_EN
690
				 | (format << 8)
691
				 | (format << 8)
691
				 | RADEON_CRTC_DISP_REQ_EN_B
692
				 | RADEON_CRTC_DISP_REQ_EN_B
692
				 | ((mode->flags & DRM_MODE_FLAG_DBLSCAN)
693
				 | ((mode->flags & DRM_MODE_FLAG_DBLSCAN)
693
				    ? RADEON_CRTC_DBL_SCAN_EN
694
				    ? RADEON_CRTC_DBL_SCAN_EN
694
				    : 0)
695
				    : 0)
695
				 | ((mode->flags & DRM_MODE_FLAG_CSYNC)
696
				 | ((mode->flags & DRM_MODE_FLAG_CSYNC)
696
				    ? RADEON_CRTC_CSYNC_EN
697
				    ? RADEON_CRTC_CSYNC_EN
697
				    : 0)
698
				    : 0)
698
				 | ((mode->flags & DRM_MODE_FLAG_INTERLACE)
699
				 | ((mode->flags & DRM_MODE_FLAG_INTERLACE)
699
				    ? RADEON_CRTC_INTERLACE_EN
700
				    ? RADEON_CRTC_INTERLACE_EN
700
				    : 0));
701
				    : 0));
701
 
702
 
702
		/* rs4xx chips seem to like to have the crtc enabled when the timing is set */
703
		/* rs4xx chips seem to like to have the crtc enabled when the timing is set */
703
		if ((rdev->family == CHIP_RS400) || (rdev->family == CHIP_RS480))
704
		if ((rdev->family == CHIP_RS400) || (rdev->family == CHIP_RS480))
704
			crtc_gen_cntl |= RADEON_CRTC_EN;
705
			crtc_gen_cntl |= RADEON_CRTC_EN;
705
 
706
 
706
		crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL);
707
		crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL);
707
		crtc_ext_cntl |= (RADEON_XCRT_CNT_EN |
708
		crtc_ext_cntl |= (RADEON_XCRT_CNT_EN |
708
				  RADEON_CRTC_VSYNC_DIS |
709
				  RADEON_CRTC_VSYNC_DIS |
709
				  RADEON_CRTC_HSYNC_DIS |
710
				  RADEON_CRTC_HSYNC_DIS |
710
				  RADEON_CRTC_DISPLAY_DIS);
711
				  RADEON_CRTC_DISPLAY_DIS);
711
 
712
 
712
		disp_merge_cntl = RREG32(RADEON_DISP_MERGE_CNTL);
713
		disp_merge_cntl = RREG32(RADEON_DISP_MERGE_CNTL);
713
		disp_merge_cntl &= ~RADEON_DISP_RGB_OFFSET_EN;
714
		disp_merge_cntl &= ~RADEON_DISP_RGB_OFFSET_EN;
714
 
715
 
715
		WREG32(RADEON_DISP_MERGE_CNTL, disp_merge_cntl);
716
		WREG32(RADEON_DISP_MERGE_CNTL, disp_merge_cntl);
716
		WREG32(RADEON_CRTC_GEN_CNTL, crtc_gen_cntl);
717
		WREG32(RADEON_CRTC_GEN_CNTL, crtc_gen_cntl);
717
		WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl);
718
		WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl);
718
	}
719
	}
719
 
720
 
720
	if (is_tv)
721
	if (is_tv)
721
		radeon_legacy_tv_adjust_crtc_reg(encoder, &crtc_h_total_disp,
722
		radeon_legacy_tv_adjust_crtc_reg(encoder, &crtc_h_total_disp,
722
						 &crtc_h_sync_strt_wid, &crtc_v_total_disp,
723
						 &crtc_h_sync_strt_wid, &crtc_v_total_disp,
723
						 &crtc_v_sync_strt_wid);
724
						 &crtc_v_sync_strt_wid);
724
 
725
 
725
	WREG32(RADEON_CRTC_H_TOTAL_DISP + radeon_crtc->crtc_offset, crtc_h_total_disp);
726
	WREG32(RADEON_CRTC_H_TOTAL_DISP + radeon_crtc->crtc_offset, crtc_h_total_disp);
726
	WREG32(RADEON_CRTC_H_SYNC_STRT_WID + radeon_crtc->crtc_offset, crtc_h_sync_strt_wid);
727
	WREG32(RADEON_CRTC_H_SYNC_STRT_WID + radeon_crtc->crtc_offset, crtc_h_sync_strt_wid);
727
	WREG32(RADEON_CRTC_V_TOTAL_DISP + radeon_crtc->crtc_offset, crtc_v_total_disp);
728
	WREG32(RADEON_CRTC_V_TOTAL_DISP + radeon_crtc->crtc_offset, crtc_v_total_disp);
728
	WREG32(RADEON_CRTC_V_SYNC_STRT_WID + radeon_crtc->crtc_offset, crtc_v_sync_strt_wid);
729
	WREG32(RADEON_CRTC_V_SYNC_STRT_WID + radeon_crtc->crtc_offset, crtc_v_sync_strt_wid);
729
 
730
 
730
	return true;
731
	return true;
731
}
732
}
732
 
733
 
733
static void radeon_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode)
734
static void radeon_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode)
734
{
735
{
735
	struct drm_device *dev = crtc->dev;
736
	struct drm_device *dev = crtc->dev;
736
	struct radeon_device *rdev = dev->dev_private;
737
	struct radeon_device *rdev = dev->dev_private;
737
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
738
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
738
	struct drm_encoder *encoder;
739
	struct drm_encoder *encoder;
739
	uint32_t feedback_div = 0;
740
	uint32_t feedback_div = 0;
740
	uint32_t frac_fb_div = 0;
741
	uint32_t frac_fb_div = 0;
741
	uint32_t reference_div = 0;
742
	uint32_t reference_div = 0;
742
	uint32_t post_divider = 0;
743
	uint32_t post_divider = 0;
743
	uint32_t freq = 0;
744
	uint32_t freq = 0;
744
	uint8_t pll_gain;
745
	uint8_t pll_gain;
745
	bool use_bios_divs = false;
746
	bool use_bios_divs = false;
746
	/* PLL registers */
747
	/* PLL registers */
747
	uint32_t pll_ref_div = 0;
748
	uint32_t pll_ref_div = 0;
748
	uint32_t pll_fb_post_div = 0;
749
	uint32_t pll_fb_post_div = 0;
749
	uint32_t htotal_cntl = 0;
750
	uint32_t htotal_cntl = 0;
750
	bool is_tv = false;
751
	bool is_tv = false;
751
	struct radeon_pll *pll;
752
	struct radeon_pll *pll;
752
 
753
 
753
	struct {
754
	struct {
754
		int divider;
755
		int divider;
755
		int bitvalue;
756
		int bitvalue;
756
	} *post_div, post_divs[]   = {
757
	} *post_div, post_divs[]   = {
757
		/* From RAGE 128 VR/RAGE 128 GL Register
758
		/* From RAGE 128 VR/RAGE 128 GL Register
758
		 * Reference Manual (Technical Reference
759
		 * Reference Manual (Technical Reference
759
		 * Manual P/N RRG-G04100-C Rev. 0.04), page
760
		 * Manual P/N RRG-G04100-C Rev. 0.04), page
760
		 * 3-17 (PLL_DIV_[3:0]).
761
		 * 3-17 (PLL_DIV_[3:0]).
761
		 */
762
		 */
762
		{  1, 0 },              /* VCLK_SRC                 */
763
		{  1, 0 },              /* VCLK_SRC                 */
763
		{  2, 1 },              /* VCLK_SRC/2               */
764
		{  2, 1 },              /* VCLK_SRC/2               */
764
		{  4, 2 },              /* VCLK_SRC/4               */
765
		{  4, 2 },              /* VCLK_SRC/4               */
765
		{  8, 3 },              /* VCLK_SRC/8               */
766
		{  8, 3 },              /* VCLK_SRC/8               */
766
		{  3, 4 },              /* VCLK_SRC/3               */
767
		{  3, 4 },              /* VCLK_SRC/3               */
767
		{ 16, 5 },              /* VCLK_SRC/16              */
768
		{ 16, 5 },              /* VCLK_SRC/16              */
768
		{  6, 6 },              /* VCLK_SRC/6               */
769
		{  6, 6 },              /* VCLK_SRC/6               */
769
		{ 12, 7 },              /* VCLK_SRC/12              */
770
		{ 12, 7 },              /* VCLK_SRC/12              */
770
		{  0, 0 }
771
		{  0, 0 }
771
	};
772
	};
772
 
773
 
773
	if (radeon_crtc->crtc_id)
774
	if (radeon_crtc->crtc_id)
774
		pll = &rdev->clock.p2pll;
775
		pll = &rdev->clock.p2pll;
775
	else
776
	else
776
		pll = &rdev->clock.p1pll;
777
		pll = &rdev->clock.p1pll;
777
 
778
 
778
	pll->flags = RADEON_PLL_LEGACY;
779
	pll->flags = RADEON_PLL_LEGACY;
779
 
780
 
780
	if (mode->clock > 200000) /* range limits??? */
781
	if (mode->clock > 200000) /* range limits??? */
781
		pll->flags |= RADEON_PLL_PREFER_HIGH_FB_DIV;
782
		pll->flags |= RADEON_PLL_PREFER_HIGH_FB_DIV;
782
	else
783
	else
783
		pll->flags |= RADEON_PLL_PREFER_LOW_REF_DIV;
784
		pll->flags |= RADEON_PLL_PREFER_LOW_REF_DIV;
784
 
785
 
785
	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
786
	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
786
		if (encoder->crtc == crtc) {
787
		if (encoder->crtc == crtc) {
787
			struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
788
			struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
788
 
789
 
789
			if (radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT) {
790
			if (radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT) {
790
				is_tv = true;
791
				is_tv = true;
791
				break;
792
				break;
792
			}
793
			}
793
 
794
 
794
			if (encoder->encoder_type != DRM_MODE_ENCODER_DAC)
795
			if (encoder->encoder_type != DRM_MODE_ENCODER_DAC)
795
				pll->flags |= RADEON_PLL_NO_ODD_POST_DIV;
796
				pll->flags |= RADEON_PLL_NO_ODD_POST_DIV;
796
			if (encoder->encoder_type == DRM_MODE_ENCODER_LVDS) {
797
			if (encoder->encoder_type == DRM_MODE_ENCODER_LVDS) {
797
				if (!rdev->is_atom_bios) {
798
				if (!rdev->is_atom_bios) {
798
					struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
799
					struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
799
					struct radeon_encoder_lvds *lvds = (struct radeon_encoder_lvds *)radeon_encoder->enc_priv;
800
					struct radeon_encoder_lvds *lvds = (struct radeon_encoder_lvds *)radeon_encoder->enc_priv;
800
					if (lvds) {
801
					if (lvds) {
801
						if (lvds->use_bios_dividers) {
802
						if (lvds->use_bios_dividers) {
802
							pll_ref_div = lvds->panel_ref_divider;
803
							pll_ref_div = lvds->panel_ref_divider;
803
							pll_fb_post_div   = (lvds->panel_fb_divider |
804
							pll_fb_post_div   = (lvds->panel_fb_divider |
804
									     (lvds->panel_post_divider << 16));
805
									     (lvds->panel_post_divider << 16));
805
							htotal_cntl  = 0;
806
							htotal_cntl  = 0;
806
							use_bios_divs = true;
807
							use_bios_divs = true;
807
						}
808
						}
808
					}
809
					}
809
				}
810
				}
810
				pll->flags |= RADEON_PLL_USE_REF_DIV;
811
				pll->flags |= RADEON_PLL_USE_REF_DIV;
811
			}
812
			}
812
		}
813
		}
813
	}
814
	}
814
 
815
 
815
	DRM_DEBUG_KMS("\n");
816
	DRM_DEBUG_KMS("\n");
816
 
817
 
817
	if (!use_bios_divs) {
818
	if (!use_bios_divs) {
818
		radeon_compute_pll_legacy(pll, mode->clock,
819
		radeon_compute_pll_legacy(pll, mode->clock,
819
					  &freq, &feedback_div, &frac_fb_div,
820
					  &freq, &feedback_div, &frac_fb_div,
820
					  &reference_div, &post_divider);
821
					  &reference_div, &post_divider);
821
 
822
 
822
		for (post_div = &post_divs[0]; post_div->divider; ++post_div) {
823
		for (post_div = &post_divs[0]; post_div->divider; ++post_div) {
823
			if (post_div->divider == post_divider)
824
			if (post_div->divider == post_divider)
824
				break;
825
				break;
825
		}
826
		}
826
 
827
 
827
		if (!post_div->divider)
828
		if (!post_div->divider)
828
			post_div = &post_divs[0];
829
			post_div = &post_divs[0];
829
 
830
 
830
		DRM_DEBUG_KMS("dc=%u, fd=%d, rd=%d, pd=%d\n",
831
		DRM_DEBUG_KMS("dc=%u, fd=%d, rd=%d, pd=%d\n",
831
			  (unsigned)freq,
832
			  (unsigned)freq,
832
			  feedback_div,
833
			  feedback_div,
833
			  reference_div,
834
			  reference_div,
834
			  post_divider);
835
			  post_divider);
835
 
836
 
836
		pll_ref_div   = reference_div;
837
		pll_ref_div   = reference_div;
837
#if defined(__powerpc__) && (0) /* TODO */
838
#if defined(__powerpc__) && (0) /* TODO */
838
		/* apparently programming this otherwise causes a hang??? */
839
		/* apparently programming this otherwise causes a hang??? */
839
		if (info->MacModel == RADEON_MAC_IBOOK)
840
		if (info->MacModel == RADEON_MAC_IBOOK)
840
			pll_fb_post_div = 0x000600ad;
841
			pll_fb_post_div = 0x000600ad;
841
		else
842
		else
842
#endif
843
#endif
843
			pll_fb_post_div     = (feedback_div | (post_div->bitvalue << 16));
844
			pll_fb_post_div     = (feedback_div | (post_div->bitvalue << 16));
844
 
845
 
845
		htotal_cntl    = mode->htotal & 0x7;
846
		htotal_cntl    = mode->htotal & 0x7;
846
 
847
 
847
	}
848
	}
848
 
849
 
849
	pll_gain = radeon_compute_pll_gain(pll->reference_freq,
850
	pll_gain = radeon_compute_pll_gain(pll->reference_freq,
850
					   pll_ref_div & 0x3ff,
851
					   pll_ref_div & 0x3ff,
851
					   pll_fb_post_div & 0x7ff);
852
					   pll_fb_post_div & 0x7ff);
852
 
853
 
853
	if (radeon_crtc->crtc_id) {
854
	if (radeon_crtc->crtc_id) {
854
		uint32_t pixclks_cntl = ((RREG32_PLL(RADEON_PIXCLKS_CNTL) &
855
		uint32_t pixclks_cntl = ((RREG32_PLL(RADEON_PIXCLKS_CNTL) &
855
					  ~(RADEON_PIX2CLK_SRC_SEL_MASK)) |
856
					  ~(RADEON_PIX2CLK_SRC_SEL_MASK)) |
856
					 RADEON_PIX2CLK_SRC_SEL_P2PLLCLK);
857
					 RADEON_PIX2CLK_SRC_SEL_P2PLLCLK);
857
 
858
 
858
		if (is_tv) {
859
		if (is_tv) {
859
			radeon_legacy_tv_adjust_pll2(encoder, &htotal_cntl,
860
			radeon_legacy_tv_adjust_pll2(encoder, &htotal_cntl,
860
						     &pll_ref_div, &pll_fb_post_div,
861
						     &pll_ref_div, &pll_fb_post_div,
861
						     &pixclks_cntl);
862
						     &pixclks_cntl);
862
		}
863
		}
863
 
864
 
864
		WREG32_PLL_P(RADEON_PIXCLKS_CNTL,
865
		WREG32_PLL_P(RADEON_PIXCLKS_CNTL,
865
			     RADEON_PIX2CLK_SRC_SEL_CPUCLK,
866
			     RADEON_PIX2CLK_SRC_SEL_CPUCLK,
866
			     ~(RADEON_PIX2CLK_SRC_SEL_MASK));
867
			     ~(RADEON_PIX2CLK_SRC_SEL_MASK));
867
 
868
 
868
		WREG32_PLL_P(RADEON_P2PLL_CNTL,
869
		WREG32_PLL_P(RADEON_P2PLL_CNTL,
869
			     RADEON_P2PLL_RESET
870
			     RADEON_P2PLL_RESET
870
			     | RADEON_P2PLL_ATOMIC_UPDATE_EN
871
			     | RADEON_P2PLL_ATOMIC_UPDATE_EN
871
			     | ((uint32_t)pll_gain << RADEON_P2PLL_PVG_SHIFT),
872
			     | ((uint32_t)pll_gain << RADEON_P2PLL_PVG_SHIFT),
872
			     ~(RADEON_P2PLL_RESET
873
			     ~(RADEON_P2PLL_RESET
873
			       | RADEON_P2PLL_ATOMIC_UPDATE_EN
874
			       | RADEON_P2PLL_ATOMIC_UPDATE_EN
874
			       | RADEON_P2PLL_PVG_MASK));
875
			       | RADEON_P2PLL_PVG_MASK));
875
 
876
 
876
		WREG32_PLL_P(RADEON_P2PLL_REF_DIV,
877
		WREG32_PLL_P(RADEON_P2PLL_REF_DIV,
877
			     pll_ref_div,
878
			     pll_ref_div,
878
			     ~RADEON_P2PLL_REF_DIV_MASK);
879
			     ~RADEON_P2PLL_REF_DIV_MASK);
879
 
880
 
880
		WREG32_PLL_P(RADEON_P2PLL_DIV_0,
881
		WREG32_PLL_P(RADEON_P2PLL_DIV_0,
881
			     pll_fb_post_div,
882
			     pll_fb_post_div,
882
			     ~RADEON_P2PLL_FB0_DIV_MASK);
883
			     ~RADEON_P2PLL_FB0_DIV_MASK);
883
 
884
 
884
		WREG32_PLL_P(RADEON_P2PLL_DIV_0,
885
		WREG32_PLL_P(RADEON_P2PLL_DIV_0,
885
			     pll_fb_post_div,
886
			     pll_fb_post_div,
886
			     ~RADEON_P2PLL_POST0_DIV_MASK);
887
			     ~RADEON_P2PLL_POST0_DIV_MASK);
887
 
888
 
888
		radeon_pll2_write_update(dev);
889
		radeon_pll2_write_update(dev);
889
		radeon_pll2_wait_for_read_update_complete(dev);
890
		radeon_pll2_wait_for_read_update_complete(dev);
890
 
891
 
891
		WREG32_PLL(RADEON_HTOTAL2_CNTL, htotal_cntl);
892
		WREG32_PLL(RADEON_HTOTAL2_CNTL, htotal_cntl);
892
 
893
 
893
		WREG32_PLL_P(RADEON_P2PLL_CNTL,
894
		WREG32_PLL_P(RADEON_P2PLL_CNTL,
894
			     0,
895
			     0,
895
			     ~(RADEON_P2PLL_RESET
896
			     ~(RADEON_P2PLL_RESET
896
			       | RADEON_P2PLL_SLEEP
897
			       | RADEON_P2PLL_SLEEP
897
			       | RADEON_P2PLL_ATOMIC_UPDATE_EN));
898
			       | RADEON_P2PLL_ATOMIC_UPDATE_EN));
898
 
899
 
899
		DRM_DEBUG_KMS("Wrote2: 0x%08x 0x%08x 0x%08x (0x%08x)\n",
900
		DRM_DEBUG_KMS("Wrote2: 0x%08x 0x%08x 0x%08x (0x%08x)\n",
900
			  (unsigned)pll_ref_div,
901
			  (unsigned)pll_ref_div,
901
			  (unsigned)pll_fb_post_div,
902
			  (unsigned)pll_fb_post_div,
902
			  (unsigned)htotal_cntl,
903
			  (unsigned)htotal_cntl,
903
			  RREG32_PLL(RADEON_P2PLL_CNTL));
904
			  RREG32_PLL(RADEON_P2PLL_CNTL));
904
		DRM_DEBUG_KMS("Wrote2: rd=%u, fd=%u, pd=%u\n",
905
		DRM_DEBUG_KMS("Wrote2: rd=%u, fd=%u, pd=%u\n",
905
			  (unsigned)pll_ref_div & RADEON_P2PLL_REF_DIV_MASK,
906
			  (unsigned)pll_ref_div & RADEON_P2PLL_REF_DIV_MASK,
906
			  (unsigned)pll_fb_post_div & RADEON_P2PLL_FB0_DIV_MASK,
907
			  (unsigned)pll_fb_post_div & RADEON_P2PLL_FB0_DIV_MASK,
907
			  (unsigned)((pll_fb_post_div &
908
			  (unsigned)((pll_fb_post_div &
908
				      RADEON_P2PLL_POST0_DIV_MASK) >> 16));
909
				      RADEON_P2PLL_POST0_DIV_MASK) >> 16));
909
 
910
 
910
		mdelay(50); /* Let the clock to lock */
911
		mdelay(50); /* Let the clock to lock */
911
 
912
 
912
		WREG32_PLL_P(RADEON_PIXCLKS_CNTL,
913
		WREG32_PLL_P(RADEON_PIXCLKS_CNTL,
913
			     RADEON_PIX2CLK_SRC_SEL_P2PLLCLK,
914
			     RADEON_PIX2CLK_SRC_SEL_P2PLLCLK,
914
			     ~(RADEON_PIX2CLK_SRC_SEL_MASK));
915
			     ~(RADEON_PIX2CLK_SRC_SEL_MASK));
915
 
916
 
916
		WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);
917
		WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);
917
	} else {
918
	} else {
918
		uint32_t pixclks_cntl;
919
		uint32_t pixclks_cntl;
919
 
920
 
920
 
921
 
921
		if (is_tv) {
922
		if (is_tv) {
922
			pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL);
923
			pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL);
923
			radeon_legacy_tv_adjust_pll1(encoder, &htotal_cntl, &pll_ref_div,
924
			radeon_legacy_tv_adjust_pll1(encoder, &htotal_cntl, &pll_ref_div,
924
						     &pll_fb_post_div, &pixclks_cntl);
925
						     &pll_fb_post_div, &pixclks_cntl);
925
		}
926
		}
926
 
927
 
927
		if (rdev->flags & RADEON_IS_MOBILITY) {
928
		if (rdev->flags & RADEON_IS_MOBILITY) {
928
			/* A temporal workaround for the occasional blanking on certain laptop panels.
929
			/* A temporal workaround for the occasional blanking on certain laptop panels.
929
			   This appears to related to the PLL divider registers (fail to lock?).
930
			   This appears to related to the PLL divider registers (fail to lock?).
930
			   It occurs even when all dividers are the same with their old settings.
931
			   It occurs even when all dividers are the same with their old settings.
931
			   In this case we really don't need to fiddle with PLL registers.
932
			   In this case we really don't need to fiddle with PLL registers.
932
			   By doing this we can avoid the blanking problem with some panels.
933
			   By doing this we can avoid the blanking problem with some panels.
933
			*/
934
			*/
934
			if ((pll_ref_div == (RREG32_PLL(RADEON_PPLL_REF_DIV) & RADEON_PPLL_REF_DIV_MASK)) &&
935
			if ((pll_ref_div == (RREG32_PLL(RADEON_PPLL_REF_DIV) & RADEON_PPLL_REF_DIV_MASK)) &&
935
			    (pll_fb_post_div == (RREG32_PLL(RADEON_PPLL_DIV_3) &
936
			    (pll_fb_post_div == (RREG32_PLL(RADEON_PPLL_DIV_3) &
936
						 (RADEON_PPLL_POST3_DIV_MASK | RADEON_PPLL_FB3_DIV_MASK)))) {
937
						 (RADEON_PPLL_POST3_DIV_MASK | RADEON_PPLL_FB3_DIV_MASK)))) {
937
				WREG32_P(RADEON_CLOCK_CNTL_INDEX,
938
				WREG32_P(RADEON_CLOCK_CNTL_INDEX,
938
					 RADEON_PLL_DIV_SEL,
939
					 RADEON_PLL_DIV_SEL,
939
					 ~(RADEON_PLL_DIV_SEL));
940
					 ~(RADEON_PLL_DIV_SEL));
940
				r100_pll_errata_after_index(rdev);
941
				r100_pll_errata_after_index(rdev);
941
				return;
942
				return;
942
			}
943
			}
943
		}
944
		}
944
 
945
 
945
		WREG32_PLL_P(RADEON_VCLK_ECP_CNTL,
946
		WREG32_PLL_P(RADEON_VCLK_ECP_CNTL,
946
			     RADEON_VCLK_SRC_SEL_CPUCLK,
947
			     RADEON_VCLK_SRC_SEL_CPUCLK,
947
			     ~(RADEON_VCLK_SRC_SEL_MASK));
948
			     ~(RADEON_VCLK_SRC_SEL_MASK));
948
		WREG32_PLL_P(RADEON_PPLL_CNTL,
949
		WREG32_PLL_P(RADEON_PPLL_CNTL,
949
			     RADEON_PPLL_RESET
950
			     RADEON_PPLL_RESET
950
			     | RADEON_PPLL_ATOMIC_UPDATE_EN
951
			     | RADEON_PPLL_ATOMIC_UPDATE_EN
951
			     | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN
952
			     | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN
952
			     | ((uint32_t)pll_gain << RADEON_PPLL_PVG_SHIFT),
953
			     | ((uint32_t)pll_gain << RADEON_PPLL_PVG_SHIFT),
953
			     ~(RADEON_PPLL_RESET
954
			     ~(RADEON_PPLL_RESET
954
			       | RADEON_PPLL_ATOMIC_UPDATE_EN
955
			       | RADEON_PPLL_ATOMIC_UPDATE_EN
955
			       | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN
956
			       | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN
956
			       | RADEON_PPLL_PVG_MASK));
957
			       | RADEON_PPLL_PVG_MASK));
957
 
958
 
958
		WREG32_P(RADEON_CLOCK_CNTL_INDEX,
959
		WREG32_P(RADEON_CLOCK_CNTL_INDEX,
959
			 RADEON_PLL_DIV_SEL,
960
			 RADEON_PLL_DIV_SEL,
960
			 ~(RADEON_PLL_DIV_SEL));
961
			 ~(RADEON_PLL_DIV_SEL));
961
		r100_pll_errata_after_index(rdev);
962
		r100_pll_errata_after_index(rdev);
962
 
963
 
963
		if (ASIC_IS_R300(rdev) ||
964
		if (ASIC_IS_R300(rdev) ||
964
		    (rdev->family == CHIP_RS300) ||
965
		    (rdev->family == CHIP_RS300) ||
965
		    (rdev->family == CHIP_RS400) ||
966
		    (rdev->family == CHIP_RS400) ||
966
		    (rdev->family == CHIP_RS480)) {
967
		    (rdev->family == CHIP_RS480)) {
967
			if (pll_ref_div & R300_PPLL_REF_DIV_ACC_MASK) {
968
			if (pll_ref_div & R300_PPLL_REF_DIV_ACC_MASK) {
968
				/* When restoring console mode, use saved PPLL_REF_DIV
969
				/* When restoring console mode, use saved PPLL_REF_DIV
969
				 * setting.
970
				 * setting.
970
				 */
971
				 */
971
				WREG32_PLL_P(RADEON_PPLL_REF_DIV,
972
				WREG32_PLL_P(RADEON_PPLL_REF_DIV,
972
					     pll_ref_div,
973
					     pll_ref_div,
973
					     0);
974
					     0);
974
			} else {
975
			} else {
975
				/* R300 uses ref_div_acc field as real ref divider */
976
				/* R300 uses ref_div_acc field as real ref divider */
976
				WREG32_PLL_P(RADEON_PPLL_REF_DIV,
977
				WREG32_PLL_P(RADEON_PPLL_REF_DIV,
977
					     (pll_ref_div << R300_PPLL_REF_DIV_ACC_SHIFT),
978
					     (pll_ref_div << R300_PPLL_REF_DIV_ACC_SHIFT),
978
					     ~R300_PPLL_REF_DIV_ACC_MASK);
979
					     ~R300_PPLL_REF_DIV_ACC_MASK);
979
			}
980
			}
980
		} else
981
		} else
981
			WREG32_PLL_P(RADEON_PPLL_REF_DIV,
982
			WREG32_PLL_P(RADEON_PPLL_REF_DIV,
982
				     pll_ref_div,
983
				     pll_ref_div,
983
				     ~RADEON_PPLL_REF_DIV_MASK);
984
				     ~RADEON_PPLL_REF_DIV_MASK);
984
 
985
 
985
		WREG32_PLL_P(RADEON_PPLL_DIV_3,
986
		WREG32_PLL_P(RADEON_PPLL_DIV_3,
986
			     pll_fb_post_div,
987
			     pll_fb_post_div,
987
			     ~RADEON_PPLL_FB3_DIV_MASK);
988
			     ~RADEON_PPLL_FB3_DIV_MASK);
988
 
989
 
989
		WREG32_PLL_P(RADEON_PPLL_DIV_3,
990
		WREG32_PLL_P(RADEON_PPLL_DIV_3,
990
			     pll_fb_post_div,
991
			     pll_fb_post_div,
991
			     ~RADEON_PPLL_POST3_DIV_MASK);
992
			     ~RADEON_PPLL_POST3_DIV_MASK);
992
 
993
 
993
		radeon_pll_write_update(dev);
994
		radeon_pll_write_update(dev);
994
		radeon_pll_wait_for_read_update_complete(dev);
995
		radeon_pll_wait_for_read_update_complete(dev);
995
 
996
 
996
		WREG32_PLL(RADEON_HTOTAL_CNTL, htotal_cntl);
997
		WREG32_PLL(RADEON_HTOTAL_CNTL, htotal_cntl);
997
 
998
 
998
		WREG32_PLL_P(RADEON_PPLL_CNTL,
999
		WREG32_PLL_P(RADEON_PPLL_CNTL,
999
			     0,
1000
			     0,
1000
			     ~(RADEON_PPLL_RESET
1001
			     ~(RADEON_PPLL_RESET
1001
			       | RADEON_PPLL_SLEEP
1002
			       | RADEON_PPLL_SLEEP
1002
			       | RADEON_PPLL_ATOMIC_UPDATE_EN
1003
			       | RADEON_PPLL_ATOMIC_UPDATE_EN
1003
			       | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN));
1004
			       | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN));
1004
 
1005
 
1005
		DRM_DEBUG_KMS("Wrote: 0x%08x 0x%08x 0x%08x (0x%08x)\n",
1006
		DRM_DEBUG_KMS("Wrote: 0x%08x 0x%08x 0x%08x (0x%08x)\n",
1006
			  pll_ref_div,
1007
			  pll_ref_div,
1007
			  pll_fb_post_div,
1008
			  pll_fb_post_div,
1008
			  (unsigned)htotal_cntl,
1009
			  (unsigned)htotal_cntl,
1009
			  RREG32_PLL(RADEON_PPLL_CNTL));
1010
			  RREG32_PLL(RADEON_PPLL_CNTL));
1010
		DRM_DEBUG_KMS("Wrote: rd=%d, fd=%d, pd=%d\n",
1011
		DRM_DEBUG_KMS("Wrote: rd=%d, fd=%d, pd=%d\n",
1011
			  pll_ref_div & RADEON_PPLL_REF_DIV_MASK,
1012
			  pll_ref_div & RADEON_PPLL_REF_DIV_MASK,
1012
			  pll_fb_post_div & RADEON_PPLL_FB3_DIV_MASK,
1013
			  pll_fb_post_div & RADEON_PPLL_FB3_DIV_MASK,
1013
			  (pll_fb_post_div & RADEON_PPLL_POST3_DIV_MASK) >> 16);
1014
			  (pll_fb_post_div & RADEON_PPLL_POST3_DIV_MASK) >> 16);
1014
 
1015
 
1015
		mdelay(50); /* Let the clock to lock */
1016
		mdelay(50); /* Let the clock to lock */
1016
 
1017
 
1017
		WREG32_PLL_P(RADEON_VCLK_ECP_CNTL,
1018
		WREG32_PLL_P(RADEON_VCLK_ECP_CNTL,
1018
			     RADEON_VCLK_SRC_SEL_PPLLCLK,
1019
			     RADEON_VCLK_SRC_SEL_PPLLCLK,
1019
			     ~(RADEON_VCLK_SRC_SEL_MASK));
1020
			     ~(RADEON_VCLK_SRC_SEL_MASK));
1020
 
1021
 
1021
		if (is_tv)
1022
		if (is_tv)
1022
			WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);
1023
			WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);
1023
	}
1024
	}
1024
}
1025
}
1025
 
1026
 
1026
static bool radeon_crtc_mode_fixup(struct drm_crtc *crtc,
1027
static bool radeon_crtc_mode_fixup(struct drm_crtc *crtc,
1027
				   const struct drm_display_mode *mode,
1028
				   const struct drm_display_mode *mode,
1028
				   struct drm_display_mode *adjusted_mode)
1029
				   struct drm_display_mode *adjusted_mode)
1029
{
1030
{
1030
	if (!radeon_crtc_scaling_mode_fixup(crtc, mode, adjusted_mode))
1031
	if (!radeon_crtc_scaling_mode_fixup(crtc, mode, adjusted_mode))
1031
		return false;
1032
		return false;
1032
	return true;
1033
	return true;
1033
}
1034
}
1034
 
1035
 
1035
static int radeon_crtc_mode_set(struct drm_crtc *crtc,
1036
static int radeon_crtc_mode_set(struct drm_crtc *crtc,
1036
				 struct drm_display_mode *mode,
1037
				 struct drm_display_mode *mode,
1037
				 struct drm_display_mode *adjusted_mode,
1038
				 struct drm_display_mode *adjusted_mode,
1038
				 int x, int y, struct drm_framebuffer *old_fb)
1039
				 int x, int y, struct drm_framebuffer *old_fb)
1039
{
1040
{
1040
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
1041
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
1041
 
1042
 
1042
	/* TODO TV */
1043
	/* TODO TV */
1043
	radeon_crtc_set_base(crtc, x, y, old_fb);
1044
	radeon_crtc_set_base(crtc, x, y, old_fb);
1044
	radeon_set_crtc_timing(crtc, adjusted_mode);
1045
	radeon_set_crtc_timing(crtc, adjusted_mode);
1045
	radeon_set_pll(crtc, adjusted_mode);
1046
	radeon_set_pll(crtc, adjusted_mode);
1046
	radeon_overscan_setup(crtc, adjusted_mode);
1047
	radeon_overscan_setup(crtc, adjusted_mode);
1047
	if (radeon_crtc->crtc_id == 0) {
1048
	if (radeon_crtc->crtc_id == 0) {
1048
		radeon_legacy_rmx_mode_set(crtc, adjusted_mode);
1049
		radeon_legacy_rmx_mode_set(crtc, adjusted_mode);
1049
	} else {
1050
	} else {
1050
		if (radeon_crtc->rmx_type != RMX_OFF) {
1051
		if (radeon_crtc->rmx_type != RMX_OFF) {
1051
			/* FIXME: only first crtc has rmx what should we
1052
			/* FIXME: only first crtc has rmx what should we
1052
			 * do ?
1053
			 * do ?
1053
			 */
1054
			 */
1054
			DRM_ERROR("Mode need scaling but only first crtc can do that.\n");
1055
			DRM_ERROR("Mode need scaling but only first crtc can do that.\n");
1055
		}
1056
		}
1056
	}
1057
	}
1057
	radeon_cursor_reset(crtc);
1058
	radeon_cursor_reset(crtc);
1058
	return 0;
1059
	return 0;
1059
}
1060
}
1060
 
1061
 
1061
static void radeon_crtc_prepare(struct drm_crtc *crtc)
1062
static void radeon_crtc_prepare(struct drm_crtc *crtc)
1062
{
1063
{
1063
	struct drm_device *dev = crtc->dev;
1064
	struct drm_device *dev = crtc->dev;
1064
	struct drm_crtc *crtci;
1065
	struct drm_crtc *crtci;
1065
 
1066
 
1066
	/*
1067
	/*
1067
	* The hardware wedges sometimes if you reconfigure one CRTC
1068
	* The hardware wedges sometimes if you reconfigure one CRTC
1068
	* whilst another is running (see fdo bug #24611).
1069
	* whilst another is running (see fdo bug #24611).
1069
	*/
1070
	*/
1070
	list_for_each_entry(crtci, &dev->mode_config.crtc_list, head)
1071
	list_for_each_entry(crtci, &dev->mode_config.crtc_list, head)
1071
		radeon_crtc_dpms(crtci, DRM_MODE_DPMS_OFF);
1072
		radeon_crtc_dpms(crtci, DRM_MODE_DPMS_OFF);
1072
}
1073
}
1073
 
1074
 
1074
static void radeon_crtc_commit(struct drm_crtc *crtc)
1075
static void radeon_crtc_commit(struct drm_crtc *crtc)
1075
{
1076
{
1076
	struct drm_device *dev = crtc->dev;
1077
	struct drm_device *dev = crtc->dev;
1077
	struct drm_crtc *crtci;
1078
	struct drm_crtc *crtci;
1078
 
1079
 
1079
	/*
1080
	/*
1080
	* Reenable the CRTCs that should be running.
1081
	* Reenable the CRTCs that should be running.
1081
	*/
1082
	*/
1082
	list_for_each_entry(crtci, &dev->mode_config.crtc_list, head) {
1083
	list_for_each_entry(crtci, &dev->mode_config.crtc_list, head) {
1083
		if (crtci->enabled)
1084
		if (crtci->enabled)
1084
			radeon_crtc_dpms(crtci, DRM_MODE_DPMS_ON);
1085
			radeon_crtc_dpms(crtci, DRM_MODE_DPMS_ON);
1085
	}
1086
	}
1086
}
1087
}
1087
 
1088
 
1088
static void radeon_crtc_disable(struct drm_crtc *crtc)
1089
static void radeon_crtc_disable(struct drm_crtc *crtc)
1089
{
1090
{
1090
	radeon_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
1091
	radeon_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
1091
	if (crtc->primary->fb) {
1092
	if (crtc->primary->fb) {
1092
		int r;
1093
		int r;
1093
		struct radeon_framebuffer *radeon_fb;
1094
		struct radeon_framebuffer *radeon_fb;
1094
		struct radeon_bo *rbo;
1095
		struct radeon_bo *rbo;
1095
 
1096
 
1096
		radeon_fb = to_radeon_framebuffer(crtc->primary->fb);
1097
		radeon_fb = to_radeon_framebuffer(crtc->primary->fb);
1097
		rbo = gem_to_radeon_bo(radeon_fb->obj);
1098
		rbo = gem_to_radeon_bo(radeon_fb->obj);
1098
		r = radeon_bo_reserve(rbo, false);
1099
		r = radeon_bo_reserve(rbo, false);
1099
		if (unlikely(r))
1100
		if (unlikely(r))
1100
			DRM_ERROR("failed to reserve rbo before unpin\n");
1101
			DRM_ERROR("failed to reserve rbo before unpin\n");
1101
		else {
1102
		else {
1102
			radeon_bo_unpin(rbo);
1103
			radeon_bo_unpin(rbo);
1103
			radeon_bo_unreserve(rbo);
1104
			radeon_bo_unreserve(rbo);
1104
		}
1105
		}
1105
	}
1106
	}
1106
}
1107
}
1107
 
1108
 
1108
static const struct drm_crtc_helper_funcs legacy_helper_funcs = {
1109
static const struct drm_crtc_helper_funcs legacy_helper_funcs = {
1109
	.dpms = radeon_crtc_dpms,
1110
	.dpms = radeon_crtc_dpms,
1110
	.mode_fixup = radeon_crtc_mode_fixup,
1111
	.mode_fixup = radeon_crtc_mode_fixup,
1111
	.mode_set = radeon_crtc_mode_set,
1112
	.mode_set = radeon_crtc_mode_set,
1112
	.mode_set_base = radeon_crtc_set_base,
1113
	.mode_set_base = radeon_crtc_set_base,
1113
	.mode_set_base_atomic = radeon_crtc_set_base_atomic,
1114
	.mode_set_base_atomic = radeon_crtc_set_base_atomic,
1114
	.prepare = radeon_crtc_prepare,
1115
	.prepare = radeon_crtc_prepare,
1115
	.commit = radeon_crtc_commit,
1116
	.commit = radeon_crtc_commit,
1116
	.load_lut = radeon_crtc_load_lut,
1117
	.load_lut = radeon_crtc_load_lut,
1117
	.disable = radeon_crtc_disable
1118
	.disable = radeon_crtc_disable
1118
};
1119
};
1119
 
1120
 
1120
 
1121
 
1121
void radeon_legacy_init_crtc(struct drm_device *dev,
1122
void radeon_legacy_init_crtc(struct drm_device *dev,
1122
			       struct radeon_crtc *radeon_crtc)
1123
			       struct radeon_crtc *radeon_crtc)
1123
{
1124
{
1124
	if (radeon_crtc->crtc_id == 1)
1125
	if (radeon_crtc->crtc_id == 1)
1125
		radeon_crtc->crtc_offset = RADEON_CRTC2_H_TOTAL_DISP - RADEON_CRTC_H_TOTAL_DISP;
1126
		radeon_crtc->crtc_offset = RADEON_CRTC2_H_TOTAL_DISP - RADEON_CRTC_H_TOTAL_DISP;
1126
	drm_crtc_helper_add(&radeon_crtc->base, &legacy_helper_funcs);
1127
	drm_crtc_helper_add(&radeon_crtc->base, &legacy_helper_funcs);
1127
}
1128
}