diff options
author | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2018-09-04 00:30:55 -0400 |
---|---|---|
committer | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2018-09-04 00:30:56 -0400 |
commit | f518cd94ecdce3298c9bace261475b6342a0111d (patch) | |
tree | e1ab98b722c7a3e42f9cb3da2f9f711fea257fc7 /drivers/gpu | |
parent | 57361846b52bc686112da6ca5368d11210796804 (diff) | |
parent | 54ff01fd0d44b9681615f77c15fe9ea6dfadb501 (diff) |
Merge tag 'gvt-fixes-2018-09-04' of https://github.com/intel/gvt-linux into drm-intel-fixes
gvt-fixes-2018-09-04
- two BXT virtual display emulation fixes (Colin)
- gen9 dbuf guest warning fix (Xiaolin)
- vgpu close pm warning fix (Hang)
- dmabuf format_mod fix (Zhenyu)
- multiple VM guest failure fix for scheduling (Zhenyu)
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
From: Zhenyu Wang <zhenyuw@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180904025437.GE20737@zhen-hp.sh.intel.com
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/i915/gvt/dmabuf.c | 33 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/fb_decoder.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/fb_decoder.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/handlers.c | 33 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/mmio_context.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/sched_policy.c | 37 |
6 files changed, 86 insertions, 26 deletions
diff --git a/drivers/gpu/drm/i915/gvt/dmabuf.c b/drivers/gpu/drm/i915/gvt/dmabuf.c index 6e3f56684f4e..51ed99a37803 100644 --- a/drivers/gpu/drm/i915/gvt/dmabuf.c +++ b/drivers/gpu/drm/i915/gvt/dmabuf.c | |||
@@ -170,20 +170,22 @@ static struct drm_i915_gem_object *vgpu_create_gem(struct drm_device *dev, | |||
170 | unsigned int tiling_mode = 0; | 170 | unsigned int tiling_mode = 0; |
171 | unsigned int stride = 0; | 171 | unsigned int stride = 0; |
172 | 172 | ||
173 | switch (info->drm_format_mod << 10) { | 173 | switch (info->drm_format_mod) { |
174 | case PLANE_CTL_TILED_LINEAR: | 174 | case DRM_FORMAT_MOD_LINEAR: |
175 | tiling_mode = I915_TILING_NONE; | 175 | tiling_mode = I915_TILING_NONE; |
176 | break; | 176 | break; |
177 | case PLANE_CTL_TILED_X: | 177 | case I915_FORMAT_MOD_X_TILED: |
178 | tiling_mode = I915_TILING_X; | 178 | tiling_mode = I915_TILING_X; |
179 | stride = info->stride; | 179 | stride = info->stride; |
180 | break; | 180 | break; |
181 | case PLANE_CTL_TILED_Y: | 181 | case I915_FORMAT_MOD_Y_TILED: |
182 | case I915_FORMAT_MOD_Yf_TILED: | ||
182 | tiling_mode = I915_TILING_Y; | 183 | tiling_mode = I915_TILING_Y; |
183 | stride = info->stride; | 184 | stride = info->stride; |
184 | break; | 185 | break; |
185 | default: | 186 | default: |
186 | gvt_dbg_core("not supported tiling mode\n"); | 187 | gvt_dbg_core("invalid drm_format_mod %llx for tiling\n", |
188 | info->drm_format_mod); | ||
187 | } | 189 | } |
188 | obj->tiling_and_stride = tiling_mode | stride; | 190 | obj->tiling_and_stride = tiling_mode | stride; |
189 | } else { | 191 | } else { |
@@ -222,9 +224,26 @@ static int vgpu_get_plane_info(struct drm_device *dev, | |||
222 | info->height = p.height; | 224 | info->height = p.height; |
223 | info->stride = p.stride; | 225 | info->stride = p.stride; |
224 | info->drm_format = p.drm_format; | 226 | info->drm_format = p.drm_format; |
225 | info->drm_format_mod = p.tiled; | 227 | |
228 | switch (p.tiled) { | ||
229 | case PLANE_CTL_TILED_LINEAR: | ||
230 | info->drm_format_mod = DRM_FORMAT_MOD_LINEAR; | ||
231 | break; | ||
232 | case PLANE_CTL_TILED_X: | ||
233 | info->drm_format_mod = I915_FORMAT_MOD_X_TILED; | ||
234 | break; | ||
235 | case PLANE_CTL_TILED_Y: | ||
236 | info->drm_format_mod = I915_FORMAT_MOD_Y_TILED; | ||
237 | break; | ||
238 | case PLANE_CTL_TILED_YF: | ||
239 | info->drm_format_mod = I915_FORMAT_MOD_Yf_TILED; | ||
240 | break; | ||
241 | default: | ||
242 | gvt_vgpu_err("invalid tiling mode: %x\n", p.tiled); | ||
243 | } | ||
244 | |||
226 | info->size = (((p.stride * p.height * p.bpp) / 8) + | 245 | info->size = (((p.stride * p.height * p.bpp) / 8) + |
227 | (PAGE_SIZE - 1)) >> PAGE_SHIFT; | 246 | (PAGE_SIZE - 1)) >> PAGE_SHIFT; |
228 | } else if (plane_id == DRM_PLANE_TYPE_CURSOR) { | 247 | } else if (plane_id == DRM_PLANE_TYPE_CURSOR) { |
229 | ret = intel_vgpu_decode_cursor_plane(vgpu, &c); | 248 | ret = intel_vgpu_decode_cursor_plane(vgpu, &c); |
230 | if (ret) | 249 | if (ret) |
diff --git a/drivers/gpu/drm/i915/gvt/fb_decoder.c b/drivers/gpu/drm/i915/gvt/fb_decoder.c index face664be3e8..481896fb712a 100644 --- a/drivers/gpu/drm/i915/gvt/fb_decoder.c +++ b/drivers/gpu/drm/i915/gvt/fb_decoder.c | |||
@@ -220,8 +220,7 @@ int intel_vgpu_decode_primary_plane(struct intel_vgpu *vgpu, | |||
220 | if (IS_SKYLAKE(dev_priv) | 220 | if (IS_SKYLAKE(dev_priv) |
221 | || IS_KABYLAKE(dev_priv) | 221 | || IS_KABYLAKE(dev_priv) |
222 | || IS_BROXTON(dev_priv)) { | 222 | || IS_BROXTON(dev_priv)) { |
223 | plane->tiled = (val & PLANE_CTL_TILED_MASK) >> | 223 | plane->tiled = val & PLANE_CTL_TILED_MASK; |
224 | _PLANE_CTL_TILED_SHIFT; | ||
225 | fmt = skl_format_to_drm( | 224 | fmt = skl_format_to_drm( |
226 | val & PLANE_CTL_FORMAT_MASK, | 225 | val & PLANE_CTL_FORMAT_MASK, |
227 | val & PLANE_CTL_ORDER_RGBX, | 226 | val & PLANE_CTL_ORDER_RGBX, |
@@ -260,7 +259,7 @@ int intel_vgpu_decode_primary_plane(struct intel_vgpu *vgpu, | |||
260 | return -EINVAL; | 259 | return -EINVAL; |
261 | } | 260 | } |
262 | 261 | ||
263 | plane->stride = intel_vgpu_get_stride(vgpu, pipe, (plane->tiled << 10), | 262 | plane->stride = intel_vgpu_get_stride(vgpu, pipe, plane->tiled, |
264 | (IS_SKYLAKE(dev_priv) | 263 | (IS_SKYLAKE(dev_priv) |
265 | || IS_KABYLAKE(dev_priv) | 264 | || IS_KABYLAKE(dev_priv) |
266 | || IS_BROXTON(dev_priv)) ? | 265 | || IS_BROXTON(dev_priv)) ? |
diff --git a/drivers/gpu/drm/i915/gvt/fb_decoder.h b/drivers/gpu/drm/i915/gvt/fb_decoder.h index cb055f3c81a2..60c155085029 100644 --- a/drivers/gpu/drm/i915/gvt/fb_decoder.h +++ b/drivers/gpu/drm/i915/gvt/fb_decoder.h | |||
@@ -101,7 +101,7 @@ struct intel_gvt; | |||
101 | /* color space conversion and gamma correction are not included */ | 101 | /* color space conversion and gamma correction are not included */ |
102 | struct intel_vgpu_primary_plane_format { | 102 | struct intel_vgpu_primary_plane_format { |
103 | u8 enabled; /* plane is enabled */ | 103 | u8 enabled; /* plane is enabled */ |
104 | u8 tiled; /* X-tiled */ | 104 | u32 tiled; /* tiling mode: linear, X-tiled, Y tiled, etc */ |
105 | u8 bpp; /* bits per pixel */ | 105 | u8 bpp; /* bits per pixel */ |
106 | u32 hw_format; /* format field in the PRI_CTL register */ | 106 | u32 hw_format; /* format field in the PRI_CTL register */ |
107 | u32 drm_format; /* format in DRM definition */ | 107 | u32 drm_format; /* format in DRM definition */ |
diff --git a/drivers/gpu/drm/i915/gvt/handlers.c b/drivers/gpu/drm/i915/gvt/handlers.c index 7a58ca555197..72afa518edd9 100644 --- a/drivers/gpu/drm/i915/gvt/handlers.c +++ b/drivers/gpu/drm/i915/gvt/handlers.c | |||
@@ -1296,6 +1296,19 @@ static int power_well_ctl_mmio_write(struct intel_vgpu *vgpu, | |||
1296 | return 0; | 1296 | return 0; |
1297 | } | 1297 | } |
1298 | 1298 | ||
1299 | static int gen9_dbuf_ctl_mmio_write(struct intel_vgpu *vgpu, | ||
1300 | unsigned int offset, void *p_data, unsigned int bytes) | ||
1301 | { | ||
1302 | write_vreg(vgpu, offset, p_data, bytes); | ||
1303 | |||
1304 | if (vgpu_vreg(vgpu, offset) & DBUF_POWER_REQUEST) | ||
1305 | vgpu_vreg(vgpu, offset) |= DBUF_POWER_STATE; | ||
1306 | else | ||
1307 | vgpu_vreg(vgpu, offset) &= ~DBUF_POWER_STATE; | ||
1308 | |||
1309 | return 0; | ||
1310 | } | ||
1311 | |||
1299 | static int fpga_dbg_mmio_write(struct intel_vgpu *vgpu, | 1312 | static int fpga_dbg_mmio_write(struct intel_vgpu *vgpu, |
1300 | unsigned int offset, void *p_data, unsigned int bytes) | 1313 | unsigned int offset, void *p_data, unsigned int bytes) |
1301 | { | 1314 | { |
@@ -1525,9 +1538,15 @@ static int bxt_phy_ctl_family_write(struct intel_vgpu *vgpu, | |||
1525 | u32 v = *(u32 *)p_data; | 1538 | u32 v = *(u32 *)p_data; |
1526 | u32 data = v & COMMON_RESET_DIS ? BXT_PHY_LANE_ENABLED : 0; | 1539 | u32 data = v & COMMON_RESET_DIS ? BXT_PHY_LANE_ENABLED : 0; |
1527 | 1540 | ||
1528 | vgpu_vreg(vgpu, _BXT_PHY_CTL_DDI_A) = data; | 1541 | switch (offset) { |
1529 | vgpu_vreg(vgpu, _BXT_PHY_CTL_DDI_B) = data; | 1542 | case _PHY_CTL_FAMILY_EDP: |
1530 | vgpu_vreg(vgpu, _BXT_PHY_CTL_DDI_C) = data; | 1543 | vgpu_vreg(vgpu, _BXT_PHY_CTL_DDI_A) = data; |
1544 | break; | ||
1545 | case _PHY_CTL_FAMILY_DDI: | ||
1546 | vgpu_vreg(vgpu, _BXT_PHY_CTL_DDI_B) = data; | ||
1547 | vgpu_vreg(vgpu, _BXT_PHY_CTL_DDI_C) = data; | ||
1548 | break; | ||
1549 | } | ||
1531 | 1550 | ||
1532 | vgpu_vreg(vgpu, offset) = v; | 1551 | vgpu_vreg(vgpu, offset) = v; |
1533 | 1552 | ||
@@ -2812,6 +2831,8 @@ static int init_skl_mmio_info(struct intel_gvt *gvt) | |||
2812 | MMIO_DH(HSW_PWR_WELL_CTL_DRIVER(SKL_DISP_PW_MISC_IO), D_SKL_PLUS, NULL, | 2831 | MMIO_DH(HSW_PWR_WELL_CTL_DRIVER(SKL_DISP_PW_MISC_IO), D_SKL_PLUS, NULL, |
2813 | skl_power_well_ctl_write); | 2832 | skl_power_well_ctl_write); |
2814 | 2833 | ||
2834 | MMIO_DH(DBUF_CTL, D_SKL_PLUS, NULL, gen9_dbuf_ctl_mmio_write); | ||
2835 | |||
2815 | MMIO_D(_MMIO(0xa210), D_SKL_PLUS); | 2836 | MMIO_D(_MMIO(0xa210), D_SKL_PLUS); |
2816 | MMIO_D(GEN9_MEDIA_PG_IDLE_HYSTERESIS, D_SKL_PLUS); | 2837 | MMIO_D(GEN9_MEDIA_PG_IDLE_HYSTERESIS, D_SKL_PLUS); |
2817 | MMIO_D(GEN9_RENDER_PG_IDLE_HYSTERESIS, D_SKL_PLUS); | 2838 | MMIO_D(GEN9_RENDER_PG_IDLE_HYSTERESIS, D_SKL_PLUS); |
@@ -2987,8 +3008,6 @@ static int init_skl_mmio_info(struct intel_gvt *gvt) | |||
2987 | NULL, gen9_trtte_write); | 3008 | NULL, gen9_trtte_write); |
2988 | MMIO_DH(_MMIO(0x4dfc), D_SKL_PLUS, NULL, gen9_trtt_chicken_write); | 3009 | MMIO_DH(_MMIO(0x4dfc), D_SKL_PLUS, NULL, gen9_trtt_chicken_write); |
2989 | 3010 | ||
2990 | MMIO_D(_MMIO(0x45008), D_SKL_PLUS); | ||
2991 | |||
2992 | MMIO_D(_MMIO(0x46430), D_SKL_PLUS); | 3011 | MMIO_D(_MMIO(0x46430), D_SKL_PLUS); |
2993 | 3012 | ||
2994 | MMIO_D(_MMIO(0x46520), D_SKL_PLUS); | 3013 | MMIO_D(_MMIO(0x46520), D_SKL_PLUS); |
@@ -3025,7 +3044,9 @@ static int init_skl_mmio_info(struct intel_gvt *gvt) | |||
3025 | MMIO_D(_MMIO(0x44500), D_SKL_PLUS); | 3044 | MMIO_D(_MMIO(0x44500), D_SKL_PLUS); |
3026 | MMIO_DFH(GEN9_CSFE_CHICKEN1_RCS, D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL); | 3045 | MMIO_DFH(GEN9_CSFE_CHICKEN1_RCS, D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL); |
3027 | MMIO_DFH(GEN8_HDC_CHICKEN1, D_SKL_PLUS, F_MODE_MASK | F_CMD_ACCESS, | 3046 | MMIO_DFH(GEN8_HDC_CHICKEN1, D_SKL_PLUS, F_MODE_MASK | F_CMD_ACCESS, |
3028 | NULL, NULL); | 3047 | NULL, NULL); |
3048 | MMIO_DFH(GEN9_WM_CHICKEN3, D_SKL_PLUS, F_MODE_MASK | F_CMD_ACCESS, | ||
3049 | NULL, NULL); | ||
3029 | 3050 | ||
3030 | MMIO_D(_MMIO(0x4ab8), D_KBL); | 3051 | MMIO_D(_MMIO(0x4ab8), D_KBL); |
3031 | MMIO_D(_MMIO(0x2248), D_KBL | D_SKL); | 3052 | MMIO_D(_MMIO(0x2248), D_KBL | D_SKL); |
diff --git a/drivers/gpu/drm/i915/gvt/mmio_context.c b/drivers/gpu/drm/i915/gvt/mmio_context.c index 42e1e6bdcc2c..e872f4847fbe 100644 --- a/drivers/gpu/drm/i915/gvt/mmio_context.c +++ b/drivers/gpu/drm/i915/gvt/mmio_context.c | |||
@@ -562,11 +562,9 @@ void intel_gvt_switch_mmio(struct intel_vgpu *pre, | |||
562 | * performace for batch mmio read/write, so we need | 562 | * performace for batch mmio read/write, so we need |
563 | * handle forcewake mannually. | 563 | * handle forcewake mannually. |
564 | */ | 564 | */ |
565 | intel_runtime_pm_get(dev_priv); | ||
566 | intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL); | 565 | intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL); |
567 | switch_mmio(pre, next, ring_id); | 566 | switch_mmio(pre, next, ring_id); |
568 | intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL); | 567 | intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL); |
569 | intel_runtime_pm_put(dev_priv); | ||
570 | } | 568 | } |
571 | 569 | ||
572 | /** | 570 | /** |
diff --git a/drivers/gpu/drm/i915/gvt/sched_policy.c b/drivers/gpu/drm/i915/gvt/sched_policy.c index 09d7bb72b4ff..c32e7d5e8629 100644 --- a/drivers/gpu/drm/i915/gvt/sched_policy.c +++ b/drivers/gpu/drm/i915/gvt/sched_policy.c | |||
@@ -47,11 +47,15 @@ static bool vgpu_has_pending_workload(struct intel_vgpu *vgpu) | |||
47 | return false; | 47 | return false; |
48 | } | 48 | } |
49 | 49 | ||
50 | /* We give 2 seconds higher prio for vGPU during start */ | ||
51 | #define GVT_SCHED_VGPU_PRI_TIME 2 | ||
52 | |||
50 | struct vgpu_sched_data { | 53 | struct vgpu_sched_data { |
51 | struct list_head lru_list; | 54 | struct list_head lru_list; |
52 | struct intel_vgpu *vgpu; | 55 | struct intel_vgpu *vgpu; |
53 | bool active; | 56 | bool active; |
54 | 57 | bool pri_sched; | |
58 | ktime_t pri_time; | ||
55 | ktime_t sched_in_time; | 59 | ktime_t sched_in_time; |
56 | ktime_t sched_time; | 60 | ktime_t sched_time; |
57 | ktime_t left_ts; | 61 | ktime_t left_ts; |
@@ -183,6 +187,14 @@ static struct intel_vgpu *find_busy_vgpu(struct gvt_sched_data *sched_data) | |||
183 | if (!vgpu_has_pending_workload(vgpu_data->vgpu)) | 187 | if (!vgpu_has_pending_workload(vgpu_data->vgpu)) |
184 | continue; | 188 | continue; |
185 | 189 | ||
190 | if (vgpu_data->pri_sched) { | ||
191 | if (ktime_before(ktime_get(), vgpu_data->pri_time)) { | ||
192 | vgpu = vgpu_data->vgpu; | ||
193 | break; | ||
194 | } else | ||
195 | vgpu_data->pri_sched = false; | ||
196 | } | ||
197 | |||
186 | /* Return the vGPU only if it has time slice left */ | 198 | /* Return the vGPU only if it has time slice left */ |
187 | if (vgpu_data->left_ts > 0) { | 199 | if (vgpu_data->left_ts > 0) { |
188 | vgpu = vgpu_data->vgpu; | 200 | vgpu = vgpu_data->vgpu; |
@@ -202,6 +214,7 @@ static void tbs_sched_func(struct gvt_sched_data *sched_data) | |||
202 | struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler; | 214 | struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler; |
203 | struct vgpu_sched_data *vgpu_data; | 215 | struct vgpu_sched_data *vgpu_data; |
204 | struct intel_vgpu *vgpu = NULL; | 216 | struct intel_vgpu *vgpu = NULL; |
217 | |||
205 | /* no active vgpu or has already had a target */ | 218 | /* no active vgpu or has already had a target */ |
206 | if (list_empty(&sched_data->lru_runq_head) || scheduler->next_vgpu) | 219 | if (list_empty(&sched_data->lru_runq_head) || scheduler->next_vgpu) |
207 | goto out; | 220 | goto out; |
@@ -209,12 +222,13 @@ static void tbs_sched_func(struct gvt_sched_data *sched_data) | |||
209 | vgpu = find_busy_vgpu(sched_data); | 222 | vgpu = find_busy_vgpu(sched_data); |
210 | if (vgpu) { | 223 | if (vgpu) { |
211 | scheduler->next_vgpu = vgpu; | 224 | scheduler->next_vgpu = vgpu; |
212 | |||
213 | /* Move the last used vGPU to the tail of lru_list */ | ||
214 | vgpu_data = vgpu->sched_data; | 225 | vgpu_data = vgpu->sched_data; |
215 | list_del_init(&vgpu_data->lru_list); | 226 | if (!vgpu_data->pri_sched) { |
216 | list_add_tail(&vgpu_data->lru_list, | 227 | /* Move the last used vGPU to the tail of lru_list */ |
217 | &sched_data->lru_runq_head); | 228 | list_del_init(&vgpu_data->lru_list); |
229 | list_add_tail(&vgpu_data->lru_list, | ||
230 | &sched_data->lru_runq_head); | ||
231 | } | ||
218 | } else { | 232 | } else { |
219 | scheduler->next_vgpu = gvt->idle_vgpu; | 233 | scheduler->next_vgpu = gvt->idle_vgpu; |
220 | } | 234 | } |
@@ -328,11 +342,17 @@ static void tbs_sched_start_schedule(struct intel_vgpu *vgpu) | |||
328 | { | 342 | { |
329 | struct gvt_sched_data *sched_data = vgpu->gvt->scheduler.sched_data; | 343 | struct gvt_sched_data *sched_data = vgpu->gvt->scheduler.sched_data; |
330 | struct vgpu_sched_data *vgpu_data = vgpu->sched_data; | 344 | struct vgpu_sched_data *vgpu_data = vgpu->sched_data; |
345 | ktime_t now; | ||
331 | 346 | ||
332 | if (!list_empty(&vgpu_data->lru_list)) | 347 | if (!list_empty(&vgpu_data->lru_list)) |
333 | return; | 348 | return; |
334 | 349 | ||
335 | list_add_tail(&vgpu_data->lru_list, &sched_data->lru_runq_head); | 350 | now = ktime_get(); |
351 | vgpu_data->pri_time = ktime_add(now, | ||
352 | ktime_set(GVT_SCHED_VGPU_PRI_TIME, 0)); | ||
353 | vgpu_data->pri_sched = true; | ||
354 | |||
355 | list_add(&vgpu_data->lru_list, &sched_data->lru_runq_head); | ||
336 | 356 | ||
337 | if (!hrtimer_active(&sched_data->timer)) | 357 | if (!hrtimer_active(&sched_data->timer)) |
338 | hrtimer_start(&sched_data->timer, ktime_add_ns(ktime_get(), | 358 | hrtimer_start(&sched_data->timer, ktime_add_ns(ktime_get(), |
@@ -426,6 +446,7 @@ void intel_vgpu_stop_schedule(struct intel_vgpu *vgpu) | |||
426 | &vgpu->gvt->scheduler; | 446 | &vgpu->gvt->scheduler; |
427 | int ring_id; | 447 | int ring_id; |
428 | struct vgpu_sched_data *vgpu_data = vgpu->sched_data; | 448 | struct vgpu_sched_data *vgpu_data = vgpu->sched_data; |
449 | struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv; | ||
429 | 450 | ||
430 | if (!vgpu_data->active) | 451 | if (!vgpu_data->active) |
431 | return; | 452 | return; |
@@ -444,6 +465,7 @@ void intel_vgpu_stop_schedule(struct intel_vgpu *vgpu) | |||
444 | scheduler->current_vgpu = NULL; | 465 | scheduler->current_vgpu = NULL; |
445 | } | 466 | } |
446 | 467 | ||
468 | intel_runtime_pm_get(dev_priv); | ||
447 | spin_lock_bh(&scheduler->mmio_context_lock); | 469 | spin_lock_bh(&scheduler->mmio_context_lock); |
448 | for (ring_id = 0; ring_id < I915_NUM_ENGINES; ring_id++) { | 470 | for (ring_id = 0; ring_id < I915_NUM_ENGINES; ring_id++) { |
449 | if (scheduler->engine_owner[ring_id] == vgpu) { | 471 | if (scheduler->engine_owner[ring_id] == vgpu) { |
@@ -452,5 +474,6 @@ void intel_vgpu_stop_schedule(struct intel_vgpu *vgpu) | |||
452 | } | 474 | } |
453 | } | 475 | } |
454 | spin_unlock_bh(&scheduler->mmio_context_lock); | 476 | spin_unlock_bh(&scheduler->mmio_context_lock); |
477 | intel_runtime_pm_put(dev_priv); | ||
455 | mutex_unlock(&vgpu->gvt->sched_lock); | 478 | mutex_unlock(&vgpu->gvt->sched_lock); |
456 | } | 479 | } |