Subversion Repositories Kolibri OS

Rev

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

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