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.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c b/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c
index b0d182dc..b0270150 100644
--- a/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c
+++ b/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c
@@ -1720,6 +1720,77 @@ static int gv11b_init_fifo_setup_hw(struct gk20a *g)
1720 return 0; 1720 return 0;
1721} 1721}
1722 1722
1723static u32 gv11b_mmu_fault_id_to_gr_veid(struct gk20a *g, u32 gr_eng_fault_id,
1724 u32 mmu_fault_id)
1725{
1726 u32 num_subctx;
1727 u32 veid = FIFO_INVAL_VEID;
1728
1729 num_subctx = gv11b_get_max_subctx_count(g);
1730
1731 if (mmu_fault_id >= gr_eng_fault_id &&
1732 mmu_fault_id < (gr_eng_fault_id + num_subctx))
1733 veid = mmu_fault_id - gr_eng_fault_id;
1734
1735 return veid;
1736}
1737
1738static u32 gv11b_mmu_fault_id_to_eng_id_and_veid(struct gk20a *g,
1739 u32 mmu_fault_id, u32 *veid)
1740{
1741 u32 engine_id;
1742 u32 active_engine_id;
1743 struct fifo_engine_info_gk20a *engine_info;
1744 struct fifo_gk20a *f = &g->fifo;
1745
1746
1747 for (engine_id = 0; engine_id < f->num_engines; engine_id++) {
1748 active_engine_id = f->active_engines_list[engine_id];
1749 engine_info = &g->fifo.engine_info[active_engine_id];
1750
1751 if (active_engine_id == ENGINE_GR_GK20A) {
1752 /* get faulted subctx id */
1753 *veid = gv11b_mmu_fault_id_to_gr_veid(g,
1754 engine_info->fault_id, mmu_fault_id);
1755 if (*veid != FIFO_INVAL_VEID)
1756 break;
1757 } else {
1758 if (engine_info->fault_id == mmu_fault_id)
1759 break;
1760 }
1761
1762 active_engine_id = FIFO_INVAL_ENGINE_ID;
1763 }
1764 return active_engine_id;
1765}
1766
1767static u32 gv11b_mmu_fault_id_to_pbdma_id(struct gk20a *g, u32 mmu_fault_id)
1768{
1769 u32 num_pbdma, reg_val, fault_id_pbdma0;
1770
1771 reg_val = gk20a_readl(g, fifo_cfg0_r());
1772 num_pbdma = fifo_cfg0_num_pbdma_v(reg_val);
1773 fault_id_pbdma0 = fifo_cfg0_pbdma_fault_id_v(reg_val);
1774
1775 if (mmu_fault_id >= fault_id_pbdma0 &&
1776 mmu_fault_id <= fault_id_pbdma0 + num_pbdma - 1)
1777 return mmu_fault_id - fault_id_pbdma0;
1778
1779 return FIFO_INVAL_PBDMA_ID;
1780}
1781
1782void gv11b_mmu_fault_id_to_eng_pbdma_id_and_veid(struct gk20a *g,
1783 u32 mmu_fault_id, u32 *active_engine_id, u32 *veid, u32 *pbdma_id)
1784{
1785 *active_engine_id = gv11b_mmu_fault_id_to_eng_id_and_veid(g,
1786 mmu_fault_id, veid);
1787
1788 if (*active_engine_id == FIFO_INVAL_ENGINE_ID)
1789 *pbdma_id = gv11b_mmu_fault_id_to_pbdma_id(g, mmu_fault_id);
1790 else
1791 *pbdma_id = FIFO_INVAL_PBDMA_ID;
1792}
1793
1723void gv11b_init_fifo(struct gpu_ops *gops) 1794void gv11b_init_fifo(struct gpu_ops *gops)
1724{ 1795{
1725 gp10b_init_fifo(gops); 1796 gp10b_init_fifo(gops);