Subversion Repositories Kolibri OS

Rev

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

Rev 1268 Rev 1321
Line 43... Line 43...
43
#include "rs600_reg_safe.h"
43
#include "rs600_reg_safe.h"
Line 44... Line 44...
44
 
44
 
45
void rs600_gpu_init(struct radeon_device *rdev);
45
void rs600_gpu_init(struct radeon_device *rdev);
Line -... Line 46...
-
 
46
int rs600_mc_wait_for_idle(struct radeon_device *rdev);
-
 
47
 
-
 
48
int rs600_mc_init(struct radeon_device *rdev)
-
 
49
{
-
 
50
	/* read back the MC value from the hw */
-
 
51
	int r;
-
 
52
	u32 tmp;
-
 
53
 
-
 
54
	/* Setup GPU memory space */
-
 
55
	tmp = RREG32_MC(R_000004_MC_FB_LOCATION);
-
 
56
	rdev->mc.vram_location = G_000004_MC_FB_START(tmp) << 16;
-
 
57
	rdev->mc.gtt_location = 0xffffffffUL;
-
 
58
	r = radeon_mc_setup(rdev);
-
 
59
	if (r)
-
 
60
		return r;
-
 
61
	return 0;
-
 
62
}
-
 
63
 
-
 
64
/* hpd for digital panel detect/disconnect */
-
 
65
bool rs600_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd)
-
 
66
{
-
 
67
	u32 tmp;
-
 
68
	bool connected = false;
-
 
69
 
-
 
70
	switch (hpd) {
-
 
71
	case RADEON_HPD_1:
-
 
72
		tmp = RREG32(R_007D04_DC_HOT_PLUG_DETECT1_INT_STATUS);
-
 
73
		if (G_007D04_DC_HOT_PLUG_DETECT1_SENSE(tmp))
-
 
74
			connected = true;
-
 
75
		break;
-
 
76
	case RADEON_HPD_2:
-
 
77
		tmp = RREG32(R_007D14_DC_HOT_PLUG_DETECT2_INT_STATUS);
-
 
78
		if (G_007D14_DC_HOT_PLUG_DETECT2_SENSE(tmp))
-
 
79
			connected = true;
-
 
80
		break;
-
 
81
	default:
-
 
82
		break;
-
 
83
	}
-
 
84
	return connected;
-
 
85
}
-
 
86
 
-
 
87
void rs600_hpd_set_polarity(struct radeon_device *rdev,
-
 
88
			    enum radeon_hpd_id hpd)
-
 
89
{
-
 
90
	u32 tmp;
-
 
91
	bool connected = rs600_hpd_sense(rdev, hpd);
-
 
92
 
-
 
93
	switch (hpd) {
-
 
94
	case RADEON_HPD_1:
-
 
95
		tmp = RREG32(R_007D08_DC_HOT_PLUG_DETECT1_INT_CONTROL);
-
 
96
		if (connected)
-
 
97
			tmp &= ~S_007D08_DC_HOT_PLUG_DETECT1_INT_POLARITY(1);
-
 
98
		else
-
 
99
			tmp |= S_007D08_DC_HOT_PLUG_DETECT1_INT_POLARITY(1);
-
 
100
		WREG32(R_007D08_DC_HOT_PLUG_DETECT1_INT_CONTROL, tmp);
-
 
101
		break;
-
 
102
	case RADEON_HPD_2:
-
 
103
		tmp = RREG32(R_007D18_DC_HOT_PLUG_DETECT2_INT_CONTROL);
-
 
104
		if (connected)
-
 
105
			tmp &= ~S_007D18_DC_HOT_PLUG_DETECT2_INT_POLARITY(1);
-
 
106
		else
-
 
107
			tmp |= S_007D18_DC_HOT_PLUG_DETECT2_INT_POLARITY(1);
-
 
108
		WREG32(R_007D18_DC_HOT_PLUG_DETECT2_INT_CONTROL, tmp);
-
 
109
		break;
-
 
110
	default:
-
 
111
		break;
-
 
112
	}
-
 
113
}
-
 
114
 
-
 
115
void rs600_hpd_init(struct radeon_device *rdev)
-
 
116
{
-
 
117
	struct drm_device *dev = rdev->ddev;
-
 
118
	struct drm_connector *connector;
-
 
119
 
-
 
120
	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
-
 
121
		struct radeon_connector *radeon_connector = to_radeon_connector(connector);
-
 
122
		switch (radeon_connector->hpd.hpd) {
-
 
123
		case RADEON_HPD_1:
-
 
124
			WREG32(R_007D00_DC_HOT_PLUG_DETECT1_CONTROL,
-
 
125
			       S_007D00_DC_HOT_PLUG_DETECT1_EN(1));
-
 
126
			rdev->irq.hpd[0] = true;
-
 
127
			break;
-
 
128
		case RADEON_HPD_2:
-
 
129
			WREG32(R_007D10_DC_HOT_PLUG_DETECT2_CONTROL,
-
 
130
			       S_007D10_DC_HOT_PLUG_DETECT2_EN(1));
-
 
131
			rdev->irq.hpd[1] = true;
-
 
132
			break;
-
 
133
		default:
-
 
134
			break;
-
 
135
		}
-
 
136
	}
-
 
137
	rs600_irq_set(rdev);
-
 
138
}
-
 
139
 
-
 
140
void rs600_hpd_fini(struct radeon_device *rdev)
-
 
141
{
-
 
142
	struct drm_device *dev = rdev->ddev;
-
 
143
	struct drm_connector *connector;
-
 
144
 
-
 
145
	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
-
 
146
		struct radeon_connector *radeon_connector = to_radeon_connector(connector);
-
 
147
		switch (radeon_connector->hpd.hpd) {
-
 
148
		case RADEON_HPD_1:
-
 
149
			WREG32(R_007D00_DC_HOT_PLUG_DETECT1_CONTROL,
-
 
150
			       S_007D00_DC_HOT_PLUG_DETECT1_EN(0));
-
 
151
			rdev->irq.hpd[0] = false;
-
 
152
			break;
-
 
153
		case RADEON_HPD_2:
-
 
154
			WREG32(R_007D10_DC_HOT_PLUG_DETECT2_CONTROL,
-
 
155
			       S_007D10_DC_HOT_PLUG_DETECT2_EN(0));
-
 
156
			rdev->irq.hpd[1] = false;
-
 
157
			break;
-
 
158
		default:
-
 
159
			break;
-
 
160
		}
-
 
161
	}
46
int rs600_mc_wait_for_idle(struct radeon_device *rdev);
162
}
47
 
163
 
48
/*
164
/*
49
 * GART.
165
 * GART.
50
 */
166
 */
Line 100... Line 216...
100
	WREG32(R_00004C_BUS_CNTL, tmp);
216
	WREG32(R_00004C_BUS_CNTL, tmp);
101
	/* FIXME: setup default page */
217
	/* FIXME: setup default page */
102
	WREG32_MC(R_000100_MC_PT0_CNTL,
218
	WREG32_MC(R_000100_MC_PT0_CNTL,
103
		 (S_000100_EFFECTIVE_L2_CACHE_SIZE(6) |
219
		 (S_000100_EFFECTIVE_L2_CACHE_SIZE(6) |
104
		  S_000100_EFFECTIVE_L2_QUEUE_SIZE(6)));
220
		  S_000100_EFFECTIVE_L2_QUEUE_SIZE(6)));
-
 
221
 
105
	for (i = 0; i < 19; i++) {
222
	for (i = 0; i < 19; i++) {
106
		WREG32_MC(R_00016C_MC_PT0_CLIENT0_CNTL + i,
223
		WREG32_MC(R_00016C_MC_PT0_CLIENT0_CNTL + i,
107
			S_00016C_ENABLE_TRANSLATION_MODE_OVERRIDE(1) |
224
			S_00016C_ENABLE_TRANSLATION_MODE_OVERRIDE(1) |
108
			S_00016C_SYSTEM_ACCESS_MODE_MASK(
225
			S_00016C_SYSTEM_ACCESS_MODE_MASK(
109
				V_00016C_SYSTEM_ACCESS_MODE_IN_SYS) |
226
				  V_00016C_SYSTEM_ACCESS_MODE_NOT_IN_SYS) |
110
			S_00016C_SYSTEM_APERTURE_UNMAPPED_ACCESS(
227
			S_00016C_SYSTEM_APERTURE_UNMAPPED_ACCESS(
111
				V_00016C_SYSTEM_APERTURE_UNMAPPED_DEFAULT_PAGE) |
228
				  V_00016C_SYSTEM_APERTURE_UNMAPPED_PASSTHROUGH) |
112
			S_00016C_EFFECTIVE_L1_CACHE_SIZE(1) |
229
			  S_00016C_EFFECTIVE_L1_CACHE_SIZE(3) |
113
			S_00016C_ENABLE_FRAGMENT_PROCESSING(1) |
230
			S_00016C_ENABLE_FRAGMENT_PROCESSING(1) |
114
			S_00016C_EFFECTIVE_L1_QUEUE_SIZE(1));
231
			  S_00016C_EFFECTIVE_L1_QUEUE_SIZE(3));
115
	}
232
	}
116
 
-
 
117
	/* System context map to GART space */
-
 
118
	WREG32_MC(R_000112_MC_PT0_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.gtt_start);
-
 
119
	WREG32_MC(R_000114_MC_PT0_SYSTEM_APERTURE_HIGH_ADDR, rdev->mc.gtt_end);
-
 
120
 
-
 
121
	/* enable first context */
233
	/* enable first context */
122
	WREG32_MC(R_00013C_MC_PT0_CONTEXT0_FLAT_START_ADDR, rdev->mc.gtt_start);
-
 
123
	WREG32_MC(R_00014C_MC_PT0_CONTEXT0_FLAT_END_ADDR, rdev->mc.gtt_end);
-
 
124
	WREG32_MC(R_000102_MC_PT0_CONTEXT0_CNTL,
234
	WREG32_MC(R_000102_MC_PT0_CONTEXT0_CNTL,
125
			S_000102_ENABLE_PAGE_TABLE(1) |
235
			S_000102_ENABLE_PAGE_TABLE(1) |
126
			S_000102_PAGE_TABLE_DEPTH(V_000102_PAGE_TABLE_FLAT));
236
			S_000102_PAGE_TABLE_DEPTH(V_000102_PAGE_TABLE_FLAT));
-
 
237
 
127
	/* disable all other contexts */
238
	/* disable all other contexts */
128
	for (i = 1; i < 8; i++) {
239
	for (i = 1; i < 8; i++)
129
		WREG32_MC(R_000102_MC_PT0_CONTEXT0_CNTL + i, 0);
240
		WREG32_MC(R_000102_MC_PT0_CONTEXT0_CNTL + i, 0);
130
	}
-
 
Line 131... Line 241...
131
 
241
 
132
	/* setup the page table */
242
	/* setup the page table */
133
	WREG32_MC(R_00012C_MC_PT0_CONTEXT0_FLAT_BASE_ADDR,
243
	WREG32_MC(R_00012C_MC_PT0_CONTEXT0_FLAT_BASE_ADDR,
-
 
244
		 rdev->gart.table_addr);
-
 
245
	WREG32_MC(R_00013C_MC_PT0_CONTEXT0_FLAT_START_ADDR, rdev->mc.gtt_start);
134
		 rdev->gart.table_addr);
246
	WREG32_MC(R_00014C_MC_PT0_CONTEXT0_FLAT_END_ADDR, rdev->mc.gtt_end);
Line -... Line 247...
-
 
247
	WREG32_MC(R_00011C_MC_PT0_CONTEXT0_DEFAULT_READ_ADDR, 0);
-
 
248
 
-
 
249
	/* System context maps to VRAM space */
-
 
250
	WREG32_MC(R_000112_MC_PT0_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.vram_start);
135
	WREG32_MC(R_00011C_MC_PT0_CONTEXT0_DEFAULT_READ_ADDR, 0);
251
	WREG32_MC(R_000114_MC_PT0_SYSTEM_APERTURE_HIGH_ADDR, rdev->mc.vram_end);
136
 
252
 
137
	/* enable page tables */
253
	/* enable page tables */
138
	tmp = RREG32_MC(R_000100_MC_PT0_CNTL);
254
	tmp = RREG32_MC(R_000100_MC_PT0_CNTL);
139
	WREG32_MC(R_000100_MC_PT0_CNTL, (tmp | S_000100_ENABLE_PT(1)));
255
	WREG32_MC(R_000100_MC_PT0_CNTL, (tmp | S_000100_ENABLE_PT(1)));
Line 144... Line 260...
144
	return 0;
260
	return 0;
145
}
261
}
Line 146... Line 262...
146
 
262
 
147
void rs600_gart_disable(struct radeon_device *rdev)
263
void rs600_gart_disable(struct radeon_device *rdev)
148
{
264
{
-
 
265
	u32 tmp;
Line 149... Line 266...
149
	uint32_t tmp;
266
	int r;
150
 
267
 
151
	/* FIXME: disable out of gart access */
268
	/* FIXME: disable out of gart access */
152
	WREG32_MC(R_000100_MC_PT0_CNTL, 0);
269
	WREG32_MC(R_000100_MC_PT0_CNTL, 0);
Line 183... Line 300...
183
	addr |= R600_PTE_READABLE | R600_PTE_WRITEABLE;
300
	addr |= R600_PTE_READABLE | R600_PTE_WRITEABLE;
184
	writeq(addr, ((void __iomem *)ptr) + (i * 8));
301
	writeq(addr, ((void __iomem *)ptr) + (i * 8));
185
	return 0;
302
	return 0;
186
}
303
}
Line -... Line 304...
-
 
304
 
-
 
305
int rs600_irq_set(struct radeon_device *rdev)
-
 
306
{
-
 
307
	uint32_t tmp = 0;
-
 
308
	uint32_t mode_int = 0;
-
 
309
	u32 hpd1 = RREG32(R_007D08_DC_HOT_PLUG_DETECT1_INT_CONTROL) &
-
 
310
		~S_007D08_DC_HOT_PLUG_DETECT1_INT_EN(1);
-
 
311
	u32 hpd2 = RREG32(R_007D18_DC_HOT_PLUG_DETECT2_INT_CONTROL) &
187
 
312
		~S_007D18_DC_HOT_PLUG_DETECT2_INT_EN(1);
-
 
313
 
-
 
314
	if (rdev->irq.sw_int) {
-
 
315
		tmp |= S_000040_SW_INT_EN(1);
-
 
316
	}
-
 
317
	if (rdev->irq.crtc_vblank_int[0]) {
-
 
318
		mode_int |= S_006540_D1MODE_VBLANK_INT_MASK(1);
-
 
319
	}
-
 
320
	if (rdev->irq.crtc_vblank_int[1]) {
-
 
321
		mode_int |= S_006540_D2MODE_VBLANK_INT_MASK(1);
-
 
322
	}
-
 
323
	if (rdev->irq.hpd[0]) {
-
 
324
		hpd1 |= S_007D08_DC_HOT_PLUG_DETECT1_INT_EN(1);
-
 
325
	}
-
 
326
	if (rdev->irq.hpd[1]) {
-
 
327
		hpd2 |= S_007D18_DC_HOT_PLUG_DETECT2_INT_EN(1);
-
 
328
	}
-
 
329
	WREG32(R_000040_GEN_INT_CNTL, tmp);
-
 
330
	WREG32(R_006540_DxMODE_INT_MASK, mode_int);
-
 
331
	WREG32(R_007D08_DC_HOT_PLUG_DETECT1_INT_CONTROL, hpd1);
-
 
332
	WREG32(R_007D18_DC_HOT_PLUG_DETECT2_INT_CONTROL, hpd2);
-
 
333
	return 0;
Line 188... Line 334...
188
 
334
}
189
 
335
 
190
static inline uint32_t rs600_irq_ack(struct radeon_device *rdev, u32 *r500_disp_int)
336
static inline uint32_t rs600_irq_ack(struct radeon_device *rdev, u32 *r500_disp_int)
191
{
337
{
-
 
338
	uint32_t irqs = RREG32(R_000044_GEN_INT_STATUS);
Line 192... Line 339...
192
	uint32_t irqs = RREG32(R_000044_GEN_INT_STATUS);
339
	uint32_t irq_mask = ~C_000044_SW_INT;
193
	uint32_t irq_mask = ~C_000044_SW_INT;
340
	u32 tmp;
194
 
341
 
195
	if (G_000044_DISPLAY_INT_STAT(irqs)) {
342
	if (G_000044_DISPLAY_INT_STAT(irqs)) {
Line 200... Line 347...
200
		}
347
		}
201
		if (G_007EDC_LB_D2_VBLANK_INTERRUPT(*r500_disp_int)) {
348
		if (G_007EDC_LB_D2_VBLANK_INTERRUPT(*r500_disp_int)) {
202
			WREG32(R_006D34_D2MODE_VBLANK_STATUS,
349
			WREG32(R_006D34_D2MODE_VBLANK_STATUS,
203
				S_006D34_D2MODE_VBLANK_ACK(1));
350
				S_006D34_D2MODE_VBLANK_ACK(1));
204
		}
351
		}
-
 
352
		if (G_007EDC_DC_HOT_PLUG_DETECT1_INTERRUPT(*r500_disp_int)) {
-
 
353
			tmp = RREG32(R_007D08_DC_HOT_PLUG_DETECT1_INT_CONTROL);
-
 
354
			tmp |= S_007D08_DC_HOT_PLUG_DETECT1_INT_ACK(1);
-
 
355
			WREG32(R_007D08_DC_HOT_PLUG_DETECT1_INT_CONTROL, tmp);
-
 
356
		}
-
 
357
		if (G_007EDC_DC_HOT_PLUG_DETECT2_INTERRUPT(*r500_disp_int)) {
-
 
358
			tmp = RREG32(R_007D18_DC_HOT_PLUG_DETECT2_INT_CONTROL);
-
 
359
			tmp |= S_007D18_DC_HOT_PLUG_DETECT2_INT_ACK(1);
-
 
360
			WREG32(R_007D18_DC_HOT_PLUG_DETECT2_INT_CONTROL, tmp);
-
 
361
		}
205
	} else {
362
	} else {
206
		*r500_disp_int = 0;
363
		*r500_disp_int = 0;
207
	}
364
	}
Line 208... Line 365...
208
 
365
 
Line 244... Line 401...
244
	return -1;
401
	return -1;
245
}
402
}
Line 246... Line 403...
246
 
403
 
247
void rs600_gpu_init(struct radeon_device *rdev)
404
void rs600_gpu_init(struct radeon_device *rdev)
248
{
-
 
249
	/* FIXME: HDP same place on rs600 ? */
405
{
250
	r100_hdp_reset(rdev);
-
 
251
	/* FIXME: is this correct ? */
406
	r100_hdp_reset(rdev);
252
	r420_pipes_init(rdev);
407
	r420_pipes_init(rdev);
253
	/* Wait for mc idle */
408
	/* Wait for mc idle */
254
	if (rs600_mc_wait_for_idle(rdev))
409
	if (rs600_mc_wait_for_idle(rdev))
255
		dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n");
410
		dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n");
Line 256... Line 411...
256
}
411
}
257
 
412
 
258
void rs600_vram_info(struct radeon_device *rdev)
-
 
259
{
413
void rs600_vram_info(struct radeon_device *rdev)
260
	/* FIXME: to do or is these values sane ? */
414
{
-
 
415
	rdev->mc.vram_is_ddr = true;
-
 
416
	rdev->mc.vram_width = 128;
-
 
417
 
-
 
418
	rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE);
-
 
419
	rdev->mc.mc_vram_size = rdev->mc.real_vram_size;
-
 
420
 
-
 
421
	rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0);
-
 
422
	rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0);
-
 
423
 
-
 
424
	if (rdev->mc.mc_vram_size > rdev->mc.aper_size)
-
 
425
		rdev->mc.mc_vram_size = rdev->mc.aper_size;
-
 
426
 
261
	rdev->mc.vram_is_ddr = true;
427
	if (rdev->mc.real_vram_size > rdev->mc.aper_size)
Line 262... Line 428...
262
	rdev->mc.vram_width = 128;
428
		rdev->mc.real_vram_size = rdev->mc.aper_size;
263
}
429
}
264
 
430
 
Line 331... Line 497...
331
	 * memory through TTM but finalize after TTM) */
497
	 * memory through TTM but finalize after TTM) */
332
	r = rs600_gart_enable(rdev);
498
	r = rs600_gart_enable(rdev);
333
	if (r)
499
	if (r)
334
	return r;
500
	return r;
335
	/* Enable IRQ */
501
	/* Enable IRQ */
336
//	rdev->irq.sw_int = true;
-
 
337
//	rs600_irq_set(rdev);
502
//	rs600_irq_set(rdev);
338
	/* 1M ring buffer */
503
	/* 1M ring buffer */
339
//	r = r100_cp_init(rdev, 1024 * 1024);
504
//	r = r100_cp_init(rdev, 1024 * 1024);
340
//	if (r) {
505
//	if (r) {
341
//		dev_err(rdev->dev, "failled initializing CP (%d).\n", r);
506
//		dev_err(rdev->dev, "failled initializing CP (%d).\n", r);
Line 383... Line 548...
383
			"GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n",
548
			"GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n",
384
			RREG32(R_000E40_RBBM_STATUS),
549
			RREG32(R_000E40_RBBM_STATUS),
385
			RREG32(R_0007C0_CP_STAT));
550
			RREG32(R_0007C0_CP_STAT));
386
	}
551
	}
387
	/* check if cards are posted or not */
552
	/* check if cards are posted or not */
388
	if (!radeon_card_posted(rdev) && rdev->bios) {
553
	if (radeon_boot_test_post_card(rdev) == false)
389
		DRM_INFO("GPU not posted. posting now...\n");
-
 
390
		atom_asic_init(rdev->mode_info.atom_context);
554
		return -EINVAL;
391
	}
555
 
392
	/* Initialize clocks */
556
	/* Initialize clocks */
393
	radeon_get_clock_info(rdev->ddev);
557
	radeon_get_clock_info(rdev->ddev);
394
	/* Initialize power management */
558
	/* Initialize power management */
395
	radeon_pm_init(rdev);
559
	radeon_pm_init(rdev);
396
	/* Get vram informations */
560
	/* Get vram informations */
397
	rs600_vram_info(rdev);
561
	rs600_vram_info(rdev);
398
	/* Initialize memory controller (also test AGP) */
562
	/* Initialize memory controller (also test AGP) */
399
	r = r420_mc_init(rdev);
563
	r = rs600_mc_init(rdev);
400
	if (r)
564
	if (r)
401
		return r;
565
		return r;
402
	rs600_debugfs(rdev);
566
	rs600_debugfs(rdev);
403
	/* Fence driver */
567
	/* Fence driver */
404
//	r = radeon_fence_driver_init(rdev);
568
//	r = radeon_fence_driver_init(rdev);
Line 406... Line 570...
406
//		return r;
570
//		return r;
407
//	r = radeon_irq_kms_init(rdev);
571
//	r = radeon_irq_kms_init(rdev);
408
//	if (r)
572
//	if (r)
409
//		return r;
573
//		return r;
410
	/* Memory manager */
574
	/* Memory manager */
411
	r = radeon_object_init(rdev);
575
	r = radeon_bo_init(rdev);
412
	if (r)
576
	if (r)
413
		return r;
577
		return r;
414
	r = rs600_gart_init(rdev);
578
	r = rs600_gart_init(rdev);
415
	if (r)
579
	if (r)
416
		return r;
580
		return r;