aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/evergreen.c
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2012-05-31 19:00:25 -0400
committerDave Airlie <airlied@redhat.com>2012-06-01 12:00:14 -0400
commit416a2bd274566a6f607a271f524b2dc0b84d9106 (patch)
tree502720262c07cdb14bc14155bc8295cc20a7d411 /drivers/gpu/drm/radeon/evergreen.c
parent95c4b23ec4e2fa5604df229ddf134e31d7b3b378 (diff)
drm/radeon: fixup tiling group size and backendmap on r6xx-r9xx (v4)
Tiling group size is always 256bits on r6xx/r7xx/r8xx/9xx. Also fix and simplify render backend map. This now properly sets up the backend map on r6xx-9xx which should improve 3D performance. Vadim benchmarked also: Some benchmarks on juniper (5750), fullscreen 1920x1080, first result - kernel 3.4.0+ (fb21affa), second - with these patches: Lightsmark: 91 fps => 123 fps +35% Doom3: 74 fps => 101 fps +36% Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Jerome Glisse <jglisse@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/evergreen.c')
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c368
1 files changed, 45 insertions, 323 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index 6a57f0d4dae8..01550d05e273 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -1558,163 +1558,10 @@ int evergreen_cp_resume(struct radeon_device *rdev)
1558/* 1558/*
1559 * Core functions 1559 * Core functions
1560 */ 1560 */
1561static u32 evergreen_get_tile_pipe_to_backend_map(struct radeon_device *rdev,
1562 u32 num_tile_pipes,
1563 u32 num_backends,
1564 u32 backend_disable_mask)
1565{
1566 u32 backend_map = 0;
1567 u32 enabled_backends_mask = 0;
1568 u32 enabled_backends_count = 0;
1569 u32 cur_pipe;
1570 u32 swizzle_pipe[EVERGREEN_MAX_PIPES];
1571 u32 cur_backend = 0;
1572 u32 i;
1573 bool force_no_swizzle;
1574
1575 if (num_tile_pipes > EVERGREEN_MAX_PIPES)
1576 num_tile_pipes = EVERGREEN_MAX_PIPES;
1577 if (num_tile_pipes < 1)
1578 num_tile_pipes = 1;
1579 if (num_backends > EVERGREEN_MAX_BACKENDS)
1580 num_backends = EVERGREEN_MAX_BACKENDS;
1581 if (num_backends < 1)
1582 num_backends = 1;
1583
1584 for (i = 0; i < EVERGREEN_MAX_BACKENDS; ++i) {
1585 if (((backend_disable_mask >> i) & 1) == 0) {
1586 enabled_backends_mask |= (1 << i);
1587 ++enabled_backends_count;
1588 }
1589 if (enabled_backends_count == num_backends)
1590 break;
1591 }
1592
1593 if (enabled_backends_count == 0) {
1594 enabled_backends_mask = 1;
1595 enabled_backends_count = 1;
1596 }
1597
1598 if (enabled_backends_count != num_backends)
1599 num_backends = enabled_backends_count;
1600
1601 memset((uint8_t *)&swizzle_pipe[0], 0, sizeof(u32) * EVERGREEN_MAX_PIPES);
1602 switch (rdev->family) {
1603 case CHIP_CEDAR:
1604 case CHIP_REDWOOD:
1605 case CHIP_PALM:
1606 case CHIP_SUMO:
1607 case CHIP_SUMO2:
1608 case CHIP_TURKS:
1609 case CHIP_CAICOS:
1610 force_no_swizzle = false;
1611 break;
1612 case CHIP_CYPRESS:
1613 case CHIP_HEMLOCK:
1614 case CHIP_JUNIPER:
1615 case CHIP_BARTS:
1616 default:
1617 force_no_swizzle = true;
1618 break;
1619 }
1620 if (force_no_swizzle) {
1621 bool last_backend_enabled = false;
1622
1623 force_no_swizzle = false;
1624 for (i = 0; i < EVERGREEN_MAX_BACKENDS; ++i) {
1625 if (((enabled_backends_mask >> i) & 1) == 1) {
1626 if (last_backend_enabled)
1627 force_no_swizzle = true;
1628 last_backend_enabled = true;
1629 } else
1630 last_backend_enabled = false;
1631 }
1632 }
1633
1634 switch (num_tile_pipes) {
1635 case 1:
1636 case 3:
1637 case 5:
1638 case 7:
1639 DRM_ERROR("odd number of pipes!\n");
1640 break;
1641 case 2:
1642 swizzle_pipe[0] = 0;
1643 swizzle_pipe[1] = 1;
1644 break;
1645 case 4:
1646 if (force_no_swizzle) {
1647 swizzle_pipe[0] = 0;
1648 swizzle_pipe[1] = 1;
1649 swizzle_pipe[2] = 2;
1650 swizzle_pipe[3] = 3;
1651 } else {
1652 swizzle_pipe[0] = 0;
1653 swizzle_pipe[1] = 2;
1654 swizzle_pipe[2] = 1;
1655 swizzle_pipe[3] = 3;
1656 }
1657 break;
1658 case 6:
1659 if (force_no_swizzle) {
1660 swizzle_pipe[0] = 0;
1661 swizzle_pipe[1] = 1;
1662 swizzle_pipe[2] = 2;
1663 swizzle_pipe[3] = 3;
1664 swizzle_pipe[4] = 4;
1665 swizzle_pipe[5] = 5;
1666 } else {
1667 swizzle_pipe[0] = 0;
1668 swizzle_pipe[1] = 2;
1669 swizzle_pipe[2] = 4;
1670 swizzle_pipe[3] = 1;
1671 swizzle_pipe[4] = 3;
1672 swizzle_pipe[5] = 5;
1673 }
1674 break;
1675 case 8:
1676 if (force_no_swizzle) {
1677 swizzle_pipe[0] = 0;
1678 swizzle_pipe[1] = 1;
1679 swizzle_pipe[2] = 2;
1680 swizzle_pipe[3] = 3;
1681 swizzle_pipe[4] = 4;
1682 swizzle_pipe[5] = 5;
1683 swizzle_pipe[6] = 6;
1684 swizzle_pipe[7] = 7;
1685 } else {
1686 swizzle_pipe[0] = 0;
1687 swizzle_pipe[1] = 2;
1688 swizzle_pipe[2] = 4;
1689 swizzle_pipe[3] = 6;
1690 swizzle_pipe[4] = 1;
1691 swizzle_pipe[5] = 3;
1692 swizzle_pipe[6] = 5;
1693 swizzle_pipe[7] = 7;
1694 }
1695 break;
1696 }
1697
1698 for (cur_pipe = 0; cur_pipe < num_tile_pipes; ++cur_pipe) {
1699 while (((1 << cur_backend) & enabled_backends_mask) == 0)
1700 cur_backend = (cur_backend + 1) % EVERGREEN_MAX_BACKENDS;
1701
1702 backend_map |= (((cur_backend & 0xf) << (swizzle_pipe[cur_pipe] * 4)));
1703
1704 cur_backend = (cur_backend + 1) % EVERGREEN_MAX_BACKENDS;
1705 }
1706
1707 return backend_map;
1708}
1709
1710static void evergreen_gpu_init(struct radeon_device *rdev) 1561static void evergreen_gpu_init(struct radeon_device *rdev)
1711{ 1562{
1712 u32 cc_rb_backend_disable = 0; 1563 u32 gb_addr_config;
1713 u32 cc_gc_shader_pipe_config;
1714 u32 gb_addr_config = 0;
1715 u32 mc_shared_chmap, mc_arb_ramcfg; 1564 u32 mc_shared_chmap, mc_arb_ramcfg;
1716 u32 gb_backend_map;
1717 u32 grbm_gfx_index;
1718 u32 sx_debug_1; 1565 u32 sx_debug_1;
1719 u32 smx_dc_ctl0; 1566 u32 smx_dc_ctl0;
1720 u32 sq_config; 1567 u32 sq_config;
@@ -1729,6 +1576,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1729 u32 sq_stack_resource_mgmt_3; 1576 u32 sq_stack_resource_mgmt_3;
1730 u32 vgt_cache_invalidation; 1577 u32 vgt_cache_invalidation;
1731 u32 hdp_host_path_cntl, tmp; 1578 u32 hdp_host_path_cntl, tmp;
1579 u32 disabled_rb_mask;
1732 int i, j, num_shader_engines, ps_thread_count; 1580 int i, j, num_shader_engines, ps_thread_count;
1733 1581
1734 switch (rdev->family) { 1582 switch (rdev->family) {
@@ -1753,6 +1601,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1753 rdev->config.evergreen.sc_prim_fifo_size = 0x100; 1601 rdev->config.evergreen.sc_prim_fifo_size = 0x100;
1754 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 1602 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
1755 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 1603 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
1604 gb_addr_config = CYPRESS_GB_ADDR_CONFIG_GOLDEN;
1756 break; 1605 break;
1757 case CHIP_JUNIPER: 1606 case CHIP_JUNIPER:
1758 rdev->config.evergreen.num_ses = 1; 1607 rdev->config.evergreen.num_ses = 1;
@@ -1774,6 +1623,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1774 rdev->config.evergreen.sc_prim_fifo_size = 0x100; 1623 rdev->config.evergreen.sc_prim_fifo_size = 0x100;
1775 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 1624 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
1776 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 1625 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
1626 gb_addr_config = JUNIPER_GB_ADDR_CONFIG_GOLDEN;
1777 break; 1627 break;
1778 case CHIP_REDWOOD: 1628 case CHIP_REDWOOD:
1779 rdev->config.evergreen.num_ses = 1; 1629 rdev->config.evergreen.num_ses = 1;
@@ -1795,6 +1645,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1795 rdev->config.evergreen.sc_prim_fifo_size = 0x100; 1645 rdev->config.evergreen.sc_prim_fifo_size = 0x100;
1796 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 1646 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
1797 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 1647 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
1648 gb_addr_config = REDWOOD_GB_ADDR_CONFIG_GOLDEN;
1798 break; 1649 break;
1799 case CHIP_CEDAR: 1650 case CHIP_CEDAR:
1800 default: 1651 default:
@@ -1817,6 +1668,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1817 rdev->config.evergreen.sc_prim_fifo_size = 0x40; 1668 rdev->config.evergreen.sc_prim_fifo_size = 0x40;
1818 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 1669 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
1819 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 1670 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
1671 gb_addr_config = CEDAR_GB_ADDR_CONFIG_GOLDEN;
1820 break; 1672 break;
1821 case CHIP_PALM: 1673 case CHIP_PALM:
1822 rdev->config.evergreen.num_ses = 1; 1674 rdev->config.evergreen.num_ses = 1;
@@ -1838,6 +1690,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1838 rdev->config.evergreen.sc_prim_fifo_size = 0x40; 1690 rdev->config.evergreen.sc_prim_fifo_size = 0x40;
1839 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 1691 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
1840 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 1692 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
1693 gb_addr_config = CEDAR_GB_ADDR_CONFIG_GOLDEN;
1841 break; 1694 break;
1842 case CHIP_SUMO: 1695 case CHIP_SUMO:
1843 rdev->config.evergreen.num_ses = 1; 1696 rdev->config.evergreen.num_ses = 1;
@@ -1865,6 +1718,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1865 rdev->config.evergreen.sc_prim_fifo_size = 0x40; 1718 rdev->config.evergreen.sc_prim_fifo_size = 0x40;
1866 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 1719 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
1867 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 1720 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
1721 gb_addr_config = REDWOOD_GB_ADDR_CONFIG_GOLDEN;
1868 break; 1722 break;
1869 case CHIP_SUMO2: 1723 case CHIP_SUMO2:
1870 rdev->config.evergreen.num_ses = 1; 1724 rdev->config.evergreen.num_ses = 1;
@@ -1886,6 +1740,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1886 rdev->config.evergreen.sc_prim_fifo_size = 0x40; 1740 rdev->config.evergreen.sc_prim_fifo_size = 0x40;
1887 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 1741 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
1888 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 1742 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
1743 gb_addr_config = REDWOOD_GB_ADDR_CONFIG_GOLDEN;
1889 break; 1744 break;
1890 case CHIP_BARTS: 1745 case CHIP_BARTS:
1891 rdev->config.evergreen.num_ses = 2; 1746 rdev->config.evergreen.num_ses = 2;
@@ -1907,6 +1762,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1907 rdev->config.evergreen.sc_prim_fifo_size = 0x100; 1762 rdev->config.evergreen.sc_prim_fifo_size = 0x100;
1908 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 1763 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
1909 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 1764 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
1765 gb_addr_config = BARTS_GB_ADDR_CONFIG_GOLDEN;
1910 break; 1766 break;
1911 case CHIP_TURKS: 1767 case CHIP_TURKS:
1912 rdev->config.evergreen.num_ses = 1; 1768 rdev->config.evergreen.num_ses = 1;
@@ -1928,6 +1784,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1928 rdev->config.evergreen.sc_prim_fifo_size = 0x100; 1784 rdev->config.evergreen.sc_prim_fifo_size = 0x100;
1929 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 1785 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
1930 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 1786 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
1787 gb_addr_config = TURKS_GB_ADDR_CONFIG_GOLDEN;
1931 break; 1788 break;
1932 case CHIP_CAICOS: 1789 case CHIP_CAICOS:
1933 rdev->config.evergreen.num_ses = 1; 1790 rdev->config.evergreen.num_ses = 1;
@@ -1949,6 +1806,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1949 rdev->config.evergreen.sc_prim_fifo_size = 0x40; 1806 rdev->config.evergreen.sc_prim_fifo_size = 0x40;
1950 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 1807 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
1951 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 1808 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
1809 gb_addr_config = CAICOS_GB_ADDR_CONFIG_GOLDEN;
1952 break; 1810 break;
1953 } 1811 }
1954 1812
@@ -1965,20 +1823,6 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1965 1823
1966 evergreen_fix_pci_max_read_req_size(rdev); 1824 evergreen_fix_pci_max_read_req_size(rdev);
1967 1825
1968 cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & ~2;
1969
1970 cc_gc_shader_pipe_config |=
1971 INACTIVE_QD_PIPES((EVERGREEN_MAX_PIPES_MASK << rdev->config.evergreen.max_pipes)
1972 & EVERGREEN_MAX_PIPES_MASK);
1973 cc_gc_shader_pipe_config |=
1974 INACTIVE_SIMDS((EVERGREEN_MAX_SIMDS_MASK << rdev->config.evergreen.max_simds)
1975 & EVERGREEN_MAX_SIMDS_MASK);
1976
1977 cc_rb_backend_disable =
1978 BACKEND_DISABLE((EVERGREEN_MAX_BACKENDS_MASK << rdev->config.evergreen.max_backends)
1979 & EVERGREEN_MAX_BACKENDS_MASK);
1980
1981
1982 mc_shared_chmap = RREG32(MC_SHARED_CHMAP); 1826 mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
1983 if ((rdev->family == CHIP_PALM) || 1827 if ((rdev->family == CHIP_PALM) ||
1984 (rdev->family == CHIP_SUMO) || 1828 (rdev->family == CHIP_SUMO) ||
@@ -1987,134 +1831,6 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1987 else 1831 else
1988 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG); 1832 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
1989 1833
1990 switch (rdev->config.evergreen.max_tile_pipes) {
1991 case 1:
1992 default:
1993 gb_addr_config |= NUM_PIPES(0);
1994 break;
1995 case 2:
1996 gb_addr_config |= NUM_PIPES(1);
1997 break;
1998 case 4:
1999 gb_addr_config |= NUM_PIPES(2);
2000 break;
2001 case 8:
2002 gb_addr_config |= NUM_PIPES(3);
2003 break;
2004 }
2005
2006 gb_addr_config |= PIPE_INTERLEAVE_SIZE((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT);
2007 gb_addr_config |= BANK_INTERLEAVE_SIZE(0);
2008 gb_addr_config |= NUM_SHADER_ENGINES(rdev->config.evergreen.num_ses - 1);
2009 gb_addr_config |= SHADER_ENGINE_TILE_SIZE(1);
2010 gb_addr_config |= NUM_GPUS(0); /* Hemlock? */
2011 gb_addr_config |= MULTI_GPU_TILE_SIZE(2);
2012
2013 if (((mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT) > 2)
2014 gb_addr_config |= ROW_SIZE(2);
2015 else
2016 gb_addr_config |= ROW_SIZE((mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT);
2017
2018 if (rdev->ddev->pdev->device == 0x689e) {
2019 u32 efuse_straps_4;
2020 u32 efuse_straps_3;
2021 u8 efuse_box_bit_131_124;
2022
2023 WREG32(RCU_IND_INDEX, 0x204);
2024 efuse_straps_4 = RREG32(RCU_IND_DATA);
2025 WREG32(RCU_IND_INDEX, 0x203);
2026 efuse_straps_3 = RREG32(RCU_IND_DATA);
2027 efuse_box_bit_131_124 = (u8)(((efuse_straps_4 & 0xf) << 4) | ((efuse_straps_3 & 0xf0000000) >> 28));
2028
2029 switch(efuse_box_bit_131_124) {
2030 case 0x00:
2031 gb_backend_map = 0x76543210;
2032 break;
2033 case 0x55:
2034 gb_backend_map = 0x77553311;
2035 break;
2036 case 0x56:
2037 gb_backend_map = 0x77553300;
2038 break;
2039 case 0x59:
2040 gb_backend_map = 0x77552211;
2041 break;
2042 case 0x66:
2043 gb_backend_map = 0x77443300;
2044 break;
2045 case 0x99:
2046 gb_backend_map = 0x66552211;
2047 break;
2048 case 0x5a:
2049 gb_backend_map = 0x77552200;
2050 break;
2051 case 0xaa:
2052 gb_backend_map = 0x66442200;
2053 break;
2054 case 0x95:
2055 gb_backend_map = 0x66553311;
2056 break;
2057 default:
2058 DRM_ERROR("bad backend map, using default\n");
2059 gb_backend_map =
2060 evergreen_get_tile_pipe_to_backend_map(rdev,
2061 rdev->config.evergreen.max_tile_pipes,
2062 rdev->config.evergreen.max_backends,
2063 ((EVERGREEN_MAX_BACKENDS_MASK <<
2064 rdev->config.evergreen.max_backends) &
2065 EVERGREEN_MAX_BACKENDS_MASK));
2066 break;
2067 }
2068 } else if (rdev->ddev->pdev->device == 0x68b9) {
2069 u32 efuse_straps_3;
2070 u8 efuse_box_bit_127_124;
2071
2072 WREG32(RCU_IND_INDEX, 0x203);
2073 efuse_straps_3 = RREG32(RCU_IND_DATA);
2074 efuse_box_bit_127_124 = (u8)((efuse_straps_3 & 0xF0000000) >> 28);
2075
2076 switch(efuse_box_bit_127_124) {
2077 case 0x0:
2078 gb_backend_map = 0x00003210;
2079 break;
2080 case 0x5:
2081 case 0x6:
2082 case 0x9:
2083 case 0xa:
2084 gb_backend_map = 0x00003311;
2085 break;
2086 default:
2087 DRM_ERROR("bad backend map, using default\n");
2088 gb_backend_map =
2089 evergreen_get_tile_pipe_to_backend_map(rdev,
2090 rdev->config.evergreen.max_tile_pipes,
2091 rdev->config.evergreen.max_backends,
2092 ((EVERGREEN_MAX_BACKENDS_MASK <<
2093 rdev->config.evergreen.max_backends) &
2094 EVERGREEN_MAX_BACKENDS_MASK));
2095 break;
2096 }
2097 } else {
2098 switch (rdev->family) {
2099 case CHIP_CYPRESS:
2100 case CHIP_HEMLOCK:
2101 case CHIP_BARTS:
2102 gb_backend_map = 0x66442200;
2103 break;
2104 case CHIP_JUNIPER:
2105 gb_backend_map = 0x00002200;
2106 break;
2107 default:
2108 gb_backend_map =
2109 evergreen_get_tile_pipe_to_backend_map(rdev,
2110 rdev->config.evergreen.max_tile_pipes,
2111 rdev->config.evergreen.max_backends,
2112 ((EVERGREEN_MAX_BACKENDS_MASK <<
2113 rdev->config.evergreen.max_backends) &
2114 EVERGREEN_MAX_BACKENDS_MASK));
2115 }
2116 }
2117
2118 /* setup tiling info dword. gb_addr_config is not adequate since it does 1834 /* setup tiling info dword. gb_addr_config is not adequate since it does
2119 * not have bank info, so create a custom tiling dword. 1835 * not have bank info, so create a custom tiling dword.
2120 * bits 3:0 num_pipes 1836 * bits 3:0 num_pipes
@@ -2147,42 +1863,48 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
2147 else 1863 else
2148 rdev->config.evergreen.tile_config |= 0 << 4; 1864 rdev->config.evergreen.tile_config |= 0 << 4;
2149 } 1865 }
2150 rdev->config.evergreen.tile_config |= 1866 rdev->config.evergreen.tile_config |= 0 << 8;
2151 ((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT) << 8;
2152 rdev->config.evergreen.tile_config |= 1867 rdev->config.evergreen.tile_config |=
2153 ((gb_addr_config & 0x30000000) >> 28) << 12; 1868 ((gb_addr_config & 0x30000000) >> 28) << 12;
2154 1869
2155 rdev->config.evergreen.backend_map = gb_backend_map; 1870 num_shader_engines = (gb_addr_config & NUM_SHADER_ENGINES(3) >> 12) + 1;
2156 WREG32(GB_BACKEND_MAP, gb_backend_map);
2157 WREG32(GB_ADDR_CONFIG, gb_addr_config);
2158 WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
2159 WREG32(HDP_ADDR_CONFIG, gb_addr_config);
2160
2161 num_shader_engines = ((RREG32(GB_ADDR_CONFIG) & NUM_SHADER_ENGINES(3)) >> 12) + 1;
2162 grbm_gfx_index = INSTANCE_BROADCAST_WRITES;
2163 1871
2164 for (i = 0; i < rdev->config.evergreen.num_ses; i++) { 1872 if ((rdev->family >= CHIP_CEDAR) && (rdev->family <= CHIP_HEMLOCK)) {
2165 u32 rb = cc_rb_backend_disable | (0xf0 << 16); 1873 u32 efuse_straps_4;
2166 u32 sp = cc_gc_shader_pipe_config; 1874 u32 efuse_straps_3;
2167 u32 gfx = grbm_gfx_index | SE_INDEX(i);
2168 1875
2169 if (i == num_shader_engines) { 1876 WREG32(RCU_IND_INDEX, 0x204);
2170 rb |= BACKEND_DISABLE(EVERGREEN_MAX_BACKENDS_MASK); 1877 efuse_straps_4 = RREG32(RCU_IND_DATA);
2171 sp |= INACTIVE_SIMDS(EVERGREEN_MAX_SIMDS_MASK); 1878 WREG32(RCU_IND_INDEX, 0x203);
1879 efuse_straps_3 = RREG32(RCU_IND_DATA);
1880 tmp = (((efuse_straps_4 & 0xf) << 4) |
1881 ((efuse_straps_3 & 0xf0000000) >> 28));
1882 } else {
1883 tmp = 0;
1884 for (i = (rdev->config.evergreen.num_ses - 1); i >= 0; i--) {
1885 u32 rb_disable_bitmap;
1886
1887 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1888 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1889 rb_disable_bitmap = (RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000) >> 16;
1890 tmp <<= 4;
1891 tmp |= rb_disable_bitmap;
2172 } 1892 }
1893 }
1894 /* enabled rb are just the one not disabled :) */
1895 disabled_rb_mask = tmp;
2173 1896
2174 WREG32(GRBM_GFX_INDEX, gfx); 1897 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
2175 WREG32(RLC_GFX_INDEX, gfx); 1898 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
2176 1899
2177 WREG32(CC_RB_BACKEND_DISABLE, rb); 1900 WREG32(GB_ADDR_CONFIG, gb_addr_config);
2178 WREG32(CC_SYS_RB_BACKEND_DISABLE, rb); 1901 WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
2179 WREG32(GC_USER_RB_BACKEND_DISABLE, rb); 1902 WREG32(HDP_ADDR_CONFIG, gb_addr_config);
2180 WREG32(CC_GC_SHADER_PIPE_CONFIG, sp);
2181 }
2182 1903
2183 grbm_gfx_index = INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES; 1904 tmp = gb_addr_config & NUM_PIPES_MASK;
2184 WREG32(GRBM_GFX_INDEX, grbm_gfx_index); 1905 tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.evergreen.max_backends,
2185 WREG32(RLC_GFX_INDEX, grbm_gfx_index); 1906 EVERGREEN_MAX_BACKENDS, disabled_rb_mask);
1907 WREG32(GB_BACKEND_MAP, tmp);
2186 1908
2187 WREG32(CGTS_SYS_TCC_DISABLE, 0); 1909 WREG32(CGTS_SYS_TCC_DISABLE, 0);
2188 WREG32(CGTS_TCC_DISABLE, 0); 1910 WREG32(CGTS_TCC_DISABLE, 0);