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

drm/i915/gvt: merge gvt.c into kvmgvt.c

The code in both files is deeply interconnected, so merge it and
keep a bunch of structures and functions static.

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-30-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
cba619cb 978cf586

+260 -302
-1
drivers/gpu/drm/i915/gvt/Makefile
··· 12 12 gvt/fb_decoder.o \ 13 13 gvt/firmware.o \ 14 14 gvt/gtt.o \ 15 - gvt/gvt.o \ 16 15 gvt/handlers.o \ 17 16 gvt/interrupt.o \ 18 17 gvt/kvmgt.o \
-291
drivers/gpu/drm/i915/gvt/gvt.c
··· 1 - /* 2 - * Copyright(c) 2011-2016 Intel Corporation. All rights reserved. 3 - * 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: 10 - * 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 13 - * Software. 14 - * 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 21 - * SOFTWARE. 22 - * 23 - * Authors: 24 - * Kevin Tian <kevin.tian@intel.com> 25 - * Eddie Dong <eddie.dong@intel.com> 26 - * 27 - * Contributors: 28 - * Niu Bing <bing.niu@intel.com> 29 - * Zhi Wang <zhi.a.wang@intel.com> 30 - * 31 - */ 32 - 33 - #include <linux/types.h> 34 - #include <linux/kthread.h> 35 - 36 - #include "i915_drv.h" 37 - #include "intel_gvt.h" 38 - #include "gvt.h" 39 - #include <linux/vfio.h> 40 - #include <linux/mdev.h> 41 - 42 - static void init_device_info(struct intel_gvt *gvt) 43 - { 44 - struct intel_gvt_device_info *info = &gvt->device_info; 45 - struct pci_dev *pdev = to_pci_dev(gvt->gt->i915->drm.dev); 46 - 47 - info->max_support_vgpus = 8; 48 - info->cfg_space_size = PCI_CFG_SPACE_EXP_SIZE; 49 - info->mmio_size = 2 * 1024 * 1024; 50 - info->mmio_bar = 0; 51 - info->gtt_start_offset = 8 * 1024 * 1024; 52 - info->gtt_entry_size = 8; 53 - info->gtt_entry_size_shift = 3; 54 - info->gmadr_bytes_in_cmd = 8; 55 - info->max_surface_size = 36 * 1024 * 1024; 56 - info->msi_cap_offset = pdev->msi_cap; 57 - } 58 - 59 - static void intel_gvt_test_and_emulate_vblank(struct intel_gvt *gvt) 60 - { 61 - struct intel_vgpu *vgpu; 62 - int id; 63 - 64 - mutex_lock(&gvt->lock); 65 - idr_for_each_entry((&(gvt)->vgpu_idr), (vgpu), (id)) { 66 - if (test_and_clear_bit(INTEL_GVT_REQUEST_EMULATE_VBLANK + id, 67 - (void *)&gvt->service_request)) { 68 - if (vgpu->active) 69 - intel_vgpu_emulate_vblank(vgpu); 70 - } 71 - } 72 - mutex_unlock(&gvt->lock); 73 - } 74 - 75 - static int gvt_service_thread(void *data) 76 - { 77 - struct intel_gvt *gvt = (struct intel_gvt *)data; 78 - int ret; 79 - 80 - gvt_dbg_core("service thread start\n"); 81 - 82 - while (!kthread_should_stop()) { 83 - ret = wait_event_interruptible(gvt->service_thread_wq, 84 - kthread_should_stop() || gvt->service_request); 85 - 86 - if (kthread_should_stop()) 87 - break; 88 - 89 - if (WARN_ONCE(ret, "service thread is waken up by signal.\n")) 90 - continue; 91 - 92 - intel_gvt_test_and_emulate_vblank(gvt); 93 - 94 - if (test_bit(INTEL_GVT_REQUEST_SCHED, 95 - (void *)&gvt->service_request) || 96 - test_bit(INTEL_GVT_REQUEST_EVENT_SCHED, 97 - (void *)&gvt->service_request)) { 98 - intel_gvt_schedule(gvt); 99 - } 100 - } 101 - 102 - return 0; 103 - } 104 - 105 - static void clean_service_thread(struct intel_gvt *gvt) 106 - { 107 - kthread_stop(gvt->service_thread); 108 - } 109 - 110 - static int init_service_thread(struct intel_gvt *gvt) 111 - { 112 - init_waitqueue_head(&gvt->service_thread_wq); 113 - 114 - gvt->service_thread = kthread_run(gvt_service_thread, 115 - gvt, "gvt_service_thread"); 116 - if (IS_ERR(gvt->service_thread)) { 117 - gvt_err("fail to start service thread.\n"); 118 - return PTR_ERR(gvt->service_thread); 119 - } 120 - return 0; 121 - } 122 - 123 - /** 124 - * intel_gvt_clean_device - clean a GVT device 125 - * @i915: i915 private 126 - * 127 - * This function is called at the driver unloading stage, to free the 128 - * resources owned by a GVT device. 129 - * 130 - */ 131 - static void intel_gvt_clean_device(struct drm_i915_private *i915) 132 - { 133 - struct intel_gvt *gvt = fetch_and_zero(&i915->gvt); 134 - 135 - if (drm_WARN_ON(&i915->drm, !gvt)) 136 - return; 137 - 138 - mdev_unregister_device(i915->drm.dev); 139 - intel_gvt_cleanup_vgpu_type_groups(gvt); 140 - intel_gvt_destroy_idle_vgpu(gvt->idle_vgpu); 141 - intel_gvt_clean_vgpu_types(gvt); 142 - 143 - intel_gvt_debugfs_clean(gvt); 144 - clean_service_thread(gvt); 145 - intel_gvt_clean_cmd_parser(gvt); 146 - intel_gvt_clean_sched_policy(gvt); 147 - intel_gvt_clean_workload_scheduler(gvt); 148 - intel_gvt_clean_gtt(gvt); 149 - intel_gvt_free_firmware(gvt); 150 - intel_gvt_clean_mmio_info(gvt); 151 - idr_destroy(&gvt->vgpu_idr); 152 - 153 - kfree(i915->gvt); 154 - } 155 - 156 - /** 157 - * intel_gvt_init_device - initialize a GVT device 158 - * @i915: drm i915 private data 159 - * 160 - * This function is called at the initialization stage, to initialize 161 - * necessary GVT components. 162 - * 163 - * Returns: 164 - * Zero on success, negative error code if failed. 165 - * 166 - */ 167 - static int intel_gvt_init_device(struct drm_i915_private *i915) 168 - { 169 - struct intel_gvt *gvt; 170 - struct intel_vgpu *vgpu; 171 - int ret; 172 - 173 - if (drm_WARN_ON(&i915->drm, i915->gvt)) 174 - return -EEXIST; 175 - 176 - gvt = kzalloc(sizeof(struct intel_gvt), GFP_KERNEL); 177 - if (!gvt) 178 - return -ENOMEM; 179 - 180 - gvt_dbg_core("init gvt device\n"); 181 - 182 - idr_init_base(&gvt->vgpu_idr, 1); 183 - spin_lock_init(&gvt->scheduler.mmio_context_lock); 184 - mutex_init(&gvt->lock); 185 - mutex_init(&gvt->sched_lock); 186 - gvt->gt = to_gt(i915); 187 - i915->gvt = gvt; 188 - 189 - init_device_info(gvt); 190 - 191 - ret = intel_gvt_setup_mmio_info(gvt); 192 - if (ret) 193 - goto out_clean_idr; 194 - 195 - intel_gvt_init_engine_mmio_context(gvt); 196 - 197 - ret = intel_gvt_load_firmware(gvt); 198 - if (ret) 199 - goto out_clean_mmio_info; 200 - 201 - ret = intel_gvt_init_irq(gvt); 202 - if (ret) 203 - goto out_free_firmware; 204 - 205 - ret = intel_gvt_init_gtt(gvt); 206 - if (ret) 207 - goto out_free_firmware; 208 - 209 - ret = intel_gvt_init_workload_scheduler(gvt); 210 - if (ret) 211 - goto out_clean_gtt; 212 - 213 - ret = intel_gvt_init_sched_policy(gvt); 214 - if (ret) 215 - goto out_clean_workload_scheduler; 216 - 217 - ret = intel_gvt_init_cmd_parser(gvt); 218 - if (ret) 219 - goto out_clean_sched_policy; 220 - 221 - ret = init_service_thread(gvt); 222 - if (ret) 223 - goto out_clean_cmd_parser; 224 - 225 - ret = intel_gvt_init_vgpu_types(gvt); 226 - if (ret) 227 - goto out_clean_thread; 228 - 229 - vgpu = intel_gvt_create_idle_vgpu(gvt); 230 - if (IS_ERR(vgpu)) { 231 - ret = PTR_ERR(vgpu); 232 - gvt_err("failed to create idle vgpu\n"); 233 - goto out_clean_types; 234 - } 235 - gvt->idle_vgpu = vgpu; 236 - 237 - intel_gvt_debugfs_init(gvt); 238 - 239 - ret = intel_gvt_init_vgpu_type_groups(gvt); 240 - if (ret) 241 - goto out_destroy_idle_vgpu; 242 - 243 - ret = mdev_register_device(i915->drm.dev, &intel_vgpu_mdev_ops); 244 - if (ret) 245 - goto out_cleanup_vgpu_type_groups; 246 - 247 - gvt_dbg_core("gvt device initialization is done\n"); 248 - return 0; 249 - 250 - out_cleanup_vgpu_type_groups: 251 - intel_gvt_cleanup_vgpu_type_groups(gvt); 252 - out_destroy_idle_vgpu: 253 - intel_gvt_destroy_idle_vgpu(gvt->idle_vgpu); 254 - intel_gvt_debugfs_clean(gvt); 255 - out_clean_types: 256 - intel_gvt_clean_vgpu_types(gvt); 257 - out_clean_thread: 258 - clean_service_thread(gvt); 259 - out_clean_cmd_parser: 260 - intel_gvt_clean_cmd_parser(gvt); 261 - out_clean_sched_policy: 262 - intel_gvt_clean_sched_policy(gvt); 263 - out_clean_workload_scheduler: 264 - intel_gvt_clean_workload_scheduler(gvt); 265 - out_clean_gtt: 266 - intel_gvt_clean_gtt(gvt); 267 - out_free_firmware: 268 - intel_gvt_free_firmware(gvt); 269 - out_clean_mmio_info: 270 - intel_gvt_clean_mmio_info(gvt); 271 - out_clean_idr: 272 - idr_destroy(&gvt->vgpu_idr); 273 - kfree(gvt); 274 - i915->gvt = NULL; 275 - return ret; 276 - } 277 - 278 - static void intel_gvt_pm_resume(struct drm_i915_private *i915) 279 - { 280 - struct intel_gvt *gvt = i915->gvt; 281 - 282 - intel_gvt_restore_fence(gvt); 283 - intel_gvt_restore_mmio(gvt); 284 - intel_gvt_restore_ggtt(gvt); 285 - } 286 - 287 - const struct intel_vgpu_ops intel_gvt_vgpu_ops = { 288 - .init_device = intel_gvt_init_device, 289 - .clean_device = intel_gvt_clean_device, 290 - .pm_resume = intel_gvt_pm_resume, 291 - };
-6
drivers/gpu/drm/i915/gvt/gvt.h
··· 765 765 void intel_gvt_dma_unmap_guest_page(struct intel_vgpu *vgpu, 766 766 dma_addr_t dma_addr); 767 767 768 - int intel_gvt_init_vgpu_type_groups(struct intel_gvt *gvt); 769 - void intel_gvt_cleanup_vgpu_type_groups(struct intel_gvt *gvt); 770 - 771 768 #include "trace.h" 772 - 773 - extern const struct intel_vgpu_ops intel_gvt_vgpu_ops; 774 - extern const struct mdev_parent_ops intel_vgpu_mdev_ops; 775 769 776 770 #endif
+260 -4
drivers/gpu/drm/i915/gvt/kvmgt.c
··· 1 1 /* 2 2 * KVMGT - the implementation of Intel mediated pass-through framework for KVM 3 3 * 4 - * Copyright(c) 2014-2016 Intel Corporation. All rights reserved. 4 + * Copyright(c) 2011-2016 Intel Corporation. All rights reserved. 5 5 * 6 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 7 * copy of this software and associated documentation files (the "Software"), ··· 26 26 * Kevin Tian <kevin.tian@intel.com> 27 27 * Jike Song <jike.song@intel.com> 28 28 * Xiaoguang Chen <xiaoguang.chen@intel.com> 29 + * Eddie Dong <eddie.dong@intel.com> 30 + * 31 + * Contributors: 32 + * Niu Bing <bing.niu@intel.com> 33 + * Zhi Wang <zhi.a.wang@intel.com> 29 34 */ 30 35 31 36 #include <linux/init.h> ··· 187 182 [0 ... NR_MAX_INTEL_VGPU_TYPES - 1] = NULL, 188 183 }; 189 184 190 - int intel_gvt_init_vgpu_type_groups(struct intel_gvt *gvt) 185 + static int intel_gvt_init_vgpu_type_groups(struct intel_gvt *gvt) 191 186 { 192 187 int i, j; 193 188 struct intel_vgpu_type *type; ··· 216 211 return -ENOMEM; 217 212 } 218 213 219 - void intel_gvt_cleanup_vgpu_type_groups(struct intel_gvt *gvt) 214 + static void intel_gvt_cleanup_vgpu_type_groups(struct intel_gvt *gvt) 220 215 { 221 216 int i; 222 217 struct attribute_group *group; ··· 1725 1720 .remove = intel_vgpu_remove, 1726 1721 }; 1727 1722 1728 - const struct mdev_parent_ops intel_vgpu_mdev_ops = { 1723 + static const struct mdev_parent_ops intel_vgpu_mdev_ops = { 1729 1724 .owner = THIS_MODULE, 1730 1725 .supported_type_groups = gvt_vgpu_type_groups, 1731 1726 .device_driver = &intel_vgpu_mdev_driver, ··· 1929 1924 kref_put(&entry->ref, __gvt_dma_release); 1930 1925 mutex_unlock(&vgpu->cache_lock); 1931 1926 } 1927 + 1928 + static void init_device_info(struct intel_gvt *gvt) 1929 + { 1930 + struct intel_gvt_device_info *info = &gvt->device_info; 1931 + struct pci_dev *pdev = to_pci_dev(gvt->gt->i915->drm.dev); 1932 + 1933 + info->max_support_vgpus = 8; 1934 + info->cfg_space_size = PCI_CFG_SPACE_EXP_SIZE; 1935 + info->mmio_size = 2 * 1024 * 1024; 1936 + info->mmio_bar = 0; 1937 + info->gtt_start_offset = 8 * 1024 * 1024; 1938 + info->gtt_entry_size = 8; 1939 + info->gtt_entry_size_shift = 3; 1940 + info->gmadr_bytes_in_cmd = 8; 1941 + info->max_surface_size = 36 * 1024 * 1024; 1942 + info->msi_cap_offset = pdev->msi_cap; 1943 + } 1944 + 1945 + static void intel_gvt_test_and_emulate_vblank(struct intel_gvt *gvt) 1946 + { 1947 + struct intel_vgpu *vgpu; 1948 + int id; 1949 + 1950 + mutex_lock(&gvt->lock); 1951 + idr_for_each_entry((&(gvt)->vgpu_idr), (vgpu), (id)) { 1952 + if (test_and_clear_bit(INTEL_GVT_REQUEST_EMULATE_VBLANK + id, 1953 + (void *)&gvt->service_request)) { 1954 + if (vgpu->active) 1955 + intel_vgpu_emulate_vblank(vgpu); 1956 + } 1957 + } 1958 + mutex_unlock(&gvt->lock); 1959 + } 1960 + 1961 + static int gvt_service_thread(void *data) 1962 + { 1963 + struct intel_gvt *gvt = (struct intel_gvt *)data; 1964 + int ret; 1965 + 1966 + gvt_dbg_core("service thread start\n"); 1967 + 1968 + while (!kthread_should_stop()) { 1969 + ret = wait_event_interruptible(gvt->service_thread_wq, 1970 + kthread_should_stop() || gvt->service_request); 1971 + 1972 + if (kthread_should_stop()) 1973 + break; 1974 + 1975 + if (WARN_ONCE(ret, "service thread is waken up by signal.\n")) 1976 + continue; 1977 + 1978 + intel_gvt_test_and_emulate_vblank(gvt); 1979 + 1980 + if (test_bit(INTEL_GVT_REQUEST_SCHED, 1981 + (void *)&gvt->service_request) || 1982 + test_bit(INTEL_GVT_REQUEST_EVENT_SCHED, 1983 + (void *)&gvt->service_request)) { 1984 + intel_gvt_schedule(gvt); 1985 + } 1986 + } 1987 + 1988 + return 0; 1989 + } 1990 + 1991 + static void clean_service_thread(struct intel_gvt *gvt) 1992 + { 1993 + kthread_stop(gvt->service_thread); 1994 + } 1995 + 1996 + static int init_service_thread(struct intel_gvt *gvt) 1997 + { 1998 + init_waitqueue_head(&gvt->service_thread_wq); 1999 + 2000 + gvt->service_thread = kthread_run(gvt_service_thread, 2001 + gvt, "gvt_service_thread"); 2002 + if (IS_ERR(gvt->service_thread)) { 2003 + gvt_err("fail to start service thread.\n"); 2004 + return PTR_ERR(gvt->service_thread); 2005 + } 2006 + return 0; 2007 + } 2008 + 2009 + /** 2010 + * intel_gvt_clean_device - clean a GVT device 2011 + * @i915: i915 private 2012 + * 2013 + * This function is called at the driver unloading stage, to free the 2014 + * resources owned by a GVT device. 2015 + * 2016 + */ 2017 + static void intel_gvt_clean_device(struct drm_i915_private *i915) 2018 + { 2019 + struct intel_gvt *gvt = fetch_and_zero(&i915->gvt); 2020 + 2021 + if (drm_WARN_ON(&i915->drm, !gvt)) 2022 + return; 2023 + 2024 + mdev_unregister_device(i915->drm.dev); 2025 + intel_gvt_cleanup_vgpu_type_groups(gvt); 2026 + intel_gvt_destroy_idle_vgpu(gvt->idle_vgpu); 2027 + intel_gvt_clean_vgpu_types(gvt); 2028 + 2029 + intel_gvt_debugfs_clean(gvt); 2030 + clean_service_thread(gvt); 2031 + intel_gvt_clean_cmd_parser(gvt); 2032 + intel_gvt_clean_sched_policy(gvt); 2033 + intel_gvt_clean_workload_scheduler(gvt); 2034 + intel_gvt_clean_gtt(gvt); 2035 + intel_gvt_free_firmware(gvt); 2036 + intel_gvt_clean_mmio_info(gvt); 2037 + idr_destroy(&gvt->vgpu_idr); 2038 + 2039 + kfree(i915->gvt); 2040 + } 2041 + 2042 + /** 2043 + * intel_gvt_init_device - initialize a GVT device 2044 + * @i915: drm i915 private data 2045 + * 2046 + * This function is called at the initialization stage, to initialize 2047 + * necessary GVT components. 2048 + * 2049 + * Returns: 2050 + * Zero on success, negative error code if failed. 2051 + * 2052 + */ 2053 + static int intel_gvt_init_device(struct drm_i915_private *i915) 2054 + { 2055 + struct intel_gvt *gvt; 2056 + struct intel_vgpu *vgpu; 2057 + int ret; 2058 + 2059 + if (drm_WARN_ON(&i915->drm, i915->gvt)) 2060 + return -EEXIST; 2061 + 2062 + gvt = kzalloc(sizeof(struct intel_gvt), GFP_KERNEL); 2063 + if (!gvt) 2064 + return -ENOMEM; 2065 + 2066 + gvt_dbg_core("init gvt device\n"); 2067 + 2068 + idr_init_base(&gvt->vgpu_idr, 1); 2069 + spin_lock_init(&gvt->scheduler.mmio_context_lock); 2070 + mutex_init(&gvt->lock); 2071 + mutex_init(&gvt->sched_lock); 2072 + gvt->gt = to_gt(i915); 2073 + i915->gvt = gvt; 2074 + 2075 + init_device_info(gvt); 2076 + 2077 + ret = intel_gvt_setup_mmio_info(gvt); 2078 + if (ret) 2079 + goto out_clean_idr; 2080 + 2081 + intel_gvt_init_engine_mmio_context(gvt); 2082 + 2083 + ret = intel_gvt_load_firmware(gvt); 2084 + if (ret) 2085 + goto out_clean_mmio_info; 2086 + 2087 + ret = intel_gvt_init_irq(gvt); 2088 + if (ret) 2089 + goto out_free_firmware; 2090 + 2091 + ret = intel_gvt_init_gtt(gvt); 2092 + if (ret) 2093 + goto out_free_firmware; 2094 + 2095 + ret = intel_gvt_init_workload_scheduler(gvt); 2096 + if (ret) 2097 + goto out_clean_gtt; 2098 + 2099 + ret = intel_gvt_init_sched_policy(gvt); 2100 + if (ret) 2101 + goto out_clean_workload_scheduler; 2102 + 2103 + ret = intel_gvt_init_cmd_parser(gvt); 2104 + if (ret) 2105 + goto out_clean_sched_policy; 2106 + 2107 + ret = init_service_thread(gvt); 2108 + if (ret) 2109 + goto out_clean_cmd_parser; 2110 + 2111 + ret = intel_gvt_init_vgpu_types(gvt); 2112 + if (ret) 2113 + goto out_clean_thread; 2114 + 2115 + vgpu = intel_gvt_create_idle_vgpu(gvt); 2116 + if (IS_ERR(vgpu)) { 2117 + ret = PTR_ERR(vgpu); 2118 + gvt_err("failed to create idle vgpu\n"); 2119 + goto out_clean_types; 2120 + } 2121 + gvt->idle_vgpu = vgpu; 2122 + 2123 + intel_gvt_debugfs_init(gvt); 2124 + 2125 + ret = intel_gvt_init_vgpu_type_groups(gvt); 2126 + if (ret) 2127 + goto out_destroy_idle_vgpu; 2128 + 2129 + ret = mdev_register_device(i915->drm.dev, &intel_vgpu_mdev_ops); 2130 + if (ret) 2131 + goto out_cleanup_vgpu_type_groups; 2132 + 2133 + gvt_dbg_core("gvt device initialization is done\n"); 2134 + return 0; 2135 + 2136 + out_cleanup_vgpu_type_groups: 2137 + intel_gvt_cleanup_vgpu_type_groups(gvt); 2138 + out_destroy_idle_vgpu: 2139 + intel_gvt_destroy_idle_vgpu(gvt->idle_vgpu); 2140 + intel_gvt_debugfs_clean(gvt); 2141 + out_clean_types: 2142 + intel_gvt_clean_vgpu_types(gvt); 2143 + out_clean_thread: 2144 + clean_service_thread(gvt); 2145 + out_clean_cmd_parser: 2146 + intel_gvt_clean_cmd_parser(gvt); 2147 + out_clean_sched_policy: 2148 + intel_gvt_clean_sched_policy(gvt); 2149 + out_clean_workload_scheduler: 2150 + intel_gvt_clean_workload_scheduler(gvt); 2151 + out_clean_gtt: 2152 + intel_gvt_clean_gtt(gvt); 2153 + out_free_firmware: 2154 + intel_gvt_free_firmware(gvt); 2155 + out_clean_mmio_info: 2156 + intel_gvt_clean_mmio_info(gvt); 2157 + out_clean_idr: 2158 + idr_destroy(&gvt->vgpu_idr); 2159 + kfree(gvt); 2160 + i915->gvt = NULL; 2161 + return ret; 2162 + } 2163 + 2164 + static void intel_gvt_pm_resume(struct drm_i915_private *i915) 2165 + { 2166 + struct intel_gvt *gvt = i915->gvt; 2167 + 2168 + intel_gvt_restore_fence(gvt); 2169 + intel_gvt_restore_mmio(gvt); 2170 + intel_gvt_restore_ggtt(gvt); 2171 + } 2172 + 2173 + static const struct intel_vgpu_ops intel_gvt_vgpu_ops = { 2174 + .init_device = intel_gvt_init_device, 2175 + .clean_device = intel_gvt_clean_device, 2176 + .pm_resume = intel_gvt_pm_resume, 2177 + }; 1932 2178 1933 2179 static int __init kvmgt_init(void) 1934 2180 {