Subversion Repositories Kolibri OS

Rev

Rev 1430 | Rev 2997 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1430 Rev 1963
Line 89... Line 89...
89
		mclk >>= 3;
89
		mclk >>= 3;
Line 90... Line 90...
90
 
90
 
91
	return mclk;
91
	return mclk;
Line -... Line 92...
-
 
92
}
-
 
93
 
-
 
94
#ifdef CONFIG_OF
-
 
95
/*
-
 
96
 * Read XTAL (ref clock), SCLK and MCLK from Open Firmware device
-
 
97
 * tree. Hopefully, ATI OF driver is kind enough to fill these
-
 
98
 */
-
 
99
static bool __devinit radeon_read_clocks_OF(struct drm_device *dev)
-
 
100
{
-
 
101
	struct radeon_device *rdev = dev->dev_private;
-
 
102
	struct device_node *dp = rdev->pdev->dev.of_node;
-
 
103
	const u32 *val;
-
 
104
	struct radeon_pll *p1pll = &rdev->clock.p1pll;
-
 
105
	struct radeon_pll *p2pll = &rdev->clock.p2pll;
-
 
106
	struct radeon_pll *spll = &rdev->clock.spll;
-
 
107
	struct radeon_pll *mpll = &rdev->clock.mpll;
-
 
108
 
-
 
109
	if (dp == NULL)
-
 
110
		return false;
-
 
111
	val = of_get_property(dp, "ATY,RefCLK", NULL);
-
 
112
	if (!val || !*val) {
-
 
113
		printk(KERN_WARNING "radeonfb: No ATY,RefCLK property !\n");
-
 
114
		return false;
-
 
115
	}
-
 
116
	p1pll->reference_freq = p2pll->reference_freq = (*val) / 10;
-
 
117
	p1pll->reference_div = RREG32_PLL(RADEON_PPLL_REF_DIV) & 0x3ff;
-
 
118
	if (p1pll->reference_div < 2)
-
 
119
		p1pll->reference_div = 12;
-
 
120
	p2pll->reference_div = p1pll->reference_div;
-
 
121
 
-
 
122
	/* These aren't in the device-tree */
-
 
123
	if (rdev->family >= CHIP_R420) {
-
 
124
		p1pll->pll_in_min = 100;
-
 
125
		p1pll->pll_in_max = 1350;
-
 
126
		p1pll->pll_out_min = 20000;
-
 
127
		p1pll->pll_out_max = 50000;
-
 
128
		p2pll->pll_in_min = 100;
-
 
129
		p2pll->pll_in_max = 1350;
-
 
130
		p2pll->pll_out_min = 20000;
-
 
131
		p2pll->pll_out_max = 50000;
-
 
132
	} else {
-
 
133
		p1pll->pll_in_min = 40;
-
 
134
		p1pll->pll_in_max = 500;
-
 
135
		p1pll->pll_out_min = 12500;
-
 
136
		p1pll->pll_out_max = 35000;
-
 
137
		p2pll->pll_in_min = 40;
-
 
138
		p2pll->pll_in_max = 500;
-
 
139
		p2pll->pll_out_min = 12500;
-
 
140
		p2pll->pll_out_max = 35000;
-
 
141
	}
-
 
142
	/* not sure what the max should be in all cases */
-
 
143
	rdev->clock.max_pixel_clock = 35000;
-
 
144
 
-
 
145
	spll->reference_freq = mpll->reference_freq = p1pll->reference_freq;
-
 
146
	spll->reference_div = mpll->reference_div =
-
 
147
		RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
-
 
148
			    RADEON_M_SPLL_REF_DIV_MASK;
-
 
149
 
-
 
150
	val = of_get_property(dp, "ATY,SCLK", NULL);
-
 
151
	if (val && *val)
-
 
152
		rdev->clock.default_sclk = (*val) / 10;
-
 
153
	else
-
 
154
		rdev->clock.default_sclk =
-
 
155
			radeon_legacy_get_engine_clock(rdev);
-
 
156
 
-
 
157
	val = of_get_property(dp, "ATY,MCLK", NULL);
-
 
158
	if (val && *val)
-
 
159
		rdev->clock.default_mclk = (*val) / 10;
-
 
160
	else
-
 
161
		rdev->clock.default_mclk =
-
 
162
			radeon_legacy_get_memory_clock(rdev);
-
 
163
 
-
 
164
	DRM_INFO("Using device-tree clock info\n");
-
 
165
 
-
 
166
	return true;
-
 
167
}
-
 
168
#else
-
 
169
static bool radeon_read_clocks_OF(struct drm_device *dev)
-
 
170
{
-
 
171
	return false;
-
 
172
}
92
}
173
#endif /* CONFIG_OF */
93
 
174
 
94
void radeon_get_clock_info(struct drm_device *dev)
175
void radeon_get_clock_info(struct drm_device *dev)
95
{
176
{
96
	struct radeon_device *rdev = dev->dev_private;
177
	struct radeon_device *rdev = dev->dev_private;
Line 103... Line 184...
103
 
184
 
104
	if (rdev->is_atom_bios)
185
	if (rdev->is_atom_bios)
105
		ret = radeon_atom_get_clock_info(dev);
186
		ret = radeon_atom_get_clock_info(dev);
106
	else
187
	else
-
 
188
		ret = radeon_combios_get_clock_info(dev);
-
 
189
	if (!ret)
Line 107... Line 190...
107
		ret = radeon_combios_get_clock_info(dev);
190
		ret = radeon_read_clocks_OF(dev);
108
 
191
 
109
	if (ret) {
192
	if (ret) {
110
		if (p1pll->reference_div < 2) {
193
		if (p1pll->reference_div < 2) {
Line 244... Line 327...
244
	mpll->max_ref_div = 0xff;
327
	mpll->max_ref_div = 0xff;
245
	mpll->min_feedback_div = 4;
328
	mpll->min_feedback_div = 4;
246
	mpll->max_feedback_div = 0xff;
329
	mpll->max_feedback_div = 0xff;
247
	mpll->best_vco = 0;
330
	mpll->best_vco = 0;
Line -... Line 331...
-
 
331
 
-
 
332
	if (!rdev->clock.default_sclk)
-
 
333
		rdev->clock.default_sclk = radeon_get_engine_clock(rdev);
-
 
334
	if ((!rdev->clock.default_mclk) && rdev->asic->get_memory_clock)
-
 
335
		rdev->clock.default_mclk = radeon_get_memory_clock(rdev);
-
 
336
 
-
 
337
	rdev->pm.current_sclk = rdev->clock.default_sclk;
-
 
338
	rdev->pm.current_mclk = rdev->clock.default_mclk;
248
 
339
 
Line 249... Line 340...
249
}
340
}
250
 
341
 
251
/* 10 khz */
342
/* 10 khz */
Line 814... Line 905...
814
			WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
905
			WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
815
		}
906
		}
816
	}
907
	}
817
}
908
}
Line 818... Line -...
818
 
-
 
819
static void radeon_apply_clock_quirks(struct radeon_device *rdev)
-
 
820
{
-
 
821
	uint32_t tmp;
-
 
822
 
-
 
823
	/* XXX make sure engine is idle */
-
 
824
 
-
 
825
	if (rdev->family < CHIP_RS600) {
-
 
826
		tmp = RREG32_PLL(RADEON_SCLK_CNTL);
-
 
827
		if (ASIC_IS_R300(rdev) || ASIC_IS_RV100(rdev))
-
 
828
			tmp |= RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_VIP;
-
 
829
		if ((rdev->family == CHIP_RV250)
-
 
830
		    || (rdev->family == CHIP_RV280))
-
 
831
			tmp |=
-
 
832
			    RADEON_SCLK_FORCE_DISP1 | RADEON_SCLK_FORCE_DISP2;
-
 
833
		if ((rdev->family == CHIP_RV350)
-
 
834
		    || (rdev->family == CHIP_RV380))
-
 
835
			tmp |= R300_SCLK_FORCE_VAP;
-
 
836
		if (rdev->family == CHIP_R420)
-
 
837
			tmp |= R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX;
-
 
838
		WREG32_PLL(RADEON_SCLK_CNTL, tmp);
-
 
839
	} else if (rdev->family < CHIP_R600) {
-
 
840
		tmp = RREG32_PLL(AVIVO_CP_DYN_CNTL);
-
 
841
		tmp |= AVIVO_CP_FORCEON;
-
 
842
		WREG32_PLL(AVIVO_CP_DYN_CNTL, tmp);
-
 
843
 
-
 
844
		tmp = RREG32_PLL(AVIVO_E2_DYN_CNTL);
-
 
845
		tmp |= AVIVO_E2_FORCEON;
-
 
846
		WREG32_PLL(AVIVO_E2_DYN_CNTL, tmp);
-
 
847
 
-
 
848
		tmp = RREG32_PLL(AVIVO_IDCT_DYN_CNTL);
-
 
849
		tmp |= AVIVO_IDCT_FORCEON;
-
 
850
		WREG32_PLL(AVIVO_IDCT_DYN_CNTL, tmp);
-
 
851
	}
-
 
852
}
-
 
853
 
-
 
854
int radeon_static_clocks_init(struct drm_device *dev)
-
 
855
{
-
 
856
	struct radeon_device *rdev = dev->dev_private;
-
 
857
 
-
 
858
	/* XXX make sure engine is idle */
-
 
859
 
-
 
860
	if (radeon_dynclks != -1) {
-
 
861
		if (radeon_dynclks) {
-
 
862
			if (rdev->asic->set_clock_gating)
-
 
863
			radeon_set_clock_gating(rdev, 1);
-
 
864
		}
-
 
865
	}
-
 
866
	radeon_apply_clock_quirks(rdev);
-
 
867
	return 0;
-