diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2012-05-31 19:00:25 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-06-01 12:00:14 -0400 |
commit | 416a2bd274566a6f607a271f524b2dc0b84d9106 (patch) | |
tree | 502720262c07cdb14bc14155bc8295cc20a7d411 /drivers/gpu/drm/radeon/evergreen.c | |
parent | 95c4b23ec4e2fa5604df229ddf134e31d7b3b378 (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.c | 368 |
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 | */ |
1561 | static 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 | |||
1710 | static void evergreen_gpu_init(struct radeon_device *rdev) | 1561 | static 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); |