summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c
diff options
context:
space:
mode:
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