diff options
-rw-r--r-- | drivers/gpu/drm/i915/gvt/gvt.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/gvt.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/vgpu.c | 56 |
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) | |||
220 | int intel_gvt_init_device(struct drm_i915_private *dev_priv) | 222 | int 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, | |||
386 | int intel_gvt_init_vgpu_types(struct intel_gvt *gvt); | 387 | int intel_gvt_init_vgpu_types(struct intel_gvt *gvt); |
387 | void intel_gvt_clean_vgpu_types(struct intel_gvt *gvt); | 388 | void intel_gvt_clean_vgpu_types(struct intel_gvt *gvt); |
388 | 389 | ||
390 | struct intel_vgpu *intel_gvt_create_idle_vgpu(struct intel_gvt *gvt); | ||
391 | void intel_gvt_destroy_idle_vgpu(struct intel_vgpu *vgpu); | ||
389 | struct intel_vgpu *intel_gvt_create_vgpu(struct intel_gvt *gvt, | 392 | struct intel_vgpu *intel_gvt_create_vgpu(struct intel_gvt *gvt, |
390 | struct intel_vgpu_type *type); | 393 | struct intel_vgpu_type *type); |
391 | void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu); | 394 | void 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 | */ | ||
247 | struct 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 | |||
271 | out_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 | */ | ||
283 | void intel_gvt_destroy_idle_vgpu(struct intel_vgpu *vgpu) | ||
284 | { | ||
285 | intel_vgpu_clean_sched_policy(vgpu); | ||
286 | vfree(vgpu); | ||
287 | } | ||
288 | |||
236 | static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt, | 289 | static 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 | ||