r100.c (a2d07b7438f015a0349bc9af3c96a8164549bbc5) | r100.c (90aca4d2740255bd130ea71a91530b9920c70abe) |
---|---|
1/* 2 * Copyright 2008 Advanced Micro Devices, Inc. 3 * Copyright 2008 Red Hat Inc. 4 * Copyright 2009 Jerome Glisse. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation --- 648 unchanged lines hidden (view full) --- 657 unsigned indirect2_start; 658 unsigned indirect1_start; 659 uint32_t tmp; 660 int r; 661 662 if (r100_debugfs_cp_init(rdev)) { 663 DRM_ERROR("Failed to register debugfs file for CP !\n"); 664 } | 1/* 2 * Copyright 2008 Advanced Micro Devices, Inc. 3 * Copyright 2008 Red Hat Inc. 4 * Copyright 2009 Jerome Glisse. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation --- 648 unchanged lines hidden (view full) --- 657 unsigned indirect2_start; 658 unsigned indirect1_start; 659 uint32_t tmp; 660 int r; 661 662 if (r100_debugfs_cp_init(rdev)) { 663 DRM_ERROR("Failed to register debugfs file for CP !\n"); 664 } |
665 /* Reset CP */ 666 tmp = RREG32(RADEON_CP_CSQ_STAT); 667 if ((tmp & (1 << 31))) { 668 DRM_INFO("radeon: cp busy (0x%08X) resetting\n", tmp); 669 WREG32(RADEON_CP_CSQ_MODE, 0); 670 WREG32(RADEON_CP_CSQ_CNTL, 0); 671 WREG32(RADEON_RBBM_SOFT_RESET, RADEON_SOFT_RESET_CP); 672 tmp = RREG32(RADEON_RBBM_SOFT_RESET); 673 mdelay(2); 674 WREG32(RADEON_RBBM_SOFT_RESET, 0); 675 tmp = RREG32(RADEON_RBBM_SOFT_RESET); 676 mdelay(2); 677 tmp = RREG32(RADEON_CP_CSQ_STAT); 678 if ((tmp & (1 << 31))) { 679 DRM_INFO("radeon: cp reset failed (0x%08X)\n", tmp); 680 } 681 } else { 682 DRM_INFO("radeon: cp idle (0x%08X)\n", tmp); 683 } 684 | |
685 if (!rdev->me_fw) { 686 r = r100_cp_init_microcode(rdev); 687 if (r) { 688 DRM_ERROR("Failed to load firmware!\n"); 689 return r; 690 } 691 } 692 --- 88 unchanged lines hidden (view full) --- 781 WREG32(RADEON_CP_CSQ_MODE, 0); 782 WREG32(RADEON_CP_CSQ_CNTL, 0); 783 if (r100_gui_wait_for_idle(rdev)) { 784 printk(KERN_WARNING "Failed to wait GUI idle while " 785 "programming pipes. Bad things might happen.\n"); 786 } 787} 788 | 665 if (!rdev->me_fw) { 666 r = r100_cp_init_microcode(rdev); 667 if (r) { 668 DRM_ERROR("Failed to load firmware!\n"); 669 return r; 670 } 671 } 672 --- 88 unchanged lines hidden (view full) --- 761 WREG32(RADEON_CP_CSQ_MODE, 0); 762 WREG32(RADEON_CP_CSQ_CNTL, 0); 763 if (r100_gui_wait_for_idle(rdev)) { 764 printk(KERN_WARNING "Failed to wait GUI idle while " 765 "programming pipes. Bad things might happen.\n"); 766 } 767} 768 |
789int r100_cp_reset(struct radeon_device *rdev) 790{ 791 uint32_t tmp; 792 bool reinit_cp; 793 int i; 794 795 reinit_cp = rdev->cp.ready; 796 rdev->cp.ready = false; 797 WREG32(RADEON_CP_CSQ_MODE, 0); 798 WREG32(RADEON_CP_CSQ_CNTL, 0); 799 WREG32(RADEON_RBBM_SOFT_RESET, RADEON_SOFT_RESET_CP); 800 (void)RREG32(RADEON_RBBM_SOFT_RESET); 801 udelay(200); 802 WREG32(RADEON_RBBM_SOFT_RESET, 0); 803 /* Wait to prevent race in RBBM_STATUS */ 804 mdelay(1); 805 for (i = 0; i < rdev->usec_timeout; i++) { 806 tmp = RREG32(RADEON_RBBM_STATUS); 807 if (!(tmp & (1 << 16))) { 808 DRM_INFO("CP reset succeed (RBBM_STATUS=0x%08X)\n", 809 tmp); 810 if (reinit_cp) { 811 return r100_cp_init(rdev, rdev->cp.ring_size); 812 } 813 return 0; 814 } 815 DRM_UDELAY(1); 816 } 817 tmp = RREG32(RADEON_RBBM_STATUS); 818 DRM_ERROR("Failed to reset CP (RBBM_STATUS=0x%08X)!\n", tmp); 819 return -1; 820} 821 | |
822void r100_cp_commit(struct radeon_device *rdev) 823{ 824 WREG32(RADEON_CP_RB_WPTR, rdev->cp.wptr); 825 (void)RREG32(RADEON_CP_RB_WPTR); 826} 827 828 829/* --- 897 unchanged lines hidden (view full) --- 1727 if (tmp & RADEON_MC_IDLE) { 1728 return 0; 1729 } 1730 DRM_UDELAY(1); 1731 } 1732 return -1; 1733} 1734 | 769void r100_cp_commit(struct radeon_device *rdev) 770{ 771 WREG32(RADEON_CP_RB_WPTR, rdev->cp.wptr); 772 (void)RREG32(RADEON_CP_RB_WPTR); 773} 774 775 776/* --- 897 unchanged lines hidden (view full) --- 1674 if (tmp & RADEON_MC_IDLE) { 1675 return 0; 1676 } 1677 DRM_UDELAY(1); 1678 } 1679 return -1; 1680} 1681 |
1735void r100_gpu_init(struct radeon_device *rdev) 1736{ 1737 /* TODO: anythings to do here ? pipes ? */ 1738 r100_hdp_reset(rdev); 1739} 1740 1741void r100_hdp_reset(struct radeon_device *rdev) 1742{ 1743 uint32_t tmp; 1744 1745 tmp = RREG32(RADEON_HOST_PATH_CNTL) & RADEON_HDP_APER_CNTL; 1746 tmp |= (7 << 28); 1747 WREG32(RADEON_HOST_PATH_CNTL, tmp | RADEON_HDP_SOFT_RESET | RADEON_HDP_READ_BUFFER_INVALIDATE); 1748 (void)RREG32(RADEON_HOST_PATH_CNTL); 1749 udelay(200); 1750 WREG32(RADEON_RBBM_SOFT_RESET, 0); 1751 WREG32(RADEON_HOST_PATH_CNTL, tmp); 1752 (void)RREG32(RADEON_HOST_PATH_CNTL); 1753} 1754 1755int r100_rb2d_reset(struct radeon_device *rdev) 1756{ 1757 uint32_t tmp; 1758 int i; 1759 1760 WREG32(RADEON_RBBM_SOFT_RESET, RADEON_SOFT_RESET_E2); 1761 (void)RREG32(RADEON_RBBM_SOFT_RESET); 1762 udelay(200); 1763 WREG32(RADEON_RBBM_SOFT_RESET, 0); 1764 /* Wait to prevent race in RBBM_STATUS */ 1765 mdelay(1); 1766 for (i = 0; i < rdev->usec_timeout; i++) { 1767 tmp = RREG32(RADEON_RBBM_STATUS); 1768 if (!(tmp & (1 << 26))) { 1769 DRM_INFO("RB2D reset succeed (RBBM_STATUS=0x%08X)\n", 1770 tmp); 1771 return 0; 1772 } 1773 DRM_UDELAY(1); 1774 } 1775 tmp = RREG32(RADEON_RBBM_STATUS); 1776 DRM_ERROR("Failed to reset RB2D (RBBM_STATUS=0x%08X)!\n", tmp); 1777 return -1; 1778} 1779 | |
1780void r100_gpu_lockup_update(struct r100_gpu_lockup *lockup, struct radeon_cp *cp) 1781{ 1782 lockup->last_cp_rptr = cp->rptr; 1783 lockup->last_jiffies = jiffies; 1784} 1785 1786/** 1787 * r100_gpu_cp_is_lockup() - check if CP is lockup by recording information --- 70 unchanged lines hidden (view full) --- 1858 radeon_ring_write(rdev, 0x80000000); 1859 radeon_ring_write(rdev, 0x80000000); 1860 radeon_ring_unlock_commit(rdev); 1861 } 1862 rdev->cp.rptr = RREG32(RADEON_CP_RB_RPTR); 1863 return r100_gpu_cp_is_lockup(rdev, &rdev->config.r100.lockup, &rdev->cp); 1864} 1865 | 1682void r100_gpu_lockup_update(struct r100_gpu_lockup *lockup, struct radeon_cp *cp) 1683{ 1684 lockup->last_cp_rptr = cp->rptr; 1685 lockup->last_jiffies = jiffies; 1686} 1687 1688/** 1689 * r100_gpu_cp_is_lockup() - check if CP is lockup by recording information --- 70 unchanged lines hidden (view full) --- 1760 radeon_ring_write(rdev, 0x80000000); 1761 radeon_ring_write(rdev, 0x80000000); 1762 radeon_ring_unlock_commit(rdev); 1763 } 1764 rdev->cp.rptr = RREG32(RADEON_CP_RB_RPTR); 1765 return r100_gpu_cp_is_lockup(rdev, &rdev->config.r100.lockup, &rdev->cp); 1766} 1767 |
1768void r100_bm_disable(struct radeon_device *rdev) 1769{ 1770 u32 tmp; 1771 1772 /* disable bus mastering */ 1773 tmp = RREG32(R_000030_BUS_CNTL); 1774 WREG32(R_000030_BUS_CNTL, (tmp & 0xFFFFFFFF) | 0x00000044); 1775 mdelay(1); 1776 WREG32(R_000030_BUS_CNTL, (tmp & 0xFFFFFFFF) | 0x00000042); 1777 mdelay(1); 1778 WREG32(R_000030_BUS_CNTL, (tmp & 0xFFFFFFFF) | 0x00000040); 1779 tmp = RREG32(RADEON_BUS_CNTL); 1780 mdelay(1); 1781 pci_read_config_word(rdev->pdev, 0x4, (u16*)&tmp); 1782 pci_write_config_word(rdev->pdev, 0x4, tmp & 0xFFFB); 1783 mdelay(1); 1784} 1785 |
|
1866int r100_asic_reset(struct radeon_device *rdev) 1867{ | 1786int r100_asic_reset(struct radeon_device *rdev) 1787{ |
1868 uint32_t status; | 1788 struct r100_mc_save save; 1789 u32 status, tmp; |
1869 | 1790 |
1870 /* reset order likely matter */ 1871 status = RREG32(RADEON_RBBM_STATUS); 1872 /* reset HDP */ 1873 r100_hdp_reset(rdev); 1874 /* reset rb2d */ 1875 if (status & ((1 << 17) | (1 << 18) | (1 << 27))) { 1876 r100_rb2d_reset(rdev); | 1791 r100_mc_stop(rdev, &save); 1792 status = RREG32(R_000E40_RBBM_STATUS); 1793 if (!G_000E40_GUI_ACTIVE(status)) { 1794 return 0; |
1877 } | 1795 } |
1878 /* TODO: reset 3D engine */ | 1796 status = RREG32(R_000E40_RBBM_STATUS); 1797 dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status); 1798 /* stop CP */ 1799 WREG32(RADEON_CP_CSQ_CNTL, 0); 1800 tmp = RREG32(RADEON_CP_RB_CNTL); 1801 WREG32(RADEON_CP_RB_CNTL, tmp | RADEON_RB_RPTR_WR_ENA); 1802 WREG32(RADEON_CP_RB_RPTR_WR, 0); 1803 WREG32(RADEON_CP_RB_WPTR, 0); 1804 WREG32(RADEON_CP_RB_CNTL, tmp); 1805 /* save PCI state */ 1806 pci_save_state(rdev->pdev); 1807 /* disable bus mastering */ 1808 r100_bm_disable(rdev); 1809 WREG32(R_0000F0_RBBM_SOFT_RESET, S_0000F0_SOFT_RESET_SE(1) | 1810 S_0000F0_SOFT_RESET_RE(1) | 1811 S_0000F0_SOFT_RESET_PP(1) | 1812 S_0000F0_SOFT_RESET_RB(1)); 1813 RREG32(R_0000F0_RBBM_SOFT_RESET); 1814 mdelay(500); 1815 WREG32(R_0000F0_RBBM_SOFT_RESET, 0); 1816 mdelay(1); 1817 status = RREG32(R_000E40_RBBM_STATUS); 1818 dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status); |
1879 /* reset CP */ | 1819 /* reset CP */ |
1880 status = RREG32(RADEON_RBBM_STATUS); 1881 if (status & (1 << 16)) { 1882 r100_cp_reset(rdev); 1883 } | 1820 WREG32(R_0000F0_RBBM_SOFT_RESET, S_0000F0_SOFT_RESET_CP(1)); 1821 RREG32(R_0000F0_RBBM_SOFT_RESET); 1822 mdelay(500); 1823 WREG32(R_0000F0_RBBM_SOFT_RESET, 0); 1824 mdelay(1); 1825 status = RREG32(R_000E40_RBBM_STATUS); 1826 dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status); 1827 /* restore PCI & busmastering */ 1828 pci_restore_state(rdev->pdev); 1829 r100_enable_bm(rdev); |
1884 /* Check if GPU is idle */ | 1830 /* Check if GPU is idle */ |
1885 status = RREG32(RADEON_RBBM_STATUS); 1886 if (status & RADEON_RBBM_ACTIVE) { 1887 DRM_ERROR("Failed to reset GPU (RBBM_STATUS=0x%08X)\n", status); | 1831 if (G_000E40_SE_BUSY(status) || G_000E40_RE_BUSY(status) || 1832 G_000E40_TAM_BUSY(status) || G_000E40_PB_BUSY(status)) { 1833 dev_err(rdev->dev, "failed to reset GPU\n"); 1834 rdev->gpu_lockup = true; |
1888 return -1; 1889 } | 1835 return -1; 1836 } |
1890 DRM_INFO("GPU reset succeed (RBBM_STATUS=0x%08X)\n", status); | 1837 r100_mc_resume(rdev, &save); 1838 dev_info(rdev->dev, "GPU reset succeed\n"); |
1891 return 0; 1892} 1893 1894void r100_set_common_regs(struct radeon_device *rdev) 1895{ 1896 struct drm_device *dev = rdev->ddev; 1897 bool force_dac2 = false; 1898 u32 tmp; --- 1571 unchanged lines hidden (view full) --- 3470 3471 /* set common regs */ 3472 r100_set_common_regs(rdev); 3473 /* program mc */ 3474 r100_mc_program(rdev); 3475 /* Resume clock */ 3476 r100_clock_startup(rdev); 3477 /* Initialize GPU configuration (# pipes, ...) */ | 1839 return 0; 1840} 1841 1842void r100_set_common_regs(struct radeon_device *rdev) 1843{ 1844 struct drm_device *dev = rdev->ddev; 1845 bool force_dac2 = false; 1846 u32 tmp; --- 1571 unchanged lines hidden (view full) --- 3418 3419 /* set common regs */ 3420 r100_set_common_regs(rdev); 3421 /* program mc */ 3422 r100_mc_program(rdev); 3423 /* Resume clock */ 3424 r100_clock_startup(rdev); 3425 /* Initialize GPU configuration (# pipes, ...) */ |
3478 r100_gpu_init(rdev); | 3426// r100_gpu_init(rdev); |
3479 /* Initialize GART (initialize after TTM so we can allocate 3480 * memory through TTM but finalize after TTM) */ 3481 r100_enable_bm(rdev); 3482 if (rdev->flags & RADEON_IS_PCI) { 3483 r = r100_pci_gart_enable(rdev); 3484 if (r) 3485 return r; 3486 } --- 153 unchanged lines hidden --- | 3427 /* Initialize GART (initialize after TTM so we can allocate 3428 * memory through TTM but finalize after TTM) */ 3429 r100_enable_bm(rdev); 3430 if (rdev->flags & RADEON_IS_PCI) { 3431 r = r100_pci_gart_enable(rdev); 3432 if (r) 3433 return r; 3434 } --- 153 unchanged lines hidden --- |