aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorJike Song <jike.song@intel.com>2016-11-03 06:38:35 -0400
committerZhenyu Wang <zhenyuw@linux.intel.com>2016-11-10 02:45:15 -0500
commit9ec1e66b8084f24d41046bd9711fbd7ec6e3850f (patch)
tree0774390a13bc2709b32309bd24ded3d841d1d64b /drivers/gpu
parent7b3343b7e804bb89ad24a0a8c4e8e1010a418f14 (diff)
drm/i915/gvt: refactor intel_gvt_io_emulation_ops to be intel_gvt_ops
There are currently 4 methods in intel_gvt_io_emulation_ops to emulate CFG/MMIO reading/writing for intel vGPU. A possibly better scope is: add 3 more methods for vgpu create/destroy/reset respectively, and rename the ops to 'intel_gvt_ops', then pass it to the MPT module (say the future kvmgt) to use: they are all methods for external usage. Signed-off-by: Jike Song <jike.song@intel.com> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/gvt/cfg_space.c7
-rw-r--r--drivers/gpu/drm/i915/gvt/gvt.c7
-rw-r--r--drivers/gpu/drm/i915/gvt/gvt.h21
-rw-r--r--drivers/gpu/drm/i915/gvt/hypercall.h9
-rw-r--r--drivers/gpu/drm/i915/gvt/mmio.c6
-rw-r--r--drivers/gpu/drm/i915/gvt/mmio.h9
-rw-r--r--drivers/gpu/drm/i915/gvt/vgpu.c11
7 files changed, 44 insertions, 26 deletions
diff --git a/drivers/gpu/drm/i915/gvt/cfg_space.c b/drivers/gpu/drm/i915/gvt/cfg_space.c
index 865629a5c553..db516382a4d4 100644
--- a/drivers/gpu/drm/i915/gvt/cfg_space.c
+++ b/drivers/gpu/drm/i915/gvt/cfg_space.c
@@ -47,11 +47,9 @@ enum {
47 * Returns: 47 * Returns:
48 * Zero on success, negative error code if failed. 48 * Zero on success, negative error code if failed.
49 */ 49 */
50int intel_vgpu_emulate_cfg_read(void *__vgpu, unsigned int offset, 50int intel_vgpu_emulate_cfg_read(struct intel_vgpu *vgpu, unsigned int offset,
51 void *p_data, unsigned int bytes) 51 void *p_data, unsigned int bytes)
52{ 52{
53 struct intel_vgpu *vgpu = __vgpu;
54
55 if (WARN_ON(bytes > 4)) 53 if (WARN_ON(bytes > 4))
56 return -EINVAL; 54 return -EINVAL;
57 55
@@ -234,10 +232,9 @@ static int emulate_pci_bar_write(struct intel_vgpu *vgpu, unsigned int offset,
234 * Returns: 232 * Returns:
235 * Zero on success, negative error code if failed. 233 * Zero on success, negative error code if failed.
236 */ 234 */
237int intel_vgpu_emulate_cfg_write(void *__vgpu, unsigned int offset, 235int intel_vgpu_emulate_cfg_write(struct intel_vgpu *vgpu, unsigned int offset,
238 void *p_data, unsigned int bytes) 236 void *p_data, unsigned int bytes)
239{ 237{
240 struct intel_vgpu *vgpu = __vgpu;
241 int ret; 238 int ret;
242 239
243 if (WARN_ON(bytes > 4)) 240 if (WARN_ON(bytes > 4))
diff --git a/drivers/gpu/drm/i915/gvt/gvt.c b/drivers/gpu/drm/i915/gvt/gvt.c
index 13db29d045a4..7af265ac8d74 100644
--- a/drivers/gpu/drm/i915/gvt/gvt.c
+++ b/drivers/gpu/drm/i915/gvt/gvt.c
@@ -44,11 +44,14 @@ static const char * const supported_hypervisors[] = {
44 [INTEL_GVT_HYPERVISOR_KVM] = "KVM", 44 [INTEL_GVT_HYPERVISOR_KVM] = "KVM",
45}; 45};
46 46
47struct intel_gvt_io_emulation_ops intel_gvt_io_emulation_ops = { 47static const struct intel_gvt_ops intel_gvt_ops = {
48 .emulate_cfg_read = intel_vgpu_emulate_cfg_read, 48 .emulate_cfg_read = intel_vgpu_emulate_cfg_read,
49 .emulate_cfg_write = intel_vgpu_emulate_cfg_write, 49 .emulate_cfg_write = intel_vgpu_emulate_cfg_write,
50 .emulate_mmio_read = intel_vgpu_emulate_mmio_read, 50 .emulate_mmio_read = intel_vgpu_emulate_mmio_read,
51 .emulate_mmio_write = intel_vgpu_emulate_mmio_write, 51 .emulate_mmio_write = intel_vgpu_emulate_mmio_write,
52 .vgpu_create = intel_gvt_create_vgpu,
53 .vgpu_destroy = intel_gvt_destroy_vgpu,
54 .vgpu_reset = intel_gvt_reset_vgpu,
52}; 55};
53 56
54/** 57/**
@@ -278,7 +281,7 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv)
278 goto out_clean_thread; 281 goto out_clean_thread;
279 282
280 ret = intel_gvt_hypervisor_host_init(&dev_priv->drm.pdev->dev, gvt, 283 ret = intel_gvt_hypervisor_host_init(&dev_priv->drm.pdev->dev, gvt,
281 &intel_gvt_io_emulation_ops); 284 &intel_gvt_ops);
282 if (ret) { 285 if (ret) {
283 gvt_err("failed to register gvt-g host device: %d\n", ret); 286 gvt_err("failed to register gvt-g host device: %d\n", ret);
284 goto out_clean_types; 287 goto out_clean_types;
diff --git a/drivers/gpu/drm/i915/gvt/gvt.h b/drivers/gpu/drm/i915/gvt/gvt.h
index 33e6a6447025..5e7b0bd01695 100644
--- a/drivers/gpu/drm/i915/gvt/gvt.h
+++ b/drivers/gpu/drm/i915/gvt/gvt.h
@@ -356,6 +356,7 @@ void intel_gvt_clean_vgpu_types(struct intel_gvt *gvt);
356struct intel_vgpu *intel_gvt_create_vgpu(struct intel_gvt *gvt, 356struct intel_vgpu *intel_gvt_create_vgpu(struct intel_gvt *gvt,
357 struct intel_vgpu_type *type); 357 struct intel_vgpu_type *type);
358void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu); 358void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu);
359void intel_gvt_reset_vgpu(struct intel_vgpu *vgpu);
359 360
360 361
361/* validating GM functions */ 362/* validating GM functions */
@@ -391,10 +392,10 @@ int intel_gvt_ggtt_index_g2h(struct intel_vgpu *vgpu, unsigned long g_index,
391int intel_gvt_ggtt_h2g_index(struct intel_vgpu *vgpu, unsigned long h_index, 392int intel_gvt_ggtt_h2g_index(struct intel_vgpu *vgpu, unsigned long h_index,
392 unsigned long *g_index); 393 unsigned long *g_index);
393 394
394int intel_vgpu_emulate_cfg_read(void *__vgpu, unsigned int offset, 395int intel_vgpu_emulate_cfg_read(struct intel_vgpu *vgpu, unsigned int offset,
395 void *p_data, unsigned int bytes); 396 void *p_data, unsigned int bytes);
396 397
397int intel_vgpu_emulate_cfg_write(void *__vgpu, unsigned int offset, 398int intel_vgpu_emulate_cfg_write(struct intel_vgpu *vgpu, unsigned int offset,
398 void *p_data, unsigned int bytes); 399 void *p_data, unsigned int bytes);
399 400
400void intel_gvt_clean_opregion(struct intel_gvt *gvt); 401void intel_gvt_clean_opregion(struct intel_gvt *gvt);
@@ -407,6 +408,22 @@ int intel_vgpu_emulate_opregion_request(struct intel_vgpu *vgpu, u32 swsci);
407int setup_vgpu_mmio(struct intel_vgpu *vgpu); 408int setup_vgpu_mmio(struct intel_vgpu *vgpu);
408void populate_pvinfo_page(struct intel_vgpu *vgpu); 409void populate_pvinfo_page(struct intel_vgpu *vgpu);
409 410
411struct intel_gvt_ops {
412 int (*emulate_cfg_read)(struct intel_vgpu *, unsigned int, void *,
413 unsigned int);
414 int (*emulate_cfg_write)(struct intel_vgpu *, unsigned int, void *,
415 unsigned int);
416 int (*emulate_mmio_read)(struct intel_vgpu *, u64, void *,
417 unsigned int);
418 int (*emulate_mmio_write)(struct intel_vgpu *, u64, void *,
419 unsigned int);
420 struct intel_vgpu *(*vgpu_create)(struct intel_gvt *,
421 struct intel_vgpu_type *);
422 void (*vgpu_destroy)(struct intel_vgpu *);
423 void (*vgpu_reset)(struct intel_vgpu *);
424};
425
426
410#include "mpt.h" 427#include "mpt.h"
411 428
412#endif 429#endif
diff --git a/drivers/gpu/drm/i915/gvt/hypercall.h b/drivers/gpu/drm/i915/gvt/hypercall.h
index f3e926340983..30e543f5a703 100644
--- a/drivers/gpu/drm/i915/gvt/hypercall.h
+++ b/drivers/gpu/drm/i915/gvt/hypercall.h
@@ -33,15 +33,6 @@
33#ifndef _GVT_HYPERCALL_H_ 33#ifndef _GVT_HYPERCALL_H_
34#define _GVT_HYPERCALL_H_ 34#define _GVT_HYPERCALL_H_
35 35
36struct intel_gvt_io_emulation_ops {
37 int (*emulate_cfg_read)(void *, unsigned int, void *, unsigned int);
38 int (*emulate_cfg_write)(void *, unsigned int, void *, unsigned int);
39 int (*emulate_mmio_read)(void *, u64, void *, unsigned int);
40 int (*emulate_mmio_write)(void *, u64, void *, unsigned int);
41};
42
43extern struct intel_gvt_io_emulation_ops intel_gvt_io_emulation_ops;
44
45/* 36/*
46 * Specific GVT-g MPT modules function collections. Currently GVT-g supports 37 * Specific GVT-g MPT modules function collections. Currently GVT-g supports
47 * both Xen and KVM by providing dedicated hypervisor-related MPT modules. 38 * both Xen and KVM by providing dedicated hypervisor-related MPT modules.
diff --git a/drivers/gpu/drm/i915/gvt/mmio.c b/drivers/gpu/drm/i915/gvt/mmio.c
index 585b01f63254..09c9450a1946 100644
--- a/drivers/gpu/drm/i915/gvt/mmio.c
+++ b/drivers/gpu/drm/i915/gvt/mmio.c
@@ -67,10 +67,9 @@ int intel_vgpu_gpa_to_mmio_offset(struct intel_vgpu *vgpu, u64 gpa)
67 * Returns: 67 * Returns:
68 * Zero on success, negative error code if failed 68 * Zero on success, negative error code if failed
69 */ 69 */
70int intel_vgpu_emulate_mmio_read(void *__vgpu, uint64_t pa, 70int intel_vgpu_emulate_mmio_read(struct intel_vgpu *vgpu, uint64_t pa,
71 void *p_data, unsigned int bytes) 71 void *p_data, unsigned int bytes)
72{ 72{
73 struct intel_vgpu *vgpu = __vgpu;
74 struct intel_gvt *gvt = vgpu->gvt; 73 struct intel_gvt *gvt = vgpu->gvt;
75 struct intel_gvt_mmio_info *mmio; 74 struct intel_gvt_mmio_info *mmio;
76 unsigned int offset = 0; 75 unsigned int offset = 0;
@@ -179,10 +178,9 @@ err:
179 * Returns: 178 * Returns:
180 * Zero on success, negative error code if failed 179 * Zero on success, negative error code if failed
181 */ 180 */
182int intel_vgpu_emulate_mmio_write(void *__vgpu, uint64_t pa, 181int intel_vgpu_emulate_mmio_write(struct intel_vgpu *vgpu, uint64_t pa,
183 void *p_data, unsigned int bytes) 182 void *p_data, unsigned int bytes)
184{ 183{
185 struct intel_vgpu *vgpu = __vgpu;
186 struct intel_gvt *gvt = vgpu->gvt; 184 struct intel_gvt *gvt = vgpu->gvt;
187 struct intel_gvt_mmio_info *mmio; 185 struct intel_gvt_mmio_info *mmio;
188 unsigned int offset = 0; 186 unsigned int offset = 0;
diff --git a/drivers/gpu/drm/i915/gvt/mmio.h b/drivers/gpu/drm/i915/gvt/mmio.h
index 9dc739a01892..87d5b5e366a3 100644
--- a/drivers/gpu/drm/i915/gvt/mmio.h
+++ b/drivers/gpu/drm/i915/gvt/mmio.h
@@ -87,10 +87,11 @@ struct intel_gvt_mmio_info *intel_gvt_find_mmio_info(struct intel_gvt *gvt,
87}) 87})
88 88
89int intel_vgpu_gpa_to_mmio_offset(struct intel_vgpu *vgpu, u64 gpa); 89int intel_vgpu_gpa_to_mmio_offset(struct intel_vgpu *vgpu, u64 gpa);
90int intel_vgpu_emulate_mmio_read(void *__vgpu, u64 pa, void *p_data, 90
91 unsigned int bytes); 91int intel_vgpu_emulate_mmio_read(struct intel_vgpu *vgpu, u64 pa,
92int intel_vgpu_emulate_mmio_write(void *__vgpu, u64 pa, void *p_data, 92 void *p_data, unsigned int bytes);
93 unsigned int bytes); 93int intel_vgpu_emulate_mmio_write(struct intel_vgpu *vgpu, u64 pa,
94 void *p_data, unsigned int bytes);
94bool intel_gvt_mmio_is_cmd_access(struct intel_gvt *gvt, 95bool intel_gvt_mmio_is_cmd_access(struct intel_gvt *gvt,
95 unsigned int offset); 96 unsigned int offset);
96bool intel_gvt_mmio_is_unalign(struct intel_gvt *gvt, unsigned int offset); 97bool intel_gvt_mmio_is_unalign(struct intel_gvt *gvt, unsigned int offset);
diff --git a/drivers/gpu/drm/i915/gvt/vgpu.c b/drivers/gpu/drm/i915/gvt/vgpu.c
index 9b09f697862c..3a15feadc1df 100644
--- a/drivers/gpu/drm/i915/gvt/vgpu.c
+++ b/drivers/gpu/drm/i915/gvt/vgpu.c
@@ -390,3 +390,14 @@ struct intel_vgpu *intel_gvt_create_vgpu(struct intel_gvt *gvt,
390 390
391 return vgpu; 391 return vgpu;
392} 392}
393
394/**
395 * intel_gvt_reset_vgpu - reset a virtual GPU
396 * @vgpu: virtual GPU
397 *
398 * This function is called when user wants to reset a virtual GPU.
399 *
400 */
401void intel_gvt_reset_vgpu(struct intel_vgpu *vgpu)
402{
403}