Commit feddf6e8 authored by Zhenyu Wang's avatar Zhenyu Wang

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.

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: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarZhenyu Wang <zhenyuw@linux.intel.com>
parent 1140f9ed
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
*/ */
#include "i915_drv.h" #include "i915_drv.h"
#include "gvt.h"
#define MB_TO_BYTES(mb) ((mb) << 20ULL) #define MB_TO_BYTES(mb) ((mb) << 20ULL)
#define BYTES_TO_MB(b) ((b) >> 20ULL) #define BYTES_TO_MB(b) ((b) >> 20ULL)
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
*/ */
#include "i915_drv.h" #include "i915_drv.h"
#include "gvt.h"
enum { enum {
INTEL_GVT_PCI_BAR_GTTMMIO = 0, INTEL_GVT_PCI_BAR_GTTMMIO = 0,
......
...@@ -36,6 +36,8 @@ ...@@ -36,6 +36,8 @@
#include <linux/slab.h> #include <linux/slab.h>
#include "i915_drv.h" #include "i915_drv.h"
#include "gvt.h"
#include "i915_pvinfo.h"
#include "trace.h" #include "trace.h"
#define INVALID_OP (~0U) #define INVALID_OP (~0U)
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
*/ */
#include "i915_drv.h" #include "i915_drv.h"
#include "gvt.h"
static int get_edp_pipe(struct intel_vgpu *vgpu) static int get_edp_pipe(struct intel_vgpu *vgpu)
{ {
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
*/ */
#include "i915_drv.h" #include "i915_drv.h"
#include "gvt.h"
#define GMBUS1_TOTAL_BYTES_SHIFT 16 #define GMBUS1_TOTAL_BYTES_SHIFT 16
#define GMBUS1_TOTAL_BYTES_MASK 0x1ff #define GMBUS1_TOTAL_BYTES_MASK 0x1ff
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
*/ */
#include "i915_drv.h" #include "i915_drv.h"
#include "gvt.h"
#define _EL_OFFSET_STATUS 0x234 #define _EL_OFFSET_STATUS 0x234
#define _EL_OFFSET_STATUS_BUF 0x370 #define _EL_OFFSET_STATUS_BUF 0x370
......
...@@ -32,6 +32,8 @@ ...@@ -32,6 +32,8 @@
#include <linux/crc32.h> #include <linux/crc32.h>
#include "i915_drv.h" #include "i915_drv.h"
#include "gvt.h"
#include "i915_pvinfo.h"
#define FIRMWARE_VERSION (0x0) #define FIRMWARE_VERSION (0x0)
......
...@@ -34,6 +34,8 @@ ...@@ -34,6 +34,8 @@
*/ */
#include "i915_drv.h" #include "i915_drv.h"
#include "gvt.h"
#include "i915_pvinfo.h"
#include "trace.h" #include "trace.h"
static bool enable_out_of_sync = false; static bool enable_out_of_sync = false;
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <linux/kthread.h> #include <linux/kthread.h>
#include "i915_drv.h" #include "i915_drv.h"
#include "gvt.h"
struct intel_gvt_host intel_gvt_host; struct intel_gvt_host intel_gvt_host;
...@@ -173,9 +174,9 @@ static int init_service_thread(struct intel_gvt *gvt) ...@@ -173,9 +174,9 @@ static int init_service_thread(struct intel_gvt *gvt)
*/ */
void intel_gvt_clean_device(struct drm_i915_private *dev_priv) 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; return;
clean_service_thread(gvt); clean_service_thread(gvt);
...@@ -188,7 +189,8 @@ void intel_gvt_clean_device(struct drm_i915_private *dev_priv) ...@@ -188,7 +189,8 @@ void intel_gvt_clean_device(struct drm_i915_private *dev_priv)
intel_gvt_clean_mmio_info(gvt); intel_gvt_clean_mmio_info(gvt);
intel_gvt_free_firmware(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) ...@@ -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) int intel_gvt_init_device(struct drm_i915_private *dev_priv)
{ {
struct intel_gvt *gvt = &dev_priv->gvt; struct intel_gvt *gvt;
int ret; int ret;
/* /*
...@@ -214,9 +216,13 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv) ...@@ -214,9 +216,13 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv)
if (WARN_ON(!intel_gvt_host.initialized)) if (WARN_ON(!intel_gvt_host.initialized))
return -EINVAL; return -EINVAL;
if (WARN_ON(gvt->initialized)) if (WARN_ON(dev_priv->gvt))
return -EEXIST; return -EEXIST;
gvt = kzalloc(sizeof(struct intel_gvt), GFP_KERNEL);
if (!gvt)
return -ENOMEM;
gvt_dbg_core("init gvt device\n"); gvt_dbg_core("init gvt device\n");
mutex_init(&gvt->lock); mutex_init(&gvt->lock);
...@@ -261,7 +267,7 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv) ...@@ -261,7 +267,7 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv)
goto out_clean_cmd_parser; goto out_clean_cmd_parser;
gvt_dbg_core("gvt device creation is done\n"); gvt_dbg_core("gvt device creation is done\n");
gvt->initialized = true; dev_priv->gvt = gvt;
return 0; return 0;
out_clean_cmd_parser: out_clean_cmd_parser:
...@@ -280,5 +286,6 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv) ...@@ -280,5 +286,6 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv)
intel_gvt_free_firmware(gvt); intel_gvt_free_firmware(gvt);
out_clean_mmio_info: out_clean_mmio_info:
intel_gvt_clean_mmio_info(gvt); intel_gvt_clean_mmio_info(gvt);
kfree(gvt);
return ret; return ret;
} }
...@@ -192,8 +192,6 @@ struct intel_gvt_opregion { ...@@ -192,8 +192,6 @@ struct intel_gvt_opregion {
struct intel_gvt { struct intel_gvt {
struct mutex lock; struct mutex lock;
bool initialized;
struct drm_i915_private *dev_priv; struct drm_i915_private *dev_priv;
struct idr vgpu_idr; /* vGPU IDR pool */ struct idr vgpu_idr; /* vGPU IDR pool */
...@@ -213,6 +211,11 @@ struct intel_gvt { ...@@ -213,6 +211,11 @@ struct intel_gvt {
unsigned long service_request; unsigned long service_request;
}; };
static inline struct intel_gvt *to_gvt(struct drm_i915_private *i915)
{
return i915->gvt;
}
enum { enum {
INTEL_GVT_REQUEST_EMULATE_VBLANK = 0, INTEL_GVT_REQUEST_EMULATE_VBLANK = 0,
}; };
......
...@@ -37,6 +37,8 @@ ...@@ -37,6 +37,8 @@
*/ */
#include "i915_drv.h" #include "i915_drv.h"
#include "gvt.h"
#include "i915_pvinfo.h"
/* XXX FIXME i915 has changed PP_XXX definition */ /* XXX FIXME i915 has changed PP_XXX definition */
#define PCH_PP_STATUS _MMIO(0xc7200) #define PCH_PP_STATUS _MMIO(0xc7200)
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
*/ */
#include "i915_drv.h" #include "i915_drv.h"
#include "gvt.h"
/* common offset among interrupt control registers */ /* common offset among interrupt control registers */
#define regbase_to_isr(base) (base) #define regbase_to_isr(base) (base)
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
*/ */
#include "i915_drv.h" #include "i915_drv.h"
#include "gvt.h"
/** /**
* intel_vgpu_gpa_to_mmio_offset - translate a GPA to MMIO offset * intel_vgpu_gpa_to_mmio_offset - translate a GPA to MMIO offset
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/acpi.h> #include <linux/acpi.h>
#include "i915_drv.h" #include "i915_drv.h"
#include "gvt.h"
static int init_vgpu_opregion(struct intel_vgpu *vgpu, u32 gpa) static int init_vgpu_opregion(struct intel_vgpu *vgpu, u32 gpa)
{ {
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
*/ */
#include "i915_drv.h" #include "i915_drv.h"
#include "gvt.h"
struct render_mmio { struct render_mmio {
int ring_id; int ring_id;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
*/ */
#include "i915_drv.h" #include "i915_drv.h"
#include "gvt.h"
static bool vgpu_has_pending_workload(struct intel_vgpu *vgpu) static bool vgpu_has_pending_workload(struct intel_vgpu *vgpu)
{ {
......
...@@ -33,10 +33,11 @@ ...@@ -33,10 +33,11 @@
* *
*/ */
#include "i915_drv.h"
#include <linux/kthread.h> #include <linux/kthread.h>
#include "i915_drv.h"
#include "gvt.h"
#define RING_CTX_OFF(x) \ #define RING_CTX_OFF(x) \
offsetof(struct execlist_ring_context, x) offsetof(struct execlist_ring_context, x)
......
...@@ -32,6 +32,8 @@ ...@@ -32,6 +32,8 @@
*/ */
#include "i915_drv.h" #include "i915_drv.h"
#include "gvt.h"
#include "i915_pvinfo.h"
static void clean_vgpu_mmio(struct intel_vgpu *vgpu) static void clean_vgpu_mmio(struct intel_vgpu *vgpu)
{ {
......
...@@ -1778,7 +1778,7 @@ struct drm_i915_private { ...@@ -1778,7 +1778,7 @@ struct drm_i915_private {
struct i915_virtual_gpu vgpu; struct i915_virtual_gpu vgpu;
struct intel_gvt gvt; struct intel_gvt *gvt;
struct intel_guc guc; struct intel_guc guc;
...@@ -2992,7 +2992,7 @@ int intel_wait_for_register_fw(struct drm_i915_private *dev_priv, ...@@ -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) 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) static inline bool intel_vgpu_active(struct drm_i915_private *dev_priv)
......
...@@ -24,8 +24,7 @@ ...@@ -24,8 +24,7 @@
#ifndef _INTEL_GVT_H_ #ifndef _INTEL_GVT_H_
#define _INTEL_GVT_H_ #define _INTEL_GVT_H_
#include "i915_pvinfo.h" struct intel_gvt;
#include "gvt/gvt.h"
#ifdef CONFIG_DRM_I915_GVT #ifdef CONFIG_DRM_I915_GVT
int intel_gvt_init(struct drm_i915_private *dev_priv); int intel_gvt_init(struct drm_i915_private *dev_priv);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment