diff options
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/Makefile | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/cmd_parser.c | 56 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/execlist.c | 56 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/firmware.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/gtt.c | 15 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/gvt.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/gvt.h | 100 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/handlers.c | 303 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/interrupt.c | 20 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/mmio.c | 121 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/mmio.h | 44 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/mpt.h | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/render.c | 48 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/render.h | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/sched_policy.c | 27 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/scheduler.c | 39 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/scheduler.h | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/trace.h | 178 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/vgpu.c | 9 |
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 | ||
| 6 | ccflags-y += -I$(src) -I$(src)/$(GVT_DIR) -Wall | 6 | ccflags-y += -I$(src) -I$(src)/$(GVT_DIR) |
| 7 | i915-y += $(addprefix $(GVT_DIR)/, $(GVT_SOURCE)) | 7 | i915-y += $(addprefix $(GVT_DIR)/, $(GVT_SOURCE)) |
| 8 | obj-$(CONFIG_DRM_I915_GVT_KVMGT) += $(GVT_DIR)/kvmgt.o | 8 | obj-$(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 | |||
| 2419 | static 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 */ |
| 2454 | static int cmd_parser_exec(struct parser_exec_state *s) | 2418 | static 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, | |||
| 708 | int intel_vgpu_submit_execlist(struct intel_vgpu *vgpu, int ring_id) | 708 | int 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\ | ||
