vfio/mdev: Correct the function signatures for the mdev_type_attributes
[linux-2.6-microblaze.git] / 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 struct intel_gvt_host intel_gvt_host;
43
44 static const char * const supported_hypervisors[] = {
45         [INTEL_GVT_HYPERVISOR_XEN] = "XEN",
46         [INTEL_GVT_HYPERVISOR_KVM] = "KVM",
47 };
48
49 static struct intel_vgpu_type *
50 intel_gvt_find_vgpu_type(struct intel_gvt *gvt, unsigned int type_group_id)
51 {
52         if (WARN_ON(type_group_id >= gvt->num_types))
53                 return NULL;
54         return &gvt->types[type_group_id];
55 }
56
57 static ssize_t available_instances_show(struct mdev_type *mtype,
58                                         struct mdev_type_attribute *attr,
59                                         char *buf)
60 {
61         struct intel_vgpu_type *type;
62         unsigned int num = 0;
63         void *gvt = kdev_to_i915(mtype_get_parent_dev(mtype))->gvt;
64
65         type = intel_gvt_find_vgpu_type(gvt, mtype_get_type_group_id(mtype));
66         if (!type)
67                 num = 0;
68         else
69                 num = type->avail_instance;
70
71         return sprintf(buf, "%u\n", num);
72 }
73
74 static ssize_t device_api_show(struct mdev_type *mtype,
75                                struct mdev_type_attribute *attr, char *buf)
76 {
77         return sprintf(buf, "%s\n", VFIO_DEVICE_API_PCI_STRING);
78 }
79
80 static ssize_t description_show(struct mdev_type *mtype,
81                                 struct mdev_type_attribute *attr, char *buf)
82 {
83         struct intel_vgpu_type *type;
84         void *gvt = kdev_to_i915(mtype_get_parent_dev(mtype))->gvt;
85
86         type = intel_gvt_find_vgpu_type(gvt, mtype_get_type_group_id(mtype));
87         if (!type)
88                 return 0;
89
90         return sprintf(buf, "low_gm_size: %dMB\nhigh_gm_size: %dMB\n"
91                        "fence: %d\nresolution: %s\n"
92                        "weight: %d\n",
93                        BYTES_TO_MB(type->low_gm_size),
94                        BYTES_TO_MB(type->high_gm_size),
95                        type->fence, vgpu_edid_str(type->resolution),
96                        type->weight);
97 }
98
99 static MDEV_TYPE_ATTR_RO(available_instances);
100 static MDEV_TYPE_ATTR_RO(device_api);
101 static MDEV_TYPE_ATTR_RO(description);
102
103 static struct attribute *gvt_type_attrs[] = {
104         &mdev_type_attr_available_instances.attr,
105         &mdev_type_attr_device_api.attr,
106         &mdev_type_attr_description.attr,
107         NULL,
108 };
109
110 static struct attribute_group *gvt_vgpu_type_groups[] = {
111         [0 ... NR_MAX_INTEL_VGPU_TYPES - 1] = NULL,
112 };
113
114 static bool intel_get_gvt_attrs(struct attribute_group ***intel_vgpu_type_groups)
115 {
116         *intel_vgpu_type_groups = gvt_vgpu_type_groups;
117         return true;
118 }
119
120 static bool intel_gvt_init_vgpu_type_groups(struct intel_gvt *gvt)
121 {
122         int i, j;
123         struct intel_vgpu_type *type;
124         struct attribute_group *group;
125
126         for (i = 0; i < gvt->num_types; i++) {
127                 type = &gvt->types[i];
128
129                 group = kzalloc(sizeof(struct attribute_group), GFP_KERNEL);
130                 if (WARN_ON(!group))
131                         goto unwind;
132
133                 group->name = type->name;
134                 group->attrs = gvt_type_attrs;
135                 gvt_vgpu_type_groups[i] = group;
136         }
137
138         return true;
139
140 unwind:
141         for (j = 0; j < i; j++) {
142                 group = gvt_vgpu_type_groups[j];
143                 kfree(group);
144         }
145
146         return false;
147 }
148
149 static void intel_gvt_cleanup_vgpu_type_groups(struct intel_gvt *gvt)
150 {
151         int i;
152         struct attribute_group *group;
153
154         for (i = 0; i < gvt->num_types; i++) {
155                 group = gvt_vgpu_type_groups[i];
156                 gvt_vgpu_type_groups[i] = NULL;
157                 kfree(group);
158         }
159 }
160
161 static const struct intel_gvt_ops intel_gvt_ops = {
162         .emulate_cfg_read = intel_vgpu_emulate_cfg_read,
163         .emulate_cfg_write = intel_vgpu_emulate_cfg_write,
164         .emulate_mmio_read = intel_vgpu_emulate_mmio_read,
165         .emulate_mmio_write = intel_vgpu_emulate_mmio_write,
166         .vgpu_create = intel_gvt_create_vgpu,
167         .vgpu_destroy = intel_gvt_destroy_vgpu,
168         .vgpu_release = intel_gvt_release_vgpu,
169         .vgpu_reset = intel_gvt_reset_vgpu,
170         .vgpu_activate = intel_gvt_activate_vgpu,
171         .vgpu_deactivate = intel_gvt_deactivate_vgpu,
172         .gvt_find_vgpu_type = intel_gvt_find_vgpu_type,
173         .get_gvt_attrs = intel_get_gvt_attrs,
174         .vgpu_query_plane = intel_vgpu_query_plane,
175         .vgpu_get_dmabuf = intel_vgpu_get_dmabuf,
176         .write_protect_handler = intel_vgpu_page_track_handler,
177         .emulate_hotplug = intel_vgpu_emulate_hotplug,
178 };
179
180 static void init_device_info(struct intel_gvt *gvt)
181 {
182         struct intel_gvt_device_info *info = &gvt->device_info;
183         struct pci_dev *pdev = gvt->gt->i915->drm.pdev;
184
185         info->max_support_vgpus = 8;
186         info->cfg_space_size = PCI_CFG_SPACE_EXP_SIZE;
187         info->mmio_size = 2 * 1024 * 1024;
188         info->mmio_bar = 0;
189         info->gtt_start_offset = 8 * 1024 * 1024;
190         info->gtt_entry_size = 8;
191         info->gtt_entry_size_shift = 3;
192         info->gmadr_bytes_in_cmd = 8;
193         info->max_surface_size = 36 * 1024 * 1024;
194         info->msi_cap_offset = pdev->msi_cap;
195 }
196
197 static int gvt_service_thread(void *data)
198 {
199         struct intel_gvt *gvt = (struct intel_gvt *)data;
200         int ret;
201
202         gvt_dbg_core("service thread start\n");
203
204         while (!kthread_should_stop()) {
205                 ret = wait_event_interruptible(gvt->service_thread_wq,
206                                 kthread_should_stop() || gvt->service_request);
207
208                 if (kthread_should_stop())
209                         break;
210
211                 if (WARN_ONCE(ret, "service thread is waken up by signal.\n"))
212                         continue;
213
214                 if (test_and_clear_bit(INTEL_GVT_REQUEST_EMULATE_VBLANK,
215                                         (void *)&gvt->service_request))
216                         intel_gvt_emulate_vblank(gvt);
217
218                 if (test_bit(INTEL_GVT_REQUEST_SCHED,
219                                 (void *)&gvt->service_request) ||
220                         test_bit(INTEL_GVT_REQUEST_EVENT_SCHED,
221                                         (void *)&gvt->service_request)) {
222                         intel_gvt_schedule(gvt);
223                 }
224         }
225
226         return 0;
227 }
228
229 static void clean_service_thread(struct intel_gvt *gvt)
230 {
231         kthread_stop(gvt->service_thread);
232 }
233
234 static int init_service_thread(struct intel_gvt *gvt)
235 {
236         init_waitqueue_head(&gvt->service_thread_wq);
237
238         gvt->service_thread = kthread_run(gvt_service_thread,
239                         gvt, "gvt_service_thread");
240         if (IS_ERR(gvt->service_thread)) {
241                 gvt_err("fail to start service thread.\n");
242                 return PTR_ERR(gvt->service_thread);
243         }
244         return 0;
245 }
246
247 /**
248  * intel_gvt_clean_device - clean a GVT device
249  * @i915: i915 private
250  *
251  * This function is called at the driver unloading stage, to free the
252  * resources owned by a GVT device.
253  *
254  */
255 void intel_gvt_clean_device(struct drm_i915_private *i915)
256 {
257         struct intel_gvt *gvt = fetch_and_zero(&i915->gvt);
258
259         if (drm_WARN_ON(&i915->drm, !gvt))
260                 return;
261
262         intel_gvt_destroy_idle_vgpu(gvt->idle_vgpu);
263         intel_gvt_cleanup_vgpu_type_groups(gvt);
264         intel_gvt_clean_vgpu_types(gvt);
265
266         intel_gvt_debugfs_clean(gvt);
267         clean_service_thread(gvt);
268         intel_gvt_clean_cmd_parser(gvt);
269         intel_gvt_clean_sched_policy(gvt);
270         intel_gvt_clean_workload_scheduler(gvt);
271         intel_gvt_clean_gtt(gvt);
272         intel_gvt_clean_irq(gvt);
273         intel_gvt_free_firmware(gvt);
274         intel_gvt_clean_mmio_info(gvt);
275         idr_destroy(&gvt->vgpu_idr);
276
277         kfree(i915->gvt);
278 }
279
280 /**
281  * intel_gvt_init_device - initialize a GVT device
282  * @i915: drm i915 private data
283  *
284  * This function is called at the initialization stage, to initialize
285  * necessary GVT components.
286  *
287  * Returns:
288  * Zero on success, negative error code if failed.
289  *
290  */
291 int intel_gvt_init_device(struct drm_i915_private *i915)
292 {
293         struct intel_gvt *gvt;
294         struct intel_vgpu *vgpu;
295         int ret;
296
297         if (drm_WARN_ON(&i915->drm, i915->gvt))
298                 return -EEXIST;
299
300         gvt = kzalloc(sizeof(struct intel_gvt), GFP_KERNEL);
301         if (!gvt)
302                 return -ENOMEM;
303
304         gvt_dbg_core("init gvt device\n");
305
306         idr_init_base(&gvt->vgpu_idr, 1);
307         spin_lock_init(&gvt->scheduler.mmio_context_lock);
308         mutex_init(&gvt->lock);
309         mutex_init(&gvt->sched_lock);
310         gvt->gt = &i915->gt;
311         i915->gvt = gvt;
312
313         init_device_info(gvt);
314
315         ret = intel_gvt_setup_mmio_info(gvt);
316         if (ret)
317                 goto out_clean_idr;
318
319         intel_gvt_init_engine_mmio_context(gvt);
320
321         ret = intel_gvt_load_firmware(gvt);
322         if (ret)
323                 goto out_clean_mmio_info;
324
325         ret = intel_gvt_init_irq(gvt);
326         if (ret)
327                 goto out_free_firmware;
328
329         ret = intel_gvt_init_gtt(gvt);
330         if (ret)
331                 goto out_clean_irq;
332
333         ret = intel_gvt_init_workload_scheduler(gvt);
334         if (ret)
335                 goto out_clean_gtt;
336
337         ret = intel_gvt_init_sched_policy(gvt);
338         if (ret)
339                 goto out_clean_workload_scheduler;
340
341         ret = intel_gvt_init_cmd_parser(gvt);
342         if (ret)
343                 goto out_clean_sched_policy;
344
345         ret = init_service_thread(gvt);
346         if (ret)
347                 goto out_clean_cmd_parser;
348
349         ret = intel_gvt_init_vgpu_types(gvt);
350         if (ret)
351                 goto out_clean_thread;
352
353         ret = intel_gvt_init_vgpu_type_groups(gvt);
354         if (ret == false) {
355                 gvt_err("failed to init vgpu type groups: %d\n", ret);
356                 goto out_clean_types;
357         }
358
359         vgpu = intel_gvt_create_idle_vgpu(gvt);
360         if (IS_ERR(vgpu)) {
361                 ret = PTR_ERR(vgpu);
362                 gvt_err("failed to create idle vgpu\n");
363                 goto out_clean_types;
364         }
365         gvt->idle_vgpu = vgpu;
366
367         intel_gvt_debugfs_init(gvt);
368
369         gvt_dbg_core("gvt device initialization is done\n");
370         intel_gvt_host.dev = &i915->drm.pdev->dev;
371         intel_gvt_host.initialized = true;
372         return 0;
373
374 out_clean_types:
375         intel_gvt_clean_vgpu_types(gvt);
376 out_clean_thread:
377         clean_service_thread(gvt);
378 out_clean_cmd_parser:
379         intel_gvt_clean_cmd_parser(gvt);
380 out_clean_sched_policy:
381         intel_gvt_clean_sched_policy(gvt);
382 out_clean_workload_scheduler:
383         intel_gvt_clean_workload_scheduler(gvt);
384 out_clean_gtt:
385         intel_gvt_clean_gtt(gvt);
386 out_clean_irq:
387         intel_gvt_clean_irq(gvt);
388 out_free_firmware:
389         intel_gvt_free_firmware(gvt);
390 out_clean_mmio_info:
391         intel_gvt_clean_mmio_info(gvt);
392 out_clean_idr:
393         idr_destroy(&gvt->vgpu_idr);
394         kfree(gvt);
395         i915->gvt = NULL;
396         return ret;
397 }
398
399 int
400 intel_gvt_pm_resume(struct intel_gvt *gvt)
401 {
402         intel_gvt_restore_fence(gvt);
403         intel_gvt_restore_mmio(gvt);
404         intel_gvt_restore_ggtt(gvt);
405         return 0;
406 }
407
408 int
409 intel_gvt_register_hypervisor(const struct intel_gvt_mpt *m)
410 {
411         int ret;
412         void *gvt;
413
414         if (!intel_gvt_host.initialized)
415                 return -ENODEV;
416
417         if (m->type != INTEL_GVT_HYPERVISOR_KVM &&
418             m->type != INTEL_GVT_HYPERVISOR_XEN)
419                 return -EINVAL;
420
421         /* Get a reference for device model module */
422         if (!try_module_get(THIS_MODULE))
423                 return -ENODEV;
424
425         intel_gvt_host.mpt = m;
426         intel_gvt_host.hypervisor_type = m->type;
427         gvt = (void *)kdev_to_i915(intel_gvt_host.dev)->gvt;
428
429         ret = intel_gvt_hypervisor_host_init(intel_gvt_host.dev, gvt,
430                                              &intel_gvt_ops);
431         if (ret < 0) {
432                 gvt_err("Failed to init %s hypervisor module\n",
433                         supported_hypervisors[intel_gvt_host.hypervisor_type]);
434                 module_put(THIS_MODULE);
435                 return -ENODEV;
436         }
437         gvt_dbg_core("Running with hypervisor %s in host mode\n",
438                      supported_hypervisors[intel_gvt_host.hypervisor_type]);
439         return 0;
440 }
441 EXPORT_SYMBOL_GPL(intel_gvt_register_hypervisor);
442
443 void
444 intel_gvt_unregister_hypervisor(void)
445 {
446         intel_gvt_hypervisor_host_exit(intel_gvt_host.dev);
447         module_put(THIS_MODULE);
448 }
449 EXPORT_SYMBOL_GPL(intel_gvt_unregister_hypervisor);