Rev 5271 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5271 | Rev 6104 | ||
---|---|---|---|
Line 25... | Line 25... | ||
25 | #include |
25 | #include |
26 | #include |
26 | #include |
27 | #include |
27 | #include |
28 | #include "radeon.h" |
28 | #include "radeon.h" |
29 | #include "radeon_asic.h" |
29 | #include "radeon_asic.h" |
- | 30 | #include "radeon_audio.h" |
|
30 | #include |
31 | #include |
31 | #include "sid.h" |
32 | #include "sid.h" |
32 | #include "atom.h" |
33 | #include "atom.h" |
33 | #include "si_blit_shaders.h" |
34 | #include "si_blit_shaders.h" |
34 | #include "clearstate_si.h" |
35 | #include "clearstate_si.h" |
Line 1261... | Line 1262... | ||
1261 | default: |
1262 | default: |
1262 | break; |
1263 | break; |
1263 | } |
1264 | } |
1264 | } |
1265 | } |
Line -... | Line 1266... | ||
- | 1266 | ||
- | 1267 | /** |
|
- | 1268 | * si_get_allowed_info_register - fetch the register for the info ioctl |
|
- | 1269 | * |
|
- | 1270 | * @rdev: radeon_device pointer |
|
- | 1271 | * @reg: register offset in bytes |
|
- | 1272 | * @val: register value |
|
- | 1273 | * |
|
- | 1274 | * Returns 0 for success or -EINVAL for an invalid register |
|
- | 1275 | * |
|
- | 1276 | */ |
|
- | 1277 | int si_get_allowed_info_register(struct radeon_device *rdev, |
|
- | 1278 | u32 reg, u32 *val) |
|
- | 1279 | { |
|
- | 1280 | switch (reg) { |
|
- | 1281 | case GRBM_STATUS: |
|
- | 1282 | case GRBM_STATUS2: |
|
- | 1283 | case GRBM_STATUS_SE0: |
|
- | 1284 | case GRBM_STATUS_SE1: |
|
- | 1285 | case SRBM_STATUS: |
|
- | 1286 | case SRBM_STATUS2: |
|
- | 1287 | case (DMA_STATUS_REG + DMA0_REGISTER_OFFSET): |
|
- | 1288 | case (DMA_STATUS_REG + DMA1_REGISTER_OFFSET): |
|
- | 1289 | case UVD_STATUS: |
|
- | 1290 | *val = RREG32(reg); |
|
- | 1291 | return 0; |
|
- | 1292 | default: |
|
- | 1293 | return -EINVAL; |
|
- | 1294 | } |
|
- | 1295 | } |
|
1265 | 1296 | ||
1266 | #define PCIE_BUS_CLK 10000 |
1297 | #define PCIE_BUS_CLK 10000 |
Line 1267... | Line 1298... | ||
1267 | #define TCLK (PCIE_BUS_CLK / 10) |
1298 | #define TCLK (PCIE_BUS_CLK / 10) |
1268 | 1299 | ||
Line 1529... | Line 1560... | ||
1529 | (rdev->mc_fw->data + le32_to_cpu(hdr->io_debug_array_offset_bytes)); |
1560 | (rdev->mc_fw->data + le32_to_cpu(hdr->io_debug_array_offset_bytes)); |
1530 | ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; |
1561 | ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; |
1531 | new_fw_data = (const __le32 *) |
1562 | new_fw_data = (const __le32 *) |
1532 | (rdev->mc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes)); |
1563 | (rdev->mc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes)); |
1533 | } else { |
1564 | } else { |
1534 | ucode_size = rdev->mc_fw->size / 4; |
1565 | ucode_size = rdev->mc_fw->size / 4; |
Line 1535... | Line 1566... | ||
1535 | 1566 | ||
1536 | switch (rdev->family) { |
1567 | switch (rdev->family) { |
1537 | case CHIP_TAHITI: |
1568 | case CHIP_TAHITI: |
1538 | io_mc_regs = (u32 *)&tahiti_io_mc_regs; |
1569 | io_mc_regs = (u32 *)&tahiti_io_mc_regs; |
1539 | regs_size = TAHITI_IO_MC_REGS_SIZE; |
1570 | regs_size = TAHITI_IO_MC_REGS_SIZE; |
1540 | break; |
1571 | break; |
1541 | case CHIP_PITCAIRN: |
1572 | case CHIP_PITCAIRN: |
1542 | io_mc_regs = (u32 *)&pitcairn_io_mc_regs; |
1573 | io_mc_regs = (u32 *)&pitcairn_io_mc_regs; |
1543 | regs_size = TAHITI_IO_MC_REGS_SIZE; |
1574 | regs_size = TAHITI_IO_MC_REGS_SIZE; |
1544 | break; |
1575 | break; |
1545 | case CHIP_VERDE: |
1576 | case CHIP_VERDE: |
1546 | default: |
1577 | default: |
1547 | io_mc_regs = (u32 *)&verde_io_mc_regs; |
1578 | io_mc_regs = (u32 *)&verde_io_mc_regs; |
1548 | regs_size = TAHITI_IO_MC_REGS_SIZE; |
1579 | regs_size = TAHITI_IO_MC_REGS_SIZE; |
1549 | break; |
1580 | break; |
1550 | case CHIP_OLAND: |
1581 | case CHIP_OLAND: |
1551 | io_mc_regs = (u32 *)&oland_io_mc_regs; |
1582 | io_mc_regs = (u32 *)&oland_io_mc_regs; |
1552 | regs_size = TAHITI_IO_MC_REGS_SIZE; |
1583 | regs_size = TAHITI_IO_MC_REGS_SIZE; |
1553 | break; |
1584 | break; |
1554 | case CHIP_HAINAN: |
1585 | case CHIP_HAINAN: |
1555 | io_mc_regs = (u32 *)&hainan_io_mc_regs; |
1586 | io_mc_regs = (u32 *)&hainan_io_mc_regs; |
1556 | regs_size = TAHITI_IO_MC_REGS_SIZE; |
1587 | regs_size = TAHITI_IO_MC_REGS_SIZE; |
1557 | break; |
1588 | break; |
1558 | } |
1589 | } |
1559 | fw_data = (const __be32 *)rdev->mc_fw->data; |
1590 | fw_data = (const __be32 *)rdev->mc_fw->data; |
Line 1560... | Line 1591... | ||
1560 | } |
1591 | } |
Line 1575... | Line 1606... | ||
1575 | for (i = 0; i < regs_size; i++) { |
1606 | for (i = 0; i < regs_size; i++) { |
1576 | if (rdev->new_fw) { |
1607 | if (rdev->new_fw) { |
1577 | WREG32(MC_SEQ_IO_DEBUG_INDEX, le32_to_cpup(new_io_mc_regs++)); |
1608 | WREG32(MC_SEQ_IO_DEBUG_INDEX, le32_to_cpup(new_io_mc_regs++)); |
1578 | WREG32(MC_SEQ_IO_DEBUG_DATA, le32_to_cpup(new_io_mc_regs++)); |
1609 | WREG32(MC_SEQ_IO_DEBUG_DATA, le32_to_cpup(new_io_mc_regs++)); |
1579 | } else { |
1610 | } else { |
1580 | WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]); |
1611 | WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]); |
1581 | WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]); |
1612 | WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]); |
1582 | } |
1613 | } |
1583 | } |
1614 | } |
1584 | /* load the MC ucode */ |
1615 | /* load the MC ucode */ |
1585 | for (i = 0; i < ucode_size; i++) { |
1616 | for (i = 0; i < ucode_size; i++) { |
1586 | if (rdev->new_fw) |
1617 | if (rdev->new_fw) |
1587 | WREG32(MC_SEQ_SUP_PGM, le32_to_cpup(new_fw_data++)); |
1618 | WREG32(MC_SEQ_SUP_PGM, le32_to_cpup(new_fw_data++)); |
1588 | else |
1619 | else |
1589 | WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++)); |
1620 | WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++)); |
1590 | } |
1621 | } |
Line 1591... | Line 1622... | ||
1591 | 1622 | ||
1592 | /* put the engine back into the active state */ |
1623 | /* put the engine back into the active state */ |
1593 | WREG32(MC_SEQ_SUP_CNTL, 0x00000008); |
1624 | WREG32(MC_SEQ_SUP_CNTL, 0x00000008); |
Line 1685... | Line 1716... | ||
1685 | DRM_INFO("Loading %s Microcode\n", new_chip_name); |
1716 | DRM_INFO("Loading %s Microcode\n", new_chip_name); |
Line 1686... | Line 1717... | ||
1686 | 1717 | ||
1687 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", new_chip_name); |
1718 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", new_chip_name); |
1688 | err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev); |
1719 | err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev); |
1689 | if (err) { |
1720 | if (err) { |
1690 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name); |
1721 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name); |
1691 | err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev); |
1722 | err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev); |
1692 | if (err) |
1723 | if (err) |
1693 | goto out; |
1724 | goto out; |
1694 | if (rdev->pfp_fw->size != pfp_req_size) { |
1725 | if (rdev->pfp_fw->size != pfp_req_size) { |
1695 | printk(KERN_ERR |
1726 | printk(KERN_ERR |
1696 | "si_cp: Bogus length %zu in firmware \"%s\"\n", |
1727 | "si_cp: Bogus length %zu in firmware \"%s\"\n", |
1697 | rdev->pfp_fw->size, fw_name); |
1728 | rdev->pfp_fw->size, fw_name); |
1698 | err = -EINVAL; |
1729 | err = -EINVAL; |
1699 | goto out; |
1730 | goto out; |
1700 | } |
1731 | } |
1701 | } else { |
1732 | } else { |
1702 | err = radeon_ucode_validate(rdev->pfp_fw); |
1733 | err = radeon_ucode_validate(rdev->pfp_fw); |
1703 | if (err) { |
1734 | if (err) { |
1704 | printk(KERN_ERR |
1735 | printk(KERN_ERR |
Line 1711... | Line 1742... | ||
1711 | } |
1742 | } |
Line 1712... | Line 1743... | ||
1712 | 1743 | ||
1713 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", new_chip_name); |
1744 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", new_chip_name); |
1714 | err = request_firmware(&rdev->me_fw, fw_name, rdev->dev); |
1745 | err = request_firmware(&rdev->me_fw, fw_name, rdev->dev); |
1715 | if (err) { |
1746 | if (err) { |
1716 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name); |
1747 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name); |
1717 | err = request_firmware(&rdev->me_fw, fw_name, rdev->dev); |
1748 | err = request_firmware(&rdev->me_fw, fw_name, rdev->dev); |
1718 | if (err) |
1749 | if (err) |
1719 | goto out; |
1750 | goto out; |
1720 | if (rdev->me_fw->size != me_req_size) { |
1751 | if (rdev->me_fw->size != me_req_size) { |
1721 | printk(KERN_ERR |
1752 | printk(KERN_ERR |
1722 | "si_cp: Bogus length %zu in firmware \"%s\"\n", |
1753 | "si_cp: Bogus length %zu in firmware \"%s\"\n", |
1723 | rdev->me_fw->size, fw_name); |
1754 | rdev->me_fw->size, fw_name); |
1724 | err = -EINVAL; |
1755 | err = -EINVAL; |
1725 | } |
1756 | } |
1726 | } else { |
1757 | } else { |
1727 | err = radeon_ucode_validate(rdev->me_fw); |
1758 | err = radeon_ucode_validate(rdev->me_fw); |
1728 | if (err) { |
1759 | if (err) { |
1729 | printk(KERN_ERR |
1760 | printk(KERN_ERR |
Line 1736... | Line 1767... | ||
1736 | } |
1767 | } |
Line 1737... | Line 1768... | ||
1737 | 1768 | ||
1738 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", new_chip_name); |
1769 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", new_chip_name); |
1739 | err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev); |
1770 | err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev); |
1740 | if (err) { |
1771 | if (err) { |
1741 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name); |
1772 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name); |
1742 | err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev); |
1773 | err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev); |
1743 | if (err) |
1774 | if (err) |
1744 | goto out; |
1775 | goto out; |
1745 | if (rdev->ce_fw->size != ce_req_size) { |
1776 | if (rdev->ce_fw->size != ce_req_size) { |
1746 | printk(KERN_ERR |
1777 | printk(KERN_ERR |
1747 | "si_cp: Bogus length %zu in firmware \"%s\"\n", |
1778 | "si_cp: Bogus length %zu in firmware \"%s\"\n", |
1748 | rdev->ce_fw->size, fw_name); |
1779 | rdev->ce_fw->size, fw_name); |
1749 | err = -EINVAL; |
1780 | err = -EINVAL; |
1750 | } |
1781 | } |
1751 | } else { |
1782 | } else { |
1752 | err = radeon_ucode_validate(rdev->ce_fw); |
1783 | err = radeon_ucode_validate(rdev->ce_fw); |
1753 | if (err) { |
1784 | if (err) { |
1754 | printk(KERN_ERR |
1785 | printk(KERN_ERR |
Line 1762... | Line 1793... | ||
1762 | 1793 | ||
1763 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", new_chip_name); |
1794 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", new_chip_name); |
1764 | err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev); |
1795 | err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev); |
1765 | if (err) { |
1796 | if (err) { |
1766 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name); |
1797 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name); |
1767 | err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev); |
1798 | err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev); |
1768 | if (err) |
1799 | if (err) |
1769 | goto out; |
1800 | goto out; |
1770 | if (rdev->rlc_fw->size != rlc_req_size) { |
1801 | if (rdev->rlc_fw->size != rlc_req_size) { |
1771 | printk(KERN_ERR |
1802 | printk(KERN_ERR |
1772 | "si_rlc: Bogus length %zu in firmware \"%s\"\n", |
1803 | "si_rlc: Bogus length %zu in firmware \"%s\"\n", |
1773 | rdev->rlc_fw->size, fw_name); |
1804 | rdev->rlc_fw->size, fw_name); |
1774 | err = -EINVAL; |
1805 | err = -EINVAL; |
1775 | } |
1806 | } |
1776 | } else { |
1807 | } else { |
1777 | err = radeon_ucode_validate(rdev->rlc_fw); |
1808 | err = radeon_ucode_validate(rdev->rlc_fw); |
1778 | if (err) { |
1809 | if (err) { |
1779 | printk(KERN_ERR |
1810 | printk(KERN_ERR |
Line 1786... | Line 1817... | ||
1786 | } |
1817 | } |
Line 1787... | Line 1818... | ||
1787 | 1818 | ||
1788 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", new_chip_name); |
1819 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", new_chip_name); |
1789 | err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); |
1820 | err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); |
1790 | if (err) { |
1821 | if (err) { |
1791 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc2.bin", chip_name); |
1822 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc2.bin", chip_name); |
1792 | err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); |
1823 | err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); |
1793 | if (err) { |
1824 | if (err) { |
1794 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); |
1825 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); |
1795 | err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); |
1826 | err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); |
1796 | if (err) |
1827 | if (err) |
1797 | goto out; |
1828 | goto out; |
1798 | } |
1829 | } |
1799 | if ((rdev->mc_fw->size != mc_req_size) && |
1830 | if ((rdev->mc_fw->size != mc_req_size) && |
1800 | (rdev->mc_fw->size != mc2_req_size)) { |
1831 | (rdev->mc_fw->size != mc2_req_size)) { |
1801 | printk(KERN_ERR |
1832 | printk(KERN_ERR |
1802 | "si_mc: Bogus length %zu in firmware \"%s\"\n", |
1833 | "si_mc: Bogus length %zu in firmware \"%s\"\n", |
1803 | rdev->mc_fw->size, fw_name); |
1834 | rdev->mc_fw->size, fw_name); |
1804 | err = -EINVAL; |
1835 | err = -EINVAL; |
1805 | } |
1836 | } |
1806 | DRM_INFO("%s: %zu bytes\n", fw_name, rdev->mc_fw->size); |
1837 | DRM_INFO("%s: %zu bytes\n", fw_name, rdev->mc_fw->size); |
1807 | } else { |
1838 | } else { |
1808 | err = radeon_ucode_validate(rdev->mc_fw); |
1839 | err = radeon_ucode_validate(rdev->mc_fw); |
1809 | if (err) { |
1840 | if (err) { |
1810 | printk(KERN_ERR |
1841 | printk(KERN_ERR |
Line 1817... | Line 1848... | ||
1817 | } |
1848 | } |
Line 1818... | Line 1849... | ||
1818 | 1849 | ||
1819 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", new_chip_name); |
1850 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", new_chip_name); |
1820 | err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); |
1851 | err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); |
1821 | if (err) { |
1852 | if (err) { |
1822 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name); |
1853 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name); |
1823 | err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); |
1854 | err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); |
1824 | if (err) { |
1855 | if (err) { |
1825 | printk(KERN_ERR |
1856 | printk(KERN_ERR |
1826 | "smc: error loading firmware \"%s\"\n", |
1857 | "smc: error loading firmware \"%s\"\n", |
1827 | fw_name); |
1858 | fw_name); |
1828 | release_firmware(rdev->smc_fw); |
1859 | release_firmware(rdev->smc_fw); |
1829 | rdev->smc_fw = NULL; |
1860 | rdev->smc_fw = NULL; |
1830 | err = 0; |
1861 | err = 0; |
1831 | } else if (rdev->smc_fw->size != smc_req_size) { |
1862 | } else if (rdev->smc_fw->size != smc_req_size) { |
1832 | printk(KERN_ERR |
1863 | printk(KERN_ERR |
1833 | "si_smc: Bogus length %zu in firmware \"%s\"\n", |
1864 | "si_smc: Bogus length %zu in firmware \"%s\"\n", |
1834 | rdev->smc_fw->size, fw_name); |
1865 | rdev->smc_fw->size, fw_name); |
1835 | err = -EINVAL; |
1866 | err = -EINVAL; |
1836 | } |
1867 | } |
1837 | } else { |
1868 | } else { |
1838 | err = radeon_ucode_validate(rdev->smc_fw); |
1869 | err = radeon_ucode_validate(rdev->smc_fw); |
1839 | if (err) { |
1870 | if (err) { |
1840 | printk(KERN_ERR |
1871 | printk(KERN_ERR |
Line 2343... | Line 2374... | ||
2343 | c.full = dfixed_div(c, a); |
2374 | c.full = dfixed_div(c, a); |
2344 | a.full = dfixed_const(16); |
2375 | a.full = dfixed_const(16); |
2345 | c.full = dfixed_div(c, a); |
2376 | c.full = dfixed_div(c, a); |
2346 | priority_b_mark = dfixed_trunc(c); |
2377 | priority_b_mark = dfixed_trunc(c); |
2347 | priority_b_cnt |= priority_b_mark & PRIORITY_MARK_MASK; |
2378 | priority_b_cnt |= priority_b_mark & PRIORITY_MARK_MASK; |
- | 2379 | ||
- | 2380 | /* Save number of lines the linebuffer leads before the scanout */ |
|
- | 2381 | radeon_crtc->lb_vblank_lead_lines = DIV_ROUND_UP(lb_size, mode->crtc_hdisplay); |
|
2348 | } |
2382 | } |
Line 2349... | Line 2383... | ||
2349 | 2383 | ||
2350 | /* select wm A */ |
2384 | /* select wm A */ |
2351 | arb_control3 = RREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset); |
2385 | arb_control3 = RREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset); |
Line 3159... | Line 3193... | ||
3159 | WREG32((0x2c20 + j), 0x00000000); |
3193 | WREG32((0x2c20 + j), 0x00000000); |
3160 | WREG32((0x2c24 + j), 0x00000000); |
3194 | WREG32((0x2c24 + j), 0x00000000); |
3161 | } |
3195 | } |
Line 3162... | Line 3196... | ||
3162 | 3196 | ||
- | 3197 | WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff)); |
|
- | 3198 | WREG32(SRBM_INT_CNTL, 1); |
|
Line 3163... | Line 3199... | ||
3163 | WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff)); |
3199 | WREG32(SRBM_INT_ACK, 1); |
Line 3164... | Line 3200... | ||
3164 | 3200 | ||
Line 3216... | Line 3252... | ||
3216 | case 8: |
3252 | case 8: |
3217 | default: |
3253 | default: |
3218 | /* XXX what about 12? */ |
3254 | /* XXX what about 12? */ |
3219 | rdev->config.si.tile_config |= (3 << 0); |
3255 | rdev->config.si.tile_config |= (3 << 0); |
3220 | break; |
3256 | break; |
3221 | } |
3257 | } |
3222 | switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) { |
3258 | switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) { |
3223 | case 0: /* four banks */ |
3259 | case 0: /* four banks */ |
3224 | rdev->config.si.tile_config |= 0 << 4; |
3260 | rdev->config.si.tile_config |= 0 << 4; |
3225 | break; |
3261 | break; |
3226 | case 1: /* eight banks */ |
3262 | case 1: /* eight banks */ |
Line 3259... | Line 3295... | ||
3259 | rdev->config.si.max_cu_per_sh); |
3295 | rdev->config.si.max_cu_per_sh); |
Line 3260... | Line 3296... | ||
3260 | 3296 | ||
3261 | rdev->config.si.active_cus = 0; |
3297 | rdev->config.si.active_cus = 0; |
3262 | for (i = 0; i < rdev->config.si.max_shader_engines; i++) { |
3298 | for (i = 0; i < rdev->config.si.max_shader_engines; i++) { |
3263 | for (j = 0; j < rdev->config.si.max_sh_per_se; j++) { |
3299 | for (j = 0; j < rdev->config.si.max_sh_per_se; j++) { |
3264 | rdev->config.si.active_cus += |
3300 | rdev->config.si.active_cus += |
3265 | hweight32(si_get_cu_active_bitmap(rdev, i, j)); |
- | |
3266 | } |
3301 | hweight32(si_get_cu_active_bitmap(rdev, i, j)); |
- | 3302 | } |
|
Line 3267... | Line 3303... | ||
3267 | } |
3303 | } |
3268 | 3304 | ||
3269 | /* set HW defaults for 3D engine */ |
3305 | /* set HW defaults for 3D engine */ |
3270 | WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) | |
3306 | WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) | |
Line 3426... | Line 3462... | ||
3426 | { |
3462 | { |
3427 | if (enable) |
3463 | if (enable) |
3428 | WREG32(CP_ME_CNTL, 0); |
3464 | WREG32(CP_ME_CNTL, 0); |
3429 | else { |
3465 | else { |
3430 | if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX) |
3466 | if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX) |
3431 | radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); |
3467 | radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); |
3432 | WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT)); |
3468 | WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT)); |
3433 | WREG32(SCRATCH_UMSK, 0); |
3469 | WREG32(SCRATCH_UMSK, 0); |
3434 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false; |
3470 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false; |
3435 | rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false; |
3471 | rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false; |
3436 | rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false; |
3472 | rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false; |
Line 3488... | Line 3524... | ||
3488 | WREG32(CP_ME_RAM_DATA, le32_to_cpup(fw_data++)); |
3524 | WREG32(CP_ME_RAM_DATA, le32_to_cpup(fw_data++)); |
3489 | WREG32(CP_ME_RAM_WADDR, 0); |
3525 | WREG32(CP_ME_RAM_WADDR, 0); |
3490 | } else { |
3526 | } else { |
3491 | const __be32 *fw_data; |
3527 | const __be32 *fw_data; |
Line 3492... | Line 3528... | ||
3492 | 3528 | ||
3493 | /* PFP */ |
3529 | /* PFP */ |
3494 | fw_data = (const __be32 *)rdev->pfp_fw->data; |
3530 | fw_data = (const __be32 *)rdev->pfp_fw->data; |
3495 | WREG32(CP_PFP_UCODE_ADDR, 0); |
3531 | WREG32(CP_PFP_UCODE_ADDR, 0); |
3496 | for (i = 0; i < SI_PFP_UCODE_SIZE; i++) |
3532 | for (i = 0; i < SI_PFP_UCODE_SIZE; i++) |
3497 | WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++)); |
3533 | WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++)); |
Line 3498... | Line 3534... | ||
3498 | WREG32(CP_PFP_UCODE_ADDR, 0); |
3534 | WREG32(CP_PFP_UCODE_ADDR, 0); |
3499 | 3535 | ||
3500 | /* CE */ |
3536 | /* CE */ |
3501 | fw_data = (const __be32 *)rdev->ce_fw->data; |
3537 | fw_data = (const __be32 *)rdev->ce_fw->data; |
3502 | WREG32(CP_CE_UCODE_ADDR, 0); |
3538 | WREG32(CP_CE_UCODE_ADDR, 0); |
3503 | for (i = 0; i < SI_CE_UCODE_SIZE; i++) |
3539 | for (i = 0; i < SI_CE_UCODE_SIZE; i++) |
Line 3504... | Line 3540... | ||
3504 | WREG32(CP_CE_UCODE_DATA, be32_to_cpup(fw_data++)); |
3540 | WREG32(CP_CE_UCODE_DATA, be32_to_cpup(fw_data++)); |
3505 | WREG32(CP_CE_UCODE_ADDR, 0); |
3541 | WREG32(CP_CE_UCODE_ADDR, 0); |
3506 | 3542 | ||
3507 | /* ME */ |
3543 | /* ME */ |
3508 | fw_data = (const __be32 *)rdev->me_fw->data; |
3544 | fw_data = (const __be32 *)rdev->me_fw->data; |
3509 | WREG32(CP_ME_RAM_WADDR, 0); |
3545 | WREG32(CP_ME_RAM_WADDR, 0); |
3510 | for (i = 0; i < SI_PM4_UCODE_SIZE; i++) |
3546 | for (i = 0; i < SI_PM4_UCODE_SIZE; i++) |
Line 3511... | Line 3547... | ||
3511 | WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++)); |
3547 | WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++)); |
3512 | WREG32(CP_ME_RAM_WADDR, 0); |
3548 | WREG32(CP_ME_RAM_WADDR, 0); |
3513 | } |
3549 | } |
Line 3860... | Line 3896... | ||
3860 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); |
3896 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); |
3861 | } |
3897 | } |
Line 3862... | Line 3898... | ||
3862 | 3898 | ||
3863 | if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE | RADEON_RESET_CP)) { |
3899 | if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE | RADEON_RESET_CP)) { |
3864 | grbm_soft_reset = SOFT_RESET_CB | |
3900 | grbm_soft_reset = SOFT_RESET_CB | |
3865 | SOFT_RESET_DB | |
3901 | SOFT_RESET_DB | |
3866 | SOFT_RESET_GDS | |
3902 | SOFT_RESET_GDS | |
3867 | SOFT_RESET_PA | |
3903 | SOFT_RESET_PA | |
3868 | SOFT_RESET_SC | |
3904 | SOFT_RESET_SC | |
3869 | SOFT_RESET_BCI | |
3905 | SOFT_RESET_BCI | |
3870 | SOFT_RESET_SPI | |
3906 | SOFT_RESET_SPI | |
3871 | SOFT_RESET_SX | |
3907 | SOFT_RESET_SX | |
3872 | SOFT_RESET_TC | |
3908 | SOFT_RESET_TC | |
3873 | SOFT_RESET_TA | |
3909 | SOFT_RESET_TA | |
3874 | SOFT_RESET_VGT | |
3910 | SOFT_RESET_VGT | |
3875 | SOFT_RESET_IA; |
3911 | SOFT_RESET_IA; |
Line 3876... | Line 3912... | ||
3876 | } |
3912 | } |
3877 | 3913 | ||
Line 4083... | Line 4119... | ||
4083 | bool si_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) |
4119 | bool si_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) |
4084 | { |
4120 | { |
4085 | u32 reset_mask = si_gpu_check_soft_reset(rdev); |
4121 | u32 reset_mask = si_gpu_check_soft_reset(rdev); |
Line 4086... | Line 4122... | ||
4086 | 4122 | ||
4087 | if (!(reset_mask & (RADEON_RESET_GFX | |
4123 | if (!(reset_mask & (RADEON_RESET_GFX | |
4088 | RADEON_RESET_COMPUTE | |
4124 | RADEON_RESET_COMPUTE | |
4089 | RADEON_RESET_CP))) { |
4125 | RADEON_RESET_CP))) { |
4090 | radeon_ring_lockup_update(rdev, ring); |
4126 | radeon_ring_lockup_update(rdev, ring); |
4091 | return false; |
4127 | return false; |
4092 | } |
4128 | } |
Line 4113... | Line 4149... | ||
4113 | evergreen_mc_stop(rdev, &save); |
4149 | evergreen_mc_stop(rdev, &save); |
4114 | if (radeon_mc_wait_for_idle(rdev)) { |
4150 | if (radeon_mc_wait_for_idle(rdev)) { |
4115 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); |
4151 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); |
4116 | } |
4152 | } |
4117 | if (!ASIC_IS_NODCE(rdev)) |
4153 | if (!ASIC_IS_NODCE(rdev)) |
4118 | /* Lockout access through VGA aperture*/ |
4154 | /* Lockout access through VGA aperture*/ |
4119 | WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); |
4155 | WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); |
4120 | /* Update configuration */ |
4156 | /* Update configuration */ |
4121 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, |
4157 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, |
4122 | rdev->mc.vram_start >> 12); |
4158 | rdev->mc.vram_start >> 12); |
4123 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, |
4159 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, |
4124 | rdev->mc.vram_end >> 12); |
4160 | rdev->mc.vram_end >> 12); |
Line 4137... | Line 4173... | ||
4137 | if (radeon_mc_wait_for_idle(rdev)) { |
4173 | if (radeon_mc_wait_for_idle(rdev)) { |
4138 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); |
4174 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); |
4139 | } |
4175 | } |
4140 | evergreen_mc_resume(rdev, &save); |
4176 | evergreen_mc_resume(rdev, &save); |
4141 | if (!ASIC_IS_NODCE(rdev)) { |
4177 | if (!ASIC_IS_NODCE(rdev)) { |
4142 | /* we need to own VRAM, so turn off the VGA renderer here |
4178 | /* we need to own VRAM, so turn off the VGA renderer here |
4143 | * to stop it overwriting our objects */ |
4179 | * to stop it overwriting our objects */ |
4144 | rv515_vga_render_disable(rdev); |
4180 | rv515_vga_render_disable(rdev); |
4145 | } |
4181 | } |
4146 | } |
4182 | } |
Line 4147... | Line 4183... | ||
4147 | 4183 | ||
4148 | void si_vram_gtt_location(struct radeon_device *rdev, |
4184 | void si_vram_gtt_location(struct radeon_device *rdev, |
4149 | struct radeon_mc *mc) |
4185 | struct radeon_mc *mc) |
4150 | { |
4186 | { |
4151 | if (mc->mc_vram_size > 0xFFC0000000ULL) { |
4187 | if (mc->mc_vram_size > 0xFFC0000000ULL) { |
4152 | /* leave room for at least 1024M GTT */ |
4188 | /* leave room for at least 1024M GTT */ |
4153 | dev_warn(rdev->dev, "limiting VRAM\n"); |
4189 | dev_warn(rdev->dev, "limiting VRAM\n"); |
Line 4283... | Line 4319... | ||
4283 | WREG32(0x15DC, 0); |
4319 | WREG32(0x15DC, 0); |
Line 4284... | Line 4320... | ||
4284 | 4320 | ||
4285 | /* empty context1-15 */ |
4321 | /* empty context1-15 */ |
4286 | /* set vm size, must be a multiple of 4 */ |
4322 | /* set vm size, must be a multiple of 4 */ |
4287 | WREG32(VM_CONTEXT1_PAGE_TABLE_START_ADDR, 0); |
4323 | WREG32(VM_CONTEXT1_PAGE_TABLE_START_ADDR, 0); |
4288 | WREG32(VM_CONTEXT1_PAGE_TABLE_END_ADDR, rdev->vm_manager.max_pfn); |
4324 | WREG32(VM_CONTEXT1_PAGE_TABLE_END_ADDR, rdev->vm_manager.max_pfn - 1); |
4289 | /* Assign the pt base to something valid for now; the pts used for |
4325 | /* Assign the pt base to something valid for now; the pts used for |
4290 | * the VMs are determined by the application and setup and assigned |
4326 | * the VMs are determined by the application and setup and assigned |
4291 | * on the fly in the vm part of radeon_gart.c |
4327 | * on the fly in the vm part of radeon_gart.c |
4292 | */ |
4328 | */ |
Line 4358... | Line 4394... | ||
4358 | 4394 | ||
4359 | static void si_pcie_gart_fini(struct radeon_device *rdev) |
4395 | static void si_pcie_gart_fini(struct radeon_device *rdev) |
4360 | { |
4396 | { |
4361 | si_pcie_gart_disable(rdev); |
4397 | si_pcie_gart_disable(rdev); |
4362 | radeon_gart_table_vram_free(rdev); |
4398 | radeon_gart_table_vram_free(rdev); |
4363 | // radeon_gart_fini(rdev); |
4399 | radeon_gart_fini(rdev); |
Line 4364... | Line 4400... | ||
4364 | } |
4400 | } |
4365 | 4401 | ||
4366 | /* vm parser */ |
4402 | /* vm parser */ |
Line 4696... | Line 4732... | ||
4696 | pkt.count = RADEON_CP_PACKET_GET_COUNT(ib->ptr[idx]); |
4732 | pkt.count = RADEON_CP_PACKET_GET_COUNT(ib->ptr[idx]); |
4697 | pkt.one_reg_wr = 0; |
4733 | pkt.one_reg_wr = 0; |
4698 | switch (pkt.type) { |
4734 | switch (pkt.type) { |
4699 | case RADEON_PACKET_TYPE0: |
4735 | case RADEON_PACKET_TYPE0: |
4700 | dev_err(rdev->dev, "Packet0 not allowed!\n"); |
4736 | dev_err(rdev->dev, "Packet0 not allowed!\n"); |
4701 | for (i = 0; i < ib->length_dw; i++) { |
- | |
4702 | if (i == idx) |
- | |
4703 | printk("\t0x%08x <---\n", ib->ptr[i]); |
- | |
4704 | else |
- | |
4705 | printk("\t0x%08x\n", ib->ptr[i]); |
- | |
4706 | } |
- | |
4707 | ret = -EINVAL; |
4737 | ret = -EINVAL; |
4708 | break; |
4738 | break; |
4709 | case RADEON_PACKET_TYPE2: |
4739 | case RADEON_PACKET_TYPE2: |
4710 | idx += 1; |
4740 | idx += 1; |
4711 | break; |
4741 | break; |
Line 4733... | Line 4763... | ||
4733 | default: |
4763 | default: |
4734 | dev_err(rdev->dev, "Unknown packet type %d !\n", pkt.type); |
4764 | dev_err(rdev->dev, "Unknown packet type %d !\n", pkt.type); |
4735 | ret = -EINVAL; |
4765 | ret = -EINVAL; |
4736 | break; |
4766 | break; |
4737 | } |
4767 | } |
4738 | if (ret) |
4768 | if (ret) { |
- | 4769 | for (i = 0; i < ib->length_dw; i++) { |
|
- | 4770 | if (i == idx) |
|
- | 4771 | printk("\t0x%08x <---\n", ib->ptr[i]); |
|
- | 4772 | else |
|
- | 4773 | printk("\t0x%08x\n", ib->ptr[i]); |
|
- | 4774 | } |
|
4739 | break; |
4775 | break; |
- | 4776 | } |
|
4740 | } while (idx < ib->length_dw); |
4777 | } while (idx < ib->length_dw); |
Line 4741... | Line 4778... | ||
4741 | 4778 | ||
4742 | return ret; |
4779 | return ret; |
Line 5055... | Line 5092... | ||
5055 | WRITE_DATA_DST_SEL(0))); |
5092 | WRITE_DATA_DST_SEL(0))); |
5056 | radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); |
5093 | radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); |
5057 | radeon_ring_write(ring, 0); |
5094 | radeon_ring_write(ring, 0); |
5058 | radeon_ring_write(ring, 1 << vm_id); |
5095 | radeon_ring_write(ring, 1 << vm_id); |
Line -... | Line 5096... | ||
- | 5096 | ||
- | 5097 | /* wait for the invalidate to complete */ |
|
- | 5098 | radeon_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); |
|
- | 5099 | radeon_ring_write(ring, (WAIT_REG_MEM_FUNCTION(0) | /* always */ |
|
- | 5100 | WAIT_REG_MEM_ENGINE(0))); /* me */ |
|
- | 5101 | radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); |
|
- | 5102 | radeon_ring_write(ring, 0); |
|
- | 5103 | radeon_ring_write(ring, 0); /* ref */ |
|
- | 5104 | radeon_ring_write(ring, 0); /* mask */ |
|
- | 5105 | radeon_ring_write(ring, 0x20); /* poll interval */ |
|
5059 | 5106 | ||
5060 | /* sync PFP to ME, otherwise we might get invalid PFP reads */ |
5107 | /* sync PFP to ME, otherwise we might get invalid PFP reads */ |
5061 | radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); |
5108 | radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); |
5062 | radeon_ring_write(ring, 0x0); |
5109 | radeon_ring_write(ring, 0x0); |
Line 5553... | Line 5600... | ||
5553 | if (orig != data) |
5600 | if (orig != data) |
5554 | WREG32(HDP_MEM_POWER_LS, data); |
5601 | WREG32(HDP_MEM_POWER_LS, data); |
5555 | } |
5602 | } |
Line 5556... | Line 5603... | ||
5556 | 5603 | ||
5557 | static void si_update_cg(struct radeon_device *rdev, |
5604 | static void si_update_cg(struct radeon_device *rdev, |
5558 | u32 block, bool enable) |
5605 | u32 block, bool enable) |
5559 | { |
5606 | { |
5560 | if (block & RADEON_CG_BLOCK_GFX) { |
5607 | if (block & RADEON_CG_BLOCK_GFX) { |
5561 | si_enable_gui_idle_interrupt(rdev, false); |
5608 | si_enable_gui_idle_interrupt(rdev, false); |
5562 | /* order matters! */ |
5609 | /* order matters! */ |
Line 5603... | Line 5650... | ||
5603 | RADEON_CG_BLOCK_BIF | |
5650 | RADEON_CG_BLOCK_BIF | |
5604 | RADEON_CG_BLOCK_HDP), true); |
5651 | RADEON_CG_BLOCK_HDP), true); |
5605 | if (rdev->has_uvd) { |
5652 | if (rdev->has_uvd) { |
5606 | si_update_cg(rdev, RADEON_CG_BLOCK_UVD, true); |
5653 | si_update_cg(rdev, RADEON_CG_BLOCK_UVD, true); |
5607 | si_init_uvd_internal_cg(rdev); |
5654 | si_init_uvd_internal_cg(rdev); |
5608 | } |
5655 | } |
5609 | } |
5656 | } |
Line 5610... | Line 5657... | ||
5610 | 5657 | ||
5611 | static void si_fini_cg(struct radeon_device *rdev) |
5658 | static void si_fini_cg(struct radeon_device *rdev) |
5612 | { |
5659 | { |
Line 5625... | Line 5672... | ||
5625 | u32 count = 0; |
5672 | u32 count = 0; |
5626 | const struct cs_section_def *sect = NULL; |
5673 | const struct cs_section_def *sect = NULL; |
5627 | const struct cs_extent_def *ext = NULL; |
5674 | const struct cs_extent_def *ext = NULL; |
Line 5628... | Line 5675... | ||
5628 | 5675 | ||
5629 | if (rdev->rlc.cs_data == NULL) |
5676 | if (rdev->rlc.cs_data == NULL) |
Line 5630... | Line 5677... | ||
5630 | return 0; |
5677 | return 0; |
5631 | 5678 | ||
5632 | /* begin clear state */ |
5679 | /* begin clear state */ |
5633 | count += 2; |
5680 | count += 2; |
Line 5841... | Line 5888... | ||
5841 | WREG32(RLC_UCODE_DATA, le32_to_cpup(fw_data++)); |
5888 | WREG32(RLC_UCODE_DATA, le32_to_cpup(fw_data++)); |
5842 | } |
5889 | } |
5843 | } else { |
5890 | } else { |
5844 | const __be32 *fw_data = |
5891 | const __be32 *fw_data = |
5845 | (const __be32 *)rdev->rlc_fw->data; |
5892 | (const __be32 *)rdev->rlc_fw->data; |
5846 | for (i = 0; i < SI_RLC_UCODE_SIZE; i++) { |
5893 | for (i = 0; i < SI_RLC_UCODE_SIZE; i++) { |
5847 | WREG32(RLC_UCODE_ADDR, i); |
5894 | WREG32(RLC_UCODE_ADDR, i); |
5848 | WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++)); |
5895 | WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++)); |
5849 | } |
5896 | } |
5850 | } |
5897 | } |
5851 | WREG32(RLC_UCODE_ADDR, 0); |
5898 | WREG32(RLC_UCODE_ADDR, 0); |
Line 5852... | Line 5899... | ||
5852 | 5899 | ||
Line 5897... | Line 5944... | ||
5897 | tmp = RREG32(DMA_CNTL + DMA0_REGISTER_OFFSET) & ~TRAP_ENABLE; |
5944 | tmp = RREG32(DMA_CNTL + DMA0_REGISTER_OFFSET) & ~TRAP_ENABLE; |
5898 | WREG32(DMA_CNTL + DMA0_REGISTER_OFFSET, tmp); |
5945 | WREG32(DMA_CNTL + DMA0_REGISTER_OFFSET, tmp); |
5899 | tmp = RREG32(DMA_CNTL + DMA1_REGISTER_OFFSET) & ~TRAP_ENABLE; |
5946 | tmp = RREG32(DMA_CNTL + DMA1_REGISTER_OFFSET) & ~TRAP_ENABLE; |
5900 | WREG32(DMA_CNTL + DMA1_REGISTER_OFFSET, tmp); |
5947 | WREG32(DMA_CNTL + DMA1_REGISTER_OFFSET, tmp); |
5901 | WREG32(GRBM_INT_CNTL, 0); |
5948 | WREG32(GRBM_INT_CNTL, 0); |
- | 5949 | WREG32(SRBM_INT_CNTL, 0); |
|
5902 | if (rdev->num_crtc >= 2) { |
5950 | if (rdev->num_crtc >= 2) { |
5903 | WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); |
5951 | WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); |
5904 | WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); |
5952 | WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); |
5905 | } |
5953 | } |
5906 | if (rdev->num_crtc >= 4) { |
5954 | if (rdev->num_crtc >= 4) { |
5907 | WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); |
5955 | WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); |
5908 | WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); |
5956 | WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); |
5909 | } |
5957 | } |
Line 5911... | Line 5959... | ||
5911 | WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); |
5959 | WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); |
5912 | WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); |
5960 | WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); |
5913 | } |
5961 | } |
Line 5914... | Line 5962... | ||
5914 | 5962 | ||
5915 | if (rdev->num_crtc >= 2) { |
5963 | if (rdev->num_crtc >= 2) { |
5916 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); |
5964 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); |
5917 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); |
5965 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); |
5918 | } |
5966 | } |
5919 | if (rdev->num_crtc >= 4) { |
5967 | if (rdev->num_crtc >= 4) { |
5920 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); |
5968 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); |
5921 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); |
5969 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); |
Line 5926... | Line 5974... | ||
5926 | } |
5974 | } |
Line 5927... | Line 5975... | ||
5927 | 5975 | ||
5928 | if (!ASIC_IS_NODCE(rdev)) { |
5976 | if (!ASIC_IS_NODCE(rdev)) { |
Line 5929... | Line 5977... | ||
5929 | WREG32(DAC_AUTODETECT_INT_CONTROL, 0); |
5977 | WREG32(DAC_AUTODETECT_INT_CONTROL, 0); |
5930 | 5978 | ||
5931 | tmp = RREG32(DC_HPD1_INT_CONTROL) & DC_HPDx_INT_POLARITY; |
5979 | tmp = RREG32(DC_HPD1_INT_CONTROL) & DC_HPDx_INT_POLARITY; |
5932 | WREG32(DC_HPD1_INT_CONTROL, tmp); |
5980 | WREG32(DC_HPD1_INT_CONTROL, tmp); |
5933 | tmp = RREG32(DC_HPD2_INT_CONTROL) & DC_HPDx_INT_POLARITY; |
5981 | tmp = RREG32(DC_HPD2_INT_CONTROL) & DC_HPDx_INT_POLARITY; |
5934 | WREG32(DC_HPD2_INT_CONTROL, tmp); |
5982 | WREG32(DC_HPD2_INT_CONTROL, tmp); |
5935 | tmp = RREG32(DC_HPD3_INT_CONTROL) & DC_HPDx_INT_POLARITY; |
5983 | tmp = RREG32(DC_HPD3_INT_CONTROL) & DC_HPDx_INT_POLARITY; |
5936 | WREG32(DC_HPD3_INT_CONTROL, tmp); |
5984 | WREG32(DC_HPD3_INT_CONTROL, tmp); |
5937 | tmp = RREG32(DC_HPD4_INT_CONTROL) & DC_HPDx_INT_POLARITY; |
5985 | tmp = RREG32(DC_HPD4_INT_CONTROL) & DC_HPDx_INT_POLARITY; |
5938 | WREG32(DC_HPD4_INT_CONTROL, tmp); |
5986 | WREG32(DC_HPD4_INT_CONTROL, tmp); |
5939 | tmp = RREG32(DC_HPD5_INT_CONTROL) & DC_HPDx_INT_POLARITY; |
5987 | tmp = RREG32(DC_HPD5_INT_CONTROL) & DC_HPDx_INT_POLARITY; |
5940 | WREG32(DC_HPD5_INT_CONTROL, tmp); |
5988 | WREG32(DC_HPD5_INT_CONTROL, tmp); |
5941 | tmp = RREG32(DC_HPD6_INT_CONTROL) & DC_HPDx_INT_POLARITY; |
5989 | tmp = RREG32(DC_HPD6_INT_CONTROL) & DC_HPDx_INT_POLARITY; |
5942 | WREG32(DC_HPD6_INT_CONTROL, tmp); |
5990 | WREG32(DC_HPD6_INT_CONTROL, tmp); |
Line 5943... | Line 5991... | ||
5943 | } |
5991 | } |
5944 | } |
5992 | } |
Line 6038... | Line 6086... | ||
6038 | 6086 | ||
6039 | cp_int_cntl = RREG32(CP_INT_CNTL_RING0) & |
6087 | cp_int_cntl = RREG32(CP_INT_CNTL_RING0) & |
Line 6040... | Line 6088... | ||
6040 | (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE); |
6088 | (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE); |
6041 | 6089 | ||
6042 | if (!ASIC_IS_NODCE(rdev)) { |
6090 | if (!ASIC_IS_NODCE(rdev)) { |
6043 | hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN; |
6091 | hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN); |
6044 | hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN; |
6092 | hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN); |
6045 | hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN; |
6093 | hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN); |
6046 | hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~DC_HPDx_INT_EN; |
6094 | hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN); |
6047 | hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN; |
6095 | hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN); |
Line 6048... | Line 6096... | ||
6048 | hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN; |
6096 | hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN); |
6049 | } |
6097 | } |
Line 6106... | Line 6154... | ||
6106 | DRM_DEBUG("si_irq_set: vblank 5\n"); |
6154 | DRM_DEBUG("si_irq_set: vblank 5\n"); |
6107 | crtc6 |= VBLANK_INT_MASK; |
6155 | crtc6 |= VBLANK_INT_MASK; |
6108 | } |
6156 | } |
6109 | if (rdev->irq.hpd[0]) { |
6157 | if (rdev->irq.hpd[0]) { |
6110 | DRM_DEBUG("si_irq_set: hpd 1\n"); |
6158 | DRM_DEBUG("si_irq_set: hpd 1\n"); |
6111 | hpd1 |= DC_HPDx_INT_EN; |
6159 | hpd1 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN; |
6112 | } |
6160 | } |
6113 | if (rdev->irq.hpd[1]) { |
6161 | if (rdev->irq.hpd[1]) { |
6114 | DRM_DEBUG("si_irq_set: hpd 2\n"); |
6162 | DRM_DEBUG("si_irq_set: hpd 2\n"); |
6115 | hpd2 |= DC_HPDx_INT_EN; |
6163 | hpd2 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN; |
6116 | } |
6164 | } |
6117 | if (rdev->irq.hpd[2]) { |
6165 | if (rdev->irq.hpd[2]) { |
6118 | DRM_DEBUG("si_irq_set: hpd 3\n"); |
6166 | DRM_DEBUG("si_irq_set: hpd 3\n"); |
6119 | hpd3 |= DC_HPDx_INT_EN; |
6167 | hpd3 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN; |
6120 | } |
6168 | } |
6121 | if (rdev->irq.hpd[3]) { |
6169 | if (rdev->irq.hpd[3]) { |
6122 | DRM_DEBUG("si_irq_set: hpd 4\n"); |
6170 | DRM_DEBUG("si_irq_set: hpd 4\n"); |
6123 | hpd4 |= DC_HPDx_INT_EN; |
6171 | hpd4 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN; |
6124 | } |
6172 | } |
6125 | if (rdev->irq.hpd[4]) { |
6173 | if (rdev->irq.hpd[4]) { |
6126 | DRM_DEBUG("si_irq_set: hpd 5\n"); |
6174 | DRM_DEBUG("si_irq_set: hpd 5\n"); |
6127 | hpd5 |= DC_HPDx_INT_EN; |
6175 | hpd5 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN; |
6128 | } |
6176 | } |
6129 | if (rdev->irq.hpd[5]) { |
6177 | if (rdev->irq.hpd[5]) { |
6130 | DRM_DEBUG("si_irq_set: hpd 6\n"); |
6178 | DRM_DEBUG("si_irq_set: hpd 6\n"); |
6131 | hpd6 |= DC_HPDx_INT_EN; |
6179 | hpd6 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN; |
6132 | } |
6180 | } |
Line 6133... | Line 6181... | ||
6133 | 6181 | ||
6134 | WREG32(CP_INT_CNTL_RING0, cp_int_cntl); |
6182 | WREG32(CP_INT_CNTL_RING0, cp_int_cntl); |
6135 | WREG32(CP_INT_CNTL_RING1, cp_int_cntl1); |
6183 | WREG32(CP_INT_CNTL_RING1, cp_int_cntl1); |
Line 6144... | Line 6192... | ||
6144 | DRM_DEBUG("dpm thermal\n"); |
6192 | DRM_DEBUG("dpm thermal\n"); |
6145 | thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW; |
6193 | thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW; |
6146 | } |
6194 | } |
Line 6147... | Line 6195... | ||
6147 | 6195 | ||
6148 | if (rdev->num_crtc >= 2) { |
6196 | if (rdev->num_crtc >= 2) { |
6149 | WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1); |
6197 | WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1); |
6150 | WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, crtc2); |
6198 | WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, crtc2); |
6151 | } |
6199 | } |
6152 | if (rdev->num_crtc >= 4) { |
6200 | if (rdev->num_crtc >= 4) { |
6153 | WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, crtc3); |
6201 | WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, crtc3); |
6154 | WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, crtc4); |
6202 | WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, crtc4); |
Line 6176... | Line 6224... | ||
6176 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, |
6224 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, |
6177 | GRPH_PFLIP_INT_MASK); |
6225 | GRPH_PFLIP_INT_MASK); |
6178 | } |
6226 | } |
Line 6179... | Line 6227... | ||
6179 | 6227 | ||
6180 | if (!ASIC_IS_NODCE(rdev)) { |
6228 | if (!ASIC_IS_NODCE(rdev)) { |
6181 | WREG32(DC_HPD1_INT_CONTROL, hpd1); |
6229 | WREG32(DC_HPD1_INT_CONTROL, hpd1); |
6182 | WREG32(DC_HPD2_INT_CONTROL, hpd2); |
6230 | WREG32(DC_HPD2_INT_CONTROL, hpd2); |
6183 | WREG32(DC_HPD3_INT_CONTROL, hpd3); |
6231 | WREG32(DC_HPD3_INT_CONTROL, hpd3); |
6184 | WREG32(DC_HPD4_INT_CONTROL, hpd4); |
6232 | WREG32(DC_HPD4_INT_CONTROL, hpd4); |
6185 | WREG32(DC_HPD5_INT_CONTROL, hpd5); |
6233 | WREG32(DC_HPD5_INT_CONTROL, hpd5); |
6186 | WREG32(DC_HPD6_INT_CONTROL, hpd6); |
6234 | WREG32(DC_HPD6_INT_CONTROL, hpd6); |
Line 6187... | Line 6235... | ||
6187 | } |
6235 | } |
Line -... | Line 6236... | ||
- | 6236 | ||
- | 6237 | WREG32(CG_THERMAL_INT, thermal_int); |
|
- | 6238 | ||
6188 | 6239 | /* posting read */ |
|
6189 | WREG32(CG_THERMAL_INT, thermal_int); |
6240 | RREG32(SRBM_STATUS); |
Line 6190... | Line 6241... | ||
6190 | 6241 | ||
6191 | return 0; |
6242 | return 0; |
Line 6286... | Line 6337... | ||
6286 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) { |
6337 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) { |
6287 | tmp = RREG32(DC_HPD5_INT_CONTROL); |
6338 | tmp = RREG32(DC_HPD5_INT_CONTROL); |
6288 | tmp |= DC_HPDx_INT_ACK; |
6339 | tmp |= DC_HPDx_INT_ACK; |
6289 | WREG32(DC_HPD6_INT_CONTROL, tmp); |
6340 | WREG32(DC_HPD6_INT_CONTROL, tmp); |
6290 | } |
6341 | } |
- | 6342 | ||
- | 6343 | if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_RX_INTERRUPT) { |
|
- | 6344 | tmp = RREG32(DC_HPD1_INT_CONTROL); |
|
- | 6345 | tmp |= DC_HPDx_RX_INT_ACK; |
|
- | 6346 | WREG32(DC_HPD1_INT_CONTROL, tmp); |
|
- | 6347 | } |
|
- | 6348 | if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_RX_INTERRUPT) { |
|
- | 6349 | tmp = RREG32(DC_HPD2_INT_CONTROL); |
|
- | 6350 | tmp |= DC_HPDx_RX_INT_ACK; |
|
- | 6351 | WREG32(DC_HPD2_INT_CONTROL, tmp); |
|
- | 6352 | } |
|
- | 6353 | if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_RX_INTERRUPT) { |
|
- | 6354 | tmp = RREG32(DC_HPD3_INT_CONTROL); |
|
- | 6355 | tmp |= DC_HPDx_RX_INT_ACK; |
|
- | 6356 | WREG32(DC_HPD3_INT_CONTROL, tmp); |
|
- | 6357 | } |
|
- | 6358 | if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_RX_INTERRUPT) { |
|
- | 6359 | tmp = RREG32(DC_HPD4_INT_CONTROL); |
|
- | 6360 | tmp |= DC_HPDx_RX_INT_ACK; |
|
- | 6361 | WREG32(DC_HPD4_INT_CONTROL, tmp); |
|
- | 6362 | } |
|
- | 6363 | if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_RX_INTERRUPT) { |
|
- | 6364 | tmp = RREG32(DC_HPD5_INT_CONTROL); |
|
- | 6365 | tmp |= DC_HPDx_RX_INT_ACK; |
|
- | 6366 | WREG32(DC_HPD5_INT_CONTROL, tmp); |
|
- | 6367 | } |
|
- | 6368 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT) { |
|
- | 6369 | tmp = RREG32(DC_HPD5_INT_CONTROL); |
|
- | 6370 | tmp |= DC_HPDx_RX_INT_ACK; |
|
- | 6371 | WREG32(DC_HPD6_INT_CONTROL, tmp); |
|
- | 6372 | } |
|
6291 | } |
6373 | } |
Line 6292... | Line 6374... | ||
6292 | 6374 | ||
6293 | static void si_irq_disable(struct radeon_device *rdev) |
6375 | static void si_irq_disable(struct radeon_device *rdev) |
6294 | { |
6376 | { |
Line 6351... | Line 6433... | ||
6351 | u32 wptr; |
6433 | u32 wptr; |
6352 | u32 rptr; |
6434 | u32 rptr; |
6353 | u32 src_id, src_data, ring_id; |
6435 | u32 src_id, src_data, ring_id; |
6354 | u32 ring_index; |
6436 | u32 ring_index; |
6355 | bool queue_hotplug = false; |
6437 | bool queue_hotplug = false; |
- | 6438 | bool queue_dp = false; |
|
6356 | bool queue_thermal = false; |
6439 | bool queue_thermal = false; |
6357 | u32 status, addr; |
6440 | u32 status, addr; |
Line 6358... | Line 6441... | ||
6358 | 6441 | ||
6359 | if (!rdev->ih.enabled || rdev->shutdown) |
6442 | if (!rdev->ih.enabled || rdev->shutdown) |
Line 6384... | Line 6467... | ||
6384 | 6467 | ||
6385 | switch (src_id) { |
6468 | switch (src_id) { |
6386 | case 1: /* D1 vblank/vline */ |
6469 | case 1: /* D1 vblank/vline */ |
6387 | switch (src_data) { |
6470 | switch (src_data) { |
6388 | case 0: /* D1 vblank */ |
6471 | case 0: /* D1 vblank */ |
- | 6472 | if (!(rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT)) |
|
- | 6473 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
6389 | if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT) { |
6474 | |
6390 | if (rdev->irq.crtc_vblank_int[0]) { |
6475 | if (rdev->irq.crtc_vblank_int[0]) { |
6391 | // drm_handle_vblank(rdev->ddev, 0); |
6476 | drm_handle_vblank(rdev->ddev, 0); |
6392 | rdev->pm.vblank_sync = true; |
6477 | rdev->pm.vblank_sync = true; |
6393 | // wake_up(&rdev->irq.vblank_queue); |
- | |
6394 | } |
- | |
6395 | // if (atomic_read(&rdev->irq.pflip[0])) |
- | |
6396 | // radeon_crtc_handle_flip(rdev, 0); |
- | |
6397 | rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VBLANK_INTERRUPT; |
- | |
6398 | DRM_DEBUG("IH: D1 vblank\n"); |
6478 | wake_up(&rdev->irq.vblank_queue); |
- | 6479 | } |
|
- | 6480 | if (atomic_read(&rdev->irq.pflip[0])) |
|
- | 6481 | radeon_crtc_handle_vblank(rdev, 0); |
|
- | 6482 | rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VBLANK_INTERRUPT; |
|
- | 6483 | DRM_DEBUG("IH: D1 vblank\n"); |
|
6399 | } |
6484 | |
6400 | break; |
6485 | break; |
6401 | case 1: /* D1 vline */ |
6486 | case 1: /* D1 vline */ |
- | 6487 | if (!(rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT)) |
|
- | 6488 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
6402 | if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT) { |
6489 | |
6403 | rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VLINE_INTERRUPT; |
6490 | rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VLINE_INTERRUPT; |
6404 | DRM_DEBUG("IH: D1 vline\n"); |
6491 | DRM_DEBUG("IH: D1 vline\n"); |
6405 | } |
6492 | |
6406 | break; |
6493 | break; |
6407 | default: |
6494 | default: |
6408 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
6495 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
6409 | break; |
6496 | break; |
6410 | } |
6497 | } |
6411 | break; |
6498 | break; |
6412 | case 2: /* D2 vblank/vline */ |
6499 | case 2: /* D2 vblank/vline */ |
6413 | switch (src_data) { |
6500 | switch (src_data) { |
6414 | case 0: /* D2 vblank */ |
6501 | case 0: /* D2 vblank */ |
- | 6502 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT)) |
|
- | 6503 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
6415 | if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT) { |
6504 | |
6416 | if (rdev->irq.crtc_vblank_int[1]) { |
6505 | if (rdev->irq.crtc_vblank_int[1]) { |
6417 | // drm_handle_vblank(rdev->ddev, 1); |
6506 | drm_handle_vblank(rdev->ddev, 1); |
6418 | rdev->pm.vblank_sync = true; |
6507 | rdev->pm.vblank_sync = true; |
6419 | // wake_up(&rdev->irq.vblank_queue); |
- | |
6420 | } |
- | |
6421 | // if (atomic_read(&rdev->irq.pflip[1])) |
- | |
6422 | // radeon_crtc_handle_flip(rdev, 1); |
- | |
6423 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT; |
- | |
6424 | DRM_DEBUG("IH: D2 vblank\n"); |
6508 | wake_up(&rdev->irq.vblank_queue); |
- | 6509 | } |
|
- | 6510 | if (atomic_read(&rdev->irq.pflip[1])) |
|
- | 6511 | radeon_crtc_handle_vblank(rdev, 1); |
|
- | 6512 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT; |
|
- | 6513 | DRM_DEBUG("IH: D2 vblank\n"); |
|
6425 | } |
6514 | |
6426 | break; |
6515 | break; |
6427 | case 1: /* D2 vline */ |
6516 | case 1: /* D2 vline */ |
- | 6517 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT)) |
|
- | 6518 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
6428 | if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT) { |
6519 | |
6429 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT; |
6520 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT; |
6430 | DRM_DEBUG("IH: D2 vline\n"); |
6521 | DRM_DEBUG("IH: D2 vline\n"); |
6431 | } |
6522 | |
6432 | break; |
6523 | break; |
6433 | default: |
6524 | default: |
6434 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
6525 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
6435 | break; |
6526 | break; |
6436 | } |
6527 | } |
6437 | break; |
6528 | break; |
6438 | case 3: /* D3 vblank/vline */ |
6529 | case 3: /* D3 vblank/vline */ |
6439 | switch (src_data) { |
6530 | switch (src_data) { |
6440 | case 0: /* D3 vblank */ |
6531 | case 0: /* D3 vblank */ |
- | 6532 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT)) |
|
- | 6533 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
6441 | if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) { |
6534 | |
6442 | if (rdev->irq.crtc_vblank_int[2]) { |
6535 | if (rdev->irq.crtc_vblank_int[2]) { |
6443 | // drm_handle_vblank(rdev->ddev, 2); |
6536 | drm_handle_vblank(rdev->ddev, 2); |
6444 | rdev->pm.vblank_sync = true; |
6537 | rdev->pm.vblank_sync = true; |
6445 | // wake_up(&rdev->irq.vblank_queue); |
- | |
6446 | } |
- | |
6447 | // if (atomic_read(&rdev->irq.pflip[2])) |
- | |
6448 | // radeon_crtc_handle_flip(rdev, 2); |
- | |
6449 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT; |
- | |
6450 | DRM_DEBUG("IH: D3 vblank\n"); |
6538 | wake_up(&rdev->irq.vblank_queue); |
- | 6539 | } |
|
- | 6540 | if (atomic_read(&rdev->irq.pflip[2])) |
|
- | 6541 | radeon_crtc_handle_vblank(rdev, 2); |
|
- | 6542 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT; |
|
- | 6543 | DRM_DEBUG("IH: D3 vblank\n"); |
|
6451 | } |
6544 | |
6452 | break; |
6545 | break; |
6453 | case 1: /* D3 vline */ |
6546 | case 1: /* D3 vline */ |
- | 6547 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT)) |
|
- | 6548 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
6454 | if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) { |
6549 | |
6455 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT; |
6550 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT; |
6456 | DRM_DEBUG("IH: D3 vline\n"); |
6551 | DRM_DEBUG("IH: D3 vline\n"); |
6457 | } |
6552 | |
6458 | break; |
6553 | break; |
6459 | default: |
6554 | default: |
6460 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
6555 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
6461 | break; |
6556 | break; |
6462 | } |
6557 | } |
6463 | break; |
6558 | break; |
6464 | case 4: /* D4 vblank/vline */ |
6559 | case 4: /* D4 vblank/vline */ |
6465 | switch (src_data) { |
6560 | switch (src_data) { |
6466 | case 0: /* D4 vblank */ |
6561 | case 0: /* D4 vblank */ |
- | 6562 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT)) |
|
- | 6563 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
6467 | if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) { |
6564 | |
6468 | if (rdev->irq.crtc_vblank_int[3]) { |
6565 | if (rdev->irq.crtc_vblank_int[3]) { |
6469 | // drm_handle_vblank(rdev->ddev, 3); |
6566 | drm_handle_vblank(rdev->ddev, 3); |
6470 | rdev->pm.vblank_sync = true; |
6567 | rdev->pm.vblank_sync = true; |
6471 | // wake_up(&rdev->irq.vblank_queue); |
- | |
6472 | } |
- | |
6473 | // if (atomic_read(&rdev->irq.pflip[3])) |
- | |
6474 | // radeon_crtc_handle_flip(rdev, 3); |
- | |
6475 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT; |
- | |
6476 | DRM_DEBUG("IH: D4 vblank\n"); |
6568 | wake_up(&rdev->irq.vblank_queue); |
- | 6569 | } |
|
- | 6570 | if (atomic_read(&rdev->irq.pflip[3])) |
|
- | 6571 | radeon_crtc_handle_vblank(rdev, 3); |
|
- | 6572 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT; |
|
- | 6573 | DRM_DEBUG("IH: D4 vblank\n"); |
|
6477 | } |
6574 | |
6478 | break; |
6575 | break; |
6479 | case 1: /* D4 vline */ |
6576 | case 1: /* D4 vline */ |
- | 6577 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT)) |
|
- | 6578 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
6480 | if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT) { |
6579 | |
6481 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT; |
6580 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT; |
6482 | DRM_DEBUG("IH: D4 vline\n"); |
6581 | DRM_DEBUG("IH: D4 vline\n"); |
6483 | } |
6582 | |
6484 | break; |
6583 | break; |
6485 | default: |
6584 | default: |
6486 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
6585 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
6487 | break; |
6586 | break; |
6488 | } |
6587 | } |
6489 | break; |
6588 | break; |
6490 | case 5: /* D5 vblank/vline */ |
6589 | case 5: /* D5 vblank/vline */ |
6491 | switch (src_data) { |
6590 | switch (src_data) { |
6492 | case 0: /* D5 vblank */ |
6591 | case 0: /* D5 vblank */ |
- | 6592 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT)) |
|
- | 6593 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
6493 | if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) { |
6594 | |
6494 | if (rdev->irq.crtc_vblank_int[4]) { |
6595 | if (rdev->irq.crtc_vblank_int[4]) { |
6495 | // drm_handle_vblank(rdev->ddev, 4); |
6596 | drm_handle_vblank(rdev->ddev, 4); |
6496 | rdev->pm.vblank_sync = true; |
6597 | rdev->pm.vblank_sync = true; |
6497 | // wake_up(&rdev->irq.vblank_queue); |
- | |
6498 | } |
- | |
6499 | // if (atomic_read(&rdev->irq.pflip[4])) |
- | |
6500 | // radeon_crtc_handle_flip(rdev, 4); |
- | |
6501 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT; |
- | |
6502 | DRM_DEBUG("IH: D5 vblank\n"); |
6598 | wake_up(&rdev->irq.vblank_queue); |
- | 6599 | } |
|
- | 6600 | if (atomic_read(&rdev->irq.pflip[4])) |
|
- | 6601 | radeon_crtc_handle_vblank(rdev, 4); |
|
- | 6602 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT; |
|
- | 6603 | DRM_DEBUG("IH: D5 vblank\n"); |
|
6503 | } |
6604 | |
6504 | break; |
6605 | break; |
6505 | case 1: /* D5 vline */ |
6606 | case 1: /* D5 vline */ |
- | 6607 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT)) |
|
- | 6608 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
6506 | if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) { |
6609 | |
6507 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT; |
6610 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT; |
6508 | DRM_DEBUG("IH: D5 vline\n"); |
6611 | DRM_DEBUG("IH: D5 vline\n"); |
6509 | } |
6612 | |
6510 | break; |
6613 | break; |
6511 | default: |
6614 | default: |
6512 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
6615 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
6513 | break; |
6616 | break; |
6514 | } |
6617 | } |
6515 | break; |
6618 | break; |
6516 | case 6: /* D6 vblank/vline */ |
6619 | case 6: /* D6 vblank/vline */ |
6517 | switch (src_data) { |
6620 | switch (src_data) { |
6518 | case 0: /* D6 vblank */ |
6621 | case 0: /* D6 vblank */ |
- | 6622 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT)) |
|
- | 6623 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
6519 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) { |
6624 | |
6520 | if (rdev->irq.crtc_vblank_int[5]) { |
6625 | if (rdev->irq.crtc_vblank_int[5]) { |
6521 | // drm_handle_vblank(rdev->ddev, 5); |
6626 | drm_handle_vblank(rdev->ddev, 5); |
6522 | rdev->pm.vblank_sync = true; |
6627 | rdev->pm.vblank_sync = true; |
6523 | // wake_up(&rdev->irq.vblank_queue); |
- | |
6524 | } |
- | |
6525 | // if (atomic_read(&rdev->irq.pflip[5])) |
- | |
6526 | // radeon_crtc_handle_flip(rdev, 5); |
- | |
6527 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT; |
- | |
6528 | DRM_DEBUG("IH: D6 vblank\n"); |
6628 | wake_up(&rdev->irq.vblank_queue); |
- | 6629 | } |
|
- | 6630 | if (atomic_read(&rdev->irq.pflip[5])) |
|
- | 6631 | radeon_crtc_handle_vblank(rdev, 5); |
|
- | 6632 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT; |
|
- | 6633 | DRM_DEBUG("IH: D6 vblank\n"); |
|
6529 | } |
6634 | |
6530 | break; |
6635 | break; |
6531 | case 1: /* D6 vline */ |
6636 | case 1: /* D6 vline */ |
- | 6637 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT)) |
|
- | 6638 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
6532 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT) { |
6639 | |
6533 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT; |
6640 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT; |
6534 | DRM_DEBUG("IH: D6 vline\n"); |
6641 | DRM_DEBUG("IH: D6 vline\n"); |
6535 | } |
6642 | |
6536 | break; |
6643 | break; |
6537 | default: |
6644 | default: |
6538 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
6645 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
6539 | break; |
6646 | break; |
Line 6548... | Line 6655... | ||
6548 | DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1); |
6655 | DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1); |
6549 | break; |
6656 | break; |
6550 | case 42: /* HPD hotplug */ |
6657 | case 42: /* HPD hotplug */ |
6551 | switch (src_data) { |
6658 | switch (src_data) { |
6552 | case 0: |
6659 | case 0: |
6553 | if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) { |
6660 | if (!(rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT)) |
- | 6661 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
- | 6662 | ||
6554 | rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_INTERRUPT; |
6663 | rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_INTERRUPT; |
6555 | queue_hotplug = true; |
6664 | queue_hotplug = true; |
6556 | DRM_DEBUG("IH: HPD1\n"); |
6665 | DRM_DEBUG("IH: HPD1\n"); |
6557 | } |
6666 | |
6558 | break; |
6667 | break; |
6559 | case 1: |
6668 | case 1: |
6560 | if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT) { |
6669 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT)) |
- | 6670 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
- | 6671 | ||
6561 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_INTERRUPT; |
6672 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_INTERRUPT; |
6562 | queue_hotplug = true; |
6673 | queue_hotplug = true; |
6563 | DRM_DEBUG("IH: HPD2\n"); |
6674 | DRM_DEBUG("IH: HPD2\n"); |
6564 | } |
6675 | |
6565 | break; |
6676 | break; |
6566 | case 2: |
6677 | case 2: |
6567 | if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT) { |
6678 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT)) |
- | 6679 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
- | 6680 | ||
6568 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_INTERRUPT; |
6681 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_INTERRUPT; |
6569 | queue_hotplug = true; |
6682 | queue_hotplug = true; |
6570 | DRM_DEBUG("IH: HPD3\n"); |
6683 | DRM_DEBUG("IH: HPD3\n"); |
6571 | } |
6684 | |
6572 | break; |
6685 | break; |
6573 | case 3: |
6686 | case 3: |
6574 | if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT) { |
6687 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT)) |
- | 6688 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
- | 6689 | ||
6575 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_INTERRUPT; |
6690 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_INTERRUPT; |
6576 | queue_hotplug = true; |
6691 | queue_hotplug = true; |
6577 | DRM_DEBUG("IH: HPD4\n"); |
6692 | DRM_DEBUG("IH: HPD4\n"); |
6578 | } |
6693 | |
6579 | break; |
6694 | break; |
6580 | case 4: |
6695 | case 4: |
6581 | if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT) { |
6696 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT)) |
- | 6697 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
- | 6698 | ||
6582 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_INTERRUPT; |
6699 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_INTERRUPT; |
6583 | queue_hotplug = true; |
6700 | queue_hotplug = true; |
6584 | DRM_DEBUG("IH: HPD5\n"); |
6701 | DRM_DEBUG("IH: HPD5\n"); |
6585 | } |
6702 | |
6586 | break; |
6703 | break; |
6587 | case 5: |
6704 | case 5: |
6588 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) { |
6705 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT)) |
- | 6706 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
- | 6707 | ||
6589 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_INTERRUPT; |
6708 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_INTERRUPT; |
6590 | queue_hotplug = true; |
6709 | queue_hotplug = true; |
6591 | DRM_DEBUG("IH: HPD6\n"); |
6710 | DRM_DEBUG("IH: HPD6\n"); |
- | 6711 | ||
- | 6712 | break; |
|
- | 6713 | case 6: |
|
- | 6714 | if (!(rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_RX_INTERRUPT)) |
|
- | 6715 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
- | 6716 | ||
- | 6717 | rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_RX_INTERRUPT; |
|
- | 6718 | queue_dp = true; |
|
- | 6719 | DRM_DEBUG("IH: HPD_RX 1\n"); |
|
- | 6720 | ||
- | 6721 | break; |
|
- | 6722 | case 7: |
|
- | 6723 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_RX_INTERRUPT)) |
|
- | 6724 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
- | 6725 | ||
- | 6726 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_RX_INTERRUPT; |
|
- | 6727 | queue_dp = true; |
|
- | 6728 | DRM_DEBUG("IH: HPD_RX 2\n"); |
|
- | 6729 | ||
- | 6730 | break; |
|
- | 6731 | case 8: |
|
- | 6732 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_RX_INTERRUPT)) |
|
- | 6733 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
- | 6734 | ||
- | 6735 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_RX_INTERRUPT; |
|
- | 6736 | queue_dp = true; |
|
- | 6737 | DRM_DEBUG("IH: HPD_RX 3\n"); |
|
- | 6738 | ||
- | 6739 | break; |
|
- | 6740 | case 9: |
|
- | 6741 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_RX_INTERRUPT)) |
|
- | 6742 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
- | 6743 | ||
- | 6744 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_RX_INTERRUPT; |
|
- | 6745 | queue_dp = true; |
|
- | 6746 | DRM_DEBUG("IH: HPD_RX 4\n"); |
|
- | 6747 | ||
- | 6748 | break; |
|
- | 6749 | case 10: |
|
- | 6750 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_RX_INTERRUPT)) |
|
- | 6751 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
- | 6752 | ||
- | 6753 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_RX_INTERRUPT; |
|
- | 6754 | queue_dp = true; |
|
- | 6755 | DRM_DEBUG("IH: HPD_RX 5\n"); |
|
- | 6756 | ||
6592 | } |
6757 | break; |
- | 6758 | case 11: |
|
- | 6759 | if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT)) |
|
- | 6760 | DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); |
|
- | 6761 | ||
- | 6762 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_RX_INTERRUPT; |
|
- | 6763 | queue_dp = true; |
|
- | 6764 | DRM_DEBUG("IH: HPD_RX 6\n"); |
|
- | 6765 | ||
6593 | break; |
6766 | break; |
6594 | default: |
6767 | default: |
6595 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
6768 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
6596 | break; |
6769 | break; |
6597 | } |
6770 | } |
6598 | break; |
6771 | break; |
- | 6772 | case 96: |
|
- | 6773 | DRM_ERROR("SRBM_READ_ERROR: 0x%x\n", RREG32(SRBM_READ_ERROR)); |
|
- | 6774 | WREG32(SRBM_INT_ACK, 0x1); |
|
- | 6775 | break; |
|
6599 | case 124: /* UVD */ |
6776 | case 124: /* UVD */ |
6600 | DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data); |
6777 | DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data); |
6601 | radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX); |
6778 | radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX); |
6602 | break; |
6779 | break; |
6603 | case 146: |
6780 | case 146: |
Line 6773... | Line 6950... | ||
6773 | } |
6950 | } |
6774 | if (r) |
6951 | if (r) |
6775 | rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; |
6952 | rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; |
6776 | } |
6953 | } |
Line -... | Line 6954... | ||
- | 6954 | ||
- | 6955 | r = radeon_vce_resume(rdev); |
|
- | 6956 | if (!r) { |
|
- | 6957 | r = vce_v1_0_resume(rdev); |
|
- | 6958 | if (!r) |
|
- | 6959 | r = radeon_fence_driver_start_ring(rdev, |
|
- | 6960 | TN_RING_TYPE_VCE1_INDEX); |
|
- | 6961 | if (!r) |
|
- | 6962 | r = radeon_fence_driver_start_ring(rdev, |
|
- | 6963 | TN_RING_TYPE_VCE2_INDEX); |
|
- | 6964 | } |
|
- | 6965 | if (r) { |
|
- | 6966 | dev_err(rdev->dev, "VCE init error (%d).\n", r); |
|
- | 6967 | rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0; |
|
- | 6968 | rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0; |
|
- | 6969 | } |
|
6777 | 6970 | ||
6778 | /* Enable IRQ */ |
6971 | /* Enable IRQ */ |
6779 | if (!rdev->irq.installed) { |
6972 | if (!rdev->irq.installed) { |
6780 | r = radeon_irq_kms_init(rdev); |
6973 | r = radeon_irq_kms_init(rdev); |
6781 | if (r) |
6974 | if (r) |
Line 6841... | Line 7034... | ||
6841 | if (r) |
7034 | if (r) |
6842 | DRM_ERROR("radeon: failed initializing UVD (%d).\n", r); |
7035 | DRM_ERROR("radeon: failed initializing UVD (%d).\n", r); |
6843 | } |
7036 | } |
6844 | } |
7037 | } |
Line -... | Line 7038... | ||
- | 7038 | ||
- | 7039 | r = -ENOENT; |
|
- | 7040 | ||
- | 7041 | ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX]; |
|
- | 7042 | if (ring->ring_size) |
|
- | 7043 | r = radeon_ring_init(rdev, ring, ring->ring_size, 0, |
|
- | 7044 | VCE_CMD_NO_OP); |
|
- | 7045 | ||
- | 7046 | ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX]; |
|
- | 7047 | if (ring->ring_size) |
|
- | 7048 | r = radeon_ring_init(rdev, ring, ring->ring_size, 0, |
|
- | 7049 | VCE_CMD_NO_OP); |
|
- | 7050 | ||
- | 7051 | if (!r) |
|
- | 7052 | r = vce_v1_0_init(rdev); |
|
- | 7053 | else if (r != -ENOENT) |
|
- | 7054 | DRM_ERROR("radeon: failed initializing VCE (%d).\n", r); |
|
6845 | 7055 | ||
6846 | r = radeon_ib_pool_init(rdev); |
7056 | r = radeon_ib_pool_init(rdev); |
6847 | if (r) { |
7057 | if (r) { |
6848 | dev_err(rdev->dev, "IB initialization failed (%d).\n", r); |
7058 | dev_err(rdev->dev, "IB initialization failed (%d).\n", r); |
6849 | return r; |
7059 | return r; |
Line 6853... | Line 7063... | ||
6853 | if (r) { |
7063 | if (r) { |
6854 | dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r); |
7064 | dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r); |
6855 | return r; |
7065 | return r; |
6856 | } |
7066 | } |
Line 6857... | Line 7067... | ||
6857 | 7067 | ||
6858 | r = dce6_audio_init(rdev); |
7068 | r = radeon_audio_init(rdev); |
6859 | if (r) |
7069 | if (r) |
Line 6860... | Line 7070... | ||
6860 | return r; |
7070 | return r; |
6861 | 7071 | ||
Line -... | Line 7072... | ||
- | 7072 | return 0; |
|
- | 7073 | } |
|
- | 7074 | ||
Line -... | Line 7075... | ||
- | 7075 | int si_resume(struct radeon_device *rdev) |
|
- | 7076 | { |
|
- | 7077 | int r; |
|
- | 7078 | ||
- | 7079 | /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw, |
|
- | 7080 | * posting will perform necessary task to bring back GPU into good |
|
- | 7081 | * shape. |
|
- | 7082 | */ |
|
- | 7083 | /* post card */ |
|
Line -... | Line 7084... | ||
- | 7084 | atom_asic_init(rdev->mode_info.atom_context); |
|
- | 7085 | ||
- | 7086 | /* init golden registers */ |
|
- | 7087 | si_init_golden_registers(rdev); |
|
- | 7088 | ||
- | 7089 | if (rdev->pm.pm_method == PM_METHOD_DPM) |
|
- | 7090 | radeon_pm_resume(rdev); |
|
- | 7091 | ||
- | 7092 | rdev->accel_working = true; |
|
- | 7093 | r = si_startup(rdev); |
|
- | 7094 | if (r) { |
|
- | 7095 | DRM_ERROR("si startup failed on resume\n"); |
|
- | 7096 | rdev->accel_working = false; |
|
- | 7097 | return r; |
|
Line 6862... | Line 7098... | ||
6862 | return 0; |
7098 | } |
6863 | } |
7099 | |
6864 | 7100 | return r; |
|
6865 | 7101 | ||
Line 6961... | Line 7197... | ||
6961 | ring->ring_obj = NULL; |
7197 | ring->ring_obj = NULL; |
6962 | r600_ring_init(rdev, ring, 4096); |
7198 | r600_ring_init(rdev, ring, 4096); |
6963 | } |
7199 | } |
6964 | } |
7200 | } |
Line -... | Line 7201... | ||
- | 7201 | ||
- | 7202 | r = radeon_vce_init(rdev); |
|
- | 7203 | if (!r) { |
|
- | 7204 | ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX]; |
|
- | 7205 | ring->ring_obj = NULL; |
|
- | 7206 | r600_ring_init(rdev, ring, 4096); |
|
- | 7207 | ||
- | 7208 | ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX]; |
|
- | 7209 | ring->ring_obj = NULL; |
|
- | 7210 | r600_ring_init(rdev, ring, 4096); |
|
- | 7211 | } |
|
6965 | 7212 | ||
6966 | rdev->ih.ring_obj = NULL; |
7213 | rdev->ih.ring_obj = NULL; |
Line 6967... | Line 7214... | ||
6967 | r600_ih_ring_init(rdev, 64 * 1024); |
7214 | r600_ih_ring_init(rdev, 64 * 1024); |
6968 | 7215 | ||
6969 | r = r600_pcie_gart_init(rdev); |
7216 | r = r600_pcie_gart_init(rdev); |
Line 6970... | Line 7217... | ||
6970 | if (r) |
7217 | if (r) |
6971 | return r; |
7218 | return r; |
6972 | 7219 | ||
6973 | rdev->accel_working = true; |
7220 | rdev->accel_working = true; |
6974 | r = si_startup(rdev); |
7221 | r = si_startup(rdev); |
- | 7222 | if (r) { |
|
6975 | if (r) { |
7223 | dev_err(rdev->dev, "disabling GPU acceleration\n"); |
6976 | dev_err(rdev->dev, "disabling GPU acceleration\n"); |
7224 | si_cp_fini(rdev); |
6977 | si_cp_fini(rdev); |
7225 | cayman_dma_fini(rdev); |
6978 | // si_irq_fini(rdev); |
7226 | si_irq_fini(rdev); |
6979 | // si_rlc_fini(rdev); |
7227 | sumo_rlc_fini(rdev); |
6980 | // radeon_wb_fini(rdev); |
7228 | radeon_wb_fini(rdev); |
6981 | // radeon_ib_pool_fini(rdev); |
7229 | radeon_ib_pool_fini(rdev); |
6982 | // radeon_vm_manager_fini(rdev); |
7230 | radeon_vm_manager_fini(rdev); |
6983 | // radeon_irq_kms_fini(rdev); |
7231 | radeon_irq_kms_fini(rdev); |
Line 6984... | Line 7232... | ||
6984 | // si_pcie_gart_fini(rdev); |
7232 | si_pcie_gart_fini(rdev); |
6985 | rdev->accel_working = false; |
7233 | rdev->accel_working = false; |
Line 6995... | Line 7243... | ||
6995 | } |
7243 | } |
Line 6996... | Line 7244... | ||
6996 | 7244 | ||
6997 | return 0; |
7245 | return 0; |
Line -... | Line 7246... | ||
- | 7246 | } |
|
- | 7247 | ||
- | 7248 | void si_fini(struct radeon_device *rdev) |
|
- | 7249 | { |
|
- | 7250 | radeon_pm_fini(rdev); |
|
- | 7251 | si_cp_fini(rdev); |
|
- | 7252 | cayman_dma_fini(rdev); |
|
- | 7253 | si_fini_pg(rdev); |
|
- | 7254 | si_fini_cg(rdev); |
|
- | 7255 | si_irq_fini(rdev); |
|
- | 7256 | sumo_rlc_fini(rdev); |
|
- | 7257 | radeon_wb_fini(rdev); |
|
- | 7258 | radeon_vm_manager_fini(rdev); |
|
- | 7259 | radeon_ib_pool_fini(rdev); |
|
- | 7260 | radeon_irq_kms_fini(rdev); |
|
- | 7261 | if (rdev->has_uvd) { |
|
- | 7262 | uvd_v1_0_fini(rdev); |
|
- | 7263 | radeon_uvd_fini(rdev); |
|
- | 7264 | radeon_vce_fini(rdev); |
|
- | 7265 | } |
|
- | 7266 | si_pcie_gart_fini(rdev); |
|
- | 7267 | r600_vram_scratch_fini(rdev); |
|
- | 7268 | radeon_gem_fini(rdev); |
|
- | 7269 | radeon_fence_driver_fini(rdev); |
|
- | 7270 | radeon_bo_fini(rdev); |
|
- | 7271 | radeon_atombios_fini(rdev); |
|
- | 7272 | kfree(rdev->bios); |
|
- | 7273 | rdev->bios = NULL; |
|
6998 | } |
7274 | } |
6999 | 7275 | ||
7000 | /** |
7276 | /** |
7001 | * si_get_gpu_clock_counter - return GPU clock counter snapshot |
7277 | * si_get_gpu_clock_counter - return GPU clock counter snapshot |
7002 | * |
7278 | * |
Line 7029... | Line 7305... | ||
7029 | 7305 | ||
7030 | /* put PLL in bypass mode */ |
7306 | /* put PLL in bypass mode */ |
Line 7031... | Line 7307... | ||
7031 | WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK); |
7307 | WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK); |
7032 | 7308 | ||
7033 | if (!vclk || !dclk) { |
- | |
7034 | /* keep the Bypass mode, put PLL to sleep */ |
7309 | if (!vclk || !dclk) { |
7035 | WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK); |
7310 | /* keep the Bypass mode */ |
Line 7036... | Line 7311... | ||
7036 | return 0; |
7311 | return 0; |
7037 | } |
7312 | } |
Line 7046... | Line 7321... | ||
7046 | WREG32_P(CG_UPLL_FUNC_CNTL_5, 0, ~RESET_ANTI_MUX_MASK); |
7321 | WREG32_P(CG_UPLL_FUNC_CNTL_5, 0, ~RESET_ANTI_MUX_MASK); |
Line 7047... | Line 7322... | ||
7047 | 7322 | ||
7048 | /* set VCO_MODE to 1 */ |
7323 | /* set VCO_MODE to 1 */ |
Line 7049... | Line 7324... | ||
7049 | WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_VCO_MODE_MASK, ~UPLL_VCO_MODE_MASK); |
7324 | WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_VCO_MODE_MASK, ~UPLL_VCO_MODE_MASK); |
7050 | - | ||
7051 | /* toggle UPLL_SLEEP to 1 then back to 0 */ |
7325 | |
Line 7052... | Line 7326... | ||
7052 | WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK); |
7326 | /* disable sleep mode */ |
7053 | WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_SLEEP_MASK); |
7327 | WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_SLEEP_MASK); |
Line 7466... | Line 7740... | ||
7466 | WREG32_PCIE_PORT(PCIE_LC_CNTL, data); |
7740 | WREG32_PCIE_PORT(PCIE_LC_CNTL, data); |
7467 | } |
7741 | } |
7468 | } |
7742 | } |
7469 | } |
7743 | } |
7470 | }>><>><>><>><>><>><>><>><>>><>>>><>><>>>>>>>>><>=><=>>>>>=><=>>>>>>><>><>><>>>---\n",>>>>>><>>>>><>><>><>>>><>><>>>><>><>><>><>>>>><>><>><>=>>>>>>>>><>><>><>>>>><>><>><>><>><>><>><>><>><>><>>><>><>><>>>=><=>>><>>>=><=>>>>=><=>>>>>>=>=>= |
7744 | } |
- | 7745 | ||
- | 7746 | int si_vce_send_vcepll_ctlreq(struct radeon_device *rdev) |
|
- | 7747 | { |
|
- | 7748 | unsigned i; |
|
- | 7749 | ||
- | 7750 | /* make sure VCEPLL_CTLREQ is deasserted */ |
|
- | 7751 | WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~UPLL_CTLREQ_MASK); |
|
- | 7752 | ||
- | 7753 | mdelay(10); |
|
- | 7754 | ||
- | 7755 | /* assert UPLL_CTLREQ */ |
|
- | 7756 | WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, UPLL_CTLREQ_MASK, ~UPLL_CTLREQ_MASK); |
|
- | 7757 | ||
- | 7758 | /* wait for CTLACK and CTLACK2 to get asserted */ |
|
- | 7759 | for (i = 0; i < 100; ++i) { |
|
- | 7760 | uint32_t mask = UPLL_CTLACK_MASK | UPLL_CTLACK2_MASK; |
|
- | 7761 | if ((RREG32_SMC(CG_VCEPLL_FUNC_CNTL) & mask) == mask) |
|
- | 7762 | break; |
|
- | 7763 | mdelay(10); |
|
- | 7764 | } |
|
- | 7765 | ||
- | 7766 | /* deassert UPLL_CTLREQ */ |
|
- | 7767 | WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~UPLL_CTLREQ_MASK); |
|
- | 7768 | ||
- | 7769 | if (i == 100) { |
|
- | 7770 | DRM_ERROR("Timeout setting UVD clocks!\n"); |
|
- | 7771 | return -ETIMEDOUT; |
|
- | 7772 | } |
|
- | 7773 | ||
- | 7774 | return 0; |
|
- | 7775 | } |
|
- | 7776 | ||
- | 7777 | int si_set_vce_clocks(struct radeon_device *rdev, u32 evclk, u32 ecclk) |
|
- | 7778 | { |
|
- | 7779 | unsigned fb_div = 0, evclk_div = 0, ecclk_div = 0; |
|
- | 7780 | int r; |
|
- | 7781 | ||
- | 7782 | /* bypass evclk and ecclk with bclk */ |
|
- | 7783 | WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2, |
|
- | 7784 | EVCLK_SRC_SEL(1) | ECCLK_SRC_SEL(1), |
|
- | 7785 | ~(EVCLK_SRC_SEL_MASK | ECCLK_SRC_SEL_MASK)); |
|
- | 7786 | ||
- | 7787 | /* put PLL in bypass mode */ |
|
- | 7788 | WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_BYPASS_EN_MASK, |
|
- | 7789 | ~VCEPLL_BYPASS_EN_MASK); |
|
- | 7790 | ||
- | 7791 | if (!evclk || !ecclk) { |
|
- | 7792 | /* keep the Bypass mode, put PLL to sleep */ |
|
- | 7793 | WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_SLEEP_MASK, |
|
- | 7794 | ~VCEPLL_SLEEP_MASK); |
|
- | 7795 | return 0; |
|
- | 7796 | } |
|
- | 7797 | ||
- | 7798 | r = radeon_uvd_calc_upll_dividers(rdev, evclk, ecclk, 125000, 250000, |
|
- | 7799 | 16384, 0x03FFFFFF, 0, 128, 5, |
|
- | 7800 | &fb_div, &evclk_div, &ecclk_div); |
|
- | 7801 | if (r) |
|
- | 7802 | return r; |
|
- | 7803 | ||
- | 7804 | /* set RESET_ANTI_MUX to 0 */ |
|
- | 7805 | WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_5, 0, ~RESET_ANTI_MUX_MASK); |
|
- | 7806 | ||
- | 7807 | /* set VCO_MODE to 1 */ |
|
- | 7808 | WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_VCO_MODE_MASK, |
|
- | 7809 | ~VCEPLL_VCO_MODE_MASK); |
|
- | 7810 | ||
- | 7811 | /* toggle VCEPLL_SLEEP to 1 then back to 0 */ |
|
- | 7812 | WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_SLEEP_MASK, |
|
- | 7813 | ~VCEPLL_SLEEP_MASK); |
|
- | 7814 | WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_SLEEP_MASK); |
|
- | 7815 | ||
- | 7816 | /* deassert VCEPLL_RESET */ |
|
- | 7817 | WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_RESET_MASK); |
|
- | 7818 | ||
- | 7819 | mdelay(1); |
|
- | 7820 | ||
- | 7821 | r = si_vce_send_vcepll_ctlreq(rdev); |
|
- | 7822 | if (r) |
|
- | 7823 | return r; |
|
- | 7824 | ||
- | 7825 | /* assert VCEPLL_RESET again */ |
|
- | 7826 | WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_RESET_MASK, ~VCEPLL_RESET_MASK); |
|
- | 7827 | ||
- | 7828 | /* disable spread spectrum. */ |
|
- | 7829 | WREG32_SMC_P(CG_VCEPLL_SPREAD_SPECTRUM, 0, ~SSEN_MASK); |
|
- | 7830 | ||
- | 7831 | /* set feedback divider */ |
|
- | 7832 | WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_3, VCEPLL_FB_DIV(fb_div), ~VCEPLL_FB_DIV_MASK); |
|
- | 7833 | ||
- | 7834 | /* set ref divider to 0 */ |
|
- | 7835 | WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_REF_DIV_MASK); |
|
- | 7836 | ||
- | 7837 | /* set PDIV_A and PDIV_B */ |
|
- | 7838 | WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2, |
|
- | 7839 | VCEPLL_PDIV_A(evclk_div) | VCEPLL_PDIV_B(ecclk_div), |
|
- | 7840 | ~(VCEPLL_PDIV_A_MASK | VCEPLL_PDIV_B_MASK)); |
|
- | 7841 | ||
- | 7842 | /* give the PLL some time to settle */ |
|
- | 7843 | mdelay(15); |
|
- | 7844 | ||
- | 7845 | /* deassert PLL_RESET */ |
|
- | 7846 | WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_RESET_MASK); |
|
- | 7847 | ||
- | 7848 | mdelay(15); |
|
- | 7849 | ||
- | 7850 | /* switch from bypass mode to normal mode */ |
|
- | 7851 | WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_BYPASS_EN_MASK); |
|
- | 7852 | ||
- | 7853 | r = si_vce_send_vcepll_ctlreq(rdev); |
|
- | 7854 | if (r) |
|
- | 7855 | return r; |
|
- | 7856 | ||
- | 7857 | /* switch VCLK and DCLK selection */ |
|
- | 7858 | WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2, |
|
- | 7859 | EVCLK_SRC_SEL(16) | ECCLK_SRC_SEL(16), |
|
- | 7860 | ~(EVCLK_SRC_SEL_MASK | ECCLK_SRC_SEL_MASK)); |
|
- | 7861 | ||
- | 7862 | mdelay(100); |
|
- | 7863 | ||
- | 7864 | return 0; |
|
- | 7865 | }>>><>><>><>><>><>><>><>><>>><>>>><>><>>>>>>>>><>=><=>>>>>=><=>>>>>>><>><>><>>>---\n",>>>>>><>>>>><>><>><>>>><>><>>>><>><>><>><>>>>><>><>><>=>>>>>>>>><>><>><>>>>><>><>><>><>><>><>><>><>><>><>>><>><>><>>>=><=>>><>>>=><=>>>>=><=>>>>>>=>=>= |