Skip to contentSkip to conversation

drm/i915/gvt: clean up intel_gvt.h as interface for i915 core

PATCH Superseded Zhenyu Wang 2 participants 3 messages Oct 20, 2016

Subsystems (5)

v1 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 drm/i915/gvt: clean up intel_gvt.h as interface for i915 core

i915 core should only call functions and structures exposed through intel_gvt.h. Remove internal gvt.h and i915_pvinfo.h.

Change for internal intel_gvt structure as private handler which not requires to expose gvt internal structure for i915 core.

---
 drivers/gpu/drm/i915/gvt/aperture_gm.c  |  1 +
 drivers/gpu/drm/i915/gvt/cfg_space.c    |  1 +
 drivers/gpu/drm/i915/gvt/cmd_parser.c   |  2 ++
 drivers/gpu/drm/i915/gvt/display.c      |  1 +
 drivers/gpu/drm/i915/gvt/edid.c         |  1 +
 drivers/gpu/drm/i915/gvt/execlist.c     |  1 +
 drivers/gpu/drm/i915/gvt/firmware.c     |  2 ++
 drivers/gpu/drm/i915/gvt/gtt.c          |  2 ++
 drivers/gpu/drm/i915/gvt/gvt.c          | 14 +++++++++++---
 drivers/gpu/drm/i915/gvt/gvt.h          |  2 ++
 drivers/gpu/drm/i915/gvt/handlers.c     |  2 ++
 drivers/gpu/drm/i915/gvt/interrupt.c    |  1 +
 drivers/gpu/drm/i915/gvt/mmio.c         |  1 +
 drivers/gpu/drm/i915/gvt/opregion.c     |  1 +
 drivers/gpu/drm/i915/gvt/render.c       |  1 +
 drivers/gpu/drm/i915/gvt/sched_policy.c |  1 +
 drivers/gpu/drm/i915/gvt/scheduler.c    |  5 +++--
 drivers/gpu/drm/i915/gvt/vgpu.c         |  2 ++
 drivers/gpu/drm/i915/i915_drv.h         |  4 ++--
 drivers/gpu/drm/i915/intel_gvt.c        |  1 +
 drivers/gpu/drm/i915/intel_gvt.h        |  3 ---
 21 files changed, 39 insertions(+), 10 deletions(-)
drivers/gpu/drm/i915/gvt/aperture_gm.c +1 -0
index e0211f8..db503c1 100644
@@ -35,6 +35,7 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
 
 #define MB_TO_BYTES(mb) ((mb) << 20ULL)
 #define BYTES_TO_MB(b) ((b) >> 20ULL)
drivers/gpu/drm/i915/gvt/cfg_space.c +1 -0
index 16360e4..4c68774 100644
@@ -32,6 +32,7 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
 
 enum {
 	INTEL_GVT_PCI_BAR_GTTMMIO = 0,
drivers/gpu/drm/i915/gvt/cmd_parser.c +2 -0
index 5808ee7..5b4658f 100644
@@ -36,6 +36,8 @@
 
 #include <linux/slab.h>
 #include "i915_drv.h"
+#include "gvt.h"
+#include "i915_pvinfo.h"
 #include "trace.h"
 
 #define INVALID_OP    (~0U)
drivers/gpu/drm/i915/gvt/display.c +1 -0
index 534000b..d8908d4 100644
@@ -33,6 +33,7 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
 
 static int get_edp_pipe(struct intel_vgpu *vgpu)
 {
drivers/gpu/drm/i915/gvt/edid.c +1 -0
index a07e427..7e1da1c 100644
@@ -33,6 +33,7 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
 
 #define GMBUS1_TOTAL_BYTES_SHIFT 16
 #define GMBUS1_TOTAL_BYTES_MASK 0x1ff
drivers/gpu/drm/i915/gvt/execlist.c +1 -0
index c50a3d1..b87b4f5 100644
@@ -33,6 +33,7 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
 
 #define _EL_OFFSET_STATUS       0x234
 #define _EL_OFFSET_STATUS_BUF   0x370
drivers/gpu/drm/i915/gvt/firmware.c +2 -0
index 4578a4d..d068a52 100644
@@ -32,6 +32,8 @@
 #include <linux/crc32.h>
 
 #include "i915_drv.h"
+#include "gvt.h"
+#include "i915_pvinfo.h"
 
 #define FIRMWARE_VERSION (0x0)
 
drivers/gpu/drm/i915/gvt/gtt.c +2 -0
index 29de179..0722d1e 100644
@@ -34,6 +34,8 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
+#include "i915_pvinfo.h"
 #include "trace.h"
 
 static bool enable_out_of_sync = false;
drivers/gpu/drm/i915/gvt/gvt.c +11 -3
index e72e26c..be9ccc8 100644
@@ -35,6 +35,7 @@
 #include <linux/kthread.h>
 
 #include "i915_drv.h"
+#include "gvt.h"
 
 struct intel_gvt_host intel_gvt_host;
 
@@ -173,7 +174,7 @@ static int init_service_thread(struct intel_gvt *gvt)
  */
 void intel_gvt_clean_device(struct drm_i915_private *dev_priv)
 {
-	struct intel_gvt *gvt = &dev_priv->gvt;
+	struct intel_gvt *gvt = to_gvt(dev_priv);
 
 	if (WARN_ON(!gvt->initialized))
 		return;
@@ -204,7 +205,7 @@ void intel_gvt_clean_device(struct drm_i915_private *dev_priv)
  */
 int intel_gvt_init_device(struct drm_i915_private *dev_priv)
 {
-	struct intel_gvt *gvt = &dev_priv->gvt;
+	struct intel_gvt *gvt;
 	int ret;
 
 	/*
@@ -214,9 +215,15 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv)
 	if (WARN_ON(!intel_gvt_host.initialized))
 		return -EINVAL;
 
-	if (WARN_ON(gvt->initialized))
+	if (WARN_ON(dev_priv->gvt))
 		return -EEXIST;
 
+	dev_priv->gvt = kzalloc(sizeof(struct intel_gvt), GFP_KERNEL);
+	if (!dev_priv->gvt)
+		return -ENOMEM;
+
+	gvt = to_gvt(dev_priv);
+
 	gvt_dbg_core("init gvt device\n");
 
 	mutex_init(&gvt->lock);
@@ -280,5 +287,6 @@ out_free_firmware:
 	intel_gvt_free_firmware(gvt);
 out_clean_mmio_info:
 	intel_gvt_clean_mmio_info(gvt);
+	kfree(dev_priv->gvt);
 	return ret;
 }
drivers/gpu/drm/i915/gvt/gvt.h +2 -0
index 1564554..fd33e6b 100644
@@ -213,6 +213,8 @@ struct intel_gvt {
 	unsigned long service_request;
 };
 
+#define to_gvt(dev_priv) (struct intel_gvt *)(dev_priv->gvt)
+
 enum {
 	INTEL_GVT_REQUEST_EMULATE_VBLANK = 0,
 };
drivers/gpu/drm/i915/gvt/handlers.c +2 -0
index e8ec403..b21115f 100644
@@ -37,6 +37,8 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
+#include "i915_pvinfo.h"
 
 /* XXX FIXME i915 has changed PP_XXX definition */
 #define PCH_PP_STATUS  _MMIO(0xc7200)
drivers/gpu/drm/i915/gvt/interrupt.c +1 -0
index 84d7174..e43ef72 100644
@@ -30,6 +30,7 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
 
 /* common offset among interrupt control registers */
 #define regbase_to_isr(base)	(base)
drivers/gpu/drm/i915/gvt/mmio.c +1 -0
index ce3af95..585b01f 100644
@@ -34,6 +34,7 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
 
 /**
  * intel_vgpu_gpa_to_mmio_offset - translate a GPA to MMIO offset
drivers/gpu/drm/i915/gvt/opregion.c +1 -0
index 46cc240..53ac81f 100644
@@ -23,6 +23,7 @@
 
 #include <linux/acpi.h>
 #include "i915_drv.h"
+#include "gvt.h"
 
 static int init_vgpu_opregion(struct intel_vgpu *vgpu, u32 gpa)
 {
drivers/gpu/drm/i915/gvt/render.c +1 -0
index f54ab85..feebb65 100644
@@ -34,6 +34,7 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
 
 struct render_mmio {
 	int ring_id;
drivers/gpu/drm/i915/gvt/sched_policy.c +1 -0
index c607354..278db0c 100644
@@ -32,6 +32,7 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
 
 static bool vgpu_has_pending_workload(struct intel_vgpu *vgpu)
 {
drivers/gpu/drm/i915/gvt/scheduler.c +3 -2
index b15cdf5..01d23ad 100644
@@ -33,10 +33,11 @@
  *
  */
 
-#include "i915_drv.h"
-
 #include <linux/kthread.h>
 
+#include "i915_drv.h"
+#include "gvt.h"
+
 #define RING_CTX_OFF(x) \
 	offsetof(struct execlist_ring_context, x)
 
drivers/gpu/drm/i915/gvt/vgpu.c +2 -0
index e5e0a72..9401436 100644
@@ -32,6 +32,8 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
+#include "i915_pvinfo.h"
 
 static void clean_vgpu_mmio(struct intel_vgpu *vgpu)
 {
drivers/gpu/drm/i915/i915_drv.h +2 -2
index 4d1133f..964d33d 100644
@@ -1778,7 +1778,7 @@ struct drm_i915_private {
 
 	struct i915_virtual_gpu vgpu;
 
-	struct intel_gvt gvt;
+	void *gvt;
 
 	struct intel_guc guc;
 
@@ -2992,7 +2992,7 @@ int intel_wait_for_register_fw(struct drm_i915_private *dev_priv,
 
 static inline bool intel_gvt_active(struct drm_i915_private *dev_priv)
 {
-	return dev_priv->gvt.initialized;
+	return (dev_priv->gvt != NULL);
 }
 
 static inline bool intel_vgpu_active(struct drm_i915_private *dev_priv)
drivers/gpu/drm/i915/intel_gvt.c +1 -0
index 8e8596d..bae1a7d 100644
@@ -103,4 +103,5 @@ void intel_gvt_cleanup(struct drm_i915_private *dev_priv)
 		return;
 
 	intel_gvt_clean_device(dev_priv);
+	kfree(dev_priv->gvt);
 }
drivers/gpu/drm/i915/intel_gvt.h +0 -3
index 0f00105..0a9822d 100644
@@ -24,9 +24,6 @@
 #ifndef _INTEL_GVT_H_
 #define _INTEL_GVT_H_
 
-#include "i915_pvinfo.h"
-#include "gvt/gvt.h"
-
 #ifdef CONFIG_DRM_I915_GVT
 int intel_gvt_init(struct drm_i915_private *dev_priv);
 void intel_gvt_cleanup(struct drm_i915_private *dev_priv);
Signature · 6 lines
2.9.3

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
#1 lore raw

PATCH 1/1 Documentation/gpu: Add section for Intel GVT-g host support

Update with brief overview and reference for more detailed arch design documents.

Add new section for Intel GVT-g host support.

---
 Documentation/gpu/i915.rst       | 9 +++++++++
 drivers/gpu/drm/i915/intel_gvt.c | 8 ++++++--
 2 files changed, 15 insertions(+), 2 deletions(-)
Documentation/gpu/i915.rst +9 -0
index 87aaffc..95ce77f 100644
@@ -49,6 +49,15 @@ Intel GVT-g Guest Support(vGPU)
 .. kernel-doc:: drivers/gpu/drm/i915/i915_vgpu.c
    :internal:
 
+Intel GVT-g Host Support(vGPU device model)
+-------------------------------------------
+
+.. kernel-doc:: drivers/gpu/drm/i915/intel_gvt.c
+   :doc: Intel GVT-g host support
+
+.. kernel-doc:: drivers/gpu/drm/i915/intel_gvt.c
+   :internal:
+
 Display Hardware Handling
 =========================
 
drivers/gpu/drm/i915/intel_gvt.c +6 -2
index bae1a7d..88126b6 100644
@@ -31,8 +31,12 @@
  * GPU among multiple virtual machines on a time-sharing basis. Each
  * virtual machine is presented a virtual GPU (vGPU), which has equivalent
  * features as the underlying physical GPU (pGPU), so i915 driver can run
- * seamlessly in a virtual machine. This file provides the englightments
- * of GVT and the necessary components used by GVT in i915 driver.
+ * seamlessly in a virtual machine.
+ *
+ * To virtualize GPU resources GVT-g driver depends on hypervisor technology
+ * e.g KVM/VFIO/mdev, Xen, etc. to provide resource access trapping capability
+ * and be virtualized within GVT-g device module. More architectural design
+ * doc is available on https://01.org/group/2230/documentation-list.
  */
 
 static bool is_supported_device(struct drm_i915_private *dev_priv)
Signature · 6 lines
2.9.3

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
#2 lore raw
In reply to Zhenyu Wang
Quoted 18 lines · Zhenyu Wang
drivers/gpu/drm/i915/gvt/gvt.c +7 -1
@@ -214,9 +215,15 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv)
 	if (WARN_ON(!intel_gvt_host.initialized))
 		return -EINVAL;
 
-	if (WARN_ON(gvt->initialized))
+	if (WARN_ON(dev_priv->gvt))
 		return -EEXIST;
 
+	dev_priv->gvt = kzalloc(sizeof(struct intel_gvt), GFP_KERNEL);
+	if (!dev_priv->gvt)
+		return -ENOMEM;
+
+	gvt = to_gvt(dev_priv);
+
 	gvt_dbg_core("init gvt device\n");
 
 	mutex_init(&gvt->lock);

drivers/gpu/drm/i915/gvt/gvt.c out_free_firmware: · line 290

Quoted 4 lines
drivers/gpu/drm/i915/gvt/gvt.c +1 -0
@@ -280,5 +287,6 @@ out_free_firmware:
 	intel_gvt_free_firmware(gvt);
 out_clean_mmio_info:
 	intel_gvt_clean_mmio_info(gvt);
+	kfree(dev_priv->gvt);

And now dev_priv->gvt points where? What does
intel_gvt_active() think about that?

Allocate to the local gvt, and assign that to dev_priv->gvt at the end once initialised and it has passed all the tests.

drivers/gpu/drm/i915/gvt/gvt.h struct intel_gvt { · line 216

Quoted 9 lines
drivers/gpu/drm/i915/gvt/gvt.h +1 -0
index 1564554..fd33e6b 100644
@@ -213,6 +213,8 @@ struct intel_gvt {
 	unsigned long service_request;
 };
 
+#define to_gvt(dev_priv) (struct intel_gvt *)(dev_priv->gvt)

Why so few brackets? Like to play dangerously?

drivers/gpu/drm/i915/i915_drv.h struct drm_i915_private { · line 1781

Quoted 10 lines
drivers/gpu/drm/i915/i915_drv.h +1 -1
index 4d1133f..964d33d 100644
@@ -1778,7 +1778,7 @@ struct drm_i915_private {
 
 	struct i915_virtual_gpu vgpu;
 
-	struct intel_gvt gvt;
+	void *gvt;

Better to have a struct intel_gvt forward declaration than a void *.

drivers/gpu/drm/i915/i915_drv.h int intel_wait_for_register_fw(struct drm_i915_private *dev_priv, · line 2995

Quoted 8 lines
drivers/gpu/drm/i915/i915_drv.h +1 -1
 	struct intel_guc guc;
 
@@ -2992,7 +2992,7 @@ int intel_wait_for_register_fw(struct drm_i915_private *dev_priv,
 
 static inline bool intel_gvt_active(struct drm_i915_private *dev_priv)
 {
-	return dev_priv->gvt.initialized;
+	return (dev_priv->gvt != NULL);

(Why (so (many (brackets))))? Why redundant tests, why not Zoidberg?

drivers/gpu/drm/i915/intel_gvt.c void intel_gvt_cleanup(struct drm_i915_private *dev_priv) · line 106

Quoted 12 lines
drivers/gpu/drm/i915/i915_drv.h +0 -0
 }
 
 static inline bool intel_vgpu_active(struct drm_i915_private *dev_priv)
drivers/gpu/drm/i915/intel_gvt.c +1 -0
index 8e8596d..bae1a7d 100644
@@ -103,4 +103,5 @@ void intel_gvt_cleanup(struct drm_i915_private *dev_priv)
 		return;
 
 	intel_gvt_clean_device(dev_priv);
+	kfree(dev_priv->gvt);

It wasn't allocated in intel_gvt.c, it shouldn't be freed here either. -Chris

Signature · 5 lines
Chris Wilson, Intel Open Source Technology Centre
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx