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)