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; |