drm/i915/gvt: clean up intel_gvt.h as interface for i915 core
authorZhenyu Wang <zhenyuw@linux.intel.com>
Thu, 20 Oct 2016 09:15:03 +0000 (17:15 +0800)
committerZhenyu Wang <zhenyuw@linux.intel.com>
Thu, 20 Oct 2016 09:18:30 +0000 (17:18 +0800)
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.

v2: Fix per Chris's comment
- carefully handle dev_priv->gvt assignment
- add necessary bracket for macro helper
- forward declartion struct intel_gvt
- keep free operation within same file handling alloc

v3: fix use after free and remove intel_gvt.initialized

v4: change to_gvt() to an inline

Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
20 files changed:
drivers/gpu/drm/i915/gvt/aperture_gm.c
drivers/gpu/drm/i915/gvt/cfg_space.c
drivers/gpu/drm/i915/gvt/cmd_parser.c
drivers/gpu/drm/i915/gvt/display.c
drivers/gpu/drm/i915/gvt/edid.c
drivers/gpu/drm/i915/gvt/execlist.c
drivers/gpu/drm/i915/gvt/firmware.c
drivers/gpu/drm/i915/gvt/gtt.c
drivers/gpu/drm/i915/gvt/gvt.c
drivers/gpu/drm/i915/gvt/gvt.h
drivers/gpu/drm/i915/gvt/handlers.c
drivers/gpu/drm/i915/gvt/interrupt.c
drivers/gpu/drm/i915/gvt/mmio.c
drivers/gpu/drm/i915/gvt/opregion.c
drivers/gpu/drm/i915/gvt/render.c
drivers/gpu/drm/i915/gvt/sched_policy.c
drivers/gpu/drm/i915/gvt/scheduler.c
drivers/gpu/drm/i915/gvt/vgpu.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/intel_gvt.h

index e0211f83bd93b1ad0cd2e14f1f3eb21f1a407213..db503c164b2fec4aa7085449b06561724b0e477e 100644 (file)
@@ -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)
index 16360e449ed08e8ef031d1da7134bae9e7cb78bb..4c687740f5f11b854553d855b86fa1965d142d51 100644 (file)
@@ -32,6 +32,7 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
 
 enum {
        INTEL_GVT_PCI_BAR_GTTMMIO = 0,
index 5808ee7c19356a2246e81e04c11ebb5a27603f13..5b4658ff4d8acfdfe48d5da64ac57be8cf901423 100644 (file)
@@ -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)
index 534000b91681549beaab7fe1490b8ec1ce172a12..d8908d4cd09a4687bd444ee55229247a58b3cd0a 100644 (file)
@@ -33,6 +33,7 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
 
 static int get_edp_pipe(struct intel_vgpu *vgpu)
 {
index a07e4276126ccbb3cd8a82e4f284e319deee11cc..7e1da1c563ca8453cf2eab237994a6b8f5eb6c88 100644 (file)
@@ -33,6 +33,7 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
 
 #define GMBUS1_TOTAL_BYTES_SHIFT 16
 #define GMBUS1_TOTAL_BYTES_MASK 0x1ff
index c50a3d1a5131424e8fe0bfeb49986410e232e0fc..b87b4f5e4c8f4c2baa8580f70a042c302b074862 100644 (file)
@@ -33,6 +33,7 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
 
 #define _EL_OFFSET_STATUS       0x234
 #define _EL_OFFSET_STATUS_BUF   0x370
index 4578a4d69a09132a57986ab8e3b61fc4a9ccf165..d068a524a6992767a0109200a755057ed7bef944 100644 (file)
@@ -32,6 +32,8 @@
 #include <linux/crc32.h>
 
 #include "i915_drv.h"
+#include "gvt.h"
+#include "i915_pvinfo.h"
 
 #define FIRMWARE_VERSION (0x0)
 
index 29de179920e8b651ffd0235b5da39e859de8dcf0..0722d1e61fceaff33b4fae176313d7d0c59bccf1 100644 (file)
@@ -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;
index e72e26c61a156c6a57137277b78f25a69c768076..31b59d40f3fb41ad86293812ba160b2ec1129fe8 100644 (file)
@@ -35,6 +35,7 @@
 #include <linux/kthread.h>
 
 #include "i915_drv.h"
+#include "gvt.h"
 
 struct intel_gvt_host intel_gvt_host;
 
@@ -173,9 +174,9 @@ 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))
+       if (WARN_ON(!gvt))
                return;
 
        clean_service_thread(gvt);
@@ -188,7 +189,8 @@ void intel_gvt_clean_device(struct drm_i915_private *dev_priv)
        intel_gvt_clean_mmio_info(gvt);
        intel_gvt_free_firmware(gvt);
 
-       gvt->initialized = false;
+       kfree(dev_priv->gvt);
+       dev_priv->gvt = NULL;
 }
 
 /**
@@ -204,7 +206,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 +216,13 @@ 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;
 
+       gvt = kzalloc(sizeof(struct intel_gvt), GFP_KERNEL);
+       if (!gvt)
+               return -ENOMEM;
+
        gvt_dbg_core("init gvt device\n");
 
        mutex_init(&gvt->lock);
@@ -261,7 +267,7 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv)
                goto out_clean_cmd_parser;
 
        gvt_dbg_core("gvt device creation is done\n");
-       gvt->initialized = true;
+       dev_priv->gvt = gvt;
        return 0;
 
 out_clean_cmd_parser:
@@ -280,5 +286,6 @@ out_free_firmware:
        intel_gvt_free_firmware(gvt);
 out_clean_mmio_info:
        intel_gvt_clean_mmio_info(gvt);
+       kfree(gvt);
        return ret;
 }
index 1564554b745979e396839911ff00e333f91f9122..15c595e0a63b62893647b1a1429cd8acd057132f 100644 (file)
@@ -192,8 +192,6 @@ struct intel_gvt_opregion {
 
 struct intel_gvt {
        struct mutex lock;
-       bool initialized;
-
        struct drm_i915_private *dev_priv;
        struct idr vgpu_idr;    /* vGPU IDR pool */
 
@@ -213,6 +211,11 @@ struct intel_gvt {
        unsigned long service_request;
 };
 
+static inline struct intel_gvt *to_gvt(struct drm_i915_private *i915)
+{
+       return i915->gvt;
+}
+
 enum {
        INTEL_GVT_REQUEST_EMULATE_VBLANK = 0,
 };
index e8ec403b75a1831ad7a38b37e2e5424004cb5924..b21115fecf860f6a6bfc0ebcbade06265d610481 100644 (file)
@@ -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)
index 84d7174d0081d3770cd890200a458d8e5a59334d..e43ef72285574d936f3915692dd2bc4dc53e4b52 100644 (file)
@@ -30,6 +30,7 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
 
 /* common offset among interrupt control registers */
 #define regbase_to_isr(base)   (base)
index ce3af95d049f16baf38de854e52d363eadc92285..585b01f632544c8994c5eb46eef4e5ae7434824c 100644 (file)
@@ -34,6 +34,7 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
 
 /**
  * intel_vgpu_gpa_to_mmio_offset - translate a GPA to MMIO offset
index 46cc2407a0a22b96c3da65c3377345eb857951d9..53ac81f63c6451b058b3bdf6666807da19b39bbb 100644 (file)
@@ -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)
 {
index f54ab8540b12ad777db146b5024c74edce023864..feebb65ba6417c8df4268aa9f9904f2cb54cb89a 100644 (file)
@@ -34,6 +34,7 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
 
 struct render_mmio {
        int ring_id;
index c607354c379802c54f92edf243f8453b3ba5e617..278db0c180fc9287d98bf70620ea844a07ba569f 100644 (file)
@@ -32,6 +32,7 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
 
 static bool vgpu_has_pending_workload(struct intel_vgpu *vgpu)
 {
index b15cdf5978a9e65380638853cf11ae025c3f6908..01d23ad03637ff11551e5a085ed947557c711794 100644 (file)
  *
  */
 
-#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)
 
index e5e0a72336c83ba3102e950a18374dbfdc6a7ec8..9401436d721fe922adde13d1f281026e50bf8c16 100644 (file)
@@ -32,6 +32,8 @@
  */
 
 #include "i915_drv.h"
+#include "gvt.h"
+#include "i915_pvinfo.h"
 
 static void clean_vgpu_mmio(struct intel_vgpu *vgpu)
 {
index 4d1133ffe0938871e285d9b5821ae2351f9d65ec..5024ad91d132742dbbbaf3138cddbdd8b1f46bd6 100644 (file)
@@ -1778,7 +1778,7 @@ struct drm_i915_private {
 
        struct i915_virtual_gpu vgpu;
 
-       struct intel_gvt gvt;
+       struct intel_gvt *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;
 }
 
 static inline bool intel_vgpu_active(struct drm_i915_private *dev_priv)
index 0f00105f4c5ddeb1ddcf300e5f3d72c0c1aad5c3..25df2d65b985cec58c5294cb9c91199e0d86177d 100644 (file)
@@ -24,8 +24,7 @@
 #ifndef _INTEL_GVT_H_
 #define _INTEL_GVT_H_
 
-#include "i915_pvinfo.h"
-#include "gvt/gvt.h"
+struct intel_gvt;
 
 #ifdef CONFIG_DRM_I915_GVT
 int intel_gvt_init(struct drm_i915_private *dev_priv);