|
Thomas Zimmermann |
ebf85e |
From 54cff6479fd87e4a941e3686d93faa734586922b Mon Sep 17 00:00:00 2001
|
|
Thomas Zimmermann |
ebf85e |
From: Zhi Wang <zhi.a.wang@intel.com>
|
|
Thomas Zimmermann |
ebf85e |
Date: Sun, 10 Sep 2017 16:40:04 +0800
|
|
Thomas Zimmermann |
ebf85e |
Subject: [PATCH] drm/i915/gvt: Make elsp_dwords in the right order
|
|
Thomas Zimmermann |
ebf85e |
Git-commit: 54cff6479fd87e4a941e3686d93faa734586922b
|
|
Thomas Zimmermann |
ebf85e |
Patch-mainline: v4.16-rc1
|
|
Thomas Zimmermann |
ebf85e |
References: FATE#322643 bsc#1055900
|
|
Thomas Zimmermann |
ebf85e |
|
|
Thomas Zimmermann |
ebf85e |
The context descriptors in elsp_dwords are stored in a reversed order and
|
|
Thomas Zimmermann |
ebf85e |
the definition of context descriptor is also reversed. The revesred stuff
|
|
Thomas Zimmermann |
ebf85e |
is hard to be used and might cause misunderstanding. Make them in the right
|
|
Thomas Zimmermann |
ebf85e |
oder for following code re-factoring.
|
|
Thomas Zimmermann |
ebf85e |
|
|
Thomas Zimmermann |
ebf85e |
Tested on my SKL NUC.
|
|
Thomas Zimmermann |
ebf85e |
|
|
Thomas Zimmermann |
ebf85e |
Signed-off-by: Zhi Wang <zhi.a.wang@intel.com>
|
|
Thomas Zimmermann |
ebf85e |
Acked-by: Takashi Iwai <tiwai@suse.de>
|
|
Thomas Zimmermann |
ebf85e |
|
|
Thomas Zimmermann |
ebf85e |
---
|
|
Thomas Zimmermann |
ebf85e |
drivers/gpu/drm/i915/gvt/execlist.c | 22 +++++++++++-----------
|
|
Thomas Zimmermann |
ebf85e |
drivers/gpu/drm/i915/gvt/execlist.h | 8 ++++----
|
|
Thomas Zimmermann |
ebf85e |
drivers/gpu/drm/i915/gvt/handlers.c | 2 +-
|
|
Thomas Zimmermann |
ebf85e |
3 files changed, 16 insertions(+), 16 deletions(-)
|
|
Thomas Zimmermann |
ebf85e |
|
|
Thomas Zimmermann |
ebf85e |
--- a/drivers/gpu/drm/i915/gvt/execlist.c
|
|
Thomas Zimmermann |
ebf85e |
+++ b/drivers/gpu/drm/i915/gvt/execlist.c
|
|
Thomas Zimmermann |
ebf85e |
@@ -517,8 +517,8 @@ static int prepare_execlist_workload(str
|
|
Thomas Zimmermann |
ebf85e |
if (!workload->emulate_schedule_in)
|
|
Thomas Zimmermann |
ebf85e |
return 0;
|
|
Thomas Zimmermann |
ebf85e |
|
|
Thomas Zimmermann |
ebf85e |
- ctx[0] = *get_desc_from_elsp_dwords(&workload->elsp_dwords, 1);
|
|
Thomas Zimmermann |
ebf85e |
- ctx[1] = *get_desc_from_elsp_dwords(&workload->elsp_dwords, 0);
|
|
Thomas Zimmermann |
ebf85e |
+ ctx[0] = *get_desc_from_elsp_dwords(&workload->elsp_dwords, 0);
|
|
Thomas Zimmermann |
ebf85e |
+ ctx[1] = *get_desc_from_elsp_dwords(&workload->elsp_dwords, 1);
|
|
Thomas Zimmermann |
ebf85e |
|
|
Thomas Zimmermann |
ebf85e |
ret = emulate_execlist_schedule_in(&vgpu->execlist[ring_id], ctx);
|
|
Thomas Zimmermann |
ebf85e |
if (!ret)
|
|
Thomas Zimmermann |
ebf85e |
@@ -776,21 +776,21 @@ static int submit_context(struct intel_v
|
|
Thomas Zimmermann |
ebf85e |
int intel_vgpu_submit_execlist(struct intel_vgpu *vgpu, int ring_id)
|
|
Thomas Zimmermann |
ebf85e |
{
|
|
Thomas Zimmermann |
ebf85e |
struct intel_vgpu_execlist *execlist = &vgpu->execlist[ring_id];
|
|
Thomas Zimmermann |
ebf85e |
- struct execlist_ctx_descriptor_format desc[2];
|
|
Thomas Zimmermann |
ebf85e |
+ struct execlist_ctx_descriptor_format *desc[2];
|
|
Thomas Zimmermann |
ebf85e |
int i, ret;
|
|
Thomas Zimmermann |
ebf85e |
|
|
Thomas Zimmermann |
ebf85e |
- desc[0] = *get_desc_from_elsp_dwords(&execlist->elsp_dwords, 1);
|
|
Thomas Zimmermann |
ebf85e |
- desc[1] = *get_desc_from_elsp_dwords(&execlist->elsp_dwords, 0);
|
|
Thomas Zimmermann |
ebf85e |
+ desc[0] = get_desc_from_elsp_dwords(&execlist->elsp_dwords, 0);
|
|
Thomas Zimmermann |
ebf85e |
+ desc[1] = get_desc_from_elsp_dwords(&execlist->elsp_dwords, 1);
|
|
Thomas Zimmermann |
ebf85e |
|
|
Thomas Zimmermann |
ebf85e |
- if (!desc[0].valid) {
|
|
Thomas Zimmermann |
ebf85e |
+ if (!desc[0]->valid) {
|
|
Thomas Zimmermann |
ebf85e |
gvt_vgpu_err("invalid elsp submission, desc0 is invalid\n");
|
|
Thomas Zimmermann |
ebf85e |
goto inv_desc;
|
|
Thomas Zimmermann |
ebf85e |
}
|
|
Thomas Zimmermann |
ebf85e |
|
|
Thomas Zimmermann |
ebf85e |
for (i = 0; i < ARRAY_SIZE(desc); i++) {
|
|
Thomas Zimmermann |
ebf85e |
- if (!desc[i].valid)
|
|
Thomas Zimmermann |
ebf85e |
+ if (!desc[i]->valid)
|
|
Thomas Zimmermann |
ebf85e |
continue;
|
|
Thomas Zimmermann |
ebf85e |
- if (!desc[i].privilege_access) {
|
|
Thomas Zimmermann |
ebf85e |
+ if (!desc[i]->privilege_access) {
|
|
Thomas Zimmermann |
ebf85e |
gvt_vgpu_err("unexpected GGTT elsp submission\n");
|
|
Thomas Zimmermann |
ebf85e |
goto inv_desc;
|
|
Thomas Zimmermann |
ebf85e |
}
|
|
Thomas Zimmermann |
ebf85e |
@@ -798,9 +798,9 @@ int intel_vgpu_submit_execlist(struct in
|
|
Thomas Zimmermann |
ebf85e |
|
|
Thomas Zimmermann |
ebf85e |
/* submit workload */
|
|
Thomas Zimmermann |
ebf85e |
for (i = 0; i < ARRAY_SIZE(desc); i++) {
|
|
Thomas Zimmermann |
ebf85e |
- if (!desc[i].valid)
|
|
Thomas Zimmermann |
ebf85e |
+ if (!desc[i]->valid)
|
|
Thomas Zimmermann |
ebf85e |
continue;
|
|
Thomas Zimmermann |
ebf85e |
- ret = submit_context(vgpu, ring_id, &desc[i], i == 0);
|
|
Thomas Zimmermann |
ebf85e |
+ ret = submit_context(vgpu, ring_id, desc[i], i == 0);
|
|
Thomas Zimmermann |
ebf85e |
if (ret) {
|
|
Thomas Zimmermann |
ebf85e |
gvt_vgpu_err("failed to submit desc %d\n", i);
|
|
Thomas Zimmermann |
ebf85e |
return ret;
|
|
Thomas Zimmermann |
ebf85e |
@@ -811,7 +811,7 @@ int intel_vgpu_submit_execlist(struct in
|
|
Thomas Zimmermann |
ebf85e |
|
|
Thomas Zimmermann |
ebf85e |
inv_desc:
|
|
Thomas Zimmermann |
ebf85e |
gvt_vgpu_err("descriptors content: desc0 %08x %08x desc1 %08x %08x\n",
|
|
Thomas Zimmermann |
ebf85e |
- desc[0].udw, desc[0].ldw, desc[1].udw, desc[1].ldw);
|
|
Thomas Zimmermann |
ebf85e |
+ desc[0]->udw, desc[0]->ldw, desc[1]->udw, desc[1]->ldw);
|
|
Thomas Zimmermann |
ebf85e |
return -EINVAL;
|
|
Thomas Zimmermann |
ebf85e |
}
|
|
Thomas Zimmermann |
ebf85e |
|
|
Thomas Zimmermann |
ebf85e |
--- a/drivers/gpu/drm/i915/gvt/execlist.h
|
|
Thomas Zimmermann |
ebf85e |
+++ b/drivers/gpu/drm/i915/gvt/execlist.h
|
|
Thomas Zimmermann |
ebf85e |
@@ -37,10 +37,6 @@
|
|
Thomas Zimmermann |
ebf85e |
|
|
Thomas Zimmermann |
ebf85e |
struct execlist_ctx_descriptor_format {
|
|
Thomas Zimmermann |
ebf85e |
union {
|
|
Thomas Zimmermann |
ebf85e |
- u32 udw;
|
|
Thomas Zimmermann |
ebf85e |
- u32 context_id;
|
|
Thomas Zimmermann |
ebf85e |
- };
|
|
Thomas Zimmermann |
ebf85e |
- union {
|
|
Thomas Zimmermann |
ebf85e |
u32 ldw;
|
|
Thomas Zimmermann |
ebf85e |
struct {
|
|
Thomas Zimmermann |
ebf85e |
u32 valid : 1;
|
|
Thomas Zimmermann |
ebf85e |
@@ -54,6 +50,10 @@ struct execlist_ctx_descriptor_format {
|
|
Thomas Zimmermann |
ebf85e |
u32 lrca : 20;
|
|
Thomas Zimmermann |
ebf85e |
};
|
|
Thomas Zimmermann |
ebf85e |
};
|
|
Thomas Zimmermann |
ebf85e |
+ union {
|
|
Thomas Zimmermann |
ebf85e |
+ u32 udw;
|
|
Thomas Zimmermann |
ebf85e |
+ u32 context_id;
|
|
Thomas Zimmermann |
ebf85e |
+ };
|
|
Thomas Zimmermann |
ebf85e |
};
|
|
Thomas Zimmermann |
ebf85e |
|
|
Thomas Zimmermann |
ebf85e |
struct execlist_status_format {
|
|
Thomas Zimmermann |
ebf85e |
--- a/drivers/gpu/drm/i915/gvt/handlers.c
|
|
Thomas Zimmermann |
ebf85e |
+++ b/drivers/gpu/drm/i915/gvt/handlers.c
|
|
Thomas Zimmermann |
ebf85e |
@@ -1446,7 +1446,7 @@ static int elsp_mmio_write(struct intel_
|
|
Thomas Zimmermann |
ebf85e |
|
|
Thomas Zimmermann |
ebf85e |
execlist = &vgpu->execlist[ring_id];
|
|
Thomas Zimmermann |
ebf85e |
|
|
Thomas Zimmermann |
ebf85e |
- execlist->elsp_dwords.data[execlist->elsp_dwords.index] = data;
|
|
Thomas Zimmermann |
ebf85e |
+ execlist->elsp_dwords.data[3 - execlist->elsp_dwords.index] = data;
|
|
Thomas Zimmermann |
ebf85e |
if (execlist->elsp_dwords.index == 3) {
|
|
Thomas Zimmermann |
ebf85e |
ret = intel_vgpu_submit_execlist(vgpu, ring_id);
|
|
Thomas Zimmermann |
ebf85e |
if(ret)
|