Subversion Repositories Kolibri OS

Rev

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

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