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

drm/i915/gvt: move the gvt code into kvmgt.ko

Instead of having an option to build the gvt code into the main i915
module, just move it into the kvmgt.ko module. This only requires
a new struct with three entries that the KVMGT modules needs to register
with the main i915 module, and a proper list of GVT-enabled devices
instead of global device pointer.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Zhi Wang <zhi.a.wang@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20220411141403.86980-7-hch@lst.de
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Zhi Wang <zhi.a.wang@intel.com>

authored by

Christoph Hellwig and committed by
Zhi Wang
8b750bf7 f49fc357

+195 -156
+13 -23
drivers/gpu/drm/i915/Kconfig
··· 102 102 If in doubt, say "Y". 103 103 104 104 config DRM_I915_GVT 105 - bool "Enable Intel GVT-g graphics virtualization host support" 105 + bool 106 + 107 + config DRM_I915_GVT_KVMGT 108 + tristate "Enable KVM host support Intel GVT-g graphics virtualization" 106 109 depends on DRM_I915 107 110 depends on X86 108 111 depends on 64BIT 109 - default n 112 + depends on KVM 113 + depends on VFIO_MDEV 114 + select DRM_I915_GVT 115 + select KVM_EXTERNAL_WRITE_TRACKING 116 + 110 117 help 111 118 Choose this option if you want to enable Intel GVT-g graphics 112 119 virtualization technology host support with integrated graphics. 113 120 With GVT-g, it's possible to have one integrated graphics 114 - device shared by multiple VMs under different hypervisors. 121 + device shared by multiple VMs under KVM. 115 122 116 - Note that at least one hypervisor like Xen or KVM is required for 117 - this driver to work, and it only supports newer device from 118 - Broadwell+. For further information and setup guide, you can 119 - visit: http://01.org/igvt-g. 120 - 121 - Now it's just a stub to support the modifications of i915 for 122 - GVT device model. It requires at least one MPT modules for Xen/KVM 123 - and other components of GVT device model to work. Use it under 124 - you own risk. 123 + Note that this driver only supports newer device from Broadwell on. 124 + For further information and setup guide, you can visit: 125 + http://01.org/igvt-g. 125 126 126 127 If in doubt, say "N". 127 - 128 - config DRM_I915_GVT_KVMGT 129 - tristate "Enable KVM/VFIO support for Intel GVT-g" 130 - depends on DRM_I915_GVT 131 - depends on KVM 132 - depends on VFIO_MDEV 133 - select KVM_EXTERNAL_WRITE_TRACKING 134 - default n 135 - help 136 - Choose this option if you want to enable KVMGT support for 137 - Intel GVT-g. 138 128 139 129 config DRM_I915_PXP 140 130 bool "Enable Intel PXP support"
+1 -1
drivers/gpu/drm/i915/Makefile
··· 326 326 include $(src)/gvt/Makefile 327 327 328 328 obj-$(CONFIG_DRM_I915) += i915.o 329 - obj-$(CONFIG_DRM_I915_GVT_KVMGT) += gvt/kvmgt.o 329 + obj-$(CONFIG_DRM_I915_GVT_KVMGT) += kvmgt.o 330 330 331 331 # header test 332 332
+2 -1
drivers/gpu/drm/i915/gvt/Makefile
··· 1 1 # SPDX-License-Identifier: GPL-2.0 2 2 3 - i915-$(CONFIG_DRM_I915_GVT) += \ 3 + kvmgt-$(CONFIG_DRM_I915_GVT) += \ 4 4 gvt/aperture_gm.o \ 5 5 gvt/cfg_space.o \ 6 6 gvt/cmd_parser.o \ ··· 15 15 gvt/gvt.o \ 16 16 gvt/handlers.o \ 17 17 gvt/interrupt.o \ 18 + gvt/kvmgt.o \ 18 19 gvt/mmio.o \ 19 20 gvt/mmio_context.o \ 20 21 gvt/opregion.o \
+19 -36
drivers/gpu/drm/i915/gvt/gvt.c
··· 39 39 #include <linux/vfio.h> 40 40 #include <linux/mdev.h> 41 41 42 - struct intel_gvt_host intel_gvt_host; 43 - 44 42 static const struct intel_gvt_ops intel_gvt_ops = { 45 43 .emulate_cfg_read = intel_vgpu_emulate_cfg_read, 46 44 .emulate_cfg_write = intel_vgpu_emulate_cfg_write, ··· 145 147 * resources owned by a GVT device. 146 148 * 147 149 */ 148 - void intel_gvt_clean_device(struct drm_i915_private *i915) 150 + static void intel_gvt_clean_device(struct drm_i915_private *i915) 149 151 { 150 152 struct intel_gvt *gvt = fetch_and_zero(&i915->gvt); 151 153 152 154 if (drm_WARN_ON(&i915->drm, !gvt)) 153 155 return; 154 156 157 + intel_gvt_hypervisor_host_exit(i915->drm.dev, gvt); 155 158 intel_gvt_destroy_idle_vgpu(gvt->idle_vgpu); 156 159 intel_gvt_clean_vgpu_types(gvt); 157 160 ··· 180 181 * Zero on success, negative error code if failed. 181 182 * 182 183 */ 183 - int intel_gvt_init_device(struct drm_i915_private *i915) 184 + static int intel_gvt_init_device(struct drm_i915_private *i915) 184 185 { 185 186 struct intel_gvt *gvt; 186 187 struct intel_vgpu *vgpu; ··· 252 253 253 254 intel_gvt_debugfs_init(gvt); 254 255 256 + ret = intel_gvt_hypervisor_host_init(i915->drm.dev, gvt, 257 + &intel_gvt_ops); 258 + if (ret) 259 + goto out_destroy_idle_vgpu; 260 + 255 261 gvt_dbg_core("gvt device initialization is done\n"); 256 - intel_gvt_host.dev = i915->drm.dev; 257 - intel_gvt_host.initialized = true; 258 262 return 0; 259 263 264 + out_destroy_idle_vgpu: 265 + intel_gvt_destroy_idle_vgpu(gvt->idle_vgpu); 266 + intel_gvt_debugfs_clean(gvt); 260 267 out_clean_types: 261 268 intel_gvt_clean_vgpu_types(gvt); 262 269 out_clean_thread: ··· 286 281 return ret; 287 282 } 288 283 289 - int 290 - intel_gvt_pm_resume(struct intel_gvt *gvt) 284 + static void intel_gvt_pm_resume(struct drm_i915_private *i915) 291 285 { 286 + struct intel_gvt *gvt = i915->gvt; 287 + 292 288 intel_gvt_restore_fence(gvt); 293 289 intel_gvt_restore_mmio(gvt); 294 290 intel_gvt_restore_ggtt(gvt); 295 - return 0; 296 291 } 297 292 298 - int 299 - intel_gvt_register_hypervisor(const struct intel_gvt_mpt *m) 300 - { 301 - int ret; 302 - void *gvt; 303 - 304 - if (!intel_gvt_host.initialized) 305 - return -ENODEV; 306 - 307 - intel_gvt_host.mpt = m; 308 - gvt = (void *)kdev_to_i915(intel_gvt_host.dev)->gvt; 309 - 310 - ret = intel_gvt_hypervisor_host_init(intel_gvt_host.dev, gvt, 311 - &intel_gvt_ops); 312 - if (ret < 0) 313 - return -ENODEV; 314 - return 0; 315 - } 316 - EXPORT_SYMBOL_GPL(intel_gvt_register_hypervisor); 317 - 318 - void 319 - intel_gvt_unregister_hypervisor(void) 320 - { 321 - void *gvt = (void *)kdev_to_i915(intel_gvt_host.dev)->gvt; 322 - intel_gvt_hypervisor_host_exit(intel_gvt_host.dev, gvt); 323 - } 324 - EXPORT_SYMBOL_GPL(intel_gvt_unregister_hypervisor); 293 + const struct intel_vgpu_ops intel_gvt_vgpu_ops = { 294 + .init_device = intel_gvt_init_device, 295 + .clean_device = intel_gvt_clean_device, 296 + .pm_resume = intel_gvt_pm_resume, 297 + };
+2 -4
drivers/gpu/drm/i915/gvt/gvt.h
··· 58 58 #define GVT_MAX_VGPU 8 59 59 60 60 struct intel_gvt_host { 61 - struct device *dev; 62 - bool initialized; 63 61 const struct intel_gvt_mpt *mpt; 64 62 }; 65 63 ··· 726 728 void intel_gvt_debugfs_init(struct intel_gvt *gvt); 727 729 void intel_gvt_debugfs_clean(struct intel_gvt *gvt); 728 730 729 - int intel_gvt_pm_resume(struct intel_gvt *gvt); 730 - 731 731 #include "trace.h" 732 732 #include "mpt.h" 733 + 734 + extern const struct intel_vgpu_ops intel_gvt_vgpu_ops; 733 735 734 736 #endif
+10 -4
drivers/gpu/drm/i915/gvt/kvmgt.c
··· 49 49 #include <drm/drm_edid.h> 50 50 51 51 #include "i915_drv.h" 52 + #include "intel_gvt.h" 52 53 #include "gvt.h" 54 + 55 + MODULE_IMPORT_NS(DMA_BUF); 56 + MODULE_IMPORT_NS(I915_GVT); 53 57 54 58 static const struct intel_gvt_ops *intel_gvt_ops; 55 59 ··· 2246 2242 .is_valid_gfn = kvmgt_is_valid_gfn, 2247 2243 }; 2248 2244 2245 + struct intel_gvt_host intel_gvt_host = { 2246 + .mpt = &kvmgt_mpt, 2247 + }; 2248 + 2249 2249 static int __init kvmgt_init(void) 2250 2250 { 2251 - if (intel_gvt_register_hypervisor(&kvmgt_mpt) < 0) 2252 - return -ENODEV; 2253 - return 0; 2251 + return intel_gvt_set_ops(&intel_gvt_vgpu_ops); 2254 2252 } 2255 2253 2256 2254 static void __exit kvmgt_exit(void) 2257 2255 { 2258 - intel_gvt_unregister_hypervisor(); 2256 + intel_gvt_clear_ops(&intel_gvt_vgpu_ops); 2259 2257 } 2260 2258 2261 2259 module_init(kvmgt_init);
-3
drivers/gpu/drm/i915/gvt/mpt.h
··· 394 394 return intel_gvt_host.mpt->is_valid_gfn(vgpu->handle, gfn); 395 395 } 396 396 397 - int intel_gvt_register_hypervisor(const struct intel_gvt_mpt *); 398 - void intel_gvt_unregister_hypervisor(void); 399 - 400 397 #endif /* _GVT_MPT_H_ */
-7
drivers/gpu/drm/i915/i915_driver.c
··· 468 468 pci_dev_put(dev_priv->bridge_dev); 469 469 } 470 470 471 - static void intel_sanitize_options(struct drm_i915_private *dev_priv) 472 - { 473 - intel_gvt_sanitize_options(dev_priv); 474 - } 475 - 476 471 /** 477 472 * i915_set_dma_info - set all relevant PCI dma info as configured for the 478 473 * platform ··· 560 565 return -ENXIO; 561 566 } 562 567 } 563 - 564 - intel_sanitize_options(dev_priv); 565 568 566 569 /* needs to be done before ggtt probe */ 567 570 intel_dram_edram_detect(dev_priv);
+1
drivers/gpu/drm/i915/i915_drv.h
··· 434 434 u32 caps; 435 435 u32 *initial_mmio; 436 436 u8 *initial_cfg_space; 437 + struct list_head entry; 437 438 }; 438 439 439 440 struct i915_selftest_stash {
+136 -70
drivers/gpu/drm/i915/intel_gvt.c
··· 24 24 #include "i915_drv.h" 25 25 #include "i915_vgpu.h" 26 26 #include "intel_gvt.h" 27 - #include "gvt/gvt.h" 27 + #include "gem/i915_gem_dmabuf.h" 28 + #include "gt/intel_context.h" 29 + #include "gt/intel_ring.h" 30 + #include "gt/shmem_utils.h" 28 31 29 32 /** 30 33 * DOC: Intel GVT-g host support ··· 43 40 * and be virtualized within GVT-g device module. More architectural design 44 41 * doc is available on https://01.org/group/2230/documentation-list. 45 42 */ 43 + 44 + static LIST_HEAD(intel_gvt_devices); 45 + static const struct intel_vgpu_ops *intel_gvt_ops; 46 + static DEFINE_MUTEX(intel_gvt_mutex); 46 47 47 48 static bool is_supported_device(struct drm_i915_private *dev_priv) 48 49 { ··· 64 57 return true; 65 58 66 59 return false; 67 - } 68 - 69 - /** 70 - * intel_gvt_sanitize_options - sanitize GVT related options 71 - * @dev_priv: drm i915 private data 72 - * 73 - * This function is called at the i915 options sanitize stage. 74 - */ 75 - void intel_gvt_sanitize_options(struct drm_i915_private *dev_priv) 76 - { 77 - if (!dev_priv->params.enable_gvt) 78 - return; 79 - 80 - if (intel_vgpu_active(dev_priv)) { 81 - drm_info(&dev_priv->drm, "GVT-g is disabled for guest\n"); 82 - goto bail; 83 - } 84 - 85 - if (!is_supported_device(dev_priv)) { 86 - drm_info(&dev_priv->drm, 87 - "Unsupported device. GVT-g is disabled\n"); 88 - goto bail; 89 - } 90 - 91 - return; 92 - bail: 93 - dev_priv->params.enable_gvt = 0; 94 60 } 95 61 96 62 static void free_initial_hw_state(struct drm_i915_private *dev_priv) ··· 145 165 return ret; 146 166 } 147 167 168 + static void intel_gvt_init_device(struct drm_i915_private *dev_priv) 169 + { 170 + if (!dev_priv->params.enable_gvt) { 171 + drm_dbg(&dev_priv->drm, 172 + "GVT-g is disabled by kernel params\n"); 173 + return; 174 + } 175 + 176 + if (intel_vgpu_active(dev_priv)) { 177 + drm_info(&dev_priv->drm, "GVT-g is disabled for guest\n"); 178 + return; 179 + } 180 + 181 + if (!is_supported_device(dev_priv)) { 182 + drm_info(&dev_priv->drm, 183 + "Unsupported device. GVT-g is disabled\n"); 184 + return; 185 + } 186 + 187 + if (intel_uc_wants_guc_submission(&to_gt(dev_priv)->uc)) { 188 + drm_err(&dev_priv->drm, 189 + "Graphics virtualization is not yet supported with GuC submission\n"); 190 + return; 191 + } 192 + 193 + if (save_initial_hw_state(dev_priv)) { 194 + drm_dbg(&dev_priv->drm, "Failed to save initial HW state\n"); 195 + return; 196 + } 197 + 198 + if (intel_gvt_ops->init_device(dev_priv)) 199 + drm_dbg(&dev_priv->drm, "Fail to init GVT device\n"); 200 + } 201 + 202 + static void intel_gvt_clean_device(struct drm_i915_private *dev_priv) 203 + { 204 + if (dev_priv->gvt) 205 + intel_gvt_ops->clean_device(dev_priv); 206 + free_initial_hw_state(dev_priv); 207 + } 208 + 209 + int intel_gvt_set_ops(const struct intel_vgpu_ops *ops) 210 + { 211 + struct drm_i915_private *dev_priv; 212 + 213 + mutex_lock(&intel_gvt_mutex); 214 + if (intel_gvt_ops) { 215 + mutex_unlock(&intel_gvt_mutex); 216 + return -EINVAL; 217 + } 218 + intel_gvt_ops = ops; 219 + 220 + list_for_each_entry(dev_priv, &intel_gvt_devices, vgpu.entry) 221 + intel_gvt_init_device(dev_priv); 222 + mutex_unlock(&intel_gvt_mutex); 223 + 224 + return 0; 225 + } 226 + EXPORT_SYMBOL_NS_GPL(intel_gvt_set_ops, I915_GVT); 227 + 228 + void intel_gvt_clear_ops(const struct intel_vgpu_ops *ops) 229 + { 230 + struct drm_i915_private *dev_priv; 231 + 232 + mutex_lock(&intel_gvt_mutex); 233 + if (intel_gvt_ops != ops) { 234 + mutex_unlock(&intel_gvt_mutex); 235 + return; 236 + } 237 + 238 + list_for_each_entry(dev_priv, &intel_gvt_devices, vgpu.entry) 239 + intel_gvt_clean_device(dev_priv); 240 + 241 + intel_gvt_ops = NULL; 242 + mutex_unlock(&intel_gvt_mutex); 243 + } 244 + EXPORT_SYMBOL_NS_GPL(intel_gvt_clear_ops, I915_GVT); 245 + 148 246 /** 149 247 * intel_gvt_init - initialize GVT components 150 248 * @dev_priv: drm i915 private data ··· 235 177 */ 236 178 int intel_gvt_init(struct drm_i915_private *dev_priv) 237 179 { 238 - int ret; 239 - 240 180 if (i915_inject_probe_failure(dev_priv)) 241 181 return -ENODEV; 242 182 243 - if (!dev_priv->params.enable_gvt) { 244 - drm_dbg(&dev_priv->drm, 245 - "GVT-g is disabled by kernel params\n"); 246 - return 0; 247 - } 248 - 249 - if (intel_uc_wants_guc_submission(&to_gt(dev_priv)->uc)) { 250 - drm_err(&dev_priv->drm, 251 - "i915 GVT-g loading failed due to Graphics virtualization is not yet supported with GuC submission\n"); 252 - return -EIO; 253 - } 254 - 255 - ret = save_initial_hw_state(dev_priv); 256 - if (ret) { 257 - drm_dbg(&dev_priv->drm, "Fail to save initial HW state\n"); 258 - goto err_save_hw_state; 259 - } 260 - 261 - ret = intel_gvt_init_device(dev_priv); 262 - if (ret) { 263 - drm_dbg(&dev_priv->drm, "Fail to init GVT device\n"); 264 - goto err_init_device; 265 - } 183 + mutex_lock(&intel_gvt_mutex); 184 + list_add_tail(&dev_priv->vgpu.entry, &intel_gvt_devices); 185 + if (intel_gvt_ops) 186 + intel_gvt_init_device(dev_priv); 187 + mutex_unlock(&intel_gvt_mutex); 266 188 267 189 return 0; 268 - 269 - err_init_device: 270 - free_initial_hw_state(dev_priv); 271 - err_save_hw_state: 272 - dev_priv->params.enable_gvt = 0; 273 - return 0; 274 - } 275 - 276 - static inline bool intel_gvt_active(struct drm_i915_private *dev_priv) 277 - { 278 - return dev_priv->gvt; 279 190 } 280 191 281 192 /** ··· 257 230 */ 258 231 void intel_gvt_driver_remove(struct drm_i915_private *dev_priv) 259 232 { 260 - if (!intel_gvt_active(dev_priv)) 261 - return; 262 - 233 + mutex_lock(&intel_gvt_mutex); 263 234 intel_gvt_clean_device(dev_priv); 264 - free_initial_hw_state(dev_priv); 235 + list_del(&dev_priv->vgpu.entry); 236 + mutex_unlock(&intel_gvt_mutex); 265 237 } 266 238 267 239 /** ··· 273 247 */ 274 248 void intel_gvt_resume(struct drm_i915_private *dev_priv) 275 249 { 276 - if (intel_gvt_active(dev_priv)) 277 - intel_gvt_pm_resume(dev_priv->gvt); 250 + mutex_lock(&intel_gvt_mutex); 251 + if (dev_priv->gvt) 252 + intel_gvt_ops->pm_resume(dev_priv); 253 + mutex_unlock(&intel_gvt_mutex); 278 254 } 255 + 256 + /* 257 + * Exported here so that the exports only get created when GVT support is 258 + * actually enabled. 259 + */ 260 + EXPORT_SYMBOL_NS_GPL(i915_gem_object_alloc, I915_GVT); 261 + EXPORT_SYMBOL_NS_GPL(i915_gem_object_create_shmem, I915_GVT); 262 + EXPORT_SYMBOL_NS_GPL(i915_gem_object_init, I915_GVT); 263 + EXPORT_SYMBOL_NS_GPL(i915_gem_object_ggtt_pin_ww, I915_GVT); 264 + EXPORT_SYMBOL_NS_GPL(i915_gem_object_pin_map, I915_GVT); 265 + EXPORT_SYMBOL_NS_GPL(i915_gem_object_set_to_cpu_domain, I915_GVT); 266 + EXPORT_SYMBOL_NS_GPL(__i915_gem_object_flush_map, I915_GVT); 267 + EXPORT_SYMBOL_NS_GPL(__i915_gem_object_set_pages, I915_GVT); 268 + EXPORT_SYMBOL_NS_GPL(i915_gem_gtt_insert, I915_GVT); 269 + EXPORT_SYMBOL_NS_GPL(i915_gem_prime_export, I915_GVT); 270 + EXPORT_SYMBOL_NS_GPL(i915_gem_ww_ctx_init, I915_GVT); 271 + EXPORT_SYMBOL_NS_GPL(i915_gem_ww_ctx_backoff, I915_GVT); 272 + EXPORT_SYMBOL_NS_GPL(i915_gem_ww_ctx_fini, I915_GVT); 273 + EXPORT_SYMBOL_NS_GPL(i915_ppgtt_create, I915_GVT); 274 + EXPORT_SYMBOL_NS_GPL(i915_request_add, I915_GVT); 275 + EXPORT_SYMBOL_NS_GPL(i915_request_create, I915_GVT); 276 + EXPORT_SYMBOL_NS_GPL(i915_request_wait, I915_GVT); 277 + EXPORT_SYMBOL_NS_GPL(i915_reserve_fence, I915_GVT); 278 + EXPORT_SYMBOL_NS_GPL(i915_unreserve_fence, I915_GVT); 279 + EXPORT_SYMBOL_NS_GPL(i915_vm_release, I915_GVT); 280 + EXPORT_SYMBOL_NS_GPL(_i915_vma_move_to_active, I915_GVT); 281 + EXPORT_SYMBOL_NS_GPL(intel_context_create, I915_GVT); 282 + EXPORT_SYMBOL_NS_GPL(__intel_context_do_pin, I915_GVT); 283 + EXPORT_SYMBOL_NS_GPL(__intel_context_do_unpin, I915_GVT); 284 + EXPORT_SYMBOL_NS_GPL(intel_ring_begin, I915_GVT); 285 + EXPORT_SYMBOL_NS_GPL(intel_runtime_pm_get, I915_GVT); 286 + EXPORT_SYMBOL_NS_GPL(intel_runtime_pm_put_unchecked, I915_GVT); 287 + EXPORT_SYMBOL_NS_GPL(intel_uncore_forcewake_for_reg, I915_GVT); 288 + EXPORT_SYMBOL_NS_GPL(intel_uncore_forcewake_get, I915_GVT); 289 + EXPORT_SYMBOL_NS_GPL(intel_uncore_forcewake_put, I915_GVT); 290 + EXPORT_SYMBOL_NS_GPL(shmem_pin_map, I915_GVT); 291 + EXPORT_SYMBOL_NS_GPL(shmem_unpin_map, I915_GVT); 292 + EXPORT_SYMBOL_NS_GPL(__px_dma, I915_GVT);
+10 -7
drivers/gpu/drm/i915/intel_gvt.h
··· 39 39 40 40 int intel_gvt_init(struct drm_i915_private *dev_priv); 41 41 void intel_gvt_driver_remove(struct drm_i915_private *dev_priv); 42 - int intel_gvt_init_device(struct drm_i915_private *dev_priv); 43 - void intel_gvt_clean_device(struct drm_i915_private *dev_priv); 44 42 int intel_gvt_init_host(void); 45 - void intel_gvt_sanitize_options(struct drm_i915_private *dev_priv); 46 43 void intel_gvt_resume(struct drm_i915_private *dev_priv); 47 44 int intel_gvt_iterate_mmio_table(struct intel_gvt_mmio_table_iter *iter); 45 + 46 + struct intel_vgpu_ops { 47 + int (*init_device)(struct drm_i915_private *dev_priv); 48 + void (*clean_device)(struct drm_i915_private *dev_priv); 49 + void (*pm_resume)(struct drm_i915_private *i915); 50 + }; 51 + 52 + int intel_gvt_set_ops(const struct intel_vgpu_ops *ops); 53 + void intel_gvt_clear_ops(const struct intel_vgpu_ops *ops); 54 + 48 55 #else 49 56 static inline int intel_gvt_init(struct drm_i915_private *dev_priv) 50 57 { ··· 59 52 } 60 53 61 54 static inline void intel_gvt_driver_remove(struct drm_i915_private *dev_priv) 62 - { 63 - } 64 - 65 - static inline void intel_gvt_sanitize_options(struct drm_i915_private *dev_priv) 66 55 { 67 56 } 68 57
+1
drivers/gpu/drm/i915/intel_gvt_mmio_table.c
··· 1288 1288 err: 1289 1289 return ret; 1290 1290 } 1291 + EXPORT_SYMBOL_NS_GPL(intel_gvt_iterate_mmio_table, I915_GVT);