diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gv11b/fifo_gv11b.c')
-rw-r--r-- | drivers/gpu/nvgpu/gv11b/fifo_gv11b.c | 71 |
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 | ||
1723 | static 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 | |||
1738 | static 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 | |||
1767 | static 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 | |||
1782 | void 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 | |||
1723 | void gv11b_init_fifo(struct gpu_ops *gops) | 1794 | void gv11b_init_fifo(struct gpu_ops *gops) |
1724 | { | 1795 | { |
1725 | gp10b_init_fifo(gops); | 1796 | gp10b_init_fifo(gops); |