aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/rv515.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/rv515.c')
-rw-r--r--drivers/gpu/drm/radeon/rv515.c367
1 files changed, 263 insertions, 104 deletions
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c
index fd799748e7d8..7935f793bf62 100644
--- a/drivers/gpu/drm/radeon/rv515.c
+++ b/drivers/gpu/drm/radeon/rv515.c
@@ -29,37 +29,17 @@
29#include "drmP.h" 29#include "drmP.h"
30#include "rv515d.h" 30#include "rv515d.h"
31#include "radeon.h" 31#include "radeon.h"
32 32#include "atom.h"
33#include "rv515_reg_safe.h" 33#include "rv515_reg_safe.h"
34/* rv515 depends on : */ 34
35void r100_hdp_reset(struct radeon_device *rdev); 35/* This files gather functions specifics to: rv515 */
36int r100_cp_reset(struct radeon_device *rdev);
37int r100_rb2d_reset(struct radeon_device *rdev);
38int r100_gui_wait_for_idle(struct radeon_device *rdev);
39int r100_cp_init(struct radeon_device *rdev, unsigned ring_size);
40void r420_pipes_init(struct radeon_device *rdev);
41void rs600_mc_disable_clients(struct radeon_device *rdev);
42void rs600_disable_vga(struct radeon_device *rdev);
43
44/* This files gather functions specifics to:
45 * rv515
46 *
47 * Some of these functions might be used by newer ASICs.
48 */
49int rv515_debugfs_pipes_info_init(struct radeon_device *rdev); 36int rv515_debugfs_pipes_info_init(struct radeon_device *rdev);
50int rv515_debugfs_ga_info_init(struct radeon_device *rdev); 37int rv515_debugfs_ga_info_init(struct radeon_device *rdev);
51void rv515_gpu_init(struct radeon_device *rdev); 38void rv515_gpu_init(struct radeon_device *rdev);
52int rv515_mc_wait_for_idle(struct radeon_device *rdev); 39int rv515_mc_wait_for_idle(struct radeon_device *rdev);
53 40
54 41void rv515_debugfs(struct radeon_device *rdev)
55/*
56 * MC
57 */
58int rv515_mc_init(struct radeon_device *rdev)
59{ 42{
60 uint32_t tmp;
61 int r;
62
63 if (r100_debugfs_rbbm_init(rdev)) { 43 if (r100_debugfs_rbbm_init(rdev)) {
64 DRM_ERROR("Failed to register debugfs file for RBBM !\n"); 44 DRM_ERROR("Failed to register debugfs file for RBBM !\n");
65 } 45 }
@@ -69,67 +49,8 @@ int rv515_mc_init(struct radeon_device *rdev)
69 if (rv515_debugfs_ga_info_init(rdev)) { 49 if (rv515_debugfs_ga_info_init(rdev)) {
70 DRM_ERROR("Failed to register debugfs file for pipes !\n"); 50 DRM_ERROR("Failed to register debugfs file for pipes !\n");
71 } 51 }
72
73 rv515_gpu_init(rdev);
74 rv370_pcie_gart_disable(rdev);
75
76 /* Setup GPU memory space */
77 rdev->mc.vram_location = 0xFFFFFFFFUL;
78 rdev->mc.gtt_location = 0xFFFFFFFFUL;
79 if (rdev->flags & RADEON_IS_AGP) {
80 r = radeon_agp_init(rdev);
81 if (r) {
82 printk(KERN_WARNING "[drm] Disabling AGP\n");
83 rdev->flags &= ~RADEON_IS_AGP;
84 rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
85 } else {
86 rdev->mc.gtt_location = rdev->mc.agp_base;
87 }
88 }
89 r = radeon_mc_setup(rdev);
90 if (r) {
91 return r;
92 }
93
94 /* Program GPU memory space */
95 rs600_mc_disable_clients(rdev);
96 if (rv515_mc_wait_for_idle(rdev)) {
97 printk(KERN_WARNING "Failed to wait MC idle while "
98 "programming pipes. Bad things might happen.\n");
99 }
100 /* Write VRAM size in case we are limiting it */
101 WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.real_vram_size);
102 tmp = REG_SET(MC_FB_START, rdev->mc.vram_location >> 16);
103 WREG32(0x134, tmp);
104 tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1;
105 tmp = REG_SET(MC_FB_TOP, tmp >> 16);
106 tmp |= REG_SET(MC_FB_START, rdev->mc.vram_location >> 16);
107 WREG32_MC(MC_FB_LOCATION, tmp);
108 WREG32(HDP_FB_LOCATION, rdev->mc.vram_location >> 16);
109 WREG32(0x310, rdev->mc.vram_location);
110 if (rdev->flags & RADEON_IS_AGP) {
111 tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 1;
112 tmp = REG_SET(MC_AGP_TOP, tmp >> 16);
113 tmp |= REG_SET(MC_AGP_START, rdev->mc.gtt_location >> 16);
114 WREG32_MC(MC_AGP_LOCATION, tmp);
115 WREG32_MC(MC_AGP_BASE, rdev->mc.agp_base);
116 WREG32_MC(MC_AGP_BASE_2, 0);
117 } else {
118 WREG32_MC(MC_AGP_LOCATION, 0x0FFFFFFF);
119 WREG32_MC(MC_AGP_BASE, 0);
120 WREG32_MC(MC_AGP_BASE_2, 0);
121 }
122 return 0;
123}
124
125void rv515_mc_fini(struct radeon_device *rdev)
126{
127} 52}
128 53
129
130/*
131 * Global GPU functions
132 */
133void rv515_ring_start(struct radeon_device *rdev) 54void rv515_ring_start(struct radeon_device *rdev)
134{ 55{
135 int r; 56 int r;
@@ -198,11 +119,6 @@ void rv515_ring_start(struct radeon_device *rdev)
198 radeon_ring_unlock_commit(rdev); 119 radeon_ring_unlock_commit(rdev);
199} 120}
200 121
201void rv515_errata(struct radeon_device *rdev)
202{
203 rdev->pll_errata = 0;
204}
205
206int rv515_mc_wait_for_idle(struct radeon_device *rdev) 122int rv515_mc_wait_for_idle(struct radeon_device *rdev)
207{ 123{
208 unsigned i; 124 unsigned i;
@@ -219,6 +135,14 @@ int rv515_mc_wait_for_idle(struct radeon_device *rdev)
219 return -1; 135 return -1;
220} 136}
221 137
138void rv515_vga_render_disable(struct radeon_device *rdev)
139{
140 WREG32(R_000330_D1VGA_CONTROL, 0);
141 WREG32(R_000338_D2VGA_CONTROL, 0);
142 WREG32(R_000300_VGA_RENDER_CONTROL,
143 RREG32(R_000300_VGA_RENDER_CONTROL) & C_000300_VGA_VSTATUS_CNTL);
144}
145
222void rv515_gpu_init(struct radeon_device *rdev) 146void rv515_gpu_init(struct radeon_device *rdev)
223{ 147{
224 unsigned pipe_select_current, gb_pipe_select, tmp; 148 unsigned pipe_select_current, gb_pipe_select, tmp;
@@ -231,7 +155,7 @@ void rv515_gpu_init(struct radeon_device *rdev)
231 "reseting GPU. Bad things might happen.\n"); 155 "reseting GPU. Bad things might happen.\n");
232 } 156 }
233 157
234 rs600_disable_vga(rdev); 158 rv515_vga_render_disable(rdev);
235 159
236 r420_pipes_init(rdev); 160 r420_pipes_init(rdev);
237 gb_pipe_select = RREG32(0x402C); 161 gb_pipe_select = RREG32(0x402C);
@@ -335,10 +259,6 @@ int rv515_gpu_reset(struct radeon_device *rdev)
335 return 0; 259 return 0;
336} 260}
337 261
338
339/*
340 * VRAM info
341 */
342static void rv515_vram_get_type(struct radeon_device *rdev) 262static void rv515_vram_get_type(struct radeon_device *rdev)
343{ 263{
344 uint32_t tmp; 264 uint32_t tmp;
@@ -374,10 +294,6 @@ void rv515_vram_info(struct radeon_device *rdev)
374 rdev->pm.sclk.full = rfixed_div(rdev->pm.sclk, a); 294 rdev->pm.sclk.full = rfixed_div(rdev->pm.sclk, a);
375} 295}
376 296
377
378/*
379 * Indirect registers accessor
380 */
381uint32_t rv515_mc_rreg(struct radeon_device *rdev, uint32_t reg) 297uint32_t rv515_mc_rreg(struct radeon_device *rdev, uint32_t reg)
382{ 298{
383 uint32_t r; 299 uint32_t r;
@@ -395,9 +311,6 @@ void rv515_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
395 WREG32(MC_IND_INDEX, 0); 311 WREG32(MC_IND_INDEX, 0);
396} 312}
397 313
398/*
399 * Debugfs info
400 */
401#if defined(CONFIG_DEBUG_FS) 314#if defined(CONFIG_DEBUG_FS)
402static int rv515_debugfs_pipes_info(struct seq_file *m, void *data) 315static int rv515_debugfs_pipes_info(struct seq_file *m, void *data)
403{ 316{
@@ -459,13 +372,259 @@ int rv515_debugfs_ga_info_init(struct radeon_device *rdev)
459#endif 372#endif
460} 373}
461 374
462/* 375void rv515_mc_stop(struct radeon_device *rdev, struct rv515_mc_save *save)
463 * Asic initialization 376{
464 */ 377 save->d1vga_control = RREG32(R_000330_D1VGA_CONTROL);
465int rv515_init(struct radeon_device *rdev) 378 save->d2vga_control = RREG32(R_000338_D2VGA_CONTROL);
379 save->vga_render_control = RREG32(R_000300_VGA_RENDER_CONTROL);
380 save->vga_hdp_control = RREG32(R_000328_VGA_HDP_CONTROL);
381 save->d1crtc_control = RREG32(R_006080_D1CRTC_CONTROL);
382 save->d2crtc_control = RREG32(R_006880_D2CRTC_CONTROL);
383
384 /* Stop all video */
385 WREG32(R_000330_D1VGA_CONTROL, 0);
386 WREG32(R_0068E8_D2CRTC_UPDATE_LOCK, 0);
387 WREG32(R_000300_VGA_RENDER_CONTROL, 0);
388 WREG32(R_0060E8_D1CRTC_UPDATE_LOCK, 1);
389 WREG32(R_0068E8_D2CRTC_UPDATE_LOCK, 1);
390 WREG32(R_006080_D1CRTC_CONTROL, 0);
391 WREG32(R_006880_D2CRTC_CONTROL, 0);
392 WREG32(R_0060E8_D1CRTC_UPDATE_LOCK, 0);
393 WREG32(R_0068E8_D2CRTC_UPDATE_LOCK, 0);
394}
395
396void rv515_mc_resume(struct radeon_device *rdev, struct rv515_mc_save *save)
397{
398 WREG32(R_006110_D1GRPH_PRIMARY_SURFACE_ADDRESS, rdev->mc.vram_start);
399 WREG32(R_006118_D1GRPH_SECONDARY_SURFACE_ADDRESS, rdev->mc.vram_start);
400 WREG32(R_006910_D2GRPH_PRIMARY_SURFACE_ADDRESS, rdev->mc.vram_start);
401 WREG32(R_006918_D2GRPH_SECONDARY_SURFACE_ADDRESS, rdev->mc.vram_start);
402 WREG32(R_000310_VGA_MEMORY_BASE_ADDRESS, rdev->mc.vram_start);
403 /* Unlock host access */
404 WREG32(R_000328_VGA_HDP_CONTROL, save->vga_hdp_control);
405 mdelay(1);
406 /* Restore video state */
407 WREG32(R_0060E8_D1CRTC_UPDATE_LOCK, 1);
408 WREG32(R_0068E8_D2CRTC_UPDATE_LOCK, 1);
409 WREG32(R_006080_D1CRTC_CONTROL, save->d1crtc_control);
410 WREG32(R_006880_D2CRTC_CONTROL, save->d2crtc_control);
411 WREG32(R_0060E8_D1CRTC_UPDATE_LOCK, 0);
412 WREG32(R_0068E8_D2CRTC_UPDATE_LOCK, 0);
413 WREG32(R_000330_D1VGA_CONTROL, save->d1vga_control);
414 WREG32(R_000338_D2VGA_CONTROL, save->d2vga_control);
415 WREG32(R_000300_VGA_RENDER_CONTROL, save->vga_render_control);
416}
417
418void rv515_mc_program(struct radeon_device *rdev)
419{
420 struct rv515_mc_save save;
421
422 /* Stops all mc clients */
423 rv515_mc_stop(rdev, &save);
424
425 /* Wait for mc idle */
426 if (rv515_mc_wait_for_idle(rdev))
427 dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n");
428 /* Write VRAM size in case we are limiting it */
429 WREG32(R_0000F8_CONFIG_MEMSIZE, rdev->mc.real_vram_size);
430 /* Program MC, should be a 32bits limited address space */
431 WREG32_MC(R_000001_MC_FB_LOCATION,
432 S_000001_MC_FB_START(rdev->mc.vram_start >> 16) |
433 S_000001_MC_FB_TOP(rdev->mc.vram_end >> 16));
434 WREG32(R_000134_HDP_FB_LOCATION,
435 S_000134_HDP_FB_START(rdev->mc.vram_start >> 16));
436 if (rdev->flags & RADEON_IS_AGP) {
437 WREG32_MC(R_000002_MC_AGP_LOCATION,
438 S_000002_MC_AGP_START(rdev->mc.gtt_start >> 16) |
439 S_000002_MC_AGP_TOP(rdev->mc.gtt_end >> 16));
440 WREG32_MC(R_000003_MC_AGP_BASE, lower_32_bits(rdev->mc.agp_base));
441 WREG32_MC(R_000004_MC_AGP_BASE_2,
442 S_000004_AGP_BASE_ADDR_2(upper_32_bits(rdev->mc.agp_base)));
443 } else {
444 WREG32_MC(R_000002_MC_AGP_LOCATION, 0xFFFFFFFF);
445 WREG32_MC(R_000003_MC_AGP_BASE, 0);
446 WREG32_MC(R_000004_MC_AGP_BASE_2, 0);
447 }
448
449 rv515_mc_resume(rdev, &save);
450}
451
452void rv515_clock_startup(struct radeon_device *rdev)
453{
454 if (radeon_dynclks != -1 && radeon_dynclks)
455 radeon_atom_set_clock_gating(rdev, 1);
456 /* We need to force on some of the block */
457 WREG32_PLL(R_00000F_CP_DYN_CNTL,
458 RREG32_PLL(R_00000F_CP_DYN_CNTL) | S_00000F_CP_FORCEON(1));
459 WREG32_PLL(R_000011_E2_DYN_CNTL,
460 RREG32_PLL(R_000011_E2_DYN_CNTL) | S_000011_E2_FORCEON(1));
461 WREG32_PLL(R_000013_IDCT_DYN_CNTL,
462 RREG32_PLL(R_000013_IDCT_DYN_CNTL) | S_000013_IDCT_FORCEON(1));
463}
464
465static int rv515_startup(struct radeon_device *rdev)
466{
467 int r;
468
469 rv515_mc_program(rdev);
470 /* Resume clock */
471 rv515_clock_startup(rdev);
472 /* Initialize GPU configuration (# pipes, ...) */
473 rv515_gpu_init(rdev);
474 /* Initialize GART (initialize after TTM so we can allocate
475 * memory through TTM but finalize after TTM) */
476 if (rdev->flags & RADEON_IS_PCIE) {
477 r = rv370_pcie_gart_enable(rdev);
478 if (r)
479 return r;
480 }
481 /* Enable IRQ */
482 rdev->irq.sw_int = true;
483 rs600_irq_set(rdev);
484 /* 1M ring buffer */
485 r = r100_cp_init(rdev, 1024 * 1024);
486 if (r) {
487 dev_err(rdev->dev, "failled initializing CP (%d).\n", r);
488 return r;
489 }
490 r = r100_wb_init(rdev);
491 if (r)
492 dev_err(rdev->dev, "failled initializing WB (%d).\n", r);
493 r = r100_ib_init(rdev);
494 if (r) {
495 dev_err(rdev->dev, "failled initializing IB (%d).\n", r);
496 return r;
497 }
498 return 0;
499}
500
501int rv515_resume(struct radeon_device *rdev)
502{
503 /* Make sur GART are not working */
504 if (rdev->flags & RADEON_IS_PCIE)
505 rv370_pcie_gart_disable(rdev);
506 /* Resume clock before doing reset */
507 rv515_clock_startup(rdev);
508 /* Reset gpu before posting otherwise ATOM will enter infinite loop */
509 if (radeon_gpu_reset(rdev)) {
510 dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n",
511 RREG32(R_000E40_RBBM_STATUS),
512 RREG32(R_0007C0_CP_STAT));
513 }
514 /* post */
515 atom_asic_init(rdev->mode_info.atom_context);
516 /* Resume clock after posting */
517 rv515_clock_startup(rdev);
518 return rv515_startup(rdev);
519}
520
521int rv515_suspend(struct radeon_device *rdev)
522{
523 r100_cp_disable(rdev);
524 r100_wb_disable(rdev);
525 rs600_irq_disable(rdev);
526 if (rdev->flags & RADEON_IS_PCIE)
527 rv370_pcie_gart_disable(rdev);
528 return 0;
529}
530
531void rv515_set_safe_registers(struct radeon_device *rdev)
466{ 532{
467 rdev->config.r300.reg_safe_bm = rv515_reg_safe_bm; 533 rdev->config.r300.reg_safe_bm = rv515_reg_safe_bm;
468 rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(rv515_reg_safe_bm); 534 rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(rv515_reg_safe_bm);
535}
536
537void rv515_fini(struct radeon_device *rdev)
538{
539 rv515_suspend(rdev);
540 r100_cp_fini(rdev);
541 r100_wb_fini(rdev);
542 r100_ib_fini(rdev);
543 radeon_gem_fini(rdev);
544 rv370_pcie_gart_fini(rdev);
545 radeon_agp_fini(rdev);
546 radeon_irq_kms_fini(rdev);
547 radeon_fence_driver_fini(rdev);
548 radeon_object_fini(rdev);
549 radeon_atombios_fini(rdev);
550 kfree(rdev->bios);
551 rdev->bios = NULL;
552}
553
554int rv515_init(struct radeon_device *rdev)
555{
556 int r;
557
558 /* Initialize scratch registers */
559 radeon_scratch_init(rdev);
560 /* Initialize surface registers */
561 radeon_surface_init(rdev);
562 /* TODO: disable VGA need to use VGA request */
563 /* BIOS*/
564 if (!radeon_get_bios(rdev)) {
565 if (ASIC_IS_AVIVO(rdev))
566 return -EINVAL;
567 }
568 if (rdev->is_atom_bios) {
569 r = radeon_atombios_init(rdev);
570 if (r)
571 return r;
572 } else {
573 dev_err(rdev->dev, "Expecting atombios for RV515 GPU\n");
574 return -EINVAL;
575 }
576 /* Reset gpu before posting otherwise ATOM will enter infinite loop */
577 if (radeon_gpu_reset(rdev)) {
578 dev_warn(rdev->dev,
579 "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n",
580 RREG32(R_000E40_RBBM_STATUS),
581 RREG32(R_0007C0_CP_STAT));
582 }
583 /* check if cards are posted or not */
584 if (!radeon_card_posted(rdev) && rdev->bios) {
585 DRM_INFO("GPU not posted. posting now...\n");
586 atom_asic_init(rdev->mode_info.atom_context);
587 }
588 /* Initialize clocks */
589 radeon_get_clock_info(rdev->ddev);
590 /* Initialize power management */
591 radeon_pm_init(rdev);
592 /* Get vram informations */
593 rv515_vram_info(rdev);
594 /* Initialize memory controller (also test AGP) */
595 r = r420_mc_init(rdev);
596 if (r)
597 return r;
598 rv515_debugfs(rdev);
599 /* Fence driver */
600 r = radeon_fence_driver_init(rdev);
601 if (r)
602 return r;
603 r = radeon_irq_kms_init(rdev);
604 if (r)
605 return r;
606 /* Memory manager */
607 r = radeon_object_init(rdev);
608 if (r)
609 return r;
610 r = rv370_pcie_gart_init(rdev);
611 if (r)
612 return r;
613 rv515_set_safe_registers(rdev);
614 rdev->accel_working = true;
615 r = rv515_startup(rdev);
616 if (r) {
617 /* Somethings want wront with the accel init stop accel */
618 dev_err(rdev->dev, "Disabling GPU acceleration\n");
619 rv515_suspend(rdev);
620 r100_cp_fini(rdev);
621 r100_wb_fini(rdev);
622 r100_ib_fini(rdev);
623 rv370_pcie_gart_fini(rdev);
624 radeon_agp_fini(rdev);
625 radeon_irq_kms_fini(rdev);
626 rdev->accel_working = false;
627 }
469 return 0; 628 return 0;
470} 629}
471 630