summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c
diff options
context:
space:
mode:
authorDeepak Nibade <dnibade@nvidia.com>2018-04-28 10:34:46 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2018-05-16 06:10:49 -0400
commite5000d299f84432f63b30c0bd43841046c704f04 (patch)
treeacb11e42f0d38c4801692b15be04048038d88052 /drivers/gpu/nvgpu/gv11b/fifo_gv11b.c
parent0301cc01f6cbfb752290bc63a2ed4eb19129c7c1 (diff)
gpu: nvgpu: implement new host semaphore methods for Volta
Semaphore methods currently being used in Volta are deprecated for future chips And on Volta we support both old and new methods So replace old methods by new methods on Volta itself so that new methods get tested on silicon Implement below HALs for Volta with new semaphore methods gops.fifo.add_sema_cmd() to insert HOST semaphore acquire/release methods gops.fifo.get_sema_wait_cmd_size() to get size of acquire command buffer gops.fifo.get_sema_incr_cmd_size() to get size of release command buffer Also use new methods in these APIs gv11b_fifo_add_syncpt_wait_cmd() gv11b_fifo_add_syncpt_incr_cmd() And change corresponding APIs to reflect correct size of command buffer gv11b_fifo_get_syncpt_wait_cmd_size() gv11b_fifo_get_syncpt_incr_cmd_size() Jira NVGPUT-16 Change-Id: Ia3a37cd0560ddb54761dfea9bd28c4384cd8a11c Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1704518 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gv11b/fifo_gv11b.c')
-rw-r--r--drivers/gpu/nvgpu/gv11b/fifo_gv11b.c114
1 files changed, 83 insertions, 31 deletions
diff --git a/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c b/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c
index b374e517..9843c7de 100644
--- a/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c
+++ b/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c
@@ -1659,6 +1659,55 @@ void gv11b_fifo_deinit_eng_method_buffers(struct gk20a *g,
1659 nvgpu_log_info(g, "eng method buffers de-allocated"); 1659 nvgpu_log_info(g, "eng method buffers de-allocated");
1660} 1660}
1661 1661
1662u32 gv11b_fifo_get_sema_wait_cmd_size(void)
1663{
1664 return 10;
1665}
1666
1667u32 gv11b_fifo_get_sema_incr_cmd_size(void)
1668{
1669 return 12;
1670}
1671
1672void gv11b_fifo_add_sema_cmd(struct gk20a *g,
1673 struct nvgpu_semaphore *s, u64 sema_va,
1674 struct priv_cmd_entry *cmd,
1675 u32 off, bool acquire, bool wfi)
1676{
1677 nvgpu_log_fn(g, " ");
1678
1679 /* sema_addr_lo */
1680 nvgpu_mem_wr32(g, cmd->mem, off++, 0x20010017);
1681 nvgpu_mem_wr32(g, cmd->mem, off++, sema_va & 0xffffffff);
1682
1683 /* sema_addr_hi */
1684 nvgpu_mem_wr32(g, cmd->mem, off++, 0x20010018);
1685 nvgpu_mem_wr32(g, cmd->mem, off++, (sema_va >> 32) & 0xff);
1686
1687 /* payload_lo */
1688 nvgpu_mem_wr32(g, cmd->mem, off++, 0x20010019);
1689 nvgpu_mem_wr32(g, cmd->mem, off++, nvgpu_semaphore_get_value(s));
1690
1691 /* payload_hi : ignored */
1692 nvgpu_mem_wr32(g, cmd->mem, off++, 0x2001001a);
1693 nvgpu_mem_wr32(g, cmd->mem, off++, 0);
1694
1695 if (acquire) {
1696 /* sema_execute : acq_strict_geq | switch_en | 32bit */
1697 nvgpu_mem_wr32(g, cmd->mem, off++, 0x2001001b);
1698 nvgpu_mem_wr32(g, cmd->mem, off++, 0x2 | (1 << 12));
1699 } else {
1700 /* sema_execute : release | wfi | 32bit */
1701 nvgpu_mem_wr32(g, cmd->mem, off++, 0x2001001b);
1702 nvgpu_mem_wr32(g, cmd->mem, off++,
1703 0x1 | ((wfi ? 0x1 : 0x0) << 20));
1704
1705 /* non_stall_int : payload is ignored */
1706 nvgpu_mem_wr32(g, cmd->mem, off++, 0x20010008);
1707 nvgpu_mem_wr32(g, cmd->mem, off++, 0);
1708 }
1709}
1710
1662#ifdef CONFIG_TEGRA_GK20A_NVHOST 1711#ifdef CONFIG_TEGRA_GK20A_NVHOST
1663static int set_syncpt_ro_map_gpu_va_locked(struct vm_gk20a *vm) 1712static int set_syncpt_ro_map_gpu_va_locked(struct vm_gk20a *vm)
1664{ 1713{
@@ -1751,28 +1800,30 @@ void gv11b_fifo_add_syncpt_wait_cmd(struct gk20a *g,
1751 1800
1752 off = cmd->off + off; 1801 off = cmd->off + off;
1753 1802
1754 /* semaphore_a */ 1803 /* sema_addr_lo */
1755 nvgpu_mem_wr32(g, cmd->mem, off++, 0x20010004); 1804 nvgpu_mem_wr32(g, cmd->mem, off++, 0x20010017);
1756 nvgpu_mem_wr32(g, cmd->mem, off++,
1757 (gpu_va >> 32) & 0xff);
1758 /* semaphore_b */
1759 nvgpu_mem_wr32(g, cmd->mem, off++, 0x20010005);
1760 /* offset */
1761 nvgpu_mem_wr32(g, cmd->mem, off++, gpu_va & 0xffffffff); 1805 nvgpu_mem_wr32(g, cmd->mem, off++, gpu_va & 0xffffffff);
1762 1806
1763 /* semaphore_c */ 1807 /* sema_addr_hi */
1764 nvgpu_mem_wr32(g, cmd->mem, off++, 0x20010006); 1808 nvgpu_mem_wr32(g, cmd->mem, off++, 0x20010018);
1765 /* payload */ 1809 nvgpu_mem_wr32(g, cmd->mem, off++, (gpu_va >> 32) & 0xff);
1810
1811 /* payload_lo */
1812 nvgpu_mem_wr32(g, cmd->mem, off++, 0x20010019);
1766 nvgpu_mem_wr32(g, cmd->mem, off++, thresh); 1813 nvgpu_mem_wr32(g, cmd->mem, off++, thresh);
1767 /* semaphore_d */ 1814
1768 nvgpu_mem_wr32(g, cmd->mem, off++, 0x20010007); 1815 /* payload_hi : ignored */
1769 /* operation: acq_geq, switch_en */ 1816 nvgpu_mem_wr32(g, cmd->mem, off++, 0x2001001a);
1770 nvgpu_mem_wr32(g, cmd->mem, off++, 0x4 | (0x1 << 12)); 1817 nvgpu_mem_wr32(g, cmd->mem, off++, 0);
1818
1819 /* sema_execute : acq_strict_geq | switch_en | 32bit */
1820 nvgpu_mem_wr32(g, cmd->mem, off++, 0x2001001b);
1821 nvgpu_mem_wr32(g, cmd->mem, off++, 0x2 | (1 << 12));
1771} 1822}
1772 1823
1773u32 gv11b_fifo_get_syncpt_wait_cmd_size(void) 1824u32 gv11b_fifo_get_syncpt_wait_cmd_size(void)
1774{ 1825{
1775 return 8; 1826 return 10;
1776} 1827}
1777 1828
1778u32 gv11b_fifo_get_syncpt_incr_per_release(void) 1829u32 gv11b_fifo_get_syncpt_incr_per_release(void)
@@ -1788,30 +1839,31 @@ void gv11b_fifo_add_syncpt_incr_cmd(struct gk20a *g,
1788 1839
1789 nvgpu_log_fn(g, " "); 1840 nvgpu_log_fn(g, " ");
1790 1841
1791 /* semaphore_a */ 1842 /* sema_addr_lo */
1792 nvgpu_mem_wr32(g, cmd->mem, off++, 0x20010004); 1843 nvgpu_mem_wr32(g, cmd->mem, off++, 0x20010017);
1793 nvgpu_mem_wr32(g, cmd->mem, off++,
1794 (gpu_va >> 32) & 0xff);
1795 /* semaphore_b */
1796 nvgpu_mem_wr32(g, cmd->mem, off++, 0x20010005);
1797 /* offset */
1798 nvgpu_mem_wr32(g, cmd->mem, off++, gpu_va & 0xffffffff); 1844 nvgpu_mem_wr32(g, cmd->mem, off++, gpu_va & 0xffffffff);
1799 1845
1800 /* semaphore_c */ 1846 /* sema_addr_hi */
1801 nvgpu_mem_wr32(g, cmd->mem, off++, 0x20010006); 1847 nvgpu_mem_wr32(g, cmd->mem, off++, 0x20010018);
1802 /* payload */ 1848 nvgpu_mem_wr32(g, cmd->mem, off++, (gpu_va >> 32) & 0xff);
1803 nvgpu_mem_wr32(g, cmd->mem, off++, 0x0); 1849
1804 /* semaphore_d */ 1850 /* payload_lo */
1805 nvgpu_mem_wr32(g, cmd->mem, off++, 0x20010007); 1851 nvgpu_mem_wr32(g, cmd->mem, off++, 0x20010019);
1852 nvgpu_mem_wr32(g, cmd->mem, off++, 0);
1853
1854 /* payload_hi : ignored */
1855 nvgpu_mem_wr32(g, cmd->mem, off++, 0x2001001a);
1856 nvgpu_mem_wr32(g, cmd->mem, off++, 0);
1806 1857
1807 /* operation: 4 byte payload, release, wfi */ 1858 /* sema_execute : release | wfi | 32bit */
1859 nvgpu_mem_wr32(g, cmd->mem, off++, 0x2001001b);
1808 nvgpu_mem_wr32(g, cmd->mem, off++, 1860 nvgpu_mem_wr32(g, cmd->mem, off++,
1809 (0x1 << 24) | 0x2 | ((wfi_cmd ? 0x0 : 0x1) << 20)); 1861 0x1 | ((wfi_cmd ? 0x1 : 0x0) << 20));
1810} 1862}
1811 1863
1812u32 gv11b_fifo_get_syncpt_incr_cmd_size(bool wfi_cmd) 1864u32 gv11b_fifo_get_syncpt_incr_cmd_size(bool wfi_cmd)
1813{ 1865{
1814 return 8; 1866 return 10;
1815} 1867}
1816#endif /* CONFIG_TEGRA_GK20A_NVHOST */ 1868#endif /* CONFIG_TEGRA_GK20A_NVHOST */
1817 1869