diff options
author | Huang Rui <ray.huang@amd.com> | 2016-09-14 03:55:48 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-09-19 14:38:25 -0400 |
commit | 0b2138a45516ba83445a3c9a8aa38a1fb42c71bc (patch) | |
tree | be98e819f74d5fe7cf73d68ced0d030ddfde75a9 | |
parent | 865ab832ba78a1baf03fed90dccf5088e63a3aa3 (diff) |
drm/amdgpu: implement raster configuration for gfx v7
This patch is to implement the raster configuration and harvested
configuration of gfx v7.
Signed-off-by: Huang Rui <ray.huang@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Acked-by: Edward O'Callaghan <funfunctor@folklore1984.net>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cikd.h | 36 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | 160 |
2 files changed, 195 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/cikd.h b/drivers/gpu/drm/amd/amdgpu/cikd.h index c4f6f00d62bc..8659852aea9e 100644 --- a/drivers/gpu/drm/amd/amdgpu/cikd.h +++ b/drivers/gpu/drm/amd/amdgpu/cikd.h | |||
@@ -562,4 +562,40 @@ enum { | |||
562 | MTYPE_NONCACHED = 3 | 562 | MTYPE_NONCACHED = 3 |
563 | }; | 563 | }; |
564 | 564 | ||
565 | /* mmPA_SC_RASTER_CONFIG mask */ | ||
566 | #define RB_MAP_PKR0(x) ((x) << 0) | ||
567 | #define RB_MAP_PKR0_MASK (0x3 << 0) | ||
568 | #define RB_MAP_PKR1(x) ((x) << 2) | ||
569 | #define RB_MAP_PKR1_MASK (0x3 << 2) | ||
570 | #define RB_XSEL2(x) ((x) << 4) | ||
571 | #define RB_XSEL2_MASK (0x3 << 4) | ||
572 | #define RB_XSEL (1 << 6) | ||
573 | #define RB_YSEL (1 << 7) | ||
574 | #define PKR_MAP(x) ((x) << 8) | ||
575 | #define PKR_MAP_MASK (0x3 << 8) | ||
576 | #define PKR_XSEL(x) ((x) << 10) | ||
577 | #define PKR_XSEL_MASK (0x3 << 10) | ||
578 | #define PKR_YSEL(x) ((x) << 12) | ||
579 | #define PKR_YSEL_MASK (0x3 << 12) | ||
580 | #define SC_MAP(x) ((x) << 16) | ||
581 | #define SC_MAP_MASK (0x3 << 16) | ||
582 | #define SC_XSEL(x) ((x) << 18) | ||
583 | #define SC_XSEL_MASK (0x3 << 18) | ||
584 | #define SC_YSEL(x) ((x) << 20) | ||
585 | #define SC_YSEL_MASK (0x3 << 20) | ||
586 | #define SE_MAP(x) ((x) << 24) | ||
587 | #define SE_MAP_MASK (0x3 << 24) | ||
588 | #define SE_XSEL(x) ((x) << 26) | ||
589 | #define SE_XSEL_MASK (0x3 << 26) | ||
590 | #define SE_YSEL(x) ((x) << 28) | ||
591 | #define SE_YSEL_MASK (0x3 << 28) | ||
592 | |||
593 | /* mmPA_SC_RASTER_CONFIG_1 mask */ | ||
594 | #define SE_PAIR_MAP(x) ((x) << 0) | ||
595 | #define SE_PAIR_MAP_MASK (0x3 << 0) | ||
596 | #define SE_PAIR_XSEL(x) ((x) << 2) | ||
597 | #define SE_PAIR_XSEL_MASK (0x3 << 2) | ||
598 | #define SE_PAIR_YSEL(x) ((x) << 4) | ||
599 | #define SE_PAIR_YSEL_MASK (0x3 << 4) | ||
600 | |||
565 | #endif | 601 | #endif |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c index 90102f123bb8..32a676291e67 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | |||
@@ -1645,6 +1645,147 @@ static u32 gfx_v7_0_get_rb_active_bitmap(struct amdgpu_device *adev) | |||
1645 | return (~data) & mask; | 1645 | return (~data) & mask; |
1646 | } | 1646 | } |
1647 | 1647 | ||
1648 | static void | ||
1649 | gfx_v7_0_raster_config(struct amdgpu_device *adev, u32 *rconf, u32 *rconf1) | ||
1650 | { | ||
1651 | switch (adev->asic_type) { | ||
1652 | case CHIP_BONAIRE: | ||
1653 | *rconf |= RB_MAP_PKR0(2) | RB_XSEL2(1) | SE_MAP(2) | | ||
1654 | SE_XSEL(1) | SE_YSEL(1); | ||
1655 | *rconf1 |= 0x0; | ||
1656 | break; | ||
1657 | case CHIP_HAWAII: | ||
1658 | *rconf |= RB_MAP_PKR0(2) | RB_MAP_PKR1(2) | | ||
1659 | RB_XSEL2(1) | PKR_MAP(2) | PKR_XSEL(1) | | ||
1660 | PKR_YSEL(1) | SE_MAP(2) | SE_XSEL(2) | | ||
1661 | SE_YSEL(3); | ||
1662 | *rconf1 |= SE_PAIR_MAP(2) | SE_PAIR_XSEL(3) | | ||
1663 | SE_PAIR_YSEL(2); | ||
1664 | break; | ||
1665 | case CHIP_KAVERI: | ||
1666 | *rconf |= RB_MAP_PKR0(2); | ||
1667 | *rconf1 |= 0x0; | ||
1668 | break; | ||
1669 | case CHIP_KABINI: | ||
1670 | case CHIP_MULLINS: | ||
1671 | *rconf |= 0x0; | ||
1672 | *rconf1 |= 0x0; | ||
1673 | break; | ||
1674 | default: | ||
1675 | DRM_ERROR("unknown asic: 0x%x\n", adev->asic_type); | ||
1676 | break; | ||
1677 | } | ||
1678 | } | ||
1679 | |||
1680 | static void | ||
1681 | gfx_v7_0_write_harvested_raster_configs(struct amdgpu_device *adev, | ||
1682 | u32 raster_config, u32 raster_config_1, | ||
1683 | unsigned rb_mask, unsigned num_rb) | ||
1684 | { | ||
1685 | unsigned sh_per_se = max_t(unsigned, adev->gfx.config.max_sh_per_se, 1); | ||
1686 | unsigned num_se = max_t(unsigned, adev->gfx.config.max_shader_engines, 1); | ||
1687 | unsigned rb_per_pkr = min_t(unsigned, num_rb / num_se / sh_per_se, 2); | ||
1688 | unsigned rb_per_se = num_rb / num_se; | ||
1689 | unsigned se_mask[4]; | ||
1690 | unsigned se; | ||
1691 | |||
1692 | se_mask[0] = ((1 << rb_per_se) - 1) & rb_mask; | ||
1693 | se_mask[1] = (se_mask[0] << rb_per_se) & rb_mask; | ||
1694 | se_mask[2] = (se_mask[1] << rb_per_se) & rb_mask; | ||
1695 | se_mask[3] = (se_mask[2] << rb_per_se) & rb_mask; | ||
1696 | |||
1697 | WARN_ON(!(num_se == 1 || num_se == 2 || num_se == 4)); | ||
1698 | WARN_ON(!(sh_per_se == 1 || sh_per_se == 2)); | ||
1699 | WARN_ON(!(rb_per_pkr == 1 || rb_per_pkr == 2)); | ||
1700 | |||
1701 | if ((num_se > 2) && ((!se_mask[0] && !se_mask[1]) || | ||
1702 | (!se_mask[2] && !se_mask[3]))) { | ||
1703 | raster_config_1 &= ~SE_PAIR_MAP_MASK; | ||
1704 | |||
1705 | if (!se_mask[0] && !se_mask[1]) { | ||
1706 | raster_config_1 |= | ||
1707 | SE_PAIR_MAP(RASTER_CONFIG_SE_PAIR_MAP_3); | ||
1708 | } else { | ||
1709 | raster_config_1 |= | ||
1710 | SE_PAIR_MAP(RASTER_CONFIG_SE_PAIR_MAP_0); | ||
1711 | } | ||
1712 | } | ||
1713 | |||
1714 | for (se = 0; se < num_se; se++) { | ||
1715 | unsigned raster_config_se = raster_config; | ||
1716 | unsigned pkr0_mask = ((1 << rb_per_pkr) - 1) << (se * rb_per_se); | ||
1717 | unsigned pkr1_mask = pkr0_mask << rb_per_pkr; | ||
1718 | int idx = (se / 2) * 2; | ||
1719 | |||
1720 | if ((num_se > 1) && (!se_mask[idx] || !se_mask[idx + 1])) { | ||
1721 | raster_config_se &= ~SE_MAP_MASK; | ||
1722 | |||
1723 | if (!se_mask[idx]) { | ||
1724 | raster_config_se |= SE_MAP(RASTER_CONFIG_SE_MAP_3); | ||
1725 | } else { | ||
1726 | raster_config_se |= SE_MAP(RASTER_CONFIG_SE_MAP_0); | ||
1727 | } | ||
1728 | } | ||
1729 | |||
1730 | pkr0_mask &= rb_mask; | ||
1731 | pkr1_mask &= rb_mask; | ||
1732 | if (rb_per_se > 2 && (!pkr0_mask || !pkr1_mask)) { | ||
1733 | raster_config_se &= ~PKR_MAP_MASK; | ||
1734 | |||
1735 | if (!pkr0_mask) { | ||
1736 | raster_config_se |= PKR_MAP(RASTER_CONFIG_PKR_MAP_3); | ||
1737 | } else { | ||
1738 | raster_config_se |= PKR_MAP(RASTER_CONFIG_PKR_MAP_0); | ||
1739 | } | ||
1740 | } | ||
1741 | |||
1742 | if (rb_per_se >= 2) { | ||
1743 | unsigned rb0_mask = 1 << (se * rb_per_se); | ||
1744 | unsigned rb1_mask = rb0_mask << 1; | ||
1745 | |||
1746 | rb0_mask &= rb_mask; | ||
1747 | rb1_mask &= rb_mask; | ||
1748 | if (!rb0_mask || !rb1_mask) { | ||
1749 | raster_config_se &= ~RB_MAP_PKR0_MASK; | ||
1750 | |||
1751 | if (!rb0_mask) { | ||
1752 | raster_config_se |= | ||
1753 | RB_MAP_PKR0(RASTER_CONFIG_RB_MAP_3); | ||
1754 | } else { | ||
1755 | raster_config_se |= | ||
1756 | RB_MAP_PKR0(RASTER_CONFIG_RB_MAP_0); | ||
1757 | } | ||
1758 | } | ||
1759 | |||
1760 | if (rb_per_se > 2) { | ||
1761 | rb0_mask = 1 << (se * rb_per_se + rb_per_pkr); | ||
1762 | rb1_mask = rb0_mask << 1; | ||
1763 | rb0_mask &= rb_mask; | ||
1764 | rb1_mask &= rb_mask; | ||
1765 | if (!rb0_mask || !rb1_mask) { | ||
1766 | raster_config_se &= ~RB_MAP_PKR1_MASK; | ||
1767 | |||
1768 | if (!rb0_mask) { | ||
1769 | raster_config_se |= | ||
1770 | RB_MAP_PKR1(RASTER_CONFIG_RB_MAP_3); | ||
1771 | } else { | ||
1772 | raster_config_se |= | ||
1773 | RB_MAP_PKR1(RASTER_CONFIG_RB_MAP_0); | ||
1774 | } | ||
1775 | } | ||
1776 | } | ||
1777 | } | ||
1778 | |||
1779 | /* GRBM_GFX_INDEX has a different offset on CI+ */ | ||
1780 | gfx_v7_0_select_se_sh(adev, se, 0xffffffff, 0xffffffff); | ||
1781 | WREG32(mmPA_SC_RASTER_CONFIG, raster_config_se); | ||
1782 | WREG32(mmPA_SC_RASTER_CONFIG_1, raster_config_1); | ||
1783 | } | ||
1784 | |||
1785 | /* GRBM_GFX_INDEX has a different offset on CI+ */ | ||
1786 | gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); | ||
1787 | } | ||
1788 | |||
1648 | /** | 1789 | /** |
1649 | * gfx_v7_0_setup_rb - setup the RBs on the asic | 1790 | * gfx_v7_0_setup_rb - setup the RBs on the asic |
1650 | * | 1791 | * |
@@ -1658,9 +1799,11 @@ static void gfx_v7_0_setup_rb(struct amdgpu_device *adev) | |||
1658 | { | 1799 | { |
1659 | int i, j; | 1800 | int i, j; |
1660 | u32 data; | 1801 | u32 data; |
1802 | u32 raster_config = 0, raster_config_1 = 0; | ||
1661 | u32 active_rbs = 0; | 1803 | u32 active_rbs = 0; |
1662 | u32 rb_bitmap_width_per_sh = adev->gfx.config.max_backends_per_se / | 1804 | u32 rb_bitmap_width_per_sh = adev->gfx.config.max_backends_per_se / |
1663 | adev->gfx.config.max_sh_per_se; | 1805 | adev->gfx.config.max_sh_per_se; |
1806 | unsigned num_rb_pipes; | ||
1664 | 1807 | ||
1665 | mutex_lock(&adev->grbm_idx_mutex); | 1808 | mutex_lock(&adev->grbm_idx_mutex); |
1666 | for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { | 1809 | for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { |
@@ -1672,10 +1815,25 @@ static void gfx_v7_0_setup_rb(struct amdgpu_device *adev) | |||
1672 | } | 1815 | } |
1673 | } | 1816 | } |
1674 | gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); | 1817 | gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); |
1675 | mutex_unlock(&adev->grbm_idx_mutex); | ||
1676 | 1818 | ||
1677 | adev->gfx.config.backend_enable_mask = active_rbs; | 1819 | adev->gfx.config.backend_enable_mask = active_rbs; |
1678 | adev->gfx.config.num_rbs = hweight32(active_rbs); | 1820 | adev->gfx.config.num_rbs = hweight32(active_rbs); |
1821 | |||
1822 | num_rb_pipes = min_t(unsigned, adev->gfx.config.max_backends_per_se * | ||
1823 | adev->gfx.config.max_shader_engines, 16); | ||
1824 | |||
1825 | gfx_v7_0_raster_config(adev, &raster_config, &raster_config_1); | ||
1826 | |||
1827 | if (!adev->gfx.config.backend_enable_mask || | ||
1828 | adev->gfx.config.num_rbs >= num_rb_pipes) { | ||
1829 | WREG32(mmPA_SC_RASTER_CONFIG, raster_config); | ||
1830 | WREG32(mmPA_SC_RASTER_CONFIG_1, raster_config_1); | ||
1831 | } else { | ||
1832 | gfx_v7_0_write_harvested_raster_configs(adev, raster_config, raster_config_1, | ||
1833 | adev->gfx.config.backend_enable_mask, | ||
1834 | num_rb_pipes); | ||
1835 | } | ||
1836 | mutex_unlock(&adev->grbm_idx_mutex); | ||
1679 | } | 1837 | } |
1680 | 1838 | ||
1681 | /** | 1839 | /** |