[PATCH 2/2] drm/i915/gvt: implement override and restore call back for GFX_MODE

Chuanxiao Dong chuanxiao.dong at intel.com
Mon Feb 27 09:37:46 UTC 2017


When host and guest are using different ring submission, host cannot
use the GFX_MODE register value from guest. So implement the override
and restore call backs to handle GFX_MODE properly

Signed-off-by: Chuanxiao Dong <chuanxiao.dong at intel.com>
---
 drivers/gpu/drm/i915/gvt/render.c | 74 ++++++++++++++++++++++++++++++++++++---
 1 file changed, 70 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/gvt/render.c b/drivers/gpu/drm/i915/gvt/render.c
index 7997d70..11f2507 100644
--- a/drivers/gpu/drm/i915/gvt/render.c
+++ b/drivers/gpu/drm/i915/gvt/render.c
@@ -48,8 +48,68 @@ struct render_mmio {
 	u32 original_bits;
 };
 
+static void render_mmio_override(struct render_mmio *mmio,
+		u32 *v, u32 mask, u32 override_bits)
+{
+	u32 temp_v = *v;
+
+	if ((temp_v & mask) == override_bits) {
+		mmio->override_mask = 0;
+		mmio->original_bits = 0;
+		return;
+	}
+
+	/* record which bits are changed */
+	mmio->original_bits = temp_v & mask;
+	mmio->override_mask = mask;
+
+	/* set the new value */
+	temp_v &= ~mask;
+	*v = (temp_v | override_bits);
+}
+
+static void render_mmio_override_gfx_mode(struct render_mmio *mmio, u32 *v)
+{
+	u32 mask, override_bits;
+
+	if (!v || !mmio)
+		return;
+
+	if (i915.enable_guc_submission) {
+		mask = GFX_FORWARD_VBLANK_MASK | GFX_INTERRUPT_STEERING;
+		override_bits = GFX_FORWARD_VBLANK_NEVER |
+			GFX_INTERRUPT_STEERING;
+	} else {
+		mask = GFX_INTERRUPT_STEERING;
+		override_bits = 0;
+	}
+
+	render_mmio_override(mmio, v, mask, override_bits);
+}
+
+static void render_mmio_restore(struct render_mmio *mmio, u32 *v)
+{
+	u32 temp_v;
+
+	if (!v || !mmio || !mmio->override_mask)
+		return;
+
+	/*
+	 * remove the host override bits and
+	 * restore back the guest mmio
+	 */
+	temp_v = *v;
+	temp_v &= ~mmio->override_mask;
+	*v = temp_v | mmio->original_bits;
+
+	mmio->override_mask = 0;
+	mmio->original_bits = 0;
+}
+
 static struct render_mmio gen8_render_mmio_list[] = {
-	{RCS, _MMIO(0x229c), 0xffff, false},
+	{RCS, _MMIO(0x229c), 0xffff, false,
+		render_mmio_override_gfx_mode,
+		render_mmio_restore},
 	{RCS, _MMIO(0x2248), 0x0, false},
 	{RCS, _MMIO(0x2098), 0x0, false},
 	{RCS, _MMIO(0x20c0), 0xffff, true},
@@ -72,7 +132,9 @@ static struct render_mmio gen8_render_mmio_list[] = {
 	{RCS, _MMIO(0x7300), 0xffff, true},
 	{RCS, _MMIO(0x83a4), 0xffff, true},
 
-	{BCS, _MMIO(0x2229c), 0xffff, false},
+	{BCS, _MMIO(0x2229c), 0xffff, false,
+		render_mmio_override_gfx_mode,
+		render_mmio_restore},
 	{BCS, _MMIO(0x2209c), 0xffff, false},
 	{BCS, _MMIO(0x220c0), 0xffff, false},
 	{BCS, _MMIO(0x22098), 0x0, false},
@@ -80,7 +142,9 @@ static struct render_mmio gen8_render_mmio_list[] = {
 };
 
 static struct render_mmio gen9_render_mmio_list[] = {
-	{RCS, _MMIO(0x229c), 0xffff, false},
+	{RCS, _MMIO(0x229c), 0xffff, false,
+		render_mmio_override_gfx_mode,
+		render_mmio_restore},
 	{RCS, _MMIO(0x2248), 0x0, false},
 	{RCS, _MMIO(0x2098), 0x0, false},
 	{RCS, _MMIO(0x20c0), 0xffff, true},
@@ -121,7 +185,9 @@ static struct render_mmio gen9_render_mmio_list[] = {
 	{RCS, _MMIO(0x4df0), 0, false},
 	{RCS, _MMIO(0x4df4), 0, false},
 
-	{BCS, _MMIO(0x2229c), 0xffff, false},
+	{BCS, _MMIO(0x2229c), 0xffff, false,
+		render_mmio_override_gfx_mode,
+		render_mmio_restore},
 	{BCS, _MMIO(0x2209c), 0xffff, false},
 	{BCS, _MMIO(0x220c0), 0xffff, false},
 	{BCS, _MMIO(0x22098), 0x0, false},
-- 
2.7.4




More information about the intel-gvt-dev mailing list