summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
diff options
context:
space:
mode:
authorSeema Khowala <seemaj@nvidia.com>2017-02-16 19:53:35 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2017-04-12 18:33:50 -0400
commitc3c3a3c5715d6aa38544922b76a636135429fd22 (patch)
tree4e608ad8e817229ff088cad2f2ddb3606f39b73e /drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
parent3867db86bce819901e566ac46ea5cd1ead3dad11 (diff)
gpu: nvgpu: add fifo ops for handling pbdma intr_0
This is needed to handle bit 20 (clear_faulted_error) and bit 24 (eng_reset) of t19x pbdma_intr_0 interrupt. JIRA GPUT19X-47 Change-Id: I07c603eff96344c0104579e339e5cf7f675128ef Signed-off-by: Seema Khowala <seemaj@nvidia.com> Reviewed-on: http://git-master/r/1306556 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/fifo_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/fifo_gk20a.c146
1 files changed, 80 insertions, 66 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
index c32c47fb..a5863567 100644
--- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
@@ -2258,7 +2258,7 @@ static inline void gk20a_fifo_reset_pbdma_header(struct gk20a *g, int pbdma_id)
2258 pbdma_pb_header_type_non_inc_f()); 2258 pbdma_pb_header_type_non_inc_f());
2259} 2259}
2260 2260
2261static inline void gk20a_fifo_reset_pbdma_method(struct gk20a *g, int pbdma_id, 2261void gk20a_fifo_reset_pbdma_method(struct gk20a *g, int pbdma_id,
2262 int pbdma_method_index) 2262 int pbdma_method_index)
2263{ 2263{
2264 u32 pbdma_method_stride; 2264 u32 pbdma_method_stride;
@@ -2299,6 +2299,79 @@ static bool gk20a_fifo_is_sw_method_subch(struct gk20a *g, int pbdma_id,
2299 return false; 2299 return false;
2300} 2300}
2301 2301
2302unsigned int gk20a_fifo_handle_pbdma_intr_0(struct gk20a *g, u32 pbdma_id,
2303 u32 pbdma_intr_0, u32 *handled, u32 *error_notifier)
2304{
2305 struct fifo_gk20a *f = &g->fifo;
2306 unsigned int rc_type = RC_TYPE_NO_RC;
2307 int i;
2308
2309 if ((f->intr.pbdma.device_fatal_0 |
2310 f->intr.pbdma.channel_fatal_0 |
2311 f->intr.pbdma.restartable_0) & pbdma_intr_0) {
2312 nvgpu_err(g,
2313 "pbdma_intr_0(%d):0x%08x PBH: %08x "
2314 "SHADOW: %08x M0: %08x %08x %08x %08x ",
2315 pbdma_id, pbdma_intr_0,
2316 gk20a_readl(g, pbdma_pb_header_r(pbdma_id)),
2317 gk20a_readl(g, pbdma_hdr_shadow_r(pbdma_id)),
2318 gk20a_readl(g, pbdma_method0_r(pbdma_id)),
2319 gk20a_readl(g, pbdma_method1_r(pbdma_id)),
2320 gk20a_readl(g, pbdma_method2_r(pbdma_id)),
2321 gk20a_readl(g, pbdma_method3_r(pbdma_id))
2322 );
2323 rc_type = RC_TYPE_PBDMA_FAULT;
2324 *handled |= ((f->intr.pbdma.device_fatal_0 |
2325 f->intr.pbdma.channel_fatal_0 |
2326 f->intr.pbdma.restartable_0) &
2327 pbdma_intr_0);
2328 }
2329
2330 if (pbdma_intr_0 & pbdma_intr_0_acquire_pending_f()) {
2331 u32 val = gk20a_readl(g, pbdma_acquire_r(pbdma_id));
2332
2333 val &= ~pbdma_acquire_timeout_en_enable_f();
2334 gk20a_writel(g, pbdma_acquire_r(pbdma_id), val);
2335 if (g->timeouts_enabled) {
2336 rc_type = RC_TYPE_PBDMA_FAULT;
2337 nvgpu_err(g,
2338 "semaphore acquire timeout!");
2339 }
2340 *handled |= pbdma_intr_0_acquire_pending_f();
2341 }
2342
2343 if (pbdma_intr_0 & pbdma_intr_0_pbentry_pending_f()) {
2344 gk20a_fifo_reset_pbdma_header(g, pbdma_id);
2345 gk20a_fifo_reset_pbdma_method(g, pbdma_id, 0);
2346 rc_type = RC_TYPE_PBDMA_FAULT;
2347 }
2348
2349 if (pbdma_intr_0 & pbdma_intr_0_method_pending_f()) {
2350 gk20a_fifo_reset_pbdma_method(g, pbdma_id, 0);
2351 rc_type = RC_TYPE_PBDMA_FAULT;
2352 }
2353
2354 if (pbdma_intr_0 & pbdma_intr_0_pbcrc_pending_f()) {
2355 *error_notifier =
2356 NVGPU_CHANNEL_PBDMA_PUSHBUFFER_CRC_MISMATCH;
2357 rc_type = RC_TYPE_PBDMA_FAULT;
2358 }
2359
2360 if (pbdma_intr_0 & pbdma_intr_0_device_pending_f()) {
2361 gk20a_fifo_reset_pbdma_header(g, pbdma_id);
2362
2363 for (i = 0; i < 4; i++) {
2364 if (gk20a_fifo_is_sw_method_subch(g,
2365 pbdma_id, i))
2366 gk20a_fifo_reset_pbdma_method(g,
2367 pbdma_id, i);
2368 }
2369 rc_type = RC_TYPE_PBDMA_FAULT;
2370 }
2371
2372 return rc_type;
2373}
2374
2302static u32 gk20a_fifo_handle_pbdma_intr(struct gk20a *g, 2375static u32 gk20a_fifo_handle_pbdma_intr(struct gk20a *g,
2303 struct fifo_gk20a *f, 2376 struct fifo_gk20a *f,
2304 u32 pbdma_id) 2377 u32 pbdma_id)
@@ -2309,75 +2382,15 @@ static u32 gk20a_fifo_handle_pbdma_intr(struct gk20a *g,
2309 2382
2310 u32 handled = 0; 2383 u32 handled = 0;
2311 u32 error_notifier = NVGPU_CHANNEL_PBDMA_ERROR; 2384 u32 error_notifier = NVGPU_CHANNEL_PBDMA_ERROR;
2312 bool reset = false; 2385 unsigned int rc_type = RC_TYPE_NO_RC;
2313 int i;
2314 2386
2315 gk20a_dbg_fn(""); 2387 gk20a_dbg_fn("");
2316 2388
2317 gk20a_dbg(gpu_dbg_intr, "pbdma id intr pending %d %08x %08x", pbdma_id, 2389 gk20a_dbg(gpu_dbg_intr, "pbdma id intr pending %d %08x %08x", pbdma_id,
2318 pbdma_intr_0, pbdma_intr_1); 2390 pbdma_intr_0, pbdma_intr_1);
2319 if (pbdma_intr_0) { 2391 if (pbdma_intr_0) {
2320 if ((f->intr.pbdma.device_fatal_0 | 2392 rc_type = g->ops.fifo.handle_pbdma_intr_0(g, pbdma_id,
2321 f->intr.pbdma.channel_fatal_0 | 2393 pbdma_intr_0, &handled, &error_notifier);
2322 f->intr.pbdma.restartable_0) & pbdma_intr_0) {
2323 nvgpu_err(g,
2324 "pbdma_intr_0(%d):0x%08x PBH: %08x SHADOW: %08x M0: %08x %08x %08x %08x",
2325 pbdma_id, pbdma_intr_0,
2326 gk20a_readl(g, pbdma_pb_header_r(pbdma_id)),
2327 gk20a_readl(g, pbdma_hdr_shadow_r(pbdma_id)),
2328 gk20a_readl(g, pbdma_method0_r(pbdma_id)),
2329 gk20a_readl(g, pbdma_method1_r(pbdma_id)),
2330 gk20a_readl(g, pbdma_method2_r(pbdma_id)),
2331 gk20a_readl(g, pbdma_method3_r(pbdma_id))
2332 );
2333 reset = true;
2334 handled |= ((f->intr.pbdma.device_fatal_0 |
2335 f->intr.pbdma.channel_fatal_0 |
2336 f->intr.pbdma.restartable_0) &
2337 pbdma_intr_0);
2338 }
2339
2340 if (pbdma_intr_0 & pbdma_intr_0_acquire_pending_f()) {
2341 u32 val = gk20a_readl(g, pbdma_acquire_r(pbdma_id));
2342 val &= ~pbdma_acquire_timeout_en_enable_f();
2343 gk20a_writel(g, pbdma_acquire_r(pbdma_id), val);
2344 if (g->timeouts_enabled) {
2345 reset = true;
2346 nvgpu_err(g,
2347 "semaphore acquire timeout!");
2348 }
2349 handled |= pbdma_intr_0_acquire_pending_f();
2350 }
2351
2352 if (pbdma_intr_0 & pbdma_intr_0_pbentry_pending_f()) {
2353 gk20a_fifo_reset_pbdma_header(g, pbdma_id);
2354 gk20a_fifo_reset_pbdma_method(g, pbdma_id, 0);
2355 reset = true;
2356 }
2357
2358 if (pbdma_intr_0 & pbdma_intr_0_method_pending_f()) {
2359 gk20a_fifo_reset_pbdma_method(g, pbdma_id, 0);
2360 reset = true;
2361 }
2362
2363 if (pbdma_intr_0 & pbdma_intr_0_pbcrc_pending_f()) {
2364 error_notifier =
2365 NVGPU_CHANNEL_PBDMA_PUSHBUFFER_CRC_MISMATCH;
2366 reset = true;
2367 }
2368
2369 if (pbdma_intr_0 & pbdma_intr_0_device_pending_f()) {
2370 gk20a_fifo_reset_pbdma_header(g, pbdma_id);
2371
2372 for (i = 0; i < 4; i++) {
2373 if (gk20a_fifo_is_sw_method_subch(g,
2374 pbdma_id, i))
2375 gk20a_fifo_reset_pbdma_method(g,
2376 pbdma_id, i);
2377 }
2378 reset = true;
2379 }
2380
2381 gk20a_writel(g, pbdma_intr_0_r(pbdma_id), pbdma_intr_0); 2394 gk20a_writel(g, pbdma_intr_0_r(pbdma_id), pbdma_intr_0);
2382 } 2395 }
2383 2396
@@ -2386,11 +2399,11 @@ static u32 gk20a_fifo_handle_pbdma_intr(struct gk20a *g,
2386 if (pbdma_intr_1) { 2399 if (pbdma_intr_1) {
2387 nvgpu_err(g, "channel hce error: pbdma_intr_1(%d): 0x%08x", 2400 nvgpu_err(g, "channel hce error: pbdma_intr_1(%d): 0x%08x",
2388 pbdma_id, pbdma_intr_1); 2401 pbdma_id, pbdma_intr_1);
2389 reset = true; 2402 rc_type = RC_TYPE_PBDMA_FAULT;
2390 gk20a_writel(g, pbdma_intr_1_r(pbdma_id), pbdma_intr_1); 2403 gk20a_writel(g, pbdma_intr_1_r(pbdma_id), pbdma_intr_1);
2391 } 2404 }
2392 2405
2393 if (reset) { 2406 if (rc_type == RC_TYPE_PBDMA_FAULT) {
2394 /* Remove the channel from runlist */ 2407 /* Remove the channel from runlist */
2395 u32 id = fifo_pbdma_status_id_v(status); 2408 u32 id = fifo_pbdma_status_id_v(status);
2396 if (fifo_pbdma_status_id_type_v(status) 2409 if (fifo_pbdma_status_id_type_v(status)
@@ -4277,4 +4290,5 @@ void gk20a_init_fifo(struct gpu_ops *gops)
4277 gops->fifo.pbdma_acquire_val = gk20a_fifo_pbdma_acquire_val; 4290 gops->fifo.pbdma_acquire_val = gk20a_fifo_pbdma_acquire_val;
4278 gops->fifo.teardown_ch_tsg = gk20a_fifo_teardown_ch_tsg; 4291 gops->fifo.teardown_ch_tsg = gk20a_fifo_teardown_ch_tsg;
4279 gops->fifo.handle_sched_error = gk20a_fifo_handle_sched_error; 4292 gops->fifo.handle_sched_error = gk20a_fifo_handle_sched_error;
4293 gops->fifo.handle_pbdma_intr_0 = gk20a_fifo_handle_pbdma_intr_0;
4280} 4294}