aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/gvt/gvt.c11
-rw-r--r--drivers/gpu/drm/i915/gvt/gvt.h3
-rw-r--r--drivers/gpu/drm/i915/gvt/vgpu.c56
3 files changed, 69 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/gvt/gvt.c b/drivers/gpu/drm/i915/gvt/gvt.c
index 894735c77f63..0f3a98865a58 100644
--- a/drivers/gpu/drm/i915/gvt/gvt.c
+++ b/drivers/gpu/drm/i915/gvt/gvt.c
@@ -202,6 +202,8 @@ void intel_gvt_clean_device(struct drm_i915_private *dev_priv)
202 202
203 idr_destroy(&gvt->vgpu_idr); 203 idr_destroy(&gvt->vgpu_idr);
204 204
205 intel_gvt_destroy_idle_vgpu(gvt->idle_vgpu);
206
205 kfree(dev_priv->gvt); 207 kfree(dev_priv->gvt);
206 dev_priv->gvt = NULL; 208 dev_priv->gvt = NULL;
207} 209}
@@ -220,6 +222,7 @@ void intel_gvt_clean_device(struct drm_i915_private *dev_priv)
220int intel_gvt_init_device(struct drm_i915_private *dev_priv) 222int intel_gvt_init_device(struct drm_i915_private *dev_priv)
221{ 223{
222 struct intel_gvt *gvt; 224 struct intel_gvt *gvt;
225 struct intel_vgpu *vgpu;
223 int ret; 226 int ret;
224 227
225 /* 228 /*
@@ -292,6 +295,14 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv)
292 goto out_clean_types; 295 goto out_clean_types;
293 } 296 }
294 297
298 vgpu = intel_gvt_create_idle_vgpu(gvt);
299 if (IS_ERR(vgpu)) {
300 ret = PTR_ERR(vgpu);
301 gvt_err("failed to create idle vgpu\n");
302 goto out_clean_types;
303 }
304 gvt->idle_vgpu = vgpu;
305
295 gvt_dbg_core("gvt device initialization is done\n"); 306 gvt_dbg_core("gvt device initialization is done\n");
296 dev_priv->gvt = gvt; 307 dev_priv->gvt = gvt;
297 return 0; 308 return 0;
diff --git a/drivers/gpu/drm/i915/gvt/gvt.h b/drivers/gpu/drm/i915/gvt/gvt.h
index 0631f64e06db..806da96b6a92 100644
--- a/drivers/gpu/drm/i915/gvt/gvt.h
+++ b/drivers/gpu/drm/i915/gvt/gvt.h
@@ -243,6 +243,7 @@ struct intel_gvt {
243 DECLARE_HASHTABLE(cmd_table, GVT_CMD_HASH_BITS); 243 DECLARE_HASHTABLE(cmd_table, GVT_CMD_HASH_BITS);
244 struct intel_vgpu_type *types; 244 struct intel_vgpu_type *types;
245 unsigned int num_types; 245 unsigned int num_types;
246 struct intel_vgpu *idle_vgpu;
246 247
247 struct task_struct *service_thread; 248 struct task_struct *service_thread;
248 wait_queue_head_t service_thread_wq; 249 wait_queue_head_t service_thread_wq;
@@ -386,6 +387,8 @@ static inline void intel_vgpu_write_pci_bar(struct intel_vgpu *vgpu,
386int intel_gvt_init_vgpu_types(struct intel_gvt *gvt); 387int intel_gvt_init_vgpu_types(struct intel_gvt *gvt);
387void intel_gvt_clean_vgpu_types(struct intel_gvt *gvt); 388void intel_gvt_clean_vgpu_types(struct intel_gvt *gvt);
388 389
390struct intel_vgpu *intel_gvt_create_idle_vgpu(struct intel_gvt *gvt);
391void intel_gvt_destroy_idle_vgpu(struct intel_vgpu *vgpu);
389struct intel_vgpu *intel_gvt_create_vgpu(struct intel_gvt *gvt, 392struct intel_vgpu *intel_gvt_create_vgpu(struct intel_gvt *gvt,
390 struct intel_vgpu_type *type); 393 struct intel_vgpu_type *type);
391void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu); 394void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu);
diff --git a/drivers/gpu/drm/i915/gvt/vgpu.c b/drivers/gpu/drm/i915/gvt/vgpu.c
index 36c107e2058a..6ba02525e905 100644
--- a/drivers/gpu/drm/i915/gvt/vgpu.c
+++ b/drivers/gpu/drm/i915/gvt/vgpu.c
@@ -233,6 +233,59 @@ void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu)
233 mutex_unlock(&gvt->lock); 233 mutex_unlock(&gvt->lock);
234} 234}
235 235
236#define IDLE_VGPU_IDR 0
237
238/**
239 * intel_gvt_create_idle_vgpu - create an idle virtual GPU
240 * @gvt: GVT device
241 *
242 * This function is called when user wants to create an idle virtual GPU.
243 *
244 * Returns:
245 * pointer to intel_vgpu, error pointer if failed.
246 */
247struct intel_vgpu *intel_gvt_create_idle_vgpu(struct intel_gvt *gvt)
248{
249 struct intel_vgpu *vgpu;
250 enum intel_engine_id i;
251 int ret;
252
253 vgpu = vzalloc(sizeof(*vgpu));
254 if (!vgpu)
255 return ERR_PTR(-ENOMEM);
256
257 vgpu->id = IDLE_VGPU_IDR;
258 vgpu->gvt = gvt;
259
260 for (i = 0; i < I915_NUM_ENGINES; i++)
261 INIT_LIST_HEAD(&vgpu->workload_q_head[i]);
262
263 ret = intel_vgpu_init_sched_policy(vgpu);
264 if (ret)
265 goto out_free_vgpu;
266
267 vgpu->active = false;
268
269 return vgpu;
270
271out_free_vgpu:
272 vfree(vgpu);
273 return ERR_PTR(ret);
274}
275
276/**
277 * intel_gvt_destroy_vgpu - destroy an idle virtual GPU
278 * @vgpu: virtual GPU
279 *
280 * This function is called when user wants to destroy an idle virtual GPU.
281 *
282 */
283void intel_gvt_destroy_idle_vgpu(struct intel_vgpu *vgpu)
284{
285 intel_vgpu_clean_sched_policy(vgpu);
286 vfree(vgpu);
287}
288
236static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt, 289static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt,
237 struct intel_vgpu_creation_params *param) 290 struct intel_vgpu_creation_params *param)
238{ 291{
@@ -249,7 +302,8 @@ static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt,
249 302
250 mutex_lock(&gvt->lock); 303 mutex_lock(&gvt->lock);
251 304
252 ret = idr_alloc(&gvt->vgpu_idr, vgpu, 1, GVT_MAX_VGPU, GFP_KERNEL); 305 ret = idr_alloc(&gvt->vgpu_idr, vgpu, IDLE_VGPU_IDR + 1, GVT_MAX_VGPU,
306 GFP_KERNEL);
253 if (ret < 0) 307 if (ret < 0)
254 goto out_free_vgpu; 308 goto out_free_vgpu;
255 309