summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/nvgpu/gk20a/fifo_gk20a.c48
1 files changed, 12 insertions, 36 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
index 1f7b78f9..c8cc4373 100644
--- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
@@ -1527,7 +1527,7 @@ int gk20a_fifo_preempt_channel(struct gk20a *g, u32 hw_chid)
1527 u32 delay = GR_IDLE_CHECK_DEFAULT; 1527 u32 delay = GR_IDLE_CHECK_DEFAULT;
1528 u32 ret = 0; 1528 u32 ret = 0;
1529 u32 token = PMU_INVALID_MUTEX_OWNER_ID; 1529 u32 token = PMU_INVALID_MUTEX_OWNER_ID;
1530 u32 elpg_off = 0; 1530 u32 mutex_ret = 0;
1531 u32 i; 1531 u32 i;
1532 1532
1533 gk20a_dbg_fn("%d", hw_chid); 1533 gk20a_dbg_fn("%d", hw_chid);
@@ -1536,10 +1536,7 @@ int gk20a_fifo_preempt_channel(struct gk20a *g, u32 hw_chid)
1536 for (i = 0; i < g->fifo.max_runlists; i++) 1536 for (i = 0; i < g->fifo.max_runlists; i++)
1537 mutex_lock(&f->runlist_info[i].mutex); 1537 mutex_lock(&f->runlist_info[i].mutex);
1538 1538
1539 /* disable elpg if failed to acquire pmu mutex */ 1539 mutex_ret = pmu_mutex_acquire(&g->pmu, PMU_MUTEX_ID_FIFO, &token);
1540 elpg_off = pmu_mutex_acquire(&g->pmu, PMU_MUTEX_ID_FIFO, &token);
1541 if (elpg_off)
1542 gk20a_pmu_disable_elpg(g);
1543 1540
1544 /* issue preempt */ 1541 /* issue preempt */
1545 gk20a_writel(g, fifo_preempt_r(), 1542 gk20a_writel(g, fifo_preempt_r(),
@@ -1571,10 +1568,7 @@ int gk20a_fifo_preempt_channel(struct gk20a *g, u32 hw_chid)
1571 gk20a_fifo_recover_ch(g, hw_chid, true); 1568 gk20a_fifo_recover_ch(g, hw_chid, true);
1572 } 1569 }
1573 1570
1574 /* re-enable elpg or release pmu mutex */ 1571 if (!mutex_ret)
1575 if (elpg_off)
1576 gk20a_pmu_enable_elpg(g);
1577 else
1578 pmu_mutex_release(&g->pmu, PMU_MUTEX_ID_FIFO, &token); 1572 pmu_mutex_release(&g->pmu, PMU_MUTEX_ID_FIFO, &token);
1579 1573
1580 for (i = 0; i < g->fifo.max_runlists; i++) 1574 for (i = 0; i < g->fifo.max_runlists; i++)
@@ -1587,24 +1581,18 @@ int gk20a_fifo_enable_engine_activity(struct gk20a *g,
1587 struct fifo_engine_info_gk20a *eng_info) 1581 struct fifo_engine_info_gk20a *eng_info)
1588{ 1582{
1589 u32 token = PMU_INVALID_MUTEX_OWNER_ID; 1583 u32 token = PMU_INVALID_MUTEX_OWNER_ID;
1590 u32 elpg_off; 1584 u32 mutex_ret;
1591 u32 enable; 1585 u32 enable;
1592 1586
1593 gk20a_dbg_fn(""); 1587 gk20a_dbg_fn("");
1594 1588
1595 /* disable elpg if failed to acquire pmu mutex */ 1589 mutex_ret = pmu_mutex_acquire(&g->pmu, PMU_MUTEX_ID_FIFO, &token);
1596 elpg_off = pmu_mutex_acquire(&g->pmu, PMU_MUTEX_ID_FIFO, &token);
1597 if (elpg_off)
1598 gk20a_pmu_disable_elpg(g);
1599 1590
1600 enable = gk20a_readl(g, fifo_sched_disable_r()); 1591 enable = gk20a_readl(g, fifo_sched_disable_r());
1601 enable &= ~(fifo_sched_disable_true_v() >> eng_info->runlist_id); 1592 enable &= ~(fifo_sched_disable_true_v() >> eng_info->runlist_id);
1602 gk20a_writel(g, fifo_sched_disable_r(), enable); 1593 gk20a_writel(g, fifo_sched_disable_r(), enable);
1603 1594
1604 /* re-enable elpg or release pmu mutex */ 1595 if (!mutex_ret)
1605 if (elpg_off)
1606 gk20a_pmu_enable_elpg(g);
1607 else
1608 pmu_mutex_release(&g->pmu, PMU_MUTEX_ID_FIFO, &token); 1596 pmu_mutex_release(&g->pmu, PMU_MUTEX_ID_FIFO, &token);
1609 1597
1610 gk20a_dbg_fn("done"); 1598 gk20a_dbg_fn("done");
@@ -1618,7 +1606,7 @@ int gk20a_fifo_disable_engine_activity(struct gk20a *g,
1618 u32 gr_stat, pbdma_stat, chan_stat, eng_stat, ctx_stat; 1606 u32 gr_stat, pbdma_stat, chan_stat, eng_stat, ctx_stat;
1619 u32 pbdma_chid = ~0, engine_chid = ~0, disable; 1607 u32 pbdma_chid = ~0, engine_chid = ~0, disable;
1620 u32 token = PMU_INVALID_MUTEX_OWNER_ID; 1608 u32 token = PMU_INVALID_MUTEX_OWNER_ID;
1621 u32 elpg_off; 1609 u32 mutex_ret;
1622 u32 err = 0; 1610 u32 err = 0;
1623 1611
1624 gk20a_dbg_fn(""); 1612 gk20a_dbg_fn("");
@@ -1629,10 +1617,7 @@ int gk20a_fifo_disable_engine_activity(struct gk20a *g,
1629 fifo_engine_status_engine_busy_v() && !wait_for_idle) 1617 fifo_engine_status_engine_busy_v() && !wait_for_idle)
1630 return -EBUSY; 1618 return -EBUSY;
1631 1619
1632 /* disable elpg if failed to acquire pmu mutex */ 1620 mutex_ret = pmu_mutex_acquire(&g->pmu, PMU_MUTEX_ID_FIFO, &token);
1633 elpg_off = pmu_mutex_acquire(&g->pmu, PMU_MUTEX_ID_FIFO, &token);
1634 if (elpg_off)
1635 gk20a_pmu_disable_elpg(g);
1636 1621
1637 disable = gk20a_readl(g, fifo_sched_disable_r()); 1622 disable = gk20a_readl(g, fifo_sched_disable_r());
1638 disable = set_field(disable, 1623 disable = set_field(disable,
@@ -1674,10 +1659,7 @@ int gk20a_fifo_disable_engine_activity(struct gk20a *g,
1674 } 1659 }
1675 1660
1676clean_up: 1661clean_up:
1677 /* re-enable elpg or release pmu mutex */ 1662 if (!mutex_ret)
1678 if (elpg_off)
1679 gk20a_pmu_enable_elpg(g);
1680 else
1681 pmu_mutex_release(&g->pmu, PMU_MUTEX_ID_FIFO, &token); 1663 pmu_mutex_release(&g->pmu, PMU_MUTEX_ID_FIFO, &token);
1682 1664
1683 if (err) { 1665 if (err) {
@@ -1903,25 +1885,19 @@ int gk20a_fifo_update_runlist(struct gk20a *g, u32 runlist_id, u32 hw_chid,
1903 struct fifo_runlist_info_gk20a *runlist = NULL; 1885 struct fifo_runlist_info_gk20a *runlist = NULL;
1904 struct fifo_gk20a *f = &g->fifo; 1886 struct fifo_gk20a *f = &g->fifo;
1905 u32 token = PMU_INVALID_MUTEX_OWNER_ID; 1887 u32 token = PMU_INVALID_MUTEX_OWNER_ID;
1906 u32 elpg_off; 1888 u32 mutex_ret;
1907 u32 ret = 0; 1889 u32 ret = 0;
1908 1890
1909 runlist = &f->runlist_info[runlist_id]; 1891 runlist = &f->runlist_info[runlist_id];
1910 1892
1911 mutex_lock(&runlist->mutex); 1893 mutex_lock(&runlist->mutex);
1912 1894
1913 /* disable elpg if failed to acquire pmu mutex */ 1895 mutex_ret = pmu_mutex_acquire(&g->pmu, PMU_MUTEX_ID_FIFO, &token);
1914 elpg_off = pmu_mutex_acquire(&g->pmu, PMU_MUTEX_ID_FIFO, &token);
1915 if (elpg_off)
1916 gk20a_pmu_disable_elpg(g);
1917 1896
1918 ret = gk20a_fifo_update_runlist_locked(g, runlist_id, hw_chid, add, 1897 ret = gk20a_fifo_update_runlist_locked(g, runlist_id, hw_chid, add,
1919 wait_for_finish); 1898 wait_for_finish);
1920 1899
1921 /* re-enable elpg or release pmu mutex */ 1900 if (!mutex_ret)
1922 if (elpg_off)
1923 gk20a_pmu_enable_elpg(g);
1924 else
1925 pmu_mutex_release(&g->pmu, PMU_MUTEX_ID_FIFO, &token); 1901 pmu_mutex_release(&g->pmu, PMU_MUTEX_ID_FIFO, &token);
1926 1902
1927 mutex_unlock(&runlist->mutex); 1903 mutex_unlock(&runlist->mutex);