Subversion Repositories Kolibri OS

Rev

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

Rev 2175 Rev 2997
Line 26... Line 26...
26
 *          Jerome Glisse
26
 *          Jerome Glisse
27
 */
27
 */
28
#include 
28
#include 
29
//#include 
29
//#include 
30
#include 
30
#include 
31
#include "drmP.h"
31
#include 
32
#include "radeon.h"
32
#include "radeon.h"
33
#include "radeon_asic.h"
33
#include "radeon_asic.h"
34
#include "radeon_drm.h"
34
#include 
35
#include "rv770d.h"
35
#include "rv770d.h"
36
#include "atom.h"
36
#include "atom.h"
37
#include "avivod.h"
37
#include "avivod.h"
Line 38... Line 38...
38
 
38
 
Line 45... Line 45...
45
 
45
 
46
 
46
 
47
/*
47
/*
48
 * GART
48
 * GART
49
 */
49
 */
50
int rv770_pcie_gart_enable(struct radeon_device *rdev)
50
static int rv770_pcie_gart_enable(struct radeon_device *rdev)
51
{
51
{
Line 52... Line 52...
52
	u32 tmp;
52
	u32 tmp;
53
	int r, i;
53
	int r, i;
54
 
54
 
55
	if (rdev->gart.table.vram.robj == NULL) {
55
	if (rdev->gart.robj == NULL) {
56
		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
56
		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
57
		return -EINVAL;
57
		return -EINVAL;
Line 72... Line 72...
72
		SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
72
		SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
73
		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
73
		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
74
	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
74
	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
75
	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
75
	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
76
	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
76
	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
-
 
77
	if (rdev->family == CHIP_RV740)
-
 
78
		WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp);
77
	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
79
	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
78
	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
80
	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
79
	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
81
	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
80
	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
82
	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
81
	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
83
	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
Line 87... Line 89...
87
			(u32)(rdev->dummy_page.addr >> 12));
89
			(u32)(rdev->dummy_page.addr >> 12));
88
	for (i = 1; i < 7; i++)
90
	for (i = 1; i < 7; i++)
89
		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
91
		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
Line 90... Line 92...
90
 
92
 
-
 
93
	r600_pcie_gart_tlb_flush(rdev);
-
 
94
	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
-
 
95
		 (unsigned)(rdev->mc.gtt_size >> 20),
91
	r600_pcie_gart_tlb_flush(rdev);
96
		 (unsigned long long)rdev->gart.table_addr);
92
	rdev->gart.ready = true;
97
	rdev->gart.ready = true;
93
	return 0;
98
	return 0;
Line 94... Line 99...
94
}
99
}
95
 
100
 
96
void rv770_pcie_gart_disable(struct radeon_device *rdev)
101
static void rv770_pcie_gart_disable(struct radeon_device *rdev)
97
{
102
{
Line 98... Line 103...
98
	u32 tmp;
103
	u32 tmp;
99
	int i, r;
104
	int i;
100
 
105
 
Line 114... Line 119...
114
	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
119
	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
115
	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
120
	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
116
	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
121
	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
117
	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
122
	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
118
	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
123
	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
119
	if (rdev->gart.table.vram.robj) {
124
	radeon_gart_table_vram_unpin(rdev);
120
		r = radeon_bo_reserve(rdev->gart.table.vram.robj, false);
-
 
121
		if (likely(r == 0)) {
-
 
122
			radeon_bo_kunmap(rdev->gart.table.vram.robj);
-
 
123
			radeon_bo_unpin(rdev->gart.table.vram.robj);
-
 
124
			radeon_bo_unreserve(rdev->gart.table.vram.robj);
-
 
125
		}
-
 
126
	}
-
 
127
}
125
}
Line 128... Line 126...
128
 
126
 
129
void rv770_pcie_gart_fini(struct radeon_device *rdev)
127
static void rv770_pcie_gart_fini(struct radeon_device *rdev)
130
{
128
{
131
	radeon_gart_fini(rdev);
129
	radeon_gart_fini(rdev);
132
	rv770_pcie_gart_disable(rdev);
130
	rv770_pcie_gart_disable(rdev);
133
	radeon_gart_table_vram_free(rdev);
131
	radeon_gart_table_vram_free(rdev);
Line 134... Line 132...
134
}
132
}
135
 
133
 
136
 
134
 
137
void rv770_agp_enable(struct radeon_device *rdev)
135
static void rv770_agp_enable(struct radeon_device *rdev)
Line 138... Line 136...
138
{
136
{
Line 205... Line 203...
205
		WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
203
		WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
206
			rdev->mc.vram_start >> 12);
204
			rdev->mc.vram_start >> 12);
207
		WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
205
		WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
208
			rdev->mc.vram_end >> 12);
206
			rdev->mc.vram_end >> 12);
209
	}
207
	}
210
	WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0);
208
	WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12);
211
	tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
209
	tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
212
	tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
210
	tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
213
	WREG32(MC_VM_FB_LOCATION, tmp);
211
	WREG32(MC_VM_FB_LOCATION, tmp);
214
	WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
212
	WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
215
	WREG32(HDP_NONSURFACE_INFO, (2 << 7));
213
	WREG32(HDP_NONSURFACE_INFO, (2 << 7));
Line 283... Line 281...
283
 
281
 
284
 
282
 
285
/*
283
/*
286
 * Core functions
-
 
287
 */
-
 
288
static u32 r700_get_tile_pipe_to_backend_map(struct radeon_device *rdev,
-
 
289
					     u32 num_tile_pipes,
-
 
290
						u32 num_backends,
-
 
291
						u32 backend_disable_mask)
-
 
292
{
-
 
293
	u32 backend_map = 0;
-
 
294
	u32 enabled_backends_mask;
-
 
295
	u32 enabled_backends_count;
-
 
296
	u32 cur_pipe;
-
 
297
	u32 swizzle_pipe[R7XX_MAX_PIPES];
-
 
298
	u32 cur_backend;
-
 
299
	u32 i;
-
 
300
	bool force_no_swizzle;
-
 
301
 
-
 
302
	if (num_tile_pipes > R7XX_MAX_PIPES)
-
 
303
		num_tile_pipes = R7XX_MAX_PIPES;
-
 
304
	if (num_tile_pipes < 1)
-
 
305
		num_tile_pipes = 1;
-
 
306
	if (num_backends > R7XX_MAX_BACKENDS)
-
 
307
		num_backends = R7XX_MAX_BACKENDS;
-
 
308
	if (num_backends < 1)
-
 
309
		num_backends = 1;
-
 
310
 
-
 
311
	enabled_backends_mask = 0;
-
 
312
	enabled_backends_count = 0;
-
 
313
	for (i = 0; i < R7XX_MAX_BACKENDS; ++i) {
-
 
314
		if (((backend_disable_mask >> i) & 1) == 0) {
-
 
315
			enabled_backends_mask |= (1 << i);
-
 
316
			++enabled_backends_count;
-
 
317
		}
-
 
318
		if (enabled_backends_count == num_backends)
-
 
319
			break;
-
 
320
	}
-
 
321
 
-
 
322
	if (enabled_backends_count == 0) {
-
 
323
		enabled_backends_mask = 1;
-
 
324
		enabled_backends_count = 1;
-
 
325
	}
-
 
326
 
-
 
327
	if (enabled_backends_count != num_backends)
-
 
328
		num_backends = enabled_backends_count;
-
 
329
 
-
 
330
	switch (rdev->family) {
-
 
331
	case CHIP_RV770:
-
 
332
	case CHIP_RV730:
-
 
333
		force_no_swizzle = false;
-
 
334
		break;
-
 
335
	case CHIP_RV710:
-
 
336
	case CHIP_RV740:
-
 
337
	default:
-
 
338
		force_no_swizzle = true;
-
 
339
		break;
-
 
340
	}
-
 
341
 
-
 
342
	memset((uint8_t *)&swizzle_pipe[0], 0, sizeof(u32) * R7XX_MAX_PIPES);
-
 
343
	switch (num_tile_pipes) {
-
 
344
	case 1:
-
 
345
		swizzle_pipe[0] = 0;
-
 
346
		break;
-
 
347
	case 2:
-
 
348
		swizzle_pipe[0] = 0;
-
 
349
		swizzle_pipe[1] = 1;
-
 
350
		break;
-
 
351
	case 3:
-
 
352
		if (force_no_swizzle) {
-
 
353
			swizzle_pipe[0] = 0;
-
 
354
			swizzle_pipe[1] = 1;
-
 
355
			swizzle_pipe[2] = 2;
-
 
356
		} else {
-
 
357
		swizzle_pipe[0] = 0;
-
 
358
		swizzle_pipe[1] = 2;
-
 
359
		swizzle_pipe[2] = 1;
-
 
360
		}
-
 
361
		break;
-
 
362
	case 4:
-
 
363
		if (force_no_swizzle) {
-
 
364
			swizzle_pipe[0] = 0;
-
 
365
			swizzle_pipe[1] = 1;
-
 
366
			swizzle_pipe[2] = 2;
-
 
367
			swizzle_pipe[3] = 3;
-
 
368
		} else {
-
 
369
		swizzle_pipe[0] = 0;
-
 
370
		swizzle_pipe[1] = 2;
-
 
371
		swizzle_pipe[2] = 3;
-
 
372
		swizzle_pipe[3] = 1;
-
 
373
		}
-
 
374
		break;
-
 
375
	case 5:
-
 
376
		if (force_no_swizzle) {
-
 
377
			swizzle_pipe[0] = 0;
-
 
378
			swizzle_pipe[1] = 1;
-
 
379
			swizzle_pipe[2] = 2;
-
 
380
			swizzle_pipe[3] = 3;
-
 
381
			swizzle_pipe[4] = 4;
-
 
382
		} else {
-
 
383
		swizzle_pipe[0] = 0;
-
 
384
		swizzle_pipe[1] = 2;
-
 
385
		swizzle_pipe[2] = 4;
-
 
386
		swizzle_pipe[3] = 1;
-
 
387
		swizzle_pipe[4] = 3;
-
 
388
		}
-
 
389
		break;
-
 
390
	case 6:
-
 
391
		if (force_no_swizzle) {
-
 
392
			swizzle_pipe[0] = 0;
-
 
393
			swizzle_pipe[1] = 1;
-
 
394
			swizzle_pipe[2] = 2;
-
 
395
			swizzle_pipe[3] = 3;
-
 
396
			swizzle_pipe[4] = 4;
-
 
397
			swizzle_pipe[5] = 5;
-
 
398
		} else {
-
 
399
		swizzle_pipe[0] = 0;
-
 
400
		swizzle_pipe[1] = 2;
-
 
401
		swizzle_pipe[2] = 4;
-
 
402
		swizzle_pipe[3] = 5;
-
 
403
		swizzle_pipe[4] = 3;
-
 
404
		swizzle_pipe[5] = 1;
-
 
405
		}
-
 
406
		break;
-
 
407
	case 7:
-
 
408
		if (force_no_swizzle) {
-
 
409
			swizzle_pipe[0] = 0;
-
 
410
			swizzle_pipe[1] = 1;
-
 
411
			swizzle_pipe[2] = 2;
-
 
412
			swizzle_pipe[3] = 3;
-
 
413
			swizzle_pipe[4] = 4;
-
 
414
			swizzle_pipe[5] = 5;
-
 
415
			swizzle_pipe[6] = 6;
-
 
416
		} else {
-
 
417
		swizzle_pipe[0] = 0;
-
 
418
		swizzle_pipe[1] = 2;
-
 
419
		swizzle_pipe[2] = 4;
-
 
420
		swizzle_pipe[3] = 6;
-
 
421
		swizzle_pipe[4] = 3;
-
 
422
		swizzle_pipe[5] = 1;
-
 
423
		swizzle_pipe[6] = 5;
-
 
424
		}
-
 
425
		break;
-
 
426
	case 8:
-
 
427
		if (force_no_swizzle) {
-
 
428
			swizzle_pipe[0] = 0;
-
 
429
			swizzle_pipe[1] = 1;
-
 
430
			swizzle_pipe[2] = 2;
-
 
431
			swizzle_pipe[3] = 3;
-
 
432
			swizzle_pipe[4] = 4;
-
 
433
			swizzle_pipe[5] = 5;
-
 
434
			swizzle_pipe[6] = 6;
-
 
435
			swizzle_pipe[7] = 7;
-
 
436
		} else {
-
 
437
		swizzle_pipe[0] = 0;
-
 
438
		swizzle_pipe[1] = 2;
-
 
439
		swizzle_pipe[2] = 4;
-
 
440
		swizzle_pipe[3] = 6;
-
 
441
		swizzle_pipe[4] = 3;
-
 
442
		swizzle_pipe[5] = 1;
-
 
443
		swizzle_pipe[6] = 7;
-
 
444
		swizzle_pipe[7] = 5;
-
 
445
		}
-
 
446
		break;
-
 
447
	}
-
 
448
 
-
 
449
	cur_backend = 0;
-
 
450
	for (cur_pipe = 0; cur_pipe < num_tile_pipes; ++cur_pipe) {
-
 
451
		while (((1 << cur_backend) & enabled_backends_mask) == 0)
-
 
452
			cur_backend = (cur_backend + 1) % R7XX_MAX_BACKENDS;
-
 
453
 
-
 
454
		backend_map |= (u32)(((cur_backend & 3) << (swizzle_pipe[cur_pipe] * 2)));
-
 
455
 
-
 
456
		cur_backend = (cur_backend + 1) % R7XX_MAX_BACKENDS;
-
 
457
	}
-
 
458
 
-
 
459
	return backend_map;
-
 
460
}
-
 
461
 
-
 
462
static void rv770_program_channel_remap(struct radeon_device *rdev)
-
 
463
{
-
 
464
	u32 tcp_chan_steer, mc_shared_chremap, tmp;
-
 
465
	bool force_no_swizzle;
-
 
466
 
-
 
467
	switch (rdev->family) {
-
 
468
	case CHIP_RV770:
-
 
469
	case CHIP_RV730:
-
 
470
		force_no_swizzle = false;
-
 
471
		break;
-
 
472
	case CHIP_RV710:
-
 
473
	case CHIP_RV740:
-
 
474
	default:
-
 
475
		force_no_swizzle = true;
-
 
476
		break;
-
 
477
	}
-
 
478
 
-
 
479
	tmp = RREG32(MC_SHARED_CHMAP);
-
 
480
	switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
-
 
481
	case 0:
-
 
482
	case 1:
-
 
483
	default:
-
 
484
		/* default mapping */
-
 
485
		mc_shared_chremap = 0x00fac688;
-
 
486
		break;
-
 
487
	case 2:
-
 
488
	case 3:
-
 
489
		if (force_no_swizzle)
-
 
490
			mc_shared_chremap = 0x00fac688;
-
 
491
		else
-
 
492
			mc_shared_chremap = 0x00bbc298;
-
 
493
		break;
-
 
494
	}
-
 
495
 
-
 
496
	if (rdev->family == CHIP_RV740)
-
 
497
		tcp_chan_steer = 0x00ef2a60;
-
 
498
	else
-
 
499
		tcp_chan_steer = 0x00fac688;
-
 
500
 
-
 
501
	/* RV770 CE has special chremap setup */
-
 
502
	if (rdev->pdev->device == 0x944e) {
-
 
503
		tcp_chan_steer = 0x00b08b08;
-
 
504
		mc_shared_chremap = 0x00b08b08;
-
 
505
	}
-
 
506
 
-
 
507
	WREG32(TCP_CHAN_STEER, tcp_chan_steer);
-
 
508
	WREG32(MC_SHARED_CHREMAP, mc_shared_chremap);
-
 
509
}
284
 * Core functions
510
 
285
 */
511
static void rv770_gpu_init(struct radeon_device *rdev)
286
static void rv770_gpu_init(struct radeon_device *rdev)
512
{
287
{
513
	int i, j, num_qd_pipes;
288
	int i, j, num_qd_pipes;
Line 521... Line 296...
521
	u32 sq_ms_fifo_sizes;
296
	u32 sq_ms_fifo_sizes;
522
	u32 sq_config;
297
	u32 sq_config;
523
	u32 sq_thread_resource_mgmt;
298
	u32 sq_thread_resource_mgmt;
524
	u32 hdp_host_path_cntl;
299
	u32 hdp_host_path_cntl;
525
	u32 sq_dyn_gpr_size_simd_ab_0;
300
	u32 sq_dyn_gpr_size_simd_ab_0;
526
	u32 backend_map;
-
 
527
	u32 gb_tiling_config = 0;
301
	u32 gb_tiling_config = 0;
528
	u32 cc_rb_backend_disable = 0;
302
	u32 cc_rb_backend_disable = 0;
529
	u32 cc_gc_shader_pipe_config = 0;
303
	u32 cc_gc_shader_pipe_config = 0;
530
	u32 mc_arb_ramcfg;
304
	u32 mc_arb_ramcfg;
531
	u32 db_debug4;
305
	u32 db_debug4, tmp;
-
 
306
	u32 inactive_pipes, shader_pipe_config;
-
 
307
	u32 disabled_rb_mask;
-
 
308
	unsigned active_number;
Line 532... Line 309...
532
 
309
 
-
 
310
	/* setup chip specs */
533
	/* setup chip specs */
311
	rdev->config.rv770.tiling_group_size = 256;
534
	switch (rdev->family) {
312
	switch (rdev->family) {
535
	case CHIP_RV770:
313
	case CHIP_RV770:
536
		rdev->config.rv770.max_pipes = 4;
314
		rdev->config.rv770.max_pipes = 4;
537
		rdev->config.rv770.max_tile_pipes = 8;
315
		rdev->config.rv770.max_tile_pipes = 8;
Line 639... Line 417...
639
	WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
417
	WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
Line 640... Line 418...
640
 
418
 
641
	/* setup tiling, simd, pipe config */
419
	/* setup tiling, simd, pipe config */
Line -... Line 420...
-
 
420
	mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
-
 
421
 
-
 
422
	shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG);
-
 
423
	inactive_pipes = (shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> INACTIVE_QD_PIPES_SHIFT;
-
 
424
	for (i = 0, tmp = 1, active_number = 0; i < R7XX_MAX_PIPES; i++) {
-
 
425
		if (!(inactive_pipes & tmp)) {
-
 
426
			active_number++;
-
 
427
		}
-
 
428
		tmp <<= 1;
-
 
429
	}
-
 
430
	if (active_number == 1) {
-
 
431
		WREG32(SPI_CONFIG_CNTL, DISABLE_INTERP_1);
-
 
432
	} else {
-
 
433
		WREG32(SPI_CONFIG_CNTL, 0);
-
 
434
	}
-
 
435
 
-
 
436
	cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000;
-
 
437
	tmp = R7XX_MAX_BACKENDS - r600_count_pipe_bits(cc_rb_backend_disable >> 16);
-
 
438
	if (tmp < rdev->config.rv770.max_backends) {
-
 
439
		rdev->config.rv770.max_backends = tmp;
-
 
440
	}
-
 
441
 
-
 
442
	cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00;
-
 
443
	tmp = R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config >> 8) & R7XX_MAX_PIPES_MASK);
-
 
444
	if (tmp < rdev->config.rv770.max_pipes) {
-
 
445
		rdev->config.rv770.max_pipes = tmp;
-
 
446
	}
-
 
447
	tmp = R7XX_MAX_SIMDS - r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R7XX_MAX_SIMDS_MASK);
-
 
448
	if (tmp < rdev->config.rv770.max_simds) {
-
 
449
		rdev->config.rv770.max_simds = tmp;
642
	mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
450
	}
643
 
451
 
644
	switch (rdev->config.rv770.max_tile_pipes) {
452
	switch (rdev->config.rv770.max_tile_pipes) {
645
	case 1:
453
	case 1:
646
	default:
454
	default:
647
		gb_tiling_config |= PIPE_TILING(0);
455
		gb_tiling_config = PIPE_TILING(0);
648
		break;
456
		break;
649
	case 2:
457
	case 2:
650
		gb_tiling_config |= PIPE_TILING(1);
458
		gb_tiling_config = PIPE_TILING(1);
651
		break;
459
		break;
652
	case 4:
460
	case 4:
653
		gb_tiling_config |= PIPE_TILING(2);
461
		gb_tiling_config = PIPE_TILING(2);
654
		break;
462
		break;
655
	case 8:
463
	case 8:
656
		gb_tiling_config |= PIPE_TILING(3);
464
		gb_tiling_config = PIPE_TILING(3);
657
		break;
465
		break;
Line -... Line 466...
-
 
466
	}
-
 
467
	rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes;
-
 
468
 
-
 
469
	disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R7XX_MAX_BACKENDS_MASK;
-
 
470
	tmp = (gb_tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT;
-
 
471
	tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.rv770.max_backends,
-
 
472
					R7XX_MAX_BACKENDS, disabled_rb_mask);
658
	}
473
	gb_tiling_config |= tmp << 16;
659
	rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes;
474
	rdev->config.rv770.backend_map = tmp;
-
 
475
 
-
 
476
	if (rdev->family == CHIP_RV770)
-
 
477
		gb_tiling_config |= BANK_TILING(1);
660
 
478
	else {
661
	if (rdev->family == CHIP_RV770)
479
		if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT)
-
 
480
			gb_tiling_config |= BANK_TILING(1);
662
		gb_tiling_config |= BANK_TILING(1);
481
	else
663
	else
482
			gb_tiling_config |= BANK_TILING(0);
664
		gb_tiling_config |= BANK_TILING((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT);
-
 
665
	rdev->config.rv770.tiling_nbanks = 4 << ((gb_tiling_config >> 4) & 0x3);
-
 
666
	gb_tiling_config |= GROUP_SIZE((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT);
-
 
667
	if ((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT)
-
 
668
		rdev->config.rv770.tiling_group_size = 512;
483
	}
669
	else
484
	rdev->config.rv770.tiling_nbanks = 4 << ((gb_tiling_config >> 4) & 0x3);
670
	rdev->config.rv770.tiling_group_size = 256;
485
	gb_tiling_config |= GROUP_SIZE((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT);
671
	if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) {
486
	if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) {
672
		gb_tiling_config |= ROW_TILING(3);
487
		gb_tiling_config |= ROW_TILING(3);
Line 677... Line 492...
677
		gb_tiling_config |=
492
		gb_tiling_config |=
678
			SAMPLE_SPLIT(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT));
493
			SAMPLE_SPLIT(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT));
679
	}
494
	}
Line 680... Line 495...
680
 
495
 
681
	gb_tiling_config |= BANK_SWAPS(1);
-
 
682
 
-
 
683
	cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000;
-
 
684
	cc_rb_backend_disable |=
-
 
685
		BACKEND_DISABLE((R7XX_MAX_BACKENDS_MASK << rdev->config.rv770.max_backends) & R7XX_MAX_BACKENDS_MASK);
-
 
686
 
-
 
687
	cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00;
-
 
688
	cc_gc_shader_pipe_config |=
-
 
689
		INACTIVE_QD_PIPES((R7XX_MAX_PIPES_MASK << rdev->config.rv770.max_pipes) & R7XX_MAX_PIPES_MASK);
-
 
690
	cc_gc_shader_pipe_config |=
-
 
691
		INACTIVE_SIMDS((R7XX_MAX_SIMDS_MASK << rdev->config.rv770.max_simds) & R7XX_MAX_SIMDS_MASK);
-
 
692
 
-
 
693
	if (rdev->family == CHIP_RV740)
-
 
694
		backend_map = 0x28;
-
 
695
	else
-
 
696
		backend_map = r700_get_tile_pipe_to_backend_map(rdev,
-
 
697
								rdev->config.rv770.max_tile_pipes,
-
 
698
								(R7XX_MAX_BACKENDS -
-
 
699
								 r600_count_pipe_bits((cc_rb_backend_disable &
-
 
700
										       R7XX_MAX_BACKENDS_MASK) >> 16)),
-
 
701
								(cc_rb_backend_disable >> 16));
-
 
702
 
496
	gb_tiling_config |= BANK_SWAPS(1);
703
	rdev->config.rv770.tile_config = gb_tiling_config;
-
 
704
	rdev->config.rv770.backend_map = backend_map;
-
 
Line 705... Line 497...
705
	gb_tiling_config |= BACKEND_MAP(backend_map);
497
	rdev->config.rv770.tile_config = gb_tiling_config;
706
 
498
 
707
	WREG32(GB_TILING_CONFIG, gb_tiling_config);
499
	WREG32(GB_TILING_CONFIG, gb_tiling_config);
Line 708... Line -...
708
	WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff));
-
 
709
	WREG32(HDP_TILING_CONFIG, (gb_tiling_config & 0xffff));
-
 
710
 
-
 
711
	rv770_program_channel_remap(rdev);
-
 
712
 
-
 
713
	WREG32(CC_RB_BACKEND_DISABLE,      cc_rb_backend_disable);
-
 
714
	WREG32(CC_GC_SHADER_PIPE_CONFIG,   cc_gc_shader_pipe_config);
-
 
715
	WREG32(GC_USER_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
500
	WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff));
716
	WREG32(CC_SYS_RB_BACKEND_DISABLE,  cc_rb_backend_disable);
501
	WREG32(HDP_TILING_CONFIG, (gb_tiling_config & 0xffff));
717
 
502
 
718
	WREG32(CGTS_SYS_TCC_DISABLE, 0);
503
	WREG32(CGTS_SYS_TCC_DISABLE, 0);
Line 719... Line 504...
719
	WREG32(CGTS_TCC_DISABLE, 0);
504
	WREG32(CGTS_TCC_DISABLE, 0);
720
	WREG32(CGTS_USER_SYS_TCC_DISABLE, 0);
505
	WREG32(CGTS_USER_SYS_TCC_DISABLE, 0);
721
	WREG32(CGTS_USER_TCC_DISABLE, 0);
506
	WREG32(CGTS_USER_TCC_DISABLE, 0);
722
 
507
 
Line 723... Line 508...
723
	num_qd_pipes =
508
 
724
		R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8);
509
	num_qd_pipes = R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8);
Line 747... Line 532...
747
	WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) |
532
	WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) |
748
					  GS_FLUSH_CTL(4) |
533
					  GS_FLUSH_CTL(4) |
749
					  ACK_FLUSH_CTL(3) |
534
					  ACK_FLUSH_CTL(3) |
750
					  SYNC_FLUSH_CTL));
535
					  SYNC_FLUSH_CTL));
Line -... Line 536...
-
 
536
 
-
 
537
	if (rdev->family != CHIP_RV770)
-
 
538
		WREG32(SMX_SAR_CTL0, 0x00003f3f);
751
 
539
 
752
	db_debug3 = RREG32(DB_DEBUG3);
540
	db_debug3 = RREG32(DB_DEBUG3);
753
	db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f);
541
	db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f);
754
	switch (rdev->family) {
542
	switch (rdev->family) {
755
	case CHIP_RV770:
543
	case CHIP_RV770:
Line 780... Line 568...
780
 
568
 
Line 781... Line 569...
781
	WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
569
	WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
Line 782... Line -...
782
 
-
 
783
	WREG32(VGT_NUM_INSTANCES, 1);
-
 
784
 
570
 
Line 785... Line 571...
785
	WREG32(SPI_CONFIG_CNTL, GPR_WRITE_PRIORITY(0));
571
	WREG32(VGT_NUM_INSTANCES, 1);
Line 786... Line 572...
786
 
572
 
Line 925... Line 711...
925
 
711
 
Line 926... Line 712...
926
	WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
712
	WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
927
 
713
 
928
	WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA |
-
 
929
					  NUM_CLIP_SEQ(3)));
-
 
930
 
-
 
931
}
-
 
932
 
-
 
933
static int rv770_vram_scratch_init(struct radeon_device *rdev)
-
 
934
{
-
 
935
	int r;
-
 
936
	u64 gpu_addr;
-
 
937
 
-
 
938
	if (rdev->vram_scratch.robj == NULL) {
-
 
939
		r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE,
-
 
940
				     PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
-
 
941
				     &rdev->vram_scratch.robj);
-
 
942
		if (r) {
-
 
943
			return r;
-
 
944
		}
-
 
945
	}
-
 
946
 
714
	WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA |
947
	r = radeon_bo_reserve(rdev->vram_scratch.robj, false);
-
 
948
	if (unlikely(r != 0))
-
 
949
		return r;
-
 
950
	r = radeon_bo_pin(rdev->vram_scratch.robj,
-
 
951
			  RADEON_GEM_DOMAIN_VRAM, &gpu_addr);
-
 
952
	if (r) {
-
 
953
		radeon_bo_unreserve(rdev->vram_scratch.robj);
-
 
954
		return r;
-
 
955
	}
-
 
956
	r = radeon_bo_kmap(rdev->vram_scratch.robj,
-
 
957
				(void **)&rdev->vram_scratch.ptr);
-
 
958
	if (r)
-
 
959
		radeon_bo_unpin(rdev->vram_scratch.robj);
-
 
960
	radeon_bo_unreserve(rdev->vram_scratch.robj);
-
 
961
 
-
 
962
	return r;
-
 
963
}
-
 
964
 
-
 
965
static void rv770_vram_scratch_fini(struct radeon_device *rdev)
-
 
966
{
-
 
967
	int r;
-
 
968
 
-
 
969
	if (rdev->vram_scratch.robj == NULL) {
-
 
970
		return;
-
 
971
	}
-
 
972
	r = radeon_bo_reserve(rdev->vram_scratch.robj, false);
-
 
973
	if (likely(r == 0)) {
-
 
974
		radeon_bo_kunmap(rdev->vram_scratch.robj);
-
 
975
		radeon_bo_unpin(rdev->vram_scratch.robj);
-
 
976
		radeon_bo_unreserve(rdev->vram_scratch.robj);
-
 
977
	}
715
					  NUM_CLIP_SEQ(3)));
Line 978... Line 716...
978
	radeon_bo_unref(&rdev->vram_scratch.robj);
716
	WREG32(VC_ENHANCE, 0);
979
}
717
}
980
 
718
 
Line 988... Line 726...
988
		mc->real_vram_size = 0xE0000000;
726
		mc->real_vram_size = 0xE0000000;
989
		mc->mc_vram_size = 0xE0000000;
727
		mc->mc_vram_size = 0xE0000000;
990
	}
728
	}
991
	if (rdev->flags & RADEON_IS_AGP) {
729
	if (rdev->flags & RADEON_IS_AGP) {
992
		size_bf = mc->gtt_start;
730
		size_bf = mc->gtt_start;
993
		size_af = 0xFFFFFFFF - mc->gtt_end + 1;
731
		size_af = 0xFFFFFFFF - mc->gtt_end;
994
		if (size_bf > size_af) {
732
		if (size_bf > size_af) {
995
			if (mc->mc_vram_size > size_bf) {
733
			if (mc->mc_vram_size > size_bf) {
996
				dev_warn(rdev->dev, "limiting VRAM\n");
734
				dev_warn(rdev->dev, "limiting VRAM\n");
997
				mc->real_vram_size = size_bf;
735
				mc->real_vram_size = size_bf;
998
				mc->mc_vram_size = size_bf;
736
				mc->mc_vram_size = size_bf;
Line 1002... Line 740...
1002
			if (mc->mc_vram_size > size_af) {
740
			if (mc->mc_vram_size > size_af) {
1003
				dev_warn(rdev->dev, "limiting VRAM\n");
741
				dev_warn(rdev->dev, "limiting VRAM\n");
1004
				mc->real_vram_size = size_af;
742
				mc->real_vram_size = size_af;
1005
				mc->mc_vram_size = size_af;
743
				mc->mc_vram_size = size_af;
1006
			}
744
			}
1007
			mc->vram_start = mc->gtt_end;
745
			mc->vram_start = mc->gtt_end + 1;
1008
		}
746
		}
1009
		mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
747
		mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
1010
		dev_info(rdev->dev, "VRAM: %lluM 0x%08llX - 0x%08llX (%lluM used)\n",
748
		dev_info(rdev->dev, "VRAM: %lluM 0x%08llX - 0x%08llX (%lluM used)\n",
1011
				mc->mc_vram_size >> 20, mc->vram_start,
749
				mc->mc_vram_size >> 20, mc->vram_start,
1012
				mc->vram_end, mc->real_vram_size >> 20);
750
				mc->vram_end, mc->real_vram_size >> 20);
Line 1015... Line 753...
1015
		rdev->mc.gtt_base_align = 0;
753
		rdev->mc.gtt_base_align = 0;
1016
		radeon_gtt_location(rdev, mc);
754
		radeon_gtt_location(rdev, mc);
1017
	}
755
	}
1018
}
756
}
Line 1019... Line 757...
1019
 
757
 
1020
int rv770_mc_init(struct radeon_device *rdev)
758
static int rv770_mc_init(struct radeon_device *rdev)
1021
{
759
{
1022
	u32 tmp;
760
	u32 tmp;
Line 1023... Line 761...
1023
	int chansize, numchan;
761
	int chansize, numchan;
Line 1062... Line 800...
1062
	return 0;
800
	return 0;
1063
}
801
}
Line 1064... Line 802...
1064
 
802
 
1065
static int rv770_startup(struct radeon_device *rdev)
803
static int rv770_startup(struct radeon_device *rdev)
-
 
804
{
1066
{
805
	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
Line 1067... Line 806...
1067
	int r;
806
	int r;
1068
 
807
 
Line 1075... Line 814...
1075
			DRM_ERROR("Failed to load firmware!\n");
814
			DRM_ERROR("Failed to load firmware!\n");
1076
			return r;
815
			return r;
1077
		}
816
		}
1078
	}
817
	}
Line -... Line 818...
-
 
818
 
-
 
819
	r = r600_vram_scratch_init(rdev);
-
 
820
	if (r)
-
 
821
		return r;
1079
 
822
 
1080
	rv770_mc_program(rdev);
823
	rv770_mc_program(rdev);
1081
	if (rdev->flags & RADEON_IS_AGP) {
824
	if (rdev->flags & RADEON_IS_AGP) {
1082
		rv770_agp_enable(rdev);
825
		rv770_agp_enable(rdev);
1083
	} else {
826
	} else {
1084
		r = rv770_pcie_gart_enable(rdev);
827
		r = rv770_pcie_gart_enable(rdev);
1085
		if (r)
828
		if (r)
1086
			return r;
829
			return r;
1087
	}
-
 
1088
	r = rv770_vram_scratch_init(rdev);
830
	}
1089
	if (r)
-
 
1090
		return r;
831
 
1091
	rv770_gpu_init(rdev);
832
	rv770_gpu_init(rdev);
1092
	r = r600_blit_init(rdev);
833
	r = r600_blit_init(rdev);
1093
	if (r) {
834
	if (r) {
1094
//		r600_blit_fini(rdev);
835
		r600_blit_fini(rdev);
1095
		rdev->asic->copy = NULL;
836
		rdev->asic->copy.copy = NULL;
1096
		dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
837
		dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
Line 1097... Line 838...
1097
	}
838
	}
1098
 
839
 
1099
    r = r600_video_init(rdev);
840
//    r = r600_video_init(rdev);
1100
    if (r) {
841
//    if (r) {
1101
//      r600_video_fini(rdev);
842
//      r600_video_fini(rdev);
1102
//        rdev->asic->copy = NULL;
843
//        rdev->asic->copy = NULL;
Line 1103... Line 844...
1103
        dev_warn(rdev->dev, "failed video blitter (%d) falling back to memcpy\n", r);
844
//        dev_warn(rdev->dev, "failed video blitter (%d) falling back to memcpy\n", r);
1104
    }
845
//    }
1105
 
846
 
1106
	/* allocate wb buffer */
847
	/* allocate wb buffer */
Line 1115... Line 856...
1115
//		radeon_irq_kms_fini(rdev);
856
//		radeon_irq_kms_fini(rdev);
1116
		return r;
857
		return r;
1117
	}
858
	}
1118
	r600_irq_set(rdev);
859
	r600_irq_set(rdev);
Line 1119... Line 860...
1119
 
860
 
-
 
861
	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
-
 
862
			     R600_CP_RB_RPTR, R600_CP_RB_WPTR,
1120
	r = radeon_ring_init(rdev, rdev->cp.ring_size);
863
			     0, 0xfffff, RADEON_CP_PACKET2);
1121
	if (r)
864
	if (r)
1122
		return r;
865
		return r;
1123
	r = rv770_cp_load_microcode(rdev);
866
	r = rv770_cp_load_microcode(rdev);
1124
	if (r)
867
	if (r)
1125
		return r;
868
		return r;
1126
	r = r600_cp_resume(rdev);
869
	r = r600_cp_resume(rdev);
1127
	if (r)
870
	if (r)
Line -... Line 871...
-
 
871
		return r;
-
 
872
 
-
 
873
	r = radeon_ib_pool_init(rdev);
-
 
874
	if (r) {
-
 
875
		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
-
 
876
		return r;
-
 
877
	}
1128
		return r;
878
 
1129
 
879
 
Line 1144... Line 894...
1144
 */
894
 */
1145
int rv770_init(struct radeon_device *rdev)
895
int rv770_init(struct radeon_device *rdev)
1146
{
896
{
1147
	int r;
897
	int r;
Line 1148... Line -...
1148
 
-
 
1149
	/* This don't do much */
-
 
1150
	r = radeon_gem_init(rdev);
-
 
1151
	if (r)
-
 
1152
		return r;
898
 
1153
	/* Read BIOS */
899
	/* Read BIOS */
1154
	if (!radeon_get_bios(rdev)) {
900
	if (!radeon_get_bios(rdev)) {
1155
		if (ASIC_IS_AVIVO(rdev))
901
		if (ASIC_IS_AVIVO(rdev))
1156
			return -EINVAL;
902
			return -EINVAL;
Line 1198... Line 944...
1198
 
944
 
1199
	r = radeon_irq_kms_init(rdev);
945
	r = radeon_irq_kms_init(rdev);
1200
	if (r)
946
	if (r)
Line 1201... Line 947...
1201
		return r;
947
		return r;
1202
 
948
 
Line 1203... Line 949...
1203
	rdev->cp.ring_obj = NULL;
949
	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
1204
	r600_ring_init(rdev, 1024 * 1024);
950
	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
Line 1205... Line 951...
1205
 
951
 
Line 1215... Line 961...
1215
	if (r) {
961
	if (r) {
1216
		dev_err(rdev->dev, "disabling GPU acceleration\n");
962
		dev_err(rdev->dev, "disabling GPU acceleration\n");
1217
		rv770_pcie_gart_fini(rdev);
963
		rv770_pcie_gart_fini(rdev);
1218
        rdev->accel_working = false;
964
        rdev->accel_working = false;
1219
	}
965
	}
1220
	if (rdev->accel_working) {
-
 
1221
		r = radeon_ib_pool_init(rdev);
-
 
1222
		if (r) {
-
 
1223
			dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
-
 
1224
			rdev->accel_working = false;
-
 
1225
		} else {
-
 
1226
			r = r600_ib_test(rdev);
-
 
1227
			if (r) {
-
 
1228
				dev_err(rdev->dev, "IB test failed (%d).\n", r);
-
 
1229
				rdev->accel_working = false;
-
 
1230
			}
-
 
1231
		}
-
 
1232
	}
-
 
Line 1233... Line 966...
1233
 
966
 
1234
	return 0;
967
	return 0;
Line 1235... Line 968...
1235
}
968
}
1236
 
969
 
1237
static void rv770_pcie_gen2_enable(struct radeon_device *rdev)
970
static void rv770_pcie_gen2_enable(struct radeon_device *rdev)
1238
{
971
{
-
 
972
	u32 link_width_cntl, lanes, speed_cntl, tmp;
-
 
973
	u16 link_cntl2;
Line 1239... Line 974...
1239
	u32 link_width_cntl, lanes, speed_cntl, tmp;
974
	u32 mask;
1240
	u16 link_cntl2;
975
	int ret;
Line 1241... Line 976...
1241
 
976
 
Line 1250... Line 985...
1250
 
985
 
1251
	/* x2 cards have a special sequence */
986
	/* x2 cards have a special sequence */
1252
	if (ASIC_IS_X2(rdev))
987
	if (ASIC_IS_X2(rdev))
Line -... Line 988...
-
 
988
		return;
-
 
989
 
-
 
990
	ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask);
-
 
991
	if (ret != 0)
-
 
992
		return;
-
 
993
 
-
 
994
	if (!(mask & DRM_PCIE_SPEED_50))
-
 
995
		return;
-
 
996
 
1253
		return;
997
	DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
1254
 
998
 
1255
	/* advertise upconfig capability */
999
	/* advertise upconfig capability */
1256
	link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL);
1000
	link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL);
1257
	link_width_cntl &= ~LC_UPCONFIGURE_DIS;
1001
	link_width_cntl &= ~LC_UPCONFIGURE_DIS;