Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'drm-next-3.17' of git://people.freedesktop.org/~agd5f/linux into drm-next

- Additional Hawaii fixes
- Support for using the display scaler on non-fixed mode displays
- Support for new firmware format that makes it easier to update
- Enable dpm by default on additional asics
- GPUVM improvements
- Support for uncached and write combined gtt buffers
- Allow allocation of BOs larger than visible vram
- Various other small fixes and improvements

* 'drm-next-3.17' of git://people.freedesktop.org/~agd5f/linux: (57 commits)
drm/radeon: Prevent hdmi deep color if max_tmds_clock is undefined.
drm/radeon: Use pflip irqs for pageflip completion if possible. (v2)
drm/radeon: tweak ACCEL_WORKING2 query for the new firmware for hawaii
drm/radeon: use packet3 for nop on hawaii with new firmware
drm/radeon: tweak ACCEL_WORKING2 query for hawaii
drm/radeon: use packet2 for nop on hawaii with old firmware
drm/radeon: update IB size estimation for VM
drm/radeon: split PT setup in more functions
drm/radeon: add VM GART copy optimization to NI as well
drm/radeon: take a BO reference on VM cleanup
drm/radeon: add radeon_bo_ref function
drm/radeon: remove taking mclk_lock from radeon_bo_unref
drm/radeon: adjust default radeon_vm_block_size v2
drm/radeon: try to enable VM flushing once more
drm/radeon: use an intervall tree to manage the VMA v2
drm/radeon: remove radeon_bo_clear_va
drm/radeon: invalidate moved BOs in the VM (v2)
drm/radeon: re-enable dpm by default on BTC
drm/radeon: re-enable dpm by default on cayman
drm/radeon: Only flush HDP cache from idle ioctl if BO is in VRAM
...

+3068 -1441
+1
drivers/gpu/drm/Kconfig
··· 114 114 select POWER_SUPPLY 115 115 select HWMON 116 116 select BACKLIGHT_CLASS_DEVICE 117 + select INTERVAL_TREE 117 118 help 118 119 Choose this option if you have an ATI Radeon graphics card. There 119 120 are both PCI and AGP versions. You don't need to choose this to
+1 -1
drivers/gpu/drm/radeon/Makefile
··· 80 80 r600_dpm.o rs780_dpm.o rv6xx_dpm.o rv770_dpm.o rv730_dpm.o rv740_dpm.o \ 81 81 rv770_smc.o cypress_dpm.o btc_dpm.o sumo_dpm.o sumo_smc.o trinity_dpm.o \ 82 82 trinity_smc.o ni_dpm.o si_smc.o si_dpm.o kv_smc.o kv_dpm.o ci_smc.o \ 83 - ci_dpm.o dce6_afmt.o radeon_vm.o 83 + ci_dpm.o dce6_afmt.o radeon_vm.o radeon_ucode.o radeon_ib.o 84 84 85 85 # add async DMA block 86 86 radeon-y += \
+8 -8
drivers/gpu/drm/radeon/atombios_encoders.c
··· 331 331 && (mode->crtc_vsync_start < (mode->crtc_vdisplay + 2))) 332 332 adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + 2; 333 333 334 - /* get the native mode for LVDS */ 335 - if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT)) 334 + /* get the native mode for scaling */ 335 + if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT)) { 336 336 radeon_panel_mode_fixup(encoder, adjusted_mode); 337 - 338 - /* get the native mode for TV */ 339 - if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) { 337 + } else if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) { 340 338 struct radeon_encoder_atom_dac *tv_dac = radeon_encoder->enc_priv; 341 339 if (tv_dac) { 342 340 if (tv_dac->tv_std == TV_STD_NTSC || ··· 344 346 else 345 347 radeon_atom_get_tv_timings(rdev, 1, adjusted_mode); 346 348 } 349 + } else if (radeon_encoder->rmx_type != RMX_OFF) { 350 + radeon_panel_mode_fixup(encoder, adjusted_mode); 347 351 } 348 352 349 353 if (ASIC_IS_DCE3(rdev) && ··· 716 716 if (radeon_connector->use_digital && 717 717 (radeon_connector->audio == RADEON_AUDIO_ENABLE)) 718 718 return ATOM_ENCODER_MODE_HDMI; 719 - else if (drm_detect_hdmi_monitor(radeon_connector->edid) && 719 + else if (drm_detect_hdmi_monitor(radeon_connector_edid(connector)) && 720 720 (radeon_connector->audio == RADEON_AUDIO_AUTO)) 721 721 return ATOM_ENCODER_MODE_HDMI; 722 722 else if (radeon_connector->use_digital) ··· 735 735 if (radeon_audio != 0) { 736 736 if (radeon_connector->audio == RADEON_AUDIO_ENABLE) 737 737 return ATOM_ENCODER_MODE_HDMI; 738 - else if (drm_detect_hdmi_monitor(radeon_connector->edid) && 738 + else if (drm_detect_hdmi_monitor(radeon_connector_edid(connector)) && 739 739 (radeon_connector->audio == RADEON_AUDIO_AUTO)) 740 740 return ATOM_ENCODER_MODE_HDMI; 741 741 else ··· 755 755 } else if (radeon_audio != 0) { 756 756 if (radeon_connector->audio == RADEON_AUDIO_ENABLE) 757 757 return ATOM_ENCODER_MODE_HDMI; 758 - else if (drm_detect_hdmi_monitor(radeon_connector->edid) && 758 + else if (drm_detect_hdmi_monitor(radeon_connector_edid(connector)) && 759 759 (radeon_connector->audio == RADEON_AUDIO_AUTO)) 760 760 return ATOM_ENCODER_MODE_HDMI; 761 761 else
+12 -1
drivers/gpu/drm/radeon/ci_dpm.c
··· 940 940 pi->vddc_leakage.count = 0; 941 941 pi->vddci_leakage.count = 0; 942 942 943 - if (radeon_atom_get_leakage_id_from_vbios(rdev, &leakage_id) == 0) { 943 + if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_EVV) { 944 + for (i = 0; i < CISLANDS_MAX_LEAKAGE_COUNT; i++) { 945 + virtual_voltage_id = ATOM_VIRTUAL_VOLTAGE_ID0 + i; 946 + if (radeon_atom_get_voltage_evv(rdev, virtual_voltage_id, &vddc) != 0) 947 + continue; 948 + if (vddc != 0 && vddc != virtual_voltage_id) { 949 + pi->vddc_leakage.actual_voltage[pi->vddc_leakage.count] = vddc; 950 + pi->vddc_leakage.leakage_id[pi->vddc_leakage.count] = virtual_voltage_id; 951 + pi->vddc_leakage.count++; 952 + } 953 + } 954 + } else if (radeon_atom_get_leakage_id_from_vbios(rdev, &leakage_id) == 0) { 944 955 for (i = 0; i < CISLANDS_MAX_LEAKAGE_COUNT; i++) { 945 956 virtual_voltage_id = ATOM_VIRTUAL_VOLTAGE_ID0 + i; 946 957 if (radeon_atom_get_leakage_vddc_based_on_leakage_params(rdev, &vddc, &vddci,
+26 -13
drivers/gpu/drm/radeon/ci_smc.c
··· 213 213 if (!rdev->smc_fw) 214 214 return -EINVAL; 215 215 216 - switch (rdev->family) { 217 - case CHIP_BONAIRE: 218 - ucode_start_address = BONAIRE_SMC_UCODE_START; 219 - ucode_size = BONAIRE_SMC_UCODE_SIZE; 220 - break; 221 - case CHIP_HAWAII: 222 - ucode_start_address = HAWAII_SMC_UCODE_START; 223 - ucode_size = HAWAII_SMC_UCODE_SIZE; 224 - break; 225 - default: 226 - DRM_ERROR("unknown asic in smc ucode loader\n"); 227 - BUG(); 216 + if (rdev->new_fw) { 217 + const struct smc_firmware_header_v1_0 *hdr = 218 + (const struct smc_firmware_header_v1_0 *)rdev->smc_fw->data; 219 + 220 + radeon_ucode_print_smc_hdr(&hdr->header); 221 + 222 + ucode_start_address = le32_to_cpu(hdr->ucode_start_addr); 223 + ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes); 224 + src = (const u8 *) 225 + (rdev->smc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes)); 226 + } else { 227 + switch (rdev->family) { 228 + case CHIP_BONAIRE: 229 + ucode_start_address = BONAIRE_SMC_UCODE_START; 230 + ucode_size = BONAIRE_SMC_UCODE_SIZE; 231 + break; 232 + case CHIP_HAWAII: 233 + ucode_start_address = HAWAII_SMC_UCODE_START; 234 + ucode_size = HAWAII_SMC_UCODE_SIZE; 235 + break; 236 + default: 237 + DRM_ERROR("unknown asic in smc ucode loader\n"); 238 + BUG(); 239 + } 240 + 241 + src = (const u8 *)rdev->smc_fw->data; 228 242 } 229 243 230 244 if (ucode_size & 3) 231 245 return -EINVAL; 232 246 233 - src = (const u8 *)rdev->smc_fw->data; 234 247 spin_lock_irqsave(&rdev->smc_idx_lock, flags); 235 248 WREG32(SMC_IND_INDEX_0, ucode_start_address); 236 249 WREG32_P(SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, ~AUTO_INCREMENT_IND_0);
+545 -175
drivers/gpu/drm/radeon/cik.c
··· 42 42 MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin"); 43 43 MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin"); 44 44 MODULE_FIRMWARE("radeon/BONAIRE_smc.bin"); 45 + 46 + MODULE_FIRMWARE("radeon/bonaire_pfp.bin"); 47 + MODULE_FIRMWARE("radeon/bonaire_me.bin"); 48 + MODULE_FIRMWARE("radeon/bonaire_ce.bin"); 49 + MODULE_FIRMWARE("radeon/bonaire_mec.bin"); 50 + MODULE_FIRMWARE("radeon/bonaire_mc.bin"); 51 + MODULE_FIRMWARE("radeon/bonaire_rlc.bin"); 52 + MODULE_FIRMWARE("radeon/bonaire_sdma.bin"); 53 + MODULE_FIRMWARE("radeon/bonaire_smc.bin"); 54 + 45 55 MODULE_FIRMWARE("radeon/HAWAII_pfp.bin"); 46 56 MODULE_FIRMWARE("radeon/HAWAII_me.bin"); 47 57 MODULE_FIRMWARE("radeon/HAWAII_ce.bin"); ··· 61 51 MODULE_FIRMWARE("radeon/HAWAII_rlc.bin"); 62 52 MODULE_FIRMWARE("radeon/HAWAII_sdma.bin"); 63 53 MODULE_FIRMWARE("radeon/HAWAII_smc.bin"); 54 + 55 + MODULE_FIRMWARE("radeon/hawaii_pfp.bin"); 56 + MODULE_FIRMWARE("radeon/hawaii_me.bin"); 57 + MODULE_FIRMWARE("radeon/hawaii_ce.bin"); 58 + MODULE_FIRMWARE("radeon/hawaii_mec.bin"); 59 + MODULE_FIRMWARE("radeon/hawaii_mc.bin"); 60 + MODULE_FIRMWARE("radeon/hawaii_rlc.bin"); 61 + MODULE_FIRMWARE("radeon/hawaii_sdma.bin"); 62 + MODULE_FIRMWARE("radeon/hawaii_smc.bin"); 63 + 64 64 MODULE_FIRMWARE("radeon/KAVERI_pfp.bin"); 65 65 MODULE_FIRMWARE("radeon/KAVERI_me.bin"); 66 66 MODULE_FIRMWARE("radeon/KAVERI_ce.bin"); 67 67 MODULE_FIRMWARE("radeon/KAVERI_mec.bin"); 68 68 MODULE_FIRMWARE("radeon/KAVERI_rlc.bin"); 69 69 MODULE_FIRMWARE("radeon/KAVERI_sdma.bin"); 70 + 71 + MODULE_FIRMWARE("radeon/kaveri_pfp.bin"); 72 + MODULE_FIRMWARE("radeon/kaveri_me.bin"); 73 + MODULE_FIRMWARE("radeon/kaveri_ce.bin"); 74 + MODULE_FIRMWARE("radeon/kaveri_mec.bin"); 75 + MODULE_FIRMWARE("radeon/kaveri_mec2.bin"); 76 + MODULE_FIRMWARE("radeon/kaveri_rlc.bin"); 77 + MODULE_FIRMWARE("radeon/kaveri_sdma.bin"); 78 + 70 79 MODULE_FIRMWARE("radeon/KABINI_pfp.bin"); 71 80 MODULE_FIRMWARE("radeon/KABINI_me.bin"); 72 81 MODULE_FIRMWARE("radeon/KABINI_ce.bin"); 73 82 MODULE_FIRMWARE("radeon/KABINI_mec.bin"); 74 83 MODULE_FIRMWARE("radeon/KABINI_rlc.bin"); 75 84 MODULE_FIRMWARE("radeon/KABINI_sdma.bin"); 85 + 86 + MODULE_FIRMWARE("radeon/kabini_pfp.bin"); 87 + MODULE_FIRMWARE("radeon/kabini_me.bin"); 88 + MODULE_FIRMWARE("radeon/kabini_ce.bin"); 89 + MODULE_FIRMWARE("radeon/kabini_mec.bin"); 90 + MODULE_FIRMWARE("radeon/kabini_rlc.bin"); 91 + MODULE_FIRMWARE("radeon/kabini_sdma.bin"); 92 + 76 93 MODULE_FIRMWARE("radeon/MULLINS_pfp.bin"); 77 94 MODULE_FIRMWARE("radeon/MULLINS_me.bin"); 78 95 MODULE_FIRMWARE("radeon/MULLINS_ce.bin"); 79 96 MODULE_FIRMWARE("radeon/MULLINS_mec.bin"); 80 97 MODULE_FIRMWARE("radeon/MULLINS_rlc.bin"); 81 98 MODULE_FIRMWARE("radeon/MULLINS_sdma.bin"); 99 + 100 + MODULE_FIRMWARE("radeon/mullins_pfp.bin"); 101 + MODULE_FIRMWARE("radeon/mullins_me.bin"); 102 + MODULE_FIRMWARE("radeon/mullins_ce.bin"); 103 + MODULE_FIRMWARE("radeon/mullins_mec.bin"); 104 + MODULE_FIRMWARE("radeon/mullins_rlc.bin"); 105 + MODULE_FIRMWARE("radeon/mullins_sdma.bin"); 82 106 83 107 extern int r600_ih_ring_alloc(struct radeon_device *rdev); 84 108 extern void r600_ih_ring_fini(struct radeon_device *rdev); ··· 1804 1760 */ 1805 1761 int ci_mc_load_microcode(struct radeon_device *rdev) 1806 1762 { 1807 - const __be32 *fw_data; 1763 + const __be32 *fw_data = NULL; 1764 + const __le32 *new_fw_data = NULL; 1808 1765 u32 running, blackout = 0; 1809 - u32 *io_mc_regs; 1766 + u32 *io_mc_regs = NULL; 1767 + const __le32 *new_io_mc_regs = NULL; 1810 1768 int i, regs_size, ucode_size; 1811 1769 1812 1770 if (!rdev->mc_fw) 1813 1771 return -EINVAL; 1814 1772 1815 - ucode_size = rdev->mc_fw->size / 4; 1773 + if (rdev->new_fw) { 1774 + const struct mc_firmware_header_v1_0 *hdr = 1775 + (const struct mc_firmware_header_v1_0 *)rdev->mc_fw->data; 1816 1776 1817 - switch (rdev->family) { 1818 - case CHIP_BONAIRE: 1819 - io_mc_regs = (u32 *)&bonaire_io_mc_regs; 1820 - regs_size = BONAIRE_IO_MC_REGS_SIZE; 1821 - break; 1822 - case CHIP_HAWAII: 1823 - io_mc_regs = (u32 *)&hawaii_io_mc_regs; 1824 - regs_size = HAWAII_IO_MC_REGS_SIZE; 1825 - break; 1826 - default: 1827 - return -EINVAL; 1777 + radeon_ucode_print_mc_hdr(&hdr->header); 1778 + 1779 + regs_size = le32_to_cpu(hdr->io_debug_size_bytes) / (4 * 2); 1780 + new_io_mc_regs = (const __le32 *) 1781 + (rdev->mc_fw->data + le32_to_cpu(hdr->io_debug_array_offset_bytes)); 1782 + ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; 1783 + new_fw_data = (const __le32 *) 1784 + (rdev->mc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes)); 1785 + } else { 1786 + ucode_size = rdev->mc_fw->size / 4; 1787 + 1788 + switch (rdev->family) { 1789 + case CHIP_BONAIRE: 1790 + io_mc_regs = (u32 *)&bonaire_io_mc_regs; 1791 + regs_size = BONAIRE_IO_MC_REGS_SIZE; 1792 + break; 1793 + case CHIP_HAWAII: 1794 + io_mc_regs = (u32 *)&hawaii_io_mc_regs; 1795 + regs_size = HAWAII_IO_MC_REGS_SIZE; 1796 + break; 1797 + default: 1798 + return -EINVAL; 1799 + } 1800 + fw_data = (const __be32 *)rdev->mc_fw->data; 1828 1801 } 1829 1802 1830 1803 running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK; ··· 1858 1797 1859 1798 /* load mc io regs */ 1860 1799 for (i = 0; i < regs_size; i++) { 1861 - WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]); 1862 - WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]); 1800 + if (rdev->new_fw) { 1801 + WREG32(MC_SEQ_IO_DEBUG_INDEX, le32_to_cpup(new_io_mc_regs++)); 1802 + WREG32(MC_SEQ_IO_DEBUG_DATA, le32_to_cpup(new_io_mc_regs++)); 1803 + } else { 1804 + WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]); 1805 + WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]); 1806 + } 1863 1807 } 1864 1808 /* load the MC ucode */ 1865 - fw_data = (const __be32 *)rdev->mc_fw->data; 1866 - for (i = 0; i < ucode_size; i++) 1867 - WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++)); 1809 + for (i = 0; i < ucode_size; i++) { 1810 + if (rdev->new_fw) 1811 + WREG32(MC_SEQ_SUP_PGM, le32_to_cpup(new_fw_data++)); 1812 + else 1813 + WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++)); 1814 + } 1868 1815 1869 1816 /* put the engine back into the active state */ 1870 1817 WREG32(MC_SEQ_SUP_CNTL, 0x00000008); ··· 1910 1841 static int cik_init_microcode(struct radeon_device *rdev) 1911 1842 { 1912 1843 const char *chip_name; 1844 + const char *new_chip_name; 1913 1845 size_t pfp_req_size, me_req_size, ce_req_size, 1914 1846 mec_req_size, rlc_req_size, mc_req_size = 0, 1915 1847 sdma_req_size, smc_req_size = 0, mc2_req_size = 0; 1916 1848 char fw_name[30]; 1849 + int new_fw = 0; 1917 1850 int err; 1851 + int num_fw; 1918 1852 1919 1853 DRM_DEBUG("\n"); 1920 1854 1921 1855 switch (rdev->family) { 1922 1856 case CHIP_BONAIRE: 1923 1857 chip_name = "BONAIRE"; 1858 + new_chip_name = "bonaire"; 1924 1859 pfp_req_size = CIK_PFP_UCODE_SIZE * 4; 1925 1860 me_req_size = CIK_ME_UCODE_SIZE * 4; 1926 1861 ce_req_size = CIK_CE_UCODE_SIZE * 4; ··· 1934 1861 mc2_req_size = BONAIRE_MC2_UCODE_SIZE * 4; 1935 1862 sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; 1936 1863 smc_req_size = ALIGN(BONAIRE_SMC_UCODE_SIZE, 4); 1864 + num_fw = 8; 1937 1865 break; 1938 1866 case CHIP_HAWAII: 1939 1867 chip_name = "HAWAII"; 1868 + new_chip_name = "hawaii"; 1940 1869 pfp_req_size = CIK_PFP_UCODE_SIZE * 4; 1941 1870 me_req_size = CIK_ME_UCODE_SIZE * 4; 1942 1871 ce_req_size = CIK_CE_UCODE_SIZE * 4; ··· 1948 1873 mc2_req_size = HAWAII_MC2_UCODE_SIZE * 4; 1949 1874 sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; 1950 1875 smc_req_size = ALIGN(HAWAII_SMC_UCODE_SIZE, 4); 1876 + num_fw = 8; 1951 1877 break; 1952 1878 case CHIP_KAVERI: 1953 1879 chip_name = "KAVERI"; 1880 + new_chip_name = "kaveri"; 1954 1881 pfp_req_size = CIK_PFP_UCODE_SIZE * 4; 1955 1882 me_req_size = CIK_ME_UCODE_SIZE * 4; 1956 1883 ce_req_size = CIK_CE_UCODE_SIZE * 4; 1957 1884 mec_req_size = CIK_MEC_UCODE_SIZE * 4; 1958 1885 rlc_req_size = KV_RLC_UCODE_SIZE * 4; 1959 1886 sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; 1887 + num_fw = 7; 1960 1888 break; 1961 1889 case CHIP_KABINI: 1962 1890 chip_name = "KABINI"; 1891 + new_chip_name = "kabini"; 1963 1892 pfp_req_size = CIK_PFP_UCODE_SIZE * 4; 1964 1893 me_req_size = CIK_ME_UCODE_SIZE * 4; 1965 1894 ce_req_size = CIK_CE_UCODE_SIZE * 4; 1966 1895 mec_req_size = CIK_MEC_UCODE_SIZE * 4; 1967 1896 rlc_req_size = KB_RLC_UCODE_SIZE * 4; 1968 1897 sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; 1898 + num_fw = 6; 1969 1899 break; 1970 1900 case CHIP_MULLINS: 1971 1901 chip_name = "MULLINS"; 1902 + new_chip_name = "mullins"; 1972 1903 pfp_req_size = CIK_PFP_UCODE_SIZE * 4; 1973 1904 me_req_size = CIK_ME_UCODE_SIZE * 4; 1974 1905 ce_req_size = CIK_CE_UCODE_SIZE * 4; 1975 1906 mec_req_size = CIK_MEC_UCODE_SIZE * 4; 1976 1907 rlc_req_size = ML_RLC_UCODE_SIZE * 4; 1977 1908 sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; 1909 + num_fw = 6; 1978 1910 break; 1979 1911 default: BUG(); 1980 1912 } 1981 1913 1982 - DRM_INFO("Loading %s Microcode\n", chip_name); 1914 + DRM_INFO("Loading %s Microcode\n", new_chip_name); 1983 1915 1984 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name); 1916 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", new_chip_name); 1985 1917 err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev); 1986 - if (err) 1987 - goto out; 1988 - if (rdev->pfp_fw->size != pfp_req_size) { 1989 - printk(KERN_ERR 1990 - "cik_cp: Bogus length %zu in firmware \"%s\"\n", 1991 - rdev->pfp_fw->size, fw_name); 1992 - err = -EINVAL; 1993 - goto out; 1918 + if (err) { 1919 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name); 1920 + err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev); 1921 + if (err) 1922 + goto out; 1923 + if (rdev->pfp_fw->size != pfp_req_size) { 1924 + printk(KERN_ERR 1925 + "cik_cp: Bogus length %zu in firmware \"%s\"\n", 1926 + rdev->pfp_fw->size, fw_name); 1927 + err = -EINVAL; 1928 + goto out; 1929 + } 1930 + } else { 1931 + err = radeon_ucode_validate(rdev->pfp_fw); 1932 + if (err) { 1933 + printk(KERN_ERR 1934 + "cik_fw: validation failed for firmware \"%s\"\n", 1935 + fw_name); 1936 + goto out; 1937 + } else { 1938 + new_fw++; 1939 + } 1994 1940 } 1995 1941 1996 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name); 1942 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", new_chip_name); 1997 1943 err = request_firmware(&rdev->me_fw, fw_name, rdev->dev); 1998 - if (err) 1999 - goto out; 2000 - if (rdev->me_fw->size != me_req_size) { 2001 - printk(KERN_ERR 2002 - "cik_cp: Bogus length %zu in firmware \"%s\"\n", 2003 - rdev->me_fw->size, fw_name); 2004 - err = -EINVAL; 1944 + if (err) { 1945 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name); 1946 + err = request_firmware(&rdev->me_fw, fw_name, rdev->dev); 1947 + if (err) 1948 + goto out; 1949 + if (rdev->me_fw->size != me_req_size) { 1950 + printk(KERN_ERR 1951 + "cik_cp: Bogus length %zu in firmware \"%s\"\n", 1952 + rdev->me_fw->size, fw_name); 1953 + err = -EINVAL; 1954 + } 1955 + } else { 1956 + err = radeon_ucode_validate(rdev->me_fw); 1957 + if (err) { 1958 + printk(KERN_ERR 1959 + "cik_fw: validation failed for firmware \"%s\"\n", 1960 + fw_name); 1961 + goto out; 1962 + } else { 1963 + new_fw++; 1964 + } 2005 1965 } 2006 1966 2007 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name); 1967 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", new_chip_name); 2008 1968 err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev); 2009 - if (err) 2010 - goto out; 2011 - if (rdev->ce_fw->size != ce_req_size) { 2012 - printk(KERN_ERR 2013 - "cik_cp: Bogus length %zu in firmware \"%s\"\n", 2014 - rdev->ce_fw->size, fw_name); 2015 - err = -EINVAL; 1969 + if (err) { 1970 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name); 1971 + err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev); 1972 + if (err) 1973 + goto out; 1974 + if (rdev->ce_fw->size != ce_req_size) { 1975 + printk(KERN_ERR 1976 + "cik_cp: Bogus length %zu in firmware \"%s\"\n", 1977 + rdev->ce_fw->size, fw_name); 1978 + err = -EINVAL; 1979 + } 1980 + } else { 1981 + err = radeon_ucode_validate(rdev->ce_fw); 1982 + if (err) { 1983 + printk(KERN_ERR 1984 + "cik_fw: validation failed for firmware \"%s\"\n", 1985 + fw_name); 1986 + goto out; 1987 + } else { 1988 + new_fw++; 1989 + } 2016 1990 } 2017 1991 2018 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", chip_name); 1992 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", new_chip_name); 2019 1993 err = request_firmware(&rdev->mec_fw, fw_name, rdev->dev); 2020 - if (err) 2021 - goto out; 2022 - if (rdev->mec_fw->size != mec_req_size) { 2023 - printk(KERN_ERR 2024 - "cik_cp: Bogus length %zu in firmware \"%s\"\n", 2025 - rdev->mec_fw->size, fw_name); 2026 - err = -EINVAL; 1994 + if (err) { 1995 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", chip_name); 1996 + err = request_firmware(&rdev->mec_fw, fw_name, rdev->dev); 1997 + if (err) 1998 + goto out; 1999 + if (rdev->mec_fw->size != mec_req_size) { 2000 + printk(KERN_ERR 2001 + "cik_cp: Bogus length %zu in firmware \"%s\"\n", 2002 + rdev->mec_fw->size, fw_name); 2003 + err = -EINVAL; 2004 + } 2005 + } else { 2006 + err = radeon_ucode_validate(rdev->mec_fw); 2007 + if (err) { 2008 + printk(KERN_ERR 2009 + "cik_fw: validation failed for firmware \"%s\"\n", 2010 + fw_name); 2011 + goto out; 2012 + } else { 2013 + new_fw++; 2014 + } 2027 2015 } 2028 2016 2029 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name); 2017 + if (rdev->family == CHIP_KAVERI) { 2018 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec2.bin", new_chip_name); 2019 + err = request_firmware(&rdev->mec2_fw, fw_name, rdev->dev); 2020 + if (err) { 2021 + goto out; 2022 + } else { 2023 + err = radeon_ucode_validate(rdev->mec2_fw); 2024 + if (err) { 2025 + goto out; 2026 + } else { 2027 + new_fw++; 2028 + } 2029 + } 2030 + } 2031 + 2032 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", new_chip_name); 2030 2033 err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev); 2031 - if (err) 2032 - goto out; 2033 - if (rdev->rlc_fw->size != rlc_req_size) { 2034 - printk(KERN_ERR 2035 - "cik_rlc: Bogus length %zu in firmware \"%s\"\n", 2036 - rdev->rlc_fw->size, fw_name); 2037 - err = -EINVAL; 2034 + if (err) { 2035 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name); 2036 + err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev); 2037 + if (err) 2038 + goto out; 2039 + if (rdev->rlc_fw->size != rlc_req_size) { 2040 + printk(KERN_ERR 2041 + "cik_rlc: Bogus length %zu in firmware \"%s\"\n", 2042 + rdev->rlc_fw->size, fw_name); 2043 + err = -EINVAL; 2044 + } 2045 + } else { 2046 + err = radeon_ucode_validate(rdev->rlc_fw); 2047 + if (err) { 2048 + printk(KERN_ERR 2049 + "cik_fw: validation failed for firmware \"%s\"\n", 2050 + fw_name); 2051 + goto out; 2052 + } else { 2053 + new_fw++; 2054 + } 2038 2055 } 2039 2056 2040 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma.bin", chip_name); 2057 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma.bin", new_chip_name); 2041 2058 err = request_firmware(&rdev->sdma_fw, fw_name, rdev->dev); 2042 - if (err) 2043 - goto out; 2044 - if (rdev->sdma_fw->size != sdma_req_size) { 2045 - printk(KERN_ERR 2046 - "cik_sdma: Bogus length %zu in firmware \"%s\"\n", 2047 - rdev->sdma_fw->size, fw_name); 2048 - err = -EINVAL; 2059 + if (err) { 2060 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma.bin", chip_name); 2061 + err = request_firmware(&rdev->sdma_fw, fw_name, rdev->dev); 2062 + if (err) 2063 + goto out; 2064 + if (rdev->sdma_fw->size != sdma_req_size) { 2065 + printk(KERN_ERR 2066 + "cik_sdma: Bogus length %zu in firmware \"%s\"\n", 2067 + rdev->sdma_fw->size, fw_name); 2068 + err = -EINVAL; 2069 + } 2070 + } else { 2071 + err = radeon_ucode_validate(rdev->sdma_fw); 2072 + if (err) { 2073 + printk(KERN_ERR 2074 + "cik_fw: validation failed for firmware \"%s\"\n", 2075 + fw_name); 2076 + goto out; 2077 + } else { 2078 + new_fw++; 2079 + } 2049 2080 } 2050 2081 2051 2082 /* No SMC, MC ucode on APUs */ 2052 2083 if (!(rdev->flags & RADEON_IS_IGP)) { 2053 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc2.bin", chip_name); 2084 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", new_chip_name); 2054 2085 err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); 2055 2086 if (err) { 2056 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); 2087 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc2.bin", chip_name); 2057 2088 err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); 2058 - if (err) 2089 + if (err) { 2090 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); 2091 + err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); 2092 + if (err) 2093 + goto out; 2094 + } 2095 + if ((rdev->mc_fw->size != mc_req_size) && 2096 + (rdev->mc_fw->size != mc2_req_size)){ 2097 + printk(KERN_ERR 2098 + "cik_mc: Bogus length %zu in firmware \"%s\"\n", 2099 + rdev->mc_fw->size, fw_name); 2100 + err = -EINVAL; 2101 + } 2102 + DRM_INFO("%s: %zu bytes\n", fw_name, rdev->mc_fw->size); 2103 + } else { 2104 + err = radeon_ucode_validate(rdev->mc_fw); 2105 + if (err) { 2106 + printk(KERN_ERR 2107 + "cik_fw: validation failed for firmware \"%s\"\n", 2108 + fw_name); 2059 2109 goto out; 2110 + } else { 2111 + new_fw++; 2112 + } 2060 2113 } 2061 - if ((rdev->mc_fw->size != mc_req_size) && 2062 - (rdev->mc_fw->size != mc2_req_size)){ 2063 - printk(KERN_ERR 2064 - "cik_mc: Bogus length %zu in firmware \"%s\"\n", 2065 - rdev->mc_fw->size, fw_name); 2066 - err = -EINVAL; 2067 - } 2068 - DRM_INFO("%s: %zu bytes\n", fw_name, rdev->mc_fw->size); 2069 2114 2070 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name); 2115 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", new_chip_name); 2071 2116 err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); 2072 2117 if (err) { 2073 - printk(KERN_ERR 2074 - "smc: error loading firmware \"%s\"\n", 2075 - fw_name); 2076 - release_firmware(rdev->smc_fw); 2077 - rdev->smc_fw = NULL; 2078 - err = 0; 2079 - } else if (rdev->smc_fw->size != smc_req_size) { 2080 - printk(KERN_ERR 2081 - "cik_smc: Bogus length %zu in firmware \"%s\"\n", 2082 - rdev->smc_fw->size, fw_name); 2083 - err = -EINVAL; 2118 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name); 2119 + err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); 2120 + if (err) { 2121 + printk(KERN_ERR 2122 + "smc: error loading firmware \"%s\"\n", 2123 + fw_name); 2124 + release_firmware(rdev->smc_fw); 2125 + rdev->smc_fw = NULL; 2126 + err = 0; 2127 + } else if (rdev->smc_fw->size != smc_req_size) { 2128 + printk(KERN_ERR 2129 + "cik_smc: Bogus length %zu in firmware \"%s\"\n", 2130 + rdev->smc_fw->size, fw_name); 2131 + err = -EINVAL; 2132 + } 2133 + } else { 2134 + err = radeon_ucode_validate(rdev->smc_fw); 2135 + if (err) { 2136 + printk(KERN_ERR 2137 + "cik_fw: validation failed for firmware \"%s\"\n", 2138 + fw_name); 2139 + goto out; 2140 + } else { 2141 + new_fw++; 2142 + } 2084 2143 } 2144 + } 2145 + 2146 + if (new_fw == 0) { 2147 + rdev->new_fw = false; 2148 + } else if (new_fw < num_fw) { 2149 + printk(KERN_ERR "ci_fw: mixing new and old firmware!\n"); 2150 + err = -EINVAL; 2151 + } else { 2152 + rdev->new_fw = true; 2085 2153 } 2086 2154 2087 2155 out: ··· 2239 2021 rdev->me_fw = NULL; 2240 2022 release_firmware(rdev->ce_fw); 2241 2023 rdev->ce_fw = NULL; 2024 + release_firmware(rdev->mec_fw); 2025 + rdev->mec_fw = NULL; 2026 + release_firmware(rdev->mec2_fw); 2027 + rdev->mec2_fw = NULL; 2242 2028 release_firmware(rdev->rlc_fw); 2243 2029 rdev->rlc_fw = NULL; 2030 + release_firmware(rdev->sdma_fw); 2031 + rdev->sdma_fw = NULL; 2244 2032 release_firmware(rdev->mc_fw); 2245 2033 rdev->mc_fw = NULL; 2246 2034 release_firmware(rdev->smc_fw); ··· 3890 3666 radeon_ring_write(ring, (upper_32_bits(addr) & 0xffff) | DATA_SEL(1) | INT_SEL(2)); 3891 3667 radeon_ring_write(ring, fence->seq); 3892 3668 radeon_ring_write(ring, 0); 3893 - /* HDP flush */ 3894 - cik_hdp_flush_cp_ring_emit(rdev, fence->ring); 3895 3669 } 3896 3670 3897 3671 /** ··· 3918 3696 radeon_ring_write(ring, upper_32_bits(addr)); 3919 3697 radeon_ring_write(ring, fence->seq); 3920 3698 radeon_ring_write(ring, 0); 3921 - /* HDP flush */ 3922 - cik_hdp_flush_cp_ring_emit(rdev, fence->ring); 3923 3699 } 3924 3700 3925 3701 bool cik_semaphore_ring_emit(struct radeon_device *rdev, ··· 4189 3969 */ 4190 3970 static int cik_cp_gfx_load_microcode(struct radeon_device *rdev) 4191 3971 { 4192 - const __be32 *fw_data; 4193 3972 int i; 4194 3973 4195 3974 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw) ··· 4196 3977 4197 3978 cik_cp_gfx_enable(rdev, false); 4198 3979 4199 - /* PFP */ 4200 - fw_data = (const __be32 *)rdev->pfp_fw->data; 4201 - WREG32(CP_PFP_UCODE_ADDR, 0); 4202 - for (i = 0; i < CIK_PFP_UCODE_SIZE; i++) 4203 - WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++)); 4204 - WREG32(CP_PFP_UCODE_ADDR, 0); 3980 + if (rdev->new_fw) { 3981 + const struct gfx_firmware_header_v1_0 *pfp_hdr = 3982 + (const struct gfx_firmware_header_v1_0 *)rdev->pfp_fw->data; 3983 + const struct gfx_firmware_header_v1_0 *ce_hdr = 3984 + (const struct gfx_firmware_header_v1_0 *)rdev->ce_fw->data; 3985 + const struct gfx_firmware_header_v1_0 *me_hdr = 3986 + (const struct gfx_firmware_header_v1_0 *)rdev->me_fw->data; 3987 + const __le32 *fw_data; 3988 + u32 fw_size; 4205 3989 4206 - /* CE */ 4207 - fw_data = (const __be32 *)rdev->ce_fw->data; 4208 - WREG32(CP_CE_UCODE_ADDR, 0); 4209 - for (i = 0; i < CIK_CE_UCODE_SIZE; i++) 4210 - WREG32(CP_CE_UCODE_DATA, be32_to_cpup(fw_data++)); 4211 - WREG32(CP_CE_UCODE_ADDR, 0); 3990 + radeon_ucode_print_gfx_hdr(&pfp_hdr->header); 3991 + radeon_ucode_print_gfx_hdr(&ce_hdr->header); 3992 + radeon_ucode_print_gfx_hdr(&me_hdr->header); 4212 3993 4213 - /* ME */ 4214 - fw_data = (const __be32 *)rdev->me_fw->data; 4215 - WREG32(CP_ME_RAM_WADDR, 0); 4216 - for (i = 0; i < CIK_ME_UCODE_SIZE; i++) 4217 - WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++)); 4218 - WREG32(CP_ME_RAM_WADDR, 0); 3994 + /* PFP */ 3995 + fw_data = (const __le32 *) 3996 + (rdev->pfp_fw->data + le32_to_cpu(pfp_hdr->header.ucode_array_offset_bytes)); 3997 + fw_size = le32_to_cpu(pfp_hdr->header.ucode_size_bytes) / 4; 3998 + WREG32(CP_PFP_UCODE_ADDR, 0); 3999 + for (i = 0; i < fw_size; i++) 4000 + WREG32(CP_PFP_UCODE_DATA, le32_to_cpup(fw_data++)); 4001 + WREG32(CP_PFP_UCODE_ADDR, 0); 4002 + 4003 + /* CE */ 4004 + fw_data = (const __le32 *) 4005 + (rdev->ce_fw->data + le32_to_cpu(ce_hdr->header.ucode_array_offset_bytes)); 4006 + fw_size = le32_to_cpu(ce_hdr->header.ucode_size_bytes) / 4; 4007 + WREG32(CP_CE_UCODE_ADDR, 0); 4008 + for (i = 0; i < fw_size; i++) 4009 + WREG32(CP_CE_UCODE_DATA, le32_to_cpup(fw_data++)); 4010 + WREG32(CP_CE_UCODE_ADDR, 0); 4011 + 4012 + /* ME */ 4013 + fw_data = (const __be32 *) 4014 + (rdev->me_fw->data + le32_to_cpu(me_hdr->header.ucode_array_offset_bytes)); 4015 + fw_size = le32_to_cpu(me_hdr->header.ucode_size_bytes) / 4; 4016 + WREG32(CP_ME_RAM_WADDR, 0); 4017 + for (i = 0; i < fw_size; i++) 4018 + WREG32(CP_ME_RAM_DATA, le32_to_cpup(fw_data++)); 4019 + WREG32(CP_ME_RAM_WADDR, 0); 4020 + } else { 4021 + const __be32 *fw_data; 4022 + 4023 + /* PFP */ 4024 + fw_data = (const __be32 *)rdev->pfp_fw->data; 4025 + WREG32(CP_PFP_UCODE_ADDR, 0); 4026 + for (i = 0; i < CIK_PFP_UCODE_SIZE; i++) 4027 + WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++)); 4028 + WREG32(CP_PFP_UCODE_ADDR, 0); 4029 + 4030 + /* CE */ 4031 + fw_data = (const __be32 *)rdev->ce_fw->data; 4032 + WREG32(CP_CE_UCODE_ADDR, 0); 4033 + for (i = 0; i < CIK_CE_UCODE_SIZE; i++) 4034 + WREG32(CP_CE_UCODE_DATA, be32_to_cpup(fw_data++)); 4035 + WREG32(CP_CE_UCODE_ADDR, 0); 4036 + 4037 + /* ME */ 4038 + fw_data = (const __be32 *)rdev->me_fw->data; 4039 + WREG32(CP_ME_RAM_WADDR, 0); 4040 + for (i = 0; i < CIK_ME_UCODE_SIZE; i++) 4041 + WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++)); 4042 + WREG32(CP_ME_RAM_WADDR, 0); 4043 + } 4219 4044 4220 4045 WREG32(CP_PFP_UCODE_ADDR, 0); 4221 4046 WREG32(CP_CE_UCODE_ADDR, 0); ··· 4524 4261 */ 4525 4262 static int cik_cp_compute_load_microcode(struct radeon_device *rdev) 4526 4263 { 4527 - const __be32 *fw_data; 4528 4264 int i; 4529 4265 4530 4266 if (!rdev->mec_fw) ··· 4531 4269 4532 4270 cik_cp_compute_enable(rdev, false); 4533 4271 4534 - /* MEC1 */ 4535 - fw_data = (const __be32 *)rdev->mec_fw->data; 4536 - WREG32(CP_MEC_ME1_UCODE_ADDR, 0); 4537 - for (i = 0; i < CIK_MEC_UCODE_SIZE; i++) 4538 - WREG32(CP_MEC_ME1_UCODE_DATA, be32_to_cpup(fw_data++)); 4539 - WREG32(CP_MEC_ME1_UCODE_ADDR, 0); 4272 + if (rdev->new_fw) { 4273 + const struct gfx_firmware_header_v1_0 *mec_hdr = 4274 + (const struct gfx_firmware_header_v1_0 *)rdev->mec_fw->data; 4275 + const __le32 *fw_data; 4276 + u32 fw_size; 4540 4277 4541 - if (rdev->family == CHIP_KAVERI) { 4278 + radeon_ucode_print_gfx_hdr(&mec_hdr->header); 4279 + 4280 + /* MEC1 */ 4281 + fw_data = (const __le32 *) 4282 + (rdev->mec_fw->data + le32_to_cpu(mec_hdr->header.ucode_array_offset_bytes)); 4283 + fw_size = le32_to_cpu(mec_hdr->header.ucode_size_bytes) / 4; 4284 + WREG32(CP_MEC_ME1_UCODE_ADDR, 0); 4285 + for (i = 0; i < fw_size; i++) 4286 + WREG32(CP_MEC_ME1_UCODE_DATA, le32_to_cpup(fw_data++)); 4287 + WREG32(CP_MEC_ME1_UCODE_ADDR, 0); 4288 + 4542 4289 /* MEC2 */ 4290 + if (rdev->family == CHIP_KAVERI) { 4291 + const struct gfx_firmware_header_v1_0 *mec2_hdr = 4292 + (const struct gfx_firmware_header_v1_0 *)rdev->mec2_fw->data; 4293 + 4294 + fw_data = (const __le32 *) 4295 + (rdev->mec2_fw->data + 4296 + le32_to_cpu(mec2_hdr->header.ucode_array_offset_bytes)); 4297 + fw_size = le32_to_cpu(mec2_hdr->header.ucode_size_bytes) / 4; 4298 + WREG32(CP_MEC_ME2_UCODE_ADDR, 0); 4299 + for (i = 0; i < fw_size; i++) 4300 + WREG32(CP_MEC_ME2_UCODE_DATA, le32_to_cpup(fw_data++)); 4301 + WREG32(CP_MEC_ME2_UCODE_ADDR, 0); 4302 + } 4303 + } else { 4304 + const __be32 *fw_data; 4305 + 4306 + /* MEC1 */ 4543 4307 fw_data = (const __be32 *)rdev->mec_fw->data; 4544 - WREG32(CP_MEC_ME2_UCODE_ADDR, 0); 4308 + WREG32(CP_MEC_ME1_UCODE_ADDR, 0); 4545 4309 for (i = 0; i < CIK_MEC_UCODE_SIZE; i++) 4546 - WREG32(CP_MEC_ME2_UCODE_DATA, be32_to_cpup(fw_data++)); 4547 - WREG32(CP_MEC_ME2_UCODE_ADDR, 0); 4310 + WREG32(CP_MEC_ME1_UCODE_DATA, be32_to_cpup(fw_data++)); 4311 + WREG32(CP_MEC_ME1_UCODE_ADDR, 0); 4312 + 4313 + if (rdev->family == CHIP_KAVERI) { 4314 + /* MEC2 */ 4315 + fw_data = (const __be32 *)rdev->mec_fw->data; 4316 + WREG32(CP_MEC_ME2_UCODE_ADDR, 0); 4317 + for (i = 0; i < CIK_MEC_UCODE_SIZE; i++) 4318 + WREG32(CP_MEC_ME2_UCODE_DATA, be32_to_cpup(fw_data++)); 4319 + WREG32(CP_MEC_ME2_UCODE_ADDR, 0); 4320 + } 4548 4321 } 4549 4322 4550 4323 return 0; ··· 4672 4375 r = radeon_bo_create(rdev, 4673 4376 rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2, 4674 4377 PAGE_SIZE, true, 4675 - RADEON_GEM_DOMAIN_GTT, NULL, 4378 + RADEON_GEM_DOMAIN_GTT, 0, NULL, 4676 4379 &rdev->mec.hpd_eop_obj); 4677 4380 if (r) { 4678 4381 dev_warn(rdev->dev, "(%d) create HDP EOP bo failed\n", r); ··· 4842 4545 r = radeon_bo_create(rdev, 4843 4546 sizeof(struct bonaire_mqd), 4844 4547 PAGE_SIZE, true, 4845 - RADEON_GEM_DOMAIN_GTT, NULL, 4548 + RADEON_GEM_DOMAIN_GTT, 0, NULL, 4846 4549 &rdev->ring[idx].mqd_obj); 4847 4550 if (r) { 4848 4551 dev_warn(rdev->dev, "(%d) create MQD bo failed\n", r); ··· 5699 5402 r = radeon_gart_table_vram_pin(rdev); 5700 5403 if (r) 5701 5404 return r; 5702 - radeon_gart_restore(rdev); 5703 5405 /* Setup TLB control */ 5704 5406 WREG32(MC_VM_MX_L1_TLB_CNTL, 5705 5407 (0xA << 7) | ··· 5938 5642 void cik_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) 5939 5643 { 5940 5644 struct radeon_ring *ring = &rdev->ring[ridx]; 5645 + int usepfp = (ridx == RADEON_RING_TYPE_GFX_INDEX); 5941 5646 5942 5647 if (vm == NULL) 5943 5648 return; 5944 5649 5945 5650 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); 5946 - radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) | 5651 + radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) | 5947 5652 WRITE_DATA_DST_SEL(0))); 5948 5653 if (vm->id < 8) { 5949 5654 radeon_ring_write(ring, ··· 5994 5697 radeon_ring_write(ring, 1 << vm->id); 5995 5698 5996 5699 /* compute doesn't have PFP */ 5997 - if (ridx == RADEON_RING_TYPE_GFX_INDEX) { 5700 + if (usepfp) { 5998 5701 /* sync PFP to ME, otherwise we might get invalid PFP reads */ 5999 5702 radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); 6000 5703 radeon_ring_write(ring, 0x0); ··· 6162 5865 static int cik_rlc_resume(struct radeon_device *rdev) 6163 5866 { 6164 5867 u32 i, size, tmp; 6165 - const __be32 *fw_data; 6166 5868 6167 5869 if (!rdev->rlc_fw) 6168 5870 return -EINVAL; 6169 - 6170 - switch (rdev->family) { 6171 - case CHIP_BONAIRE: 6172 - case CHIP_HAWAII: 6173 - default: 6174 - size = BONAIRE_RLC_UCODE_SIZE; 6175 - break; 6176 - case CHIP_KAVERI: 6177 - size = KV_RLC_UCODE_SIZE; 6178 - break; 6179 - case CHIP_KABINI: 6180 - size = KB_RLC_UCODE_SIZE; 6181 - break; 6182 - case CHIP_MULLINS: 6183 - size = ML_RLC_UCODE_SIZE; 6184 - break; 6185 - } 6186 5871 6187 5872 cik_rlc_stop(rdev); 6188 5873 ··· 6189 5910 WREG32(RLC_MC_CNTL, 0); 6190 5911 WREG32(RLC_UCODE_CNTL, 0); 6191 5912 6192 - fw_data = (const __be32 *)rdev->rlc_fw->data; 5913 + if (rdev->new_fw) { 5914 + const struct rlc_firmware_header_v1_0 *hdr = 5915 + (const struct rlc_firmware_header_v1_0 *)rdev->rlc_fw->data; 5916 + const __le32 *fw_data = (const __le32 *) 5917 + (rdev->rlc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes)); 5918 + 5919 + radeon_ucode_print_rlc_hdr(&hdr->header); 5920 + 5921 + size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; 6193 5922 WREG32(RLC_GPM_UCODE_ADDR, 0); 6194 - for (i = 0; i < size; i++) 6195 - WREG32(RLC_GPM_UCODE_DATA, be32_to_cpup(fw_data++)); 6196 - WREG32(RLC_GPM_UCODE_ADDR, 0); 5923 + for (i = 0; i < size; i++) 5924 + WREG32(RLC_GPM_UCODE_DATA, le32_to_cpup(fw_data++)); 5925 + WREG32(RLC_GPM_UCODE_ADDR, 0); 5926 + } else { 5927 + const __be32 *fw_data; 5928 + 5929 + switch (rdev->family) { 5930 + case CHIP_BONAIRE: 5931 + case CHIP_HAWAII: 5932 + default: 5933 + size = BONAIRE_RLC_UCODE_SIZE; 5934 + break; 5935 + case CHIP_KAVERI: 5936 + size = KV_RLC_UCODE_SIZE; 5937 + break; 5938 + case CHIP_KABINI: 5939 + size = KB_RLC_UCODE_SIZE; 5940 + break; 5941 + case CHIP_MULLINS: 5942 + size = ML_RLC_UCODE_SIZE; 5943 + break; 5944 + } 5945 + 5946 + fw_data = (const __be32 *)rdev->rlc_fw->data; 5947 + WREG32(RLC_GPM_UCODE_ADDR, 0); 5948 + for (i = 0; i < size; i++) 5949 + WREG32(RLC_GPM_UCODE_DATA, be32_to_cpup(fw_data++)); 5950 + WREG32(RLC_GPM_UCODE_ADDR, 0); 5951 + } 6197 5952 6198 5953 /* XXX - find out what chips support lbpw */ 6199 5954 cik_enable_lbpw(rdev, false); ··· 6661 6348 6662 6349 void cik_init_cp_pg_table(struct radeon_device *rdev) 6663 6350 { 6664 - const __be32 *fw_data; 6665 6351 volatile u32 *dst_ptr; 6666 6352 int me, i, max_me = 4; 6667 6353 u32 bo_offset = 0; 6668 - u32 table_offset; 6354 + u32 table_offset, table_size; 6669 6355 6670 6356 if (rdev->family == CHIP_KAVERI) 6671 6357 max_me = 5; ··· 6675 6363 /* write the cp table buffer */ 6676 6364 dst_ptr = rdev->rlc.cp_table_ptr; 6677 6365 for (me = 0; me < max_me; me++) { 6678 - if (me == 0) { 6679 - fw_data = (const __be32 *)rdev->ce_fw->data; 6680 - table_offset = CP_ME_TABLE_OFFSET; 6681 - } else if (me == 1) { 6682 - fw_data = (const __be32 *)rdev->pfp_fw->data; 6683 - table_offset = CP_ME_TABLE_OFFSET; 6684 - } else if (me == 2) { 6685 - fw_data = (const __be32 *)rdev->me_fw->data; 6686 - table_offset = CP_ME_TABLE_OFFSET; 6687 - } else { 6688 - fw_data = (const __be32 *)rdev->mec_fw->data; 6689 - table_offset = CP_MEC_TABLE_OFFSET; 6690 - } 6366 + if (rdev->new_fw) { 6367 + const __le32 *fw_data; 6368 + const struct gfx_firmware_header_v1_0 *hdr; 6691 6369 6692 - for (i = 0; i < CP_ME_TABLE_SIZE; i ++) { 6693 - dst_ptr[bo_offset + i] = cpu_to_le32(be32_to_cpu(fw_data[table_offset + i])); 6370 + if (me == 0) { 6371 + hdr = (const struct gfx_firmware_header_v1_0 *)rdev->ce_fw->data; 6372 + fw_data = (const __le32 *) 6373 + (rdev->ce_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes)); 6374 + table_offset = le32_to_cpu(hdr->jt_offset); 6375 + table_size = le32_to_cpu(hdr->jt_size); 6376 + } else if (me == 1) { 6377 + hdr = (const struct gfx_firmware_header_v1_0 *)rdev->pfp_fw->data; 6378 + fw_data = (const __le32 *) 6379 + (rdev->pfp_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes)); 6380 + table_offset = le32_to_cpu(hdr->jt_offset); 6381 + table_size = le32_to_cpu(hdr->jt_size); 6382 + } else if (me == 2) { 6383 + hdr = (const struct gfx_firmware_header_v1_0 *)rdev->me_fw->data; 6384 + fw_data = (const __le32 *) 6385 + (rdev->me_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes)); 6386 + table_offset = le32_to_cpu(hdr->jt_offset); 6387 + table_size = le32_to_cpu(hdr->jt_size); 6388 + } else if (me == 3) { 6389 + hdr = (const struct gfx_firmware_header_v1_0 *)rdev->mec_fw->data; 6390 + fw_data = (const __le32 *) 6391 + (rdev->mec_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes)); 6392 + table_offset = le32_to_cpu(hdr->jt_offset); 6393 + table_size = le32_to_cpu(hdr->jt_size); 6394 + } else { 6395 + hdr = (const struct gfx_firmware_header_v1_0 *)rdev->mec2_fw->data; 6396 + fw_data = (const __le32 *) 6397 + (rdev->mec2_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes)); 6398 + table_offset = le32_to_cpu(hdr->jt_offset); 6399 + table_size = le32_to_cpu(hdr->jt_size); 6400 + } 6401 + 6402 + for (i = 0; i < table_size; i ++) { 6403 + dst_ptr[bo_offset + i] = 6404 + cpu_to_le32(le32_to_cpu(fw_data[table_offset + i])); 6405 + } 6406 + bo_offset += table_size; 6407 + } else { 6408 + const __be32 *fw_data; 6409 + table_size = CP_ME_TABLE_SIZE; 6410 + 6411 + if (me == 0) { 6412 + fw_data = (const __be32 *)rdev->ce_fw->data; 6413 + table_offset = CP_ME_TABLE_OFFSET; 6414 + } else if (me == 1) { 6415 + fw_data = (const __be32 *)rdev->pfp_fw->data; 6416 + table_offset = CP_ME_TABLE_OFFSET; 6417 + } else if (me == 2) { 6418 + fw_data = (const __be32 *)rdev->me_fw->data; 6419 + table_offset = CP_ME_TABLE_OFFSET; 6420 + } else { 6421 + fw_data = (const __be32 *)rdev->mec_fw->data; 6422 + table_offset = CP_MEC_TABLE_OFFSET; 6423 + } 6424 + 6425 + for (i = 0; i < table_size; i ++) { 6426 + dst_ptr[bo_offset + i] = 6427 + cpu_to_le32(be32_to_cpu(fw_data[table_offset + i])); 6428 + } 6429 + bo_offset += table_size; 6694 6430 } 6695 - bo_offset += CP_ME_TABLE_SIZE; 6696 6431 } 6697 6432 } 6698 6433 ··· 7977 7618 case 16: /* D5 page flip */ 7978 7619 case 18: /* D6 page flip */ 7979 7620 DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1); 7980 - radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1); 7621 + if (radeon_use_pflipirq > 0) 7622 + radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1); 7981 7623 break; 7982 7624 case 42: /* HPD hotplug */ 7983 7625 switch (src_data) { ··· 8260 7900 static int cik_startup(struct radeon_device *rdev) 8261 7901 { 8262 7902 struct radeon_ring *ring; 7903 + u32 nop; 8263 7904 int r; 8264 7905 8265 7906 /* enable pcie gen2/3 link */ ··· 8394 8033 } 8395 8034 cik_irq_set(rdev); 8396 8035 8036 + if (rdev->family == CHIP_HAWAII) { 8037 + if (rdev->new_fw) 8038 + nop = PACKET3(PACKET3_NOP, 0x3FFF); 8039 + else 8040 + nop = RADEON_CP_PACKET2; 8041 + } else { 8042 + nop = PACKET3(PACKET3_NOP, 0x3FFF); 8043 + } 8044 + 8397 8045 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 8398 8046 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, 8399 - PACKET3(PACKET3_NOP, 0x3FFF)); 8047 + nop); 8400 8048 if (r) 8401 8049 return r; 8402 8050 ··· 8413 8043 /* type-2 packets are deprecated on MEC, use type-3 instead */ 8414 8044 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX]; 8415 8045 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP1_RPTR_OFFSET, 8416 - PACKET3(PACKET3_NOP, 0x3FFF)); 8046 + nop); 8417 8047 if (r) 8418 8048 return r; 8419 8049 ring->me = 1; /* first MEC */ ··· 8424 8054 /* type-2 packets are deprecated on MEC, use type-3 instead */ 8425 8055 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX]; 8426 8056 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP2_RPTR_OFFSET, 8427 - PACKET3(PACKET3_NOP, 0x3FFF)); 8057 + nop); 8428 8058 if (r) 8429 8059 return r; 8430 8060 /* dGPU only have 1 MEC */
+167 -82
drivers/gpu/drm/radeon/cik_sdma.c
··· 24 24 #include <linux/firmware.h> 25 25 #include <drm/drmP.h> 26 26 #include "radeon.h" 27 + #include "radeon_ucode.h" 27 28 #include "radeon_asic.h" 28 29 #include "radeon_trace.h" 29 30 #include "cikd.h" ··· 119 118 reg = SDMA0_GFX_RB_WPTR + SDMA1_REGISTER_OFFSET; 120 119 121 120 WREG32(reg, (ring->wptr << 2) & 0x3fffc); 121 + (void)RREG32(reg); 122 122 } 123 123 124 124 /** ··· 421 419 */ 422 420 static int cik_sdma_load_microcode(struct radeon_device *rdev) 423 421 { 424 - const __be32 *fw_data; 425 422 int i; 426 423 427 424 if (!rdev->sdma_fw) ··· 429 428 /* halt the MEs */ 430 429 cik_sdma_enable(rdev, false); 431 430 432 - /* sdma0 */ 433 - fw_data = (const __be32 *)rdev->sdma_fw->data; 434 - WREG32(SDMA0_UCODE_ADDR + SDMA0_REGISTER_OFFSET, 0); 435 - for (i = 0; i < CIK_SDMA_UCODE_SIZE; i++) 436 - WREG32(SDMA0_UCODE_DATA + SDMA0_REGISTER_OFFSET, be32_to_cpup(fw_data++)); 437 - WREG32(SDMA0_UCODE_DATA + SDMA0_REGISTER_OFFSET, CIK_SDMA_UCODE_VERSION); 431 + if (rdev->new_fw) { 432 + const struct sdma_firmware_header_v1_0 *hdr = 433 + (const struct sdma_firmware_header_v1_0 *)rdev->sdma_fw->data; 434 + const __le32 *fw_data; 435 + u32 fw_size; 438 436 439 - /* sdma1 */ 440 - fw_data = (const __be32 *)rdev->sdma_fw->data; 441 - WREG32(SDMA0_UCODE_ADDR + SDMA1_REGISTER_OFFSET, 0); 442 - for (i = 0; i < CIK_SDMA_UCODE_SIZE; i++) 443 - WREG32(SDMA0_UCODE_DATA + SDMA1_REGISTER_OFFSET, be32_to_cpup(fw_data++)); 444 - WREG32(SDMA0_UCODE_DATA + SDMA1_REGISTER_OFFSET, CIK_SDMA_UCODE_VERSION); 437 + radeon_ucode_print_sdma_hdr(&hdr->header); 438 + 439 + /* sdma0 */ 440 + fw_data = (const __le32 *) 441 + (rdev->sdma_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes)); 442 + fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; 443 + WREG32(SDMA0_UCODE_ADDR + SDMA0_REGISTER_OFFSET, 0); 444 + for (i = 0; i < fw_size; i++) 445 + WREG32(SDMA0_UCODE_DATA + SDMA0_REGISTER_OFFSET, le32_to_cpup(fw_data++)); 446 + WREG32(SDMA0_UCODE_DATA + SDMA0_REGISTER_OFFSET, CIK_SDMA_UCODE_VERSION); 447 + 448 + /* sdma1 */ 449 + fw_data = (const __le32 *) 450 + (rdev->sdma_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes)); 451 + fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; 452 + WREG32(SDMA0_UCODE_ADDR + SDMA1_REGISTER_OFFSET, 0); 453 + for (i = 0; i < fw_size; i++) 454 + WREG32(SDMA0_UCODE_DATA + SDMA1_REGISTER_OFFSET, le32_to_cpup(fw_data++)); 455 + WREG32(SDMA0_UCODE_DATA + SDMA1_REGISTER_OFFSET, CIK_SDMA_UCODE_VERSION); 456 + } else { 457 + const __be32 *fw_data; 458 + 459 + /* sdma0 */ 460 + fw_data = (const __be32 *)rdev->sdma_fw->data; 461 + WREG32(SDMA0_UCODE_ADDR + SDMA0_REGISTER_OFFSET, 0); 462 + for (i = 0; i < CIK_SDMA_UCODE_SIZE; i++) 463 + WREG32(SDMA0_UCODE_DATA + SDMA0_REGISTER_OFFSET, be32_to_cpup(fw_data++)); 464 + WREG32(SDMA0_UCODE_DATA + SDMA0_REGISTER_OFFSET, CIK_SDMA_UCODE_VERSION); 465 + 466 + /* sdma1 */ 467 + fw_data = (const __be32 *)rdev->sdma_fw->data; 468 + WREG32(SDMA0_UCODE_ADDR + SDMA1_REGISTER_OFFSET, 0); 469 + for (i = 0; i < CIK_SDMA_UCODE_SIZE; i++) 470 + WREG32(SDMA0_UCODE_DATA + SDMA1_REGISTER_OFFSET, be32_to_cpup(fw_data++)); 471 + WREG32(SDMA0_UCODE_DATA + SDMA1_REGISTER_OFFSET, CIK_SDMA_UCODE_VERSION); 472 + } 445 473 446 474 WREG32(SDMA0_UCODE_ADDR + SDMA0_REGISTER_OFFSET, 0); 447 475 WREG32(SDMA0_UCODE_ADDR + SDMA1_REGISTER_OFFSET, 0); ··· 749 719 } 750 720 751 721 /** 752 - * cik_sdma_vm_set_page - update the page tables using sDMA 722 + * cik_sdma_vm_copy_pages - update PTEs by copying them from the GART 723 + * 724 + * @rdev: radeon_device pointer 725 + * @ib: indirect buffer to fill with commands 726 + * @pe: addr of the page entry 727 + * @src: src addr to copy from 728 + * @count: number of page entries to update 729 + * 730 + * Update PTEs by copying them from the GART using sDMA (CIK). 731 + */ 732 + void cik_sdma_vm_copy_pages(struct radeon_device *rdev, 733 + struct radeon_ib *ib, 734 + uint64_t pe, uint64_t src, 735 + unsigned count) 736 + { 737 + while (count) { 738 + unsigned bytes = count * 8; 739 + if (bytes > 0x1FFFF8) 740 + bytes = 0x1FFFF8; 741 + 742 + ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_COPY, 743 + SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 744 + ib->ptr[ib->length_dw++] = bytes; 745 + ib->ptr[ib->length_dw++] = 0; /* src/dst endian swap */ 746 + ib->ptr[ib->length_dw++] = lower_32_bits(src); 747 + ib->ptr[ib->length_dw++] = upper_32_bits(src); 748 + ib->ptr[ib->length_dw++] = lower_32_bits(pe); 749 + ib->ptr[ib->length_dw++] = upper_32_bits(pe); 750 + 751 + pe += bytes; 752 + src += bytes; 753 + count -= bytes / 8; 754 + } 755 + } 756 + 757 + /** 758 + * cik_sdma_vm_write_pages - update PTEs by writing them manually 759 + * 760 + * @rdev: radeon_device pointer 761 + * @ib: indirect buffer to fill with commands 762 + * @pe: addr of the page entry 763 + * @addr: dst addr to write into pe 764 + * @count: number of page entries to update 765 + * @incr: increase next addr by incr bytes 766 + * @flags: access flags 767 + * 768 + * Update PTEs by writing them manually using sDMA (CIK). 769 + */ 770 + void cik_sdma_vm_write_pages(struct radeon_device *rdev, 771 + struct radeon_ib *ib, 772 + uint64_t pe, 773 + uint64_t addr, unsigned count, 774 + uint32_t incr, uint32_t flags) 775 + { 776 + uint64_t value; 777 + unsigned ndw; 778 + 779 + while (count) { 780 + ndw = count * 2; 781 + if (ndw > 0xFFFFE) 782 + ndw = 0xFFFFE; 783 + 784 + /* for non-physically contiguous pages (system) */ 785 + ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_WRITE, 786 + SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 787 + ib->ptr[ib->length_dw++] = pe; 788 + ib->ptr[ib->length_dw++] = upper_32_bits(pe); 789 + ib->ptr[ib->length_dw++] = ndw; 790 + for (; ndw > 0; ndw -= 2, --count, pe += 8) { 791 + if (flags & R600_PTE_SYSTEM) { 792 + value = radeon_vm_map_gart(rdev, addr); 793 + value &= 0xFFFFFFFFFFFFF000ULL; 794 + } else if (flags & R600_PTE_VALID) { 795 + value = addr; 796 + } else { 797 + value = 0; 798 + } 799 + addr += incr; 800 + value |= flags; 801 + ib->ptr[ib->length_dw++] = value; 802 + ib->ptr[ib->length_dw++] = upper_32_bits(value); 803 + } 804 + } 805 + } 806 + 807 + /** 808 + * cik_sdma_vm_set_pages - update the page tables using sDMA 753 809 * 754 810 * @rdev: radeon_device pointer 755 811 * @ib: indirect buffer to fill with commands ··· 847 731 * 848 732 * Update the page tables using sDMA (CIK). 849 733 */ 850 - void cik_sdma_vm_set_page(struct radeon_device *rdev, 851 - struct radeon_ib *ib, 852 - uint64_t pe, 853 - uint64_t addr, unsigned count, 854 - uint32_t incr, uint32_t flags) 734 + void cik_sdma_vm_set_pages(struct radeon_device *rdev, 735 + struct radeon_ib *ib, 736 + uint64_t pe, 737 + uint64_t addr, unsigned count, 738 + uint32_t incr, uint32_t flags) 855 739 { 856 740 uint64_t value; 857 741 unsigned ndw; 858 742 859 - trace_radeon_vm_set_page(pe, addr, count, incr, flags); 743 + while (count) { 744 + ndw = count; 745 + if (ndw > 0x7FFFF) 746 + ndw = 0x7FFFF; 860 747 861 - if (flags == R600_PTE_GART) { 862 - uint64_t src = rdev->gart.table_addr + (addr >> 12) * 8; 863 - while (count) { 864 - unsigned bytes = count * 8; 865 - if (bytes > 0x1FFFF8) 866 - bytes = 0x1FFFF8; 748 + if (flags & R600_PTE_VALID) 749 + value = addr; 750 + else 751 + value = 0; 867 752 868 - ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 869 - ib->ptr[ib->length_dw++] = bytes; 870 - ib->ptr[ib->length_dw++] = 0; /* src/dst endian swap */ 871 - ib->ptr[ib->length_dw++] = lower_32_bits(src); 872 - ib->ptr[ib->length_dw++] = upper_32_bits(src); 873 - ib->ptr[ib->length_dw++] = lower_32_bits(pe); 874 - ib->ptr[ib->length_dw++] = upper_32_bits(pe); 753 + /* for physically contiguous pages (vram) */ 754 + ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_GENERATE_PTE_PDE, 0, 0); 755 + ib->ptr[ib->length_dw++] = pe; /* dst addr */ 756 + ib->ptr[ib->length_dw++] = upper_32_bits(pe); 757 + ib->ptr[ib->length_dw++] = flags; /* mask */ 758 + ib->ptr[ib->length_dw++] = 0; 759 + ib->ptr[ib->length_dw++] = value; /* value */ 760 + ib->ptr[ib->length_dw++] = upper_32_bits(value); 761 + ib->ptr[ib->length_dw++] = incr; /* increment size */ 762 + ib->ptr[ib->length_dw++] = 0; 763 + ib->ptr[ib->length_dw++] = ndw; /* number of entries */ 875 764 876 - pe += bytes; 877 - src += bytes; 878 - count -= bytes / 8; 879 - } 880 - } else if (flags & R600_PTE_SYSTEM) { 881 - while (count) { 882 - ndw = count * 2; 883 - if (ndw > 0xFFFFE) 884 - ndw = 0xFFFFE; 885 - 886 - /* for non-physically contiguous pages (system) */ 887 - ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 888 - ib->ptr[ib->length_dw++] = pe; 889 - ib->ptr[ib->length_dw++] = upper_32_bits(pe); 890 - ib->ptr[ib->length_dw++] = ndw; 891 - for (; ndw > 0; ndw -= 2, --count, pe += 8) { 892 - value = radeon_vm_map_gart(rdev, addr); 893 - value &= 0xFFFFFFFFFFFFF000ULL; 894 - addr += incr; 895 - value |= flags; 896 - ib->ptr[ib->length_dw++] = value; 897 - ib->ptr[ib->length_dw++] = upper_32_bits(value); 898 - } 899 - } 900 - } else { 901 - while (count) { 902 - ndw = count; 903 - if (ndw > 0x7FFFF) 904 - ndw = 0x7FFFF; 905 - 906 - if (flags & R600_PTE_VALID) 907 - value = addr; 908 - else 909 - value = 0; 910 - /* for physically contiguous pages (vram) */ 911 - ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_GENERATE_PTE_PDE, 0, 0); 912 - ib->ptr[ib->length_dw++] = pe; /* dst addr */ 913 - ib->ptr[ib->length_dw++] = upper_32_bits(pe); 914 - ib->ptr[ib->length_dw++] = flags; /* mask */ 915 - ib->ptr[ib->length_dw++] = 0; 916 - ib->ptr[ib->length_dw++] = value; /* value */ 917 - ib->ptr[ib->length_dw++] = upper_32_bits(value); 918 - ib->ptr[ib->length_dw++] = incr; /* increment size */ 919 - ib->ptr[ib->length_dw++] = 0; 920 - ib->ptr[ib->length_dw++] = ndw; /* number of entries */ 921 - pe += ndw * 8; 922 - addr += ndw * incr; 923 - count -= ndw; 924 - } 765 + pe += ndw * 8; 766 + addr += ndw * incr; 767 + count -= ndw; 925 768 } 769 + } 770 + 771 + /** 772 + * cik_sdma_vm_pad_ib - pad the IB to the required number of dw 773 + * 774 + * @ib: indirect buffer to fill with padding 775 + * 776 + */ 777 + void cik_sdma_vm_pad_ib(struct radeon_ib *ib) 778 + { 926 779 while (ib->length_dw & 0x7) 927 780 ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0); 928 781 }
+10 -6
drivers/gpu/drm/radeon/dce6_afmt.c
··· 136 136 tmp = VIDEO_LIPSYNC(connector->video_latency[1]) | 137 137 AUDIO_LIPSYNC(connector->audio_latency[1]); 138 138 else 139 - tmp = VIDEO_LIPSYNC(255) | AUDIO_LIPSYNC(255); 139 + tmp = VIDEO_LIPSYNC(0) | AUDIO_LIPSYNC(0); 140 140 } else { 141 141 if (connector->latency_present[0]) 142 142 tmp = VIDEO_LIPSYNC(connector->video_latency[0]) | 143 143 AUDIO_LIPSYNC(connector->audio_latency[0]); 144 144 else 145 - tmp = VIDEO_LIPSYNC(255) | AUDIO_LIPSYNC(255); 145 + tmp = VIDEO_LIPSYNC(0) | AUDIO_LIPSYNC(0); 146 146 } 147 147 WREG32_ENDPOINT(offset, AZ_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC, tmp); 148 148 } ··· 164 164 offset = dig->afmt->pin->offset; 165 165 166 166 list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { 167 - if (connector->encoder == encoder) 167 + if (connector->encoder == encoder) { 168 168 radeon_connector = to_radeon_connector(connector); 169 + break; 170 + } 169 171 } 170 172 171 173 if (!radeon_connector) { ··· 175 173 return; 176 174 } 177 175 178 - sad_count = drm_edid_to_speaker_allocation(radeon_connector->edid, &sadb); 176 + sad_count = drm_edid_to_speaker_allocation(radeon_connector_edid(connector), &sadb); 179 177 if (sad_count <= 0) { 180 178 DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count); 181 179 return; ··· 227 225 offset = dig->afmt->pin->offset; 228 226 229 227 list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { 230 - if (connector->encoder == encoder) 228 + if (connector->encoder == encoder) { 231 229 radeon_connector = to_radeon_connector(connector); 230 + break; 231 + } 232 232 } 233 233 234 234 if (!radeon_connector) { ··· 238 234 return; 239 235 } 240 236 241 - sad_count = drm_edid_to_sad(radeon_connector->edid, &sads); 237 + sad_count = drm_edid_to_sad(radeon_connector_edid(connector), &sads); 242 238 if (sad_count <= 0) { 243 239 DRM_ERROR("Couldn't read SADs: %d\n", sad_count); 244 240 return;
+11 -7
drivers/gpu/drm/radeon/evergreen.c
··· 2424 2424 r = radeon_gart_table_vram_pin(rdev); 2425 2425 if (r) 2426 2426 return r; 2427 - radeon_gart_restore(rdev); 2428 2427 /* Setup L2 cache */ 2429 2428 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | 2430 2429 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | ··· 2676 2677 if (save->crtc_enabled[i]) { 2677 2678 if (ASIC_IS_DCE6(rdev)) { 2678 2679 tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]); 2679 - tmp |= EVERGREEN_CRTC_BLANK_DATA_EN; 2680 + tmp &= ~EVERGREEN_CRTC_BLANK_DATA_EN; 2680 2681 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1); 2681 2682 WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp); 2682 2683 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0); ··· 4022 4023 /* save restore block */ 4023 4024 if (rdev->rlc.save_restore_obj == NULL) { 4024 4025 r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true, 4025 - RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->rlc.save_restore_obj); 4026 + RADEON_GEM_DOMAIN_VRAM, 0, NULL, 4027 + &rdev->rlc.save_restore_obj); 4026 4028 if (r) { 4027 4029 dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r); 4028 4030 return r; ··· 4101 4101 4102 4102 if (rdev->rlc.clear_state_obj == NULL) { 4103 4103 r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true, 4104 - RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->rlc.clear_state_obj); 4104 + RADEON_GEM_DOMAIN_VRAM, 0, NULL, 4105 + &rdev->rlc.clear_state_obj); 4105 4106 if (r) { 4106 4107 dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r); 4107 4108 sumo_rlc_fini(rdev); ··· 4176 4175 4177 4176 if (rdev->rlc.cp_table_size) { 4178 4177 if (rdev->rlc.cp_table_obj == NULL) { 4179 - r = radeon_bo_create(rdev, rdev->rlc.cp_table_size, PAGE_SIZE, true, 4180 - RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->rlc.cp_table_obj); 4178 + r = radeon_bo_create(rdev, rdev->rlc.cp_table_size, 4179 + PAGE_SIZE, true, 4180 + RADEON_GEM_DOMAIN_VRAM, 0, NULL, 4181 + &rdev->rlc.cp_table_obj); 4181 4182 if (r) { 4182 4183 dev_warn(rdev->dev, "(%d) create RLC cp table bo failed\n", r); 4183 4184 sumo_rlc_fini(rdev); ··· 4964 4961 case 16: /* D5 page flip */ 4965 4962 case 18: /* D6 page flip */ 4966 4963 DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1); 4967 - radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1); 4964 + if (radeon_use_pflipirq > 0) 4965 + radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1); 4968 4966 break; 4969 4967 case 42: /* HPD hotplug */ 4970 4968 switch (src_data) {
+2 -2
drivers/gpu/drm/radeon/evergreen_hdmi.c
··· 117 117 return; 118 118 } 119 119 120 - sad_count = drm_edid_to_speaker_allocation(radeon_connector->edid, &sadb); 120 + sad_count = drm_edid_to_speaker_allocation(radeon_connector_edid(connector), &sadb); 121 121 if (sad_count <= 0) { 122 122 DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count); 123 123 return; ··· 172 172 return; 173 173 } 174 174 175 - sad_count = drm_edid_to_sad(radeon_connector->edid, &sads); 175 + sad_count = drm_edid_to_sad(radeon_connector_edid(connector), &sads); 176 176 if (sad_count <= 0) { 177 177 DRM_ERROR("Couldn't read SADs: %d\n", sad_count); 178 178 return;
-1
drivers/gpu/drm/radeon/ni.c
··· 1229 1229 r = radeon_gart_table_vram_pin(rdev); 1230 1230 if (r) 1231 1231 return r; 1232 - radeon_gart_restore(rdev); 1233 1232 /* Setup TLB control */ 1234 1233 WREG32(MC_VM_MX_L1_TLB_CNTL, 1235 1234 (0xA << 7) |
+122 -54
drivers/gpu/drm/radeon/ni_dma.c
··· 307 307 } 308 308 309 309 /** 310 - * cayman_dma_vm_set_page - update the page tables using the DMA 310 + * cayman_dma_vm_copy_pages - update PTEs by copying them from the GART 311 + * 312 + * @rdev: radeon_device pointer 313 + * @ib: indirect buffer to fill with commands 314 + * @pe: addr of the page entry 315 + * @src: src addr where to copy from 316 + * @count: number of page entries to update 317 + * 318 + * Update PTEs by copying them from the GART using the DMA (cayman/TN). 319 + */ 320 + void cayman_dma_vm_copy_pages(struct radeon_device *rdev, 321 + struct radeon_ib *ib, 322 + uint64_t pe, uint64_t src, 323 + unsigned count) 324 + { 325 + unsigned ndw; 326 + 327 + while (count) { 328 + ndw = count * 2; 329 + if (ndw > 0xFFFFE) 330 + ndw = 0xFFFFE; 331 + 332 + ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_COPY, 333 + 0, 0, ndw); 334 + ib->ptr[ib->length_dw++] = lower_32_bits(pe); 335 + ib->ptr[ib->length_dw++] = lower_32_bits(src); 336 + ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff; 337 + ib->ptr[ib->length_dw++] = upper_32_bits(src) & 0xff; 338 + 339 + pe += ndw * 4; 340 + src += ndw * 4; 341 + count -= ndw / 2; 342 + } 343 + } 344 + 345 + /** 346 + * cayman_dma_vm_write_pages - update PTEs by writing them manually 311 347 * 312 348 * @rdev: radeon_device pointer 313 349 * @ib: indirect buffer to fill with commands ··· 351 315 * @addr: dst addr to write into pe 352 316 * @count: number of page entries to update 353 317 * @incr: increase next addr by incr bytes 354 - * @flags: hw access flags 318 + * @flags: hw access flags 355 319 * 356 - * Update the page tables using the DMA (cayman/TN). 320 + * Update PTEs by writing them manually using the DMA (cayman/TN). 357 321 */ 358 - void cayman_dma_vm_set_page(struct radeon_device *rdev, 359 - struct radeon_ib *ib, 360 - uint64_t pe, 361 - uint64_t addr, unsigned count, 362 - uint32_t incr, uint32_t flags) 322 + void cayman_dma_vm_write_pages(struct radeon_device *rdev, 323 + struct radeon_ib *ib, 324 + uint64_t pe, 325 + uint64_t addr, unsigned count, 326 + uint32_t incr, uint32_t flags) 363 327 { 364 328 uint64_t value; 365 329 unsigned ndw; 366 330 367 - trace_radeon_vm_set_page(pe, addr, count, incr, flags); 331 + while (count) { 332 + ndw = count * 2; 333 + if (ndw > 0xFFFFE) 334 + ndw = 0xFFFFE; 368 335 369 - if ((flags & R600_PTE_SYSTEM) || (count == 1)) { 370 - while (count) { 371 - ndw = count * 2; 372 - if (ndw > 0xFFFFE) 373 - ndw = 0xFFFFE; 374 - 375 - /* for non-physically contiguous pages (system) */ 376 - ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, ndw); 377 - ib->ptr[ib->length_dw++] = pe; 378 - ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff; 379 - for (; ndw > 0; ndw -= 2, --count, pe += 8) { 380 - if (flags & R600_PTE_SYSTEM) { 381 - value = radeon_vm_map_gart(rdev, addr); 382 - value &= 0xFFFFFFFFFFFFF000ULL; 383 - } else if (flags & R600_PTE_VALID) { 384 - value = addr; 385 - } else { 386 - value = 0; 387 - } 388 - addr += incr; 389 - value |= flags; 390 - ib->ptr[ib->length_dw++] = value; 391 - ib->ptr[ib->length_dw++] = upper_32_bits(value); 392 - } 393 - } 394 - } else { 395 - while (count) { 396 - ndw = count * 2; 397 - if (ndw > 0xFFFFE) 398 - ndw = 0xFFFFE; 399 - 400 - if (flags & R600_PTE_VALID) 336 + /* for non-physically contiguous pages (system) */ 337 + ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_WRITE, 338 + 0, 0, ndw); 339 + ib->ptr[ib->length_dw++] = pe; 340 + ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff; 341 + for (; ndw > 0; ndw -= 2, --count, pe += 8) { 342 + if (flags & R600_PTE_SYSTEM) { 343 + value = radeon_vm_map_gart(rdev, addr); 344 + value &= 0xFFFFFFFFFFFFF000ULL; 345 + } else if (flags & R600_PTE_VALID) { 401 346 value = addr; 402 - else 347 + } else { 403 348 value = 0; 404 - /* for physically contiguous pages (vram) */ 405 - ib->ptr[ib->length_dw++] = DMA_PTE_PDE_PACKET(ndw); 406 - ib->ptr[ib->length_dw++] = pe; /* dst addr */ 407 - ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff; 408 - ib->ptr[ib->length_dw++] = flags; /* mask */ 409 - ib->ptr[ib->length_dw++] = 0; 410 - ib->ptr[ib->length_dw++] = value; /* value */ 349 + } 350 + addr += incr; 351 + value |= flags; 352 + ib->ptr[ib->length_dw++] = value; 411 353 ib->ptr[ib->length_dw++] = upper_32_bits(value); 412 - ib->ptr[ib->length_dw++] = incr; /* increment size */ 413 - ib->ptr[ib->length_dw++] = 0; 414 - pe += ndw * 4; 415 - addr += (ndw / 2) * incr; 416 - count -= ndw / 2; 417 354 } 418 355 } 356 + } 357 + 358 + /** 359 + * cayman_dma_vm_set_pages - update the page tables using the DMA 360 + * 361 + * @rdev: radeon_device pointer 362 + * @ib: indirect buffer to fill with commands 363 + * @pe: addr of the page entry 364 + * @addr: dst addr to write into pe 365 + * @count: number of page entries to update 366 + * @incr: increase next addr by incr bytes 367 + * @flags: hw access flags 368 + * 369 + * Update the page tables using the DMA (cayman/TN). 370 + */ 371 + void cayman_dma_vm_set_pages(struct radeon_device *rdev, 372 + struct radeon_ib *ib, 373 + uint64_t pe, 374 + uint64_t addr, unsigned count, 375 + uint32_t incr, uint32_t flags) 376 + { 377 + uint64_t value; 378 + unsigned ndw; 379 + 380 + while (count) { 381 + ndw = count * 2; 382 + if (ndw > 0xFFFFE) 383 + ndw = 0xFFFFE; 384 + 385 + if (flags & R600_PTE_VALID) 386 + value = addr; 387 + else 388 + value = 0; 389 + 390 + /* for physically contiguous pages (vram) */ 391 + ib->ptr[ib->length_dw++] = DMA_PTE_PDE_PACKET(ndw); 392 + ib->ptr[ib->length_dw++] = pe; /* dst addr */ 393 + ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff; 394 + ib->ptr[ib->length_dw++] = flags; /* mask */ 395 + ib->ptr[ib->length_dw++] = 0; 396 + ib->ptr[ib->length_dw++] = value; /* value */ 397 + ib->ptr[ib->length_dw++] = upper_32_bits(value); 398 + ib->ptr[ib->length_dw++] = incr; /* increment size */ 399 + ib->ptr[ib->length_dw++] = 0; 400 + 401 + pe += ndw * 4; 402 + addr += (ndw / 2) * incr; 403 + count -= ndw / 2; 404 + } 405 + } 406 + 407 + /** 408 + * cayman_dma_vm_pad_ib - pad the IB to the required number of dw 409 + * 410 + * @ib: indirect buffer to fill with padding 411 + * 412 + */ 413 + void cayman_dma_vm_pad_ib(struct radeon_ib *ib) 414 + { 419 415 while (ib->length_dw & 0x7) 420 416 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0); 421 417 }
+16 -40
drivers/gpu/drm/radeon/r100.c
··· 652 652 { 653 653 uint32_t tmp; 654 654 655 - radeon_gart_restore(rdev); 656 655 /* discard memory request outside of configured range */ 657 656 tmp = RREG32(RADEON_AIC_CNTL) | RADEON_DIS_OUT_OF_PCI_GART_ACCESS; 658 657 WREG32(RADEON_AIC_CNTL, tmp); ··· 682 683 } 683 684 684 685 void r100_pci_gart_set_page(struct radeon_device *rdev, unsigned i, 685 - uint64_t addr) 686 + uint64_t addr, uint32_t flags) 686 687 { 687 688 u32 *gtt = rdev->gart.ptr; 688 689 gtt[i] = cpu_to_le32(lower_32_bits(addr)); ··· 837 838 /* Wait until IDLE & CLEAN */ 838 839 radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0)); 839 840 radeon_ring_write(ring, RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN); 840 - radeon_ring_write(ring, PACKET0(RADEON_HOST_PATH_CNTL, 0)); 841 - radeon_ring_write(ring, rdev->config.r100.hdp_cntl | 842 - RADEON_HDP_READ_BUFFER_INVALIDATE); 843 - radeon_ring_write(ring, PACKET0(RADEON_HOST_PATH_CNTL, 0)); 844 - radeon_ring_write(ring, rdev->config.r100.hdp_cntl); 841 + r100_ring_hdp_flush(rdev, ring); 845 842 /* Emit fence sequence & fire IRQ */ 846 843 radeon_ring_write(ring, PACKET0(rdev->fence_drv[fence->ring].scratch_reg, 0)); 847 844 radeon_ring_write(ring, fence->seq); ··· 1054 1059 { 1055 1060 WREG32(RADEON_CP_RB_WPTR, ring->wptr); 1056 1061 (void)RREG32(RADEON_CP_RB_WPTR); 1062 + } 1063 + 1064 + /** 1065 + * r100_ring_hdp_flush - flush Host Data Path via the ring buffer 1066 + * rdev: radeon device structure 1067 + * ring: ring buffer struct for emitting packets 1068 + */ 1069 + void r100_ring_hdp_flush(struct radeon_device *rdev, struct radeon_ring *ring) 1070 + { 1071 + radeon_ring_write(ring, PACKET0(RADEON_HOST_PATH_CNTL, 0)); 1072 + radeon_ring_write(ring, rdev->config.r100.hdp_cntl | 1073 + RADEON_HDP_READ_BUFFER_INVALIDATE); 1074 + radeon_ring_write(ring, PACKET0(RADEON_HOST_PATH_CNTL, 0)); 1075 + radeon_ring_write(ring, rdev->config.r100.hdp_cntl); 1057 1076 } 1058 1077 1059 1078 static void r100_cp_load_microcode(struct radeon_device *rdev) ··· 4072 4063 rdev->accel_working = false; 4073 4064 } 4074 4065 return 0; 4075 - } 4076 - 4077 - uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg, 4078 - bool always_indirect) 4079 - { 4080 - if (reg < rdev->rmmio_size && !always_indirect) 4081 - return readl(((void __iomem *)rdev->rmmio) + reg); 4082 - else { 4083 - unsigned long flags; 4084 - uint32_t ret; 4085 - 4086 - spin_lock_irqsave(&rdev->mmio_idx_lock, flags); 4087 - writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); 4088 - ret = readl(((void __iomem *)rdev->rmmio) + RADEON_MM_DATA); 4089 - spin_unlock_irqrestore(&rdev->mmio_idx_lock, flags); 4090 - 4091 - return ret; 4092 - } 4093 - } 4094 - 4095 - void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v, 4096 - bool always_indirect) 4097 - { 4098 - if (reg < rdev->rmmio_size && !always_indirect) 4099 - writel(v, ((void __iomem *)rdev->rmmio) + reg); 4100 - else { 4101 - unsigned long flags; 4102 - 4103 - spin_lock_irqsave(&rdev->mmio_idx_lock, flags); 4104 - writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); 4105 - writel(v, ((void __iomem *)rdev->rmmio) + RADEON_MM_DATA); 4106 - spin_unlock_irqrestore(&rdev->mmio_idx_lock, flags); 4107 - } 4108 4066 } 4109 4067 4110 4068 u32 r100_io_rreg(struct radeon_device *rdev, u32 reg)
+9 -4
drivers/gpu/drm/radeon/r300.c
··· 69 69 mb(); 70 70 } 71 71 72 + #define R300_PTE_UNSNOOPED (1 << 0) 72 73 #define R300_PTE_WRITEABLE (1 << 2) 73 74 #define R300_PTE_READABLE (1 << 3) 74 75 75 76 void rv370_pcie_gart_set_page(struct radeon_device *rdev, unsigned i, 76 - uint64_t addr) 77 + uint64_t addr, uint32_t flags) 77 78 { 78 79 void __iomem *ptr = rdev->gart.ptr; 79 80 80 81 addr = (lower_32_bits(addr) >> 8) | 81 - ((upper_32_bits(addr) & 0xff) << 24) | 82 - R300_PTE_WRITEABLE | R300_PTE_READABLE; 82 + ((upper_32_bits(addr) & 0xff) << 24); 83 + if (flags & RADEON_GART_PAGE_READ) 84 + addr |= R300_PTE_READABLE; 85 + if (flags & RADEON_GART_PAGE_WRITE) 86 + addr |= R300_PTE_WRITEABLE; 87 + if (!(flags & RADEON_GART_PAGE_SNOOP)) 88 + addr |= R300_PTE_UNSNOOPED; 83 89 /* on x86 we want this to be CPU endian, on powerpc 84 90 * on powerpc without HW swappers, it'll get swapped on way 85 91 * into VRAM - so no need for cpu_to_le32 on VRAM tables */ ··· 126 120 r = radeon_gart_table_vram_pin(rdev); 127 121 if (r) 128 122 return r; 129 - radeon_gart_restore(rdev); 130 123 /* discard memory request outside of configured range */ 131 124 tmp = RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; 132 125 WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp);
+12 -12
drivers/gpu/drm/radeon/r600.c
··· 968 968 r = radeon_gart_table_vram_pin(rdev); 969 969 if (r) 970 970 return r; 971 - radeon_gart_restore(rdev); 972 971 973 972 /* Setup L2 cache */ 974 973 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | ··· 1338 1339 if (rdev->vram_scratch.robj == NULL) { 1339 1340 r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, 1340 1341 PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, 1341 - NULL, &rdev->vram_scratch.robj); 1342 + 0, NULL, &rdev->vram_scratch.robj); 1342 1343 if (r) { 1343 1344 return r; 1344 1345 } ··· 3226 3227 if (rdev->ih.ring_obj == NULL) { 3227 3228 r = radeon_bo_create(rdev, rdev->ih.ring_size, 3228 3229 PAGE_SIZE, true, 3229 - RADEON_GEM_DOMAIN_GTT, 3230 + RADEON_GEM_DOMAIN_GTT, 0, 3230 3231 NULL, &rdev->ih.ring_obj); 3231 3232 if (r) { 3232 3233 DRM_ERROR("radeon: failed to create ih ring buffer (%d).\n", r); ··· 3923 3924 break; 3924 3925 case 9: /* D1 pflip */ 3925 3926 DRM_DEBUG("IH: D1 flip\n"); 3926 - radeon_crtc_handle_flip(rdev, 0); 3927 + if (radeon_use_pflipirq > 0) 3928 + radeon_crtc_handle_flip(rdev, 0); 3927 3929 break; 3928 3930 case 11: /* D2 pflip */ 3929 3931 DRM_DEBUG("IH: D2 flip\n"); 3930 - radeon_crtc_handle_flip(rdev, 1); 3932 + if (radeon_use_pflipirq > 0) 3933 + radeon_crtc_handle_flip(rdev, 1); 3931 3934 break; 3932 3935 case 19: /* HPD/DAC hotplug */ 3933 3936 switch (src_data) { ··· 4090 4089 } 4091 4090 4092 4091 /** 4093 - * r600_ioctl_wait_idle - flush host path cache on wait idle ioctl 4092 + * r600_mmio_hdp_flush - flush Host Data Path cache via MMIO 4094 4093 * rdev: radeon device structure 4095 - * bo: buffer object struct which userspace is waiting for idle 4096 4094 * 4097 - * Some R6XX/R7XX doesn't seems to take into account HDP flush performed 4098 - * through ring buffer, this leads to corruption in rendering, see 4099 - * http://bugzilla.kernel.org/show_bug.cgi?id=15186 to avoid this we 4100 - * directly perform HDP flush by writing register through MMIO. 4095 + * Some R6XX/R7XX don't seem to take into account HDP flushes performed 4096 + * through the ring buffer. This leads to corruption in rendering, see 4097 + * http://bugzilla.kernel.org/show_bug.cgi?id=15186 . To avoid this, we 4098 + * directly perform the HDP flush by writing the register through MMIO. 4101 4099 */ 4102 - void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo) 4100 + void r600_mmio_hdp_flush(struct radeon_device *rdev) 4103 4101 { 4104 4102 /* r7xx hw bug. write to HDP_DEBUG1 followed by fb read 4105 4103 * rather than write to HDP_REG_COHERENCY_FLUSH_CNTL.
+96 -31
drivers/gpu/drm/radeon/radeon.h
··· 64 64 #include <linux/wait.h> 65 65 #include <linux/list.h> 66 66 #include <linux/kref.h> 67 + #include <linux/interval_tree.h> 67 68 68 69 #include <ttm/ttm_bo_api.h> 69 70 #include <ttm/ttm_bo_driver.h> ··· 104 103 extern int radeon_vm_size; 105 104 extern int radeon_vm_block_size; 106 105 extern int radeon_deep_color; 106 + extern int radeon_use_pflipirq; 107 107 108 108 /* 109 109 * Copy from radeon_drv.h so we don't have to include both and have conflicting ··· 306 304 u16 *vddc, u16 *vddci, 307 305 u16 virtual_voltage_id, 308 306 u16 vbios_voltage_id); 307 + int radeon_atom_get_voltage_evv(struct radeon_device *rdev, 308 + u16 virtual_voltage_id, 309 + u16 *voltage); 309 310 int radeon_atom_round_to_true_voltage(struct radeon_device *rdev, 310 311 u8 voltage_type, 311 312 u16 nominal_voltage, ··· 322 317 struct atom_voltage_table *voltage_table); 323 318 bool radeon_atom_is_voltage_gpio(struct radeon_device *rdev, 324 319 u8 voltage_type, u8 voltage_mode); 320 + int radeon_atom_get_svi2_info(struct radeon_device *rdev, 321 + u8 voltage_type, 322 + u8 *svd_gpio_id, u8 *svc_gpio_id); 325 323 void radeon_atom_update_memory_dll(struct radeon_device *rdev, 326 324 u32 mem_clock); 327 325 void radeon_atom_set_ac_timing(struct radeon_device *rdev, ··· 449 441 struct radeon_bo_va { 450 442 /* protected by bo being reserved */ 451 443 struct list_head bo_list; 452 - uint64_t soffset; 453 - uint64_t eoffset; 454 444 uint32_t flags; 455 - bool valid; 445 + uint64_t addr; 456 446 unsigned ref_count; 457 447 458 448 /* protected by vm mutex */ 459 - struct list_head vm_list; 449 + struct interval_tree_node it; 460 450 struct list_head vm_status; 461 451 462 452 /* constant after initialization */ ··· 471 465 struct ttm_placement placement; 472 466 struct ttm_buffer_object tbo; 473 467 struct ttm_bo_kmap_obj kmap; 468 + u32 flags; 474 469 unsigned pin_count; 475 470 void *kptr; 476 471 u32 tiling_flags; ··· 550 543 551 544 int radeon_gem_init(struct radeon_device *rdev); 552 545 void radeon_gem_fini(struct radeon_device *rdev); 553 - int radeon_gem_object_create(struct radeon_device *rdev, int size, 546 + int radeon_gem_object_create(struct radeon_device *rdev, unsigned long size, 554 547 int alignment, int initial_domain, 555 - bool discardable, bool kernel, 548 + u32 flags, bool kernel, 556 549 struct drm_gem_object **obj); 557 550 558 551 int radeon_mode_dumb_create(struct drm_file *file_priv, ··· 597 590 #define RADEON_GPU_PAGE_SHIFT 12 598 591 #define RADEON_GPU_PAGE_ALIGN(a) (((a) + RADEON_GPU_PAGE_MASK) & ~RADEON_GPU_PAGE_MASK) 599 592 593 + #define RADEON_GART_PAGE_DUMMY 0 594 + #define RADEON_GART_PAGE_VALID (1 << 0) 595 + #define RADEON_GART_PAGE_READ (1 << 1) 596 + #define RADEON_GART_PAGE_WRITE (1 << 2) 597 + #define RADEON_GART_PAGE_SNOOP (1 << 3) 598 + 600 599 struct radeon_gart { 601 600 dma_addr_t table_addr; 602 601 struct radeon_bo *robj; ··· 627 614 int pages); 628 615 int radeon_gart_bind(struct radeon_device *rdev, unsigned offset, 629 616 int pages, struct page **pagelist, 630 - dma_addr_t *dma_addr); 631 - void radeon_gart_restore(struct radeon_device *rdev); 617 + dma_addr_t *dma_addr, uint32_t flags); 632 618 633 619 634 620 /* ··· 867 855 #define R600_PTE_FRAG_64KB (4 << 7) 868 856 #define R600_PTE_FRAG_256KB (6 << 7) 869 857 870 - /* flags used for GART page table entries on R600+ */ 871 - #define R600_PTE_GART ( R600_PTE_VALID | R600_PTE_SYSTEM | R600_PTE_SNOOPED \ 872 - | R600_PTE_READABLE | R600_PTE_WRITEABLE) 858 + /* flags needed to be set so we can copy directly from the GART table */ 859 + #define R600_PTE_GART_MASK ( R600_PTE_READABLE | R600_PTE_WRITEABLE | \ 860 + R600_PTE_SYSTEM | R600_PTE_VALID ) 873 861 874 862 struct radeon_vm_pt { 875 863 struct radeon_bo *bo; ··· 877 865 }; 878 866 879 867 struct radeon_vm { 880 - struct list_head va; 868 + struct rb_root va; 881 869 unsigned id; 870 + 871 + /* BOs moved, but not yet updated in the PT */ 872 + struct list_head invalidated; 882 873 883 874 /* BOs freed, but not yet updated in the PT */ 884 875 struct list_head freed; ··· 1755 1740 /* command emmit functions */ 1756 1741 void (*ib_execute)(struct radeon_device *rdev, struct radeon_ib *ib); 1757 1742 void (*emit_fence)(struct radeon_device *rdev, struct radeon_fence *fence); 1743 + void (*hdp_flush)(struct radeon_device *rdev, struct radeon_ring *ring); 1758 1744 bool (*emit_semaphore)(struct radeon_device *rdev, struct radeon_ring *cp, 1759 1745 struct radeon_semaphore *semaphore, bool emit_wait); 1760 1746 void (*vm_flush)(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); ··· 1779 1763 int (*suspend)(struct radeon_device *rdev); 1780 1764 void (*vga_set_state)(struct radeon_device *rdev, bool state); 1781 1765 int (*asic_reset)(struct radeon_device *rdev); 1782 - /* ioctl hw specific callback. Some hw might want to perform special 1783 - * operation on specific ioctl. For instance on wait idle some hw 1784 - * might want to perform and HDP flush through MMIO as it seems that 1785 - * some R6XX/R7XX hw doesn't take HDP flush into account if programmed 1786 - * through ring. 1787 - */ 1788 - void (*ioctl_wait_idle)(struct radeon_device *rdev, struct radeon_bo *bo); 1766 + /* Flush the HDP cache via MMIO */ 1767 + void (*mmio_hdp_flush)(struct radeon_device *rdev); 1789 1768 /* check if 3D engine is idle */ 1790 1769 bool (*gui_idle)(struct radeon_device *rdev); 1791 1770 /* wait for mc_idle */ ··· 1793 1782 struct { 1794 1783 void (*tlb_flush)(struct radeon_device *rdev); 1795 1784 void (*set_page)(struct radeon_device *rdev, unsigned i, 1796 - uint64_t addr); 1785 + uint64_t addr, uint32_t flags); 1797 1786 } gart; 1798 1787 struct { 1799 1788 int (*init)(struct radeon_device *rdev); 1800 1789 void (*fini)(struct radeon_device *rdev); 1801 - void (*set_page)(struct radeon_device *rdev, 1802 - struct radeon_ib *ib, 1803 - uint64_t pe, 1804 - uint64_t addr, unsigned count, 1805 - uint32_t incr, uint32_t flags); 1790 + void (*copy_pages)(struct radeon_device *rdev, 1791 + struct radeon_ib *ib, 1792 + uint64_t pe, uint64_t src, 1793 + unsigned count); 1794 + void (*write_pages)(struct radeon_device *rdev, 1795 + struct radeon_ib *ib, 1796 + uint64_t pe, 1797 + uint64_t addr, unsigned count, 1798 + uint32_t incr, uint32_t flags); 1799 + void (*set_pages)(struct radeon_device *rdev, 1800 + struct radeon_ib *ib, 1801 + uint64_t pe, 1802 + uint64_t addr, unsigned count, 1803 + uint32_t incr, uint32_t flags); 1804 + void (*pad_ib)(struct radeon_ib *ib); 1806 1805 } vm; 1807 1806 /* ring specific callbacks */ 1808 1807 struct radeon_asic_ring *ring[RADEON_NUM_RINGS]; ··· 2320 2299 const struct firmware *mc_fw; /* NI MC firmware */ 2321 2300 const struct firmware *ce_fw; /* SI CE firmware */ 2322 2301 const struct firmware *mec_fw; /* CIK MEC firmware */ 2302 + const struct firmware *mec2_fw; /* KV MEC2 firmware */ 2323 2303 const struct firmware *sdma_fw; /* CIK SDMA firmware */ 2324 2304 const struct firmware *smc_fw; /* SMC firmware */ 2325 2305 const struct firmware *uvd_fw; /* UVD firmware */ 2326 2306 const struct firmware *vce_fw; /* VCE firmware */ 2307 + bool new_fw; 2327 2308 struct r600_vram_scratch vram_scratch; 2328 2309 int msi_enabled; /* msi enabled */ 2329 2310 struct r600_ih ih; /* r6/700 interrupt ring */ ··· 2365 2342 2366 2343 struct dev_pm_domain vga_pm_domain; 2367 2344 bool have_disp_power_ref; 2345 + u32 px_quirk_flags; 2346 + 2347 + /* tracking pinned memory */ 2348 + u64 vram_pin_size; 2349 + u64 gart_pin_size; 2368 2350 }; 2369 2351 2370 2352 bool radeon_is_px(struct drm_device *dev); ··· 2380 2352 void radeon_device_fini(struct radeon_device *rdev); 2381 2353 int radeon_gpu_wait_for_idle(struct radeon_device *rdev); 2382 2354 2383 - uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg, 2384 - bool always_indirect); 2385 - void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v, 2386 - bool always_indirect); 2355 + #define RADEON_MIN_MMIO_SIZE 0x10000 2356 + 2357 + static inline uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg, 2358 + bool always_indirect) 2359 + { 2360 + /* The mmio size is 64kb at minimum. Allows the if to be optimized out. */ 2361 + if ((reg < rdev->rmmio_size || reg < RADEON_MIN_MMIO_SIZE) && !always_indirect) 2362 + return readl(((void __iomem *)rdev->rmmio) + reg); 2363 + else { 2364 + unsigned long flags; 2365 + uint32_t ret; 2366 + 2367 + spin_lock_irqsave(&rdev->mmio_idx_lock, flags); 2368 + writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); 2369 + ret = readl(((void __iomem *)rdev->rmmio) + RADEON_MM_DATA); 2370 + spin_unlock_irqrestore(&rdev->mmio_idx_lock, flags); 2371 + 2372 + return ret; 2373 + } 2374 + } 2375 + 2376 + static inline void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v, 2377 + bool always_indirect) 2378 + { 2379 + if ((reg < rdev->rmmio_size || reg < RADEON_MIN_MMIO_SIZE) && !always_indirect) 2380 + writel(v, ((void __iomem *)rdev->rmmio) + reg); 2381 + else { 2382 + unsigned long flags; 2383 + 2384 + spin_lock_irqsave(&rdev->mmio_idx_lock, flags); 2385 + writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); 2386 + writel(v, ((void __iomem *)rdev->rmmio) + RADEON_MM_DATA); 2387 + spin_unlock_irqrestore(&rdev->mmio_idx_lock, flags); 2388 + } 2389 + } 2390 + 2387 2391 u32 r100_io_rreg(struct radeon_device *rdev, u32 reg); 2388 2392 void r100_io_wreg(struct radeon_device *rdev, u32 reg, u32 v); 2389 2393 ··· 2769 2709 #define radeon_vga_set_state(rdev, state) (rdev)->asic->vga_set_state((rdev), (state)) 2770 2710 #define radeon_asic_reset(rdev) (rdev)->asic->asic_reset((rdev)) 2771 2711 #define radeon_gart_tlb_flush(rdev) (rdev)->asic->gart.tlb_flush((rdev)) 2772 - #define radeon_gart_set_page(rdev, i, p) (rdev)->asic->gart.set_page((rdev), (i), (p)) 2712 + #define radeon_gart_set_page(rdev, i, p, f) (rdev)->asic->gart.set_page((rdev), (i), (p), (f)) 2773 2713 #define radeon_asic_vm_init(rdev) (rdev)->asic->vm.init((rdev)) 2774 2714 #define radeon_asic_vm_fini(rdev) (rdev)->asic->vm.fini((rdev)) 2775 - #define radeon_asic_vm_set_page(rdev, ib, pe, addr, count, incr, flags) ((rdev)->asic->vm.set_page((rdev), (ib), (pe), (addr), (count), (incr), (flags))) 2715 + #define radeon_asic_vm_copy_pages(rdev, ib, pe, src, count) ((rdev)->asic->vm.copy_pages((rdev), (ib), (pe), (src), (count))) 2716 + #define radeon_asic_vm_write_pages(rdev, ib, pe, addr, count, incr, flags) ((rdev)->asic->vm.write_pages((rdev), (ib), (pe), (addr), (count), (incr), (flags))) 2717 + #define radeon_asic_vm_set_pages(rdev, ib, pe, addr, count, incr, flags) ((rdev)->asic->vm.set_pages((rdev), (ib), (pe), (addr), (count), (incr), (flags))) 2718 + #define radeon_asic_vm_pad_ib(rdev, ib) ((rdev)->asic->vm.pad_ib((ib))) 2776 2719 #define radeon_ring_start(rdev, r, cp) (rdev)->asic->ring[(r)]->ring_start((rdev), (cp)) 2777 2720 #define radeon_ring_test(rdev, r, cp) (rdev)->asic->ring[(r)]->ring_test((rdev), (cp)) 2778 2721 #define radeon_ib_test(rdev, r, cp) (rdev)->asic->ring[(r)]->ib_test((rdev), (cp)) ··· 2903 2840 struct radeon_vm *vm); 2904 2841 int radeon_vm_clear_freed(struct radeon_device *rdev, 2905 2842 struct radeon_vm *vm); 2843 + int radeon_vm_clear_invalids(struct radeon_device *rdev, 2844 + struct radeon_vm *vm); 2906 2845 int radeon_vm_bo_update(struct radeon_device *rdev, 2907 2846 struct radeon_bo_va *bo_va, 2908 2847 struct ttm_mem_reg *mem);
+48 -31
drivers/gpu/drm/radeon/radeon_asic.c
··· 185 185 .get_rptr = &r100_gfx_get_rptr, 186 186 .get_wptr = &r100_gfx_get_wptr, 187 187 .set_wptr = &r100_gfx_set_wptr, 188 + .hdp_flush = &r100_ring_hdp_flush, 188 189 }; 189 190 190 191 static struct radeon_asic r100_asic = { ··· 195 194 .resume = &r100_resume, 196 195 .vga_set_state = &r100_vga_set_state, 197 196 .asic_reset = &r100_asic_reset, 198 - .ioctl_wait_idle = NULL, 197 + .mmio_hdp_flush = NULL, 199 198 .gui_idle = &r100_gui_idle, 200 199 .mc_wait_for_idle = &r100_mc_wait_for_idle, 201 200 .gart = { ··· 261 260 .resume = &r100_resume, 262 261 .vga_set_state = &r100_vga_set_state, 263 262 .asic_reset = &r100_asic_reset, 264 - .ioctl_wait_idle = NULL, 263 + .mmio_hdp_flush = NULL, 265 264 .gui_idle = &r100_gui_idle, 266 265 .mc_wait_for_idle = &r100_mc_wait_for_idle, 267 266 .gart = { ··· 332 331 .get_rptr = &r100_gfx_get_rptr, 333 332 .get_wptr = &r100_gfx_get_wptr, 334 333 .set_wptr = &r100_gfx_set_wptr, 334 + .hdp_flush = &r100_ring_hdp_flush, 335 335 }; 336 336 337 337 static struct radeon_asic r300_asic = { ··· 342 340 .resume = &r300_resume, 343 341 .vga_set_state = &r100_vga_set_state, 344 342 .asic_reset = &r300_asic_reset, 345 - .ioctl_wait_idle = NULL, 343 + .mmio_hdp_flush = NULL, 346 344 .gui_idle = &r100_gui_idle, 347 345 .mc_wait_for_idle = &r300_mc_wait_for_idle, 348 346 .gart = { ··· 408 406 .resume = &r300_resume, 409 407 .vga_set_state = &r100_vga_set_state, 410 408 .asic_reset = &r300_asic_reset, 411 - .ioctl_wait_idle = NULL, 409 + .mmio_hdp_flush = NULL, 412 410 .gui_idle = &r100_gui_idle, 413 411 .mc_wait_for_idle = &r300_mc_wait_for_idle, 414 412 .gart = { ··· 474 472 .resume = &r420_resume, 475 473 .vga_set_state = &r100_vga_set_state, 476 474 .asic_reset = &r300_asic_reset, 477 - .ioctl_wait_idle = NULL, 475 + .mmio_hdp_flush = NULL, 478 476 .gui_idle = &r100_gui_idle, 479 477 .mc_wait_for_idle = &r300_mc_wait_for_idle, 480 478 .gart = { ··· 540 538 .resume = &rs400_resume, 541 539 .vga_set_state = &r100_vga_set_state, 542 540 .asic_reset = &r300_asic_reset, 543 - .ioctl_wait_idle = NULL, 541 + .mmio_hdp_flush = NULL, 544 542 .gui_idle = &r100_gui_idle, 545 543 .mc_wait_for_idle = &rs400_mc_wait_for_idle, 546 544 .gart = { ··· 606 604 .resume = &rs600_resume, 607 605 .vga_set_state = &r100_vga_set_state, 608 606 .asic_reset = &rs600_asic_reset, 609 - .ioctl_wait_idle = NULL, 607 + .mmio_hdp_flush = NULL, 610 608 .gui_idle = &r100_gui_idle, 611 609 .mc_wait_for_idle = &rs600_mc_wait_for_idle, 612 610 .gart = { ··· 674 672 .resume = &rs690_resume, 675 673 .vga_set_state = &r100_vga_set_state, 676 674 .asic_reset = &rs600_asic_reset, 677 - .ioctl_wait_idle = NULL, 675 + .mmio_hdp_flush = NULL, 678 676 .gui_idle = &r100_gui_idle, 679 677 .mc_wait_for_idle = &rs690_mc_wait_for_idle, 680 678 .gart = { ··· 742 740 .resume = &rv515_resume, 743 741 .vga_set_state = &r100_vga_set_state, 744 742 .asic_reset = &rs600_asic_reset, 745 - .ioctl_wait_idle = NULL, 743 + .mmio_hdp_flush = NULL, 746 744 .gui_idle = &r100_gui_idle, 747 745 .mc_wait_for_idle = &rv515_mc_wait_for_idle, 748 746 .gart = { ··· 808 806 .resume = &r520_resume, 809 807 .vga_set_state = &r100_vga_set_state, 810 808 .asic_reset = &rs600_asic_reset, 811 - .ioctl_wait_idle = NULL, 809 + .mmio_hdp_flush = NULL, 812 810 .gui_idle = &r100_gui_idle, 813 811 .mc_wait_for_idle = &r520_mc_wait_for_idle, 814 812 .gart = { ··· 900 898 .resume = &r600_resume, 901 899 .vga_set_state = &r600_vga_set_state, 902 900 .asic_reset = &r600_asic_reset, 903 - .ioctl_wait_idle = r600_ioctl_wait_idle, 901 + .mmio_hdp_flush = r600_mmio_hdp_flush, 904 902 .gui_idle = &r600_gui_idle, 905 903 .mc_wait_for_idle = &r600_mc_wait_for_idle, 906 904 .get_xclk = &r600_get_xclk, ··· 972 970 .resume = &r600_resume, 973 971 .vga_set_state = &r600_vga_set_state, 974 972 .asic_reset = &r600_asic_reset, 975 - .ioctl_wait_idle = r600_ioctl_wait_idle, 973 + .mmio_hdp_flush = r600_mmio_hdp_flush, 976 974 .gui_idle = &r600_gui_idle, 977 975 .mc_wait_for_idle = &r600_mc_wait_for_idle, 978 976 .get_xclk = &r600_get_xclk, ··· 1062 1060 .resume = &r600_resume, 1063 1061 .vga_set_state = &r600_vga_set_state, 1064 1062 .asic_reset = &r600_asic_reset, 1065 - .ioctl_wait_idle = r600_ioctl_wait_idle, 1063 + .mmio_hdp_flush = r600_mmio_hdp_flush, 1066 1064 .gui_idle = &r600_gui_idle, 1067 1065 .mc_wait_for_idle = &r600_mc_wait_for_idle, 1068 1066 .get_xclk = &r600_get_xclk, ··· 1165 1163 .resume = &rv770_resume, 1166 1164 .asic_reset = &r600_asic_reset, 1167 1165 .vga_set_state = &r600_vga_set_state, 1168 - .ioctl_wait_idle = r600_ioctl_wait_idle, 1166 + .mmio_hdp_flush = r600_mmio_hdp_flush, 1169 1167 .gui_idle = &r600_gui_idle, 1170 1168 .mc_wait_for_idle = &r600_mc_wait_for_idle, 1171 1169 .get_xclk = &rv770_get_xclk, ··· 1283 1281 .resume = &evergreen_resume, 1284 1282 .asic_reset = &evergreen_asic_reset, 1285 1283 .vga_set_state = &r600_vga_set_state, 1286 - .ioctl_wait_idle = r600_ioctl_wait_idle, 1284 + .mmio_hdp_flush = r600_mmio_hdp_flush, 1287 1285 .gui_idle = &r600_gui_idle, 1288 1286 .mc_wait_for_idle = &evergreen_mc_wait_for_idle, 1289 1287 .get_xclk = &rv770_get_xclk, ··· 1375 1373 .resume = &evergreen_resume, 1376 1374 .asic_reset = &evergreen_asic_reset, 1377 1375 .vga_set_state = &r600_vga_set_state, 1378 - .ioctl_wait_idle = r600_ioctl_wait_idle, 1376 + .mmio_hdp_flush = r600_mmio_hdp_flush, 1379 1377 .gui_idle = &r600_gui_idle, 1380 1378 .mc_wait_for_idle = &evergreen_mc_wait_for_idle, 1381 1379 .get_xclk = &r600_get_xclk, ··· 1466 1464 .resume = &evergreen_resume, 1467 1465 .asic_reset = &evergreen_asic_reset, 1468 1466 .vga_set_state = &r600_vga_set_state, 1469 - .ioctl_wait_idle = r600_ioctl_wait_idle, 1467 + .mmio_hdp_flush = r600_mmio_hdp_flush, 1470 1468 .gui_idle = &r600_gui_idle, 1471 1469 .mc_wait_for_idle = &evergreen_mc_wait_for_idle, 1472 1470 .get_xclk = &rv770_get_xclk, ··· 1601 1599 .resume = &cayman_resume, 1602 1600 .asic_reset = &cayman_asic_reset, 1603 1601 .vga_set_state = &r600_vga_set_state, 1604 - .ioctl_wait_idle = r600_ioctl_wait_idle, 1602 + .mmio_hdp_flush = r600_mmio_hdp_flush, 1605 1603 .gui_idle = &r600_gui_idle, 1606 1604 .mc_wait_for_idle = &evergreen_mc_wait_for_idle, 1607 1605 .get_xclk = &rv770_get_xclk, ··· 1613 1611 .vm = { 1614 1612 .init = &cayman_vm_init, 1615 1613 .fini = &cayman_vm_fini, 1616 - .set_page = &cayman_dma_vm_set_page, 1614 + .copy_pages = &cayman_dma_vm_copy_pages, 1615 + .write_pages = &cayman_dma_vm_write_pages, 1616 + .set_pages = &cayman_dma_vm_set_pages, 1617 + .pad_ib = &cayman_dma_vm_pad_ib, 1617 1618 }, 1618 1619 .ring = { 1619 1620 [RADEON_RING_TYPE_GFX_INDEX] = &cayman_gfx_ring, ··· 1704 1699 .resume = &cayman_resume, 1705 1700 .asic_reset = &cayman_asic_reset, 1706 1701 .vga_set_state = &r600_vga_set_state, 1707 - .ioctl_wait_idle = r600_ioctl_wait_idle, 1702 + .mmio_hdp_flush = r600_mmio_hdp_flush, 1708 1703 .gui_idle = &r600_gui_idle, 1709 1704 .mc_wait_for_idle = &evergreen_mc_wait_for_idle, 1710 1705 .get_xclk = &r600_get_xclk, ··· 1716 1711 .vm = { 1717 1712 .init = &cayman_vm_init, 1718 1713 .fini = &cayman_vm_fini, 1719 - .set_page = &cayman_dma_vm_set_page, 1714 + .copy_pages = &cayman_dma_vm_copy_pages, 1715 + .write_pages = &cayman_dma_vm_write_pages, 1716 + .set_pages = &cayman_dma_vm_set_pages, 1717 + .pad_ib = &cayman_dma_vm_pad_ib, 1720 1718 }, 1721 1719 .ring = { 1722 1720 [RADEON_RING_TYPE_GFX_INDEX] = &cayman_gfx_ring, ··· 1837 1829 .resume = &si_resume, 1838 1830 .asic_reset = &si_asic_reset, 1839 1831 .vga_set_state = &r600_vga_set_state, 1840 - .ioctl_wait_idle = r600_ioctl_wait_idle, 1832 + .mmio_hdp_flush = r600_mmio_hdp_flush, 1841 1833 .gui_idle = &r600_gui_idle, 1842 1834 .mc_wait_for_idle = &evergreen_mc_wait_for_idle, 1843 1835 .get_xclk = &si_get_xclk, ··· 1849 1841 .vm = { 1850 1842 .init = &si_vm_init, 1851 1843 .fini = &si_vm_fini, 1852 - .set_page = &si_dma_vm_set_page, 1844 + .copy_pages = &si_dma_vm_copy_pages, 1845 + .write_pages = &si_dma_vm_write_pages, 1846 + .set_pages = &si_dma_vm_set_pages, 1847 + .pad_ib = &cayman_dma_vm_pad_ib, 1853 1848 }, 1854 1849 .ring = { 1855 1850 [RADEON_RING_TYPE_GFX_INDEX] = &si_gfx_ring, ··· 1998 1987 .resume = &cik_resume, 1999 1988 .asic_reset = &cik_asic_reset, 2000 1989 .vga_set_state = &r600_vga_set_state, 2001 - .ioctl_wait_idle = NULL, 1990 + .mmio_hdp_flush = &r600_mmio_hdp_flush, 2002 1991 .gui_idle = &r600_gui_idle, 2003 1992 .mc_wait_for_idle = &evergreen_mc_wait_for_idle, 2004 1993 .get_xclk = &cik_get_xclk, ··· 2010 1999 .vm = { 2011 2000 .init = &cik_vm_init, 2012 2001 .fini = &cik_vm_fini, 2013 - .set_page = &cik_sdma_vm_set_page, 2002 + .copy_pages = &cik_sdma_vm_copy_pages, 2003 + .write_pages = &cik_sdma_vm_write_pages, 2004 + .set_pages = &cik_sdma_vm_set_pages, 2005 + .pad_ib = &cik_sdma_vm_pad_ib, 2014 2006 }, 2015 2007 .ring = { 2016 2008 [RADEON_RING_TYPE_GFX_INDEX] = &ci_gfx_ring, ··· 2105 2091 .resume = &cik_resume, 2106 2092 .asic_reset = &cik_asic_reset, 2107 2093 .vga_set_state = &r600_vga_set_state, 2108 - .ioctl_wait_idle = NULL, 2094 + .mmio_hdp_flush = &r600_mmio_hdp_flush, 2109 2095 .gui_idle = &r600_gui_idle, 2110 2096 .mc_wait_for_idle = &evergreen_mc_wait_for_idle, 2111 2097 .get_xclk = &cik_get_xclk, ··· 2117 2103 .vm = { 2118 2104 .init = &cik_vm_init, 2119 2105 .fini = &cik_vm_fini, 2120 - .set_page = &cik_sdma_vm_set_page, 2106 + .copy_pages = &cik_sdma_vm_copy_pages, 2107 + .write_pages = &cik_sdma_vm_write_pages, 2108 + .set_pages = &cik_sdma_vm_set_pages, 2109 + .pad_ib = &cik_sdma_vm_pad_ib, 2121 2110 }, 2122 2111 .ring = { 2123 2112 [RADEON_RING_TYPE_GFX_INDEX] = &ci_gfx_ring, ··· 2474 2457 rdev->cg_flags = 2475 2458 RADEON_CG_SUPPORT_GFX_MGCG | 2476 2459 RADEON_CG_SUPPORT_GFX_MGLS | 2477 - RADEON_CG_SUPPORT_GFX_CGCG | 2460 + /*RADEON_CG_SUPPORT_GFX_CGCG |*/ 2478 2461 RADEON_CG_SUPPORT_GFX_CGLS | 2479 2462 RADEON_CG_SUPPORT_GFX_CGTS | 2480 2463 RADEON_CG_SUPPORT_GFX_CGTS_LS | ··· 2493 2476 rdev->cg_flags = 2494 2477 RADEON_CG_SUPPORT_GFX_MGCG | 2495 2478 RADEON_CG_SUPPORT_GFX_MGLS | 2496 - RADEON_CG_SUPPORT_GFX_CGCG | 2479 + /*RADEON_CG_SUPPORT_GFX_CGCG |*/ 2497 2480 RADEON_CG_SUPPORT_GFX_CGLS | 2498 2481 RADEON_CG_SUPPORT_GFX_CGTS | 2499 2482 RADEON_CG_SUPPORT_GFX_CP_LS | ··· 2519 2502 rdev->cg_flags = 2520 2503 RADEON_CG_SUPPORT_GFX_MGCG | 2521 2504 RADEON_CG_SUPPORT_GFX_MGLS | 2522 - RADEON_CG_SUPPORT_GFX_CGCG | 2505 + /*RADEON_CG_SUPPORT_GFX_CGCG |*/ 2523 2506 RADEON_CG_SUPPORT_GFX_CGLS | 2524 2507 RADEON_CG_SUPPORT_GFX_CGTS | 2525 2508 RADEON_CG_SUPPORT_GFX_CGTS_LS | ··· 2547 2530 rdev->cg_flags = 2548 2531 RADEON_CG_SUPPORT_GFX_MGCG | 2549 2532 RADEON_CG_SUPPORT_GFX_MGLS | 2550 - RADEON_CG_SUPPORT_GFX_CGCG | 2533 + /*RADEON_CG_SUPPORT_GFX_CGCG |*/ 2551 2534 RADEON_CG_SUPPORT_GFX_CGLS | 2552 2535 RADEON_CG_SUPPORT_GFX_CGTS | 2553 2536 RADEON_CG_SUPPORT_GFX_CGTS_LS |
+56 -21
drivers/gpu/drm/radeon/radeon_asic.h
··· 68 68 u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc); 69 69 void r100_pci_gart_tlb_flush(struct radeon_device *rdev); 70 70 void r100_pci_gart_set_page(struct radeon_device *rdev, unsigned i, 71 - uint64_t addr); 71 + uint64_t addr, uint32_t flags); 72 72 void r100_ring_start(struct radeon_device *rdev, struct radeon_ring *ring); 73 73 int r100_irq_set(struct radeon_device *rdev); 74 74 int r100_irq_process(struct radeon_device *rdev); ··· 148 148 struct radeon_ring *ring); 149 149 void r100_gfx_set_wptr(struct radeon_device *rdev, 150 150 struct radeon_ring *ring); 151 - 151 + void r100_ring_hdp_flush(struct radeon_device *rdev, 152 + struct radeon_ring *ring); 152 153 /* 153 154 * r200,rv250,rs300,rv280 154 155 */ ··· 174 173 extern int r300_cs_parse(struct radeon_cs_parser *p); 175 174 extern void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev); 176 175 extern void rv370_pcie_gart_set_page(struct radeon_device *rdev, unsigned i, 177 - uint64_t addr); 176 + uint64_t addr, uint32_t flags); 178 177 extern void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes); 179 178 extern int rv370_get_pcie_lanes(struct radeon_device *rdev); 180 179 extern void r300_set_reg_safe(struct radeon_device *rdev); ··· 210 209 extern int rs400_resume(struct radeon_device *rdev); 211 210 void rs400_gart_tlb_flush(struct radeon_device *rdev); 212 211 void rs400_gart_set_page(struct radeon_device *rdev, unsigned i, 213 - uint64_t addr); 212 + uint64_t addr, uint32_t flags); 214 213 uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg); 215 214 void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); 216 215 int rs400_gart_init(struct radeon_device *rdev); ··· 234 233 u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc); 235 234 void rs600_gart_tlb_flush(struct radeon_device *rdev); 236 235 void rs600_gart_set_page(struct radeon_device *rdev, unsigned i, 237 - uint64_t addr); 236 + uint64_t addr, uint32_t flags); 238 237 uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg); 239 238 void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); 240 239 void rs600_bandwidth_update(struct radeon_device *rdev); ··· 352 351 bool r600_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd); 353 352 void r600_hpd_set_polarity(struct radeon_device *rdev, 354 353 enum radeon_hpd_id hpd); 355 - extern void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo); 354 + extern void r600_mmio_hdp_flush(struct radeon_device *rdev); 356 355 extern bool r600_gui_idle(struct radeon_device *rdev); 357 356 extern void r600_pm_misc(struct radeon_device *rdev); 358 357 extern void r600_pm_init_profile(struct radeon_device *rdev); ··· 607 606 struct radeon_ib *ib); 608 607 bool cayman_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring); 609 608 bool cayman_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring); 610 - void cayman_dma_vm_set_page(struct radeon_device *rdev, 611 - struct radeon_ib *ib, 612 - uint64_t pe, 613 - uint64_t addr, unsigned count, 614 - uint32_t incr, uint32_t flags); 609 + 610 + void cayman_dma_vm_copy_pages(struct radeon_device *rdev, 611 + struct radeon_ib *ib, 612 + uint64_t pe, uint64_t src, 613 + unsigned count); 614 + void cayman_dma_vm_write_pages(struct radeon_device *rdev, 615 + struct radeon_ib *ib, 616 + uint64_t pe, 617 + uint64_t addr, unsigned count, 618 + uint32_t incr, uint32_t flags); 619 + void cayman_dma_vm_set_pages(struct radeon_device *rdev, 620 + struct radeon_ib *ib, 621 + uint64_t pe, 622 + uint64_t addr, unsigned count, 623 + uint32_t incr, uint32_t flags); 624 + void cayman_dma_vm_pad_ib(struct radeon_ib *ib); 615 625 616 626 void cayman_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); 617 627 ··· 705 693 uint64_t src_offset, uint64_t dst_offset, 706 694 unsigned num_gpu_pages, 707 695 struct radeon_fence **fence); 708 - void si_dma_vm_set_page(struct radeon_device *rdev, 709 - struct radeon_ib *ib, 710 - uint64_t pe, 711 - uint64_t addr, unsigned count, 712 - uint32_t incr, uint32_t flags); 696 + 697 + void si_dma_vm_copy_pages(struct radeon_device *rdev, 698 + struct radeon_ib *ib, 699 + uint64_t pe, uint64_t src, 700 + unsigned count); 701 + void si_dma_vm_write_pages(struct radeon_device *rdev, 702 + struct radeon_ib *ib, 703 + uint64_t pe, 704 + uint64_t addr, unsigned count, 705 + uint32_t incr, uint32_t flags); 706 + void si_dma_vm_set_pages(struct radeon_device *rdev, 707 + struct radeon_ib *ib, 708 + uint64_t pe, 709 + uint64_t addr, unsigned count, 710 + uint32_t incr, uint32_t flags); 711 + 713 712 void si_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); 714 713 u32 si_get_xclk(struct radeon_device *rdev); 715 714 uint64_t si_get_gpu_clock_counter(struct radeon_device *rdev); ··· 794 771 int cik_vm_init(struct radeon_device *rdev); 795 772 void cik_vm_fini(struct radeon_device *rdev); 796 773 void cik_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); 797 - void cik_sdma_vm_set_page(struct radeon_device *rdev, 798 - struct radeon_ib *ib, 799 - uint64_t pe, 800 - uint64_t addr, unsigned count, 801 - uint32_t incr, uint32_t flags); 774 + 775 + void cik_sdma_vm_copy_pages(struct radeon_device *rdev, 776 + struct radeon_ib *ib, 777 + uint64_t pe, uint64_t src, 778 + unsigned count); 779 + void cik_sdma_vm_write_pages(struct radeon_device *rdev, 780 + struct radeon_ib *ib, 781 + uint64_t pe, 782 + uint64_t addr, unsigned count, 783 + uint32_t incr, uint32_t flags); 784 + void cik_sdma_vm_set_pages(struct radeon_device *rdev, 785 + struct radeon_ib *ib, 786 + uint64_t pe, 787 + uint64_t addr, unsigned count, 788 + uint32_t incr, uint32_t flags); 789 + void cik_sdma_vm_pad_ib(struct radeon_ib *ib); 790 + 802 791 void cik_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); 803 792 int cik_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); 804 793 u32 cik_gfx_get_rptr(struct radeon_device *rdev,
+81 -2
drivers/gpu/drm/radeon/radeon_atombios.c
··· 1963 1963 "adm1032", 1964 1964 "adm1030", 1965 1965 "max6649", 1966 - "lm64", 1966 + "lm63", /* lm64 */ 1967 1967 "f75375", 1968 1968 "asc7xxx", 1969 1969 }; ··· 1974 1974 "adm1032", 1975 1975 "adm1030", 1976 1976 "max6649", 1977 - "lm64", 1977 + "lm63", /* lm64 */ 1978 1978 "f75375", 1979 1979 "RV6xx", 1980 1980 "RV770", ··· 3236 3236 return 0; 3237 3237 } 3238 3238 3239 + union get_voltage_info { 3240 + struct _GET_VOLTAGE_INFO_INPUT_PARAMETER_V1_2 in; 3241 + struct _GET_EVV_VOLTAGE_INFO_OUTPUT_PARAMETER_V1_2 evv_out; 3242 + }; 3243 + 3244 + int radeon_atom_get_voltage_evv(struct radeon_device *rdev, 3245 + u16 virtual_voltage_id, 3246 + u16 *voltage) 3247 + { 3248 + int index = GetIndexIntoMasterTable(COMMAND, GetVoltageInfo); 3249 + u32 entry_id; 3250 + u32 count = rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.count; 3251 + union get_voltage_info args; 3252 + 3253 + for (entry_id = 0; entry_id < count; entry_id++) { 3254 + if (rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[entry_id].v == 3255 + virtual_voltage_id) 3256 + break; 3257 + } 3258 + 3259 + if (entry_id >= count) 3260 + return -EINVAL; 3261 + 3262 + args.in.ucVoltageType = VOLTAGE_TYPE_VDDC; 3263 + args.in.ucVoltageMode = ATOM_GET_VOLTAGE_EVV_VOLTAGE; 3264 + args.in.ulSCLKFreq = 3265 + cpu_to_le32(rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[entry_id].clk); 3266 + 3267 + atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 3268 + 3269 + *voltage = le16_to_cpu(args.evv_out.usVoltageLevel); 3270 + 3271 + return 0; 3272 + } 3273 + 3239 3274 int radeon_atom_get_voltage_gpio_settings(struct radeon_device *rdev, 3240 3275 u16 voltage_level, u8 voltage_type, 3241 3276 u32 *gpio_value, u32 *gpio_mask) ··· 3430 3395 3431 3396 } 3432 3397 return false; 3398 + } 3399 + 3400 + int radeon_atom_get_svi2_info(struct radeon_device *rdev, 3401 + u8 voltage_type, 3402 + u8 *svd_gpio_id, u8 *svc_gpio_id) 3403 + { 3404 + int index = GetIndexIntoMasterTable(DATA, VoltageObjectInfo); 3405 + u8 frev, crev; 3406 + u16 data_offset, size; 3407 + union voltage_object_info *voltage_info; 3408 + union voltage_object *voltage_object = NULL; 3409 + 3410 + if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, 3411 + &frev, &crev, &data_offset)) { 3412 + voltage_info = (union voltage_object_info *) 3413 + (rdev->mode_info.atom_context->bios + data_offset); 3414 + 3415 + switch (frev) { 3416 + case 3: 3417 + switch (crev) { 3418 + case 1: 3419 + voltage_object = (union voltage_object *) 3420 + atom_lookup_voltage_object_v3(&voltage_info->v3, 3421 + voltage_type, 3422 + VOLTAGE_OBJ_SVID2); 3423 + if (voltage_object) { 3424 + *svd_gpio_id = voltage_object->v3.asSVID2Obj.ucSVDGpioId; 3425 + *svc_gpio_id = voltage_object->v3.asSVID2Obj.ucSVCGpioId; 3426 + } else { 3427 + return -EINVAL; 3428 + } 3429 + break; 3430 + default: 3431 + DRM_ERROR("unknown voltage object table\n"); 3432 + return -EINVAL; 3433 + } 3434 + break; 3435 + default: 3436 + DRM_ERROR("unknown voltage object table\n"); 3437 + return -EINVAL; 3438 + } 3439 + 3440 + } 3441 + return 0; 3433 3442 } 3434 3443 3435 3444 int radeon_atom_get_max_voltage(struct radeon_device *rdev,
+2 -2
drivers/gpu/drm/radeon/radeon_benchmark.c
··· 97 97 int time; 98 98 99 99 n = RADEON_BENCHMARK_ITERATIONS; 100 - r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, NULL, &sobj); 100 + r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, 0, NULL, &sobj); 101 101 if (r) { 102 102 goto out_cleanup; 103 103 } ··· 109 109 if (r) { 110 110 goto out_cleanup; 111 111 } 112 - r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, NULL, &dobj); 112 + r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, 0, NULL, &dobj); 113 113 if (r) { 114 114 goto out_cleanup; 115 115 }
+230 -86
drivers/gpu/drm/radeon/radeon_connectors.c
··· 107 107 case DRM_MODE_CONNECTOR_DVII: 108 108 case DRM_MODE_CONNECTOR_HDMIB: 109 109 if (radeon_connector->use_digital) { 110 - if (drm_detect_hdmi_monitor(radeon_connector->edid)) { 110 + if (drm_detect_hdmi_monitor(radeon_connector_edid(connector))) { 111 111 if (connector->display_info.bpc) 112 112 bpc = connector->display_info.bpc; 113 113 } ··· 115 115 break; 116 116 case DRM_MODE_CONNECTOR_DVID: 117 117 case DRM_MODE_CONNECTOR_HDMIA: 118 - if (drm_detect_hdmi_monitor(radeon_connector->edid)) { 118 + if (drm_detect_hdmi_monitor(radeon_connector_edid(connector))) { 119 119 if (connector->display_info.bpc) 120 120 bpc = connector->display_info.bpc; 121 121 } ··· 124 124 dig_connector = radeon_connector->con_priv; 125 125 if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || 126 126 (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) || 127 - drm_detect_hdmi_monitor(radeon_connector->edid)) { 127 + drm_detect_hdmi_monitor(radeon_connector_edid(connector))) { 128 128 if (connector->display_info.bpc) 129 129 bpc = connector->display_info.bpc; 130 130 } ··· 148 148 break; 149 149 } 150 150 151 - if (drm_detect_hdmi_monitor(radeon_connector->edid)) { 151 + if (drm_detect_hdmi_monitor(radeon_connector_edid(connector))) { 152 152 /* hdmi deep color only implemented on DCE4+ */ 153 153 if ((bpc > 8) && !ASIC_IS_DCE4(rdev)) { 154 154 DRM_DEBUG("%s: HDMI deep color %d bpc unsupported. Using 8 bpc.\n", ··· 197 197 connector->name, bpc); 198 198 } 199 199 } 200 + else if (bpc > 8) { 201 + /* max_tmds_clock missing, but hdmi spec mandates it for deep color. */ 202 + DRM_DEBUG("%s: Required max tmds clock for HDMI deep color missing. Using 8 bpc.\n", 203 + connector->name); 204 + bpc = 8; 205 + } 200 206 } 201 207 202 - if ((radeon_deep_color == 0) && (bpc > 8)) 208 + if ((radeon_deep_color == 0) && (bpc > 8)) { 209 + DRM_DEBUG("%s: Deep color disabled. Set radeon module param deep_color=1 to enable.\n", 210 + connector->name); 203 211 bpc = 8; 212 + } 204 213 205 214 DRM_DEBUG("%s: Display bpc=%d, returned bpc=%d\n", 206 215 connector->name, connector->display_info.bpc, bpc); ··· 271 262 return NULL; 272 263 } 273 264 265 + struct edid *radeon_connector_edid(struct drm_connector *connector) 266 + { 267 + struct radeon_connector *radeon_connector = to_radeon_connector(connector); 268 + struct drm_property_blob *edid_blob = connector->edid_blob_ptr; 269 + 270 + if (radeon_connector->edid) { 271 + return radeon_connector->edid; 272 + } else if (edid_blob) { 273 + struct edid *edid = kmemdup(edid_blob->data, edid_blob->length, GFP_KERNEL); 274 + if (edid) 275 + radeon_connector->edid = edid; 276 + } 277 + return radeon_connector->edid; 278 + } 279 + 280 + static void radeon_connector_get_edid(struct drm_connector *connector) 281 + { 282 + struct drm_device *dev = connector->dev; 283 + struct radeon_device *rdev = dev->dev_private; 284 + struct radeon_connector *radeon_connector = to_radeon_connector(connector); 285 + 286 + if (radeon_connector->edid) 287 + return; 288 + 289 + /* on hw with routers, select right port */ 290 + if (radeon_connector->router.ddc_valid) 291 + radeon_router_select_ddc_port(radeon_connector); 292 + 293 + if ((radeon_connector_encoder_get_dp_bridge_encoder_id(connector) != 294 + ENCODER_OBJECT_ID_NONE) && 295 + radeon_connector->ddc_bus->has_aux) { 296 + radeon_connector->edid = drm_get_edid(connector, 297 + &radeon_connector->ddc_bus->aux.ddc); 298 + } else if ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) || 299 + (connector->connector_type == DRM_MODE_CONNECTOR_eDP)) { 300 + struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; 301 + 302 + if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT || 303 + dig->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) && 304 + radeon_connector->ddc_bus->has_aux) 305 + radeon_connector->edid = drm_get_edid(&radeon_connector->base, 306 + &radeon_connector->ddc_bus->aux.ddc); 307 + else if (radeon_connector->ddc_bus) 308 + radeon_connector->edid = drm_get_edid(&radeon_connector->base, 309 + &radeon_connector->ddc_bus->adapter); 310 + } else if (radeon_connector->ddc_bus) { 311 + radeon_connector->edid = drm_get_edid(&radeon_connector->base, 312 + &radeon_connector->ddc_bus->adapter); 313 + } 314 + 315 + if (!radeon_connector->edid) { 316 + if (rdev->is_atom_bios) { 317 + /* some laptops provide a hardcoded edid in rom for LCDs */ 318 + if (((connector->connector_type == DRM_MODE_CONNECTOR_LVDS) || 319 + (connector->connector_type == DRM_MODE_CONNECTOR_eDP))) 320 + radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev); 321 + } else { 322 + /* some servers provide a hardcoded edid in rom for KVMs */ 323 + radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev); 324 + } 325 + } 326 + } 327 + 328 + static void radeon_connector_free_edid(struct drm_connector *connector) 329 + { 330 + struct radeon_connector *radeon_connector = to_radeon_connector(connector); 331 + 332 + if (radeon_connector->edid) { 333 + kfree(radeon_connector->edid); 334 + radeon_connector->edid = NULL; 335 + } 336 + } 337 + 338 + static int radeon_ddc_get_modes(struct drm_connector *connector) 339 + { 340 + struct radeon_connector *radeon_connector = to_radeon_connector(connector); 341 + int ret; 342 + 343 + if (radeon_connector->edid) { 344 + drm_mode_connector_update_edid_property(connector, radeon_connector->edid); 345 + ret = drm_add_edid_modes(connector, radeon_connector->edid); 346 + drm_edid_to_eld(connector, radeon_connector->edid); 347 + return ret; 348 + } 349 + drm_mode_connector_update_edid_property(connector, NULL); 350 + return 0; 351 + } 352 + 274 353 static struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector) 275 354 { 276 355 int enc_id = connector->encoder_ids[0]; ··· 366 269 if (enc_id) 367 270 return drm_encoder_find(connector->dev, enc_id); 368 271 return NULL; 272 + } 273 + 274 + static void radeon_get_native_mode(struct drm_connector *connector) 275 + { 276 + struct drm_encoder *encoder = radeon_best_single_encoder(connector); 277 + struct radeon_encoder *radeon_encoder; 278 + 279 + if (encoder == NULL) 280 + return; 281 + 282 + radeon_encoder = to_radeon_encoder(encoder); 283 + 284 + if (!list_empty(&connector->probed_modes)) { 285 + struct drm_display_mode *preferred_mode = 286 + list_first_entry(&connector->probed_modes, 287 + struct drm_display_mode, head); 288 + 289 + radeon_encoder->native_mode = *preferred_mode; 290 + } else { 291 + radeon_encoder->native_mode.clock = 0; 292 + } 369 293 } 370 294 371 295 /* ··· 689 571 radeon_property_change_mode(&radeon_encoder->base); 690 572 } 691 573 574 + if (property == dev->mode_config.scaling_mode_property) { 575 + enum radeon_rmx_type rmx_type; 576 + 577 + if (connector->encoder) 578 + radeon_encoder = to_radeon_encoder(connector->encoder); 579 + else { 580 + struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; 581 + radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector)); 582 + } 583 + 584 + switch (val) { 585 + default: 586 + case DRM_MODE_SCALE_NONE: rmx_type = RMX_OFF; break; 587 + case DRM_MODE_SCALE_CENTER: rmx_type = RMX_CENTER; break; 588 + case DRM_MODE_SCALE_ASPECT: rmx_type = RMX_ASPECT; break; 589 + case DRM_MODE_SCALE_FULLSCREEN: rmx_type = RMX_FULL; break; 590 + } 591 + if (radeon_encoder->rmx_type == rmx_type) 592 + return 0; 593 + 594 + if ((rmx_type != DRM_MODE_SCALE_NONE) && 595 + (radeon_encoder->native_mode.clock == 0)) 596 + return 0; 597 + 598 + radeon_encoder->rmx_type = rmx_type; 599 + 600 + radeon_property_change_mode(&radeon_encoder->base); 601 + } 602 + 692 603 return 0; 693 604 } 694 605 ··· 758 611 759 612 static int radeon_lvds_get_modes(struct drm_connector *connector) 760 613 { 761 - struct radeon_connector *radeon_connector = to_radeon_connector(connector); 762 614 struct drm_encoder *encoder; 763 615 int ret = 0; 764 616 struct drm_display_mode *mode; 765 617 766 - if (radeon_connector->ddc_bus) { 767 - ret = radeon_ddc_get_modes(radeon_connector); 768 - if (ret > 0) { 769 - encoder = radeon_best_single_encoder(connector); 770 - if (encoder) { 771 - radeon_fixup_lvds_native_mode(encoder, connector); 772 - /* add scaled modes */ 773 - radeon_add_common_modes(encoder, connector); 774 - } 775 - return ret; 618 + radeon_connector_get_edid(connector); 619 + ret = radeon_ddc_get_modes(connector); 620 + if (ret > 0) { 621 + encoder = radeon_best_single_encoder(connector); 622 + if (encoder) { 623 + radeon_fixup_lvds_native_mode(encoder, connector); 624 + /* add scaled modes */ 625 + radeon_add_common_modes(encoder, connector); 776 626 } 627 + return ret; 777 628 } 778 629 779 630 encoder = radeon_best_single_encoder(connector); ··· 846 701 } 847 702 848 703 /* check for edid as well */ 704 + radeon_connector_get_edid(connector); 849 705 if (radeon_connector->edid) 850 706 ret = connector_status_connected; 851 - else { 852 - if (radeon_connector->ddc_bus) { 853 - radeon_connector->edid = drm_get_edid(&radeon_connector->base, 854 - &radeon_connector->ddc_bus->adapter); 855 - if (radeon_connector->edid) 856 - ret = connector_status_connected; 857 - } 858 - } 859 707 /* check acpi lid status ??? */ 860 708 861 709 radeon_connector_update_scratch_regs(connector, ret); ··· 861 723 { 862 724 struct radeon_connector *radeon_connector = to_radeon_connector(connector); 863 725 864 - if (radeon_connector->edid) 865 - kfree(radeon_connector->edid); 726 + radeon_connector_free_edid(connector); 866 727 kfree(radeon_connector->con_priv); 867 728 drm_connector_unregister(connector); 868 729 drm_connector_cleanup(connector); ··· 920 783 921 784 static int radeon_vga_get_modes(struct drm_connector *connector) 922 785 { 923 - struct radeon_connector *radeon_connector = to_radeon_connector(connector); 924 786 int ret; 925 787 926 - ret = radeon_ddc_get_modes(radeon_connector); 788 + radeon_connector_get_edid(connector); 789 + ret = radeon_ddc_get_modes(connector); 790 + 791 + radeon_get_native_mode(connector); 927 792 928 793 return ret; 929 794 } ··· 968 829 dret = radeon_ddc_probe(radeon_connector, false); 969 830 if (dret) { 970 831 radeon_connector->detected_by_load = false; 971 - if (radeon_connector->edid) { 972 - kfree(radeon_connector->edid); 973 - radeon_connector->edid = NULL; 974 - } 975 - radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter); 832 + radeon_connector_free_edid(connector); 833 + radeon_connector_get_edid(connector); 976 834 977 835 if (!radeon_connector->edid) { 978 836 DRM_ERROR("%s: probed a monitor but no|invalid EDID\n", 979 837 connector->name); 980 838 ret = connector_status_connected; 981 839 } else { 982 - radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL); 840 + radeon_connector->use_digital = 841 + !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL); 983 842 984 843 /* some oems have boards with separate digital and analog connectors 985 844 * with a shared ddc line (often vga + hdmi) 986 845 */ 987 846 if (radeon_connector->use_digital && radeon_connector->shared_ddc) { 988 - kfree(radeon_connector->edid); 989 - radeon_connector->edid = NULL; 847 + radeon_connector_free_edid(connector); 990 848 ret = connector_status_disconnected; 991 - } else 849 + } else { 992 850 ret = connector_status_connected; 851 + } 993 852 } 994 853 } else { 995 854 ··· 1122 985 .set_property = radeon_connector_set_property, 1123 986 }; 1124 987 1125 - static int radeon_dvi_get_modes(struct drm_connector *connector) 1126 - { 1127 - struct radeon_connector *radeon_connector = to_radeon_connector(connector); 1128 - int ret; 1129 - 1130 - ret = radeon_ddc_get_modes(radeon_connector); 1131 - return ret; 1132 - } 1133 - 1134 988 static bool radeon_check_hpd_status_unchanged(struct drm_connector *connector) 1135 989 { 1136 990 struct drm_device *dev = connector->dev; ··· 1179 1051 dret = radeon_ddc_probe(radeon_connector, false); 1180 1052 if (dret) { 1181 1053 radeon_connector->detected_by_load = false; 1182 - if (radeon_connector->edid) { 1183 - kfree(radeon_connector->edid); 1184 - radeon_connector->edid = NULL; 1185 - } 1186 - radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter); 1054 + radeon_connector_free_edid(connector); 1055 + radeon_connector_get_edid(connector); 1187 1056 1188 1057 if (!radeon_connector->edid) { 1189 1058 DRM_ERROR("%s: probed a monitor but no|invalid EDID\n", 1190 1059 connector->name); 1191 1060 /* rs690 seems to have a problem with connectors not existing and always 1192 1061 * return a block of 0's. If we see this just stop polling on this output */ 1193 - if ((rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) && radeon_connector->base.null_edid_counter) { 1062 + if ((rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) && 1063 + radeon_connector->base.null_edid_counter) { 1194 1064 ret = connector_status_disconnected; 1195 1065 DRM_ERROR("%s: detected RS690 floating bus bug, stopping ddc detect\n", 1196 1066 connector->name); ··· 1198 1072 broken_edid = true; /* defer use_digital to later */ 1199 1073 } 1200 1074 } else { 1201 - radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL); 1075 + radeon_connector->use_digital = 1076 + !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL); 1202 1077 1203 1078 /* some oems have boards with separate digital and analog connectors 1204 1079 * with a shared ddc line (often vga + hdmi) 1205 1080 */ 1206 1081 if ((!radeon_connector->use_digital) && radeon_connector->shared_ddc) { 1207 - kfree(radeon_connector->edid); 1208 - radeon_connector->edid = NULL; 1082 + radeon_connector_free_edid(connector); 1209 1083 ret = connector_status_disconnected; 1210 - } else 1084 + } else { 1211 1085 ret = connector_status_connected; 1212 - 1086 + } 1213 1087 /* This gets complicated. We have boards with VGA + HDMI with a 1214 1088 * shared DDC line and we have boards with DVI-D + HDMI with a shared 1215 1089 * DDC line. The latter is more complex because with DVI<->HDMI adapters ··· 1229 1103 if (list_connector->connector_type != DRM_MODE_CONNECTOR_VGA) { 1230 1104 /* hpd is our only option in this case */ 1231 1105 if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { 1232 - kfree(radeon_connector->edid); 1233 - radeon_connector->edid = NULL; 1106 + radeon_connector_free_edid(connector); 1234 1107 ret = connector_status_disconnected; 1235 1108 } 1236 1109 } ··· 1390 1265 (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) || 1391 1266 (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B)) 1392 1267 return MODE_OK; 1393 - else if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) { 1268 + else if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) { 1394 1269 /* HDMI 1.3+ supports max clock of 340 Mhz */ 1395 1270 if (mode->clock > 340000) 1396 1271 return MODE_CLOCK_HIGH; ··· 1409 1284 } 1410 1285 1411 1286 static const struct drm_connector_helper_funcs radeon_dvi_connector_helper_funcs = { 1412 - .get_modes = radeon_dvi_get_modes, 1287 + .get_modes = radeon_vga_get_modes, 1413 1288 .mode_valid = radeon_dvi_mode_valid, 1414 1289 .best_encoder = radeon_dvi_encoder, 1415 1290 }; ··· 1438 1313 if (!radeon_dig_connector->edp_on) 1439 1314 atombios_set_edp_panel_power(connector, 1440 1315 ATOM_TRANSMITTER_ACTION_POWER_ON); 1441 - ret = radeon_ddc_get_modes(radeon_connector); 1316 + radeon_connector_get_edid(connector); 1317 + ret = radeon_ddc_get_modes(connector); 1442 1318 if (!radeon_dig_connector->edp_on) 1443 1319 atombios_set_edp_panel_power(connector, 1444 1320 ATOM_TRANSMITTER_ACTION_POWER_OFF); ··· 1450 1324 if (encoder) 1451 1325 radeon_atom_ext_encoder_setup_ddc(encoder); 1452 1326 } 1453 - ret = radeon_ddc_get_modes(radeon_connector); 1327 + radeon_connector_get_edid(connector); 1328 + ret = radeon_ddc_get_modes(connector); 1454 1329 } 1455 1330 1456 1331 if (ret > 0) { ··· 1484 1357 if (encoder) 1485 1358 radeon_atom_ext_encoder_setup_ddc(encoder); 1486 1359 } 1487 - ret = radeon_ddc_get_modes(radeon_connector); 1360 + radeon_connector_get_edid(connector); 1361 + ret = radeon_ddc_get_modes(connector); 1362 + 1363 + radeon_get_native_mode(connector); 1488 1364 } 1489 1365 1490 1366 return ret; ··· 1521 1391 return ENCODER_OBJECT_ID_NONE; 1522 1392 } 1523 1393 1524 - bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector) 1394 + static bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector) 1525 1395 { 1526 1396 struct drm_encoder *encoder; 1527 1397 struct radeon_encoder *radeon_encoder; ··· 1578 1448 goto out; 1579 1449 } 1580 1450 1581 - if (radeon_connector->edid) { 1582 - kfree(radeon_connector->edid); 1583 - radeon_connector->edid = NULL; 1584 - } 1451 + radeon_connector_free_edid(connector); 1585 1452 1586 1453 if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) || 1587 1454 (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) { ··· 1684 1557 (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) { 1685 1558 return radeon_dp_mode_valid_helper(connector, mode); 1686 1559 } else { 1687 - if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) { 1560 + if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) { 1688 1561 /* HDMI 1.3+ supports max clock of 340 Mhz */ 1689 1562 if (mode->clock > 340000) 1690 1563 return MODE_CLOCK_HIGH; ··· 1844 1717 drm_object_attach_property(&radeon_connector->base.base, 1845 1718 rdev->mode_info.load_detect_property, 1846 1719 1); 1720 + drm_object_attach_property(&radeon_connector->base.base, 1721 + dev->mode_config.scaling_mode_property, 1722 + DRM_MODE_SCALE_NONE); 1847 1723 break; 1848 1724 case DRM_MODE_CONNECTOR_DVII: 1849 1725 case DRM_MODE_CONNECTOR_DVID: ··· 1866 1736 drm_object_attach_property(&radeon_connector->base.base, 1867 1737 rdev->mode_info.underscan_vborder_property, 1868 1738 0); 1739 + 1740 + drm_object_attach_property(&radeon_connector->base.base, 1741 + dev->mode_config.scaling_mode_property, 1742 + DRM_MODE_SCALE_NONE); 1869 1743 1870 1744 drm_object_attach_property(&radeon_connector->base.base, 1871 1745 rdev->mode_info.dither_property, ··· 1921 1787 drm_object_attach_property(&radeon_connector->base.base, 1922 1788 rdev->mode_info.load_detect_property, 1923 1789 1); 1790 + if (ASIC_IS_AVIVO(rdev)) 1791 + drm_object_attach_property(&radeon_connector->base.base, 1792 + dev->mode_config.scaling_mode_property, 1793 + DRM_MODE_SCALE_NONE); 1924 1794 /* no HPD on analog connectors */ 1925 1795 radeon_connector->hpd.hpd = RADEON_HPD_NONE; 1926 1796 connector->polled = DRM_CONNECTOR_POLL_CONNECT; ··· 1943 1805 drm_object_attach_property(&radeon_connector->base.base, 1944 1806 rdev->mode_info.load_detect_property, 1945 1807 1); 1808 + if (ASIC_IS_AVIVO(rdev)) 1809 + drm_object_attach_property(&radeon_connector->base.base, 1810 + dev->mode_config.scaling_mode_property, 1811 + DRM_MODE_SCALE_NONE); 1946 1812 /* no HPD on analog connectors */ 1947 1813 radeon_connector->hpd.hpd = RADEON_HPD_NONE; 1948 1814 connector->interlace_allowed = true; ··· 1980 1838 drm_object_attach_property(&radeon_connector->base.base, 1981 1839 rdev->mode_info.underscan_vborder_property, 1982 1840 0); 1841 + drm_object_attach_property(&radeon_connector->base.base, 1842 + rdev->mode_info.dither_property, 1843 + RADEON_FMT_DITHER_DISABLE); 1844 + drm_object_attach_property(&radeon_connector->base.base, 1845 + dev->mode_config.scaling_mode_property, 1846 + DRM_MODE_SCALE_NONE); 1983 1847 } 1984 1848 if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) { 1985 1849 drm_object_attach_property(&radeon_connector->base.base, 1986 1850 rdev->mode_info.audio_property, 1987 1851 RADEON_AUDIO_AUTO); 1988 - } 1989 - if (ASIC_IS_AVIVO(rdev)) { 1990 - drm_object_attach_property(&radeon_connector->base.base, 1991 - rdev->mode_info.dither_property, 1992 - RADEON_FMT_DITHER_DISABLE); 1993 1852 } 1994 1853 if (connector_type == DRM_MODE_CONNECTOR_DVII) { 1995 1854 radeon_connector->dac_load_detect = true; ··· 2031 1888 drm_object_attach_property(&radeon_connector->base.base, 2032 1889 rdev->mode_info.underscan_vborder_property, 2033 1890 0); 1891 + drm_object_attach_property(&radeon_connector->base.base, 1892 + rdev->mode_info.dither_property, 1893 + RADEON_FMT_DITHER_DISABLE); 1894 + drm_object_attach_property(&radeon_connector->base.base, 1895 + dev->mode_config.scaling_mode_property, 1896 + DRM_MODE_SCALE_NONE); 2034 1897 } 2035 1898 if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) { 2036 1899 drm_object_attach_property(&radeon_connector->base.base, 2037 1900 rdev->mode_info.audio_property, 2038 1901 RADEON_AUDIO_AUTO); 2039 - } 2040 - if (ASIC_IS_AVIVO(rdev)) { 2041 - drm_object_attach_property(&radeon_connector->base.base, 2042 - rdev->mode_info.dither_property, 2043 - RADEON_FMT_DITHER_DISABLE); 2044 1902 } 2045 1903 subpixel_order = SubPixelHorizontalRGB; 2046 1904 connector->interlace_allowed = true; ··· 2079 1935 drm_object_attach_property(&radeon_connector->base.base, 2080 1936 rdev->mode_info.underscan_vborder_property, 2081 1937 0); 1938 + drm_object_attach_property(&radeon_connector->base.base, 1939 + rdev->mode_info.dither_property, 1940 + RADEON_FMT_DITHER_DISABLE); 1941 + drm_object_attach_property(&radeon_connector->base.base, 1942 + dev->mode_config.scaling_mode_property, 1943 + DRM_MODE_SCALE_NONE); 2082 1944 } 2083 1945 if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) { 2084 1946 drm_object_attach_property(&radeon_connector->base.base, 2085 1947 rdev->mode_info.audio_property, 2086 1948 RADEON_AUDIO_AUTO); 2087 - } 2088 - if (ASIC_IS_AVIVO(rdev)) { 2089 - drm_object_attach_property(&radeon_connector->base.base, 2090 - rdev->mode_info.dither_property, 2091 - RADEON_FMT_DITHER_DISABLE); 2092 - 2093 1949 } 2094 1950 connector->interlace_allowed = true; 2095 1951 /* in theory with a DP to VGA converter... */
+2 -1
drivers/gpu/drm/radeon/radeon_cs.c
··· 500 500 if (r) 501 501 return r; 502 502 } 503 - return 0; 503 + 504 + return radeon_vm_clear_invalids(rdev, vm); 504 505 } 505 506 506 507 static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,
+65 -22
drivers/gpu/drm/radeon/radeon_device.c
··· 103 103 "LAST", 104 104 }; 105 105 106 + #define RADEON_PX_QUIRK_DISABLE_PX (1 << 0) 107 + #define RADEON_PX_QUIRK_LONG_WAKEUP (1 << 1) 108 + 109 + struct radeon_px_quirk { 110 + u32 chip_vendor; 111 + u32 chip_device; 112 + u32 subsys_vendor; 113 + u32 subsys_device; 114 + u32 px_quirk_flags; 115 + }; 116 + 117 + static struct radeon_px_quirk radeon_px_quirk_list[] = { 118 + /* Acer aspire 5560g (CPU: AMD A4-3305M; GPU: AMD Radeon HD 6480g + 7470m) 119 + * https://bugzilla.kernel.org/show_bug.cgi?id=74551 120 + */ 121 + { PCI_VENDOR_ID_ATI, 0x6760, 0x1025, 0x0672, RADEON_PX_QUIRK_DISABLE_PX }, 122 + /* Asus K73TA laptop with AMD A6-3400M APU and Radeon 6550 GPU 123 + * https://bugzilla.kernel.org/show_bug.cgi?id=51381 124 + */ 125 + { PCI_VENDOR_ID_ATI, 0x6741, 0x1043, 0x108c, RADEON_PX_QUIRK_DISABLE_PX }, 126 + /* macbook pro 8.2 */ 127 + { PCI_VENDOR_ID_ATI, 0x6741, PCI_VENDOR_ID_APPLE, 0x00e2, RADEON_PX_QUIRK_LONG_WAKEUP }, 128 + { 0, 0, 0, 0, 0 }, 129 + }; 130 + 106 131 bool radeon_is_px(struct drm_device *dev) 107 132 { 108 133 struct radeon_device *rdev = dev->dev_private; ··· 135 110 if (rdev->flags & RADEON_IS_PX) 136 111 return true; 137 112 return false; 113 + } 114 + 115 + static void radeon_device_handle_px_quirks(struct radeon_device *rdev) 116 + { 117 + struct radeon_px_quirk *p = radeon_px_quirk_list; 118 + 119 + /* Apply PX quirks */ 120 + while (p && p->chip_device != 0) { 121 + if (rdev->pdev->vendor == p->chip_vendor && 122 + rdev->pdev->device == p->chip_device && 123 + rdev->pdev->subsystem_vendor == p->subsys_vendor && 124 + rdev->pdev->subsystem_device == p->subsys_device) { 125 + rdev->px_quirk_flags = p->px_quirk_flags; 126 + break; 127 + } 128 + ++p; 129 + } 130 + 131 + if (rdev->px_quirk_flags & RADEON_PX_QUIRK_DISABLE_PX) 132 + rdev->flags &= ~RADEON_IS_PX; 138 133 } 139 134 140 135 /** ··· 430 385 431 386 if (rdev->wb.wb_obj == NULL) { 432 387 r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true, 433 - RADEON_GEM_DOMAIN_GTT, NULL, &rdev->wb.wb_obj); 388 + RADEON_GEM_DOMAIN_GTT, 0, NULL, 389 + &rdev->wb.wb_obj); 434 390 if (r) { 435 391 dev_warn(rdev->dev, "(%d) create WB bo failed\n", r); 436 392 return r; ··· 1123 1077 /* defines number of bits in page table versus page directory, 1124 1078 * a page is 4KB so we have 12 bits offset, minimum 9 bits in the 1125 1079 * page table and the remaining bits are in the page directory */ 1126 - if (radeon_vm_block_size < 9) { 1080 + if (radeon_vm_block_size == -1) { 1081 + 1082 + /* Total bits covered by PD + PTs */ 1083 + unsigned bits = ilog2(radeon_vm_size) + 17; 1084 + 1085 + /* Make sure the PD is 4K in size up to 8GB address space. 1086 + Above that split equal between PD and PTs */ 1087 + if (radeon_vm_size <= 8) 1088 + radeon_vm_block_size = bits - 9; 1089 + else 1090 + radeon_vm_block_size = (bits + 3) / 2; 1091 + 1092 + } else if (radeon_vm_block_size < 9) { 1127 1093 dev_warn(rdev->dev, "VM page table size (%d) too small\n", 1128 1094 radeon_vm_block_size); 1129 1095 radeon_vm_block_size = 9; ··· 1150 1092 } 1151 1093 1152 1094 /** 1153 - * radeon_switcheroo_quirk_long_wakeup - return true if longer d3 delay is 1154 - * needed for waking up. 1155 - * 1156 - * @pdev: pci dev pointer 1157 - */ 1158 - static bool radeon_switcheroo_quirk_long_wakeup(struct pci_dev *pdev) 1159 - { 1160 - 1161 - /* 6600m in a macbook pro */ 1162 - if (pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE && 1163 - pdev->subsystem_device == 0x00e2) { 1164 - printk(KERN_INFO "radeon: quirking longer d3 wakeup delay\n"); 1165 - return true; 1166 - } 1167 - 1168 - return false; 1169 - } 1170 - 1171 - /** 1172 1095 * radeon_switcheroo_set_state - set switcheroo state 1173 1096 * 1174 1097 * @pdev: pci dev pointer ··· 1161 1122 static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_state state) 1162 1123 { 1163 1124 struct drm_device *dev = pci_get_drvdata(pdev); 1125 + struct radeon_device *rdev = dev->dev_private; 1164 1126 1165 1127 if (radeon_is_px(dev) && state == VGA_SWITCHEROO_OFF) 1166 1128 return; ··· 1173 1133 /* don't suspend or resume card normally */ 1174 1134 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING; 1175 1135 1176 - if (d3_delay < 20 && radeon_switcheroo_quirk_long_wakeup(pdev)) 1136 + if (d3_delay < 20 && (rdev->px_quirk_flags & RADEON_PX_QUIRK_LONG_WAKEUP)) 1177 1137 dev->pdev->d3_delay = 20; 1178 1138 1179 1139 radeon_resume_kms(dev, true, true); ··· 1376 1336 } 1377 1337 if (rdev->rio_mem == NULL) 1378 1338 DRM_ERROR("Unable to find PCI I/O BAR\n"); 1339 + 1340 + if (rdev->flags & RADEON_IS_PX) 1341 + radeon_device_handle_px_quirks(rdev); 1379 1342 1380 1343 /* if we have > 1 VGA cards, then disable the radeon VGA resources */ 1381 1344 /* this will fail for cards that aren't VGA class devices, just
+13 -59
drivers/gpu/drm/radeon/radeon_display.c
··· 293 293 if (radeon_crtc == NULL) 294 294 return; 295 295 296 + /* Skip the pageflip completion check below (based on polling) on 297 + * asics which reliably support hw pageflip completion irqs. pflip 298 + * irqs are a reliable and race-free method of handling pageflip 299 + * completion detection. A use_pflipirq module parameter < 2 allows 300 + * to override this in case of asics with faulty pflip irqs. 301 + * A module parameter of 0 would only use this polling based path, 302 + * a parameter of 1 would use pflip irq only as a backup to this 303 + * path, as in Linux 3.16. 304 + */ 305 + if ((radeon_use_pflipirq == 2) && ASIC_IS_DCE4(rdev)) 306 + return; 307 + 296 308 spin_lock_irqsave(&rdev->ddev->event_lock, flags); 297 309 if (radeon_crtc->flip_status != RADEON_FLIP_SUBMITTED) { 298 310 DRM_DEBUG_DRIVER("radeon_crtc->flip_status = %d != " ··· 833 821 } 834 822 835 823 return ret; 836 - } 837 - 838 - int radeon_ddc_get_modes(struct radeon_connector *radeon_connector) 839 - { 840 - struct drm_device *dev = radeon_connector->base.dev; 841 - struct radeon_device *rdev = dev->dev_private; 842 - int ret = 0; 843 - 844 - /* don't leak the edid if we already fetched it in detect() */ 845 - if (radeon_connector->edid) 846 - goto got_edid; 847 - 848 - /* on hw with routers, select right port */ 849 - if (radeon_connector->router.ddc_valid) 850 - radeon_router_select_ddc_port(radeon_connector); 851 - 852 - if (radeon_connector_encoder_get_dp_bridge_encoder_id(&radeon_connector->base) != 853 - ENCODER_OBJECT_ID_NONE) { 854 - if (radeon_connector->ddc_bus->has_aux) 855 - radeon_connector->edid = drm_get_edid(&radeon_connector->base, 856 - &radeon_connector->ddc_bus->aux.ddc); 857 - } else if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) || 858 - (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)) { 859 - struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; 860 - 861 - if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT || 862 - dig->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) && 863 - radeon_connector->ddc_bus->has_aux) 864 - radeon_connector->edid = drm_get_edid(&radeon_connector->base, 865 - &radeon_connector->ddc_bus->aux.ddc); 866 - else if (radeon_connector->ddc_bus && !radeon_connector->edid) 867 - radeon_connector->edid = drm_get_edid(&radeon_connector->base, 868 - &radeon_connector->ddc_bus->adapter); 869 - } else { 870 - if (radeon_connector->ddc_bus && !radeon_connector->edid) 871 - radeon_connector->edid = drm_get_edid(&radeon_connector->base, 872 - &radeon_connector->ddc_bus->adapter); 873 - } 874 - 875 - if (!radeon_connector->edid) { 876 - if (rdev->is_atom_bios) { 877 - /* some laptops provide a hardcoded edid in rom for LCDs */ 878 - if (((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_LVDS) || 879 - (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP))) 880 - radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev); 881 - } else 882 - /* some servers provide a hardcoded edid in rom for KVMs */ 883 - radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev); 884 - } 885 - if (radeon_connector->edid) { 886 - got_edid: 887 - drm_mode_connector_update_edid_property(&radeon_connector->base, radeon_connector->edid); 888 - ret = drm_add_edid_modes(&radeon_connector->base, radeon_connector->edid); 889 - drm_edid_to_eld(&radeon_connector->base, radeon_connector->edid); 890 - return ret; 891 - } 892 - drm_mode_connector_update_edid_property(&radeon_connector->base, NULL); 893 - return 0; 894 824 } 895 825 896 826 /* avivo */ ··· 1703 1749 (!(mode->flags & DRM_MODE_FLAG_INTERLACE)) && 1704 1750 ((radeon_encoder->underscan_type == UNDERSCAN_ON) || 1705 1751 ((radeon_encoder->underscan_type == UNDERSCAN_AUTO) && 1706 - drm_detect_hdmi_monitor(radeon_connector->edid) && 1752 + drm_detect_hdmi_monitor(radeon_connector_edid(connector)) && 1707 1753 is_hdtv_mode(mode)))) { 1708 1754 if (radeon_encoder->underscan_hborder != 0) 1709 1755 radeon_crtc->h_border = radeon_encoder->underscan_hborder;
+10 -4
drivers/gpu/drm/radeon/radeon_drv.c
··· 82 82 * 2.38.0 - RADEON_GEM_OP (GET_INITIAL_DOMAIN, SET_INITIAL_DOMAIN), 83 83 * CIK: 1D and linear tiling modes contain valid PIPE_CONFIG 84 84 * 2.39.0 - Add INFO query for number of active CUs 85 + * 2.40.0 - Add RADEON_GEM_GTT_WC/UC, flush HDP cache before submitting 86 + * CS to GPU 85 87 */ 86 88 #define KMS_DRIVER_MAJOR 2 87 - #define KMS_DRIVER_MINOR 39 89 + #define KMS_DRIVER_MINOR 40 88 90 #define KMS_DRIVER_PATCHLEVEL 0 89 91 int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); 90 92 int radeon_driver_unload_kms(struct drm_device *dev); ··· 175 173 int radeon_aspm = -1; 176 174 int radeon_runtime_pm = -1; 177 175 int radeon_hard_reset = 0; 178 - int radeon_vm_size = 4; 179 - int radeon_vm_block_size = 9; 176 + int radeon_vm_size = 8; 177 + int radeon_vm_block_size = -1; 180 178 int radeon_deep_color = 0; 179 + int radeon_use_pflipirq = 2; 181 180 182 181 MODULE_PARM_DESC(no_wb, "Disable AGP writeback for scratch registers"); 183 182 module_param_named(no_wb, radeon_no_wb, int, 0444); ··· 249 246 MODULE_PARM_DESC(vm_size, "VM address space size in gigabytes (default 4GB)"); 250 247 module_param_named(vm_size, radeon_vm_size, int, 0444); 251 248 252 - MODULE_PARM_DESC(vm_block_size, "VM page table size in bits (default 9)"); 249 + MODULE_PARM_DESC(vm_block_size, "VM page table size in bits (default depending on vm_size)"); 253 250 module_param_named(vm_block_size, radeon_vm_block_size, int, 0444); 254 251 255 252 MODULE_PARM_DESC(deep_color, "Deep Color support (1 = enable, 0 = disable (default))"); 256 253 module_param_named(deep_color, radeon_deep_color, int, 0444); 254 + 255 + MODULE_PARM_DESC(use_pflipirq, "Pflip irqs for pageflip completion (0 = disable, 1 = as fallback, 2 = exclusive (default))"); 256 + module_param_named(use_pflipirq, radeon_use_pflipirq, int, 0444); 257 257 258 258 static struct pci_device_id pciidlist[] = { 259 259 radeon_PCI_IDS
+2 -2
drivers/gpu/drm/radeon/radeon_encoders.c
··· 343 343 case DRM_MODE_CONNECTOR_HDMIB: 344 344 if (radeon_connector->use_digital) { 345 345 /* HDMI 1.3 supports up to 340 Mhz over single link */ 346 - if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) { 346 + if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) { 347 347 if (pixel_clock > 340000) 348 348 return true; 349 349 else ··· 365 365 return false; 366 366 else { 367 367 /* HDMI 1.3 supports up to 340 Mhz over single link */ 368 - if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) { 368 + if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) { 369 369 if (pixel_clock > 340000) 370 370 return true; 371 371 else
+1 -2
drivers/gpu/drm/radeon/radeon_fb.c
··· 127 127 aligned_size = ALIGN(size, PAGE_SIZE); 128 128 ret = radeon_gem_object_create(rdev, aligned_size, 0, 129 129 RADEON_GEM_DOMAIN_VRAM, 130 - false, true, 131 - &gobj); 130 + 0, true, &gobj); 132 131 if (ret) { 133 132 printk(KERN_ERR "failed to allocate framebuffer (%d)\n", 134 133 aligned_size);
+7 -31
drivers/gpu/drm/radeon/radeon_gart.c
··· 128 128 if (rdev->gart.robj == NULL) { 129 129 r = radeon_bo_create(rdev, rdev->gart.table_size, 130 130 PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, 131 - NULL, &rdev->gart.robj); 131 + 0, NULL, &rdev->gart.robj); 132 132 if (r) { 133 133 return r; 134 134 } ··· 243 243 page_base = rdev->gart.pages_addr[p]; 244 244 for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) { 245 245 if (rdev->gart.ptr) { 246 - radeon_gart_set_page(rdev, t, page_base); 246 + radeon_gart_set_page(rdev, t, page_base, 247 + RADEON_GART_PAGE_DUMMY); 247 248 } 248 249 page_base += RADEON_GPU_PAGE_SIZE; 249 250 } ··· 262 261 * @pages: number of pages to bind 263 262 * @pagelist: pages to bind 264 263 * @dma_addr: DMA addresses of pages 264 + * @flags: RADEON_GART_PAGE_* flags 265 265 * 266 266 * Binds the requested pages to the gart page table 267 267 * (all asics). 268 268 * Returns 0 for success, -EINVAL for failure. 269 269 */ 270 270 int radeon_gart_bind(struct radeon_device *rdev, unsigned offset, 271 - int pages, struct page **pagelist, dma_addr_t *dma_addr) 271 + int pages, struct page **pagelist, dma_addr_t *dma_addr, 272 + uint32_t flags) 272 273 { 273 274 unsigned t; 274 275 unsigned p; ··· 290 287 if (rdev->gart.ptr) { 291 288 page_base = rdev->gart.pages_addr[p]; 292 289 for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) { 293 - radeon_gart_set_page(rdev, t, page_base); 290 + radeon_gart_set_page(rdev, t, page_base, flags); 294 291 page_base += RADEON_GPU_PAGE_SIZE; 295 292 } 296 293 } ··· 298 295 mb(); 299 296 radeon_gart_tlb_flush(rdev); 300 297 return 0; 301 - } 302 - 303 - /** 304 - * radeon_gart_restore - bind all pages in the gart page table 305 - * 306 - * @rdev: radeon_device pointer 307 - * 308 - * Binds all pages in the gart page table (all asics). 309 - * Used to rebuild the gart table on device startup or resume. 310 - */ 311 - void radeon_gart_restore(struct radeon_device *rdev) 312 - { 313 - int i, j, t; 314 - u64 page_base; 315 - 316 - if (!rdev->gart.ptr) { 317 - return; 318 - } 319 - for (i = 0, t = 0; i < rdev->gart.num_cpu_pages; i++) { 320 - page_base = rdev->gart.pages_addr[i]; 321 - for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) { 322 - radeon_gart_set_page(rdev, t, page_base); 323 - page_base += RADEON_GPU_PAGE_SIZE; 324 - } 325 - } 326 - mb(); 327 - radeon_gart_tlb_flush(rdev); 328 298 } 329 299 330 300 /**
+27 -31
drivers/gpu/drm/radeon/radeon_gem.c
··· 40 40 } 41 41 } 42 42 43 - int radeon_gem_object_create(struct radeon_device *rdev, int size, 43 + int radeon_gem_object_create(struct radeon_device *rdev, unsigned long size, 44 44 int alignment, int initial_domain, 45 - bool discardable, bool kernel, 45 + u32 flags, bool kernel, 46 46 struct drm_gem_object **obj) 47 47 { 48 48 struct radeon_bo *robj; ··· 55 55 alignment = PAGE_SIZE; 56 56 } 57 57 58 - /* maximun bo size is the minimun btw visible vram and gtt size */ 59 - max_size = min(rdev->mc.visible_vram_size, rdev->mc.gtt_size); 58 + /* Maximum bo size is the unpinned gtt size since we use the gtt to 59 + * handle vram to system pool migrations. 60 + */ 61 + max_size = rdev->mc.gtt_size - rdev->gart_pin_size; 60 62 if (size > max_size) { 61 - printk(KERN_WARNING "%s:%d alloc size %dMb bigger than %ldMb limit\n", 62 - __func__, __LINE__, size >> 20, max_size >> 20); 63 + DRM_DEBUG("Allocation size %ldMb bigger than %ldMb limit\n", 64 + size >> 20, max_size >> 20); 63 65 return -ENOMEM; 64 66 } 65 67 66 68 retry: 67 - r = radeon_bo_create(rdev, size, alignment, kernel, initial_domain, NULL, &robj); 69 + r = radeon_bo_create(rdev, size, alignment, kernel, initial_domain, 70 + flags, NULL, &robj); 68 71 if (r) { 69 72 if (r != -ERESTARTSYS) { 70 73 if (initial_domain == RADEON_GEM_DOMAIN_VRAM) { 71 74 initial_domain |= RADEON_GEM_DOMAIN_GTT; 72 75 goto retry; 73 76 } 74 - DRM_ERROR("Failed to allocate GEM object (%d, %d, %u, %d)\n", 77 + DRM_ERROR("Failed to allocate GEM object (%ld, %d, %u, %d)\n", 75 78 size, initial_domain, alignment, r); 76 79 } 77 80 return r; ··· 211 208 struct radeon_device *rdev = dev->dev_private; 212 209 struct drm_radeon_gem_info *args = data; 213 210 struct ttm_mem_type_manager *man; 214 - unsigned i; 215 211 216 212 man = &rdev->mman.bdev.man[TTM_PL_VRAM]; 217 213 218 214 args->vram_size = rdev->mc.real_vram_size; 219 215 args->vram_visible = (u64)man->size << PAGE_SHIFT; 220 - if (rdev->stollen_vga_memory) 221 - args->vram_visible -= radeon_bo_size(rdev->stollen_vga_memory); 222 - args->vram_visible -= radeon_fbdev_total_size(rdev); 223 - args->gart_size = rdev->mc.gtt_size - 4096 - RADEON_IB_POOL_SIZE*64*1024; 224 - for(i = 0; i < RADEON_NUM_RINGS; ++i) 225 - args->gart_size -= rdev->ring[i].ring_size; 216 + args->vram_visible -= rdev->vram_pin_size; 217 + args->gart_size = rdev->mc.gtt_size; 218 + args->gart_size -= rdev->gart_pin_size; 219 + 226 220 return 0; 227 221 } 228 222 ··· 252 252 /* create a gem object to contain this object in */ 253 253 args->size = roundup(args->size, PAGE_SIZE); 254 254 r = radeon_gem_object_create(rdev, args->size, args->alignment, 255 - args->initial_domain, false, 256 - false, &gobj); 255 + args->initial_domain, args->flags, 256 + false, &gobj); 257 257 if (r) { 258 258 up_read(&rdev->exclusive_lock); 259 259 r = radeon_gem_handle_lockup(rdev, r); ··· 358 358 struct drm_gem_object *gobj; 359 359 struct radeon_bo *robj; 360 360 int r; 361 + uint32_t cur_placement = 0; 361 362 362 363 gobj = drm_gem_object_lookup(dev, filp, args->handle); 363 364 if (gobj == NULL) { 364 365 return -ENOENT; 365 366 } 366 367 robj = gem_to_radeon_bo(gobj); 367 - r = radeon_bo_wait(robj, NULL, false); 368 - /* callback hw specific functions if any */ 369 - if (rdev->asic->ioctl_wait_idle) 370 - robj->rdev->asic->ioctl_wait_idle(rdev, robj); 368 + r = radeon_bo_wait(robj, &cur_placement, false); 369 + /* Flush HDP cache via MMIO if necessary */ 370 + if (rdev->asic->mmio_hdp_flush && 371 + radeon_mem_type_to_domain(cur_placement) == RADEON_GEM_DOMAIN_VRAM) 372 + robj->rdev->asic->mmio_hdp_flush(rdev); 371 373 drm_gem_object_unreference_unlocked(gobj); 372 374 r = radeon_gem_handle_lockup(rdev, r); 373 375 return r; ··· 463 461 args->operation = RADEON_VA_RESULT_ERROR; 464 462 return -EINVAL; 465 463 } 466 - if (!(args->flags & RADEON_VM_PAGE_SNOOPED)) { 467 - dev_err(&dev->pdev->dev, "only supported snooped mapping for now\n"); 468 - args->operation = RADEON_VA_RESULT_ERROR; 469 - return -EINVAL; 470 - } 471 464 472 465 switch (args->operation) { 473 466 case RADEON_VA_MAP: ··· 496 499 497 500 switch (args->operation) { 498 501 case RADEON_VA_MAP: 499 - if (bo_va->soffset) { 502 + if (bo_va->it.start) { 500 503 args->operation = RADEON_VA_RESULT_VA_EXIST; 501 - args->offset = bo_va->soffset; 504 + args->offset = bo_va->it.start * RADEON_GPU_PAGE_SIZE; 502 505 goto out; 503 506 } 504 507 r = radeon_vm_bo_set_addr(rdev, bo_va, args->offset, args->flags); ··· 569 572 args->size = ALIGN(args->size, PAGE_SIZE); 570 573 571 574 r = radeon_gem_object_create(rdev, args->size, 0, 572 - RADEON_GEM_DOMAIN_VRAM, 573 - false, ttm_bo_type_device, 574 - &gobj); 575 + RADEON_GEM_DOMAIN_VRAM, 0, 576 + false, &gobj); 575 577 if (r) 576 578 return -ENOMEM; 577 579
+319
drivers/gpu/drm/radeon/radeon_ib.c
··· 1 + /* 2 + * Copyright 2008 Advanced Micro Devices, Inc. 3 + * Copyright 2008 Red Hat Inc. 4 + * Copyright 2009 Jerome Glisse. 5 + * 6 + * Permission is hereby granted, free of charge, to any person obtaining a 7 + * copy of this software and associated documentation files (the "Software"), 8 + * to deal in the Software without restriction, including without limitation 9 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 + * and/or sell copies of the Software, and to permit persons to whom the 11 + * Software is furnished to do so, subject to the following conditions: 12 + * 13 + * The above copyright notice and this permission notice shall be included in 14 + * all copies or substantial portions of the Software. 15 + * 16 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 + * OTHER DEALINGS IN THE SOFTWARE. 23 + * 24 + * Authors: Dave Airlie 25 + * Alex Deucher 26 + * Jerome Glisse 27 + * Christian König 28 + */ 29 + #include <drm/drmP.h> 30 + #include "radeon.h" 31 + 32 + /* 33 + * IB 34 + * IBs (Indirect Buffers) and areas of GPU accessible memory where 35 + * commands are stored. You can put a pointer to the IB in the 36 + * command ring and the hw will fetch the commands from the IB 37 + * and execute them. Generally userspace acceleration drivers 38 + * produce command buffers which are send to the kernel and 39 + * put in IBs for execution by the requested ring. 40 + */ 41 + static int radeon_debugfs_sa_init(struct radeon_device *rdev); 42 + 43 + /** 44 + * radeon_ib_get - request an IB (Indirect Buffer) 45 + * 46 + * @rdev: radeon_device pointer 47 + * @ring: ring index the IB is associated with 48 + * @ib: IB object returned 49 + * @size: requested IB size 50 + * 51 + * Request an IB (all asics). IBs are allocated using the 52 + * suballocator. 53 + * Returns 0 on success, error on failure. 54 + */ 55 + int radeon_ib_get(struct radeon_device *rdev, int ring, 56 + struct radeon_ib *ib, struct radeon_vm *vm, 57 + unsigned size) 58 + { 59 + int r; 60 + 61 + r = radeon_sa_bo_new(rdev, &rdev->ring_tmp_bo, &ib->sa_bo, size, 256); 62 + if (r) { 63 + dev_err(rdev->dev, "failed to get a new IB (%d)\n", r); 64 + return r; 65 + } 66 + 67 + r = radeon_semaphore_create(rdev, &ib->semaphore); 68 + if (r) { 69 + return r; 70 + } 71 + 72 + ib->ring = ring; 73 + ib->fence = NULL; 74 + ib->ptr = radeon_sa_bo_cpu_addr(ib->sa_bo); 75 + ib->vm = vm; 76 + if (vm) { 77 + /* ib pool is bound at RADEON_VA_IB_OFFSET in virtual address 78 + * space and soffset is the offset inside the pool bo 79 + */ 80 + ib->gpu_addr = ib->sa_bo->soffset + RADEON_VA_IB_OFFSET; 81 + } else { 82 + ib->gpu_addr = radeon_sa_bo_gpu_addr(ib->sa_bo); 83 + } 84 + ib->is_const_ib = false; 85 + 86 + return 0; 87 + } 88 + 89 + /** 90 + * radeon_ib_free - free an IB (Indirect Buffer) 91 + * 92 + * @rdev: radeon_device pointer 93 + * @ib: IB object to free 94 + * 95 + * Free an IB (all asics). 96 + */ 97 + void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib *ib) 98 + { 99 + radeon_semaphore_free(rdev, &ib->semaphore, ib->fence); 100 + radeon_sa_bo_free(rdev, &ib->sa_bo, ib->fence); 101 + radeon_fence_unref(&ib->fence); 102 + } 103 + 104 + /** 105 + * radeon_ib_schedule - schedule an IB (Indirect Buffer) on the ring 106 + * 107 + * @rdev: radeon_device pointer 108 + * @ib: IB object to schedule 109 + * @const_ib: Const IB to schedule (SI only) 110 + * 111 + * Schedule an IB on the associated ring (all asics). 112 + * Returns 0 on success, error on failure. 113 + * 114 + * On SI, there are two parallel engines fed from the primary ring, 115 + * the CE (Constant Engine) and the DE (Drawing Engine). Since 116 + * resource descriptors have moved to memory, the CE allows you to 117 + * prime the caches while the DE is updating register state so that 118 + * the resource descriptors will be already in cache when the draw is 119 + * processed. To accomplish this, the userspace driver submits two 120 + * IBs, one for the CE and one for the DE. If there is a CE IB (called 121 + * a CONST_IB), it will be put on the ring prior to the DE IB. Prior 122 + * to SI there was just a DE IB. 123 + */ 124 + int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib, 125 + struct radeon_ib *const_ib) 126 + { 127 + struct radeon_ring *ring = &rdev->ring[ib->ring]; 128 + int r = 0; 129 + 130 + if (!ib->length_dw || !ring->ready) { 131 + /* TODO: Nothings in the ib we should report. */ 132 + dev_err(rdev->dev, "couldn't schedule ib\n"); 133 + return -EINVAL; 134 + } 135 + 136 + /* 64 dwords should be enough for fence too */ 137 + r = radeon_ring_lock(rdev, ring, 64 + RADEON_NUM_SYNCS * 8); 138 + if (r) { 139 + dev_err(rdev->dev, "scheduling IB failed (%d).\n", r); 140 + return r; 141 + } 142 + 143 + /* grab a vm id if necessary */ 144 + if (ib->vm) { 145 + struct radeon_fence *vm_id_fence; 146 + vm_id_fence = radeon_vm_grab_id(rdev, ib->vm, ib->ring); 147 + radeon_semaphore_sync_to(ib->semaphore, vm_id_fence); 148 + } 149 + 150 + /* sync with other rings */ 151 + r = radeon_semaphore_sync_rings(rdev, ib->semaphore, ib->ring); 152 + if (r) { 153 + dev_err(rdev->dev, "failed to sync rings (%d)\n", r); 154 + radeon_ring_unlock_undo(rdev, ring); 155 + return r; 156 + } 157 + 158 + if (ib->vm) 159 + radeon_vm_flush(rdev, ib->vm, ib->ring); 160 + 161 + if (const_ib) { 162 + radeon_ring_ib_execute(rdev, const_ib->ring, const_ib); 163 + radeon_semaphore_free(rdev, &const_ib->semaphore, NULL); 164 + } 165 + radeon_ring_ib_execute(rdev, ib->ring, ib); 166 + r = radeon_fence_emit(rdev, &ib->fence, ib->ring); 167 + if (r) { 168 + dev_err(rdev->dev, "failed to emit fence for new IB (%d)\n", r); 169 + radeon_ring_unlock_undo(rdev, ring); 170 + return r; 171 + } 172 + if (const_ib) { 173 + const_ib->fence = radeon_fence_ref(ib->fence); 174 + } 175 + 176 + if (ib->vm) 177 + radeon_vm_fence(rdev, ib->vm, ib->fence); 178 + 179 + radeon_ring_unlock_commit(rdev, ring); 180 + return 0; 181 + } 182 + 183 + /** 184 + * radeon_ib_pool_init - Init the IB (Indirect Buffer) pool 185 + * 186 + * @rdev: radeon_device pointer 187 + * 188 + * Initialize the suballocator to manage a pool of memory 189 + * for use as IBs (all asics). 190 + * Returns 0 on success, error on failure. 191 + */ 192 + int radeon_ib_pool_init(struct radeon_device *rdev) 193 + { 194 + int r; 195 + 196 + if (rdev->ib_pool_ready) { 197 + return 0; 198 + } 199 + 200 + if (rdev->family >= CHIP_BONAIRE) { 201 + r = radeon_sa_bo_manager_init(rdev, &rdev->ring_tmp_bo, 202 + RADEON_IB_POOL_SIZE*64*1024, 203 + RADEON_GPU_PAGE_SIZE, 204 + RADEON_GEM_DOMAIN_GTT, 205 + RADEON_GEM_GTT_WC); 206 + } else { 207 + /* Before CIK, it's better to stick to cacheable GTT due 208 + * to the command stream checking 209 + */ 210 + r = radeon_sa_bo_manager_init(rdev, &rdev->ring_tmp_bo, 211 + RADEON_IB_POOL_SIZE*64*1024, 212 + RADEON_GPU_PAGE_SIZE, 213 + RADEON_GEM_DOMAIN_GTT, 0); 214 + } 215 + if (r) { 216 + return r; 217 + } 218 + 219 + r = radeon_sa_bo_manager_start(rdev, &rdev->ring_tmp_bo); 220 + if (r) { 221 + return r; 222 + } 223 + 224 + rdev->ib_pool_ready = true; 225 + if (radeon_debugfs_sa_init(rdev)) { 226 + dev_err(rdev->dev, "failed to register debugfs file for SA\n"); 227 + } 228 + return 0; 229 + } 230 + 231 + /** 232 + * radeon_ib_pool_fini - Free the IB (Indirect Buffer) pool 233 + * 234 + * @rdev: radeon_device pointer 235 + * 236 + * Tear down the suballocator managing the pool of memory 237 + * for use as IBs (all asics). 238 + */ 239 + void radeon_ib_pool_fini(struct radeon_device *rdev) 240 + { 241 + if (rdev->ib_pool_ready) { 242 + radeon_sa_bo_manager_suspend(rdev, &rdev->ring_tmp_bo); 243 + radeon_sa_bo_manager_fini(rdev, &rdev->ring_tmp_bo); 244 + rdev->ib_pool_ready = false; 245 + } 246 + } 247 + 248 + /** 249 + * radeon_ib_ring_tests - test IBs on the rings 250 + * 251 + * @rdev: radeon_device pointer 252 + * 253 + * Test an IB (Indirect Buffer) on each ring. 254 + * If the test fails, disable the ring. 255 + * Returns 0 on success, error if the primary GFX ring 256 + * IB test fails. 257 + */ 258 + int radeon_ib_ring_tests(struct radeon_device *rdev) 259 + { 260 + unsigned i; 261 + int r; 262 + 263 + for (i = 0; i < RADEON_NUM_RINGS; ++i) { 264 + struct radeon_ring *ring = &rdev->ring[i]; 265 + 266 + if (!ring->ready) 267 + continue; 268 + 269 + r = radeon_ib_test(rdev, i, ring); 270 + if (r) { 271 + ring->ready = false; 272 + rdev->needs_reset = false; 273 + 274 + if (i == RADEON_RING_TYPE_GFX_INDEX) { 275 + /* oh, oh, that's really bad */ 276 + DRM_ERROR("radeon: failed testing IB on GFX ring (%d).\n", r); 277 + rdev->accel_working = false; 278 + return r; 279 + 280 + } else { 281 + /* still not good, but we can live with it */ 282 + DRM_ERROR("radeon: failed testing IB on ring %d (%d).\n", i, r); 283 + } 284 + } 285 + } 286 + return 0; 287 + } 288 + 289 + /* 290 + * Debugfs info 291 + */ 292 + #if defined(CONFIG_DEBUG_FS) 293 + 294 + static int radeon_debugfs_sa_info(struct seq_file *m, void *data) 295 + { 296 + struct drm_info_node *node = (struct drm_info_node *) m->private; 297 + struct drm_device *dev = node->minor->dev; 298 + struct radeon_device *rdev = dev->dev_private; 299 + 300 + radeon_sa_bo_dump_debug_info(&rdev->ring_tmp_bo, m); 301 + 302 + return 0; 303 + 304 + } 305 + 306 + static struct drm_info_list radeon_debugfs_sa_list[] = { 307 + {"radeon_sa_info", &radeon_debugfs_sa_info, 0, NULL}, 308 + }; 309 + 310 + #endif 311 + 312 + static int radeon_debugfs_sa_init(struct radeon_device *rdev) 313 + { 314 + #if defined(CONFIG_DEBUG_FS) 315 + return radeon_debugfs_add_files(rdev, radeon_debugfs_sa_list, 1); 316 + #else 317 + return 0; 318 + #endif 319 + }
+12 -1
drivers/gpu/drm/radeon/radeon_kms.c
··· 254 254 } 255 255 break; 256 256 case RADEON_INFO_ACCEL_WORKING2: 257 - *value = rdev->accel_working; 257 + if (rdev->family == CHIP_HAWAII) { 258 + if (rdev->accel_working) { 259 + if (rdev->new_fw) 260 + *value = 3; 261 + else 262 + *value = 2; 263 + } else { 264 + *value = 0; 265 + } 266 + } else { 267 + *value = rdev->accel_working; 268 + } 258 269 break; 259 270 case RADEON_INFO_TILING_CONFIG: 260 271 if (rdev->family >= CHIP_BONAIRE)
+2 -2
drivers/gpu/drm/radeon/radeon_mode.h
··· 685 685 686 686 extern u16 radeon_encoder_get_dp_bridge_encoder_id(struct drm_encoder *encoder); 687 687 extern u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *connector); 688 - extern bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector); 689 688 extern bool radeon_connector_is_dp12_capable(struct drm_connector *connector); 690 689 extern int radeon_get_monitor_bpc(struct drm_connector *connector); 690 + 691 + extern struct edid *radeon_connector_edid(struct drm_connector *connector); 691 692 692 693 extern void radeon_connector_hotplug(struct drm_connector *connector); 693 694 extern int radeon_dp_mode_valid_helper(struct drm_connector *connector, ··· 739 738 extern void radeon_router_select_ddc_port(struct radeon_connector *radeon_connector); 740 739 extern void radeon_router_select_cd_port(struct radeon_connector *radeon_connector); 741 740 extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector, bool use_aux); 742 - extern int radeon_ddc_get_modes(struct radeon_connector *radeon_connector); 743 741 744 742 extern struct drm_encoder *radeon_best_encoder(struct drm_connector *connector); 745 743
+42 -21
drivers/gpu/drm/radeon/radeon_object.c
··· 46 46 * function are calling it. 47 47 */ 48 48 49 - static void radeon_bo_clear_va(struct radeon_bo *bo) 50 - { 51 - struct radeon_bo_va *bo_va, *tmp; 52 - 53 - list_for_each_entry_safe(bo_va, tmp, &bo->va, bo_list) { 54 - /* remove from all vm address space */ 55 - radeon_vm_bo_rmv(bo->rdev, bo_va); 56 - } 57 - } 58 - 59 49 static void radeon_update_memory_usage(struct radeon_bo *bo, 60 50 unsigned mem_type, int sign) 61 51 { ··· 80 90 list_del_init(&bo->list); 81 91 mutex_unlock(&bo->rdev->gem.mutex); 82 92 radeon_bo_clear_surface_reg(bo); 83 - radeon_bo_clear_va(bo); 93 + WARN_ON(!list_empty(&bo->va)); 84 94 drm_gem_object_release(&bo->gem_base); 85 95 kfree(bo); 86 96 } ··· 104 114 rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | 105 115 TTM_PL_FLAG_VRAM; 106 116 if (domain & RADEON_GEM_DOMAIN_GTT) { 107 - if (rbo->rdev->flags & RADEON_IS_AGP) { 108 - rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_TT; 117 + if (rbo->flags & RADEON_GEM_GTT_UC) { 118 + rbo->placements[c++] = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_TT; 119 + } else if ((rbo->flags & RADEON_GEM_GTT_WC) || 120 + (rbo->rdev->flags & RADEON_IS_AGP)) { 121 + rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | 122 + TTM_PL_FLAG_TT; 109 123 } else { 110 124 rbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_TT; 111 125 } 112 126 } 113 127 if (domain & RADEON_GEM_DOMAIN_CPU) { 114 - if (rbo->rdev->flags & RADEON_IS_AGP) { 115 - rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_SYSTEM; 128 + if (rbo->flags & RADEON_GEM_GTT_UC) { 129 + rbo->placements[c++] = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_SYSTEM; 130 + } else if ((rbo->flags & RADEON_GEM_GTT_WC) || 131 + rbo->rdev->flags & RADEON_IS_AGP) { 132 + rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | 133 + TTM_PL_FLAG_SYSTEM; 116 134 } else { 117 135 rbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_SYSTEM; 118 136 } ··· 144 146 145 147 int radeon_bo_create(struct radeon_device *rdev, 146 148 unsigned long size, int byte_align, bool kernel, u32 domain, 147 - struct sg_table *sg, struct radeon_bo **bo_ptr) 149 + u32 flags, struct sg_table *sg, struct radeon_bo **bo_ptr) 148 150 { 149 151 struct radeon_bo *bo; 150 152 enum ttm_bo_type type; ··· 181 183 bo->initial_domain = domain & (RADEON_GEM_DOMAIN_VRAM | 182 184 RADEON_GEM_DOMAIN_GTT | 183 185 RADEON_GEM_DOMAIN_CPU); 186 + 187 + bo->flags = flags; 188 + /* PCI GART is always snooped */ 189 + if (!(rdev->flags & RADEON_IS_PCIE)) 190 + bo->flags &= ~(RADEON_GEM_GTT_WC | RADEON_GEM_GTT_UC); 191 + 184 192 radeon_ttm_placement_from_domain(bo, domain); 185 193 /* Kernel allocation are uninterruptible */ 186 194 down_read(&rdev->pm.mclk_lock); ··· 236 232 ttm_bo_kunmap(&bo->kmap); 237 233 } 238 234 235 + struct radeon_bo *radeon_bo_ref(struct radeon_bo *bo) 236 + { 237 + if (bo == NULL) 238 + return NULL; 239 + 240 + ttm_bo_reference(&bo->tbo); 241 + return bo; 242 + } 243 + 239 244 void radeon_bo_unref(struct radeon_bo **bo) 240 245 { 241 246 struct ttm_buffer_object *tbo; ··· 254 241 return; 255 242 rdev = (*bo)->rdev; 256 243 tbo = &((*bo)->tbo); 257 - down_read(&rdev->pm.mclk_lock); 258 244 ttm_bo_unref(&tbo); 259 - up_read(&rdev->pm.mclk_lock); 260 245 if (tbo == NULL) 261 246 *bo = NULL; 262 247 } ··· 303 292 bo->pin_count = 1; 304 293 if (gpu_addr != NULL) 305 294 *gpu_addr = radeon_bo_gpu_offset(bo); 306 - } 307 - if (unlikely(r != 0)) 295 + if (domain == RADEON_GEM_DOMAIN_VRAM) 296 + bo->rdev->vram_pin_size += radeon_bo_size(bo); 297 + else 298 + bo->rdev->gart_pin_size += radeon_bo_size(bo); 299 + } else { 308 300 dev_err(bo->rdev->dev, "%p pin failed\n", bo); 301 + } 309 302 return r; 310 303 } 311 304 ··· 332 317 for (i = 0; i < bo->placement.num_placement; i++) 333 318 bo->placements[i] &= ~TTM_PL_FLAG_NO_EVICT; 334 319 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); 335 - if (unlikely(r != 0)) 320 + if (likely(r == 0)) { 321 + if (bo->tbo.mem.mem_type == TTM_PL_VRAM) 322 + bo->rdev->vram_pin_size -= radeon_bo_size(bo); 323 + else 324 + bo->rdev->gart_pin_size -= radeon_bo_size(bo); 325 + } else { 336 326 dev_err(bo->rdev->dev, "%p validate failed for unpin\n", bo); 327 + } 337 328 return r; 338 329 } 339 330
+4 -2
drivers/gpu/drm/radeon/radeon_object.h
··· 124 124 125 125 extern int radeon_bo_create(struct radeon_device *rdev, 126 126 unsigned long size, int byte_align, 127 - bool kernel, u32 domain, 127 + bool kernel, u32 domain, u32 flags, 128 128 struct sg_table *sg, 129 129 struct radeon_bo **bo_ptr); 130 130 extern int radeon_bo_kmap(struct radeon_bo *bo, void **ptr); 131 131 extern void radeon_bo_kunmap(struct radeon_bo *bo); 132 + extern struct radeon_bo *radeon_bo_ref(struct radeon_bo *bo); 132 133 extern void radeon_bo_unref(struct radeon_bo **bo); 133 134 extern int radeon_bo_pin(struct radeon_bo *bo, u32 domain, u64 *gpu_addr); 134 135 extern int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, ··· 171 170 172 171 extern int radeon_sa_bo_manager_init(struct radeon_device *rdev, 173 172 struct radeon_sa_manager *sa_manager, 174 - unsigned size, u32 align, u32 domain); 173 + unsigned size, u32 align, u32 domain, 174 + u32 flags); 175 175 extern void radeon_sa_bo_manager_fini(struct radeon_device *rdev, 176 176 struct radeon_sa_manager *sa_manager); 177 177 extern int radeon_sa_bo_manager_start(struct radeon_device *rdev,
+6 -10
drivers/gpu/drm/radeon/radeon_pm.c
··· 1303 1303 case CHIP_RS780: 1304 1304 case CHIP_RS880: 1305 1305 case CHIP_RV770: 1306 - case CHIP_BARTS: 1307 - case CHIP_TURKS: 1308 - case CHIP_CAICOS: 1309 - case CHIP_CAYMAN: 1310 1306 /* DPM requires the RLC, RV770+ dGPU requires SMC */ 1311 1307 if (!rdev->rlc_fw) 1312 1308 rdev->pm.pm_method = PM_METHOD_PROFILE; ··· 1326 1330 case CHIP_PALM: 1327 1331 case CHIP_SUMO: 1328 1332 case CHIP_SUMO2: 1333 + case CHIP_BARTS: 1334 + case CHIP_TURKS: 1335 + case CHIP_CAICOS: 1336 + case CHIP_CAYMAN: 1329 1337 case CHIP_ARUBA: 1330 1338 case CHIP_TAHITI: 1331 1339 case CHIP_PITCAIRN: ··· 1400 1400 } 1401 1401 1402 1402 radeon_hwmon_fini(rdev); 1403 - 1404 - if (rdev->pm.power_state) 1405 - kfree(rdev->pm.power_state); 1403 + kfree(rdev->pm.power_state); 1406 1404 } 1407 1405 1408 1406 static void radeon_pm_fini_dpm(struct radeon_device *rdev) ··· 1419 1421 radeon_dpm_fini(rdev); 1420 1422 1421 1423 radeon_hwmon_fini(rdev); 1422 - 1423 - if (rdev->pm.power_state) 1424 - kfree(rdev->pm.power_state); 1424 + kfree(rdev->pm.power_state); 1425 1425 } 1426 1426 1427 1427 void radeon_pm_fini(struct radeon_device *rdev)
+1 -1
drivers/gpu/drm/radeon/radeon_prime.c
··· 65 65 int ret; 66 66 67 67 ret = radeon_bo_create(rdev, size, PAGE_SIZE, false, 68 - RADEON_GEM_DOMAIN_GTT, sg, &bo); 68 + RADEON_GEM_DOMAIN_GTT, 0, sg, &bo); 69 69 if (ret) 70 70 return ERR_PTR(ret); 71 71
+12 -275
drivers/gpu/drm/radeon/radeon_ring.c
··· 26 26 * Jerome Glisse 27 27 * Christian König 28 28 */ 29 - #include <linux/seq_file.h> 30 - #include <linux/slab.h> 31 29 #include <drm/drmP.h> 32 - #include <drm/radeon_drm.h> 33 - #include "radeon_reg.h" 34 30 #include "radeon.h" 35 - #include "atom.h" 36 - 37 - /* 38 - * IB 39 - * IBs (Indirect Buffers) and areas of GPU accessible memory where 40 - * commands are stored. You can put a pointer to the IB in the 41 - * command ring and the hw will fetch the commands from the IB 42 - * and execute them. Generally userspace acceleration drivers 43 - * produce command buffers which are send to the kernel and 44 - * put in IBs for execution by the requested ring. 45 - */ 46 - static int radeon_debugfs_sa_init(struct radeon_device *rdev); 47 - 48 - /** 49 - * radeon_ib_get - request an IB (Indirect Buffer) 50 - * 51 - * @rdev: radeon_device pointer 52 - * @ring: ring index the IB is associated with 53 - * @ib: IB object returned 54 - * @size: requested IB size 55 - * 56 - * Request an IB (all asics). IBs are allocated using the 57 - * suballocator. 58 - * Returns 0 on success, error on failure. 59 - */ 60 - int radeon_ib_get(struct radeon_device *rdev, int ring, 61 - struct radeon_ib *ib, struct radeon_vm *vm, 62 - unsigned size) 63 - { 64 - int r; 65 - 66 - r = radeon_sa_bo_new(rdev, &rdev->ring_tmp_bo, &ib->sa_bo, size, 256); 67 - if (r) { 68 - dev_err(rdev->dev, "failed to get a new IB (%d)\n", r); 69 - return r; 70 - } 71 - 72 - r = radeon_semaphore_create(rdev, &ib->semaphore); 73 - if (r) { 74 - return r; 75 - } 76 - 77 - ib->ring = ring; 78 - ib->fence = NULL; 79 - ib->ptr = radeon_sa_bo_cpu_addr(ib->sa_bo); 80 - ib->vm = vm; 81 - if (vm) { 82 - /* ib pool is bound at RADEON_VA_IB_OFFSET in virtual address 83 - * space and soffset is the offset inside the pool bo 84 - */ 85 - ib->gpu_addr = ib->sa_bo->soffset + RADEON_VA_IB_OFFSET; 86 - } else { 87 - ib->gpu_addr = radeon_sa_bo_gpu_addr(ib->sa_bo); 88 - } 89 - ib->is_const_ib = false; 90 - 91 - return 0; 92 - } 93 - 94 - /** 95 - * radeon_ib_free - free an IB (Indirect Buffer) 96 - * 97 - * @rdev: radeon_device pointer 98 - * @ib: IB object to free 99 - * 100 - * Free an IB (all asics). 101 - */ 102 - void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib *ib) 103 - { 104 - radeon_semaphore_free(rdev, &ib->semaphore, ib->fence); 105 - radeon_sa_bo_free(rdev, &ib->sa_bo, ib->fence); 106 - radeon_fence_unref(&ib->fence); 107 - } 108 - 109 - /** 110 - * radeon_ib_schedule - schedule an IB (Indirect Buffer) on the ring 111 - * 112 - * @rdev: radeon_device pointer 113 - * @ib: IB object to schedule 114 - * @const_ib: Const IB to schedule (SI only) 115 - * 116 - * Schedule an IB on the associated ring (all asics). 117 - * Returns 0 on success, error on failure. 118 - * 119 - * On SI, there are two parallel engines fed from the primary ring, 120 - * the CE (Constant Engine) and the DE (Drawing Engine). Since 121 - * resource descriptors have moved to memory, the CE allows you to 122 - * prime the caches while the DE is updating register state so that 123 - * the resource descriptors will be already in cache when the draw is 124 - * processed. To accomplish this, the userspace driver submits two 125 - * IBs, one for the CE and one for the DE. If there is a CE IB (called 126 - * a CONST_IB), it will be put on the ring prior to the DE IB. Prior 127 - * to SI there was just a DE IB. 128 - */ 129 - int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib, 130 - struct radeon_ib *const_ib) 131 - { 132 - struct radeon_ring *ring = &rdev->ring[ib->ring]; 133 - int r = 0; 134 - 135 - if (!ib->length_dw || !ring->ready) { 136 - /* TODO: Nothings in the ib we should report. */ 137 - dev_err(rdev->dev, "couldn't schedule ib\n"); 138 - return -EINVAL; 139 - } 140 - 141 - /* 64 dwords should be enough for fence too */ 142 - r = radeon_ring_lock(rdev, ring, 64 + RADEON_NUM_SYNCS * 8); 143 - if (r) { 144 - dev_err(rdev->dev, "scheduling IB failed (%d).\n", r); 145 - return r; 146 - } 147 - 148 - /* grab a vm id if necessary */ 149 - if (ib->vm) { 150 - struct radeon_fence *vm_id_fence; 151 - vm_id_fence = radeon_vm_grab_id(rdev, ib->vm, ib->ring); 152 - radeon_semaphore_sync_to(ib->semaphore, vm_id_fence); 153 - } 154 - 155 - /* sync with other rings */ 156 - r = radeon_semaphore_sync_rings(rdev, ib->semaphore, ib->ring); 157 - if (r) { 158 - dev_err(rdev->dev, "failed to sync rings (%d)\n", r); 159 - radeon_ring_unlock_undo(rdev, ring); 160 - return r; 161 - } 162 - 163 - if (ib->vm) 164 - radeon_vm_flush(rdev, ib->vm, ib->ring); 165 - 166 - if (const_ib) { 167 - radeon_ring_ib_execute(rdev, const_ib->ring, const_ib); 168 - radeon_semaphore_free(rdev, &const_ib->semaphore, NULL); 169 - } 170 - radeon_ring_ib_execute(rdev, ib->ring, ib); 171 - r = radeon_fence_emit(rdev, &ib->fence, ib->ring); 172 - if (r) { 173 - dev_err(rdev->dev, "failed to emit fence for new IB (%d)\n", r); 174 - radeon_ring_unlock_undo(rdev, ring); 175 - return r; 176 - } 177 - if (const_ib) { 178 - const_ib->fence = radeon_fence_ref(ib->fence); 179 - } 180 - 181 - if (ib->vm) 182 - radeon_vm_fence(rdev, ib->vm, ib->fence); 183 - 184 - radeon_ring_unlock_commit(rdev, ring); 185 - return 0; 186 - } 187 - 188 - /** 189 - * radeon_ib_pool_init - Init the IB (Indirect Buffer) pool 190 - * 191 - * @rdev: radeon_device pointer 192 - * 193 - * Initialize the suballocator to manage a pool of memory 194 - * for use as IBs (all asics). 195 - * Returns 0 on success, error on failure. 196 - */ 197 - int radeon_ib_pool_init(struct radeon_device *rdev) 198 - { 199 - int r; 200 - 201 - if (rdev->ib_pool_ready) { 202 - return 0; 203 - } 204 - r = radeon_sa_bo_manager_init(rdev, &rdev->ring_tmp_bo, 205 - RADEON_IB_POOL_SIZE*64*1024, 206 - RADEON_GPU_PAGE_SIZE, 207 - RADEON_GEM_DOMAIN_GTT); 208 - if (r) { 209 - return r; 210 - } 211 - 212 - r = radeon_sa_bo_manager_start(rdev, &rdev->ring_tmp_bo); 213 - if (r) { 214 - return r; 215 - } 216 - 217 - rdev->ib_pool_ready = true; 218 - if (radeon_debugfs_sa_init(rdev)) { 219 - dev_err(rdev->dev, "failed to register debugfs file for SA\n"); 220 - } 221 - return 0; 222 - } 223 - 224 - /** 225 - * radeon_ib_pool_fini - Free the IB (Indirect Buffer) pool 226 - * 227 - * @rdev: radeon_device pointer 228 - * 229 - * Tear down the suballocator managing the pool of memory 230 - * for use as IBs (all asics). 231 - */ 232 - void radeon_ib_pool_fini(struct radeon_device *rdev) 233 - { 234 - if (rdev->ib_pool_ready) { 235 - radeon_sa_bo_manager_suspend(rdev, &rdev->ring_tmp_bo); 236 - radeon_sa_bo_manager_fini(rdev, &rdev->ring_tmp_bo); 237 - rdev->ib_pool_ready = false; 238 - } 239 - } 240 - 241 - /** 242 - * radeon_ib_ring_tests - test IBs on the rings 243 - * 244 - * @rdev: radeon_device pointer 245 - * 246 - * Test an IB (Indirect Buffer) on each ring. 247 - * If the test fails, disable the ring. 248 - * Returns 0 on success, error if the primary GFX ring 249 - * IB test fails. 250 - */ 251 - int radeon_ib_ring_tests(struct radeon_device *rdev) 252 - { 253 - unsigned i; 254 - int r; 255 - 256 - for (i = 0; i < RADEON_NUM_RINGS; ++i) { 257 - struct radeon_ring *ring = &rdev->ring[i]; 258 - 259 - if (!ring->ready) 260 - continue; 261 - 262 - r = radeon_ib_test(rdev, i, ring); 263 - if (r) { 264 - ring->ready = false; 265 - rdev->needs_reset = false; 266 - 267 - if (i == RADEON_RING_TYPE_GFX_INDEX) { 268 - /* oh, oh, that's really bad */ 269 - DRM_ERROR("radeon: failed testing IB on GFX ring (%d).\n", r); 270 - rdev->accel_working = false; 271 - return r; 272 - 273 - } else { 274 - /* still not good, but we can live with it */ 275 - DRM_ERROR("radeon: failed testing IB on ring %d (%d).\n", i, r); 276 - } 277 - } 278 - } 279 - return 0; 280 - } 281 31 282 32 /* 283 33 * Rings ··· 183 433 */ 184 434 void radeon_ring_commit(struct radeon_device *rdev, struct radeon_ring *ring) 185 435 { 436 + /* If we are emitting the HDP flush via the ring buffer, we need to 437 + * do it before padding. 438 + */ 439 + if (rdev->asic->ring[ring->idx]->hdp_flush) 440 + rdev->asic->ring[ring->idx]->hdp_flush(rdev, ring); 186 441 /* We pad to match fetch size */ 187 442 while (ring->wptr & ring->align_mask) { 188 443 radeon_ring_write(ring, ring->nop); 189 444 } 190 445 mb(); 446 + /* If we are emitting the HDP flush via MMIO, we need to do it after 447 + * all CPU writes to VRAM finished. 448 + */ 449 + if (rdev->asic->mmio_hdp_flush) 450 + rdev->asic->mmio_hdp_flush(rdev); 191 451 radeon_ring_set_wptr(rdev, ring); 192 452 } 193 453 ··· 401 641 if (ring->ring_obj == NULL) { 402 642 r = radeon_bo_create(rdev, ring->ring_size, PAGE_SIZE, true, 403 643 RADEON_GEM_DOMAIN_GTT, 644 + (rdev->flags & RADEON_IS_PCIE) ? 645 + RADEON_GEM_GTT_WC : 0, 404 646 NULL, &ring->ring_obj); 405 647 if (r) { 406 648 dev_err(rdev->dev, "(%d) ring create failed\n", r); ··· 553 791 {"radeon_ring_vce2", radeon_debugfs_ring_info, 0, &si_vce2_index}, 554 792 }; 555 793 556 - static int radeon_debugfs_sa_info(struct seq_file *m, void *data) 557 - { 558 - struct drm_info_node *node = (struct drm_info_node *) m->private; 559 - struct drm_device *dev = node->minor->dev; 560 - struct radeon_device *rdev = dev->dev_private; 561 - 562 - radeon_sa_bo_dump_debug_info(&rdev->ring_tmp_bo, m); 563 - 564 - return 0; 565 - 566 - } 567 - 568 - static struct drm_info_list radeon_debugfs_sa_list[] = { 569 - {"radeon_sa_info", &radeon_debugfs_sa_info, 0, NULL}, 570 - }; 571 - 572 794 #endif 573 795 574 796 static int radeon_debugfs_ring_init(struct radeon_device *rdev, struct radeon_ring *ring) ··· 573 827 } 574 828 #endif 575 829 return 0; 576 - } 577 - 578 - static int radeon_debugfs_sa_init(struct radeon_device *rdev) 579 - { 580 - #if defined(CONFIG_DEBUG_FS) 581 - return radeon_debugfs_add_files(rdev, radeon_debugfs_sa_list, 1); 582 - #else 583 - return 0; 584 - #endif 585 830 }
+2 -2
drivers/gpu/drm/radeon/radeon_sa.c
··· 49 49 50 50 int radeon_sa_bo_manager_init(struct radeon_device *rdev, 51 51 struct radeon_sa_manager *sa_manager, 52 - unsigned size, u32 align, u32 domain) 52 + unsigned size, u32 align, u32 domain, u32 flags) 53 53 { 54 54 int i, r; 55 55 ··· 65 65 } 66 66 67 67 r = radeon_bo_create(rdev, size, align, true, 68 - domain, NULL, &sa_manager->bo); 68 + domain, flags, NULL, &sa_manager->bo); 69 69 if (r) { 70 70 dev_err(rdev->dev, "(%d) failed to allocate bo for manager\n", r); 71 71 return r;
+3 -9
drivers/gpu/drm/radeon/radeon_test.c
··· 56 56 /* Number of tests = 57 57 * (Total GTT - IB pool - writeback page - ring buffers) / test size 58 58 */ 59 - n = rdev->mc.gtt_size - RADEON_IB_POOL_SIZE*64*1024; 60 - for (i = 0; i < RADEON_NUM_RINGS; ++i) 61 - n -= rdev->ring[i].ring_size; 62 - if (rdev->wb.wb_obj) 63 - n -= RADEON_GPU_PAGE_SIZE; 64 - if (rdev->ih.ring_obj) 65 - n -= rdev->ih.ring_size; 59 + n = rdev->mc.gtt_size - rdev->gart_pin_size; 66 60 n /= size; 67 61 68 62 gtt_obj = kzalloc(n * sizeof(*gtt_obj), GFP_KERNEL); ··· 67 73 } 68 74 69 75 r = radeon_bo_create(rdev, size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, 70 - NULL, &vram_obj); 76 + 0, NULL, &vram_obj); 71 77 if (r) { 72 78 DRM_ERROR("Failed to create VRAM object\n"); 73 79 goto out_cleanup; ··· 87 93 struct radeon_fence *fence = NULL; 88 94 89 95 r = radeon_bo_create(rdev, size, PAGE_SIZE, true, 90 - RADEON_GEM_DOMAIN_GTT, NULL, gtt_obj + i); 96 + RADEON_GEM_DOMAIN_GTT, 0, NULL, gtt_obj + i); 91 97 if (r) { 92 98 DRM_ERROR("Failed to create GTT object %d\n", i); 93 99 goto out_lclean;
+20 -2
drivers/gpu/drm/radeon/radeon_trace.h
··· 72 72 ), 73 73 74 74 TP_fast_assign( 75 - __entry->soffset = bo_va->soffset; 76 - __entry->eoffset = bo_va->eoffset; 75 + __entry->soffset = bo_va->it.start; 76 + __entry->eoffset = bo_va->it.last + 1; 77 77 __entry->flags = bo_va->flags; 78 78 ), 79 79 TP_printk("soffs=%010llx, eoffs=%010llx, flags=%08x", ··· 102 102 TP_printk("pe=%010Lx, addr=%010Lx, incr=%u, flags=%08x, count=%u", 103 103 __entry->pe, __entry->addr, __entry->incr, 104 104 __entry->flags, __entry->count) 105 + ); 106 + 107 + TRACE_EVENT(radeon_vm_flush, 108 + TP_PROTO(uint64_t pd_addr, unsigned ring, unsigned id), 109 + TP_ARGS(pd_addr, ring, id), 110 + TP_STRUCT__entry( 111 + __field(u64, pd_addr) 112 + __field(u32, ring) 113 + __field(u32, id) 114 + ), 115 + 116 + TP_fast_assign( 117 + __entry->pd_addr = pd_addr; 118 + __entry->ring = ring; 119 + __entry->id = id; 120 + ), 121 + TP_printk("pd_addr=%010Lx, ring=%u, id=%u", 122 + __entry->pd_addr, __entry->ring, __entry->id) 105 123 ); 106 124 107 125 DECLARE_EVENT_CLASS(radeon_fence_request,
+7 -3
drivers/gpu/drm/radeon/radeon_ttm.c
··· 521 521 struct ttm_mem_reg *bo_mem) 522 522 { 523 523 struct radeon_ttm_tt *gtt = (void*)ttm; 524 + uint32_t flags = RADEON_GART_PAGE_VALID | RADEON_GART_PAGE_READ | 525 + RADEON_GART_PAGE_WRITE; 524 526 int r; 525 527 526 528 gtt->offset = (unsigned long)(bo_mem->start << PAGE_SHIFT); ··· 530 528 WARN(1, "nothing to bind %lu pages for mreg %p back %p!\n", 531 529 ttm->num_pages, bo_mem, ttm); 532 530 } 533 - r = radeon_gart_bind(gtt->rdev, gtt->offset, 534 - ttm->num_pages, ttm->pages, gtt->ttm.dma_address); 531 + if (ttm->caching_state == tt_cached) 532 + flags |= RADEON_GART_PAGE_SNOOP; 533 + r = radeon_gart_bind(gtt->rdev, gtt->offset, ttm->num_pages, 534 + ttm->pages, gtt->ttm.dma_address, flags); 535 535 if (r) { 536 536 DRM_ERROR("failed to bind %lu pages at 0x%08X\n", 537 537 ttm->num_pages, (unsigned)gtt->offset); ··· 730 726 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); 731 727 732 728 r = radeon_bo_create(rdev, 256 * 1024, PAGE_SIZE, true, 733 - RADEON_GEM_DOMAIN_VRAM, 729 + RADEON_GEM_DOMAIN_VRAM, 0, 734 730 NULL, &rdev->stollen_vga_memory); 735 731 if (r) { 736 732 return r;
+167
drivers/gpu/drm/radeon/radeon_ucode.c
··· 1 + /* 2 + * Copyright 2014 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 + */ 23 + 24 + #include <linux/firmware.h> 25 + #include <linux/slab.h> 26 + #include <linux/module.h> 27 + #include <drm/drmP.h> 28 + #include "radeon.h" 29 + #include "radeon_ucode.h" 30 + 31 + static void radeon_ucode_print_common_hdr(const struct common_firmware_header *hdr) 32 + { 33 + DRM_DEBUG("size_bytes: %u\n", le32_to_cpu(hdr->size_bytes)); 34 + DRM_DEBUG("header_size_bytes: %u\n", le32_to_cpu(hdr->header_size_bytes)); 35 + DRM_DEBUG("header_version_major: %u\n", le16_to_cpu(hdr->header_version_major)); 36 + DRM_DEBUG("header_version_minor: %u\n", le16_to_cpu(hdr->header_version_minor)); 37 + DRM_DEBUG("ip_version_major: %u\n", le16_to_cpu(hdr->ip_version_major)); 38 + DRM_DEBUG("ip_version_minor: %u\n", le16_to_cpu(hdr->ip_version_minor)); 39 + DRM_DEBUG("ucode_version: 0x%08x\n", le32_to_cpu(hdr->ucode_version)); 40 + DRM_DEBUG("ucode_size_bytes: %u\n", le32_to_cpu(hdr->ucode_size_bytes)); 41 + DRM_DEBUG("ucode_array_offset_bytes: %u\n", 42 + le32_to_cpu(hdr->ucode_array_offset_bytes)); 43 + DRM_DEBUG("crc32: 0x%08x\n", le32_to_cpu(hdr->crc32)); 44 + } 45 + 46 + void radeon_ucode_print_mc_hdr(const struct common_firmware_header *hdr) 47 + { 48 + uint16_t version_major = le16_to_cpu(hdr->header_version_major); 49 + uint16_t version_minor = le16_to_cpu(hdr->header_version_minor); 50 + 51 + DRM_DEBUG("MC\n"); 52 + radeon_ucode_print_common_hdr(hdr); 53 + 54 + if (version_major == 1) { 55 + const struct mc_firmware_header_v1_0 *mc_hdr = 56 + container_of(hdr, struct mc_firmware_header_v1_0, header); 57 + 58 + DRM_DEBUG("io_debug_size_bytes: %u\n", 59 + le32_to_cpu(mc_hdr->io_debug_size_bytes)); 60 + DRM_DEBUG("io_debug_array_offset_bytes: %u\n", 61 + le32_to_cpu(mc_hdr->io_debug_array_offset_bytes)); 62 + } else { 63 + DRM_ERROR("Unknown MC ucode version: %u.%u\n", version_major, version_minor); 64 + } 65 + } 66 + 67 + void radeon_ucode_print_smc_hdr(const struct common_firmware_header *hdr) 68 + { 69 + uint16_t version_major = le16_to_cpu(hdr->header_version_major); 70 + uint16_t version_minor = le16_to_cpu(hdr->header_version_minor); 71 + 72 + DRM_DEBUG("SMC\n"); 73 + radeon_ucode_print_common_hdr(hdr); 74 + 75 + if (version_major == 1) { 76 + const struct smc_firmware_header_v1_0 *smc_hdr = 77 + container_of(hdr, struct smc_firmware_header_v1_0, header); 78 + 79 + DRM_DEBUG("ucode_start_addr: %u\n", le32_to_cpu(smc_hdr->ucode_start_addr)); 80 + } else { 81 + DRM_ERROR("Unknown SMC ucode version: %u.%u\n", version_major, version_minor); 82 + } 83 + } 84 + 85 + void radeon_ucode_print_gfx_hdr(const struct common_firmware_header *hdr) 86 + { 87 + uint16_t version_major = le16_to_cpu(hdr->header_version_major); 88 + uint16_t version_minor = le16_to_cpu(hdr->header_version_minor); 89 + 90 + DRM_DEBUG("GFX\n"); 91 + radeon_ucode_print_common_hdr(hdr); 92 + 93 + if (version_major == 1) { 94 + const struct gfx_firmware_header_v1_0 *gfx_hdr = 95 + container_of(hdr, struct gfx_firmware_header_v1_0, header); 96 + 97 + DRM_DEBUG("ucode_feature_version: %u\n", 98 + le32_to_cpu(gfx_hdr->ucode_feature_version)); 99 + DRM_DEBUG("jt_offset: %u\n", le32_to_cpu(gfx_hdr->jt_offset)); 100 + DRM_DEBUG("jt_size: %u\n", le32_to_cpu(gfx_hdr->jt_size)); 101 + } else { 102 + DRM_ERROR("Unknown GFX ucode version: %u.%u\n", version_major, version_minor); 103 + } 104 + } 105 + 106 + void radeon_ucode_print_rlc_hdr(const struct common_firmware_header *hdr) 107 + { 108 + uint16_t version_major = le16_to_cpu(hdr->header_version_major); 109 + uint16_t version_minor = le16_to_cpu(hdr->header_version_minor); 110 + 111 + DRM_DEBUG("RLC\n"); 112 + radeon_ucode_print_common_hdr(hdr); 113 + 114 + if (version_major == 1) { 115 + const struct rlc_firmware_header_v1_0 *rlc_hdr = 116 + container_of(hdr, struct rlc_firmware_header_v1_0, header); 117 + 118 + DRM_DEBUG("ucode_feature_version: %u\n", 119 + le32_to_cpu(rlc_hdr->ucode_feature_version)); 120 + DRM_DEBUG("save_and_restore_offset: %u\n", 121 + le32_to_cpu(rlc_hdr->save_and_restore_offset)); 122 + DRM_DEBUG("clear_state_descriptor_offset: %u\n", 123 + le32_to_cpu(rlc_hdr->clear_state_descriptor_offset)); 124 + DRM_DEBUG("avail_scratch_ram_locations: %u\n", 125 + le32_to_cpu(rlc_hdr->avail_scratch_ram_locations)); 126 + DRM_DEBUG("master_pkt_description_offset: %u\n", 127 + le32_to_cpu(rlc_hdr->master_pkt_description_offset)); 128 + } else { 129 + DRM_ERROR("Unknown RLC ucode version: %u.%u\n", version_major, version_minor); 130 + } 131 + } 132 + 133 + void radeon_ucode_print_sdma_hdr(const struct common_firmware_header *hdr) 134 + { 135 + uint16_t version_major = le16_to_cpu(hdr->header_version_major); 136 + uint16_t version_minor = le16_to_cpu(hdr->header_version_minor); 137 + 138 + DRM_DEBUG("SDMA\n"); 139 + radeon_ucode_print_common_hdr(hdr); 140 + 141 + if (version_major == 1) { 142 + const struct sdma_firmware_header_v1_0 *sdma_hdr = 143 + container_of(hdr, struct sdma_firmware_header_v1_0, header); 144 + 145 + DRM_DEBUG("ucode_feature_version: %u\n", 146 + le32_to_cpu(sdma_hdr->ucode_feature_version)); 147 + DRM_DEBUG("ucode_change_version: %u\n", 148 + le32_to_cpu(sdma_hdr->ucode_change_version)); 149 + DRM_DEBUG("jt_offset: %u\n", le32_to_cpu(sdma_hdr->jt_offset)); 150 + DRM_DEBUG("jt_size: %u\n", le32_to_cpu(sdma_hdr->jt_size)); 151 + } else { 152 + DRM_ERROR("Unknown SDMA ucode version: %u.%u\n", 153 + version_major, version_minor); 154 + } 155 + } 156 + 157 + int radeon_ucode_validate(const struct firmware *fw) 158 + { 159 + const struct common_firmware_header *hdr = 160 + (const struct common_firmware_header *)fw->data; 161 + 162 + if (fw->size == le32_to_cpu(hdr->size_bytes)) 163 + return 0; 164 + 165 + return -EINVAL; 166 + } 167 +
+71
drivers/gpu/drm/radeon/radeon_ucode.h
··· 153 153 #define HAWAII_SMC_UCODE_START 0x20000 154 154 #define HAWAII_SMC_UCODE_SIZE 0x1FDEC 155 155 156 + struct common_firmware_header { 157 + uint32_t size_bytes; /* size of the entire header+image(s) in bytes */ 158 + uint32_t header_size_bytes; /* size of just the header in bytes */ 159 + uint16_t header_version_major; /* header version */ 160 + uint16_t header_version_minor; /* header version */ 161 + uint16_t ip_version_major; /* IP version */ 162 + uint16_t ip_version_minor; /* IP version */ 163 + uint32_t ucode_version; 164 + uint32_t ucode_size_bytes; /* size of ucode in bytes */ 165 + uint32_t ucode_array_offset_bytes; /* payload offset from the start of the header */ 166 + uint32_t crc32; /* crc32 checksum of the payload */ 167 + }; 168 + 169 + /* version_major=1, version_minor=0 */ 170 + struct mc_firmware_header_v1_0 { 171 + struct common_firmware_header header; 172 + uint32_t io_debug_size_bytes; /* size of debug array in dwords */ 173 + uint32_t io_debug_array_offset_bytes; /* payload offset from the start of the header */ 174 + }; 175 + 176 + /* version_major=1, version_minor=0 */ 177 + struct smc_firmware_header_v1_0 { 178 + struct common_firmware_header header; 179 + uint32_t ucode_start_addr; 180 + }; 181 + 182 + /* version_major=1, version_minor=0 */ 183 + struct gfx_firmware_header_v1_0 { 184 + struct common_firmware_header header; 185 + uint32_t ucode_feature_version; 186 + uint32_t jt_offset; /* jt location */ 187 + uint32_t jt_size; /* size of jt */ 188 + }; 189 + 190 + /* version_major=1, version_minor=0 */ 191 + struct rlc_firmware_header_v1_0 { 192 + struct common_firmware_header header; 193 + uint32_t ucode_feature_version; 194 + uint32_t save_and_restore_offset; 195 + uint32_t clear_state_descriptor_offset; 196 + uint32_t avail_scratch_ram_locations; 197 + uint32_t master_pkt_description_offset; 198 + }; 199 + 200 + /* version_major=1, version_minor=0 */ 201 + struct sdma_firmware_header_v1_0 { 202 + struct common_firmware_header header; 203 + uint32_t ucode_feature_version; 204 + uint32_t ucode_change_version; 205 + uint32_t jt_offset; /* jt location */ 206 + uint32_t jt_size; /* size of jt */ 207 + }; 208 + 209 + /* header is fixed size */ 210 + union radeon_firmware_header { 211 + struct common_firmware_header common; 212 + struct mc_firmware_header_v1_0 mc; 213 + struct smc_firmware_header_v1_0 smc; 214 + struct gfx_firmware_header_v1_0 gfx; 215 + struct rlc_firmware_header_v1_0 rlc; 216 + struct sdma_firmware_header_v1_0 sdma; 217 + uint8_t raw[0x100]; 218 + }; 219 + 220 + void radeon_ucode_print_mc_hdr(const struct common_firmware_header *hdr); 221 + void radeon_ucode_print_smc_hdr(const struct common_firmware_header *hdr); 222 + void radeon_ucode_print_gfx_hdr(const struct common_firmware_header *hdr); 223 + void radeon_ucode_print_rlc_hdr(const struct common_firmware_header *hdr); 224 + void radeon_ucode_print_sdma_hdr(const struct common_firmware_header *hdr); 225 + int radeon_ucode_validate(const struct firmware *fw); 226 + 156 227 #endif
+3 -3
drivers/gpu/drm/radeon/radeon_uvd.c
··· 117 117 bo_size = RADEON_GPU_PAGE_ALIGN(rdev->uvd_fw->size + 8) + 118 118 RADEON_UVD_STACK_SIZE + RADEON_UVD_HEAP_SIZE; 119 119 r = radeon_bo_create(rdev, bo_size, PAGE_SIZE, true, 120 - RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->uvd.vcpu_bo); 120 + RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->uvd.vcpu_bo); 121 121 if (r) { 122 122 dev_err(rdev->dev, "(%d) failed to allocate UVD bo\n", r); 123 123 return r; ··· 674 674 int r, i; 675 675 676 676 r = radeon_bo_create(rdev, 1024, PAGE_SIZE, true, 677 - RADEON_GEM_DOMAIN_VRAM, NULL, &bo); 677 + RADEON_GEM_DOMAIN_VRAM, 0, NULL, &bo); 678 678 if (r) 679 679 return r; 680 680 ··· 720 720 int r, i; 721 721 722 722 r = radeon_bo_create(rdev, 1024, PAGE_SIZE, true, 723 - RADEON_GEM_DOMAIN_VRAM, NULL, &bo); 723 + RADEON_GEM_DOMAIN_VRAM, 0, NULL, &bo); 724 724 if (r) 725 725 return r; 726 726
+1 -1
drivers/gpu/drm/radeon/radeon_vce.c
··· 126 126 size = RADEON_GPU_PAGE_ALIGN(rdev->vce_fw->size) + 127 127 RADEON_VCE_STACK_SIZE + RADEON_VCE_HEAP_SIZE; 128 128 r = radeon_bo_create(rdev, size, PAGE_SIZE, true, 129 - RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->vce.vcpu_bo); 129 + RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->vce.vcpu_bo); 130 130 if (r) { 131 131 dev_err(rdev->dev, "(%d) failed to allocate VCE bo\n", r); 132 132 return r;
+182 -96
drivers/gpu/drm/radeon/radeon_vm.c
··· 238 238 uint64_t pd_addr = radeon_bo_gpu_offset(vm->page_directory); 239 239 240 240 /* if we can't remember our last VM flush then flush now! */ 241 - /* XXX figure out why we have to flush all the time */ 242 - if (!vm->last_flush || true || pd_addr != vm->pd_gpu_addr) { 241 + if (!vm->last_flush || pd_addr != vm->pd_gpu_addr) { 242 + trace_radeon_vm_flush(pd_addr, ring, vm->id); 243 243 vm->pd_gpu_addr = pd_addr; 244 244 radeon_ring_vm_flush(rdev, ring, vm); 245 245 } ··· 325 325 } 326 326 bo_va->vm = vm; 327 327 bo_va->bo = bo; 328 - bo_va->soffset = 0; 329 - bo_va->eoffset = 0; 328 + bo_va->it.start = 0; 329 + bo_va->it.last = 0; 330 330 bo_va->flags = 0; 331 - bo_va->valid = false; 331 + bo_va->addr = 0; 332 332 bo_va->ref_count = 1; 333 333 INIT_LIST_HEAD(&bo_va->bo_list); 334 - INIT_LIST_HEAD(&bo_va->vm_list); 335 334 INIT_LIST_HEAD(&bo_va->vm_status); 336 335 337 336 mutex_lock(&vm->mutex); 338 - list_add(&bo_va->vm_list, &vm->va); 339 337 list_add_tail(&bo_va->bo_list, &bo->va); 340 338 mutex_unlock(&vm->mutex); 341 339 342 340 return bo_va; 341 + } 342 + 343 + /** 344 + * radeon_vm_set_pages - helper to call the right asic function 345 + * 346 + * @rdev: radeon_device pointer 347 + * @ib: indirect buffer to fill with commands 348 + * @pe: addr of the page entry 349 + * @addr: dst addr to write into pe 350 + * @count: number of page entries to update 351 + * @incr: increase next addr by incr bytes 352 + * @flags: hw access flags 353 + * 354 + * Traces the parameters and calls the right asic functions 355 + * to setup the page table using the DMA. 356 + */ 357 + static void radeon_vm_set_pages(struct radeon_device *rdev, 358 + struct radeon_ib *ib, 359 + uint64_t pe, 360 + uint64_t addr, unsigned count, 361 + uint32_t incr, uint32_t flags) 362 + { 363 + trace_radeon_vm_set_page(pe, addr, count, incr, flags); 364 + 365 + if ((flags & R600_PTE_GART_MASK) == R600_PTE_GART_MASK) { 366 + uint64_t src = rdev->gart.table_addr + (addr >> 12) * 8; 367 + radeon_asic_vm_copy_pages(rdev, ib, pe, src, count); 368 + 369 + } else if ((flags & R600_PTE_SYSTEM) || (count < 3)) { 370 + radeon_asic_vm_write_pages(rdev, ib, pe, addr, 371 + count, incr, flags); 372 + 373 + } else { 374 + radeon_asic_vm_set_pages(rdev, ib, pe, addr, 375 + count, incr, flags); 376 + } 343 377 } 344 378 345 379 /** ··· 410 376 addr = radeon_bo_gpu_offset(bo); 411 377 entries = radeon_bo_size(bo) / 8; 412 378 413 - r = radeon_ib_get(rdev, R600_RING_TYPE_DMA_INDEX, &ib, 414 - NULL, entries * 2 + 64); 379 + r = radeon_ib_get(rdev, R600_RING_TYPE_DMA_INDEX, &ib, NULL, 256); 415 380 if (r) 416 381 goto error; 417 382 418 383 ib.length_dw = 0; 419 384 420 - radeon_asic_vm_set_page(rdev, &ib, addr, 0, entries, 0, 0); 385 + radeon_vm_set_pages(rdev, &ib, addr, 0, entries, 0, 0); 386 + radeon_asic_vm_pad_ib(rdev, &ib); 387 + WARN_ON(ib.length_dw > 64); 421 388 422 389 r = radeon_ib_schedule(rdev, &ib, NULL); 423 390 if (r) ··· 454 419 uint32_t flags) 455 420 { 456 421 uint64_t size = radeon_bo_size(bo_va->bo); 457 - uint64_t eoffset, last_offset = 0; 458 422 struct radeon_vm *vm = bo_va->vm; 459 - struct radeon_bo_va *tmp; 460 - struct list_head *head; 461 423 unsigned last_pfn, pt_idx; 424 + uint64_t eoffset; 462 425 int r; 463 426 464 427 if (soffset) { ··· 478 445 } 479 446 480 447 mutex_lock(&vm->mutex); 481 - head = &vm->va; 482 - last_offset = 0; 483 - list_for_each_entry(tmp, &vm->va, vm_list) { 484 - if (bo_va == tmp) { 485 - /* skip over currently modified bo */ 486 - continue; 448 + if (bo_va->it.start || bo_va->it.last) { 449 + if (bo_va->addr) { 450 + /* add a clone of the bo_va to clear the old address */ 451 + struct radeon_bo_va *tmp; 452 + tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL); 453 + tmp->it.start = bo_va->it.start; 454 + tmp->it.last = bo_va->it.last; 455 + tmp->vm = vm; 456 + tmp->addr = bo_va->addr; 457 + tmp->bo = radeon_bo_ref(bo_va->bo); 458 + list_add(&tmp->vm_status, &vm->freed); 487 459 } 488 460 489 - if (soffset >= last_offset && eoffset <= tmp->soffset) { 490 - /* bo can be added before this one */ 491 - break; 492 - } 493 - if (eoffset > tmp->soffset && soffset < tmp->eoffset) { 461 + interval_tree_remove(&bo_va->it, &vm->va); 462 + bo_va->it.start = 0; 463 + bo_va->it.last = 0; 464 + } 465 + 466 + soffset /= RADEON_GPU_PAGE_SIZE; 467 + eoffset /= RADEON_GPU_PAGE_SIZE; 468 + if (soffset || eoffset) { 469 + struct interval_tree_node *it; 470 + it = interval_tree_iter_first(&vm->va, soffset, eoffset - 1); 471 + if (it) { 472 + struct radeon_bo_va *tmp; 473 + tmp = container_of(it, struct radeon_bo_va, it); 494 474 /* bo and tmp overlap, invalid offset */ 495 - dev_err(rdev->dev, "bo %p va 0x%08X conflict with (bo %p 0x%08X 0x%08X)\n", 496 - bo_va->bo, (unsigned)bo_va->soffset, tmp->bo, 497 - (unsigned)tmp->soffset, (unsigned)tmp->eoffset); 475 + dev_err(rdev->dev, "bo %p va 0x%010Lx conflict with " 476 + "(bo %p 0x%010lx 0x%010lx)\n", bo_va->bo, 477 + soffset, tmp->bo, tmp->it.start, tmp->it.last); 498 478 mutex_unlock(&vm->mutex); 499 479 return -EINVAL; 500 480 } 501 - last_offset = tmp->eoffset; 502 - head = &tmp->vm_list; 481 + bo_va->it.start = soffset; 482 + bo_va->it.last = eoffset - 1; 483 + interval_tree_insert(&bo_va->it, &vm->va); 503 484 } 504 485 505 - if (bo_va->soffset) { 506 - /* add a clone of the bo_va to clear the old address */ 507 - tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL); 508 - if (!tmp) { 509 - mutex_unlock(&vm->mutex); 510 - return -ENOMEM; 511 - } 512 - tmp->soffset = bo_va->soffset; 513 - tmp->eoffset = bo_va->eoffset; 514 - tmp->vm = vm; 515 - list_add(&tmp->vm_status, &vm->freed); 516 - } 517 - 518 - bo_va->soffset = soffset; 519 - bo_va->eoffset = eoffset; 520 486 bo_va->flags = flags; 521 - bo_va->valid = false; 522 - list_move(&bo_va->vm_list, head); 487 + bo_va->addr = 0; 523 488 524 - soffset = (soffset / RADEON_GPU_PAGE_SIZE) >> radeon_vm_block_size; 525 - eoffset = (eoffset / RADEON_GPU_PAGE_SIZE) >> radeon_vm_block_size; 489 + soffset >>= radeon_vm_block_size; 490 + eoffset >>= radeon_vm_block_size; 526 491 527 492 BUG_ON(eoffset >= radeon_vm_num_pdes(rdev)); 528 493 ··· 541 510 542 511 r = radeon_bo_create(rdev, RADEON_VM_PTE_COUNT * 8, 543 512 RADEON_GPU_PAGE_SIZE, true, 544 - RADEON_GEM_DOMAIN_VRAM, NULL, &pt); 513 + RADEON_GEM_DOMAIN_VRAM, 0, NULL, &pt); 545 514 if (r) 546 515 return r; 547 516 ··· 642 611 ndw = 64; 643 612 644 613 /* assume the worst case */ 645 - ndw += vm->max_pde_used * 16; 614 + ndw += vm->max_pde_used * 6; 646 615 647 616 /* update too big for an IB */ 648 617 if (ndw > 0xfffff) ··· 671 640 ((last_pt + incr * count) != pt)) { 672 641 673 642 if (count) { 674 - radeon_asic_vm_set_page(rdev, &ib, last_pde, 675 - last_pt, count, incr, 676 - R600_PTE_VALID); 643 + radeon_vm_set_pages(rdev, &ib, last_pde, 644 + last_pt, count, incr, 645 + R600_PTE_VALID); 677 646 } 678 647 679 648 count = 1; ··· 685 654 } 686 655 687 656 if (count) 688 - radeon_asic_vm_set_page(rdev, &ib, last_pde, last_pt, count, 689 - incr, R600_PTE_VALID); 657 + radeon_vm_set_pages(rdev, &ib, last_pde, last_pt, count, 658 + incr, R600_PTE_VALID); 690 659 691 660 if (ib.length_dw != 0) { 661 + radeon_asic_vm_pad_ib(rdev, &ib); 692 662 radeon_semaphore_sync_to(ib.semaphore, pd->tbo.sync_obj); 693 663 radeon_semaphore_sync_to(ib.semaphore, vm->last_id_use); 664 + WARN_ON(ib.length_dw > ndw); 694 665 r = radeon_ib_schedule(rdev, &ib, NULL); 695 666 if (r) { 696 667 radeon_ib_free(rdev, &ib); ··· 758 725 (frag_start >= frag_end)) { 759 726 760 727 count = (pe_end - pe_start) / 8; 761 - radeon_asic_vm_set_page(rdev, ib, pe_start, addr, count, 762 - RADEON_GPU_PAGE_SIZE, flags); 728 + radeon_vm_set_pages(rdev, ib, pe_start, addr, count, 729 + RADEON_GPU_PAGE_SIZE, flags); 763 730 return; 764 731 } 765 732 766 733 /* handle the 4K area at the beginning */ 767 734 if (pe_start != frag_start) { 768 735 count = (frag_start - pe_start) / 8; 769 - radeon_asic_vm_set_page(rdev, ib, pe_start, addr, count, 770 - RADEON_GPU_PAGE_SIZE, flags); 736 + radeon_vm_set_pages(rdev, ib, pe_start, addr, count, 737 + RADEON_GPU_PAGE_SIZE, flags); 771 738 addr += RADEON_GPU_PAGE_SIZE * count; 772 739 } 773 740 774 741 /* handle the area in the middle */ 775 742 count = (frag_end - frag_start) / 8; 776 - radeon_asic_vm_set_page(rdev, ib, frag_start, addr, count, 777 - RADEON_GPU_PAGE_SIZE, flags | frag_flags); 743 + radeon_vm_set_pages(rdev, ib, frag_start, addr, count, 744 + RADEON_GPU_PAGE_SIZE, flags | frag_flags); 778 745 779 746 /* handle the 4K area at the end */ 780 747 if (frag_end != pe_end) { 781 748 addr += RADEON_GPU_PAGE_SIZE * count; 782 749 count = (pe_end - frag_end) / 8; 783 - radeon_asic_vm_set_page(rdev, ib, frag_end, addr, count, 784 - RADEON_GPU_PAGE_SIZE, flags); 750 + radeon_vm_set_pages(rdev, ib, frag_end, addr, count, 751 + RADEON_GPU_PAGE_SIZE, flags); 785 752 } 786 753 } 787 754 ··· 809 776 uint64_t last_pte = ~0, last_dst = ~0; 810 777 unsigned count = 0; 811 778 uint64_t addr; 812 - 813 - start = start / RADEON_GPU_PAGE_SIZE; 814 - end = end / RADEON_GPU_PAGE_SIZE; 815 779 816 780 /* walk over the address space and update the page tables */ 817 781 for (addr = start; addr < end; ) { ··· 872 842 { 873 843 struct radeon_vm *vm = bo_va->vm; 874 844 struct radeon_ib ib; 875 - unsigned nptes, ndw; 845 + unsigned nptes, ncmds, ndw; 876 846 uint64_t addr; 847 + uint32_t flags; 877 848 int r; 878 849 879 - 880 - if (!bo_va->soffset) { 850 + if (!bo_va->it.start) { 881 851 dev_err(rdev->dev, "bo %p don't has a mapping in vm %p\n", 882 852 bo_va->bo, vm); 883 853 return -EINVAL; 884 854 } 885 855 886 - if ((bo_va->valid && mem) || (!bo_va->valid && mem == NULL)) 887 - return 0; 856 + list_del_init(&bo_va->vm_status); 888 857 889 858 bo_va->flags &= ~RADEON_VM_PAGE_VALID; 890 859 bo_va->flags &= ~RADEON_VM_PAGE_SYSTEM; 860 + bo_va->flags &= ~RADEON_VM_PAGE_SNOOPED; 891 861 if (mem) { 892 862 addr = mem->start << PAGE_SHIFT; 893 863 if (mem->mem_type != TTM_PL_SYSTEM) { 894 864 bo_va->flags |= RADEON_VM_PAGE_VALID; 895 - bo_va->valid = true; 896 865 } 897 866 if (mem->mem_type == TTM_PL_TT) { 898 867 bo_va->flags |= RADEON_VM_PAGE_SYSTEM; 868 + if (!(bo_va->bo->flags & (RADEON_GEM_GTT_WC | RADEON_GEM_GTT_UC))) 869 + bo_va->flags |= RADEON_VM_PAGE_SNOOPED; 870 + 899 871 } else { 900 872 addr += rdev->vm_manager.vram_base_offset; 901 873 } 902 874 } else { 903 875 addr = 0; 904 - bo_va->valid = false; 905 876 } 877 + 878 + if (addr == bo_va->addr) 879 + return 0; 880 + bo_va->addr = addr; 906 881 907 882 trace_radeon_vm_bo_update(bo_va); 908 883 909 - nptes = (bo_va->eoffset - bo_va->soffset) / RADEON_GPU_PAGE_SIZE; 884 + nptes = bo_va->it.last - bo_va->it.start + 1; 885 + 886 + /* reserve space for one command every (1 << BLOCK_SIZE) entries 887 + or 2k dwords (whatever is smaller) */ 888 + ncmds = (nptes >> min(radeon_vm_block_size, 11)) + 1; 910 889 911 890 /* padding, etc. */ 912 891 ndw = 64; 913 892 914 - if (radeon_vm_block_size > 11) 915 - /* reserve space for one header for every 2k dwords */ 916 - ndw += (nptes >> 11) * 4; 917 - else 918 - /* reserve space for one header for 919 - every (1 << BLOCK_SIZE) entries */ 920 - ndw += (nptes >> radeon_vm_block_size) * 4; 893 + flags = radeon_vm_page_flags(bo_va->flags); 894 + if ((flags & R600_PTE_GART_MASK) == R600_PTE_GART_MASK) { 895 + /* only copy commands needed */ 896 + ndw += ncmds * 7; 921 897 922 - /* reserve space for pte addresses */ 923 - ndw += nptes * 2; 898 + } else if (flags & R600_PTE_SYSTEM) { 899 + /* header for write data commands */ 900 + ndw += ncmds * 4; 901 + 902 + /* body of write data command */ 903 + ndw += nptes * 2; 904 + 905 + } else { 906 + /* set page commands needed */ 907 + ndw += ncmds * 10; 908 + 909 + /* two extra commands for begin/end of fragment */ 910 + ndw += 2 * 10; 911 + } 924 912 925 913 /* update too big for an IB */ 926 914 if (ndw > 0xfffff) ··· 949 901 return r; 950 902 ib.length_dw = 0; 951 903 952 - radeon_vm_update_ptes(rdev, vm, &ib, bo_va->soffset, bo_va->eoffset, 953 - addr, radeon_vm_page_flags(bo_va->flags)); 904 + radeon_vm_update_ptes(rdev, vm, &ib, bo_va->it.start, 905 + bo_va->it.last + 1, addr, 906 + radeon_vm_page_flags(bo_va->flags)); 907 + 908 + radeon_asic_vm_pad_ib(rdev, &ib); 909 + WARN_ON(ib.length_dw > ndw); 954 910 955 911 radeon_semaphore_sync_to(ib.semaphore, vm->fence); 956 912 r = radeon_ib_schedule(rdev, &ib, NULL); ··· 988 936 int r; 989 937 990 938 list_for_each_entry_safe(bo_va, tmp, &vm->freed, vm_status) { 991 - list_del(&bo_va->vm_status); 992 939 r = radeon_vm_bo_update(rdev, bo_va, NULL); 940 + radeon_bo_unref(&bo_va->bo); 993 941 kfree(bo_va); 994 942 if (r) 995 943 return r; 996 944 } 997 945 return 0; 998 946 947 + } 948 + 949 + /** 950 + * radeon_vm_clear_invalids - clear invalidated BOs in the PT 951 + * 952 + * @rdev: radeon_device pointer 953 + * @vm: requested vm 954 + * 955 + * Make sure all invalidated BOs are cleared in the PT. 956 + * Returns 0 for success. 957 + * 958 + * PTs have to be reserved and mutex must be locked! 959 + */ 960 + int radeon_vm_clear_invalids(struct radeon_device *rdev, 961 + struct radeon_vm *vm) 962 + { 963 + struct radeon_bo_va *bo_va, *tmp; 964 + int r; 965 + 966 + list_for_each_entry_safe(bo_va, tmp, &vm->invalidated, vm_status) { 967 + r = radeon_vm_bo_update(rdev, bo_va, NULL); 968 + if (r) 969 + return r; 970 + } 971 + return 0; 999 972 } 1000 973 1001 974 /** ··· 1041 964 list_del(&bo_va->bo_list); 1042 965 1043 966 mutex_lock(&vm->mutex); 1044 - list_del(&bo_va->vm_list); 967 + interval_tree_remove(&bo_va->it, &vm->va); 968 + list_del(&bo_va->vm_status); 1045 969 1046 - if (bo_va->soffset) { 1047 - bo_va->bo = NULL; 970 + if (bo_va->addr) { 971 + bo_va->bo = radeon_bo_ref(bo_va->bo); 1048 972 list_add(&bo_va->vm_status, &vm->freed); 1049 973 } else { 1050 974 kfree(bo_va); ··· 1069 991 struct radeon_bo_va *bo_va; 1070 992 1071 993 list_for_each_entry(bo_va, &bo->va, bo_list) { 1072 - bo_va->valid = false; 994 + if (bo_va->addr) { 995 + mutex_lock(&bo_va->vm->mutex); 996 + list_del(&bo_va->vm_status); 997 + list_add(&bo_va->vm_status, &bo_va->vm->invalidated); 998 + mutex_unlock(&bo_va->vm->mutex); 999 + } 1073 1000 } 1074 1001 } 1075 1002 ··· 1099 1016 vm->last_flush = NULL; 1100 1017 vm->last_id_use = NULL; 1101 1018 mutex_init(&vm->mutex); 1102 - INIT_LIST_HEAD(&vm->va); 1019 + vm->va = RB_ROOT; 1020 + INIT_LIST_HEAD(&vm->invalidated); 1103 1021 INIT_LIST_HEAD(&vm->freed); 1104 1022 1105 1023 pd_size = radeon_vm_directory_size(rdev); ··· 1115 1031 } 1116 1032 1117 1033 r = radeon_bo_create(rdev, pd_size, align, true, 1118 - RADEON_GEM_DOMAIN_VRAM, NULL, 1034 + RADEON_GEM_DOMAIN_VRAM, 0, NULL, 1119 1035 &vm->page_directory); 1120 1036 if (r) 1121 1037 return r; ··· 1144 1060 struct radeon_bo_va *bo_va, *tmp; 1145 1061 int i, r; 1146 1062 1147 - if (!list_empty(&vm->va)) { 1063 + if (!RB_EMPTY_ROOT(&vm->va)) { 1148 1064 dev_err(rdev->dev, "still active bo inside vm\n"); 1149 1065 } 1150 - list_for_each_entry_safe(bo_va, tmp, &vm->va, vm_list) { 1151 - list_del_init(&bo_va->vm_list); 1066 + rbtree_postorder_for_each_entry_safe(bo_va, tmp, &vm->va, it.rb) { 1067 + interval_tree_remove(&bo_va->it, &vm->va); 1152 1068 r = radeon_bo_reserve(bo_va->bo, false); 1153 1069 if (!r) { 1154 1070 list_del_init(&bo_va->bo_list); ··· 1156 1072 kfree(bo_va); 1157 1073 } 1158 1074 } 1159 - list_for_each_entry_safe(bo_va, tmp, &vm->freed, vm_status) 1075 + list_for_each_entry_safe(bo_va, tmp, &vm->freed, vm_status) { 1076 + radeon_bo_unref(&bo_va->bo); 1160 1077 kfree(bo_va); 1078 + } 1161 1079 1162 1080 for (i = 0; i < radeon_vm_num_pdes(rdev); i++) 1163 1081 radeon_bo_unref(&vm->page_tables[i].bo);
+10 -4
drivers/gpu/drm/radeon/rs400.c
··· 109 109 uint32_t size_reg; 110 110 uint32_t tmp; 111 111 112 - radeon_gart_restore(rdev); 113 112 tmp = RREG32_MC(RS690_AIC_CTRL_SCRATCH); 114 113 tmp |= RS690_DIS_OUT_OF_PCI_GART_ACCESS; 115 114 WREG32_MC(RS690_AIC_CTRL_SCRATCH, tmp); ··· 208 209 radeon_gart_table_ram_free(rdev); 209 210 } 210 211 212 + #define RS400_PTE_UNSNOOPED (1 << 0) 211 213 #define RS400_PTE_WRITEABLE (1 << 2) 212 214 #define RS400_PTE_READABLE (1 << 3) 213 215 214 - void rs400_gart_set_page(struct radeon_device *rdev, unsigned i, uint64_t addr) 216 + void rs400_gart_set_page(struct radeon_device *rdev, unsigned i, 217 + uint64_t addr, uint32_t flags) 215 218 { 216 219 uint32_t entry; 217 220 u32 *gtt = rdev->gart.ptr; 218 221 219 222 entry = (lower_32_bits(addr) & PAGE_MASK) | 220 - ((upper_32_bits(addr) & 0xff) << 4) | 221 - RS400_PTE_WRITEABLE | RS400_PTE_READABLE; 223 + ((upper_32_bits(addr) & 0xff) << 4); 224 + if (flags & RADEON_GART_PAGE_READ) 225 + addr |= RS400_PTE_READABLE; 226 + if (flags & RADEON_GART_PAGE_WRITE) 227 + addr |= RS400_PTE_WRITEABLE; 228 + if (!(flags & RADEON_GART_PAGE_SNOOP)) 229 + entry |= RS400_PTE_UNSNOOPED; 222 230 entry = cpu_to_le32(entry); 223 231 gtt[i] = entry; 224 232 }
+11 -6
drivers/gpu/drm/radeon/rs600.c
··· 555 555 r = radeon_gart_table_vram_pin(rdev); 556 556 if (r) 557 557 return r; 558 - radeon_gart_restore(rdev); 559 558 /* Enable bus master */ 560 559 tmp = RREG32(RADEON_BUS_CNTL) & ~RS600_BUS_MASTER_DIS; 561 560 WREG32(RADEON_BUS_CNTL, tmp); ··· 625 626 radeon_gart_table_vram_free(rdev); 626 627 } 627 628 628 - void rs600_gart_set_page(struct radeon_device *rdev, unsigned i, uint64_t addr) 629 + void rs600_gart_set_page(struct radeon_device *rdev, unsigned i, 630 + uint64_t addr, uint32_t flags) 629 631 { 630 632 void __iomem *ptr = (void *)rdev->gart.ptr; 631 633 632 634 addr = addr & 0xFFFFFFFFFFFFF000ULL; 633 - if (addr == rdev->dummy_page.addr) 634 - addr |= R600_PTE_SYSTEM | R600_PTE_SNOOPED; 635 - else 636 - addr |= R600_PTE_GART; 635 + addr |= R600_PTE_SYSTEM; 636 + if (flags & RADEON_GART_PAGE_VALID) 637 + addr |= R600_PTE_VALID; 638 + if (flags & RADEON_GART_PAGE_READ) 639 + addr |= R600_PTE_READABLE; 640 + if (flags & RADEON_GART_PAGE_WRITE) 641 + addr |= R600_PTE_WRITEABLE; 642 + if (flags & RADEON_GART_PAGE_SNOOP) 643 + addr |= R600_PTE_SNOOPED; 637 644 writeq(addr, ptr + (i * 8)); 638 645 } 639 646
-1
drivers/gpu/drm/radeon/rv770.c
··· 900 900 r = radeon_gart_table_vram_pin(rdev); 901 901 if (r) 902 902 return r; 903 - radeon_gart_restore(rdev); 904 903 /* Setup L2 cache */ 905 904 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | 906 905 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
+347 -133
drivers/gpu/drm/radeon/si.c
··· 42 42 MODULE_FIRMWARE("radeon/TAHITI_mc2.bin"); 43 43 MODULE_FIRMWARE("radeon/TAHITI_rlc.bin"); 44 44 MODULE_FIRMWARE("radeon/TAHITI_smc.bin"); 45 + 46 + MODULE_FIRMWARE("radeon/tahiti_pfp.bin"); 47 + MODULE_FIRMWARE("radeon/tahiti_me.bin"); 48 + MODULE_FIRMWARE("radeon/tahiti_ce.bin"); 49 + MODULE_FIRMWARE("radeon/tahiti_mc.bin"); 50 + MODULE_FIRMWARE("radeon/tahiti_rlc.bin"); 51 + MODULE_FIRMWARE("radeon/tahiti_smc.bin"); 52 + 45 53 MODULE_FIRMWARE("radeon/PITCAIRN_pfp.bin"); 46 54 MODULE_FIRMWARE("radeon/PITCAIRN_me.bin"); 47 55 MODULE_FIRMWARE("radeon/PITCAIRN_ce.bin"); ··· 57 49 MODULE_FIRMWARE("radeon/PITCAIRN_mc2.bin"); 58 50 MODULE_FIRMWARE("radeon/PITCAIRN_rlc.bin"); 59 51 MODULE_FIRMWARE("radeon/PITCAIRN_smc.bin"); 52 + 53 + MODULE_FIRMWARE("radeon/pitcairn_pfp.bin"); 54 + MODULE_FIRMWARE("radeon/pitcairn_me.bin"); 55 + MODULE_FIRMWARE("radeon/pitcairn_ce.bin"); 56 + MODULE_FIRMWARE("radeon/pitcairn_mc.bin"); 57 + MODULE_FIRMWARE("radeon/pitcairn_rlc.bin"); 58 + MODULE_FIRMWARE("radeon/pitcairn_smc.bin"); 59 + 60 60 MODULE_FIRMWARE("radeon/VERDE_pfp.bin"); 61 61 MODULE_FIRMWARE("radeon/VERDE_me.bin"); 62 62 MODULE_FIRMWARE("radeon/VERDE_ce.bin"); ··· 72 56 MODULE_FIRMWARE("radeon/VERDE_mc2.bin"); 73 57 MODULE_FIRMWARE("radeon/VERDE_rlc.bin"); 74 58 MODULE_FIRMWARE("radeon/VERDE_smc.bin"); 59 + 60 + MODULE_FIRMWARE("radeon/verde_pfp.bin"); 61 + MODULE_FIRMWARE("radeon/verde_me.bin"); 62 + MODULE_FIRMWARE("radeon/verde_ce.bin"); 63 + MODULE_FIRMWARE("radeon/verde_mc.bin"); 64 + MODULE_FIRMWARE("radeon/verde_rlc.bin"); 65 + MODULE_FIRMWARE("radeon/verde_smc.bin"); 66 + 75 67 MODULE_FIRMWARE("radeon/OLAND_pfp.bin"); 76 68 MODULE_FIRMWARE("radeon/OLAND_me.bin"); 77 69 MODULE_FIRMWARE("radeon/OLAND_ce.bin"); ··· 87 63 MODULE_FIRMWARE("radeon/OLAND_mc2.bin"); 88 64 MODULE_FIRMWARE("radeon/OLAND_rlc.bin"); 89 65 MODULE_FIRMWARE("radeon/OLAND_smc.bin"); 66 + 67 + MODULE_FIRMWARE("radeon/oland_pfp.bin"); 68 + MODULE_FIRMWARE("radeon/oland_me.bin"); 69 + MODULE_FIRMWARE("radeon/oland_ce.bin"); 70 + MODULE_FIRMWARE("radeon/oland_mc.bin"); 71 + MODULE_FIRMWARE("radeon/oland_rlc.bin"); 72 + MODULE_FIRMWARE("radeon/oland_smc.bin"); 73 + 90 74 MODULE_FIRMWARE("radeon/HAINAN_pfp.bin"); 91 75 MODULE_FIRMWARE("radeon/HAINAN_me.bin"); 92 76 MODULE_FIRMWARE("radeon/HAINAN_ce.bin"); ··· 102 70 MODULE_FIRMWARE("radeon/HAINAN_mc2.bin"); 103 71 MODULE_FIRMWARE("radeon/HAINAN_rlc.bin"); 104 72 MODULE_FIRMWARE("radeon/HAINAN_smc.bin"); 73 + 74 + MODULE_FIRMWARE("radeon/hainan_pfp.bin"); 75 + MODULE_FIRMWARE("radeon/hainan_me.bin"); 76 + MODULE_FIRMWARE("radeon/hainan_ce.bin"); 77 + MODULE_FIRMWARE("radeon/hainan_mc.bin"); 78 + MODULE_FIRMWARE("radeon/hainan_rlc.bin"); 79 + MODULE_FIRMWARE("radeon/hainan_smc.bin"); 105 80 106 81 static u32 si_get_cu_active_bitmap(struct radeon_device *rdev, u32 se, u32 sh); 107 82 static void si_pcie_gen3_enable(struct radeon_device *rdev); ··· 1509 1470 /* ucode loading */ 1510 1471 int si_mc_load_microcode(struct radeon_device *rdev) 1511 1472 { 1512 - const __be32 *fw_data; 1473 + const __be32 *fw_data = NULL; 1474 + const __le32 *new_fw_data = NULL; 1513 1475 u32 running, blackout = 0; 1514 - u32 *io_mc_regs; 1476 + u32 *io_mc_regs = NULL; 1477 + const __le32 *new_io_mc_regs = NULL; 1515 1478 int i, regs_size, ucode_size; 1516 1479 1517 1480 if (!rdev->mc_fw) 1518 1481 return -EINVAL; 1519 1482 1520 - ucode_size = rdev->mc_fw->size / 4; 1483 + if (rdev->new_fw) { 1484 + const struct mc_firmware_header_v1_0 *hdr = 1485 + (const struct mc_firmware_header_v1_0 *)rdev->mc_fw->data; 1521 1486 1522 - switch (rdev->family) { 1523 - case CHIP_TAHITI: 1524 - io_mc_regs = (u32 *)&tahiti_io_mc_regs; 1525 - regs_size = TAHITI_IO_MC_REGS_SIZE; 1526 - break; 1527 - case CHIP_PITCAIRN: 1528 - io_mc_regs = (u32 *)&pitcairn_io_mc_regs; 1529 - regs_size = TAHITI_IO_MC_REGS_SIZE; 1530 - break; 1531 - case CHIP_VERDE: 1532 - default: 1533 - io_mc_regs = (u32 *)&verde_io_mc_regs; 1534 - regs_size = TAHITI_IO_MC_REGS_SIZE; 1535 - break; 1536 - case CHIP_OLAND: 1537 - io_mc_regs = (u32 *)&oland_io_mc_regs; 1538 - regs_size = TAHITI_IO_MC_REGS_SIZE; 1539 - break; 1540 - case CHIP_HAINAN: 1541 - io_mc_regs = (u32 *)&hainan_io_mc_regs; 1542 - regs_size = TAHITI_IO_MC_REGS_SIZE; 1543 - break; 1487 + radeon_ucode_print_mc_hdr(&hdr->header); 1488 + regs_size = le32_to_cpu(hdr->io_debug_size_bytes) / (4 * 2); 1489 + new_io_mc_regs = (const __le32 *) 1490 + (rdev->mc_fw->data + le32_to_cpu(hdr->io_debug_array_offset_bytes)); 1491 + ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; 1492 + new_fw_data = (const __le32 *) 1493 + (rdev->mc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes)); 1494 + } else { 1495 + ucode_size = rdev->mc_fw->size / 4; 1496 + 1497 + switch (rdev->family) { 1498 + case CHIP_TAHITI: 1499 + io_mc_regs = (u32 *)&tahiti_io_mc_regs; 1500 + regs_size = TAHITI_IO_MC_REGS_SIZE; 1501 + break; 1502 + case CHIP_PITCAIRN: 1503 + io_mc_regs = (u32 *)&pitcairn_io_mc_regs; 1504 + regs_size = TAHITI_IO_MC_REGS_SIZE; 1505 + break; 1506 + case CHIP_VERDE: 1507 + default: 1508 + io_mc_regs = (u32 *)&verde_io_mc_regs; 1509 + regs_size = TAHITI_IO_MC_REGS_SIZE; 1510 + break; 1511 + case CHIP_OLAND: 1512 + io_mc_regs = (u32 *)&oland_io_mc_regs; 1513 + regs_size = TAHITI_IO_MC_REGS_SIZE; 1514 + break; 1515 + case CHIP_HAINAN: 1516 + io_mc_regs = (u32 *)&hainan_io_mc_regs; 1517 + regs_size = TAHITI_IO_MC_REGS_SIZE; 1518 + break; 1519 + } 1520 + fw_data = (const __be32 *)rdev->mc_fw->data; 1544 1521 } 1545 1522 1546 1523 running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK; ··· 1573 1518 1574 1519 /* load mc io regs */ 1575 1520 for (i = 0; i < regs_size; i++) { 1576 - WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]); 1577 - WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]); 1521 + if (rdev->new_fw) { 1522 + WREG32(MC_SEQ_IO_DEBUG_INDEX, le32_to_cpup(new_io_mc_regs++)); 1523 + WREG32(MC_SEQ_IO_DEBUG_DATA, le32_to_cpup(new_io_mc_regs++)); 1524 + } else { 1525 + WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]); 1526 + WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]); 1527 + } 1578 1528 } 1579 1529 /* load the MC ucode */ 1580 - fw_data = (const __be32 *)rdev->mc_fw->data; 1581 - for (i = 0; i < ucode_size; i++) 1582 - WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++)); 1530 + for (i = 0; i < ucode_size; i++) { 1531 + if (rdev->new_fw) 1532 + WREG32(MC_SEQ_SUP_PGM, le32_to_cpup(new_fw_data++)); 1533 + else 1534 + WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++)); 1535 + } 1583 1536 1584 1537 /* put the engine back into the active state */ 1585 1538 WREG32(MC_SEQ_SUP_CNTL, 0x00000008); ··· 1616 1553 static int si_init_microcode(struct radeon_device *rdev) 1617 1554 { 1618 1555 const char *chip_name; 1619 - const char *rlc_chip_name; 1556 + const char *new_chip_name; 1620 1557 size_t pfp_req_size, me_req_size, ce_req_size, rlc_req_size, mc_req_size; 1621 1558 size_t smc_req_size, mc2_req_size; 1622 1559 char fw_name[30]; 1623 1560 int err; 1561 + int new_fw = 0; 1624 1562 1625 1563 DRM_DEBUG("\n"); 1626 1564 1627 1565 switch (rdev->family) { 1628 1566 case CHIP_TAHITI: 1629 1567 chip_name = "TAHITI"; 1630 - rlc_chip_name = "TAHITI"; 1568 + new_chip_name = "tahiti"; 1631 1569 pfp_req_size = SI_PFP_UCODE_SIZE * 4; 1632 1570 me_req_size = SI_PM4_UCODE_SIZE * 4; 1633 1571 ce_req_size = SI_CE_UCODE_SIZE * 4; ··· 1639 1575 break; 1640 1576 case CHIP_PITCAIRN: 1641 1577 chip_name = "PITCAIRN"; 1642 - rlc_chip_name = "PITCAIRN"; 1578 + new_chip_name = "pitcairn"; 1643 1579 pfp_req_size = SI_PFP_UCODE_SIZE * 4; 1644 1580 me_req_size = SI_PM4_UCODE_SIZE * 4; 1645 1581 ce_req_size = SI_CE_UCODE_SIZE * 4; ··· 1650 1586 break; 1651 1587 case CHIP_VERDE: 1652 1588 chip_name = "VERDE"; 1653 - rlc_chip_name = "VERDE"; 1589 + new_chip_name = "verde"; 1654 1590 pfp_req_size = SI_PFP_UCODE_SIZE * 4; 1655 1591 me_req_size = SI_PM4_UCODE_SIZE * 4; 1656 1592 ce_req_size = SI_CE_UCODE_SIZE * 4; ··· 1661 1597 break; 1662 1598 case CHIP_OLAND: 1663 1599 chip_name = "OLAND"; 1664 - rlc_chip_name = "OLAND"; 1600 + new_chip_name = "oland"; 1665 1601 pfp_req_size = SI_PFP_UCODE_SIZE * 4; 1666 1602 me_req_size = SI_PM4_UCODE_SIZE * 4; 1667 1603 ce_req_size = SI_CE_UCODE_SIZE * 4; ··· 1671 1607 break; 1672 1608 case CHIP_HAINAN: 1673 1609 chip_name = "HAINAN"; 1674 - rlc_chip_name = "HAINAN"; 1610 + new_chip_name = "hainan"; 1675 1611 pfp_req_size = SI_PFP_UCODE_SIZE * 4; 1676 1612 me_req_size = SI_PM4_UCODE_SIZE * 4; 1677 1613 ce_req_size = SI_CE_UCODE_SIZE * 4; ··· 1682 1618 default: BUG(); 1683 1619 } 1684 1620 1685 - DRM_INFO("Loading %s Microcode\n", chip_name); 1621 + DRM_INFO("Loading %s Microcode\n", new_chip_name); 1686 1622 1687 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name); 1623 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", new_chip_name); 1688 1624 err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev); 1689 - if (err) 1690 - goto out; 1691 - if (rdev->pfp_fw->size != pfp_req_size) { 1692 - printk(KERN_ERR 1693 - "si_cp: Bogus length %zu in firmware \"%s\"\n", 1694 - rdev->pfp_fw->size, fw_name); 1695 - err = -EINVAL; 1696 - goto out; 1697 - } 1698 - 1699 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name); 1700 - err = request_firmware(&rdev->me_fw, fw_name, rdev->dev); 1701 - if (err) 1702 - goto out; 1703 - if (rdev->me_fw->size != me_req_size) { 1704 - printk(KERN_ERR 1705 - "si_cp: Bogus length %zu in firmware \"%s\"\n", 1706 - rdev->me_fw->size, fw_name); 1707 - err = -EINVAL; 1708 - } 1709 - 1710 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name); 1711 - err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev); 1712 - if (err) 1713 - goto out; 1714 - if (rdev->ce_fw->size != ce_req_size) { 1715 - printk(KERN_ERR 1716 - "si_cp: Bogus length %zu in firmware \"%s\"\n", 1717 - rdev->ce_fw->size, fw_name); 1718 - err = -EINVAL; 1719 - } 1720 - 1721 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name); 1722 - err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev); 1723 - if (err) 1724 - goto out; 1725 - if (rdev->rlc_fw->size != rlc_req_size) { 1726 - printk(KERN_ERR 1727 - "si_rlc: Bogus length %zu in firmware \"%s\"\n", 1728 - rdev->rlc_fw->size, fw_name); 1729 - err = -EINVAL; 1730 - } 1731 - 1732 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc2.bin", chip_name); 1733 - err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); 1734 1625 if (err) { 1735 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); 1736 - err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); 1626 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name); 1627 + err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev); 1737 1628 if (err) 1738 1629 goto out; 1630 + if (rdev->pfp_fw->size != pfp_req_size) { 1631 + printk(KERN_ERR 1632 + "si_cp: Bogus length %zu in firmware \"%s\"\n", 1633 + rdev->pfp_fw->size, fw_name); 1634 + err = -EINVAL; 1635 + goto out; 1636 + } 1637 + } else { 1638 + err = radeon_ucode_validate(rdev->pfp_fw); 1639 + if (err) { 1640 + printk(KERN_ERR 1641 + "si_cp: validation failed for firmware \"%s\"\n", 1642 + fw_name); 1643 + goto out; 1644 + } else { 1645 + new_fw++; 1646 + } 1739 1647 } 1740 - if ((rdev->mc_fw->size != mc_req_size) && 1741 - (rdev->mc_fw->size != mc2_req_size)) { 1742 - printk(KERN_ERR 1743 - "si_mc: Bogus length %zu in firmware \"%s\"\n", 1744 - rdev->mc_fw->size, fw_name); 1745 - err = -EINVAL; 1746 - } 1747 - DRM_INFO("%s: %zu bytes\n", fw_name, rdev->mc_fw->size); 1748 1648 1749 - snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name); 1649 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", new_chip_name); 1650 + err = request_firmware(&rdev->me_fw, fw_name, rdev->dev); 1651 + if (err) { 1652 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name); 1653 + err = request_firmware(&rdev->me_fw, fw_name, rdev->dev); 1654 + if (err) 1655 + goto out; 1656 + if (rdev->me_fw->size != me_req_size) { 1657 + printk(KERN_ERR 1658 + "si_cp: Bogus length %zu in firmware \"%s\"\n", 1659 + rdev->me_fw->size, fw_name); 1660 + err = -EINVAL; 1661 + } 1662 + } else { 1663 + err = radeon_ucode_validate(rdev->me_fw); 1664 + if (err) { 1665 + printk(KERN_ERR 1666 + "si_cp: validation failed for firmware \"%s\"\n", 1667 + fw_name); 1668 + goto out; 1669 + } else { 1670 + new_fw++; 1671 + } 1672 + } 1673 + 1674 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", new_chip_name); 1675 + err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev); 1676 + if (err) { 1677 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name); 1678 + err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev); 1679 + if (err) 1680 + goto out; 1681 + if (rdev->ce_fw->size != ce_req_size) { 1682 + printk(KERN_ERR 1683 + "si_cp: Bogus length %zu in firmware \"%s\"\n", 1684 + rdev->ce_fw->size, fw_name); 1685 + err = -EINVAL; 1686 + } 1687 + } else { 1688 + err = radeon_ucode_validate(rdev->ce_fw); 1689 + if (err) { 1690 + printk(KERN_ERR 1691 + "si_cp: validation failed for firmware \"%s\"\n", 1692 + fw_name); 1693 + goto out; 1694 + } else { 1695 + new_fw++; 1696 + } 1697 + } 1698 + 1699 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", new_chip_name); 1700 + err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev); 1701 + if (err) { 1702 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name); 1703 + err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev); 1704 + if (err) 1705 + goto out; 1706 + if (rdev->rlc_fw->size != rlc_req_size) { 1707 + printk(KERN_ERR 1708 + "si_rlc: Bogus length %zu in firmware \"%s\"\n", 1709 + rdev->rlc_fw->size, fw_name); 1710 + err = -EINVAL; 1711 + } 1712 + } else { 1713 + err = radeon_ucode_validate(rdev->rlc_fw); 1714 + if (err) { 1715 + printk(KERN_ERR 1716 + "si_cp: validation failed for firmware \"%s\"\n", 1717 + fw_name); 1718 + goto out; 1719 + } else { 1720 + new_fw++; 1721 + } 1722 + } 1723 + 1724 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", new_chip_name); 1725 + err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); 1726 + if (err) { 1727 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc2.bin", chip_name); 1728 + err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); 1729 + if (err) { 1730 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); 1731 + err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); 1732 + if (err) 1733 + goto out; 1734 + } 1735 + if ((rdev->mc_fw->size != mc_req_size) && 1736 + (rdev->mc_fw->size != mc2_req_size)) { 1737 + printk(KERN_ERR 1738 + "si_mc: Bogus length %zu in firmware \"%s\"\n", 1739 + rdev->mc_fw->size, fw_name); 1740 + err = -EINVAL; 1741 + } 1742 + DRM_INFO("%s: %zu bytes\n", fw_name, rdev->mc_fw->size); 1743 + } else { 1744 + err = radeon_ucode_validate(rdev->mc_fw); 1745 + if (err) { 1746 + printk(KERN_ERR 1747 + "si_cp: validation failed for firmware \"%s\"\n", 1748 + fw_name); 1749 + goto out; 1750 + } else { 1751 + new_fw++; 1752 + } 1753 + } 1754 + 1755 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", new_chip_name); 1750 1756 err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); 1751 1757 if (err) { 1752 - printk(KERN_ERR 1753 - "smc: error loading firmware \"%s\"\n", 1754 - fw_name); 1755 - release_firmware(rdev->smc_fw); 1756 - rdev->smc_fw = NULL; 1757 - err = 0; 1758 - } else if (rdev->smc_fw->size != smc_req_size) { 1759 - printk(KERN_ERR 1760 - "si_smc: Bogus length %zu in firmware \"%s\"\n", 1761 - rdev->smc_fw->size, fw_name); 1762 - err = -EINVAL; 1758 + snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name); 1759 + err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); 1760 + if (err) { 1761 + printk(KERN_ERR 1762 + "smc: error loading firmware \"%s\"\n", 1763 + fw_name); 1764 + release_firmware(rdev->smc_fw); 1765 + rdev->smc_fw = NULL; 1766 + err = 0; 1767 + } else if (rdev->smc_fw->size != smc_req_size) { 1768 + printk(KERN_ERR 1769 + "si_smc: Bogus length %zu in firmware \"%s\"\n", 1770 + rdev->smc_fw->size, fw_name); 1771 + err = -EINVAL; 1772 + } 1773 + } else { 1774 + err = radeon_ucode_validate(rdev->smc_fw); 1775 + if (err) { 1776 + printk(KERN_ERR 1777 + "si_cp: validation failed for firmware \"%s\"\n", 1778 + fw_name); 1779 + goto out; 1780 + } else { 1781 + new_fw++; 1782 + } 1763 1783 } 1764 1784 1785 + if (new_fw == 0) { 1786 + rdev->new_fw = false; 1787 + } else if (new_fw < 6) { 1788 + printk(KERN_ERR "si_fw: mixing new and old firmware!\n"); 1789 + err = -EINVAL; 1790 + } else { 1791 + rdev->new_fw = true; 1792 + } 1765 1793 out: 1766 1794 if (err) { 1767 1795 if (err != -EINVAL) ··· 3438 3282 3439 3283 static int si_cp_load_microcode(struct radeon_device *rdev) 3440 3284 { 3441 - const __be32 *fw_data; 3442 3285 int i; 3443 3286 3444 - if (!rdev->me_fw || !rdev->pfp_fw) 3287 + if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw) 3445 3288 return -EINVAL; 3446 3289 3447 3290 si_cp_enable(rdev, false); 3448 3291 3449 - /* PFP */ 3450 - fw_data = (const __be32 *)rdev->pfp_fw->data; 3451 - WREG32(CP_PFP_UCODE_ADDR, 0); 3452 - for (i = 0; i < SI_PFP_UCODE_SIZE; i++) 3453 - WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++)); 3454 - WREG32(CP_PFP_UCODE_ADDR, 0); 3292 + if (rdev->new_fw) { 3293 + const struct gfx_firmware_header_v1_0 *pfp_hdr = 3294 + (const struct gfx_firmware_header_v1_0 *)rdev->pfp_fw->data; 3295 + const struct gfx_firmware_header_v1_0 *ce_hdr = 3296 + (const struct gfx_firmware_header_v1_0 *)rdev->ce_fw->data; 3297 + const struct gfx_firmware_header_v1_0 *me_hdr = 3298 + (const struct gfx_firmware_header_v1_0 *)rdev->me_fw->data; 3299 + const __le32 *fw_data; 3300 + u32 fw_size; 3455 3301 3456 - /* CE */ 3457 - fw_data = (const __be32 *)rdev->ce_fw->data; 3458 - WREG32(CP_CE_UCODE_ADDR, 0); 3459 - for (i = 0; i < SI_CE_UCODE_SIZE; i++) 3460 - WREG32(CP_CE_UCODE_DATA, be32_to_cpup(fw_data++)); 3461 - WREG32(CP_CE_UCODE_ADDR, 0); 3302 + radeon_ucode_print_gfx_hdr(&pfp_hdr->header); 3303 + radeon_ucode_print_gfx_hdr(&ce_hdr->header); 3304 + radeon_ucode_print_gfx_hdr(&me_hdr->header); 3462 3305 3463 - /* ME */ 3464 - fw_data = (const __be32 *)rdev->me_fw->data; 3465 - WREG32(CP_ME_RAM_WADDR, 0); 3466 - for (i = 0; i < SI_PM4_UCODE_SIZE; i++) 3467 - WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++)); 3468 - WREG32(CP_ME_RAM_WADDR, 0); 3306 + /* PFP */ 3307 + fw_data = (const __le32 *) 3308 + (rdev->pfp_fw->data + le32_to_cpu(pfp_hdr->header.ucode_array_offset_bytes)); 3309 + fw_size = le32_to_cpu(pfp_hdr->header.ucode_size_bytes) / 4; 3310 + WREG32(CP_PFP_UCODE_ADDR, 0); 3311 + for (i = 0; i < fw_size; i++) 3312 + WREG32(CP_PFP_UCODE_DATA, le32_to_cpup(fw_data++)); 3313 + WREG32(CP_PFP_UCODE_ADDR, 0); 3314 + 3315 + /* CE */ 3316 + fw_data = (const __le32 *) 3317 + (rdev->ce_fw->data + le32_to_cpu(ce_hdr->header.ucode_array_offset_bytes)); 3318 + fw_size = le32_to_cpu(ce_hdr->header.ucode_size_bytes) / 4; 3319 + WREG32(CP_CE_UCODE_ADDR, 0); 3320 + for (i = 0; i < fw_size; i++) 3321 + WREG32(CP_CE_UCODE_DATA, le32_to_cpup(fw_data++)); 3322 + WREG32(CP_CE_UCODE_ADDR, 0); 3323 + 3324 + /* ME */ 3325 + fw_data = (const __be32 *) 3326 + (rdev->me_fw->data + le32_to_cpu(me_hdr->header.ucode_array_offset_bytes)); 3327 + fw_size = le32_to_cpu(me_hdr->header.ucode_size_bytes) / 4; 3328 + WREG32(CP_ME_RAM_WADDR, 0); 3329 + for (i = 0; i < fw_size; i++) 3330 + WREG32(CP_ME_RAM_DATA, le32_to_cpup(fw_data++)); 3331 + WREG32(CP_ME_RAM_WADDR, 0); 3332 + } else { 3333 + const __be32 *fw_data; 3334 + 3335 + /* PFP */ 3336 + fw_data = (const __be32 *)rdev->pfp_fw->data; 3337 + WREG32(CP_PFP_UCODE_ADDR, 0); 3338 + for (i = 0; i < SI_PFP_UCODE_SIZE; i++) 3339 + WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++)); 3340 + WREG32(CP_PFP_UCODE_ADDR, 0); 3341 + 3342 + /* CE */ 3343 + fw_data = (const __be32 *)rdev->ce_fw->data; 3344 + WREG32(CP_CE_UCODE_ADDR, 0); 3345 + for (i = 0; i < SI_CE_UCODE_SIZE; i++) 3346 + WREG32(CP_CE_UCODE_DATA, be32_to_cpup(fw_data++)); 3347 + WREG32(CP_CE_UCODE_ADDR, 0); 3348 + 3349 + /* ME */ 3350 + fw_data = (const __be32 *)rdev->me_fw->data; 3351 + WREG32(CP_ME_RAM_WADDR, 0); 3352 + for (i = 0; i < SI_PM4_UCODE_SIZE; i++) 3353 + WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++)); 3354 + WREG32(CP_ME_RAM_WADDR, 0); 3355 + } 3469 3356 3470 3357 WREG32(CP_PFP_UCODE_ADDR, 0); 3471 3358 WREG32(CP_CE_UCODE_ADDR, 0); ··· 4247 4048 r = radeon_gart_table_vram_pin(rdev); 4248 4049 if (r) 4249 4050 return r; 4250 - radeon_gart_restore(rdev); 4251 4051 /* Setup TLB control */ 4252 4052 WREG32(MC_VM_MX_L1_TLB_CNTL, 4253 4053 (0xA << 7) | ··· 5013 4815 5014 4816 /* write new base address */ 5015 4817 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); 5016 - radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) | 4818 + radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(1) | 5017 4819 WRITE_DATA_DST_SEL(0))); 5018 4820 5019 4821 if (vm->id < 8) { ··· 5790 5592 static int si_rlc_resume(struct radeon_device *rdev) 5791 5593 { 5792 5594 u32 i; 5793 - const __be32 *fw_data; 5794 5595 5795 5596 if (!rdev->rlc_fw) 5796 5597 return -EINVAL; ··· 5812 5615 WREG32(RLC_MC_CNTL, 0); 5813 5616 WREG32(RLC_UCODE_CNTL, 0); 5814 5617 5815 - fw_data = (const __be32 *)rdev->rlc_fw->data; 5816 - for (i = 0; i < SI_RLC_UCODE_SIZE; i++) { 5817 - WREG32(RLC_UCODE_ADDR, i); 5818 - WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++)); 5618 + if (rdev->new_fw) { 5619 + const struct rlc_firmware_header_v1_0 *hdr = 5620 + (const struct rlc_firmware_header_v1_0 *)rdev->rlc_fw->data; 5621 + u32 fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; 5622 + const __le32 *fw_data = (const __le32 *) 5623 + (rdev->rlc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes)); 5624 + 5625 + radeon_ucode_print_rlc_hdr(&hdr->header); 5626 + 5627 + for (i = 0; i < fw_size; i++) { 5628 + WREG32(RLC_UCODE_ADDR, i); 5629 + WREG32(RLC_UCODE_DATA, le32_to_cpup(fw_data++)); 5630 + } 5631 + } else { 5632 + const __be32 *fw_data = 5633 + (const __be32 *)rdev->rlc_fw->data; 5634 + for (i = 0; i < SI_RLC_UCODE_SIZE; i++) { 5635 + WREG32(RLC_UCODE_ADDR, i); 5636 + WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++)); 5637 + } 5819 5638 } 5820 5639 WREG32(RLC_UCODE_ADDR, 0); 5821 5640 ··· 6531 6318 case 16: /* D5 page flip */ 6532 6319 case 18: /* D6 page flip */ 6533 6320 DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1); 6534 - radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1); 6321 + if (radeon_use_pflipirq > 0) 6322 + radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1); 6535 6323 break; 6536 6324 case 42: /* HPD hotplug */ 6537 6325 switch (src_data) {
+109 -69
drivers/gpu/drm/radeon/si_dma.c
··· 56 56 } 57 57 58 58 /** 59 - * si_dma_vm_set_page - update the page tables using the DMA 59 + * si_dma_vm_copy_pages - update PTEs by copying them from the GART 60 + * 61 + * @rdev: radeon_device pointer 62 + * @ib: indirect buffer to fill with commands 63 + * @pe: addr of the page entry 64 + * @src: src addr where to copy from 65 + * @count: number of page entries to update 66 + * 67 + * Update PTEs by copying them from the GART using the DMA (SI). 68 + */ 69 + void si_dma_vm_copy_pages(struct radeon_device *rdev, 70 + struct radeon_ib *ib, 71 + uint64_t pe, uint64_t src, 72 + unsigned count) 73 + { 74 + while (count) { 75 + unsigned bytes = count * 8; 76 + if (bytes > 0xFFFF8) 77 + bytes = 0xFFFF8; 78 + 79 + ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_COPY, 80 + 1, 0, 0, bytes); 81 + ib->ptr[ib->length_dw++] = lower_32_bits(pe); 82 + ib->ptr[ib->length_dw++] = lower_32_bits(src); 83 + ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff; 84 + ib->ptr[ib->length_dw++] = upper_32_bits(src) & 0xff; 85 + 86 + pe += bytes; 87 + src += bytes; 88 + count -= bytes / 8; 89 + } 90 + } 91 + 92 + /** 93 + * si_dma_vm_write_pages - update PTEs by writing them manually 94 + * 95 + * @rdev: radeon_device pointer 96 + * @ib: indirect buffer to fill with commands 97 + * @pe: addr of the page entry 98 + * @addr: dst addr to write into pe 99 + * @count: number of page entries to update 100 + * @incr: increase next addr by incr bytes 101 + * @flags: access flags 102 + * 103 + * Update PTEs by writing them manually using the DMA (SI). 104 + */ 105 + void si_dma_vm_write_pages(struct radeon_device *rdev, 106 + struct radeon_ib *ib, 107 + uint64_t pe, 108 + uint64_t addr, unsigned count, 109 + uint32_t incr, uint32_t flags) 110 + { 111 + uint64_t value; 112 + unsigned ndw; 113 + 114 + while (count) { 115 + ndw = count * 2; 116 + if (ndw > 0xFFFFE) 117 + ndw = 0xFFFFE; 118 + 119 + /* for non-physically contiguous pages (system) */ 120 + ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 0, ndw); 121 + ib->ptr[ib->length_dw++] = pe; 122 + ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff; 123 + for (; ndw > 0; ndw -= 2, --count, pe += 8) { 124 + if (flags & R600_PTE_SYSTEM) { 125 + value = radeon_vm_map_gart(rdev, addr); 126 + value &= 0xFFFFFFFFFFFFF000ULL; 127 + } else if (flags & R600_PTE_VALID) { 128 + value = addr; 129 + } else { 130 + value = 0; 131 + } 132 + addr += incr; 133 + value |= flags; 134 + ib->ptr[ib->length_dw++] = value; 135 + ib->ptr[ib->length_dw++] = upper_32_bits(value); 136 + } 137 + } 138 + } 139 + 140 + /** 141 + * si_dma_vm_set_pages - update the page tables using the DMA 60 142 * 61 143 * @rdev: radeon_device pointer 62 144 * @ib: indirect buffer to fill with commands ··· 150 68 * 151 69 * Update the page tables using the DMA (SI). 152 70 */ 153 - void si_dma_vm_set_page(struct radeon_device *rdev, 154 - struct radeon_ib *ib, 155 - uint64_t pe, 156 - uint64_t addr, unsigned count, 157 - uint32_t incr, uint32_t flags) 71 + void si_dma_vm_set_pages(struct radeon_device *rdev, 72 + struct radeon_ib *ib, 73 + uint64_t pe, 74 + uint64_t addr, unsigned count, 75 + uint32_t incr, uint32_t flags) 158 76 { 159 77 uint64_t value; 160 78 unsigned ndw; 161 79 162 - trace_radeon_vm_set_page(pe, addr, count, incr, flags); 80 + while (count) { 81 + ndw = count * 2; 82 + if (ndw > 0xFFFFE) 83 + ndw = 0xFFFFE; 163 84 164 - if (flags == R600_PTE_GART) { 165 - uint64_t src = rdev->gart.table_addr + (addr >> 12) * 8; 166 - while (count) { 167 - unsigned bytes = count * 8; 168 - if (bytes > 0xFFFF8) 169 - bytes = 0xFFFF8; 85 + if (flags & R600_PTE_VALID) 86 + value = addr; 87 + else 88 + value = 0; 170 89 171 - ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_COPY, 172 - 1, 0, 0, bytes); 173 - ib->ptr[ib->length_dw++] = lower_32_bits(pe); 174 - ib->ptr[ib->length_dw++] = lower_32_bits(src); 175 - ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff; 176 - ib->ptr[ib->length_dw++] = upper_32_bits(src) & 0xff; 177 - 178 - pe += bytes; 179 - src += bytes; 180 - count -= bytes / 8; 181 - } 182 - } else if (flags & R600_PTE_SYSTEM) { 183 - while (count) { 184 - ndw = count * 2; 185 - if (ndw > 0xFFFFE) 186 - ndw = 0xFFFFE; 187 - 188 - /* for non-physically contiguous pages (system) */ 189 - ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 0, ndw); 190 - ib->ptr[ib->length_dw++] = pe; 191 - ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff; 192 - for (; ndw > 0; ndw -= 2, --count, pe += 8) { 193 - value = radeon_vm_map_gart(rdev, addr); 194 - value &= 0xFFFFFFFFFFFFF000ULL; 195 - addr += incr; 196 - value |= flags; 197 - ib->ptr[ib->length_dw++] = value; 198 - ib->ptr[ib->length_dw++] = upper_32_bits(value); 199 - } 200 - } 201 - } else { 202 - while (count) { 203 - ndw = count * 2; 204 - if (ndw > 0xFFFFE) 205 - ndw = 0xFFFFE; 206 - 207 - if (flags & R600_PTE_VALID) 208 - value = addr; 209 - else 210 - value = 0; 211 - /* for physically contiguous pages (vram) */ 212 - ib->ptr[ib->length_dw++] = DMA_PTE_PDE_PACKET(ndw); 213 - ib->ptr[ib->length_dw++] = pe; /* dst addr */ 214 - ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff; 215 - ib->ptr[ib->length_dw++] = flags; /* mask */ 216 - ib->ptr[ib->length_dw++] = 0; 217 - ib->ptr[ib->length_dw++] = value; /* value */ 218 - ib->ptr[ib->length_dw++] = upper_32_bits(value); 219 - ib->ptr[ib->length_dw++] = incr; /* increment size */ 220 - ib->ptr[ib->length_dw++] = 0; 221 - pe += ndw * 4; 222 - addr += (ndw / 2) * incr; 223 - count -= ndw / 2; 224 - } 90 + /* for physically contiguous pages (vram) */ 91 + ib->ptr[ib->length_dw++] = DMA_PTE_PDE_PACKET(ndw); 92 + ib->ptr[ib->length_dw++] = pe; /* dst addr */ 93 + ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff; 94 + ib->ptr[ib->length_dw++] = flags; /* mask */ 95 + ib->ptr[ib->length_dw++] = 0; 96 + ib->ptr[ib->length_dw++] = value; /* value */ 97 + ib->ptr[ib->length_dw++] = upper_32_bits(value); 98 + ib->ptr[ib->length_dw++] = incr; /* increment size */ 99 + ib->ptr[ib->length_dw++] = 0; 100 + pe += ndw * 4; 101 + addr += (ndw / 2) * incr; 102 + count -= ndw / 2; 225 103 } 226 - while (ib->length_dw & 0x7) 227 - ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0); 228 104 } 229 105 230 106 void si_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
+107 -43
drivers/gpu/drm/radeon/si_dpm.c
··· 3812 3812 voltage_table->count = max_voltage_steps; 3813 3813 } 3814 3814 3815 + static int si_get_svi2_voltage_table(struct radeon_device *rdev, 3816 + struct radeon_clock_voltage_dependency_table *voltage_dependency_table, 3817 + struct atom_voltage_table *voltage_table) 3818 + { 3819 + u32 i; 3820 + 3821 + if (voltage_dependency_table == NULL) 3822 + return -EINVAL; 3823 + 3824 + voltage_table->mask_low = 0; 3825 + voltage_table->phase_delay = 0; 3826 + 3827 + voltage_table->count = voltage_dependency_table->count; 3828 + for (i = 0; i < voltage_table->count; i++) { 3829 + voltage_table->entries[i].value = voltage_dependency_table->entries[i].v; 3830 + voltage_table->entries[i].smio_low = 0; 3831 + } 3832 + 3833 + return 0; 3834 + } 3835 + 3815 3836 static int si_construct_voltage_tables(struct radeon_device *rdev) 3816 3837 { 3817 3838 struct rv7xx_power_info *pi = rv770_get_pi(rdev); ··· 3840 3819 struct si_power_info *si_pi = si_get_pi(rdev); 3841 3820 int ret; 3842 3821 3843 - ret = radeon_atom_get_voltage_table(rdev, VOLTAGE_TYPE_VDDC, 3844 - VOLTAGE_OBJ_GPIO_LUT, &eg_pi->vddc_voltage_table); 3845 - if (ret) 3846 - return ret; 3822 + if (pi->voltage_control) { 3823 + ret = radeon_atom_get_voltage_table(rdev, VOLTAGE_TYPE_VDDC, 3824 + VOLTAGE_OBJ_GPIO_LUT, &eg_pi->vddc_voltage_table); 3825 + if (ret) 3826 + return ret; 3847 3827 3848 - if (eg_pi->vddc_voltage_table.count > SISLANDS_MAX_NO_VREG_STEPS) 3849 - si_trim_voltage_table_to_fit_state_table(rdev, 3850 - SISLANDS_MAX_NO_VREG_STEPS, 3851 - &eg_pi->vddc_voltage_table); 3828 + if (eg_pi->vddc_voltage_table.count > SISLANDS_MAX_NO_VREG_STEPS) 3829 + si_trim_voltage_table_to_fit_state_table(rdev, 3830 + SISLANDS_MAX_NO_VREG_STEPS, 3831 + &eg_pi->vddc_voltage_table); 3832 + } else if (si_pi->voltage_control_svi2) { 3833 + ret = si_get_svi2_voltage_table(rdev, 3834 + &rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, 3835 + &eg_pi->vddc_voltage_table); 3836 + if (ret) 3837 + return ret; 3838 + } else { 3839 + return -EINVAL; 3840 + } 3852 3841 3853 3842 if (eg_pi->vddci_control) { 3854 3843 ret = radeon_atom_get_voltage_table(rdev, VOLTAGE_TYPE_VDDCI, ··· 3870 3839 si_trim_voltage_table_to_fit_state_table(rdev, 3871 3840 SISLANDS_MAX_NO_VREG_STEPS, 3872 3841 &eg_pi->vddci_voltage_table); 3842 + } 3843 + if (si_pi->vddci_control_svi2) { 3844 + ret = si_get_svi2_voltage_table(rdev, 3845 + &rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, 3846 + &eg_pi->vddci_voltage_table); 3847 + if (ret) 3848 + return ret; 3873 3849 } 3874 3850 3875 3851 if (pi->mvdd_control) { ··· 3931 3893 struct si_power_info *si_pi = si_get_pi(rdev); 3932 3894 u8 i; 3933 3895 3934 - if (eg_pi->vddc_voltage_table.count) { 3935 - si_populate_smc_voltage_table(rdev, &eg_pi->vddc_voltage_table, table); 3936 - table->voltageMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDC] = 3937 - cpu_to_be32(eg_pi->vddc_voltage_table.mask_low); 3896 + if (si_pi->voltage_control_svi2) { 3897 + si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svc, 3898 + si_pi->svc_gpio_id); 3899 + si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svd, 3900 + si_pi->svd_gpio_id); 3901 + si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_svi_rework_plat_type, 3902 + 2); 3903 + } else { 3904 + if (eg_pi->vddc_voltage_table.count) { 3905 + si_populate_smc_voltage_table(rdev, &eg_pi->vddc_voltage_table, table); 3906 + table->voltageMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDC] = 3907 + cpu_to_be32(eg_pi->vddc_voltage_table.mask_low); 3938 3908 3939 - for (i = 0; i < eg_pi->vddc_voltage_table.count; i++) { 3940 - if (pi->max_vddc_in_table <= eg_pi->vddc_voltage_table.entries[i].value) { 3941 - table->maxVDDCIndexInPPTable = i; 3942 - break; 3909 + for (i = 0; i < eg_pi->vddc_voltage_table.count; i++) { 3910 + if (pi->max_vddc_in_table <= eg_pi->vddc_voltage_table.entries[i].value) { 3911 + table->maxVDDCIndexInPPTable = i; 3912 + break; 3913 + } 3943 3914 } 3944 3915 } 3945 - } 3946 3916 3947 - if (eg_pi->vddci_voltage_table.count) { 3948 - si_populate_smc_voltage_table(rdev, &eg_pi->vddci_voltage_table, table); 3917 + if (eg_pi->vddci_voltage_table.count) { 3918 + si_populate_smc_voltage_table(rdev, &eg_pi->vddci_voltage_table, table); 3949 3919 3950 - table->voltageMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDCI] = 3951 - cpu_to_be32(eg_pi->vddci_voltage_table.mask_low); 3952 - } 3920 + table->voltageMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDCI] = 3921 + cpu_to_be32(eg_pi->vddci_voltage_table.mask_low); 3922 + } 3953 3923 3954 3924 3955 - if (si_pi->mvdd_voltage_table.count) { 3956 - si_populate_smc_voltage_table(rdev, &si_pi->mvdd_voltage_table, table); 3925 + if (si_pi->mvdd_voltage_table.count) { 3926 + si_populate_smc_voltage_table(rdev, &si_pi->mvdd_voltage_table, table); 3957 3927 3958 - table->voltageMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_MVDD] = 3959 - cpu_to_be32(si_pi->mvdd_voltage_table.mask_low); 3960 - } 3928 + table->voltageMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_MVDD] = 3929 + cpu_to_be32(si_pi->mvdd_voltage_table.mask_low); 3930 + } 3961 3931 3962 - if (si_pi->vddc_phase_shed_control) { 3963 - if (si_validate_phase_shedding_tables(rdev, &si_pi->vddc_phase_shed_table, 3964 - &rdev->pm.dpm.dyn_state.phase_shedding_limits_table)) { 3965 - si_populate_smc_voltage_table(rdev, &si_pi->vddc_phase_shed_table, table); 3932 + if (si_pi->vddc_phase_shed_control) { 3933 + if (si_validate_phase_shedding_tables(rdev, &si_pi->vddc_phase_shed_table, 3934 + &rdev->pm.dpm.dyn_state.phase_shedding_limits_table)) { 3935 + si_populate_smc_voltage_table(rdev, &si_pi->vddc_phase_shed_table, table); 3966 3936 3967 - table->phaseMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDC] = 3968 - cpu_to_be32(si_pi->vddc_phase_shed_table.mask_low); 3937 + table->phaseMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDC] = 3938 + cpu_to_be32(si_pi->vddc_phase_shed_table.mask_low); 3969 3939 3970 - si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_phase_shedding_delay, 3971 - (u32)si_pi->vddc_phase_shed_table.phase_delay); 3972 - } else { 3973 - si_pi->vddc_phase_shed_control = false; 3940 + si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_phase_shedding_delay, 3941 + (u32)si_pi->vddc_phase_shed_table.phase_delay); 3942 + } else { 3943 + si_pi->vddc_phase_shed_control = false; 3944 + } 3974 3945 } 3975 3946 } 3976 3947 ··· 5845 5798 { 5846 5799 struct rv7xx_power_info *pi = rv770_get_pi(rdev); 5847 5800 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 5801 + struct si_power_info *si_pi = si_get_pi(rdev); 5848 5802 struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps; 5849 5803 int ret; 5850 5804 5851 5805 if (si_is_smc_running(rdev)) 5852 5806 return -EINVAL; 5853 - if (pi->voltage_control) 5807 + if (pi->voltage_control || si_pi->voltage_control_svi2) 5854 5808 si_enable_voltage_control(rdev, true); 5855 5809 if (pi->mvdd_control) 5856 5810 si_get_mvdd_configuration(rdev); 5857 - if (pi->voltage_control) { 5811 + if (pi->voltage_control || si_pi->voltage_control_svi2) { 5858 5812 ret = si_construct_voltage_tables(rdev); 5859 5813 if (ret) { 5860 5814 DRM_ERROR("si_construct_voltage_tables failed\n"); ··· 6454 6406 ni_pi->mclk_rtt_mode_threshold = eg_pi->mclk_edc_wr_enable_threshold; 6455 6407 6456 6408 pi->voltage_control = 6457 - radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, VOLTAGE_OBJ_GPIO_LUT); 6409 + radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, 6410 + VOLTAGE_OBJ_GPIO_LUT); 6411 + if (!pi->voltage_control) { 6412 + si_pi->voltage_control_svi2 = 6413 + radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, 6414 + VOLTAGE_OBJ_SVID2); 6415 + if (si_pi->voltage_control_svi2) 6416 + radeon_atom_get_svi2_info(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, 6417 + &si_pi->svd_gpio_id, &si_pi->svc_gpio_id); 6418 + } 6458 6419 6459 6420 pi->mvdd_control = 6460 - radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_MVDDC, VOLTAGE_OBJ_GPIO_LUT); 6421 + radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_MVDDC, 6422 + VOLTAGE_OBJ_GPIO_LUT); 6461 6423 6462 6424 eg_pi->vddci_control = 6463 - radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, VOLTAGE_OBJ_GPIO_LUT); 6425 + radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, 6426 + VOLTAGE_OBJ_GPIO_LUT); 6427 + if (!eg_pi->vddci_control) 6428 + si_pi->vddci_control_svi2 = 6429 + radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, 6430 + VOLTAGE_OBJ_SVID2); 6464 6431 6465 6432 si_pi->vddc_phase_shed_control = 6466 - radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, VOLTAGE_OBJ_PHASE_LUT); 6433 + radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, 6434 + VOLTAGE_OBJ_PHASE_LUT); 6467 6435 6468 6436 rv770_get_engine_memory_ss(rdev); 6469 6437
+5
drivers/gpu/drm/radeon/si_dpm.h
··· 170 170 bool vddc_phase_shed_control; 171 171 bool pspp_notify_required; 172 172 bool sclk_deep_sleep_above_low; 173 + bool voltage_control_svi2; 174 + bool vddci_control_svi2; 173 175 /* smc offsets */ 174 176 u32 sram_end; 175 177 u32 state_table_start; ··· 194 192 SMC_SIslands_MCRegisters smc_mc_reg_table; 195 193 SISLANDS_SMC_STATETABLE smc_statetable; 196 194 PP_SIslands_PAPMParameters papm_parm; 195 + /* SVI2 */ 196 + u8 svd_gpio_id; 197 + u8 svc_gpio_id; 197 198 }; 198 199 199 200 #define SISLANDS_INITIAL_STATE_ARB_INDEX 0
+37 -25
drivers/gpu/drm/radeon/si_smc.c
··· 219 219 if (!rdev->smc_fw) 220 220 return -EINVAL; 221 221 222 - switch (rdev->family) { 223 - case CHIP_TAHITI: 224 - ucode_start_address = TAHITI_SMC_UCODE_START; 225 - ucode_size = TAHITI_SMC_UCODE_SIZE; 226 - break; 227 - case CHIP_PITCAIRN: 228 - ucode_start_address = PITCAIRN_SMC_UCODE_START; 229 - ucode_size = PITCAIRN_SMC_UCODE_SIZE; 230 - break; 231 - case CHIP_VERDE: 232 - ucode_start_address = VERDE_SMC_UCODE_START; 233 - ucode_size = VERDE_SMC_UCODE_SIZE; 234 - break; 235 - case CHIP_OLAND: 236 - ucode_start_address = OLAND_SMC_UCODE_START; 237 - ucode_size = OLAND_SMC_UCODE_SIZE; 238 - break; 239 - case CHIP_HAINAN: 240 - ucode_start_address = HAINAN_SMC_UCODE_START; 241 - ucode_size = HAINAN_SMC_UCODE_SIZE; 242 - break; 243 - default: 244 - DRM_ERROR("unknown asic in smc ucode loader\n"); 245 - BUG(); 222 + if (rdev->new_fw) { 223 + const struct smc_firmware_header_v1_0 *hdr = 224 + (const struct smc_firmware_header_v1_0 *)rdev->smc_fw->data; 225 + 226 + radeon_ucode_print_smc_hdr(&hdr->header); 227 + 228 + ucode_start_address = le32_to_cpu(hdr->ucode_start_addr); 229 + ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes); 230 + src = (const u8 *) 231 + (rdev->smc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes)); 232 + } else { 233 + switch (rdev->family) { 234 + case CHIP_TAHITI: 235 + ucode_start_address = TAHITI_SMC_UCODE_START; 236 + ucode_size = TAHITI_SMC_UCODE_SIZE; 237 + break; 238 + case CHIP_PITCAIRN: 239 + ucode_start_address = PITCAIRN_SMC_UCODE_START; 240 + ucode_size = PITCAIRN_SMC_UCODE_SIZE; 241 + break; 242 + case CHIP_VERDE: 243 + ucode_start_address = VERDE_SMC_UCODE_START; 244 + ucode_size = VERDE_SMC_UCODE_SIZE; 245 + break; 246 + case CHIP_OLAND: 247 + ucode_start_address = OLAND_SMC_UCODE_START; 248 + ucode_size = OLAND_SMC_UCODE_SIZE; 249 + break; 250 + case CHIP_HAINAN: 251 + ucode_start_address = HAINAN_SMC_UCODE_START; 252 + ucode_size = HAINAN_SMC_UCODE_SIZE; 253 + break; 254 + default: 255 + DRM_ERROR("unknown asic in smc ucode loader\n"); 256 + BUG(); 257 + } 258 + src = (const u8 *)rdev->smc_fw->data; 246 259 } 247 260 248 261 if (ucode_size & 3) 249 262 return -EINVAL; 250 263 251 - src = (const u8 *)rdev->smc_fw->data; 252 264 spin_lock_irqsave(&rdev->smc_idx_lock, flags); 253 265 WREG32(SMC_IND_INDEX_0, ucode_start_address); 254 266 WREG32_P(SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, ~AUTO_INCREMENT_IND_0);
+3
drivers/gpu/drm/radeon/sislands_smc.h
··· 241 241 #define SI_SMC_SOFT_REGISTER_non_ulv_pcie_link_width 0xF4 242 242 #define SI_SMC_SOFT_REGISTER_tdr_is_about_to_happen 0xFC 243 243 #define SI_SMC_SOFT_REGISTER_vr_hot_gpio 0x100 244 + #define SI_SMC_SOFT_REGISTER_svi_rework_plat_type 0x118 245 + #define SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svd 0x11c 246 + #define SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svc 0x120 244 247 245 248 #define SMC_SISLANDS_LKGE_LUT_NUM_OF_TEMP_ENTRIES 16 246 249 #define SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES 32
+3 -1
include/uapi/drm/radeon_drm.h
··· 796 796 uint64_t vram_visible; 797 797 }; 798 798 799 - #define RADEON_GEM_NO_BACKING_STORE 1 799 + #define RADEON_GEM_NO_BACKING_STORE (1 << 0) 800 + #define RADEON_GEM_GTT_UC (1 << 1) 801 + #define RADEON_GEM_GTT_WC (1 << 2) 800 802 801 803 struct drm_radeon_gem_create { 802 804 uint64_t size;