Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>

+44 -14
+1
drivers/gpu/drm/i915/gvt/aperture_gm.c
··· 35 35 */ 36 36 37 37 #include "i915_drv.h" 38 + #include "gvt.h" 38 39 39 40 #define MB_TO_BYTES(mb) ((mb) << 20ULL) 40 41 #define BYTES_TO_MB(b) ((b) >> 20ULL)
+1
drivers/gpu/drm/i915/gvt/cfg_space.c
··· 32 32 */ 33 33 34 34 #include "i915_drv.h" 35 + #include "gvt.h" 35 36 36 37 enum { 37 38 INTEL_GVT_PCI_BAR_GTTMMIO = 0,
+2
drivers/gpu/drm/i915/gvt/cmd_parser.c
··· 36 36 37 37 #include <linux/slab.h> 38 38 #include "i915_drv.h" 39 + #include "gvt.h" 40 + #include "i915_pvinfo.h" 39 41 #include "trace.h" 40 42 41 43 #define INVALID_OP (~0U)
+1
drivers/gpu/drm/i915/gvt/display.c
··· 33 33 */ 34 34 35 35 #include "i915_drv.h" 36 + #include "gvt.h" 36 37 37 38 static int get_edp_pipe(struct intel_vgpu *vgpu) 38 39 {
+1
drivers/gpu/drm/i915/gvt/edid.c
··· 33 33 */ 34 34 35 35 #include "i915_drv.h" 36 + #include "gvt.h" 36 37 37 38 #define GMBUS1_TOTAL_BYTES_SHIFT 16 38 39 #define GMBUS1_TOTAL_BYTES_MASK 0x1ff
+1
drivers/gpu/drm/i915/gvt/execlist.c
··· 33 33 */ 34 34 35 35 #include "i915_drv.h" 36 + #include "gvt.h" 36 37 37 38 #define _EL_OFFSET_STATUS 0x234 38 39 #define _EL_OFFSET_STATUS_BUF 0x370
+2
drivers/gpu/drm/i915/gvt/firmware.c
··· 32 32 #include <linux/crc32.h> 33 33 34 34 #include "i915_drv.h" 35 + #include "gvt.h" 36 + #include "i915_pvinfo.h" 35 37 36 38 #define FIRMWARE_VERSION (0x0) 37 39
+2
drivers/gpu/drm/i915/gvt/gtt.c
··· 34 34 */ 35 35 36 36 #include "i915_drv.h" 37 + #include "gvt.h" 38 + #include "i915_pvinfo.h" 37 39 #include "trace.h" 38 40 39 41 static bool enable_out_of_sync = false;
+13 -6
drivers/gpu/drm/i915/gvt/gvt.c
··· 35 35 #include <linux/kthread.h> 36 36 37 37 #include "i915_drv.h" 38 + #include "gvt.h" 38 39 39 40 struct intel_gvt_host intel_gvt_host; 40 41 ··· 174 173 */ 175 174 void intel_gvt_clean_device(struct drm_i915_private *dev_priv) 176 175 { 177 - struct intel_gvt *gvt = &dev_priv->gvt; 176 + struct intel_gvt *gvt = to_gvt(dev_priv); 178 177 179 - if (WARN_ON(!gvt->initialized)) 178 + if (WARN_ON(!gvt)) 180 179 return; 181 180 182 181 clean_service_thread(gvt); ··· 189 188 intel_gvt_clean_mmio_info(gvt); 190 189 intel_gvt_free_firmware(gvt); 191 190 192 - gvt->initialized = false; 191 + kfree(dev_priv->gvt); 192 + dev_priv->gvt = NULL; 193 193 } 194 194 195 195 /** ··· 206 204 */ 207 205 int intel_gvt_init_device(struct drm_i915_private *dev_priv) 208 206 { 209 - struct intel_gvt *gvt = &dev_priv->gvt; 207 + struct intel_gvt *gvt; 210 208 int ret; 211 209 212 210 /* ··· 216 214 if (WARN_ON(!intel_gvt_host.initialized)) 217 215 return -EINVAL; 218 216 219 - if (WARN_ON(gvt->initialized)) 217 + if (WARN_ON(dev_priv->gvt)) 220 218 return -EEXIST; 219 + 220 + gvt = kzalloc(sizeof(struct intel_gvt), GFP_KERNEL); 221 + if (!gvt) 222 + return -ENOMEM; 221 223 222 224 gvt_dbg_core("init gvt device\n"); 223 225 ··· 267 261 goto out_clean_cmd_parser; 268 262 269 263 gvt_dbg_core("gvt device creation is done\n"); 270 - gvt->initialized = true; 264 + dev_priv->gvt = gvt; 271 265 return 0; 272 266 273 267 out_clean_cmd_parser: ··· 286 280 intel_gvt_free_firmware(gvt); 287 281 out_clean_mmio_info: 288 282 intel_gvt_clean_mmio_info(gvt); 283 + kfree(gvt); 289 284 return ret; 290 285 }
+5 -2
drivers/gpu/drm/i915/gvt/gvt.h
··· 192 192 193 193 struct intel_gvt { 194 194 struct mutex lock; 195 - bool initialized; 196 - 197 195 struct drm_i915_private *dev_priv; 198 196 struct idr vgpu_idr; /* vGPU IDR pool */ 199 197 ··· 210 212 wait_queue_head_t service_thread_wq; 211 213 unsigned long service_request; 212 214 }; 215 + 216 + static inline struct intel_gvt *to_gvt(struct drm_i915_private *i915) 217 + { 218 + return i915->gvt; 219 + } 213 220 214 221 enum { 215 222 INTEL_GVT_REQUEST_EMULATE_VBLANK = 0,
+2
drivers/gpu/drm/i915/gvt/handlers.c
··· 37 37 */ 38 38 39 39 #include "i915_drv.h" 40 + #include "gvt.h" 41 + #include "i915_pvinfo.h" 40 42 41 43 /* XXX FIXME i915 has changed PP_XXX definition */ 42 44 #define PCH_PP_STATUS _MMIO(0xc7200)
+1
drivers/gpu/drm/i915/gvt/interrupt.c
··· 30 30 */ 31 31 32 32 #include "i915_drv.h" 33 + #include "gvt.h" 33 34 34 35 /* common offset among interrupt control registers */ 35 36 #define regbase_to_isr(base) (base)
+1
drivers/gpu/drm/i915/gvt/mmio.c
··· 34 34 */ 35 35 36 36 #include "i915_drv.h" 37 + #include "gvt.h" 37 38 38 39 /** 39 40 * intel_vgpu_gpa_to_mmio_offset - translate a GPA to MMIO offset
+1
drivers/gpu/drm/i915/gvt/opregion.c
··· 23 23 24 24 #include <linux/acpi.h> 25 25 #include "i915_drv.h" 26 + #include "gvt.h" 26 27 27 28 static int init_vgpu_opregion(struct intel_vgpu *vgpu, u32 gpa) 28 29 {
+1
drivers/gpu/drm/i915/gvt/render.c
··· 34 34 */ 35 35 36 36 #include "i915_drv.h" 37 + #include "gvt.h" 37 38 38 39 struct render_mmio { 39 40 int ring_id;
+1
drivers/gpu/drm/i915/gvt/sched_policy.c
··· 32 32 */ 33 33 34 34 #include "i915_drv.h" 35 + #include "gvt.h" 35 36 36 37 static bool vgpu_has_pending_workload(struct intel_vgpu *vgpu) 37 38 {
+3 -2
drivers/gpu/drm/i915/gvt/scheduler.c
··· 33 33 * 34 34 */ 35 35 36 - #include "i915_drv.h" 37 - 38 36 #include <linux/kthread.h> 37 + 38 + #include "i915_drv.h" 39 + #include "gvt.h" 39 40 40 41 #define RING_CTX_OFF(x) \ 41 42 offsetof(struct execlist_ring_context, x)
+2
drivers/gpu/drm/i915/gvt/vgpu.c
··· 32 32 */ 33 33 34 34 #include "i915_drv.h" 35 + #include "gvt.h" 36 + #include "i915_pvinfo.h" 35 37 36 38 static void clean_vgpu_mmio(struct intel_vgpu *vgpu) 37 39 {
+2 -2
drivers/gpu/drm/i915/i915_drv.h
··· 1778 1778 1779 1779 struct i915_virtual_gpu vgpu; 1780 1780 1781 - struct intel_gvt gvt; 1781 + struct intel_gvt *gvt; 1782 1782 1783 1783 struct intel_guc guc; 1784 1784 ··· 2992 2992 2993 2993 static inline bool intel_gvt_active(struct drm_i915_private *dev_priv) 2994 2994 { 2995 - return dev_priv->gvt.initialized; 2995 + return dev_priv->gvt; 2996 2996 } 2997 2997 2998 2998 static inline bool intel_vgpu_active(struct drm_i915_private *dev_priv)
+1 -2
drivers/gpu/drm/i915/intel_gvt.h
··· 24 24 #ifndef _INTEL_GVT_H_ 25 25 #define _INTEL_GVT_H_ 26 26 27 - #include "i915_pvinfo.h" 28 - #include "gvt/gvt.h" 27 + struct intel_gvt; 29 28 30 29 #ifdef CONFIG_DRM_I915_GVT 31 30 int intel_gvt_init(struct drm_i915_private *dev_priv);