Subversion Repositories Kolibri OS

Rev

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

Rev 2005 Rev 2997
Line 25... Line 25...
25
 *          Alex Deucher
25
 *          Alex Deucher
26
 *          Jerome Glisse
26
 *          Jerome Glisse
27
 */
27
 */
28
#include 
28
#include 
29
#include 
29
#include 
30
#include "drmP.h"
30
#include 
31
#include "rv515d.h"
31
#include "rv515d.h"
32
#include "radeon.h"
32
#include "radeon.h"
33
#include "radeon_asic.h"
33
#include "radeon_asic.h"
34
#include "atom.h"
34
#include "atom.h"
35
#include "rv515_reg_safe.h"
35
#include "rv515_reg_safe.h"
Line 36... Line 36...
36
 
36
 
37
/* This files gather functions specifics to: rv515 */
37
/* This files gather functions specifics to: rv515 */
38
int rv515_debugfs_pipes_info_init(struct radeon_device *rdev);
38
static int rv515_debugfs_pipes_info_init(struct radeon_device *rdev);
39
int rv515_debugfs_ga_info_init(struct radeon_device *rdev);
39
static int rv515_debugfs_ga_info_init(struct radeon_device *rdev);
40
void rv515_gpu_init(struct radeon_device *rdev);
40
static void rv515_gpu_init(struct radeon_device *rdev);
Line 41... Line 41...
41
int rv515_mc_wait_for_idle(struct radeon_device *rdev);
41
int rv515_mc_wait_for_idle(struct radeon_device *rdev);
42
 
42
 
43
void rv515_debugfs(struct radeon_device *rdev)
43
void rv515_debugfs(struct radeon_device *rdev)
Line 51... Line 51...
51
	if (rv515_debugfs_ga_info_init(rdev)) {
51
	if (rv515_debugfs_ga_info_init(rdev)) {
52
		DRM_ERROR("Failed to register debugfs file for pipes !\n");
52
		DRM_ERROR("Failed to register debugfs file for pipes !\n");
53
	}
53
	}
54
}
54
}
Line 55... Line 55...
55
 
55
 
56
void rv515_ring_start(struct radeon_device *rdev)
56
void rv515_ring_start(struct radeon_device *rdev, struct radeon_ring *ring)
57
{
57
{
Line 58... Line 58...
58
	int r;
58
	int r;
59
 
59
 
60
	r = radeon_ring_lock(rdev, 64);
60
	r = radeon_ring_lock(rdev, ring, 64);
61
	if (r) {
61
	if (r) {
62
		return;
62
		return;
63
	}
63
	}
64
	radeon_ring_write(rdev, PACKET0(ISYNC_CNTL, 0));
64
	radeon_ring_write(ring, PACKET0(ISYNC_CNTL, 0));
65
	radeon_ring_write(rdev,
65
	radeon_ring_write(ring,
66
			  ISYNC_ANY2D_IDLE3D |
66
			  ISYNC_ANY2D_IDLE3D |
67
			  ISYNC_ANY3D_IDLE2D |
67
			  ISYNC_ANY3D_IDLE2D |
68
			  ISYNC_WAIT_IDLEGUI |
68
			  ISYNC_WAIT_IDLEGUI |
69
			  ISYNC_CPSCRATCH_IDLEGUI);
69
			  ISYNC_CPSCRATCH_IDLEGUI);
70
	radeon_ring_write(rdev, PACKET0(WAIT_UNTIL, 0));
70
	radeon_ring_write(ring, PACKET0(WAIT_UNTIL, 0));
71
	radeon_ring_write(rdev, WAIT_2D_IDLECLEAN | WAIT_3D_IDLECLEAN);
71
	radeon_ring_write(ring, WAIT_2D_IDLECLEAN | WAIT_3D_IDLECLEAN);
72
	radeon_ring_write(rdev, PACKET0(R300_DST_PIPE_CONFIG, 0));
72
	radeon_ring_write(ring, PACKET0(R300_DST_PIPE_CONFIG, 0));
73
	radeon_ring_write(rdev, R300_PIPE_AUTO_CONFIG);
73
	radeon_ring_write(ring, R300_PIPE_AUTO_CONFIG);
74
	radeon_ring_write(rdev, PACKET0(GB_SELECT, 0));
74
	radeon_ring_write(ring, PACKET0(GB_SELECT, 0));
75
	radeon_ring_write(rdev, 0);
75
	radeon_ring_write(ring, 0);
76
	radeon_ring_write(rdev, PACKET0(GB_ENABLE, 0));
76
	radeon_ring_write(ring, PACKET0(GB_ENABLE, 0));
77
	radeon_ring_write(rdev, 0);
77
	radeon_ring_write(ring, 0);
78
	radeon_ring_write(rdev, PACKET0(R500_SU_REG_DEST, 0));
78
	radeon_ring_write(ring, PACKET0(R500_SU_REG_DEST, 0));
79
	radeon_ring_write(rdev, (1 << rdev->num_gb_pipes) - 1);
79
	radeon_ring_write(ring, (1 << rdev->num_gb_pipes) - 1);
80
	radeon_ring_write(rdev, PACKET0(VAP_INDEX_OFFSET, 0));
80
	radeon_ring_write(ring, PACKET0(VAP_INDEX_OFFSET, 0));
81
	radeon_ring_write(rdev, 0);
81
	radeon_ring_write(ring, 0);
82
	radeon_ring_write(rdev, PACKET0(RB3D_DSTCACHE_CTLSTAT, 0));
82
	radeon_ring_write(ring, PACKET0(RB3D_DSTCACHE_CTLSTAT, 0));
83
	radeon_ring_write(rdev, RB3D_DC_FLUSH | RB3D_DC_FREE);
83
	radeon_ring_write(ring, RB3D_DC_FLUSH | RB3D_DC_FREE);
84
	radeon_ring_write(rdev, PACKET0(ZB_ZCACHE_CTLSTAT, 0));
84
	radeon_ring_write(ring, PACKET0(ZB_ZCACHE_CTLSTAT, 0));
85
	radeon_ring_write(rdev, ZC_FLUSH | ZC_FREE);
85
	radeon_ring_write(ring, ZC_FLUSH | ZC_FREE);
86
	radeon_ring_write(rdev, PACKET0(WAIT_UNTIL, 0));
86
	radeon_ring_write(ring, PACKET0(WAIT_UNTIL, 0));
87
	radeon_ring_write(rdev, WAIT_2D_IDLECLEAN | WAIT_3D_IDLECLEAN);
87
	radeon_ring_write(ring, WAIT_2D_IDLECLEAN | WAIT_3D_IDLECLEAN);
88
	radeon_ring_write(rdev, PACKET0(GB_AA_CONFIG, 0));
88
	radeon_ring_write(ring, PACKET0(GB_AA_CONFIG, 0));
89
	radeon_ring_write(rdev, 0);
89
	radeon_ring_write(ring, 0);
90
	radeon_ring_write(rdev, PACKET0(RB3D_DSTCACHE_CTLSTAT, 0));
90
	radeon_ring_write(ring, PACKET0(RB3D_DSTCACHE_CTLSTAT, 0));
91
	radeon_ring_write(rdev, RB3D_DC_FLUSH | RB3D_DC_FREE);
91
	radeon_ring_write(ring, RB3D_DC_FLUSH | RB3D_DC_FREE);
92
	radeon_ring_write(rdev, PACKET0(ZB_ZCACHE_CTLSTAT, 0));
92
	radeon_ring_write(ring, PACKET0(ZB_ZCACHE_CTLSTAT, 0));
93
	radeon_ring_write(rdev, ZC_FLUSH | ZC_FREE);
93
	radeon_ring_write(ring, ZC_FLUSH | ZC_FREE);
94
	radeon_ring_write(rdev, PACKET0(GB_MSPOS0, 0));
94
	radeon_ring_write(ring, PACKET0(GB_MSPOS0, 0));
95
	radeon_ring_write(rdev,
95
	radeon_ring_write(ring,
96
			  ((6 << MS_X0_SHIFT) |
96
			  ((6 << MS_X0_SHIFT) |
97
			   (6 << MS_Y0_SHIFT) |
97
			   (6 << MS_Y0_SHIFT) |
98
			   (6 << MS_X1_SHIFT) |
98
			   (6 << MS_X1_SHIFT) |
99
			   (6 << MS_Y1_SHIFT) |
99
			   (6 << MS_Y1_SHIFT) |
100
			   (6 << MS_X2_SHIFT) |
100
			   (6 << MS_X2_SHIFT) |
101
			   (6 << MS_Y2_SHIFT) |
101
			   (6 << MS_Y2_SHIFT) |
102
			   (6 << MSBD0_Y_SHIFT) |
102
			   (6 << MSBD0_Y_SHIFT) |
103
			   (6 << MSBD0_X_SHIFT)));
103
			   (6 << MSBD0_X_SHIFT)));
104
	radeon_ring_write(rdev, PACKET0(GB_MSPOS1, 0));
104
	radeon_ring_write(ring, PACKET0(GB_MSPOS1, 0));
105
	radeon_ring_write(rdev,
105
	radeon_ring_write(ring,
106
			  ((6 << MS_X3_SHIFT) |
106
			  ((6 << MS_X3_SHIFT) |
107
			   (6 << MS_Y3_SHIFT) |
107
			   (6 << MS_Y3_SHIFT) |
108
			   (6 << MS_X4_SHIFT) |
108
			   (6 << MS_X4_SHIFT) |
109
			   (6 << MS_Y4_SHIFT) |
109
			   (6 << MS_Y4_SHIFT) |
110
			   (6 << MS_X5_SHIFT) |
110
			   (6 << MS_X5_SHIFT) |
111
			   (6 << MS_Y5_SHIFT) |
111
			   (6 << MS_Y5_SHIFT) |
112
			   (6 << MSBD1_SHIFT)));
112
			   (6 << MSBD1_SHIFT)));
113
	radeon_ring_write(rdev, PACKET0(GA_ENHANCE, 0));
113
	radeon_ring_write(ring, PACKET0(GA_ENHANCE, 0));
114
	radeon_ring_write(rdev, GA_DEADLOCK_CNTL | GA_FASTSYNC_CNTL);
114
	radeon_ring_write(ring, GA_DEADLOCK_CNTL | GA_FASTSYNC_CNTL);
115
	radeon_ring_write(rdev, PACKET0(GA_POLY_MODE, 0));
115
	radeon_ring_write(ring, PACKET0(GA_POLY_MODE, 0));
116
	radeon_ring_write(rdev, FRONT_PTYPE_TRIANGE | BACK_PTYPE_TRIANGE);
116
	radeon_ring_write(ring, FRONT_PTYPE_TRIANGE | BACK_PTYPE_TRIANGE);
117
	radeon_ring_write(rdev, PACKET0(GA_ROUND_MODE, 0));
117
	radeon_ring_write(ring, PACKET0(GA_ROUND_MODE, 0));
118
	radeon_ring_write(rdev, GEOMETRY_ROUND_NEAREST | COLOR_ROUND_NEAREST);
118
	radeon_ring_write(ring, GEOMETRY_ROUND_NEAREST | COLOR_ROUND_NEAREST);
119
	radeon_ring_write(rdev, PACKET0(0x20C8, 0));
119
	radeon_ring_write(ring, PACKET0(0x20C8, 0));
120
	radeon_ring_write(rdev, 0);
120
	radeon_ring_write(ring, 0);
Line 121... Line 121...
121
	radeon_ring_unlock_commit(rdev);
121
	radeon_ring_unlock_commit(rdev, ring);
122
}
122
}
123
 
123
 
Line 141... Line 141...
141
{
141
{
142
	WREG32(R_000300_VGA_RENDER_CONTROL,
142
	WREG32(R_000300_VGA_RENDER_CONTROL,
143
		RREG32(R_000300_VGA_RENDER_CONTROL) & C_000300_VGA_VSTATUS_CNTL);
143
		RREG32(R_000300_VGA_RENDER_CONTROL) & C_000300_VGA_VSTATUS_CNTL);
144
}
144
}
Line 145... Line 145...
145
 
145
 
146
void rv515_gpu_init(struct radeon_device *rdev)
146
static void rv515_gpu_init(struct radeon_device *rdev)
147
{
147
{
Line 148... Line 148...
148
	unsigned pipe_select_current, gb_pipe_select, tmp;
148
	unsigned pipe_select_current, gb_pipe_select, tmp;
149
 
149
 
150
	if (r100_gui_wait_for_idle(rdev)) {
150
	if (r100_gui_wait_for_idle(rdev)) {
151
		printk(KERN_WARNING "Failed to wait GUI idle while "
151
		printk(KERN_WARNING "Failed to wait GUI idle while "
152
		       "reseting GPU. Bad things might happen.\n");
152
		       "resetting GPU. Bad things might happen.\n");
153
	}
153
	}
154
	rv515_vga_render_disable(rdev);
154
	rv515_vga_render_disable(rdev);
155
	r420_pipes_init(rdev);
155
	r420_pipes_init(rdev);
Line 159... Line 159...
159
	tmp = (1 << pipe_select_current) |
159
	tmp = (1 << pipe_select_current) |
160
	      (((gb_pipe_select >> 8) & 0xF) << 4);
160
	      (((gb_pipe_select >> 8) & 0xF) << 4);
161
	WREG32_PLL(0x000D, tmp);
161
	WREG32_PLL(0x000D, tmp);
162
	if (r100_gui_wait_for_idle(rdev)) {
162
	if (r100_gui_wait_for_idle(rdev)) {
163
		printk(KERN_WARNING "Failed to wait GUI idle while "
163
		printk(KERN_WARNING "Failed to wait GUI idle while "
164
		       "reseting GPU. Bad things might happen.\n");
164
		       "resetting GPU. Bad things might happen.\n");
165
	}
165
	}
166
	if (rv515_mc_wait_for_idle(rdev)) {
166
	if (rv515_mc_wait_for_idle(rdev)) {
167
		printk(KERN_WARNING "Failed to wait MC idle while "
167
		printk(KERN_WARNING "Failed to wait MC idle while "
168
		       "programming pipes. Bad things might happen.\n");
168
		       "programming pipes. Bad things might happen.\n");
169
	}
169
	}
Line 187... Line 187...
187
		rdev->mc.vram_width = 128;
187
		rdev->mc.vram_width = 128;
188
		break;
188
		break;
189
	}
189
	}
190
}
190
}
Line 191... Line 191...
191
 
191
 
192
void rv515_mc_init(struct radeon_device *rdev)
192
static void rv515_mc_init(struct radeon_device *rdev)
Line 193... Line 193...
193
{
193
{
194
 
194
 
195
	rv515_vram_get_type(rdev);
195
	rv515_vram_get_type(rdev);
Line 259... Line 259...
259
static struct drm_info_list rv515_ga_info_list[] = {
259
static struct drm_info_list rv515_ga_info_list[] = {
260
	{"rv515_ga_info", rv515_debugfs_ga_info, 0, NULL},
260
	{"rv515_ga_info", rv515_debugfs_ga_info, 0, NULL},
261
};
261
};
262
#endif
262
#endif
Line 263... Line 263...
263
 
263
 
264
int rv515_debugfs_pipes_info_init(struct radeon_device *rdev)
264
static int rv515_debugfs_pipes_info_init(struct radeon_device *rdev)
265
{
265
{
266
#if defined(CONFIG_DEBUG_FS)
266
#if defined(CONFIG_DEBUG_FS)
267
	return radeon_debugfs_add_files(rdev, rv515_pipes_info_list, 1);
267
	return radeon_debugfs_add_files(rdev, rv515_pipes_info_list, 1);
268
#else
268
#else
269
	return 0;
269
	return 0;
270
#endif
270
#endif
Line 271... Line 271...
271
}
271
}
272
 
272
 
273
int rv515_debugfs_ga_info_init(struct radeon_device *rdev)
273
static int rv515_debugfs_ga_info_init(struct radeon_device *rdev)
274
{
274
{
275
#if defined(CONFIG_DEBUG_FS)
275
#if defined(CONFIG_DEBUG_FS)
276
	return radeon_debugfs_add_files(rdev, rv515_ga_info_list, 1);
276
	return radeon_debugfs_add_files(rdev, rv515_ga_info_list, 1);
277
#else
277
#else
278
	return 0;
278
	return 0;
Line 279... Line 279...
279
#endif
279
#endif
280
}
280
}
281
 
-
 
282
void rv515_mc_stop(struct radeon_device *rdev, struct rv515_mc_save *save)
-
 
283
{
281
 
284
	save->d1vga_control = RREG32(R_000330_D1VGA_CONTROL);
282
void rv515_mc_stop(struct radeon_device *rdev, struct rv515_mc_save *save)
285
	save->d2vga_control = RREG32(R_000338_D2VGA_CONTROL);
-
 
286
	save->vga_render_control = RREG32(R_000300_VGA_RENDER_CONTROL);
-
 
Line 287... Line 283...
287
	save->vga_hdp_control = RREG32(R_000328_VGA_HDP_CONTROL);
283
{
288
	save->d1crtc_control = RREG32(R_006080_D1CRTC_CONTROL);
284
	save->vga_render_control = RREG32(R_000300_VGA_RENDER_CONTROL);
289
	save->d2crtc_control = RREG32(R_006880_D2CRTC_CONTROL);
285
	save->vga_hdp_control = RREG32(R_000328_VGA_HDP_CONTROL);
290
 
286
 
Line 309... Line 305...
309
	WREG32(R_006918_D2GRPH_SECONDARY_SURFACE_ADDRESS, rdev->mc.vram_start);
305
	WREG32(R_006918_D2GRPH_SECONDARY_SURFACE_ADDRESS, rdev->mc.vram_start);
310
	WREG32(R_000310_VGA_MEMORY_BASE_ADDRESS, rdev->mc.vram_start);
306
	WREG32(R_000310_VGA_MEMORY_BASE_ADDRESS, rdev->mc.vram_start);
311
	/* Unlock host access */
307
	/* Unlock host access */
312
	WREG32(R_000328_VGA_HDP_CONTROL, save->vga_hdp_control);
308
	WREG32(R_000328_VGA_HDP_CONTROL, save->vga_hdp_control);
313
	mdelay(1);
309
	mdelay(1);
314
	/* Restore video state */
-
 
315
	WREG32(R_000330_D1VGA_CONTROL, save->d1vga_control);
-
 
316
	WREG32(R_000338_D2VGA_CONTROL, save->d2vga_control);
-
 
317
	WREG32(R_0060E8_D1CRTC_UPDATE_LOCK, 1);
-
 
318
	WREG32(R_0068E8_D2CRTC_UPDATE_LOCK, 1);
-
 
319
	WREG32(R_006080_D1CRTC_CONTROL, save->d1crtc_control);
-
 
320
	WREG32(R_006880_D2CRTC_CONTROL, save->d2crtc_control);
-
 
321
	WREG32(R_0060E8_D1CRTC_UPDATE_LOCK, 0);
-
 
322
	WREG32(R_0068E8_D2CRTC_UPDATE_LOCK, 0);
-
 
323
	WREG32(R_000300_VGA_RENDER_CONTROL, save->vga_render_control);
310
	WREG32(R_000300_VGA_RENDER_CONTROL, save->vga_render_control);
324
}
311
}
Line 325... Line 312...
325
 
312
 
326
void rv515_mc_program(struct radeon_device *rdev)
313
static void rv515_mc_program(struct radeon_device *rdev)
327
{
314
{
Line 328... Line 315...
328
	struct rv515_mc_save save;
315
	struct rv515_mc_save save;
329
 
316
 
Line 399... Line 386...
399
	r = r100_cp_init(rdev, 1024 * 1024);
386
	r = r100_cp_init(rdev, 1024 * 1024);
400
	if (r) {
387
	if (r) {
401
		dev_err(rdev->dev, "failed initializing CP (%d).\n", r);
388
		dev_err(rdev->dev, "failed initializing CP (%d).\n", r);
402
		return r;
389
		return r;
403
	}
390
	}
-
 
391
 
404
	r = r100_ib_init(rdev);
392
	r = radeon_ib_pool_init(rdev);
405
	if (r) {
393
	if (r) {
406
		dev_err(rdev->dev, "failed initializing IB (%d).\n", r);
394
		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
407
		return r;
395
		return r;
408
	}
396
	}
-
 
397
 
409
	return 0;
398
	return 0;
410
}
399
}
Line 411... Line 400...
411
 
400
 
Line 475... Line 464...
475
		return r;
464
		return r;
476
	r = rv370_pcie_gart_init(rdev);
465
	r = rv370_pcie_gart_init(rdev);
477
	if (r)
466
	if (r)
478
		return r;
467
		return r;
479
	rv515_set_safe_registers(rdev);
468
	rv515_set_safe_registers(rdev);
-
 
469
 
480
	rdev->accel_working = true;
470
	rdev->accel_working = true;
481
	r = rv515_startup(rdev);
471
	r = rv515_startup(rdev);
482
	if (r) {
472
	if (r) {
483
		/* Somethings want wront with the accel init stop accel */
473
		/* Somethings want wront with the accel init stop accel */
484
		dev_err(rdev->dev, "Disabling GPU acceleration\n");
474
		dev_err(rdev->dev, "Disabling GPU acceleration\n");
Line 733... Line 723...
733
	fixed20_12 priority_mark_max;
723
	fixed20_12 priority_mark_max;
734
	fixed20_12 priority_mark;
724
	fixed20_12 priority_mark;
735
	fixed20_12 sclk;
725
	fixed20_12 sclk;
736
};
726
};
Line 737... Line 727...
737
 
727
 
738
void rv515_crtc_bandwidth_compute(struct radeon_device *rdev,
728
static void rv515_crtc_bandwidth_compute(struct radeon_device *rdev,
739
				  struct radeon_crtc *crtc,
729
				  struct radeon_crtc *crtc,
740
				  struct rv515_watermark *wm)
730
				  struct rv515_watermark *wm)
741
{
731
{
742
	struct drm_display_mode *mode = &crtc->base.mode;
732
	struct drm_display_mode *mode = &crtc->base.mode;