2 * Copyright(c) 2011-2016 Intel Corporation. All rights reserved.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 * Kevin Tian <kevin.tian@intel.com>
25 * Eddie Dong <eddie.dong@intel.com>
28 * Niu Bing <bing.niu@intel.com>
29 * Zhi Wang <zhi.a.wang@intel.com>
33 #include <linux/types.h>
35 #include <linux/kthread.h>
39 #include <linux/vfio.h>
40 #include <linux/mdev.h>
42 struct intel_gvt_host intel_gvt_host
;
44 static const char * const supported_hypervisors
[] = {
45 [INTEL_GVT_HYPERVISOR_XEN
] = "XEN",
46 [INTEL_GVT_HYPERVISOR_KVM
] = "KVM",
49 static struct intel_vgpu_type
*intel_gvt_find_vgpu_type(struct intel_gvt
*gvt
,
53 struct intel_vgpu_type
*t
;
54 const char *driver_name
= dev_driver_string(
55 &gvt
->dev_priv
->drm
.pdev
->dev
);
57 for (i
= 0; i
< gvt
->num_types
; i
++) {
59 if (!strncmp(t
->name
, name
+ strlen(driver_name
) + 1,
67 static ssize_t
available_instances_show(struct kobject
*kobj
,
68 struct device
*dev
, char *buf
)
70 struct intel_vgpu_type
*type
;
72 void *gvt
= kdev_to_i915(dev
)->gvt
;
74 type
= intel_gvt_find_vgpu_type(gvt
, kobject_name(kobj
));
78 num
= type
->avail_instance
;
80 return sprintf(buf
, "%u\n", num
);
83 static ssize_t
device_api_show(struct kobject
*kobj
, struct device
*dev
,
86 return sprintf(buf
, "%s\n", VFIO_DEVICE_API_PCI_STRING
);
89 static ssize_t
description_show(struct kobject
*kobj
, struct device
*dev
,
92 struct intel_vgpu_type
*type
;
93 void *gvt
= kdev_to_i915(dev
)->gvt
;
95 type
= intel_gvt_find_vgpu_type(gvt
, kobject_name(kobj
));
99 return sprintf(buf
, "low_gm_size: %dMB\nhigh_gm_size: %dMB\n"
100 "fence: %d\nresolution: %s\n"
102 BYTES_TO_MB(type
->low_gm_size
),
103 BYTES_TO_MB(type
->high_gm_size
),
104 type
->fence
, vgpu_edid_str(type
->resolution
),
108 static MDEV_TYPE_ATTR_RO(available_instances
);
109 static MDEV_TYPE_ATTR_RO(device_api
);
110 static MDEV_TYPE_ATTR_RO(description
);
112 static struct attribute
*gvt_type_attrs
[] = {
113 &mdev_type_attr_available_instances
.attr
,
114 &mdev_type_attr_device_api
.attr
,
115 &mdev_type_attr_description
.attr
,
119 static struct attribute_group
*gvt_vgpu_type_groups
[] = {
120 [0 ... NR_MAX_INTEL_VGPU_TYPES
- 1] = NULL
,
123 static bool intel_get_gvt_attrs(struct attribute
***type_attrs
,
124 struct attribute_group
***intel_vgpu_type_groups
)
126 *type_attrs
= gvt_type_attrs
;
127 *intel_vgpu_type_groups
= gvt_vgpu_type_groups
;
131 static bool intel_gvt_init_vgpu_type_groups(struct intel_gvt
*gvt
)
134 struct intel_vgpu_type
*type
;
135 struct attribute_group
*group
;
137 for (i
= 0; i
< gvt
->num_types
; i
++) {
138 type
= &gvt
->types
[i
];
140 group
= kzalloc(sizeof(struct attribute_group
), GFP_KERNEL
);
144 group
->name
= type
->name
;
145 group
->attrs
= gvt_type_attrs
;
146 gvt_vgpu_type_groups
[i
] = group
;
152 for (j
= 0; j
< i
; j
++) {
153 group
= gvt_vgpu_type_groups
[j
];
160 static void intel_gvt_cleanup_vgpu_type_groups(struct intel_gvt
*gvt
)
163 struct attribute_group
*group
;
165 for (i
= 0; i
< gvt
->num_types
; i
++) {
166 group
= gvt_vgpu_type_groups
[i
];
167 gvt_vgpu_type_groups
[i
] = NULL
;
172 static const struct intel_gvt_ops intel_gvt_ops
= {
173 .emulate_cfg_read
= intel_vgpu_emulate_cfg_read
,
174 .emulate_cfg_write
= intel_vgpu_emulate_cfg_write
,
175 .emulate_mmio_read
= intel_vgpu_emulate_mmio_read
,
176 .emulate_mmio_write
= intel_vgpu_emulate_mmio_write
,
177 .vgpu_create
= intel_gvt_create_vgpu
,
178 .vgpu_destroy
= intel_gvt_destroy_vgpu
,
179 .vgpu_reset
= intel_gvt_reset_vgpu
,
180 .vgpu_activate
= intel_gvt_activate_vgpu
,
181 .vgpu_deactivate
= intel_gvt_deactivate_vgpu
,
182 .gvt_find_vgpu_type
= intel_gvt_find_vgpu_type
,
183 .get_gvt_attrs
= intel_get_gvt_attrs
,
184 .vgpu_query_plane
= intel_vgpu_query_plane
,
185 .vgpu_get_dmabuf
= intel_vgpu_get_dmabuf
,
186 .write_protect_handler
= intel_vgpu_write_protect_handler
,
190 * intel_gvt_init_host - Load MPT modules and detect if we're running in host
191 * @gvt: intel gvt device
193 * This function is called at the driver loading stage. If failed to find a
194 * loadable MPT module or detect currently we're running in a VM, then GVT-g
198 * Zero on success, negative error code if failed.
201 int intel_gvt_init_host(void)
203 if (intel_gvt_host
.initialized
)
207 if (xen_domain() && !xen_initial_domain())
210 /* Try to load MPT modules for hypervisors */
211 if (xen_initial_domain()) {
213 intel_gvt_host
.mpt
= try_then_request_module(
214 symbol_get(xengt_mpt
), "xengt");
215 intel_gvt_host
.hypervisor_type
= INTEL_GVT_HYPERVISOR_XEN
;
217 #if IS_ENABLED(CONFIG_DRM_I915_GVT_KVMGT)
218 /* not in Xen. Try KVMGT */
219 intel_gvt_host
.mpt
= try_then_request_module(
220 symbol_get(kvmgt_mpt
), "kvmgt");
221 intel_gvt_host
.hypervisor_type
= INTEL_GVT_HYPERVISOR_KVM
;
225 /* Fail to load MPT modules - bail out */
226 if (!intel_gvt_host
.mpt
)
229 gvt_dbg_core("Running with hypervisor %s in host mode\n",
230 supported_hypervisors
[intel_gvt_host
.hypervisor_type
]);
232 intel_gvt_host
.initialized
= true;
236 static void init_device_info(struct intel_gvt
*gvt
)
238 struct intel_gvt_device_info
*info
= &gvt
->device_info
;
239 struct pci_dev
*pdev
= gvt
->dev_priv
->drm
.pdev
;
241 if (IS_BROADWELL(gvt
->dev_priv
) || IS_SKYLAKE(gvt
->dev_priv
)
242 || IS_KABYLAKE(gvt
->dev_priv
)) {
243 info
->max_support_vgpus
= 8;
244 info
->cfg_space_size
= PCI_CFG_SPACE_EXP_SIZE
;
245 info
->mmio_size
= 2 * 1024 * 1024;
247 info
->gtt_start_offset
= 8 * 1024 * 1024;
248 info
->gtt_entry_size
= 8;
249 info
->gtt_entry_size_shift
= 3;
250 info
->gmadr_bytes_in_cmd
= 8;
251 info
->max_surface_size
= 36 * 1024 * 1024;
253 info
->msi_cap_offset
= pdev
->msi_cap
;
256 static int gvt_service_thread(void *data
)
258 struct intel_gvt
*gvt
= (struct intel_gvt
*)data
;
261 gvt_dbg_core("service thread start\n");
263 while (!kthread_should_stop()) {
264 ret
= wait_event_interruptible(gvt
->service_thread_wq
,
265 kthread_should_stop() || gvt
->service_request
);
267 if (kthread_should_stop())
270 if (WARN_ONCE(ret
, "service thread is waken up by signal.\n"))
273 if (test_and_clear_bit(INTEL_GVT_REQUEST_EMULATE_VBLANK
,
274 (void *)&gvt
->service_request
)) {
275 mutex_lock(&gvt
->lock
);
276 intel_gvt_emulate_vblank(gvt
);
277 mutex_unlock(&gvt
->lock
);
280 if (test_bit(INTEL_GVT_REQUEST_SCHED
,
281 (void *)&gvt
->service_request
) ||
282 test_bit(INTEL_GVT_REQUEST_EVENT_SCHED
,
283 (void *)&gvt
->service_request
)) {
284 intel_gvt_schedule(gvt
);
291 static void clean_service_thread(struct intel_gvt
*gvt
)
293 kthread_stop(gvt
->service_thread
);
296 static int init_service_thread(struct intel_gvt
*gvt
)
298 init_waitqueue_head(&gvt
->service_thread_wq
);
300 gvt
->service_thread
= kthread_run(gvt_service_thread
,
301 gvt
, "gvt_service_thread");
302 if (IS_ERR(gvt
->service_thread
)) {
303 gvt_err("fail to start service thread.\n");
304 return PTR_ERR(gvt
->service_thread
);
310 * intel_gvt_clean_device - clean a GVT device
311 * @gvt: intel gvt device
313 * This function is called at the driver unloading stage, to free the
314 * resources owned by a GVT device.
317 void intel_gvt_clean_device(struct drm_i915_private
*dev_priv
)
319 struct intel_gvt
*gvt
= to_gvt(dev_priv
);
324 intel_gvt_debugfs_clean(gvt
);
325 clean_service_thread(gvt
);
326 intel_gvt_clean_cmd_parser(gvt
);
327 intel_gvt_clean_sched_policy(gvt
);
328 intel_gvt_clean_workload_scheduler(gvt
);
329 intel_gvt_clean_gtt(gvt
);
330 intel_gvt_clean_irq(gvt
);
331 intel_gvt_clean_mmio_info(gvt
);
332 intel_gvt_free_firmware(gvt
);
334 intel_gvt_hypervisor_host_exit(&dev_priv
->drm
.pdev
->dev
, gvt
);
335 intel_gvt_cleanup_vgpu_type_groups(gvt
);
336 intel_gvt_clean_vgpu_types(gvt
);
338 idr_destroy(&gvt
->vgpu_idr
);
340 intel_gvt_destroy_idle_vgpu(gvt
->idle_vgpu
);
342 kfree(dev_priv
->gvt
);
343 dev_priv
->gvt
= NULL
;
347 * intel_gvt_init_device - initialize a GVT device
348 * @dev_priv: drm i915 private data
350 * This function is called at the initialization stage, to initialize
351 * necessary GVT components.
354 * Zero on success, negative error code if failed.
357 int intel_gvt_init_device(struct drm_i915_private
*dev_priv
)
359 struct intel_gvt
*gvt
;
360 struct intel_vgpu
*vgpu
;
364 * Cannot initialize GVT device without intel_gvt_host gets
367 if (WARN_ON(!intel_gvt_host
.initialized
))
370 if (WARN_ON(dev_priv
->gvt
))
373 gvt
= kzalloc(sizeof(struct intel_gvt
), GFP_KERNEL
);
377 gvt_dbg_core("init gvt device\n");
379 idr_init(&gvt
->vgpu_idr
);
380 spin_lock_init(&gvt
->scheduler
.mmio_context_lock
);
381 mutex_init(&gvt
->lock
);
382 gvt
->dev_priv
= dev_priv
;
384 init_device_info(gvt
);
386 ret
= intel_gvt_setup_mmio_info(gvt
);
390 intel_gvt_init_engine_mmio_context(gvt
);
392 ret
= intel_gvt_load_firmware(gvt
);
394 goto out_clean_mmio_info
;
396 ret
= intel_gvt_init_irq(gvt
);
398 goto out_free_firmware
;
400 ret
= intel_gvt_init_gtt(gvt
);
404 ret
= intel_gvt_init_workload_scheduler(gvt
);
408 ret
= intel_gvt_init_sched_policy(gvt
);
410 goto out_clean_workload_scheduler
;
412 ret
= intel_gvt_init_cmd_parser(gvt
);
414 goto out_clean_sched_policy
;
416 ret
= init_service_thread(gvt
);
418 goto out_clean_cmd_parser
;
420 ret
= intel_gvt_init_vgpu_types(gvt
);
422 goto out_clean_thread
;
424 ret
= intel_gvt_init_vgpu_type_groups(gvt
);
426 gvt_err("failed to init vgpu type groups: %d\n", ret
);
427 goto out_clean_types
;
430 ret
= intel_gvt_hypervisor_host_init(&dev_priv
->drm
.pdev
->dev
, gvt
,
433 gvt_err("failed to register gvt-g host device: %d\n", ret
);
434 goto out_clean_types
;
437 vgpu
= intel_gvt_create_idle_vgpu(gvt
);
440 gvt_err("failed to create idle vgpu\n");
441 goto out_clean_types
;
443 gvt
->idle_vgpu
= vgpu
;
445 ret
= intel_gvt_debugfs_init(gvt
);
447 gvt_err("debugfs registeration failed, go on.\n");
449 gvt_dbg_core("gvt device initialization is done\n");
454 intel_gvt_clean_vgpu_types(gvt
);
456 clean_service_thread(gvt
);
457 out_clean_cmd_parser
:
458 intel_gvt_clean_cmd_parser(gvt
);
459 out_clean_sched_policy
:
460 intel_gvt_clean_sched_policy(gvt
);
461 out_clean_workload_scheduler
:
462 intel_gvt_clean_workload_scheduler(gvt
);
464 intel_gvt_clean_gtt(gvt
);
466 intel_gvt_clean_irq(gvt
);
468 intel_gvt_free_firmware(gvt
);
470 intel_gvt_clean_mmio_info(gvt
);
472 idr_destroy(&gvt
->vgpu_idr
);