diff options
author | Jike Song <jike.song@intel.com> | 2016-11-03 06:38:35 -0400 |
---|---|---|
committer | Zhenyu Wang <zhenyuw@linux.intel.com> | 2016-11-10 02:45:15 -0500 |
commit | 9ec1e66b8084f24d41046bd9711fbd7ec6e3850f (patch) | |
tree | 0774390a13bc2709b32309bd24ded3d841d1d64b /drivers/gpu | |
parent | 7b3343b7e804bb89ad24a0a8c4e8e1010a418f14 (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.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/gvt.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/gvt.h | 21 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/hypercall.h | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/mmio.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/mmio.h | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/vgpu.c | 11 |
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 | */ |
50 | int intel_vgpu_emulate_cfg_read(void *__vgpu, unsigned int offset, | 50 | int 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 | */ |
237 | int intel_vgpu_emulate_cfg_write(void *__vgpu, unsigned int offset, | 235 | int 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 | ||
47 | struct intel_gvt_io_emulation_ops intel_gvt_io_emulation_ops = { | 47 | static 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); | |||
356 | struct intel_vgpu *intel_gvt_create_vgpu(struct intel_gvt *gvt, | 356 | struct intel_vgpu *intel_gvt_create_vgpu(struct intel_gvt *gvt, |
357 | struct intel_vgpu_type *type); | 357 | struct intel_vgpu_type *type); |
358 | void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu); | 358 | void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu); |
359 | void 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, | |||
391 | int intel_gvt_ggtt_h2g_index(struct intel_vgpu *vgpu, unsigned long h_index, | 392 | int 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 | ||
394 | int intel_vgpu_emulate_cfg_read(void *__vgpu, unsigned int offset, | 395 | int 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 | ||
397 | int intel_vgpu_emulate_cfg_write(void *__vgpu, unsigned int offset, | 398 | int 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 | ||
400 | void intel_gvt_clean_opregion(struct intel_gvt *gvt); | 401 | void intel_gvt_clean_opregion(struct intel_gvt *gvt); |
@@ -407,6 +408,22 @@ int intel_vgpu_emulate_opregion_request(struct intel_vgpu *vgpu, u32 swsci); | |||
407 | int setup_vgpu_mmio(struct intel_vgpu *vgpu); | 408 | int setup_vgpu_mmio(struct intel_vgpu *vgpu); |
408 | void populate_pvinfo_page(struct intel_vgpu *vgpu); | 409 | void populate_pvinfo_page(struct intel_vgpu *vgpu); |
409 | 410 | ||
411 | struct 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 | ||
36 | struct 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 | |||
43 | extern 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 | */ |
70 | int intel_vgpu_emulate_mmio_read(void *__vgpu, uint64_t pa, | 70 | int 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 | */ |
182 | int intel_vgpu_emulate_mmio_write(void *__vgpu, uint64_t pa, | 181 | int 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 | ||
89 | int intel_vgpu_gpa_to_mmio_offset(struct intel_vgpu *vgpu, u64 gpa); | 89 | int intel_vgpu_gpa_to_mmio_offset(struct intel_vgpu *vgpu, u64 gpa); |
90 | int intel_vgpu_emulate_mmio_read(void *__vgpu, u64 pa, void *p_data, | 90 | |
91 | unsigned int bytes); | 91 | int intel_vgpu_emulate_mmio_read(struct intel_vgpu *vgpu, u64 pa, |
92 | int intel_vgpu_emulate_mmio_write(void *__vgpu, u64 pa, void *p_data, | 92 | void *p_data, unsigned int bytes); |
93 | unsigned int bytes); | 93 | int intel_vgpu_emulate_mmio_write(struct intel_vgpu *vgpu, u64 pa, |
94 | void *p_data, unsigned int bytes); | ||
94 | bool intel_gvt_mmio_is_cmd_access(struct intel_gvt *gvt, | 95 | bool intel_gvt_mmio_is_cmd_access(struct intel_gvt *gvt, |
95 | unsigned int offset); | 96 | unsigned int offset); |
96 | bool intel_gvt_mmio_is_unalign(struct intel_gvt *gvt, unsigned int offset); | 97 | bool 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 | */ | ||
401 | void intel_gvt_reset_vgpu(struct intel_vgpu *vgpu) | ||
402 | { | ||
403 | } | ||