diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/cik.c')
-rw-r--r-- | drivers/gpu/drm/radeon/cik.c | 176 |
1 files changed, 167 insertions, 9 deletions
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index 745143c2358f..d2fd98968085 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
@@ -38,6 +38,7 @@ MODULE_FIRMWARE("radeon/BONAIRE_me.bin"); | |||
38 | MODULE_FIRMWARE("radeon/BONAIRE_ce.bin"); | 38 | MODULE_FIRMWARE("radeon/BONAIRE_ce.bin"); |
39 | MODULE_FIRMWARE("radeon/BONAIRE_mec.bin"); | 39 | MODULE_FIRMWARE("radeon/BONAIRE_mec.bin"); |
40 | MODULE_FIRMWARE("radeon/BONAIRE_mc.bin"); | 40 | MODULE_FIRMWARE("radeon/BONAIRE_mc.bin"); |
41 | MODULE_FIRMWARE("radeon/BONAIRE_mc2.bin"); | ||
41 | MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin"); | 42 | MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin"); |
42 | MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin"); | 43 | MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin"); |
43 | MODULE_FIRMWARE("radeon/BONAIRE_smc.bin"); | 44 | MODULE_FIRMWARE("radeon/BONAIRE_smc.bin"); |
@@ -46,6 +47,7 @@ MODULE_FIRMWARE("radeon/HAWAII_me.bin"); | |||
46 | MODULE_FIRMWARE("radeon/HAWAII_ce.bin"); | 47 | MODULE_FIRMWARE("radeon/HAWAII_ce.bin"); |
47 | MODULE_FIRMWARE("radeon/HAWAII_mec.bin"); | 48 | MODULE_FIRMWARE("radeon/HAWAII_mec.bin"); |
48 | MODULE_FIRMWARE("radeon/HAWAII_mc.bin"); | 49 | MODULE_FIRMWARE("radeon/HAWAII_mc.bin"); |
50 | MODULE_FIRMWARE("radeon/HAWAII_mc2.bin"); | ||
49 | MODULE_FIRMWARE("radeon/HAWAII_rlc.bin"); | 51 | MODULE_FIRMWARE("radeon/HAWAII_rlc.bin"); |
50 | MODULE_FIRMWARE("radeon/HAWAII_sdma.bin"); | 52 | MODULE_FIRMWARE("radeon/HAWAII_sdma.bin"); |
51 | MODULE_FIRMWARE("radeon/HAWAII_smc.bin"); | 53 | MODULE_FIRMWARE("radeon/HAWAII_smc.bin"); |
@@ -61,6 +63,12 @@ MODULE_FIRMWARE("radeon/KABINI_ce.bin"); | |||
61 | MODULE_FIRMWARE("radeon/KABINI_mec.bin"); | 63 | MODULE_FIRMWARE("radeon/KABINI_mec.bin"); |
62 | MODULE_FIRMWARE("radeon/KABINI_rlc.bin"); | 64 | MODULE_FIRMWARE("radeon/KABINI_rlc.bin"); |
63 | MODULE_FIRMWARE("radeon/KABINI_sdma.bin"); | 65 | MODULE_FIRMWARE("radeon/KABINI_sdma.bin"); |
66 | MODULE_FIRMWARE("radeon/MULLINS_pfp.bin"); | ||
67 | MODULE_FIRMWARE("radeon/MULLINS_me.bin"); | ||
68 | MODULE_FIRMWARE("radeon/MULLINS_ce.bin"); | ||
69 | MODULE_FIRMWARE("radeon/MULLINS_mec.bin"); | ||
70 | MODULE_FIRMWARE("radeon/MULLINS_rlc.bin"); | ||
71 | MODULE_FIRMWARE("radeon/MULLINS_sdma.bin"); | ||
64 | 72 | ||
65 | extern int r600_ih_ring_alloc(struct radeon_device *rdev); | 73 | extern int r600_ih_ring_alloc(struct radeon_device *rdev); |
66 | extern void r600_ih_ring_fini(struct radeon_device *rdev); | 74 | extern void r600_ih_ring_fini(struct radeon_device *rdev); |
@@ -1471,6 +1479,43 @@ static const u32 hawaii_mgcg_cgcg_init[] = | |||
1471 | 0xd80c, 0xff000ff0, 0x00000100 | 1479 | 0xd80c, 0xff000ff0, 0x00000100 |
1472 | }; | 1480 | }; |
1473 | 1481 | ||
1482 | static const u32 godavari_golden_registers[] = | ||
1483 | { | ||
1484 | 0x55e4, 0xff607fff, 0xfc000100, | ||
1485 | 0x6ed8, 0x00010101, 0x00010000, | ||
1486 | 0x9830, 0xffffffff, 0x00000000, | ||
1487 | 0x98302, 0xf00fffff, 0x00000400, | ||
1488 | 0x6130, 0xffffffff, 0x00010000, | ||
1489 | 0x5bb0, 0x000000f0, 0x00000070, | ||
1490 | 0x5bc0, 0xf0311fff, 0x80300000, | ||
1491 | 0x98f8, 0x73773777, 0x12010001, | ||
1492 | 0x98fc, 0xffffffff, 0x00000010, | ||
1493 | 0x8030, 0x00001f0f, 0x0000100a, | ||
1494 | 0x2f48, 0x73773777, 0x12010001, | ||
1495 | 0x2408, 0x000fffff, 0x000c007f, | ||
1496 | 0x8a14, 0xf000003f, 0x00000007, | ||
1497 | 0x8b24, 0xffffffff, 0x00ff0fff, | ||
1498 | 0x30a04, 0x0000ff0f, 0x00000000, | ||
1499 | 0x28a4c, 0x07ffffff, 0x06000000, | ||
1500 | 0x4d8, 0x00000fff, 0x00000100, | ||
1501 | 0xd014, 0x00010000, 0x00810001, | ||
1502 | 0xd814, 0x00010000, 0x00810001, | ||
1503 | 0x3e78, 0x00000001, 0x00000002, | ||
1504 | 0xc768, 0x00000008, 0x00000008, | ||
1505 | 0xc770, 0x00000f00, 0x00000800, | ||
1506 | 0xc774, 0x00000f00, 0x00000800, | ||
1507 | 0xc798, 0x00ffffff, 0x00ff7fbf, | ||
1508 | 0xc79c, 0x00ffffff, 0x00ff7faf, | ||
1509 | 0x8c00, 0x000000ff, 0x00000001, | ||
1510 | 0x214f8, 0x01ff01ff, 0x00000002, | ||
1511 | 0x21498, 0x007ff800, 0x00200000, | ||
1512 | 0x2015c, 0xffffffff, 0x00000f40, | ||
1513 | 0x88c4, 0x001f3ae3, 0x00000082, | ||
1514 | 0x88d4, 0x0000001f, 0x00000010, | ||
1515 | 0x30934, 0xffffffff, 0x00000000 | ||
1516 | }; | ||
1517 | |||
1518 | |||
1474 | static void cik_init_golden_registers(struct radeon_device *rdev) | 1519 | static void cik_init_golden_registers(struct radeon_device *rdev) |
1475 | { | 1520 | { |
1476 | switch (rdev->family) { | 1521 | switch (rdev->family) { |
@@ -1502,6 +1547,20 @@ static void cik_init_golden_registers(struct radeon_device *rdev) | |||
1502 | kalindi_golden_spm_registers, | 1547 | kalindi_golden_spm_registers, |
1503 | (const u32)ARRAY_SIZE(kalindi_golden_spm_registers)); | 1548 | (const u32)ARRAY_SIZE(kalindi_golden_spm_registers)); |
1504 | break; | 1549 | break; |
1550 | case CHIP_MULLINS: | ||
1551 | radeon_program_register_sequence(rdev, | ||
1552 | kalindi_mgcg_cgcg_init, | ||
1553 | (const u32)ARRAY_SIZE(kalindi_mgcg_cgcg_init)); | ||
1554 | radeon_program_register_sequence(rdev, | ||
1555 | godavari_golden_registers, | ||
1556 | (const u32)ARRAY_SIZE(godavari_golden_registers)); | ||
1557 | radeon_program_register_sequence(rdev, | ||
1558 | kalindi_golden_common_registers, | ||
1559 | (const u32)ARRAY_SIZE(kalindi_golden_common_registers)); | ||
1560 | radeon_program_register_sequence(rdev, | ||
1561 | kalindi_golden_spm_registers, | ||
1562 | (const u32)ARRAY_SIZE(kalindi_golden_spm_registers)); | ||
1563 | break; | ||
1505 | case CHIP_KAVERI: | 1564 | case CHIP_KAVERI: |
1506 | radeon_program_register_sequence(rdev, | 1565 | radeon_program_register_sequence(rdev, |
1507 | spectre_mgcg_cgcg_init, | 1566 | spectre_mgcg_cgcg_init, |
@@ -1703,20 +1762,20 @@ int ci_mc_load_microcode(struct radeon_device *rdev) | |||
1703 | const __be32 *fw_data; | 1762 | const __be32 *fw_data; |
1704 | u32 running, blackout = 0; | 1763 | u32 running, blackout = 0; |
1705 | u32 *io_mc_regs; | 1764 | u32 *io_mc_regs; |
1706 | int i, ucode_size, regs_size; | 1765 | int i, regs_size, ucode_size; |
1707 | 1766 | ||
1708 | if (!rdev->mc_fw) | 1767 | if (!rdev->mc_fw) |
1709 | return -EINVAL; | 1768 | return -EINVAL; |
1710 | 1769 | ||
1770 | ucode_size = rdev->mc_fw->size / 4; | ||
1771 | |||
1711 | switch (rdev->family) { | 1772 | switch (rdev->family) { |
1712 | case CHIP_BONAIRE: | 1773 | case CHIP_BONAIRE: |
1713 | io_mc_regs = (u32 *)&bonaire_io_mc_regs; | 1774 | io_mc_regs = (u32 *)&bonaire_io_mc_regs; |
1714 | ucode_size = CIK_MC_UCODE_SIZE; | ||
1715 | regs_size = BONAIRE_IO_MC_REGS_SIZE; | 1775 | regs_size = BONAIRE_IO_MC_REGS_SIZE; |
1716 | break; | 1776 | break; |
1717 | case CHIP_HAWAII: | 1777 | case CHIP_HAWAII: |
1718 | io_mc_regs = (u32 *)&hawaii_io_mc_regs; | 1778 | io_mc_regs = (u32 *)&hawaii_io_mc_regs; |
1719 | ucode_size = HAWAII_MC_UCODE_SIZE; | ||
1720 | regs_size = HAWAII_IO_MC_REGS_SIZE; | 1779 | regs_size = HAWAII_IO_MC_REGS_SIZE; |
1721 | break; | 1780 | break; |
1722 | default: | 1781 | default: |
@@ -1783,7 +1842,7 @@ static int cik_init_microcode(struct radeon_device *rdev) | |||
1783 | const char *chip_name; | 1842 | const char *chip_name; |
1784 | size_t pfp_req_size, me_req_size, ce_req_size, | 1843 | size_t pfp_req_size, me_req_size, ce_req_size, |
1785 | mec_req_size, rlc_req_size, mc_req_size = 0, | 1844 | mec_req_size, rlc_req_size, mc_req_size = 0, |
1786 | sdma_req_size, smc_req_size = 0; | 1845 | sdma_req_size, smc_req_size = 0, mc2_req_size = 0; |
1787 | char fw_name[30]; | 1846 | char fw_name[30]; |
1788 | int err; | 1847 | int err; |
1789 | 1848 | ||
@@ -1797,7 +1856,8 @@ static int cik_init_microcode(struct radeon_device *rdev) | |||
1797 | ce_req_size = CIK_CE_UCODE_SIZE * 4; | 1856 | ce_req_size = CIK_CE_UCODE_SIZE * 4; |
1798 | mec_req_size = CIK_MEC_UCODE_SIZE * 4; | 1857 | mec_req_size = CIK_MEC_UCODE_SIZE * 4; |
1799 | rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4; | 1858 | rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4; |
1800 | mc_req_size = CIK_MC_UCODE_SIZE * 4; | 1859 | mc_req_size = BONAIRE_MC_UCODE_SIZE * 4; |
1860 | mc2_req_size = BONAIRE_MC2_UCODE_SIZE * 4; | ||
1801 | sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; | 1861 | sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; |
1802 | smc_req_size = ALIGN(BONAIRE_SMC_UCODE_SIZE, 4); | 1862 | smc_req_size = ALIGN(BONAIRE_SMC_UCODE_SIZE, 4); |
1803 | break; | 1863 | break; |
@@ -1809,6 +1869,7 @@ static int cik_init_microcode(struct radeon_device *rdev) | |||
1809 | mec_req_size = CIK_MEC_UCODE_SIZE * 4; | 1869 | mec_req_size = CIK_MEC_UCODE_SIZE * 4; |
1810 | rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4; | 1870 | rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4; |
1811 | mc_req_size = HAWAII_MC_UCODE_SIZE * 4; | 1871 | mc_req_size = HAWAII_MC_UCODE_SIZE * 4; |
1872 | mc2_req_size = HAWAII_MC2_UCODE_SIZE * 4; | ||
1812 | sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; | 1873 | sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; |
1813 | smc_req_size = ALIGN(HAWAII_SMC_UCODE_SIZE, 4); | 1874 | smc_req_size = ALIGN(HAWAII_SMC_UCODE_SIZE, 4); |
1814 | break; | 1875 | break; |
@@ -1830,6 +1891,15 @@ static int cik_init_microcode(struct radeon_device *rdev) | |||
1830 | rlc_req_size = KB_RLC_UCODE_SIZE * 4; | 1891 | rlc_req_size = KB_RLC_UCODE_SIZE * 4; |
1831 | sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; | 1892 | sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; |
1832 | break; | 1893 | break; |
1894 | case CHIP_MULLINS: | ||
1895 | chip_name = "MULLINS"; | ||
1896 | pfp_req_size = CIK_PFP_UCODE_SIZE * 4; | ||
1897 | me_req_size = CIK_ME_UCODE_SIZE * 4; | ||
1898 | ce_req_size = CIK_CE_UCODE_SIZE * 4; | ||
1899 | mec_req_size = CIK_MEC_UCODE_SIZE * 4; | ||
1900 | rlc_req_size = ML_RLC_UCODE_SIZE * 4; | ||
1901 | sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; | ||
1902 | break; | ||
1833 | default: BUG(); | 1903 | default: BUG(); |
1834 | } | 1904 | } |
1835 | 1905 | ||
@@ -1904,16 +1974,22 @@ static int cik_init_microcode(struct radeon_device *rdev) | |||
1904 | 1974 | ||
1905 | /* No SMC, MC ucode on APUs */ | 1975 | /* No SMC, MC ucode on APUs */ |
1906 | if (!(rdev->flags & RADEON_IS_IGP)) { | 1976 | if (!(rdev->flags & RADEON_IS_IGP)) { |
1907 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); | 1977 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc2.bin", chip_name); |
1908 | err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); | 1978 | err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); |
1909 | if (err) | 1979 | if (err) { |
1910 | goto out; | 1980 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); |
1911 | if (rdev->mc_fw->size != mc_req_size) { | 1981 | err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); |
1982 | if (err) | ||
1983 | goto out; | ||
1984 | } | ||
1985 | if ((rdev->mc_fw->size != mc_req_size) && | ||
1986 | (rdev->mc_fw->size != mc2_req_size)){ | ||
1912 | printk(KERN_ERR | 1987 | printk(KERN_ERR |
1913 | "cik_mc: Bogus length %zu in firmware \"%s\"\n", | 1988 | "cik_mc: Bogus length %zu in firmware \"%s\"\n", |
1914 | rdev->mc_fw->size, fw_name); | 1989 | rdev->mc_fw->size, fw_name); |
1915 | err = -EINVAL; | 1990 | err = -EINVAL; |
1916 | } | 1991 | } |
1992 | DRM_INFO("%s: %zu bytes\n", fw_name, rdev->mc_fw->size); | ||
1917 | 1993 | ||
1918 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name); | 1994 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name); |
1919 | err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); | 1995 | err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); |
@@ -3262,6 +3338,7 @@ static void cik_gpu_init(struct radeon_device *rdev) | |||
3262 | gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN; | 3338 | gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN; |
3263 | break; | 3339 | break; |
3264 | case CHIP_KABINI: | 3340 | case CHIP_KABINI: |
3341 | case CHIP_MULLINS: | ||
3265 | default: | 3342 | default: |
3266 | rdev->config.cik.max_shader_engines = 1; | 3343 | rdev->config.cik.max_shader_engines = 1; |
3267 | rdev->config.cik.max_tile_pipes = 2; | 3344 | rdev->config.cik.max_tile_pipes = 2; |
@@ -3692,6 +3769,7 @@ int cik_copy_cpdma(struct radeon_device *rdev, | |||
3692 | r = radeon_fence_emit(rdev, fence, ring->idx); | 3769 | r = radeon_fence_emit(rdev, fence, ring->idx); |
3693 | if (r) { | 3770 | if (r) { |
3694 | radeon_ring_unlock_undo(rdev, ring); | 3771 | radeon_ring_unlock_undo(rdev, ring); |
3772 | radeon_semaphore_free(rdev, &sem, NULL); | ||
3695 | return r; | 3773 | return r; |
3696 | } | 3774 | } |
3697 | 3775 | ||
@@ -5790,6 +5868,9 @@ static int cik_rlc_resume(struct radeon_device *rdev) | |||
5790 | case CHIP_KABINI: | 5868 | case CHIP_KABINI: |
5791 | size = KB_RLC_UCODE_SIZE; | 5869 | size = KB_RLC_UCODE_SIZE; |
5792 | break; | 5870 | break; |
5871 | case CHIP_MULLINS: | ||
5872 | size = ML_RLC_UCODE_SIZE; | ||
5873 | break; | ||
5793 | } | 5874 | } |
5794 | 5875 | ||
5795 | cik_rlc_stop(rdev); | 5876 | cik_rlc_stop(rdev); |
@@ -6538,6 +6619,7 @@ void cik_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer) | |||
6538 | buffer[count++] = cpu_to_le32(0x00000000); | 6619 | buffer[count++] = cpu_to_le32(0x00000000); |
6539 | break; | 6620 | break; |
6540 | case CHIP_KABINI: | 6621 | case CHIP_KABINI: |
6622 | case CHIP_MULLINS: | ||
6541 | buffer[count++] = cpu_to_le32(0x00000000); /* XXX */ | 6623 | buffer[count++] = cpu_to_le32(0x00000000); /* XXX */ |
6542 | buffer[count++] = cpu_to_le32(0x00000000); | 6624 | buffer[count++] = cpu_to_le32(0x00000000); |
6543 | break; | 6625 | break; |
@@ -6683,6 +6765,19 @@ static void cik_disable_interrupt_state(struct radeon_device *rdev) | |||
6683 | WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); | 6765 | WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); |
6684 | WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); | 6766 | WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); |
6685 | } | 6767 | } |
6768 | /* pflip */ | ||
6769 | if (rdev->num_crtc >= 2) { | ||
6770 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); | ||
6771 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); | ||
6772 | } | ||
6773 | if (rdev->num_crtc >= 4) { | ||
6774 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); | ||
6775 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); | ||
6776 | } | ||
6777 | if (rdev->num_crtc >= 6) { | ||
6778 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); | ||
6779 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); | ||
6780 | } | ||
6686 | 6781 | ||
6687 | /* dac hotplug */ | 6782 | /* dac hotplug */ |
6688 | WREG32(DAC_AUTODETECT_INT_CONTROL, 0); | 6783 | WREG32(DAC_AUTODETECT_INT_CONTROL, 0); |
@@ -7039,6 +7134,25 @@ int cik_irq_set(struct radeon_device *rdev) | |||
7039 | WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6); | 7134 | WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6); |
7040 | } | 7135 | } |
7041 | 7136 | ||
7137 | if (rdev->num_crtc >= 2) { | ||
7138 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, | ||
7139 | GRPH_PFLIP_INT_MASK); | ||
7140 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, | ||
7141 | GRPH_PFLIP_INT_MASK); | ||
7142 | } | ||
7143 | if (rdev->num_crtc >= 4) { | ||
7144 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, | ||
7145 | GRPH_PFLIP_INT_MASK); | ||
7146 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, | ||
7147 | GRPH_PFLIP_INT_MASK); | ||
7148 | } | ||
7149 | if (rdev->num_crtc >= 6) { | ||
7150 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, | ||
7151 | GRPH_PFLIP_INT_MASK); | ||
7152 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, | ||
7153 | GRPH_PFLIP_INT_MASK); | ||
7154 | } | ||
7155 | |||
7042 | WREG32(DC_HPD1_INT_CONTROL, hpd1); | 7156 | WREG32(DC_HPD1_INT_CONTROL, hpd1); |
7043 | WREG32(DC_HPD2_INT_CONTROL, hpd2); | 7157 | WREG32(DC_HPD2_INT_CONTROL, hpd2); |
7044 | WREG32(DC_HPD3_INT_CONTROL, hpd3); | 7158 | WREG32(DC_HPD3_INT_CONTROL, hpd3); |
@@ -7075,6 +7189,29 @@ static inline void cik_irq_ack(struct radeon_device *rdev) | |||
7075 | rdev->irq.stat_regs.cik.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5); | 7189 | rdev->irq.stat_regs.cik.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5); |
7076 | rdev->irq.stat_regs.cik.disp_int_cont6 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE6); | 7190 | rdev->irq.stat_regs.cik.disp_int_cont6 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE6); |
7077 | 7191 | ||
7192 | rdev->irq.stat_regs.cik.d1grph_int = RREG32(GRPH_INT_STATUS + | ||
7193 | EVERGREEN_CRTC0_REGISTER_OFFSET); | ||
7194 | rdev->irq.stat_regs.cik.d2grph_int = RREG32(GRPH_INT_STATUS + | ||
7195 | EVERGREEN_CRTC1_REGISTER_OFFSET); | ||
7196 | if (rdev->num_crtc >= 4) { | ||
7197 | rdev->irq.stat_regs.cik.d3grph_int = RREG32(GRPH_INT_STATUS + | ||
7198 | EVERGREEN_CRTC2_REGISTER_OFFSET); | ||
7199 | rdev->irq.stat_regs.cik.d4grph_int = RREG32(GRPH_INT_STATUS + | ||
7200 | EVERGREEN_CRTC3_REGISTER_OFFSET); | ||
7201 | } | ||
7202 | if (rdev->num_crtc >= 6) { | ||
7203 | rdev->irq.stat_regs.cik.d5grph_int = RREG32(GRPH_INT_STATUS + | ||
7204 | EVERGREEN_CRTC4_REGISTER_OFFSET); | ||
7205 | rdev->irq.stat_regs.cik.d6grph_int = RREG32(GRPH_INT_STATUS + | ||
7206 | EVERGREEN_CRTC5_REGISTER_OFFSET); | ||
7207 | } | ||
7208 | |||
7209 | if (rdev->irq.stat_regs.cik.d1grph_int & GRPH_PFLIP_INT_OCCURRED) | ||
7210 | WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, | ||
7211 | GRPH_PFLIP_INT_CLEAR); | ||
7212 | if (rdev->irq.stat_regs.cik.d2grph_int & GRPH_PFLIP_INT_OCCURRED) | ||
7213 | WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, | ||
7214 | GRPH_PFLIP_INT_CLEAR); | ||
7078 | if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VBLANK_INTERRUPT) | 7215 | if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VBLANK_INTERRUPT) |
7079 | WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK); | 7216 | WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK); |
7080 | if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VLINE_INTERRUPT) | 7217 | if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VLINE_INTERRUPT) |
@@ -7085,6 +7222,12 @@ static inline void cik_irq_ack(struct radeon_device *rdev) | |||
7085 | WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK); | 7222 | WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK); |
7086 | 7223 | ||
7087 | if (rdev->num_crtc >= 4) { | 7224 | if (rdev->num_crtc >= 4) { |
7225 | if (rdev->irq.stat_regs.cik.d3grph_int & GRPH_PFLIP_INT_OCCURRED) | ||
7226 | WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, | ||
7227 | GRPH_PFLIP_INT_CLEAR); | ||
7228 | if (rdev->irq.stat_regs.cik.d4grph_int & GRPH_PFLIP_INT_OCCURRED) | ||
7229 | WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, | ||
7230 | GRPH_PFLIP_INT_CLEAR); | ||
7088 | if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) | 7231 | if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) |
7089 | WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK); | 7232 | WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK); |
7090 | if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) | 7233 | if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) |
@@ -7096,6 +7239,12 @@ static inline void cik_irq_ack(struct radeon_device *rdev) | |||
7096 | } | 7239 | } |
7097 | 7240 | ||
7098 | if (rdev->num_crtc >= 6) { | 7241 | if (rdev->num_crtc >= 6) { |
7242 | if (rdev->irq.stat_regs.cik.d5grph_int & GRPH_PFLIP_INT_OCCURRED) | ||
7243 | WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, | ||
7244 | GRPH_PFLIP_INT_CLEAR); | ||
7245 | if (rdev->irq.stat_regs.cik.d6grph_int & GRPH_PFLIP_INT_OCCURRED) | ||
7246 | WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, | ||
7247 | GRPH_PFLIP_INT_CLEAR); | ||
7099 | if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) | 7248 | if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) |
7100 | WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK); | 7249 | WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK); |
7101 | if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) | 7250 | if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) |
@@ -7447,6 +7596,15 @@ restart_ih: | |||
7447 | break; | 7596 | break; |
7448 | } | 7597 | } |
7449 | break; | 7598 | break; |
7599 | case 8: /* D1 page flip */ | ||
7600 | case 10: /* D2 page flip */ | ||
7601 | case 12: /* D3 page flip */ | ||
7602 | case 14: /* D4 page flip */ | ||
7603 | case 16: /* D5 page flip */ | ||
7604 | case 18: /* D6 page flip */ | ||
7605 | DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1); | ||
7606 | radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1); | ||
7607 | break; | ||
7450 | case 42: /* HPD hotplug */ | 7608 | case 42: /* HPD hotplug */ |
7451 | switch (src_data) { | 7609 | switch (src_data) { |
7452 | case 0: | 7610 | case 0: |