Merge branch 'drm-radeon-ni' of ../drm-radeon-next into drm-core-next

* 'drm-radeon-ni' of ../drm-radeon-next: (30 commits)
radeon: consolidate asic-specific function decls for pre-r600
drm/radeon/kms: add NI pci ids
drm/radeon/kms: don't enable pcie gen2 on NI yet
drm/radeon/kms: add radeon_asic struct for NI asics
drm/radeon/kms/ni: load default sclk/mclk/vddc at pm init
drm/radeon/kms: add ucode loader for NI
drm/radeon/kms: add support for DCE5 display LUTs
drm/radeon/kms: add ni_reg.h
drm/radeon/kms: add bo blit support for NI
drm/radeon/kms: always use writeback/events for fences on NI
drm/radeon/kms: adjust default clock/vddc tracking for pm on DCE5
drm/radeon/kms: add backend map workaround for barts
drm/radeon/kms: fill gpu init for NI asics
drm/radeon/kms: add disabled vbios accessor for NI asics
drm/radeon/kms: handle NI thermal controller
drm/radeon/kms: parse DCE5 encoder caps when setting up encoders
drm/radeon/kms: dvo dpms updates for DCE5
drm/radeon/kms: dac dpms updates for DCE5
drm/radeon/kms: DCE5 atom dig encoder updates
drm/radeon/kms: DCE5 atom transmitter control updates
...

+1629 -149
+1 -1
drivers/gpu/drm/radeon/Makefile
··· 66 66 r200.o radeon_legacy_tv.o r600_cs.o r600_blit.o r600_blit_shaders.o \ 67 67 r600_blit_kms.o radeon_pm.o atombios_dp.o r600_audio.o r600_hdmi.o \ 68 68 evergreen.o evergreen_cs.o evergreen_blit_shaders.o evergreen_blit_kms.o \ 69 - radeon_trace_points.o 69 + radeon_trace_points.o ni.o 70 70 71 71 radeon-$(CONFIG_COMPAT) += radeon_ioc32.o 72 72 radeon-$(CONFIG_VGA_SWITCHEROO) += radeon_atpx_handler.o
+53 -4
drivers/gpu/drm/radeon/atombios_crtc.c
··· 403 403 ENABLE_LVDS_SS_PARAMETERS_V2 lvds_ss_2; 404 404 ENABLE_SPREAD_SPECTRUM_ON_PPLL_PS_ALLOCATION v1; 405 405 ENABLE_SPREAD_SPECTRUM_ON_PPLL_V2 v2; 406 + ENABLE_SPREAD_SPECTRUM_ON_PPLL_V3 v3; 406 407 }; 407 408 408 409 static void atombios_crtc_program_ss(struct drm_crtc *crtc, ··· 418 417 419 418 memset(&args, 0, sizeof(args)); 420 419 421 - if (ASIC_IS_DCE4(rdev)) { 420 + if (ASIC_IS_DCE5(rdev)) { 421 + args.v3.usSpreadSpectrumAmountFrac = 0; 422 + args.v3.ucSpreadSpectrumType = ss->type; 423 + switch (pll_id) { 424 + case ATOM_PPLL1: 425 + args.v3.ucSpreadSpectrumType |= ATOM_PPLL_SS_TYPE_V3_P1PLL; 426 + args.v3.usSpreadSpectrumAmount = ss->amount; 427 + args.v3.usSpreadSpectrumStep = ss->step; 428 + break; 429 + case ATOM_PPLL2: 430 + args.v3.ucSpreadSpectrumType |= ATOM_PPLL_SS_TYPE_V3_P2PLL; 431 + args.v3.usSpreadSpectrumAmount = ss->amount; 432 + args.v3.usSpreadSpectrumStep = ss->step; 433 + break; 434 + case ATOM_DCPLL: 435 + args.v3.ucSpreadSpectrumType |= ATOM_PPLL_SS_TYPE_V3_DCPLL; 436 + args.v3.usSpreadSpectrumAmount = 0; 437 + args.v3.usSpreadSpectrumStep = 0; 438 + break; 439 + case ATOM_PPLL_INVALID: 440 + return; 441 + } 442 + args.v2.ucEnable = enable; 443 + } else if (ASIC_IS_DCE4(rdev)) { 422 444 args.v2.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage); 423 445 args.v2.ucSpreadSpectrumType = ss->type; 424 446 switch (pll_id) { ··· 697 673 PIXEL_CLOCK_PARAMETERS_V2 v2; 698 674 PIXEL_CLOCK_PARAMETERS_V3 v3; 699 675 PIXEL_CLOCK_PARAMETERS_V5 v5; 676 + PIXEL_CLOCK_PARAMETERS_V6 v6; 700 677 }; 701 678 702 - static void atombios_crtc_set_dcpll(struct drm_crtc *crtc) 679 + /* on DCE5, make sure the voltage is high enough to support the 680 + * required disp clk. 681 + */ 682 + static void atombios_crtc_set_dcpll(struct drm_crtc *crtc, 683 + u32 dispclk) 703 684 { 704 685 struct drm_device *dev = crtc->dev; 705 686 struct radeon_device *rdev = dev->dev_private; ··· 727 698 * SetPixelClock provides the dividers 728 699 */ 729 700 args.v5.ucCRTC = ATOM_CRTC_INVALID; 730 - args.v5.usPixelClock = rdev->clock.default_dispclk; 701 + args.v5.usPixelClock = dispclk; 731 702 args.v5.ucPpll = ATOM_DCPLL; 703 + break; 704 + case 6: 705 + /* if the default dcpll clock is specified, 706 + * SetPixelClock provides the dividers 707 + */ 708 + args.v6.ulDispEngClkFreq = dispclk; 709 + args.v6.ucPpll = ATOM_DCPLL; 732 710 break; 733 711 default: 734 712 DRM_ERROR("Unknown table version %d %d\n", frev, crev); ··· 819 783 args.v5.ucTransmitterID = encoder_id; 820 784 args.v5.ucEncoderMode = encoder_mode; 821 785 args.v5.ucPpll = pll_id; 786 + break; 787 + case 6: 788 + args.v6.ulCrtcPclkFreq.ucCRTC = crtc_id; 789 + args.v6.ulCrtcPclkFreq.ulPixelClock = cpu_to_le32(clock / 10); 790 + args.v6.ucRefDiv = ref_div; 791 + args.v6.usFbDiv = cpu_to_le16(fb_div); 792 + args.v6.ulFbDivDecFrac = cpu_to_le32(frac_fb_div * 100000); 793 + args.v6.ucPostDiv = post_div; 794 + args.v6.ucMiscInfo = 0; /* HDMI depth, etc. */ 795 + args.v6.ucTransmitterID = encoder_id; 796 + args.v6.ucEncoderMode = encoder_mode; 797 + args.v6.ucPpll = pll_id; 822 798 break; 823 799 default: 824 800 DRM_ERROR("Unknown table version %d %d\n", frev, crev); ··· 1425 1377 rdev->clock.default_dispclk); 1426 1378 if (ss_enabled) 1427 1379 atombios_crtc_program_ss(crtc, ATOM_DISABLE, ATOM_DCPLL, &ss); 1428 - atombios_crtc_set_dcpll(crtc); 1380 + /* XXX: DCE5, make sure voltage, dispclk is high enough */ 1381 + atombios_crtc_set_dcpll(crtc, rdev->clock.default_dispclk); 1429 1382 if (ss_enabled) 1430 1383 atombios_crtc_program_ss(crtc, ATOM_ENABLE, ATOM_DCPLL, &ss); 1431 1384 }
+161 -8
drivers/gpu/drm/radeon/evergreen.c
··· 39 39 40 40 static void evergreen_gpu_init(struct radeon_device *rdev); 41 41 void evergreen_fini(struct radeon_device *rdev); 42 + static void evergreen_pcie_gen2_enable(struct radeon_device *rdev); 42 43 43 44 void evergreen_pre_page_flip(struct radeon_device *rdev, int crtc) 44 45 { ··· 401 400 case 0: 402 401 case 4: 403 402 default: 404 - return 3840 * 2; 403 + if (ASIC_IS_DCE5(rdev)) 404 + return 4096 * 2; 405 + else 406 + return 3840 * 2; 405 407 case 1: 406 408 case 5: 407 - return 5760 * 2; 409 + if (ASIC_IS_DCE5(rdev)) 410 + return 6144 * 2; 411 + else 412 + return 5760 * 2; 408 413 case 2: 409 414 case 6: 410 - return 7680 * 2; 415 + if (ASIC_IS_DCE5(rdev)) 416 + return 8192 * 2; 417 + else 418 + return 7680 * 2; 411 419 case 3: 412 420 case 7: 413 - return 1920 * 2; 421 + if (ASIC_IS_DCE5(rdev)) 422 + return 2048 * 2; 423 + else 424 + return 1920 * 2; 414 425 } 415 426 } 416 427 ··· 1159 1146 tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); 1160 1147 WREG32(MC_VM_FB_LOCATION, tmp); 1161 1148 WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); 1162 - WREG32(HDP_NONSURFACE_INFO, (2 << 7)); 1149 + WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30)); 1163 1150 WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF); 1164 1151 if (rdev->flags & RADEON_IS_AGP) { 1165 1152 WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16); ··· 1384 1371 case CHIP_CEDAR: 1385 1372 case CHIP_REDWOOD: 1386 1373 case CHIP_PALM: 1374 + case CHIP_TURKS: 1375 + case CHIP_CAICOS: 1387 1376 force_no_swizzle = false; 1388 1377 break; 1389 1378 case CHIP_CYPRESS: 1390 1379 case CHIP_HEMLOCK: 1391 1380 case CHIP_JUNIPER: 1381 + case CHIP_BARTS: 1392 1382 default: 1393 1383 force_no_swizzle = true; 1394 1384 break; ··· 1505 1489 switch (rdev->family) { 1506 1490 case CHIP_HEMLOCK: 1507 1491 case CHIP_CYPRESS: 1492 + case CHIP_BARTS: 1508 1493 tcp_chan_steer_lo = 0x54763210; 1509 1494 tcp_chan_steer_hi = 0x0000ba98; 1510 1495 break; ··· 1513 1496 case CHIP_REDWOOD: 1514 1497 case CHIP_CEDAR: 1515 1498 case CHIP_PALM: 1499 + case CHIP_TURKS: 1500 + case CHIP_CAICOS: 1516 1501 default: 1517 1502 tcp_chan_steer_lo = 0x76543210; 1518 1503 tcp_chan_steer_hi = 0x0000ba98; ··· 1640 1621 case CHIP_PALM: 1641 1622 rdev->config.evergreen.num_ses = 1; 1642 1623 rdev->config.evergreen.max_pipes = 2; 1624 + rdev->config.evergreen.max_tile_pipes = 2; 1625 + rdev->config.evergreen.max_simds = 2; 1626 + rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses; 1627 + rdev->config.evergreen.max_gprs = 256; 1628 + rdev->config.evergreen.max_threads = 192; 1629 + rdev->config.evergreen.max_gs_threads = 16; 1630 + rdev->config.evergreen.max_stack_entries = 256; 1631 + rdev->config.evergreen.sx_num_of_sets = 4; 1632 + rdev->config.evergreen.sx_max_export_size = 128; 1633 + rdev->config.evergreen.sx_max_export_pos_size = 32; 1634 + rdev->config.evergreen.sx_max_export_smx_size = 96; 1635 + rdev->config.evergreen.max_hw_contexts = 4; 1636 + rdev->config.evergreen.sq_num_cf_insts = 1; 1637 + 1638 + rdev->config.evergreen.sc_prim_fifo_size = 0x40; 1639 + rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 1640 + rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 1641 + break; 1642 + case CHIP_BARTS: 1643 + rdev->config.evergreen.num_ses = 2; 1644 + rdev->config.evergreen.max_pipes = 4; 1645 + rdev->config.evergreen.max_tile_pipes = 8; 1646 + rdev->config.evergreen.max_simds = 7; 1647 + rdev->config.evergreen.max_backends = 4 * rdev->config.evergreen.num_ses; 1648 + rdev->config.evergreen.max_gprs = 256; 1649 + rdev->config.evergreen.max_threads = 248; 1650 + rdev->config.evergreen.max_gs_threads = 32; 1651 + rdev->config.evergreen.max_stack_entries = 512; 1652 + rdev->config.evergreen.sx_num_of_sets = 4; 1653 + rdev->config.evergreen.sx_max_export_size = 256; 1654 + rdev->config.evergreen.sx_max_export_pos_size = 64; 1655 + rdev->config.evergreen.sx_max_export_smx_size = 192; 1656 + rdev->config.evergreen.max_hw_contexts = 8; 1657 + rdev->config.evergreen.sq_num_cf_insts = 2; 1658 + 1659 + rdev->config.evergreen.sc_prim_fifo_size = 0x100; 1660 + rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 1661 + rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 1662 + break; 1663 + case CHIP_TURKS: 1664 + rdev->config.evergreen.num_ses = 1; 1665 + rdev->config.evergreen.max_pipes = 4; 1666 + rdev->config.evergreen.max_tile_pipes = 4; 1667 + rdev->config.evergreen.max_simds = 6; 1668 + rdev->config.evergreen.max_backends = 2 * rdev->config.evergreen.num_ses; 1669 + rdev->config.evergreen.max_gprs = 256; 1670 + rdev->config.evergreen.max_threads = 248; 1671 + rdev->config.evergreen.max_gs_threads = 32; 1672 + rdev->config.evergreen.max_stack_entries = 256; 1673 + rdev->config.evergreen.sx_num_of_sets = 4; 1674 + rdev->config.evergreen.sx_max_export_size = 256; 1675 + rdev->config.evergreen.sx_max_export_pos_size = 64; 1676 + rdev->config.evergreen.sx_max_export_smx_size = 192; 1677 + rdev->config.evergreen.max_hw_contexts = 8; 1678 + rdev->config.evergreen.sq_num_cf_insts = 2; 1679 + 1680 + rdev->config.evergreen.sc_prim_fifo_size = 0x100; 1681 + rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 1682 + rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 1683 + break; 1684 + case CHIP_CAICOS: 1685 + rdev->config.evergreen.num_ses = 1; 1686 + rdev->config.evergreen.max_pipes = 4; 1643 1687 rdev->config.evergreen.max_tile_pipes = 2; 1644 1688 rdev->config.evergreen.max_simds = 2; 1645 1689 rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses; ··· 1862 1780 switch (rdev->family) { 1863 1781 case CHIP_CYPRESS: 1864 1782 case CHIP_HEMLOCK: 1783 + case CHIP_BARTS: 1865 1784 gb_backend_map = 0x66442200; 1866 1785 break; 1867 1786 case CHIP_JUNIPER: ··· 2001 1918 switch (rdev->family) { 2002 1919 case CHIP_CEDAR: 2003 1920 case CHIP_PALM: 1921 + case CHIP_CAICOS: 2004 1922 /* no vertex cache */ 2005 1923 sq_config &= ~VC_ENABLE; 2006 1924 break; ··· 2061 1977 switch (rdev->family) { 2062 1978 case CHIP_CEDAR: 2063 1979 case CHIP_PALM: 1980 + case CHIP_CAICOS: 2064 1981 vgt_cache_invalidation = CACHE_INVALIDATION(TC_ONLY); 2065 1982 break; 2066 1983 default: ··· 2852 2767 { 2853 2768 int r; 2854 2769 2855 - if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { 2856 - r = r600_init_microcode(rdev); 2770 + /* enable pcie gen2 link */ 2771 + if (!ASIC_IS_DCE5(rdev)) 2772 + evergreen_pcie_gen2_enable(rdev); 2773 + 2774 + if (ASIC_IS_DCE5(rdev)) { 2775 + if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) { 2776 + r = ni_init_microcode(rdev); 2777 + if (r) { 2778 + DRM_ERROR("Failed to load firmware!\n"); 2779 + return r; 2780 + } 2781 + } 2782 + r = btc_mc_load_microcode(rdev); 2857 2783 if (r) { 2858 - DRM_ERROR("Failed to load firmware!\n"); 2784 + DRM_ERROR("Failed to load MC firmware!\n"); 2859 2785 return r; 2786 + } 2787 + } else { 2788 + if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { 2789 + r = r600_init_microcode(rdev); 2790 + if (r) { 2791 + DRM_ERROR("Failed to load firmware!\n"); 2792 + return r; 2793 + } 2860 2794 } 2861 2795 } 2862 2796 ··· 3152 3048 kfree(rdev->bios); 3153 3049 rdev->bios = NULL; 3154 3050 radeon_dummy_page_fini(rdev); 3051 + } 3052 + 3053 + static void evergreen_pcie_gen2_enable(struct radeon_device *rdev) 3054 + { 3055 + u32 link_width_cntl, speed_cntl; 3056 + 3057 + if (rdev->flags & RADEON_IS_IGP) 3058 + return; 3059 + 3060 + if (!(rdev->flags & RADEON_IS_PCIE)) 3061 + return; 3062 + 3063 + /* x2 cards have a special sequence */ 3064 + if (ASIC_IS_X2(rdev)) 3065 + return; 3066 + 3067 + speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL); 3068 + if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) || 3069 + (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) { 3070 + 3071 + link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL); 3072 + link_width_cntl &= ~LC_UPCONFIGURE_DIS; 3073 + WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 3074 + 3075 + speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL); 3076 + speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN; 3077 + WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl); 3078 + 3079 + speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL); 3080 + speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT; 3081 + WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl); 3082 + 3083 + speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL); 3084 + speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT; 3085 + WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl); 3086 + 3087 + speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL); 3088 + speed_cntl |= LC_GEN2_EN_STRAP; 3089 + WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl); 3090 + 3091 + } else { 3092 + link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL); 3093 + /* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */ 3094 + if (1) 3095 + link_width_cntl |= LC_UPCONFIGURE_DIS; 3096 + else 3097 + link_width_cntl &= ~LC_UPCONFIGURE_DIS; 3098 + WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 3099 + } 3155 3100 }
+67 -2
drivers/gpu/drm/radeon/evergreen_blit_kms.c
··· 148 148 radeon_ring_write(rdev, SQ_TEX_VTX_VALID_BUFFER << 30); 149 149 150 150 if ((rdev->family == CHIP_CEDAR) || 151 - (rdev->family == CHIP_PALM)) 151 + (rdev->family == CHIP_PALM) || 152 + (rdev->family == CHIP_CAICOS)) 152 153 cp_set_surface_sync(rdev, 153 154 PACKET3_TC_ACTION_ENA, 48, gpu_addr); 154 155 else ··· 354 353 num_hs_stack_entries = 42; 355 354 num_ls_stack_entries = 42; 356 355 break; 356 + case CHIP_BARTS: 357 + num_ps_gprs = 93; 358 + num_vs_gprs = 46; 359 + num_temp_gprs = 4; 360 + num_gs_gprs = 31; 361 + num_es_gprs = 31; 362 + num_hs_gprs = 23; 363 + num_ls_gprs = 23; 364 + num_ps_threads = 128; 365 + num_vs_threads = 20; 366 + num_gs_threads = 20; 367 + num_es_threads = 20; 368 + num_hs_threads = 20; 369 + num_ls_threads = 20; 370 + num_ps_stack_entries = 85; 371 + num_vs_stack_entries = 85; 372 + num_gs_stack_entries = 85; 373 + num_es_stack_entries = 85; 374 + num_hs_stack_entries = 85; 375 + num_ls_stack_entries = 85; 376 + break; 377 + case CHIP_TURKS: 378 + num_ps_gprs = 93; 379 + num_vs_gprs = 46; 380 + num_temp_gprs = 4; 381 + num_gs_gprs = 31; 382 + num_es_gprs = 31; 383 + num_hs_gprs = 23; 384 + num_ls_gprs = 23; 385 + num_ps_threads = 128; 386 + num_vs_threads = 20; 387 + num_gs_threads = 20; 388 + num_es_threads = 20; 389 + num_hs_threads = 20; 390 + num_ls_threads = 20; 391 + num_ps_stack_entries = 42; 392 + num_vs_stack_entries = 42; 393 + num_gs_stack_entries = 42; 394 + num_es_stack_entries = 42; 395 + num_hs_stack_entries = 42; 396 + num_ls_stack_entries = 42; 397 + break; 398 + case CHIP_CAICOS: 399 + num_ps_gprs = 93; 400 + num_vs_gprs = 46; 401 + num_temp_gprs = 4; 402 + num_gs_gprs = 31; 403 + num_es_gprs = 31; 404 + num_hs_gprs = 23; 405 + num_ls_gprs = 23; 406 + num_ps_threads = 128; 407 + num_vs_threads = 10; 408 + num_gs_threads = 10; 409 + num_es_threads = 10; 410 + num_hs_threads = 10; 411 + num_ls_threads = 10; 412 + num_ps_stack_entries = 42; 413 + num_vs_stack_entries = 42; 414 + num_gs_stack_entries = 42; 415 + num_es_stack_entries = 42; 416 + num_hs_stack_entries = 42; 417 + num_ls_stack_entries = 42; 418 + break; 357 419 } 358 420 359 421 if ((rdev->family == CHIP_CEDAR) || 360 - (rdev->family == CHIP_PALM)) 422 + (rdev->family == CHIP_PALM) || 423 + (rdev->family == CHIP_CAICOS)) 361 424 sq_config = 0; 362 425 else 363 426 sq_config = VC_ENABLE;
+41 -3
drivers/gpu/drm/radeon/evergreend.h
··· 581 581 # define DC_HPDx_RX_INT_TIMER(x) ((x) << 16) 582 582 # define DC_HPDx_EN (1 << 28) 583 583 584 + /* PCIE link stuff */ 585 + #define PCIE_LC_TRAINING_CNTL 0xa1 /* PCIE_P */ 586 + #define PCIE_LC_LINK_WIDTH_CNTL 0xa2 /* PCIE_P */ 587 + # define LC_LINK_WIDTH_SHIFT 0 588 + # define LC_LINK_WIDTH_MASK 0x7 589 + # define LC_LINK_WIDTH_X0 0 590 + # define LC_LINK_WIDTH_X1 1 591 + # define LC_LINK_WIDTH_X2 2 592 + # define LC_LINK_WIDTH_X4 3 593 + # define LC_LINK_WIDTH_X8 4 594 + # define LC_LINK_WIDTH_X16 6 595 + # define LC_LINK_WIDTH_RD_SHIFT 4 596 + # define LC_LINK_WIDTH_RD_MASK 0x70 597 + # define LC_RECONFIG_ARC_MISSING_ESCAPE (1 << 7) 598 + # define LC_RECONFIG_NOW (1 << 8) 599 + # define LC_RENEGOTIATION_SUPPORT (1 << 9) 600 + # define LC_RENEGOTIATE_EN (1 << 10) 601 + # define LC_SHORT_RECONFIG_EN (1 << 11) 602 + # define LC_UPCONFIGURE_SUPPORT (1 << 12) 603 + # define LC_UPCONFIGURE_DIS (1 << 13) 604 + #define PCIE_LC_SPEED_CNTL 0xa4 /* PCIE_P */ 605 + # define LC_GEN2_EN_STRAP (1 << 0) 606 + # define LC_TARGET_LINK_SPEED_OVERRIDE_EN (1 << 1) 607 + # define LC_FORCE_EN_HW_SPEED_CHANGE (1 << 5) 608 + # define LC_FORCE_DIS_HW_SPEED_CHANGE (1 << 6) 609 + # define LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_MASK (0x3 << 8) 610 + # define LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_SHIFT 3 611 + # define LC_CURRENT_DATA_RATE (1 << 11) 612 + # define LC_VOLTAGE_TIMER_SEL_MASK (0xf << 14) 613 + # define LC_CLR_FAILED_SPD_CHANGE_CNT (1 << 21) 614 + # define LC_OTHER_SIDE_EVER_SENT_GEN2 (1 << 23) 615 + # define LC_OTHER_SIDE_SUPPORTS_GEN2 (1 << 24) 616 + #define MM_CFGREGS_CNTL 0x544c 617 + # define MM_WR_TO_CFG_EN (1 << 3) 618 + #define LINK_CNTL2 0x88 /* F0 */ 619 + # define TARGET_LINK_SPEED_MASK (0xf << 0) 620 + # define SELECTABLE_DEEMPHASIS (1 << 6) 621 + 584 622 /* 585 623 * PM4 586 624 */ ··· 648 610 #define PACKET3_NOP 0x10 649 611 #define PACKET3_SET_BASE 0x11 650 612 #define PACKET3_CLEAR_STATE 0x12 651 - #define PACKET3_INDIRECT_BUFFER_SIZE 0x13 613 + #define PACKET3_INDEX_BUFFER_SIZE 0x13 652 614 #define PACKET3_DISPATCH_DIRECT 0x15 653 615 #define PACKET3_DISPATCH_INDIRECT 0x16 654 616 #define PACKET3_INDIRECT_BUFFER_END 0x17 ··· 689 651 # define PACKET3_CB8_DEST_BASE_ENA (1 << 15) 690 652 # define PACKET3_CB9_DEST_BASE_ENA (1 << 16) 691 653 # define PACKET3_CB10_DEST_BASE_ENA (1 << 17) 692 - # define PACKET3_CB11_DEST_BASE_ENA (1 << 17) 654 + # define PACKET3_CB11_DEST_BASE_ENA (1 << 18) 693 655 # define PACKET3_FULL_CACHE_ENA (1 << 20) 694 656 # define PACKET3_TC_ACTION_ENA (1 << 23) 695 657 # define PACKET3_VC_ACTION_ENA (1 << 24) 696 658 # define PACKET3_CB_ACTION_ENA (1 << 25) 697 659 # define PACKET3_DB_ACTION_ENA (1 << 26) 698 660 # define PACKET3_SH_ACTION_ENA (1 << 27) 699 - # define PACKET3_SMX_ACTION_ENA (1 << 28) 661 + # define PACKET3_SX_ACTION_ENA (1 << 28) 700 662 #define PACKET3_ME_INITIALIZE 0x44 701 663 #define PACKET3_ME_INITIALIZE_DEVICE_ID(x) ((x) << 16) 702 664 #define PACKET3_COND_WRITE 0x45
+316
drivers/gpu/drm/radeon/ni.c
··· 1 + /* 2 + * Copyright 2010 Advanced Micro Devices, Inc. 3 + * 4 + * Permission is hereby granted, free of charge, to any person obtaining a 5 + * copy of this software and associated documentation files (the "Software"), 6 + * to deal in the Software without restriction, including without limitation 7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 + * and/or sell copies of the Software, and to permit persons to whom the 9 + * Software is furnished to do so, subject to the following conditions: 10 + * 11 + * The above copyright notice and this permission notice shall be included in 12 + * all copies or substantial portions of the Software. 13 + * 14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 + * OTHER DEALINGS IN THE SOFTWARE. 21 + * 22 + * Authors: Alex Deucher 23 + */ 24 + #include <linux/firmware.h> 25 + #include <linux/platform_device.h> 26 + #include <linux/slab.h> 27 + #include "drmP.h" 28 + #include "radeon.h" 29 + #include "radeon_asic.h" 30 + #include "radeon_drm.h" 31 + #include "nid.h" 32 + #include "atom.h" 33 + #include "ni_reg.h" 34 + 35 + #define EVERGREEN_PFP_UCODE_SIZE 1120 36 + #define EVERGREEN_PM4_UCODE_SIZE 1376 37 + #define EVERGREEN_RLC_UCODE_SIZE 768 38 + #define BTC_MC_UCODE_SIZE 6024 39 + 40 + /* Firmware Names */ 41 + MODULE_FIRMWARE("radeon/BARTS_pfp.bin"); 42 + MODULE_FIRMWARE("radeon/BARTS_me.bin"); 43 + MODULE_FIRMWARE("radeon/BARTS_mc.bin"); 44 + MODULE_FIRMWARE("radeon/BTC_rlc.bin"); 45 + MODULE_FIRMWARE("radeon/TURKS_pfp.bin"); 46 + MODULE_FIRMWARE("radeon/TURKS_me.bin"); 47 + MODULE_FIRMWARE("radeon/TURKS_mc.bin"); 48 + MODULE_FIRMWARE("radeon/CAICOS_pfp.bin"); 49 + MODULE_FIRMWARE("radeon/CAICOS_me.bin"); 50 + MODULE_FIRMWARE("radeon/CAICOS_mc.bin"); 51 + 52 + #define BTC_IO_MC_REGS_SIZE 29 53 + 54 + static const u32 barts_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = { 55 + {0x00000077, 0xff010100}, 56 + {0x00000078, 0x00000000}, 57 + {0x00000079, 0x00001434}, 58 + {0x0000007a, 0xcc08ec08}, 59 + {0x0000007b, 0x00040000}, 60 + {0x0000007c, 0x000080c0}, 61 + {0x0000007d, 0x09000000}, 62 + {0x0000007e, 0x00210404}, 63 + {0x00000081, 0x08a8e800}, 64 + {0x00000082, 0x00030444}, 65 + {0x00000083, 0x00000000}, 66 + {0x00000085, 0x00000001}, 67 + {0x00000086, 0x00000002}, 68 + {0x00000087, 0x48490000}, 69 + {0x00000088, 0x20244647}, 70 + {0x00000089, 0x00000005}, 71 + {0x0000008b, 0x66030000}, 72 + {0x0000008c, 0x00006603}, 73 + {0x0000008d, 0x00000100}, 74 + {0x0000008f, 0x00001c0a}, 75 + {0x00000090, 0xff000001}, 76 + {0x00000094, 0x00101101}, 77 + {0x00000095, 0x00000fff}, 78 + {0x00000096, 0x00116fff}, 79 + {0x00000097, 0x60010000}, 80 + {0x00000098, 0x10010000}, 81 + {0x00000099, 0x00006000}, 82 + {0x0000009a, 0x00001000}, 83 + {0x0000009f, 0x00946a00} 84 + }; 85 + 86 + static const u32 turks_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = { 87 + {0x00000077, 0xff010100}, 88 + {0x00000078, 0x00000000}, 89 + {0x00000079, 0x00001434}, 90 + {0x0000007a, 0xcc08ec08}, 91 + {0x0000007b, 0x00040000}, 92 + {0x0000007c, 0x000080c0}, 93 + {0x0000007d, 0x09000000}, 94 + {0x0000007e, 0x00210404}, 95 + {0x00000081, 0x08a8e800}, 96 + {0x00000082, 0x00030444}, 97 + {0x00000083, 0x00000000}, 98 + {0x00000085, 0x00000001}, 99 + {0x00000086, 0x00000002}, 100 + {0x00000087, 0x48490000}, 101 + {0x00000088, 0x20244647}, 102 + {0x00000089, 0x00000005}, 103 + {0x0000008b, 0x66030000}, 104 + {0x0000008c, 0x00006603}, 105 + {0x0000008d, 0x00000100}, 106 + {0x0000008f, 0x00001c0a}, 107 + {0x00000090, 0xff000001}, 108 + {0x00000094, 0x00101101}, 109 + {0x00000095, 0x00000fff}, 110 + {0x00000096, 0x00116fff}, 111 + {0x00000097, 0x60010000}, 112 + {0x00000098, 0x10010000}, 113 + {0x00000099, 0x00006000}, 114 + {0x0000009a, 0x00001000}, 115 + {0x0000009f, 0x00936a00} 116 + }; 117 + 118 + static const u32 caicos_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = { 119 + {0x00000077, 0xff010100}, 120 + {0x00000078, 0x00000000}, 121 + {0x00000079, 0x00001434}, 122 + {0x0000007a, 0xcc08ec08}, 123 + {0x0000007b, 0x00040000}, 124 + {0x0000007c, 0x000080c0}, 125 + {0x0000007d, 0x09000000}, 126 + {0x0000007e, 0x00210404}, 127 + {0x00000081, 0x08a8e800}, 128 + {0x00000082, 0x00030444}, 129 + {0x00000083, 0x00000000}, 130 + {0x00000085, 0x00000001}, 131 + {0x00000086, 0x00000002}, 132 + {0x00000087, 0x48490000}, 133 + {0x00000088, 0x20244647}, 134 + {0x00000089, 0x00000005}, 135 + {0x0000008b, 0x66030000}, 136 + {0x0000008c, 0x00006603}, 137 + {0x0000008d, 0x00000100}, 138 + {0x0000008f, 0x00001c0a}, 139 + {0x00000090, 0xff000001}, 140 + {0x00000094, 0x00101101}, 141 + {0x00000095, 0x00000fff}, 142 + {0x00000096, 0x00116fff}, 143 + {0x00000097, 0x60010000}, 144 + {0x00000098, 0x10010000}, 145 + {0x00000099, 0x00006000}, 146 + {0x0000009a, 0x00001000}, 147 + {0x0000009f, 0x00916a00} 148 + }; 149 + 150 + int btc_mc_load_microcode(struct radeon_device *rdev) 151 + { 152 + const __be32 *fw_data; 153 + u32 mem_type, running, blackout = 0; 154 + u32 *io_mc_regs; 155 + int i; 156 + 157 + if (!rdev->mc_fw) 158 + return -EINVAL; 159 + 160 + switch (rdev->family) { 161 + case CHIP_BARTS: 162 + io_mc_regs = (u32 *)&barts_io_mc_regs; 163 + break; 164 + case CHIP_TURKS: 165 + io_mc_regs = (u32 *)&turks_io_mc_regs; 166 + break; 167 + case CHIP_CAICOS: 168 + default: 169 + io_mc_regs = (u32 *)&caicos_io_mc_regs; 170 + break; 171 + } 172 + 173 + mem_type = (RREG32(MC_SEQ_MISC0) & MC_SEQ_MISC0_GDDR5_MASK) >> MC_SEQ_MISC0_GDDR5_SHIFT; 174 + running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK; 175 + 176 + if ((mem_type == MC_SEQ_MISC0_GDDR5_VALUE) && (running == 0)) { 177 + if (running) { 178 + blackout = RREG32(MC_SHARED_BLACKOUT_CNTL); 179 + WREG32(MC_SHARED_BLACKOUT_CNTL, 1); 180 + } 181 + 182 + /* reset the engine and set to writable */ 183 + WREG32(MC_SEQ_SUP_CNTL, 0x00000008); 184 + WREG32(MC_SEQ_SUP_CNTL, 0x00000010); 185 + 186 + /* load mc io regs */ 187 + for (i = 0; i < BTC_IO_MC_REGS_SIZE; i++) { 188 + WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]); 189 + WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]); 190 + } 191 + /* load the MC ucode */ 192 + fw_data = (const __be32 *)rdev->mc_fw->data; 193 + for (i = 0; i < BTC_MC_UCODE_SIZE; i++) 194 + WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++)); 195 + 196 + /* put the engine back into the active state */ 197 + WREG32(MC_SEQ_SUP_CNTL, 0x00000008); 198 + WREG32(MC_SEQ_SUP_CNTL, 0x00000004); 199 + WREG32(MC_SEQ_SUP_CNTL, 0x00000001); 200 + 201 + /* wait for training to complete */ 202 + while (!(RREG32(MC_IO_PAD_CNTL_D0) & MEM_FALL_OUT_CMD)) 203 + udelay(10); 204 + 205 + if (running) 206 + WREG32(MC_SHARED_BLACKOUT_CNTL, blackout); 207 + } 208 + 209 + return 0; 210 + } 211 + 212 + int ni_init_microcode(struct radeon_device *rdev) 213 + { 214 + struct platform_device *pdev; 215 + const char *chip_name; 216 + const char *rlc_chip_name; 217 + size_t pfp_req_size, me_req_size, rlc_req_size, mc_req_size; 218 + char fw_name[30]; 219 + int err; 220 + 221 + DRM_DEBUG("\n"); 222 + 223 + pdev = platform_device_register_simple("radeon_cp", 0, NULL, 0); 224 + err = IS_ERR(pdev); 225 + if (err) { 226 + printk(KERN_ERR "radeon_cp: Failed to register firmware\n"); 227 + return -EINVAL; 228 + } 229 + 230 + switch (rdev->family) { 231 + case CHIP_BARTS: 232 + chip_name = "BARTS"; 233 + rlc_chip_name = "BTC"; 234 + break; 235 + case CHIP_TURKS: 236 + chip_name = "TURKS"; 237 + rlc_chip_name = "BTC"; 238 + break; 239 + case CHIP_CAICOS: 240 + chip_name = "CAICOS"; 241 + rlc_chip_name = "BTC"; 242 + break; 243 + default: BUG(); 244 + } 245 + 246 + pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4; 247 + me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4; 248 + rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4; 249 + mc_req_size = BTC_MC_UCODE_SIZE * 4; 250 + 251 + DRM_INFO("Loading %s Microcode\n", chip_name); 252 + 253 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name); 254 + err = request_firmware(&rdev->pfp_fw, fw_name, &pdev->dev); 255 + if (err) 256 + goto out; 257 + if (rdev->pfp_fw->size != pfp_req_size) { 258 + printk(KERN_ERR 259 + "ni_cp: Bogus length %zu in firmware \"%s\"\n", 260 + rdev->pfp_fw->size, fw_name); 261 + err = -EINVAL; 262 + goto out; 263 + } 264 + 265 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name); 266 + err = request_firmware(&rdev->me_fw, fw_name, &pdev->dev); 267 + if (err) 268 + goto out; 269 + if (rdev->me_fw->size != me_req_size) { 270 + printk(KERN_ERR 271 + "ni_cp: Bogus length %zu in firmware \"%s\"\n", 272 + rdev->me_fw->size, fw_name); 273 + err = -EINVAL; 274 + } 275 + 276 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name); 277 + err = request_firmware(&rdev->rlc_fw, fw_name, &pdev->dev); 278 + if (err) 279 + goto out; 280 + if (rdev->rlc_fw->size != rlc_req_size) { 281 + printk(KERN_ERR 282 + "ni_rlc: Bogus length %zu in firmware \"%s\"\n", 283 + rdev->rlc_fw->size, fw_name); 284 + err = -EINVAL; 285 + } 286 + 287 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); 288 + err = request_firmware(&rdev->mc_fw, fw_name, &pdev->dev); 289 + if (err) 290 + goto out; 291 + if (rdev->mc_fw->size != mc_req_size) { 292 + printk(KERN_ERR 293 + "ni_mc: Bogus length %zu in firmware \"%s\"\n", 294 + rdev->mc_fw->size, fw_name); 295 + err = -EINVAL; 296 + } 297 + out: 298 + platform_device_unregister(pdev); 299 + 300 + if (err) { 301 + if (err != -EINVAL) 302 + printk(KERN_ERR 303 + "ni_cp: Failed to load firmware \"%s\"\n", 304 + fw_name); 305 + release_firmware(rdev->pfp_fw); 306 + rdev->pfp_fw = NULL; 307 + release_firmware(rdev->me_fw); 308 + rdev->me_fw = NULL; 309 + release_firmware(rdev->rlc_fw); 310 + rdev->rlc_fw = NULL; 311 + release_firmware(rdev->mc_fw); 312 + rdev->mc_fw = NULL; 313 + } 314 + return err; 315 + } 316 +
+86
drivers/gpu/drm/radeon/ni_reg.h
··· 1 + /* 2 + * Copyright 2010 Advanced Micro Devices, Inc. 3 + * 4 + * Permission is hereby granted, free of charge, to any person obtaining a 5 + * copy of this software and associated documentation files (the "Software"), 6 + * to deal in the Software without restriction, including without limitation 7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 + * and/or sell copies of the Software, and to permit persons to whom the 9 + * Software is furnished to do so, subject to the following conditions: 10 + * 11 + * The above copyright notice and this permission notice shall be included in 12 + * all copies or substantial portions of the Software. 13 + * 14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 + * OTHER DEALINGS IN THE SOFTWARE. 21 + * 22 + * Authors: Alex Deucher 23 + */ 24 + #ifndef __NI_REG_H__ 25 + #define __NI_REG_H__ 26 + 27 + /* northern islands - DCE5 */ 28 + 29 + #define NI_INPUT_GAMMA_CONTROL 0x6840 30 + # define NI_GRPH_INPUT_GAMMA_MODE(x) (((x) & 0x3) << 0) 31 + # define NI_INPUT_GAMMA_USE_LUT 0 32 + # define NI_INPUT_GAMMA_BYPASS 1 33 + # define NI_INPUT_GAMMA_SRGB_24 2 34 + # define NI_INPUT_GAMMA_XVYCC_222 3 35 + # define NI_OVL_INPUT_GAMMA_MODE(x) (((x) & 0x3) << 4) 36 + 37 + #define NI_PRESCALE_GRPH_CONTROL 0x68b4 38 + # define NI_GRPH_PRESCALE_BYPASS (1 << 4) 39 + 40 + #define NI_PRESCALE_OVL_CONTROL 0x68c4 41 + # define NI_OVL_PRESCALE_BYPASS (1 << 4) 42 + 43 + #define NI_INPUT_CSC_CONTROL 0x68d4 44 + # define NI_INPUT_CSC_GRPH_MODE(x) (((x) & 0x3) << 0) 45 + # define NI_INPUT_CSC_BYPASS 0 46 + # define NI_INPUT_CSC_PROG_COEFF 1 47 + # define NI_INPUT_CSC_PROG_SHARED_MATRIXA 2 48 + # define NI_INPUT_CSC_OVL_MODE(x) (((x) & 0x3) << 4) 49 + 50 + #define NI_OUTPUT_CSC_CONTROL 0x68f0 51 + # define NI_OUTPUT_CSC_GRPH_MODE(x) (((x) & 0x7) << 0) 52 + # define NI_OUTPUT_CSC_BYPASS 0 53 + # define NI_OUTPUT_CSC_TV_RGB 1 54 + # define NI_OUTPUT_CSC_YCBCR_601 2 55 + # define NI_OUTPUT_CSC_YCBCR_709 3 56 + # define NI_OUTPUT_CSC_PROG_COEFF 4 57 + # define NI_OUTPUT_CSC_PROG_SHARED_MATRIXB 5 58 + # define NI_OUTPUT_CSC_OVL_MODE(x) (((x) & 0x7) << 4) 59 + 60 + #define NI_DEGAMMA_CONTROL 0x6960 61 + # define NI_GRPH_DEGAMMA_MODE(x) (((x) & 0x3) << 0) 62 + # define NI_DEGAMMA_BYPASS 0 63 + # define NI_DEGAMMA_SRGB_24 1 64 + # define NI_DEGAMMA_XVYCC_222 2 65 + # define NI_OVL_DEGAMMA_MODE(x) (((x) & 0x3) << 4) 66 + # define NI_ICON_DEGAMMA_MODE(x) (((x) & 0x3) << 8) 67 + # define NI_CURSOR_DEGAMMA_MODE(x) (((x) & 0x3) << 12) 68 + 69 + #define NI_GAMUT_REMAP_CONTROL 0x6964 70 + # define NI_GRPH_GAMUT_REMAP_MODE(x) (((x) & 0x3) << 0) 71 + # define NI_GAMUT_REMAP_BYPASS 0 72 + # define NI_GAMUT_REMAP_PROG_COEFF 1 73 + # define NI_GAMUT_REMAP_PROG_SHARED_MATRIXA 2 74 + # define NI_GAMUT_REMAP_PROG_SHARED_MATRIXB 3 75 + # define NI_OVL_GAMUT_REMAP_MODE(x) (((x) & 0x3) << 4) 76 + 77 + #define NI_REGAMMA_CONTROL 0x6a80 78 + # define NI_GRPH_REGAMMA_MODE(x) (((x) & 0x7) << 0) 79 + # define NI_REGAMMA_BYPASS 0 80 + # define NI_REGAMMA_SRGB_24 1 81 + # define NI_REGAMMA_XVYCC_222 2 82 + # define NI_REGAMMA_PROG_A 3 83 + # define NI_REGAMMA_PROG_B 4 84 + # define NI_OVL_REGAMMA_MODE(x) (((x) & 0x7) << 4) 85 + 86 + #endif
+41
drivers/gpu/drm/radeon/nid.h
··· 1 + /* 2 + * Copyright 2010 Advanced Micro Devices, Inc. 3 + * 4 + * Permission is hereby granted, free of charge, to any person obtaining a 5 + * copy of this software and associated documentation files (the "Software"), 6 + * to deal in the Software without restriction, including without limitation 7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 + * and/or sell copies of the Software, and to permit persons to whom the 9 + * Software is furnished to do so, subject to the following conditions: 10 + * 11 + * The above copyright notice and this permission notice shall be included in 12 + * all copies or substantial portions of the Software. 13 + * 14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 + * OTHER DEALINGS IN THE SOFTWARE. 21 + * 22 + * Authors: Alex Deucher 23 + */ 24 + #ifndef NI_H 25 + #define NI_H 26 + 27 + #define MC_SHARED_BLACKOUT_CNTL 0x20ac 28 + #define MC_SEQ_SUP_CNTL 0x28c8 29 + #define RUN_MASK (1 << 0) 30 + #define MC_SEQ_SUP_PGM 0x28cc 31 + #define MC_IO_PAD_CNTL_D0 0x29d0 32 + #define MEM_FALL_OUT_CMD (1 << 8) 33 + #define MC_SEQ_MISC0 0x2a00 34 + #define MC_SEQ_MISC0_GDDR5_SHIFT 28 35 + #define MC_SEQ_MISC0_GDDR5_MASK 0xf0000000 36 + #define MC_SEQ_MISC0_GDDR5_VALUE 5 37 + #define MC_SEQ_IO_DEBUG_INDEX 0x2a44 38 + #define MC_SEQ_IO_DEBUG_DATA 0x2a48 39 + 40 + #endif 41 +
+1 -4
drivers/gpu/drm/radeon/r300.c
··· 558 558 559 559 /* FIXME wait for idle */ 560 560 561 - if (rdev->family < CHIP_R600) 562 - link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL); 563 - else 564 - link_width_cntl = RREG32_PCIE_P(RADEON_PCIE_LC_LINK_WIDTH_CNTL); 561 + link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL); 565 562 566 563 switch ((link_width_cntl & RADEON_PCIE_LC_LINK_WIDTH_RD_MASK) >> RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT) { 567 564 case RADEON_PCIE_LC_LINK_WIDTH_X0:
+220
drivers/gpu/drm/radeon/r600.c
··· 94 94 void r600_gpu_init(struct radeon_device *rdev); 95 95 void r600_fini(struct radeon_device *rdev); 96 96 void r600_irq_disable(struct radeon_device *rdev); 97 + static void r600_pcie_gen2_enable(struct radeon_device *rdev); 97 98 98 99 /* get temperature in millidegrees */ 99 100 u32 rv6xx_get_temp(struct radeon_device *rdev) ··· 2380 2379 { 2381 2380 int r; 2382 2381 2382 + /* enable pcie gen2 link */ 2383 + r600_pcie_gen2_enable(rdev); 2384 + 2383 2385 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { 2384 2386 r = r600_init_microcode(rdev); 2385 2387 if (r) { ··· 3534 3530 tmp = readl((void __iomem *)ptr); 3535 3531 } else 3536 3532 WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); 3533 + } 3534 + 3535 + void r600_set_pcie_lanes(struct radeon_device *rdev, int lanes) 3536 + { 3537 + u32 link_width_cntl, mask, target_reg; 3538 + 3539 + if (rdev->flags & RADEON_IS_IGP) 3540 + return; 3541 + 3542 + if (!(rdev->flags & RADEON_IS_PCIE)) 3543 + return; 3544 + 3545 + /* x2 cards have a special sequence */ 3546 + if (ASIC_IS_X2(rdev)) 3547 + return; 3548 + 3549 + /* FIXME wait for idle */ 3550 + 3551 + switch (lanes) { 3552 + case 0: 3553 + mask = RADEON_PCIE_LC_LINK_WIDTH_X0; 3554 + break; 3555 + case 1: 3556 + mask = RADEON_PCIE_LC_LINK_WIDTH_X1; 3557 + break; 3558 + case 2: 3559 + mask = RADEON_PCIE_LC_LINK_WIDTH_X2; 3560 + break; 3561 + case 4: 3562 + mask = RADEON_PCIE_LC_LINK_WIDTH_X4; 3563 + break; 3564 + case 8: 3565 + mask = RADEON_PCIE_LC_LINK_WIDTH_X8; 3566 + break; 3567 + case 12: 3568 + mask = RADEON_PCIE_LC_LINK_WIDTH_X12; 3569 + break; 3570 + case 16: 3571 + default: 3572 + mask = RADEON_PCIE_LC_LINK_WIDTH_X16; 3573 + break; 3574 + } 3575 + 3576 + link_width_cntl = RREG32_PCIE_P(RADEON_PCIE_LC_LINK_WIDTH_CNTL); 3577 + 3578 + if ((link_width_cntl & RADEON_PCIE_LC_LINK_WIDTH_RD_MASK) == 3579 + (mask << RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT)) 3580 + return; 3581 + 3582 + if (link_width_cntl & R600_PCIE_LC_UPCONFIGURE_DIS) 3583 + return; 3584 + 3585 + link_width_cntl &= ~(RADEON_PCIE_LC_LINK_WIDTH_MASK | 3586 + RADEON_PCIE_LC_RECONFIG_NOW | 3587 + R600_PCIE_LC_RENEGOTIATE_EN | 3588 + R600_PCIE_LC_RECONFIG_ARC_MISSING_ESCAPE); 3589 + link_width_cntl |= mask; 3590 + 3591 + WREG32_PCIE_P(RADEON_PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 3592 + 3593 + /* some northbridges can renegotiate the link rather than requiring 3594 + * a complete re-config. 3595 + * e.g., AMD 780/790 northbridges (pci ids: 0x5956, 0x5957, 0x5958, etc.) 3596 + */ 3597 + if (link_width_cntl & R600_PCIE_LC_RENEGOTIATION_SUPPORT) 3598 + link_width_cntl |= R600_PCIE_LC_RENEGOTIATE_EN | R600_PCIE_LC_UPCONFIGURE_SUPPORT; 3599 + else 3600 + link_width_cntl |= R600_PCIE_LC_RECONFIG_ARC_MISSING_ESCAPE; 3601 + 3602 + WREG32_PCIE_P(RADEON_PCIE_LC_LINK_WIDTH_CNTL, (link_width_cntl | 3603 + RADEON_PCIE_LC_RECONFIG_NOW)); 3604 + 3605 + if (rdev->family >= CHIP_RV770) 3606 + target_reg = R700_TARGET_AND_CURRENT_PROFILE_INDEX; 3607 + else 3608 + target_reg = R600_TARGET_AND_CURRENT_PROFILE_INDEX; 3609 + 3610 + /* wait for lane set to complete */ 3611 + link_width_cntl = RREG32(target_reg); 3612 + while (link_width_cntl == 0xffffffff) 3613 + link_width_cntl = RREG32(target_reg); 3614 + 3615 + } 3616 + 3617 + int r600_get_pcie_lanes(struct radeon_device *rdev) 3618 + { 3619 + u32 link_width_cntl; 3620 + 3621 + if (rdev->flags & RADEON_IS_IGP) 3622 + return 0; 3623 + 3624 + if (!(rdev->flags & RADEON_IS_PCIE)) 3625 + return 0; 3626 + 3627 + /* x2 cards have a special sequence */ 3628 + if (ASIC_IS_X2(rdev)) 3629 + return 0; 3630 + 3631 + /* FIXME wait for idle */ 3632 + 3633 + link_width_cntl = RREG32_PCIE_P(RADEON_PCIE_LC_LINK_WIDTH_CNTL); 3634 + 3635 + switch ((link_width_cntl & RADEON_PCIE_LC_LINK_WIDTH_RD_MASK) >> RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT) { 3636 + case RADEON_PCIE_LC_LINK_WIDTH_X0: 3637 + return 0; 3638 + case RADEON_PCIE_LC_LINK_WIDTH_X1: 3639 + return 1; 3640 + case RADEON_PCIE_LC_LINK_WIDTH_X2: 3641 + return 2; 3642 + case RADEON_PCIE_LC_LINK_WIDTH_X4: 3643 + return 4; 3644 + case RADEON_PCIE_LC_LINK_WIDTH_X8: 3645 + return 8; 3646 + case RADEON_PCIE_LC_LINK_WIDTH_X16: 3647 + default: 3648 + return 16; 3649 + } 3650 + } 3651 + 3652 + static void r600_pcie_gen2_enable(struct radeon_device *rdev) 3653 + { 3654 + u32 link_width_cntl, lanes, speed_cntl, training_cntl, tmp; 3655 + u16 link_cntl2; 3656 + 3657 + if (rdev->flags & RADEON_IS_IGP) 3658 + return; 3659 + 3660 + if (!(rdev->flags & RADEON_IS_PCIE)) 3661 + return; 3662 + 3663 + /* x2 cards have a special sequence */ 3664 + if (ASIC_IS_X2(rdev)) 3665 + return; 3666 + 3667 + /* only RV6xx+ chips are supported */ 3668 + if (rdev->family <= CHIP_R600) 3669 + return; 3670 + 3671 + /* 55 nm r6xx asics */ 3672 + if ((rdev->family == CHIP_RV670) || 3673 + (rdev->family == CHIP_RV620) || 3674 + (rdev->family == CHIP_RV635)) { 3675 + /* advertise upconfig capability */ 3676 + link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL); 3677 + link_width_cntl &= ~LC_UPCONFIGURE_DIS; 3678 + WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 3679 + link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL); 3680 + if (link_width_cntl & LC_RENEGOTIATION_SUPPORT) { 3681 + lanes = (link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT; 3682 + link_width_cntl &= ~(LC_LINK_WIDTH_MASK | 3683 + LC_RECONFIG_ARC_MISSING_ESCAPE); 3684 + link_width_cntl |= lanes | LC_RECONFIG_NOW | LC_RENEGOTIATE_EN; 3685 + WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 3686 + } else { 3687 + link_width_cntl |= LC_UPCONFIGURE_DIS; 3688 + WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 3689 + } 3690 + } 3691 + 3692 + speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL); 3693 + if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) && 3694 + (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) { 3695 + 3696 + /* 55 nm r6xx asics */ 3697 + if ((rdev->family == CHIP_RV670) || 3698 + (rdev->family == CHIP_RV620) || 3699 + (rdev->family == CHIP_RV635)) { 3700 + WREG32(MM_CFGREGS_CNTL, 0x8); 3701 + link_cntl2 = RREG32(0x4088); 3702 + WREG32(MM_CFGREGS_CNTL, 0); 3703 + /* not supported yet */ 3704 + if (link_cntl2 & SELECTABLE_DEEMPHASIS) 3705 + return; 3706 + } 3707 + 3708 + speed_cntl &= ~LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_MASK; 3709 + speed_cntl |= (0x3 << LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_SHIFT); 3710 + speed_cntl &= ~LC_VOLTAGE_TIMER_SEL_MASK; 3711 + speed_cntl &= ~LC_FORCE_DIS_HW_SPEED_CHANGE; 3712 + speed_cntl |= LC_FORCE_EN_HW_SPEED_CHANGE; 3713 + WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl); 3714 + 3715 + tmp = RREG32(0x541c); 3716 + WREG32(0x541c, tmp | 0x8); 3717 + WREG32(MM_CFGREGS_CNTL, MM_WR_TO_CFG_EN); 3718 + link_cntl2 = RREG16(0x4088); 3719 + link_cntl2 &= ~TARGET_LINK_SPEED_MASK; 3720 + link_cntl2 |= 0x2; 3721 + WREG16(0x4088, link_cntl2); 3722 + WREG32(MM_CFGREGS_CNTL, 0); 3723 + 3724 + if ((rdev->family == CHIP_RV670) || 3725 + (rdev->family == CHIP_RV620) || 3726 + (rdev->family == CHIP_RV635)) { 3727 + training_cntl = RREG32_PCIE_P(PCIE_LC_TRAINING_CNTL); 3728 + training_cntl &= ~LC_POINT_7_PLUS_EN; 3729 + WREG32_PCIE_P(PCIE_LC_TRAINING_CNTL, training_cntl); 3730 + } else { 3731 + speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL); 3732 + speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN; 3733 + WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl); 3734 + } 3735 + 3736 + speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL); 3737 + speed_cntl |= LC_GEN2_EN_STRAP; 3738 + WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl); 3739 + 3740 + } else { 3741 + link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL); 3742 + /* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */ 3743 + if (1) 3744 + link_width_cntl |= LC_UPCONFIGURE_DIS; 3745 + else 3746 + link_width_cntl &= ~LC_UPCONFIGURE_DIS; 3747 + WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 3748 + } 3537 3749 }
+39
drivers/gpu/drm/radeon/r600d.h
··· 737 737 # define DxGRPH_PFLIP_INT_MASK (1 << 0) 738 738 # define DxGRPH_PFLIP_INT_TYPE (1 << 8) 739 739 740 + /* PCIE link stuff */ 741 + #define PCIE_LC_TRAINING_CNTL 0xa1 /* PCIE_P */ 742 + # define LC_POINT_7_PLUS_EN (1 << 6) 743 + #define PCIE_LC_LINK_WIDTH_CNTL 0xa2 /* PCIE_P */ 744 + # define LC_LINK_WIDTH_SHIFT 0 745 + # define LC_LINK_WIDTH_MASK 0x7 746 + # define LC_LINK_WIDTH_X0 0 747 + # define LC_LINK_WIDTH_X1 1 748 + # define LC_LINK_WIDTH_X2 2 749 + # define LC_LINK_WIDTH_X4 3 750 + # define LC_LINK_WIDTH_X8 4 751 + # define LC_LINK_WIDTH_X16 6 752 + # define LC_LINK_WIDTH_RD_SHIFT 4 753 + # define LC_LINK_WIDTH_RD_MASK 0x70 754 + # define LC_RECONFIG_ARC_MISSING_ESCAPE (1 << 7) 755 + # define LC_RECONFIG_NOW (1 << 8) 756 + # define LC_RENEGOTIATION_SUPPORT (1 << 9) 757 + # define LC_RENEGOTIATE_EN (1 << 10) 758 + # define LC_SHORT_RECONFIG_EN (1 << 11) 759 + # define LC_UPCONFIGURE_SUPPORT (1 << 12) 760 + # define LC_UPCONFIGURE_DIS (1 << 13) 761 + #define PCIE_LC_SPEED_CNTL 0xa4 /* PCIE_P */ 762 + # define LC_GEN2_EN_STRAP (1 << 0) 763 + # define LC_TARGET_LINK_SPEED_OVERRIDE_EN (1 << 1) 764 + # define LC_FORCE_EN_HW_SPEED_CHANGE (1 << 5) 765 + # define LC_FORCE_DIS_HW_SPEED_CHANGE (1 << 6) 766 + # define LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_MASK (0x3 << 8) 767 + # define LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_SHIFT 3 768 + # define LC_CURRENT_DATA_RATE (1 << 11) 769 + # define LC_VOLTAGE_TIMER_SEL_MASK (0xf << 14) 770 + # define LC_CLR_FAILED_SPD_CHANGE_CNT (1 << 21) 771 + # define LC_OTHER_SIDE_EVER_SENT_GEN2 (1 << 23) 772 + # define LC_OTHER_SIDE_SUPPORTS_GEN2 (1 << 24) 773 + #define MM_CFGREGS_CNTL 0x544c 774 + # define MM_WR_TO_CFG_EN (1 << 3) 775 + #define LINK_CNTL2 0x88 /* F0 */ 776 + # define TARGET_LINK_SPEED_MASK (0xf << 0) 777 + # define SELECTABLE_DEEMPHASIS (1 << 6) 778 + 740 779 /* 741 780 * PM4 742 781 */
+21 -60
drivers/gpu/drm/radeon/radeon.h
··· 739 739 THERMAL_TYPE_RV770, 740 740 THERMAL_TYPE_EVERGREEN, 741 741 THERMAL_TYPE_SUMO, 742 + THERMAL_TYPE_NI, 742 743 }; 743 744 744 745 struct radeon_voltage { ··· 823 822 u32 current_sclk; 824 823 u32 current_mclk; 825 824 u32 current_vddc; 825 + u32 default_sclk; 826 + u32 default_mclk; 827 + u32 default_vddc; 826 828 struct radeon_i2c_chan *i2c_bus; 827 829 /* selected pm method */ 828 830 enum radeon_pm_method pm_method; ··· 1152 1148 const struct firmware *me_fw; /* all family ME firmware */ 1153 1149 const struct firmware *pfp_fw; /* r6/700 PFP firmware */ 1154 1150 const struct firmware *rlc_fw; /* r6/700 RLC firmware */ 1151 + const struct firmware *mc_fw; /* NI MC firmware */ 1155 1152 struct r600_blit r600_blit; 1156 1153 struct r700_vram_scratch vram_scratch; 1157 1154 int msi_enabled; /* msi enabled */ ··· 1249 1244 */ 1250 1245 #define RREG8(reg) readb(((void __iomem *)rdev->rmmio) + (reg)) 1251 1246 #define WREG8(reg, v) writeb(v, ((void __iomem *)rdev->rmmio) + (reg)) 1247 + #define RREG16(reg) readw(((void __iomem *)rdev->rmmio) + (reg)) 1248 + #define WREG16(reg, v) writew(v, ((void __iomem *)rdev->rmmio) + (reg)) 1252 1249 #define RREG32(reg) r100_mm_rreg(rdev, (reg)) 1253 1250 #define DREG32(reg) printk(KERN_INFO "REGISTER: " #reg " : 0x%08X\n", r100_mm_rreg(rdev, (reg))) 1254 1251 #define WREG32(reg, v) r100_mm_wreg(rdev, (reg), (v)) ··· 1324 1317 (rdev->family == CHIP_RV410) || \ 1325 1318 (rdev->family == CHIP_RS400) || \ 1326 1319 (rdev->family == CHIP_RS480)) 1320 + #define ASIC_IS_X2(rdev) ((rdev->ddev->pdev->device == 0x9441) || \ 1321 + (rdev->ddev->pdev->device == 0x9443) || \ 1322 + (rdev->ddev->pdev->device == 0x944B) || \ 1323 + (rdev->ddev->pdev->device == 0x9506) || \ 1324 + (rdev->ddev->pdev->device == 0x9509) || \ 1325 + (rdev->ddev->pdev->device == 0x950F) || \ 1326 + (rdev->ddev->pdev->device == 0x689C) || \ 1327 + (rdev->ddev->pdev->device == 0x689D)) 1327 1328 #define ASIC_IS_AVIVO(rdev) ((rdev->family >= CHIP_RS600)) 1328 1329 #define ASIC_IS_DCE2(rdev) ((rdev->family == CHIP_RS600) || \ 1329 1330 (rdev->family == CHIP_RS690) || \ ··· 1340 1325 #define ASIC_IS_DCE3(rdev) ((rdev->family >= CHIP_RV620)) 1341 1326 #define ASIC_IS_DCE32(rdev) ((rdev->family >= CHIP_RV730)) 1342 1327 #define ASIC_IS_DCE4(rdev) ((rdev->family >= CHIP_CEDAR)) 1343 - #define ASIC_IS_DCE41(rdev) ((rdev->family >= CHIP_PALM)) 1328 + #define ASIC_IS_DCE41(rdev) ((rdev->family >= CHIP_PALM) && \ 1329 + (rdev->flags & RADEON_IS_IGP)) 1330 + #define ASIC_IS_DCE5(rdev) ((rdev->family >= CHIP_BARTS)) 1344 1331 1345 1332 /* 1346 1333 * BIOS helpers. ··· 1449 1432 extern int radeon_resume_kms(struct drm_device *dev); 1450 1433 extern int radeon_suspend_kms(struct drm_device *dev, pm_message_t state); 1451 1434 1452 - /* r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 */ 1453 - extern void r100_gpu_lockup_update(struct r100_gpu_lockup *lockup, struct radeon_cp *cp); 1454 - extern bool r100_gpu_cp_is_lockup(struct radeon_device *rdev, struct r100_gpu_lockup *lockup, struct radeon_cp *cp); 1455 - 1456 - /* rv200,rv250,rv280 */ 1457 - extern void r200_set_safe_registers(struct radeon_device *rdev); 1458 - 1459 - /* r300,r350,rv350,rv370,rv380 */ 1460 - extern void r300_set_reg_safe(struct radeon_device *rdev); 1461 - extern void r300_mc_program(struct radeon_device *rdev); 1462 - extern void r300_mc_init(struct radeon_device *rdev); 1463 - extern void r300_clock_startup(struct radeon_device *rdev); 1464 - extern int r300_mc_wait_for_idle(struct radeon_device *rdev); 1465 - extern int rv370_pcie_gart_init(struct radeon_device *rdev); 1466 - extern void rv370_pcie_gart_fini(struct radeon_device *rdev); 1467 - extern int rv370_pcie_gart_enable(struct radeon_device *rdev); 1468 - extern void rv370_pcie_gart_disable(struct radeon_device *rdev); 1469 - 1470 - /* r420,r423,rv410 */ 1471 - extern u32 r420_mc_rreg(struct radeon_device *rdev, u32 reg); 1472 - extern void r420_mc_wreg(struct radeon_device *rdev, u32 reg, u32 v); 1473 - extern int r420_debugfs_pipes_info_init(struct radeon_device *rdev); 1474 - extern void r420_pipes_init(struct radeon_device *rdev); 1475 - 1476 - /* rv515 */ 1477 - struct rv515_mc_save { 1478 - u32 d1vga_control; 1479 - u32 d2vga_control; 1480 - u32 vga_render_control; 1481 - u32 vga_hdp_control; 1482 - u32 d1crtc_control; 1483 - u32 d2crtc_control; 1484 - }; 1485 - extern void rv515_bandwidth_avivo_update(struct radeon_device *rdev); 1486 - extern void rv515_vga_render_disable(struct radeon_device *rdev); 1487 - extern void rv515_set_safe_registers(struct radeon_device *rdev); 1488 - extern void rv515_mc_stop(struct radeon_device *rdev, struct rv515_mc_save *save); 1489 - extern void rv515_mc_resume(struct radeon_device *rdev, struct rv515_mc_save *save); 1490 - extern void rv515_clock_startup(struct radeon_device *rdev); 1491 - extern void rv515_debugfs(struct radeon_device *rdev); 1492 - extern int rv515_suspend(struct radeon_device *rdev); 1493 - 1494 - /* rs400 */ 1495 - extern int rs400_gart_init(struct radeon_device *rdev); 1496 - extern int rs400_gart_enable(struct radeon_device *rdev); 1497 - extern void rs400_gart_adjust_size(struct radeon_device *rdev); 1498 - extern void rs400_gart_disable(struct radeon_device *rdev); 1499 - extern void rs400_gart_fini(struct radeon_device *rdev); 1500 - 1501 - /* rs600 */ 1502 - extern void rs600_set_safe_registers(struct radeon_device *rdev); 1503 - extern int rs600_irq_set(struct radeon_device *rdev); 1504 - extern void rs600_irq_disable(struct radeon_device *rdev); 1505 - 1506 - /* rs690, rs740 */ 1507 - extern void rs690_line_buffer_adjust(struct radeon_device *rdev, 1508 - struct drm_display_mode *mode1, 1509 - struct drm_display_mode *mode2); 1510 - 1511 1435 /* r600, rv610, rv630, rv620, rv635, rv670, rs780, rs880 */ 1512 1436 extern bool r600_card_posted(struct radeon_device *rdev); 1513 1437 extern void r600_cp_stop(struct radeon_device *rdev); ··· 1502 1544 extern int evergreen_irq_set(struct radeon_device *rdev); 1503 1545 extern int evergreen_blit_init(struct radeon_device *rdev); 1504 1546 extern void evergreen_blit_fini(struct radeon_device *rdev); 1547 + 1548 + extern int ni_init_microcode(struct radeon_device *rdev); 1549 + extern int btc_mc_load_microcode(struct radeon_device *rdev); 1505 1550 1506 1551 /* radeon_acpi.c */ 1507 1552 #if defined(CONFIG_ACPI)
+58 -7
drivers/gpu/drm/radeon/radeon_asic.c
··· 94 94 rdev->mc_rreg = &rs600_mc_rreg; 95 95 rdev->mc_wreg = &rs600_mc_wreg; 96 96 } 97 - if ((rdev->family >= CHIP_R600) && (rdev->family <= CHIP_RV740)) { 97 + if ((rdev->family >= CHIP_R600) && (rdev->family <= CHIP_HEMLOCK)) { 98 98 rdev->pciep_rreg = &r600_pciep_rreg; 99 99 rdev->pciep_wreg = &r600_pciep_wreg; 100 100 } ··· 631 631 .set_engine_clock = &radeon_atom_set_engine_clock, 632 632 .get_memory_clock = &radeon_atom_get_memory_clock, 633 633 .set_memory_clock = &radeon_atom_set_memory_clock, 634 - .get_pcie_lanes = &rv370_get_pcie_lanes, 635 - .set_pcie_lanes = NULL, 634 + .get_pcie_lanes = &r600_get_pcie_lanes, 635 + .set_pcie_lanes = &r600_set_pcie_lanes, 636 636 .set_clock_gating = NULL, 637 637 .set_surface_reg = r600_set_surface_reg, 638 638 .clear_surface_reg = r600_clear_surface_reg, ··· 725 725 .set_engine_clock = &radeon_atom_set_engine_clock, 726 726 .get_memory_clock = &radeon_atom_get_memory_clock, 727 727 .set_memory_clock = &radeon_atom_set_memory_clock, 728 - .get_pcie_lanes = &rv370_get_pcie_lanes, 729 - .set_pcie_lanes = NULL, 728 + .get_pcie_lanes = &r600_get_pcie_lanes, 729 + .set_pcie_lanes = &r600_set_pcie_lanes, 730 730 .set_clock_gating = &radeon_atom_set_clock_gating, 731 731 .set_surface_reg = r600_set_surface_reg, 732 732 .clear_surface_reg = r600_clear_surface_reg, ··· 772 772 .set_engine_clock = &radeon_atom_set_engine_clock, 773 773 .get_memory_clock = &radeon_atom_get_memory_clock, 774 774 .set_memory_clock = &radeon_atom_set_memory_clock, 775 - .get_pcie_lanes = NULL, 776 - .set_pcie_lanes = NULL, 775 + .get_pcie_lanes = &r600_get_pcie_lanes, 776 + .set_pcie_lanes = &r600_set_pcie_lanes, 777 777 .set_clock_gating = NULL, 778 778 .set_surface_reg = r600_set_surface_reg, 779 779 .clear_surface_reg = r600_clear_surface_reg, ··· 834 834 .pm_finish = &evergreen_pm_finish, 835 835 .pm_init_profile = &rs780_pm_init_profile, 836 836 .pm_get_dynpm_state = &r600_pm_get_dynpm_state, 837 + }; 838 + 839 + static struct radeon_asic btc_asic = { 840 + .init = &evergreen_init, 841 + .fini = &evergreen_fini, 842 + .suspend = &evergreen_suspend, 843 + .resume = &evergreen_resume, 844 + .cp_commit = &r600_cp_commit, 845 + .gpu_is_lockup = &evergreen_gpu_is_lockup, 846 + .asic_reset = &evergreen_asic_reset, 847 + .vga_set_state = &r600_vga_set_state, 848 + .gart_tlb_flush = &evergreen_pcie_gart_tlb_flush, 849 + .gart_set_page = &rs600_gart_set_page, 850 + .ring_test = &r600_ring_test, 851 + .ring_ib_execute = &r600_ring_ib_execute, 852 + .irq_set = &evergreen_irq_set, 853 + .irq_process = &evergreen_irq_process, 854 + .get_vblank_counter = &evergreen_get_vblank_counter, 855 + .fence_ring_emit = &r600_fence_ring_emit, 856 + .cs_parse = &evergreen_cs_parse, 857 + .copy_blit = &evergreen_copy_blit, 858 + .copy_dma = &evergreen_copy_blit, 859 + .copy = &evergreen_copy_blit, 860 + .get_engine_clock = &radeon_atom_get_engine_clock, 861 + .set_engine_clock = &radeon_atom_set_engine_clock, 862 + .get_memory_clock = &radeon_atom_get_memory_clock, 863 + .set_memory_clock = &radeon_atom_set_memory_clock, 864 + .get_pcie_lanes = NULL, 865 + .set_pcie_lanes = NULL, 866 + .set_clock_gating = NULL, 867 + .set_surface_reg = r600_set_surface_reg, 868 + .clear_surface_reg = r600_clear_surface_reg, 869 + .bandwidth_update = &evergreen_bandwidth_update, 870 + .hpd_init = &evergreen_hpd_init, 871 + .hpd_fini = &evergreen_hpd_fini, 872 + .hpd_sense = &evergreen_hpd_sense, 873 + .hpd_set_polarity = &evergreen_hpd_set_polarity, 874 + .gui_idle = &r600_gui_idle, 875 + .pm_misc = &evergreen_pm_misc, 876 + .pm_prepare = &evergreen_pm_prepare, 877 + .pm_finish = &evergreen_pm_finish, 878 + .pm_init_profile = &r600_pm_init_profile, 879 + .pm_get_dynpm_state = &r600_pm_get_dynpm_state, 880 + .pre_page_flip = &evergreen_pre_page_flip, 881 + .page_flip = &evergreen_page_flip, 882 + .post_page_flip = &evergreen_post_page_flip, 837 883 }; 838 884 839 885 int radeon_asic_init(struct radeon_device *rdev) ··· 968 922 break; 969 923 case CHIP_PALM: 970 924 rdev->asic = &sumo_asic; 925 + break; 926 + case CHIP_BARTS: 927 + case CHIP_TURKS: 928 + case CHIP_CAICOS: 929 + rdev->asic = &btc_asic; 971 930 break; 972 931 default: 973 932 /* FIXME: not supported yet */
+52 -3
drivers/gpu/drm/radeon/radeon_asic.h
··· 102 102 void r100_pci_gart_disable(struct radeon_device *rdev); 103 103 int r100_debugfs_mc_info_init(struct radeon_device *rdev); 104 104 int r100_gui_wait_for_idle(struct radeon_device *rdev); 105 + void r100_gpu_lockup_update(struct r100_gpu_lockup *lockup, 106 + struct radeon_cp *cp); 107 + bool r100_gpu_cp_is_lockup(struct radeon_device *rdev, 108 + struct r100_gpu_lockup *lockup, 109 + struct radeon_cp *cp); 105 110 void r100_ib_fini(struct radeon_device *rdev); 106 111 int r100_ib_init(struct radeon_device *rdev); 107 112 void r100_irq_disable(struct radeon_device *rdev); ··· 143 138 * r200,rv250,rs300,rv280 144 139 */ 145 140 extern int r200_copy_dma(struct radeon_device *rdev, 146 - uint64_t src_offset, 147 - uint64_t dst_offset, 148 - unsigned num_pages, 141 + uint64_t src_offset, 142 + uint64_t dst_offset, 143 + unsigned num_pages, 149 144 struct radeon_fence *fence); 145 + void r200_set_safe_registers(struct radeon_device *rdev); 150 146 151 147 /* 152 148 * r300,r350,rv350,rv380 ··· 168 162 extern void rv370_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); 169 163 extern void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes); 170 164 extern int rv370_get_pcie_lanes(struct radeon_device *rdev); 165 + extern void r300_set_reg_safe(struct radeon_device *rdev); 166 + extern void r300_mc_program(struct radeon_device *rdev); 167 + extern void r300_mc_init(struct radeon_device *rdev); 168 + extern void r300_clock_startup(struct radeon_device *rdev); 169 + extern int r300_mc_wait_for_idle(struct radeon_device *rdev); 170 + extern int rv370_pcie_gart_init(struct radeon_device *rdev); 171 + extern void rv370_pcie_gart_fini(struct radeon_device *rdev); 172 + extern int rv370_pcie_gart_enable(struct radeon_device *rdev); 173 + extern void rv370_pcie_gart_disable(struct radeon_device *rdev); 171 174 172 175 /* 173 176 * r420,r423,rv410 ··· 186 171 extern int r420_suspend(struct radeon_device *rdev); 187 172 extern int r420_resume(struct radeon_device *rdev); 188 173 extern void r420_pm_init_profile(struct radeon_device *rdev); 174 + extern u32 r420_mc_rreg(struct radeon_device *rdev, u32 reg); 175 + extern void r420_mc_wreg(struct radeon_device *rdev, u32 reg, u32 v); 176 + extern int r420_debugfs_pipes_info_init(struct radeon_device *rdev); 177 + extern void r420_pipes_init(struct radeon_device *rdev); 189 178 190 179 /* 191 180 * rs400,rs480 ··· 202 183 int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); 203 184 uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg); 204 185 void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); 186 + int rs400_gart_init(struct radeon_device *rdev); 187 + int rs400_gart_enable(struct radeon_device *rdev); 188 + void rs400_gart_adjust_size(struct radeon_device *rdev); 189 + void rs400_gart_disable(struct radeon_device *rdev); 190 + void rs400_gart_fini(struct radeon_device *rdev); 191 + 205 192 206 193 /* 207 194 * rs600. ··· 219 194 extern int rs600_resume(struct radeon_device *rdev); 220 195 int rs600_irq_set(struct radeon_device *rdev); 221 196 int rs600_irq_process(struct radeon_device *rdev); 197 + void rs600_irq_disable(struct radeon_device *rdev); 222 198 u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc); 223 199 void rs600_gart_tlb_flush(struct radeon_device *rdev); 224 200 int rs600_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); ··· 237 211 extern void rs600_pre_page_flip(struct radeon_device *rdev, int crtc); 238 212 extern u32 rs600_page_flip(struct radeon_device *rdev, int crtc, u64 crtc_base); 239 213 extern void rs600_post_page_flip(struct radeon_device *rdev, int crtc); 214 + void rs600_set_safe_registers(struct radeon_device *rdev); 215 + 240 216 241 217 /* 242 218 * rs690,rs740 ··· 250 222 uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg); 251 223 void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); 252 224 void rs690_bandwidth_update(struct radeon_device *rdev); 225 + void rs690_line_buffer_adjust(struct radeon_device *rdev, 226 + struct drm_display_mode *mode1, 227 + struct drm_display_mode *mode2); 253 228 254 229 /* 255 230 * rv515 256 231 */ 232 + struct rv515_mc_save { 233 + u32 d1vga_control; 234 + u32 d2vga_control; 235 + u32 vga_render_control; 236 + u32 vga_hdp_control; 237 + u32 d1crtc_control; 238 + u32 d2crtc_control; 239 + }; 257 240 int rv515_init(struct radeon_device *rdev); 258 241 void rv515_fini(struct radeon_device *rdev); 259 242 uint32_t rv515_mc_rreg(struct radeon_device *rdev, uint32_t reg); ··· 275 236 void rv515_bandwidth_update(struct radeon_device *rdev); 276 237 int rv515_resume(struct radeon_device *rdev); 277 238 int rv515_suspend(struct radeon_device *rdev); 239 + void rv515_bandwidth_avivo_update(struct radeon_device *rdev); 240 + void rv515_vga_render_disable(struct radeon_device *rdev); 241 + void rv515_set_safe_registers(struct radeon_device *rdev); 242 + void rv515_mc_stop(struct radeon_device *rdev, struct rv515_mc_save *save); 243 + void rv515_mc_resume(struct radeon_device *rdev, struct rv515_mc_save *save); 244 + void rv515_clock_startup(struct radeon_device *rdev); 245 + void rv515_debugfs(struct radeon_device *rdev); 246 + 278 247 279 248 /* 280 249 * r520,rv530,rv560,rv570,r580 ··· 331 284 extern void r600_pm_init_profile(struct radeon_device *rdev); 332 285 extern void rs780_pm_init_profile(struct radeon_device *rdev); 333 286 extern void r600_pm_get_dynpm_state(struct radeon_device *rdev); 287 + extern void r600_set_pcie_lanes(struct radeon_device *rdev, int lanes); 288 + extern int r600_get_pcie_lanes(struct radeon_device *rdev); 334 289 335 290 /* 336 291 * rv770,rv730,rv710,rv740
+76 -24
drivers/gpu/drm/radeon/radeon_atombios.c
··· 37 37 extern void radeon_link_encoder_connector(struct drm_device *dev); 38 38 extern void 39 39 radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_enum, 40 - uint32_t supported_device); 40 + uint32_t supported_device, u16 caps); 41 41 42 42 /* from radeon_connector.c */ 43 43 extern void ··· 537 537 u16 size, data_offset; 538 538 u8 frev, crev; 539 539 ATOM_CONNECTOR_OBJECT_TABLE *con_obj; 540 + ATOM_ENCODER_OBJECT_TABLE *enc_obj; 540 541 ATOM_OBJECT_TABLE *router_obj; 541 542 ATOM_DISPLAY_OBJECT_PATH_TABLE *path_obj; 542 543 ATOM_OBJECT_HEADER *obj_header; ··· 562 561 con_obj = (ATOM_CONNECTOR_OBJECT_TABLE *) 563 562 (ctx->bios + data_offset + 564 563 le16_to_cpu(obj_header->usConnectorObjectTableOffset)); 564 + enc_obj = (ATOM_ENCODER_OBJECT_TABLE *) 565 + (ctx->bios + data_offset + 566 + le16_to_cpu(obj_header->usEncoderObjectTableOffset)); 565 567 router_obj = (ATOM_OBJECT_TABLE *) 566 568 (ctx->bios + data_offset + 567 569 le16_to_cpu(obj_header->usRouterObjectTableOffset)); ··· 670 666 OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT; 671 667 672 668 if (grph_obj_type == GRAPH_OBJECT_TYPE_ENCODER) { 673 - u16 encoder_obj = le16_to_cpu(path->usGraphicObjIds[j]); 669 + for (k = 0; k < enc_obj->ucNumberOfObjects; k++) { 670 + u16 encoder_obj = le16_to_cpu(enc_obj->asObjects[k].usObjectID); 671 + if (le16_to_cpu(path->usGraphicObjIds[j]) == encoder_obj) { 672 + ATOM_COMMON_RECORD_HEADER *record = (ATOM_COMMON_RECORD_HEADER *) 673 + (ctx->bios + data_offset + 674 + le16_to_cpu(enc_obj->asObjects[k].usRecordOffset)); 675 + ATOM_ENCODER_CAP_RECORD *cap_record; 676 + u16 caps = 0; 674 677 675 - radeon_add_atom_encoder(dev, 676 - encoder_obj, 677 - le16_to_cpu 678 - (path-> 679 - usDeviceTag)); 680 - 678 + while (record->ucRecordType > 0 && 679 + record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) { 680 + switch (record->ucRecordType) { 681 + case ATOM_ENCODER_CAP_RECORD_TYPE: 682 + cap_record =(ATOM_ENCODER_CAP_RECORD *) 683 + record; 684 + caps = le16_to_cpu(cap_record->usEncoderCap); 685 + break; 686 + } 687 + record = (ATOM_COMMON_RECORD_HEADER *) 688 + ((char *)record + record->ucRecordSize); 689 + } 690 + radeon_add_atom_encoder(dev, 691 + encoder_obj, 692 + le16_to_cpu 693 + (path-> 694 + usDeviceTag), 695 + caps); 696 + } 697 + } 681 698 } else if (grph_obj_type == GRAPH_OBJECT_TYPE_ROUTER) { 682 699 for (k = 0; k < router_obj->ucNumberOfObjects; k++) { 683 700 u16 router_obj_id = le16_to_cpu(router_obj->asObjects[k].usObjectID); ··· 1032 1007 radeon_get_encoder_enum(dev, 1033 1008 (1 << i), 1034 1009 dac), 1035 - (1 << i)); 1010 + (1 << i), 1011 + 0); 1036 1012 else 1037 1013 radeon_add_legacy_encoder(dev, 1038 1014 radeon_get_encoder_enum(dev, ··· 1112 1086 ATOM_FIRMWARE_INFO_V1_3 info_13; 1113 1087 ATOM_FIRMWARE_INFO_V1_4 info_14; 1114 1088 ATOM_FIRMWARE_INFO_V2_1 info_21; 1089 + ATOM_FIRMWARE_INFO_V2_2 info_22; 1115 1090 }; 1116 1091 1117 1092 bool radeon_atom_get_clock_info(struct drm_device *dev) ··· 1187 1160 *p2pll = *p1pll; 1188 1161 1189 1162 /* system clock */ 1190 - spll->reference_freq = 1191 - le16_to_cpu(firmware_info->info.usReferenceClock); 1163 + if (ASIC_IS_DCE4(rdev)) 1164 + spll->reference_freq = 1165 + le16_to_cpu(firmware_info->info_21.usCoreReferenceClock); 1166 + else 1167 + spll->reference_freq = 1168 + le16_to_cpu(firmware_info->info.usReferenceClock); 1192 1169 spll->reference_div = 0; 1193 1170 1194 1171 spll->pll_out_min = ··· 1214 1183 le16_to_cpu(firmware_info->info.usMaxEngineClockPLL_Input); 1215 1184 1216 1185 /* memory clock */ 1217 - mpll->reference_freq = 1218 - le16_to_cpu(firmware_info->info.usReferenceClock); 1186 + if (ASIC_IS_DCE4(rdev)) 1187 + mpll->reference_freq = 1188 + le16_to_cpu(firmware_info->info_21.usMemoryReferenceClock); 1189 + else 1190 + mpll->reference_freq = 1191 + le16_to_cpu(firmware_info->info.usReferenceClock); 1219 1192 mpll->reference_div = 0; 1220 1193 1221 1194 mpll->pll_out_min = ··· 1248 1213 if (ASIC_IS_DCE4(rdev)) { 1249 1214 rdev->clock.default_dispclk = 1250 1215 le32_to_cpu(firmware_info->info_21.ulDefaultDispEngineClkFreq); 1251 - if (rdev->clock.default_dispclk == 0) 1252 - rdev->clock.default_dispclk = 60000; /* 600 Mhz */ 1216 + if (rdev->clock.default_dispclk == 0) { 1217 + if (ASIC_IS_DCE5(rdev)) 1218 + rdev->clock.default_dispclk = 54000; /* 540 Mhz */ 1219 + else 1220 + rdev->clock.default_dispclk = 60000; /* 600 Mhz */ 1221 + } 1253 1222 rdev->clock.dp_extclk = 1254 1223 le16_to_cpu(firmware_info->info_21.usUniphyDPModeExtClkFreq); 1255 1224 } ··· 1891 1852 "Evergreen", 1892 1853 "emc2103", 1893 1854 "Sumo", 1855 + "Northern Islands", 1894 1856 }; 1895 1857 1896 1858 union power_info { ··· 2155 2115 (controller->ucFanParameters & 2156 2116 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); 2157 2117 rdev->pm.int_thermal_type = THERMAL_TYPE_SUMO; 2118 + } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_NISLANDS) { 2119 + DRM_INFO("Internal thermal controller %s fan control\n", 2120 + (controller->ucFanParameters & 2121 + ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); 2122 + rdev->pm.int_thermal_type = THERMAL_TYPE_NI; 2158 2123 } else if ((controller->ucType == 2159 2124 ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO) || 2160 2125 (controller->ucType == ··· 2249 2204 rdev->pm.default_power_state_index = state_index; 2250 2205 rdev->pm.power_state[state_index].default_clock_mode = 2251 2206 &rdev->pm.power_state[state_index].clock_info[mode_index - 1]; 2252 - /* patch the table values with the default slck/mclk from firmware info */ 2253 - for (j = 0; j < mode_index; j++) { 2254 - rdev->pm.power_state[state_index].clock_info[j].mclk = 2255 - rdev->clock.default_mclk; 2256 - rdev->pm.power_state[state_index].clock_info[j].sclk = 2257 - rdev->clock.default_sclk; 2258 - if (vddc) 2259 - rdev->pm.power_state[state_index].clock_info[j].voltage.voltage = 2260 - vddc; 2207 + if (ASIC_IS_DCE5(rdev)) { 2208 + /* NI chips post without MC ucode, so default clocks are strobe mode only */ 2209 + rdev->pm.default_sclk = rdev->pm.power_state[state_index].clock_info[0].sclk; 2210 + rdev->pm.default_mclk = rdev->pm.power_state[state_index].clock_info[0].mclk; 2211 + rdev->pm.default_vddc = rdev->pm.power_state[state_index].clock_info[0].voltage.voltage; 2212 + } else { 2213 + /* patch the table values with the default slck/mclk from firmware info */ 2214 + for (j = 0; j < mode_index; j++) { 2215 + rdev->pm.power_state[state_index].clock_info[j].mclk = 2216 + rdev->clock.default_mclk; 2217 + rdev->pm.power_state[state_index].clock_info[j].sclk = 2218 + rdev->clock.default_sclk; 2219 + if (vddc) 2220 + rdev->pm.power_state[state_index].clock_info[j].voltage.voltage = 2221 + vddc; 2222 + } 2261 2223 } 2262 2224 } 2263 2225 }
+41
drivers/gpu/drm/radeon/radeon_bios.c
··· 131 131 return true; 132 132 } 133 133 134 + static bool ni_read_disabled_bios(struct radeon_device *rdev) 135 + { 136 + u32 bus_cntl; 137 + u32 d1vga_control; 138 + u32 d2vga_control; 139 + u32 vga_render_control; 140 + u32 rom_cntl; 141 + bool r; 142 + 143 + bus_cntl = RREG32(R600_BUS_CNTL); 144 + d1vga_control = RREG32(AVIVO_D1VGA_CONTROL); 145 + d2vga_control = RREG32(AVIVO_D2VGA_CONTROL); 146 + vga_render_control = RREG32(AVIVO_VGA_RENDER_CONTROL); 147 + rom_cntl = RREG32(R600_ROM_CNTL); 148 + 149 + /* enable the rom */ 150 + WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS)); 151 + /* Disable VGA mode */ 152 + WREG32(AVIVO_D1VGA_CONTROL, 153 + (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE | 154 + AVIVO_DVGA_CONTROL_TIMING_SELECT))); 155 + WREG32(AVIVO_D2VGA_CONTROL, 156 + (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE | 157 + AVIVO_DVGA_CONTROL_TIMING_SELECT))); 158 + WREG32(AVIVO_VGA_RENDER_CONTROL, 159 + (vga_render_control & ~AVIVO_VGA_VSTATUS_CNTL_MASK)); 160 + WREG32(R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE); 161 + 162 + r = radeon_read_bios(rdev); 163 + 164 + /* restore regs */ 165 + WREG32(R600_BUS_CNTL, bus_cntl); 166 + WREG32(AVIVO_D1VGA_CONTROL, d1vga_control); 167 + WREG32(AVIVO_D2VGA_CONTROL, d2vga_control); 168 + WREG32(AVIVO_VGA_RENDER_CONTROL, vga_render_control); 169 + WREG32(R600_ROM_CNTL, rom_cntl); 170 + return r; 171 + } 172 + 134 173 static bool r700_read_disabled_bios(struct radeon_device *rdev) 135 174 { 136 175 uint32_t viph_control; ··· 455 416 { 456 417 if (rdev->flags & RADEON_IS_IGP) 457 418 return igp_read_bios_from_vram(rdev); 419 + else if (rdev->family >= CHIP_BARTS) 420 + return ni_read_disabled_bios(rdev); 458 421 else if (rdev->family >= CHIP_RV770) 459 422 return r700_read_disabled_bios(rdev); 460 423 else if (rdev->family >= CHIP_R600)
+8
drivers/gpu/drm/radeon/radeon_device.c
··· 82 82 "CYPRESS", 83 83 "HEMLOCK", 84 84 "PALM", 85 + "BARTS", 86 + "TURKS", 87 + "CAICOS", 85 88 "LAST", 86 89 }; 87 90 ··· 227 224 if (rdev->family >= CHIP_R600) 228 225 rdev->wb.use_event = true; 229 226 } 227 + } 228 + /* always use writeback/events on NI */ 229 + if (ASIC_IS_DCE5(rdev)) { 230 + rdev->wb.enabled = true; 231 + rdev->wb.use_event = true; 230 232 } 231 233 232 234 dev_info(rdev->dev, "WB %sabled\n", rdev->wb.enabled ? "en" : "dis");
+69 -4
drivers/gpu/drm/radeon/radeon_display.c
··· 68 68 WREG32(AVIVO_D1GRPH_LUT_SEL + radeon_crtc->crtc_offset, radeon_crtc->crtc_id); 69 69 } 70 70 71 - static void evergreen_crtc_load_lut(struct drm_crtc *crtc) 71 + static void dce4_crtc_load_lut(struct drm_crtc *crtc) 72 72 { 73 73 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); 74 74 struct drm_device *dev = crtc->dev; ··· 96 96 (radeon_crtc->lut_g[i] << 10) | 97 97 (radeon_crtc->lut_b[i] << 0)); 98 98 } 99 + } 100 + 101 + static void dce5_crtc_load_lut(struct drm_crtc *crtc) 102 + { 103 + struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); 104 + struct drm_device *dev = crtc->dev; 105 + struct radeon_device *rdev = dev->dev_private; 106 + int i; 107 + 108 + DRM_DEBUG_KMS("%d\n", radeon_crtc->crtc_id); 109 + 110 + WREG32(NI_INPUT_CSC_CONTROL + radeon_crtc->crtc_offset, 111 + (NI_INPUT_CSC_GRPH_MODE(NI_INPUT_CSC_BYPASS) | 112 + NI_INPUT_CSC_OVL_MODE(NI_INPUT_CSC_BYPASS))); 113 + WREG32(NI_PRESCALE_GRPH_CONTROL + radeon_crtc->crtc_offset, 114 + NI_GRPH_PRESCALE_BYPASS); 115 + WREG32(NI_PRESCALE_OVL_CONTROL + radeon_crtc->crtc_offset, 116 + NI_OVL_PRESCALE_BYPASS); 117 + WREG32(NI_INPUT_GAMMA_CONTROL + radeon_crtc->crtc_offset, 118 + (NI_GRPH_INPUT_GAMMA_MODE(NI_INPUT_GAMMA_USE_LUT) | 119 + NI_OVL_INPUT_GAMMA_MODE(NI_INPUT_GAMMA_USE_LUT))); 120 + 121 + WREG32(EVERGREEN_DC_LUT_CONTROL + radeon_crtc->crtc_offset, 0); 122 + 123 + WREG32(EVERGREEN_DC_LUT_BLACK_OFFSET_BLUE + radeon_crtc->crtc_offset, 0); 124 + WREG32(EVERGREEN_DC_LUT_BLACK_OFFSET_GREEN + radeon_crtc->crtc_offset, 0); 125 + WREG32(EVERGREEN_DC_LUT_BLACK_OFFSET_RED + radeon_crtc->crtc_offset, 0); 126 + 127 + WREG32(EVERGREEN_DC_LUT_WHITE_OFFSET_BLUE + radeon_crtc->crtc_offset, 0xffff); 128 + WREG32(EVERGREEN_DC_LUT_WHITE_OFFSET_GREEN + radeon_crtc->crtc_offset, 0xffff); 129 + WREG32(EVERGREEN_DC_LUT_WHITE_OFFSET_RED + radeon_crtc->crtc_offset, 0xffff); 130 + 131 + WREG32(EVERGREEN_DC_LUT_RW_MODE + radeon_crtc->crtc_offset, 0); 132 + WREG32(EVERGREEN_DC_LUT_WRITE_EN_MASK + radeon_crtc->crtc_offset, 0x00000007); 133 + 134 + WREG32(EVERGREEN_DC_LUT_RW_INDEX + radeon_crtc->crtc_offset, 0); 135 + for (i = 0; i < 256; i++) { 136 + WREG32(EVERGREEN_DC_LUT_30_COLOR + radeon_crtc->crtc_offset, 137 + (radeon_crtc->lut_r[i] << 20) | 138 + (radeon_crtc->lut_g[i] << 10) | 139 + (radeon_crtc->lut_b[i] << 0)); 140 + } 141 + 142 + WREG32(NI_DEGAMMA_CONTROL + radeon_crtc->crtc_offset, 143 + (NI_GRPH_DEGAMMA_MODE(NI_DEGAMMA_BYPASS) | 144 + NI_OVL_DEGAMMA_MODE(NI_DEGAMMA_BYPASS) | 145 + NI_ICON_DEGAMMA_MODE(NI_DEGAMMA_BYPASS) | 146 + NI_CURSOR_DEGAMMA_MODE(NI_DEGAMMA_BYPASS))); 147 + WREG32(NI_GAMUT_REMAP_CONTROL + radeon_crtc->crtc_offset, 148 + (NI_GRPH_GAMUT_REMAP_MODE(NI_GAMUT_REMAP_BYPASS) | 149 + NI_OVL_GAMUT_REMAP_MODE(NI_GAMUT_REMAP_BYPASS))); 150 + WREG32(NI_REGAMMA_CONTROL + radeon_crtc->crtc_offset, 151 + (NI_GRPH_REGAMMA_MODE(NI_REGAMMA_BYPASS) | 152 + NI_OVL_REGAMMA_MODE(NI_REGAMMA_BYPASS))); 153 + WREG32(NI_OUTPUT_CSC_CONTROL + radeon_crtc->crtc_offset, 154 + (NI_OUTPUT_CSC_GRPH_MODE(NI_OUTPUT_CSC_BYPASS) | 155 + NI_OUTPUT_CSC_OVL_MODE(NI_OUTPUT_CSC_BYPASS))); 156 + /* XXX match this to the depth of the crtc fmt block, move to modeset? */ 157 + WREG32(0x6940 + radeon_crtc->crtc_offset, 0); 158 + 99 159 } 100 160 101 161 static void legacy_crtc_load_lut(struct drm_crtc *crtc) ··· 190 130 if (!crtc->enabled) 191 131 return; 192 132 193 - if (ASIC_IS_DCE4(rdev)) 194 - evergreen_crtc_load_lut(crtc); 133 + if (ASIC_IS_DCE5(rdev)) 134 + dce5_crtc_load_lut(crtc); 135 + else if (ASIC_IS_DCE4(rdev)) 136 + dce4_crtc_load_lut(crtc); 195 137 else if (ASIC_IS_AVIVO(rdev)) 196 138 avivo_crtc_load_lut(crtc); 197 139 else ··· 1181 1119 1182 1120 rdev->ddev->mode_config.funcs = (void *)&radeon_mode_funcs; 1183 1121 1184 - if (ASIC_IS_AVIVO(rdev)) { 1122 + if (ASIC_IS_DCE5(rdev)) { 1123 + rdev->ddev->mode_config.max_width = 16384; 1124 + rdev->ddev->mode_config.max_height = 16384; 1125 + } else if (ASIC_IS_AVIVO(rdev)) { 1185 1126 rdev->ddev->mode_config.max_width = 8192; 1186 1127 rdev->ddev->mode_config.max_height = 8192; 1187 1128 } else {
+85 -21
drivers/gpu/drm/radeon/radeon_encoders.c
··· 712 712 * - 2 DIG encoder blocks. 713 713 * DIG1/2 can drive UNIPHY0/1/2 link A or link B 714 714 * 715 - * DCE 4.0 715 + * DCE 4.0/5.0 716 716 * - 3 DIG transmitter blocks UNIPHY0/1/2 (links A and B). 717 717 * Supports up to 6 digital outputs 718 718 * - 6 DIG encoder blocks. ··· 743 743 DIG_ENCODER_CONTROL_PS_ALLOCATION v1; 744 744 DIG_ENCODER_CONTROL_PARAMETERS_V2 v2; 745 745 DIG_ENCODER_CONTROL_PARAMETERS_V3 v3; 746 + DIG_ENCODER_CONTROL_PARAMETERS_V4 v4; 746 747 }; 747 748 748 749 void ··· 759 758 uint8_t frev, crev; 760 759 int dp_clock = 0; 761 760 int dp_lane_count = 0; 761 + int hpd_id = RADEON_HPD_NONE; 762 762 763 763 if (connector) { 764 764 struct radeon_connector *radeon_connector = to_radeon_connector(connector); ··· 768 766 769 767 dp_clock = dig_connector->dp_clock; 770 768 dp_lane_count = dig_connector->dp_lane_count; 769 + hpd_id = radeon_connector->hpd.hpd; 771 770 } 772 771 773 772 /* no dig encoder assigned */ ··· 793 790 args.v1.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 794 791 args.v1.ucEncoderMode = atombios_get_encoder_mode(encoder); 795 792 796 - if (args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP) { 797 - if (dp_clock == 270000) 798 - args.v1.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ; 793 + if ((args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP) || 794 + (args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP_MST)) 799 795 args.v1.ucLaneNum = dp_lane_count; 800 - } else if (radeon_encoder->pixel_clock > 165000) 796 + else if (radeon_encoder->pixel_clock > 165000) 801 797 args.v1.ucLaneNum = 8; 802 798 else 803 799 args.v1.ucLaneNum = 4; 804 800 805 - if (ASIC_IS_DCE4(rdev)) { 801 + if (ASIC_IS_DCE5(rdev)) { 802 + if ((args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP) || 803 + (args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP_MST)) { 804 + if (dp_clock == 270000) 805 + args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_2_70GHZ; 806 + else if (dp_clock == 540000) 807 + args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_5_40GHZ; 808 + } 809 + args.v4.acConfig.ucDigSel = dig->dig_encoder; 810 + args.v4.ucBitPerColor = PANEL_8BIT_PER_COLOR; 811 + if (hpd_id == RADEON_HPD_NONE) 812 + args.v4.ucHPD_ID = 0; 813 + else 814 + args.v4.ucHPD_ID = hpd_id + 1; 815 + } else if (ASIC_IS_DCE4(rdev)) { 816 + if ((args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP) && (dp_clock == 270000)) 817 + args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ; 806 818 args.v3.acConfig.ucDigSel = dig->dig_encoder; 807 819 args.v3.ucBitPerColor = PANEL_8BIT_PER_COLOR; 808 820 } else { 821 + if ((args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP) && (dp_clock == 270000)) 822 + args.v1.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ; 809 823 switch (radeon_encoder->encoder_id) { 810 824 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 811 825 args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER1; ··· 849 829 DIG_TRANSMITTER_CONTROL_PS_ALLOCATION v1; 850 830 DIG_TRANSMITTER_CONTROL_PARAMETERS_V2 v2; 851 831 DIG_TRANSMITTER_CONTROL_PARAMETERS_V3 v3; 832 + DIG_TRANSMITTER_CONTROL_PARAMETERS_V4 v4; 852 833 }; 853 834 854 835 void ··· 944 923 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); 945 924 pll_id = radeon_crtc->pll_id; 946 925 } 947 - if (is_dp && rdev->clock.dp_extclk) 948 - args.v3.acConfig.ucRefClkSource = 2; /* external src */ 949 - else 950 - args.v3.acConfig.ucRefClkSource = pll_id; 926 + 927 + if (ASIC_IS_DCE5(rdev)) { 928 + if (is_dp && rdev->clock.dp_extclk) 929 + args.v4.acConfig.ucRefClkSource = 3; /* external src */ 930 + else 931 + args.v4.acConfig.ucRefClkSource = pll_id; 932 + } else { 933 + if (is_dp && rdev->clock.dp_extclk) 934 + args.v3.acConfig.ucRefClkSource = 2; /* external src */ 935 + else 936 + args.v3.acConfig.ucRefClkSource = pll_id; 937 + } 951 938 952 939 switch (radeon_encoder->encoder_id) { 953 940 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: ··· 1227 1198 DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION args; 1228 1199 int index = 0; 1229 1200 bool is_dig = false; 1201 + bool is_dce5_dac = false; 1202 + bool is_dce5_dvo = false; 1230 1203 1231 1204 memset(&args, 0, sizeof(args)); 1232 1205 ··· 1251 1220 index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl); 1252 1221 break; 1253 1222 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: 1254 - if (ASIC_IS_DCE3(rdev)) 1223 + if (ASIC_IS_DCE5(rdev)) 1224 + is_dce5_dvo = true; 1225 + else if (ASIC_IS_DCE3(rdev)) 1255 1226 is_dig = true; 1256 1227 else 1257 1228 index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl); ··· 1269 1236 break; 1270 1237 case ENCODER_OBJECT_ID_INTERNAL_DAC1: 1271 1238 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: 1272 - if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) 1273 - index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl); 1274 - else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT)) 1275 - index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl); 1276 - else 1277 - index = GetIndexIntoMasterTable(COMMAND, DAC1OutputControl); 1239 + if (ASIC_IS_DCE5(rdev)) 1240 + is_dce5_dac = true; 1241 + else { 1242 + if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) 1243 + index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl); 1244 + else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT)) 1245 + index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl); 1246 + else 1247 + index = GetIndexIntoMasterTable(COMMAND, DAC1OutputControl); 1248 + } 1278 1249 break; 1279 1250 case ENCODER_OBJECT_ID_INTERNAL_DAC2: 1280 1251 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: ··· 1337 1300 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_LCD_BLOFF, 0, 0); 1338 1301 break; 1339 1302 } 1303 + } else if (is_dce5_dac) { 1304 + switch (mode) { 1305 + case DRM_MODE_DPMS_ON: 1306 + atombios_dac_setup(encoder, ATOM_ENABLE); 1307 + break; 1308 + case DRM_MODE_DPMS_STANDBY: 1309 + case DRM_MODE_DPMS_SUSPEND: 1310 + case DRM_MODE_DPMS_OFF: 1311 + atombios_dac_setup(encoder, ATOM_DISABLE); 1312 + break; 1313 + } 1314 + } else if (is_dce5_dvo) { 1315 + switch (mode) { 1316 + case DRM_MODE_DPMS_ON: 1317 + atombios_dvo_setup(encoder, ATOM_ENABLE); 1318 + break; 1319 + case DRM_MODE_DPMS_STANDBY: 1320 + case DRM_MODE_DPMS_SUSPEND: 1321 + case DRM_MODE_DPMS_OFF: 1322 + atombios_dvo_setup(encoder, ATOM_DISABLE); 1323 + break; 1324 + } 1340 1325 } else { 1341 1326 switch (mode) { 1342 1327 case DRM_MODE_DPMS_ON: ··· 1388 1329 switch (mode) { 1389 1330 case DRM_MODE_DPMS_ON: 1390 1331 default: 1391 - if (ASIC_IS_DCE41(rdev) && (rdev->flags & RADEON_IS_IGP)) 1332 + if (ASIC_IS_DCE41(rdev)) 1392 1333 action = EXTERNAL_ENCODER_ACTION_V3_ENABLE_OUTPUT; 1393 1334 else 1394 1335 action = ATOM_ENABLE; ··· 1396 1337 case DRM_MODE_DPMS_STANDBY: 1397 1338 case DRM_MODE_DPMS_SUSPEND: 1398 1339 case DRM_MODE_DPMS_OFF: 1399 - if (ASIC_IS_DCE41(rdev) && (rdev->flags & RADEON_IS_IGP)) 1340 + if (ASIC_IS_DCE41(rdev)) 1400 1341 action = EXTERNAL_ENCODER_ACTION_V3_DISABLE_OUTPUT; 1401 1342 else 1402 1343 action = ATOM_DISABLE; ··· 1588 1529 struct radeon_encoder_atom_dig *dig; 1589 1530 uint32_t dig_enc_in_use = 0; 1590 1531 1532 + /* DCE4/5 */ 1591 1533 if (ASIC_IS_DCE4(rdev)) { 1592 1534 dig = radeon_encoder->enc_priv; 1593 1535 if (ASIC_IS_DCE41(rdev)) { ··· 1723 1663 } 1724 1664 1725 1665 if (ext_encoder) { 1726 - if (ASIC_IS_DCE41(rdev) && (rdev->flags & RADEON_IS_IGP)) { 1666 + if (ASIC_IS_DCE41(rdev)) { 1727 1667 atombios_external_encoder_setup(encoder, ext_encoder, 1728 1668 EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT); 1729 1669 atombios_external_encoder_setup(encoder, ext_encoder, ··· 2046 1986 } 2047 1987 2048 1988 void 2049 - radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_enum, uint32_t supported_device) 1989 + radeon_add_atom_encoder(struct drm_device *dev, 1990 + uint32_t encoder_enum, 1991 + uint32_t supported_device, 1992 + u16 caps) 2050 1993 { 2051 1994 struct radeon_device *rdev = dev->dev_private; 2052 1995 struct drm_encoder *encoder; ··· 2092 2029 radeon_encoder->rmx_type = RMX_OFF; 2093 2030 radeon_encoder->underscan_type = UNDERSCAN_OFF; 2094 2031 radeon_encoder->is_ext_encoder = false; 2032 + radeon_encoder->caps = caps; 2095 2033 2096 2034 switch (radeon_encoder->encoder_id) { 2097 2035 case ENCODER_OBJECT_ID_INTERNAL_LVDS:
+3
drivers/gpu/drm/radeon/radeon_family.h
··· 81 81 CHIP_CYPRESS, 82 82 CHIP_HEMLOCK, 83 83 CHIP_PALM, 84 + CHIP_BARTS, 85 + CHIP_TURKS, 86 + CHIP_CAICOS, 84 87 CHIP_LAST, 85 88 }; 86 89
+1
drivers/gpu/drm/radeon/radeon_mode.h
··· 379 379 int hdmi_audio_workaround; 380 380 int hdmi_buffer_status; 381 381 bool is_ext_encoder; 382 + u16 caps; 382 383 }; 383 384 384 385 struct radeon_connector_atom_dig {
+29 -8
drivers/gpu/drm/radeon/radeon_pm.c
··· 167 167 if (radeon_gui_idle(rdev)) { 168 168 sclk = rdev->pm.power_state[rdev->pm.requested_power_state_index]. 169 169 clock_info[rdev->pm.requested_clock_mode_index].sclk; 170 - if (sclk > rdev->clock.default_sclk) 171 - sclk = rdev->clock.default_sclk; 170 + if (sclk > rdev->pm.default_sclk) 171 + sclk = rdev->pm.default_sclk; 172 172 173 173 mclk = rdev->pm.power_state[rdev->pm.requested_power_state_index]. 174 174 clock_info[rdev->pm.requested_clock_mode_index].mclk; 175 - if (mclk > rdev->clock.default_mclk) 176 - mclk = rdev->clock.default_mclk; 175 + if (mclk > rdev->pm.default_mclk) 176 + mclk = rdev->pm.default_mclk; 177 177 178 178 /* upvolt before raising clocks, downvolt after lowering clocks */ 179 179 if (sclk < rdev->pm.current_sclk) ··· 440 440 temp = rv770_get_temp(rdev); 441 441 break; 442 442 case THERMAL_TYPE_EVERGREEN: 443 + case THERMAL_TYPE_NI: 443 444 temp = evergreen_get_temp(rdev); 444 445 break; 445 446 case THERMAL_TYPE_SUMO: ··· 530 529 531 530 void radeon_pm_resume(struct radeon_device *rdev) 532 531 { 532 + /* set up the default clocks if the MC ucode is loaded */ 533 + if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) { 534 + if (rdev->pm.default_vddc) 535 + radeon_atom_set_voltage(rdev, rdev->pm.default_vddc); 536 + if (rdev->pm.default_sclk) 537 + radeon_set_engine_clock(rdev, rdev->pm.default_sclk); 538 + if (rdev->pm.default_mclk) 539 + radeon_set_memory_clock(rdev, rdev->pm.default_mclk); 540 + } 533 541 /* asic init will reset the default power state */ 534 542 mutex_lock(&rdev->pm.mutex); 535 543 rdev->pm.current_power_state_index = rdev->pm.default_power_state_index; 536 544 rdev->pm.current_clock_mode_index = 0; 537 - rdev->pm.current_sclk = rdev->clock.default_sclk; 538 - rdev->pm.current_mclk = rdev->clock.default_mclk; 545 + rdev->pm.current_sclk = rdev->pm.default_sclk; 546 + rdev->pm.current_mclk = rdev->pm.default_mclk; 539 547 rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage; 540 548 if (rdev->pm.pm_method == PM_METHOD_DYNPM 541 549 && rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) { ··· 567 557 rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE; 568 558 rdev->pm.dynpm_can_upclock = true; 569 559 rdev->pm.dynpm_can_downclock = true; 560 + rdev->pm.default_sclk = rdev->clock.default_sclk; 561 + rdev->pm.default_mclk = rdev->clock.default_mclk; 570 562 rdev->pm.current_sclk = rdev->clock.default_sclk; 571 563 rdev->pm.current_mclk = rdev->clock.default_mclk; 572 564 rdev->pm.int_thermal_type = THERMAL_TYPE_NONE; ··· 580 568 radeon_combios_get_power_modes(rdev); 581 569 radeon_pm_print_states(rdev); 582 570 radeon_pm_init_profile(rdev); 571 + /* set up the default clocks if the MC ucode is loaded */ 572 + if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) { 573 + if (rdev->pm.default_vddc) 574 + radeon_atom_set_voltage(rdev, rdev->pm.default_vddc); 575 + if (rdev->pm.default_sclk) 576 + radeon_set_engine_clock(rdev, rdev->pm.default_sclk); 577 + if (rdev->pm.default_mclk) 578 + radeon_set_memory_clock(rdev, rdev->pm.default_mclk); 579 + } 583 580 } 584 581 585 582 /* set up the internal thermal sensor if applicable */ ··· 824 803 struct drm_device *dev = node->minor->dev; 825 804 struct radeon_device *rdev = dev->dev_private; 826 805 827 - seq_printf(m, "default engine clock: %u0 kHz\n", rdev->clock.default_sclk); 806 + seq_printf(m, "default engine clock: %u0 kHz\n", rdev->pm.default_sclk); 828 807 seq_printf(m, "current engine clock: %u0 kHz\n", radeon_get_engine_clock(rdev)); 829 - seq_printf(m, "default memory clock: %u0 kHz\n", rdev->clock.default_mclk); 808 + seq_printf(m, "default memory clock: %u0 kHz\n", rdev->pm.default_mclk); 830 809 if (rdev->asic->get_memory_clock) 831 810 seq_printf(m, "current memory clock: %u0 kHz\n", radeon_get_memory_clock(rdev)); 832 811 if (rdev->pm.current_vddc)
+10
drivers/gpu/drm/radeon/radeon_reg.h
··· 55 55 #include "r500_reg.h" 56 56 #include "r600_reg.h" 57 57 #include "evergreen_reg.h" 58 + #include "ni_reg.h" 58 59 59 60 #define RADEON_MC_AGP_LOCATION 0x014c 60 61 #define RADEON_MC_AGP_START_MASK 0x0000FFFF ··· 321 320 # define RADEON_PCIE_LC_RECONFIG_NOW (1 << 8) 322 321 # define RADEON_PCIE_LC_RECONFIG_LATER (1 << 9) 323 322 # define RADEON_PCIE_LC_SHORT_RECONFIG_EN (1 << 10) 323 + # define R600_PCIE_LC_RECONFIG_ARC_MISSING_ESCAPE (1 << 7) 324 + # define R600_PCIE_LC_RENEGOTIATION_SUPPORT (1 << 9) 325 + # define R600_PCIE_LC_RENEGOTIATE_EN (1 << 10) 326 + # define R600_PCIE_LC_SHORT_RECONFIG_EN (1 << 11) 327 + # define R600_PCIE_LC_UPCONFIGURE_SUPPORT (1 << 12) 328 + # define R600_PCIE_LC_UPCONFIGURE_DIS (1 << 13) 329 + 330 + #define R600_TARGET_AND_CURRENT_PROFILE_INDEX 0x70c 331 + #define R700_TARGET_AND_CURRENT_PROFILE_INDEX 0x66c 324 332 325 333 #define RADEON_CACHE_CNTL 0x1724 326 334 #define RADEON_CACHE_LINE 0x0f0c /* PCI */
+76
drivers/gpu/drm/radeon/rv770.c
··· 41 41 42 42 static void rv770_gpu_init(struct radeon_device *rdev); 43 43 void rv770_fini(struct radeon_device *rdev); 44 + static void rv770_pcie_gen2_enable(struct radeon_device *rdev); 44 45 45 46 u32 rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base) 46 47 { ··· 1125 1124 { 1126 1125 int r; 1127 1126 1127 + /* enable pcie gen2 link */ 1128 + rv770_pcie_gen2_enable(rdev); 1129 + 1128 1130 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { 1129 1131 r = r600_init_microcode(rdev); 1130 1132 if (r) { ··· 1365 1361 kfree(rdev->bios); 1366 1362 rdev->bios = NULL; 1367 1363 radeon_dummy_page_fini(rdev); 1364 + } 1365 + 1366 + static void rv770_pcie_gen2_enable(struct radeon_device *rdev) 1367 + { 1368 + u32 link_width_cntl, lanes, speed_cntl, tmp; 1369 + u16 link_cntl2; 1370 + 1371 + if (rdev->flags & RADEON_IS_IGP) 1372 + return; 1373 + 1374 + if (!(rdev->flags & RADEON_IS_PCIE)) 1375 + return; 1376 + 1377 + /* x2 cards have a special sequence */ 1378 + if (ASIC_IS_X2(rdev)) 1379 + return; 1380 + 1381 + /* advertise upconfig capability */ 1382 + link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL); 1383 + link_width_cntl &= ~LC_UPCONFIGURE_DIS; 1384 + WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 1385 + link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL); 1386 + if (link_width_cntl & LC_RENEGOTIATION_SUPPORT) { 1387 + lanes = (link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT; 1388 + link_width_cntl &= ~(LC_LINK_WIDTH_MASK | 1389 + LC_RECONFIG_ARC_MISSING_ESCAPE); 1390 + link_width_cntl |= lanes | LC_RECONFIG_NOW | 1391 + LC_RENEGOTIATE_EN | LC_UPCONFIGURE_SUPPORT; 1392 + WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 1393 + } else { 1394 + link_width_cntl |= LC_UPCONFIGURE_DIS; 1395 + WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 1396 + } 1397 + 1398 + speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL); 1399 + if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) && 1400 + (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) { 1401 + 1402 + tmp = RREG32(0x541c); 1403 + WREG32(0x541c, tmp | 0x8); 1404 + WREG32(MM_CFGREGS_CNTL, MM_WR_TO_CFG_EN); 1405 + link_cntl2 = RREG16(0x4088); 1406 + link_cntl2 &= ~TARGET_LINK_SPEED_MASK; 1407 + link_cntl2 |= 0x2; 1408 + WREG16(0x4088, link_cntl2); 1409 + WREG32(MM_CFGREGS_CNTL, 0); 1410 + 1411 + speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL); 1412 + speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN; 1413 + WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl); 1414 + 1415 + speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL); 1416 + speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT; 1417 + WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl); 1418 + 1419 + speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL); 1420 + speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT; 1421 + WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl); 1422 + 1423 + speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL); 1424 + speed_cntl |= LC_GEN2_EN_STRAP; 1425 + WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl); 1426 + 1427 + } else { 1428 + link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL); 1429 + /* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */ 1430 + if (1) 1431 + link_width_cntl |= LC_UPCONFIGURE_DIS; 1432 + else 1433 + link_width_cntl &= ~LC_UPCONFIGURE_DIS; 1434 + WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 1435 + } 1368 1436 }
+38
drivers/gpu/drm/radeon/rv770d.h
··· 360 360 #define D1GRPH_SECONDARY_SURFACE_ADDRESS_HIGH 0x691c 361 361 #define D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH 0x611c 362 362 363 + /* PCIE link stuff */ 364 + #define PCIE_LC_TRAINING_CNTL 0xa1 /* PCIE_P */ 365 + #define PCIE_LC_LINK_WIDTH_CNTL 0xa2 /* PCIE_P */ 366 + # define LC_LINK_WIDTH_SHIFT 0 367 + # define LC_LINK_WIDTH_MASK 0x7 368 + # define LC_LINK_WIDTH_X0 0 369 + # define LC_LINK_WIDTH_X1 1 370 + # define LC_LINK_WIDTH_X2 2 371 + # define LC_LINK_WIDTH_X4 3 372 + # define LC_LINK_WIDTH_X8 4 373 + # define LC_LINK_WIDTH_X16 6 374 + # define LC_LINK_WIDTH_RD_SHIFT 4 375 + # define LC_LINK_WIDTH_RD_MASK 0x70 376 + # define LC_RECONFIG_ARC_MISSING_ESCAPE (1 << 7) 377 + # define LC_RECONFIG_NOW (1 << 8) 378 + # define LC_RENEGOTIATION_SUPPORT (1 << 9) 379 + # define LC_RENEGOTIATE_EN (1 << 10) 380 + # define LC_SHORT_RECONFIG_EN (1 << 11) 381 + # define LC_UPCONFIGURE_SUPPORT (1 << 12) 382 + # define LC_UPCONFIGURE_DIS (1 << 13) 383 + #define PCIE_LC_SPEED_CNTL 0xa4 /* PCIE_P */ 384 + # define LC_GEN2_EN_STRAP (1 << 0) 385 + # define LC_TARGET_LINK_SPEED_OVERRIDE_EN (1 << 1) 386 + # define LC_FORCE_EN_HW_SPEED_CHANGE (1 << 5) 387 + # define LC_FORCE_DIS_HW_SPEED_CHANGE (1 << 6) 388 + # define LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_MASK (0x3 << 8) 389 + # define LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_SHIFT 3 390 + # define LC_CURRENT_DATA_RATE (1 << 11) 391 + # define LC_VOLTAGE_TIMER_SEL_MASK (0xf << 14) 392 + # define LC_CLR_FAILED_SPD_CHANGE_CNT (1 << 21) 393 + # define LC_OTHER_SIDE_EVER_SENT_GEN2 (1 << 23) 394 + # define LC_OTHER_SIDE_SUPPORTS_GEN2 (1 << 24) 395 + #define MM_CFGREGS_CNTL 0x544c 396 + # define MM_WR_TO_CFG_EN (1 << 3) 397 + #define LINK_CNTL2 0x88 /* F0 */ 398 + # define TARGET_LINK_SPEED_MASK (0xf << 0) 399 + # define SELECTABLE_DEEMPHASIS (1 << 6) 400 + 363 401 #endif
+36
include/drm/drm_pciids.h
··· 142 142 {0x1002, 0x5e4c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ 143 143 {0x1002, 0x5e4d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ 144 144 {0x1002, 0x5e4f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ 145 + {0x1002, 0x6720, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 146 + {0x1002, 0x6721, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 147 + {0x1002, 0x6722, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ 148 + {0x1002, 0x6723, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ 149 + {0x1002, 0x6724, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 150 + {0x1002, 0x6725, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 151 + {0x1002, 0x6726, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ 152 + {0x1002, 0x6727, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ 153 + {0x1002, 0x6728, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ 154 + {0x1002, 0x6729, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ 155 + {0x1002, 0x6738, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ 156 + {0x1002, 0x6739, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ 157 + {0x1002, 0x6740, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 158 + {0x1002, 0x6741, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 159 + {0x1002, 0x6742, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 160 + {0x1002, 0x6743, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 161 + {0x1002, 0x6744, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 162 + {0x1002, 0x6745, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 163 + {0x1002, 0x6746, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ 164 + {0x1002, 0x6747, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ 165 + {0x1002, 0x6748, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ 166 + {0x1002, 0x6749, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ 167 + {0x1002, 0x6750, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ 168 + {0x1002, 0x6758, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ 169 + {0x1002, 0x6759, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ 170 + {0x1002, 0x6760, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 171 + {0x1002, 0x6761, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 172 + {0x1002, 0x6762, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ 173 + {0x1002, 0x6763, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ 174 + {0x1002, 0x6764, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 175 + {0x1002, 0x6765, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 176 + {0x1002, 0x6766, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ 177 + {0x1002, 0x6767, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ 178 + {0x1002, 0x6768, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ 179 + {0x1002, 0x6770, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ 180 + {0x1002, 0x6779, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ 145 181 {0x1002, 0x6880, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 146 182 {0x1002, 0x6888, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \ 147 183 {0x1002, 0x6889, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \