aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/gvt/Makefile2
-rw-r--r--drivers/gpu/drm/i915/gvt/cmd_parser.c56
-rw-r--r--drivers/gpu/drm/i915/gvt/execlist.c56
-rw-r--r--drivers/gpu/drm/i915/gvt/firmware.c9
-rw-r--r--drivers/gpu/drm/i915/gvt/gtt.c15
-rw-r--r--drivers/gpu/drm/i915/gvt/gvt.c6
-rw-r--r--drivers/gpu/drm/i915/gvt/gvt.h100
-rw-r--r--drivers/gpu/drm/i915/gvt/handlers.c303
-rw-r--r--drivers/gpu/drm/i915/gvt/interrupt.c20
-rw-r--r--drivers/gpu/drm/i915/gvt/mmio.c121
-rw-r--r--drivers/gpu/drm/i915/gvt/mmio.h44
-rw-r--r--drivers/gpu/drm/i915/gvt/mpt.h3
-rw-r--r--drivers/gpu/drm/i915/gvt/render.c48
-rw-r--r--drivers/gpu/drm/i915/gvt/render.h4
-rw-r--r--drivers/gpu/drm/i915/gvt/sched_policy.c27
-rw-r--r--drivers/gpu/drm/i915/gvt/scheduler.c39
-rw-r--r--drivers/gpu/drm/i915/gvt/scheduler.h4
-rw-r--r--drivers/gpu/drm/i915/gvt/trace.h178
-rw-r--r--drivers/gpu/drm/i915/gvt/vgpu.c9
19 files changed, 604 insertions, 440 deletions
diff --git a/drivers/gpu/drm/i915/gvt/Makefile b/drivers/gpu/drm/i915/gvt/Makefile
index b123c20e2097..f5486cb94818 100644
--- a/drivers/gpu/drm/i915/gvt/Makefile
+++ b/drivers/gpu/drm/i915/gvt/Makefile
@@ -3,6 +3,6 @@ GVT_SOURCE := gvt.o aperture_gm.o handlers.o vgpu.o trace_points.o firmware.o \
3 interrupt.o gtt.o cfg_space.o opregion.o mmio.o display.o edid.o \ 3 interrupt.o gtt.o cfg_space.o opregion.o mmio.o display.o edid.o \
4 execlist.o scheduler.o sched_policy.o render.o cmd_parser.o 4 execlist.o scheduler.o sched_policy.o render.o cmd_parser.o
5 5
6ccflags-y += -I$(src) -I$(src)/$(GVT_DIR) -Wall 6ccflags-y += -I$(src) -I$(src)/$(GVT_DIR)
7i915-y += $(addprefix $(GVT_DIR)/, $(GVT_SOURCE)) 7i915-y += $(addprefix $(GVT_DIR)/, $(GVT_SOURCE))
8obj-$(CONFIG_DRM_I915_GVT_KVMGT) += $(GVT_DIR)/kvmgt.o 8obj-$(CONFIG_DRM_I915_GVT_KVMGT) += $(GVT_DIR)/kvmgt.o
diff --git a/drivers/gpu/drm/i915/gvt/cmd_parser.c b/drivers/gpu/drm/i915/gvt/cmd_parser.c
index 41b2c3aaa04a..51241de5e7a7 100644
--- a/drivers/gpu/drm/i915/gvt/cmd_parser.c
+++ b/drivers/gpu/drm/i915/gvt/cmd_parser.c
@@ -2414,53 +2414,13 @@ static void add_cmd_entry(struct intel_gvt *gvt, struct cmd_entry *e)
2414 hash_add(gvt->cmd_table, &e->hlist, e->info->opcode); 2414 hash_add(gvt->cmd_table, &e->hlist, e->info->opcode);
2415} 2415}
2416 2416
2417#define GVT_MAX_CMD_LENGTH 20 /* In Dword */
2418
2419static void trace_cs_command(struct parser_exec_state *s,
2420 cycles_t cost_pre_cmd_handler, cycles_t cost_cmd_handler)
2421{
2422 /* This buffer is used by ftrace to store all commands copied from
2423 * guest gma space. Sometimes commands can cross pages, this should
2424 * not be handled in ftrace logic. So this is just used as a
2425 * 'bounce buffer'
2426 */
2427 u32 cmd_trace_buf[GVT_MAX_CMD_LENGTH];
2428 int i;
2429 u32 cmd_len = cmd_length(s);
2430 /* The chosen value of GVT_MAX_CMD_LENGTH are just based on
2431 * following two considerations:
2432 * 1) From observation, most common ring commands is not that long.
2433 * But there are execeptions. So it indeed makes sence to observe
2434 * longer commands.
2435 * 2) From the performance and debugging point of view, dumping all
2436 * contents of very commands is not necessary.
2437 * We mgith shrink GVT_MAX_CMD_LENGTH or remove this trace event in
2438 * future for performance considerations.
2439 */
2440 if (unlikely(cmd_len > GVT_MAX_CMD_LENGTH)) {
2441 gvt_dbg_cmd("cmd length exceed tracing limitation!\n");
2442 cmd_len = GVT_MAX_CMD_LENGTH;
2443 }
2444
2445 for (i = 0; i < cmd_len; i++)
2446 cmd_trace_buf[i] = cmd_val(s, i);
2447
2448 trace_gvt_command(s->vgpu->id, s->ring_id, s->ip_gma, cmd_trace_buf,
2449 cmd_len, s->buf_type == RING_BUFFER_INSTRUCTION,
2450 cost_pre_cmd_handler, cost_cmd_handler);
2451}
2452
2453/* call the cmd handler, and advance ip */ 2417/* call the cmd handler, and advance ip */
2454static int cmd_parser_exec(struct parser_exec_state *s) 2418static int cmd_parser_exec(struct parser_exec_state *s)
2455{ 2419{
2420 struct intel_vgpu *vgpu = s->vgpu;
2456 struct cmd_info *info; 2421 struct cmd_info *info;
2457 u32 cmd; 2422 u32 cmd;
2458 int ret = 0; 2423 int ret = 0;
2459 cycles_t t0, t1, t2;
2460 struct parser_exec_state s_before_advance_custom;
2461 struct intel_vgpu *vgpu = s->vgpu;
2462
2463 t0 = get_cycles();
2464 2424
2465 cmd = cmd_val(s, 0); 2425 cmd = cmd_val(s, 0);
2466 2426
@@ -2471,13 +2431,10 @@ static int cmd_parser_exec(struct parser_exec_state *s)
2471 return -EINVAL; 2431 return -EINVAL;
2472 } 2432 }
2473 2433
2474 gvt_dbg_cmd("%s\n", info->name);
2475
2476 s->info = info; 2434 s->info = info;
2477 2435
2478 t1 = get_cycles(); 2436 trace_gvt_command(vgpu->id, s->ring_id, s->ip_gma, s->ip_va,
2479 2437 cmd_length(s), s->buf_type);
2480 s_before_advance_custom = *s;
2481 2438
2482 if (info->handler) { 2439 if (info->handler) {
2483 ret = info->handler(s); 2440 ret = info->handler(s);
@@ -2486,9 +2443,6 @@ static int cmd_parser_exec(struct parser_exec_state *s)
2486 return ret; 2443 return ret;
2487 } 2444 }
2488 } 2445 }
2489 t2 = get_cycles();
2490
2491 trace_cs_command(&s_before_advance_custom, t1 - t0, t2 - t1);
2492 2446
2493 if (!(info->flag & F_IP_ADVANCE_CUSTOM)) { 2447 if (!(info->flag & F_IP_ADVANCE_CUSTOM)) {
2494 ret = cmd_advance_default(s); 2448 ret = cmd_advance_default(s);
@@ -2522,8 +2476,6 @@ static int command_scan(struct parser_exec_state *s,
2522 gma_tail = rb_start + rb_tail; 2476 gma_tail = rb_start + rb_tail;
2523 gma_bottom = rb_start + rb_len; 2477 gma_bottom = rb_start + rb_len;
2524 2478
2525 gvt_dbg_cmd("scan_start: start=%lx end=%lx\n", gma_head, gma_tail);
2526
2527 while (s->ip_gma != gma_tail) { 2479 while (s->ip_gma != gma_tail) {
2528 if (s->buf_type == RING_BUFFER_INSTRUCTION) { 2480 if (s->buf_type == RING_BUFFER_INSTRUCTION) {
2529 if (!(s->ip_gma >= rb_start) || 2481 if (!(s->ip_gma >= rb_start) ||
@@ -2552,8 +2504,6 @@ static int command_scan(struct parser_exec_state *s,
2552 } 2504 }
2553 } 2505 }
2554 2506
2555 gvt_dbg_cmd("scan_end\n");
2556
2557 return ret; 2507 return ret;
2558} 2508}
2559 2509
diff --git a/drivers/gpu/drm/i915/gvt/execlist.c b/drivers/gpu/drm/i915/gvt/execlist.c
index dca989eb2d42..8bba38fa19b8 100644
--- a/drivers/gpu/drm/i915/gvt/execlist.c
+++ b/drivers/gpu/drm/i915/gvt/execlist.c
@@ -708,53 +708,43 @@ static int submit_context(struct intel_vgpu *vgpu, int ring_id,
708int intel_vgpu_submit_execlist(struct intel_vgpu *vgpu, int ring_id) 708int intel_vgpu_submit_execlist(struct intel_vgpu *vgpu, int ring_id)
709{ 709{
710 struct intel_vgpu_execlist *execlist = &vgpu->execlist[ring_id]; 710 struct intel_vgpu_execlist *execlist = &vgpu->execlist[ring_id];
711 struct execlist_ctx_descriptor_format *desc[2], valid_desc[2]; 711 struct execlist_ctx_descriptor_format desc[2];
712 unsigned long valid_desc_bitmap = 0; 712 int i, ret;
713 bool emulate_schedule_in = true;
714 int ret;
715 int i;
716 713
717 memset(valid_desc, 0, sizeof(valid_desc)); 714 desc[0] = *get_desc_from_elsp_dwords(&execlist->elsp_dwords, 1);
715 desc[1] = *get_desc_from_elsp_dwords(&execlist->elsp_dwords, 0);
718 716
719 desc[0] = get_desc_from_elsp_dwords(&execlist->elsp_dwords, 1); 717 if (!desc[0].valid) {
720 desc[1] = get_desc_from_elsp_dwords(&execlist->elsp_dwords, 0); 718 gvt_vgpu_err("invalid elsp submission, desc0 is invalid\n");
719 goto inv_desc;
720 }
721 721
722 for (i = 0; i < 2; i++) { 722 for (i = 0; i < ARRAY_SIZE(desc); i++) {
723 if (!desc[i]->valid) 723 if (!desc[i].valid)
724 continue; 724 continue;
725 725 if (!desc[i].privilege_access) {
726 if (!desc[i]->privilege_access) {
727 gvt_vgpu_err("unexpected GGTT elsp submission\n"); 726 gvt_vgpu_err("unexpected GGTT elsp submission\n");
728 return -EINVAL; 727 goto inv_desc;
729 } 728 }
730
731 /* TODO: add another guest context checks here. */
732 set_bit(i, &valid_desc_bitmap);
733 valid_desc[i] = *desc[i];
734 }
735
736 if (!valid_desc_bitmap) {
737 gvt_vgpu_err("no valid desc in a elsp submission\