Subversion Repositories Kolibri OS

Rev

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

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