diff options
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/cmd_parser.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/scheduler.c | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/scheduler.h | 1 |
3 files changed, 20 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/gvt/cmd_parser.c b/drivers/gpu/drm/i915/gvt/cmd_parser.c index c8454ac43fae..db6b94dda5df 100644 --- a/drivers/gpu/drm/i915/gvt/cmd_parser.c +++ b/drivers/gpu/drm/i915/gvt/cmd_parser.c | |||
| @@ -471,6 +471,7 @@ struct parser_exec_state { | |||
| 471 | * used when ret from 2nd level batch buffer | 471 | * used when ret from 2nd level batch buffer |
| 472 | */ | 472 | */ |
| 473 | int saved_buf_addr_type; | 473 | int saved_buf_addr_type; |
| 474 | bool is_ctx_wa; | ||
| 474 | 475 | ||
| 475 | struct cmd_info *info; | 476 | struct cmd_info *info; |
| 476 | 477 | ||
| @@ -1715,6 +1716,11 @@ static int perform_bb_shadow(struct parser_exec_state *s) | |||
| 1715 | bb->accessing = true; | 1716 | bb->accessing = true; |
| 1716 | bb->bb_start_cmd_va = s->ip_va; | 1717 | bb->bb_start_cmd_va = s->ip_va; |
| 1717 | 1718 | ||
| 1719 | if ((s->buf_type == BATCH_BUFFER_INSTRUCTION) && (!s->is_ctx_wa)) | ||
| 1720 | bb->bb_offset = s->ip_va - s->rb_va; | ||
| 1721 | else | ||
| 1722 | bb->bb_offset = 0; | ||
| 1723 | |||
| 1718 | /* | 1724 | /* |
| 1719 | * ip_va saves the virtual address of the shadow batch buffer, while | 1725 | * ip_va saves the virtual address of the shadow batch buffer, while |
| 1720 | * ip_gma saves the graphics address of the original batch buffer. | 1726 | * ip_gma saves the graphics address of the original batch buffer. |
| @@ -2571,6 +2577,7 @@ static int scan_workload(struct intel_vgpu_workload *workload) | |||
| 2571 | s.ring_tail = gma_tail; | 2577 | s.ring_tail = gma_tail; |
| 2572 | s.rb_va = workload->shadow_ring_buffer_va; | 2578 | s.rb_va = workload->shadow_ring_buffer_va; |
| 2573 | s.workload = workload; | 2579 | s.workload = workload; |
| 2580 | s.is_ctx_wa = false; | ||
| 2574 | 2581 | ||
| 2575 | if ((bypass_scan_mask & (1 << workload->ring_id)) || | 2582 | if ((bypass_scan_mask & (1 << workload->ring_id)) || |
| 2576 | gma_head == gma_tail) | 2583 | gma_head == gma_tail) |
| @@ -2624,6 +2631,7 @@ static int scan_wa_ctx(struct intel_shadow_wa_ctx *wa_ctx) | |||
| 2624 | s.ring_tail = gma_tail; | 2631 | s.ring_tail = gma_tail; |
| 2625 | s.rb_va = wa_ctx->indirect_ctx.shadow_va; | 2632 | s.rb_va = wa_ctx->indirect_ctx.shadow_va; |
| 2626 | s.workload = workload; | 2633 | s.workload = workload; |
| 2634 | s.is_ctx_wa = true; | ||
| 2627 | 2635 | ||
| 2628 | if (!intel_gvt_ggtt_validate_range(s.vgpu, s.ring_start, s.ring_size)) { | 2636 | if (!intel_gvt_ggtt_validate_range(s.vgpu, s.ring_start, s.ring_size)) { |
| 2629 | ret = -EINVAL; | 2637 | ret = -EINVAL; |
diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c b/drivers/gpu/drm/i915/gvt/scheduler.c index 8caf72c1e794..fdf1c0bf0d55 100644 --- a/drivers/gpu/drm/i915/gvt/scheduler.c +++ b/drivers/gpu/drm/i915/gvt/scheduler.c | |||
| @@ -426,6 +426,17 @@ static int prepare_shadow_batch_buffer(struct intel_vgpu_workload *workload) | |||
| 426 | goto err; | 426 | goto err; |
| 427 | } | 427 | } |
| 428 | 428 | ||
| 429 | /* For privilge batch buffer and not wa_ctx, the bb_start_cmd_va | ||
| 430 | * is only updated into ring_scan_buffer, not real ring address | ||
| 431 | * allocated in later copy_workload_to_ring_buffer. pls be noted | ||
| 432 | * shadow_ring_buffer_va is now pointed to real ring buffer va | ||
| 433 | * in copy_workload_to_ring_buffer. | ||
| 434 | */ | ||
| 435 | |||
| 436 | if (bb->bb_offset) | ||
| 437 | bb->bb_start_cmd_va = workload->shadow_ring_buffer_va | ||
| 438 | + bb->bb_offset; | ||
| 439 | |||
| 429 | /* relocate shadow batch buffer */ | 440 | /* relocate shadow batch buffer */ |
| 430 | bb->bb_start_cmd_va[1] = i915_ggtt_offset(bb->vma); | 441 | bb->bb_start_cmd_va[1] = i915_ggtt_offset(bb->vma); |
| 431 | if (gmadr_bytes == 8) | 442 | if (gmadr_bytes == 8) |
diff --git a/drivers/gpu/drm/i915/gvt/scheduler.h b/drivers/gpu/drm/i915/gvt/scheduler.h index 2603336b7c6d..a79a4f60637e 100644 --- a/drivers/gpu/drm/i915/gvt/scheduler.h +++ b/drivers/gpu/drm/i915/gvt/scheduler.h | |||
| @@ -124,6 +124,7 @@ struct intel_vgpu_shadow_bb { | |||
| 124 | u32 *bb_start_cmd_va; | 124 | u32 *bb_start_cmd_va; |
| 125 | unsigned int clflush; | 125 | unsigned int clflush; |
| 126 | bool accessing; | 126 | bool accessing; |
| 127 | unsigned long bb_offset; | ||
| 127 | }; | 128 | }; |
| 128 | 129 | ||
| 129 | #define workload_q_head(vgpu, ring_id) \ | 130 | #define workload_q_head(vgpu, ring_id) \ |
