diff options
-rw-r--r-- | drivers/gpu/nvgpu/gv11b/mm_gv11b.c | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/drivers/gpu/nvgpu/gv11b/mm_gv11b.c b/drivers/gpu/nvgpu/gv11b/mm_gv11b.c index 439bf9ed..8d307d7c 100644 --- a/drivers/gpu/nvgpu/gv11b/mm_gv11b.c +++ b/drivers/gpu/nvgpu/gv11b/mm_gv11b.c | |||
@@ -89,6 +89,12 @@ static int gv11b_mm_mmu_fault_info_buf_init(struct gk20a *g, | |||
89 | { | 89 | { |
90 | struct mmu_fault_info *fault_info_mem; | 90 | struct mmu_fault_info *fault_info_mem; |
91 | 91 | ||
92 | if (g->mm.fault_info[FAULT_TYPE_OTHER_AND_NONREPLAY] != NULL && | ||
93 | g->mm.fault_info[FAULT_TYPE_REPLAY] != NULL) { | ||
94 | *hub_intr_types |= HUB_INTR_TYPE_OTHER; | ||
95 | return 0; | ||
96 | } | ||
97 | |||
92 | fault_info_mem = nvgpu_kzalloc(g, sizeof(struct mmu_fault_info) * | 98 | fault_info_mem = nvgpu_kzalloc(g, sizeof(struct mmu_fault_info) * |
93 | FAULT_TYPE_NUM); | 99 | FAULT_TYPE_NUM); |
94 | if (!fault_info_mem) { | 100 | if (!fault_info_mem) { |
@@ -117,24 +123,31 @@ static void gv11b_mm_mmu_hw_fault_buf_init(struct gk20a *g, | |||
117 | fb_size = (g->ops.fifo.get_num_fifos(g) + 1) * | 123 | fb_size = (g->ops.fifo.get_num_fifos(g) + 1) * |
118 | gmmu_fault_buf_size_v(); | 124 | gmmu_fault_buf_size_v(); |
119 | 125 | ||
120 | err = nvgpu_dma_alloc_map_sys(vm, fb_size, | 126 | if (!nvgpu_mem_is_valid( |
127 | &g->mm.hw_fault_buf[FAULT_TYPE_OTHER_AND_NONREPLAY])) { | ||
128 | |||
129 | err = nvgpu_dma_alloc_map_sys(vm, fb_size, | ||
121 | &g->mm.hw_fault_buf[FAULT_TYPE_OTHER_AND_NONREPLAY]); | 130 | &g->mm.hw_fault_buf[FAULT_TYPE_OTHER_AND_NONREPLAY]); |
122 | if (err) { | 131 | if (err) { |
123 | nvgpu_err(g, | 132 | nvgpu_err(g, |
124 | "Error in hw mmu fault buf [0] alloc in bar2 vm "); | 133 | "Error in hw mmu fault buf [0] alloc in bar2 vm "); |
125 | /* Fault will be snapped in pri reg but not in buffer */ | 134 | /* Fault will be snapped in pri reg but not in buffer */ |
126 | return; | 135 | return; |
136 | } | ||
127 | } | 137 | } |
128 | 138 | ||
129 | *hub_intr_types |= HUB_INTR_TYPE_NONREPLAY; | 139 | *hub_intr_types |= HUB_INTR_TYPE_NONREPLAY; |
130 | 140 | ||
131 | err = nvgpu_dma_alloc_map_sys(vm, fb_size, | 141 | if (!nvgpu_mem_is_valid( |
132 | &g->mm.hw_fault_buf[FAULT_TYPE_REPLAY]); | 142 | &g->mm.hw_fault_buf[FAULT_TYPE_REPLAY])) { |
133 | if (err) { | 143 | err = nvgpu_dma_alloc_map_sys(vm, fb_size, |
134 | nvgpu_err(g, | 144 | &g->mm.hw_fault_buf[FAULT_TYPE_REPLAY]); |
135 | "Error in hw mmu fault buf [1] alloc in bar2 vm "); | 145 | if (err) { |
136 | /* Fault will be snapped in pri reg but not in buffer */ | 146 | nvgpu_err(g, |
137 | return; | 147 | "Error in hw mmu fault buf [1] alloc in bar2 vm "); |
148 | /* Fault will be snapped in pri reg but not in buffer */ | ||
149 | return; | ||
150 | } | ||
138 | } | 151 | } |
139 | 152 | ||
140 | *hub_intr_types |= HUB_INTR_TYPE_REPLAY; | 153 | *hub_intr_types |= HUB_INTR_TYPE_REPLAY; |