diff options
| author | Jani Nikula <jani.nikula@intel.com> | 2017-04-26 05:19:55 -0400 |
|---|---|---|
| committer | Jani Nikula <jani.nikula@intel.com> | 2017-04-26 05:20:02 -0400 |
| commit | f8a77153b0cb6eef34f16670df678dae49ce3776 (patch) | |
| tree | f5aaeab876a2077bc7999003e3de05a775b8e8c5 | |
| parent | ab6eb211b07a42a6346e284056422fd9a8576a99 (diff) | |
| parent | c821ee6d2bb4cfc9991bf285f53103cde9d3593a (diff) | |
Merge tag 'gvt-next-fixes-2017-04-20' of https://github.com/01org/gvt-linux into drm-intel-next-fixes
gvt-next-fixes-2017-04-20
- some code optimization from Changbin
- debug message cleanup after QoS merge
- misc fixes for display mmio init, reset vgpu warning, etc.
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/cmd_parser.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/display.c | 29 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/execlist.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/gtt.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/render.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/sched_policy.c | 17 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/scheduler.c | 5 |
7 files changed, 42 insertions, 40 deletions
diff --git a/drivers/gpu/drm/i915/gvt/cmd_parser.c b/drivers/gpu/drm/i915/gvt/cmd_parser.c index 94f2e701e4d4..41b2c3aaa04a 100644 --- a/drivers/gpu/drm/i915/gvt/cmd_parser.c +++ b/drivers/gpu/drm/i915/gvt/cmd_parser.c | |||
| @@ -616,9 +616,6 @@ static inline u32 get_opcode(u32 cmd, int ring_id) | |||
| 616 | { | 616 | { |
| 617 | struct decode_info *d_info; | 617 | struct decode_info *d_info; |
| 618 | 618 | ||
| 619 | if (ring_id >= I915_NUM_ENGINES) | ||
| 620 | return INVALID_OP; | ||
| 621 | |||
| 622 | d_info = ring_decode_info[ring_id][CMD_TYPE(cmd)]; | 619 | d_info = ring_decode_info[ring_id][CMD_TYPE(cmd)]; |
| 623 | if (d_info == NULL) | 620 | if (d_info == NULL) |
| 624 | return INVALID_OP; | 621 | return INVALID_OP; |
| @@ -661,9 +658,6 @@ static inline void print_opcode(u32 cmd, int ring_id) | |||
| 661 | struct decode_info *d_info; | 658 | struct decode_info *d_info; |
| 662 | int i; | 659 | int i; |
| 663 | 660 | ||
| 664 | if (ring_id >= I915_NUM_ENGINES) | ||
| 665 | return; | ||
| 666 | |||
| 667 | d_info = ring_decode_info[ring_id][CMD_TYPE(cmd)]; | 661 | d_info = ring_decode_info[ring_id][CMD_TYPE(cmd)]; |
| 668 | if (d_info == NULL) | 662 | if (d_info == NULL) |
| 669 | return; | 663 | return; |
| @@ -2483,7 +2477,7 @@ static int cmd_parser_exec(struct parser_exec_state *s) | |||
| 2483 | 2477 | ||
| 2484 | t1 = get_cycles(); | 2478 | t1 = get_cycles(); |
| 2485 | 2479 | ||
| 2486 | memcpy(&s_before_advance_custom, s, sizeof(struct parser_exec_state)); | 2480 | s_before_advance_custom = *s; |
| 2487 | 2481 | ||
| 2488 | if (info->handler) { | 2482 | if (info->handler) { |
| 2489 | ret = info->handler(s); | 2483 | ret = info->handler(s); |
diff --git a/drivers/gpu/drm/i915/gvt/display.c b/drivers/gpu/drm/i915/gvt/display.c index 4cf2b29fbaa1..e0261fcc5b50 100644 --- a/drivers/gpu/drm/i915/gvt/display.c +++ b/drivers/gpu/drm/i915/gvt/display.c | |||
| @@ -189,17 +189,44 @@ static void emulate_monitor_status_change(struct intel_vgpu *vgpu) | |||
| 189 | } | 189 | } |
| 190 | 190 | ||
| 191 | if (intel_vgpu_has_monitor_on_port(vgpu, PORT_B)) { | 191 | if (intel_vgpu_has_monitor_on_port(vgpu, PORT_B)) { |
| 192 | vgpu_vreg(vgpu, SDEISR) |= SDE_PORTB_HOTPLUG_CPT; | ||
| 193 | vgpu_vreg(vgpu, SFUSE_STRAP) |= SFUSE_STRAP_DDIB_DETECTED; | 192 | vgpu_vreg(vgpu, SFUSE_STRAP) |= SFUSE_STRAP_DDIB_DETECTED; |
| 193 | vgpu_vreg(vgpu, TRANS_DDI_FUNC_CTL(TRANSCODER_A)) &= | ||
| 194 | ~(TRANS_DDI_BPC_MASK | TRANS_DDI_MODE_SELECT_MASK | | ||
| 195 | TRANS_DDI_PORT_MASK); | ||
| 196 | vgpu_vreg(vgpu, TRANS_DDI_FUNC_CTL(TRANSCODER_A)) |= | ||
| 197 | (TRANS_DDI_BPC_8 | TRANS_DDI_MODE_SELECT_DP_SST | | ||
| 198 | (PORT_B << TRANS_DDI_PORT_SHIFT) | | ||
| 199 | TRANS_DDI_FUNC_ENABLE); | ||
| 200 | vgpu_vreg(vgpu, DDI_BUF_CTL(PORT_B)) |= DDI_BUF_CTL_ENABLE; | ||
| 201 | vgpu_vreg(vgpu, DDI_BUF_CTL(PORT_B)) &= ~DDI_BUF_IS_IDLE; | ||
| 202 | vgpu_vreg(vgpu, SDEISR) |= SDE_PORTB_HOTPLUG_CPT; | ||
| 194 | } | 203 | } |
| 195 | 204 | ||
| 196 | if (intel_vgpu_has_monitor_on_port(vgpu, PORT_C)) { | 205 | if (intel_vgpu_has_monitor_on_port(vgpu, PORT_C)) { |
| 197 | vgpu_vreg(vgpu, SDEISR) |= SDE_PORTC_HOTPLUG_CPT; | 206 | vgpu_vreg(vgpu, SDEISR) |= SDE_PORTC_HOTPLUG_CPT; |
| 207 | vgpu_vreg(vgpu, TRANS_DDI_FUNC_CTL(TRANSCODER_A)) &= | ||
| 208 | ~(TRANS_DDI_BPC_MASK | TRANS_DDI_MODE_SELECT_MASK | | ||
| 209 | TRANS_DDI_PORT_MASK); | ||
| 210 | vgpu_vreg(vgpu, TRANS_DDI_FUNC_CTL(TRANSCODER_A)) |= | ||
| 211 | (TRANS_DDI_BPC_8 | TRANS_DDI_MODE_SELECT_DP_SST | | ||
| 212 | (PORT_C << TRANS_DDI_PORT_SHIFT) | | ||
| 213 | TRANS_DDI_FUNC_ENABLE); | ||
| 214 | vgpu_vreg(vgpu, DDI_BUF_CTL(PORT_C)) |= DDI_BUF_CTL_ENABLE; | ||
| 215 | vgpu_vreg(vgpu, DDI_BUF_CTL(PORT_C)) &= ~DDI_BUF_IS_IDLE; | ||
| 198 | vgpu_vreg(vgpu, SFUSE_STRAP) |= SFUSE_STRAP_DDIC_DETECTED; | 216 | vgpu_vreg(vgpu, SFUSE_STRAP) |= SFUSE_STRAP_DDIC_DETECTED; |
| 199 | } | 217 | } |
| 200 | 218 | ||
| 201 | if (intel_vgpu_has_monitor_on_port(vgpu, PORT_D)) { | 219 | if (intel_vgpu_has_monitor_on_port(vgpu, PORT_D)) { |
| 202 | vgpu_vreg(vgpu, SDEISR) |= SDE_PORTD_HOTPLUG_CPT; | 220 | vgpu_vreg(vgpu, SDEISR) |= SDE_PORTD_HOTPLUG_CPT; |
| 221 | vgpu_vreg(vgpu, TRANS_DDI_FUNC_CTL(TRANSCODER_A)) &= | ||
| 222 | ~(TRANS_DDI_BPC_MASK | TRANS_DDI_MODE_SELECT_MASK | | ||
| 223 | TRANS_DDI_PORT_MASK); | ||
| 224 | vgpu_vreg(vgpu, TRANS_DDI_FUNC_CTL(TRANSCODER_A)) |= | ||
| 225 | (TRANS_DDI_BPC_8 | TRANS_DDI_MODE_SELECT_DP_SST | | ||
| 226 | (PORT_D << TRANS_DDI_PORT_SHIFT) | | ||
| 227 | TRANS_DDI_FUNC_ENABLE); | ||
| 228 | vgpu_vreg(vgpu, DDI_BUF_CTL(PORT_D)) |= DDI_BUF_CTL_ENABLE; | ||
| 229 | vgpu_vreg(vgpu, DDI_BUF_CTL(PORT_D)) &= ~DDI_BUF_IS_IDLE; | ||
| 203 | vgpu_vreg(vgpu, SFUSE_STRAP) |= SFUSE_STRAP_DDID_DETECTED; | 230 | vgpu_vreg(vgpu, SFUSE_STRAP) |= SFUSE_STRAP_DDID_DETECTED; |
| 204 | } | 231 | } |
| 205 | 232 | ||
diff --git a/drivers/gpu/drm/i915/gvt/execlist.c b/drivers/gpu/drm/i915/gvt/execlist.c index ce4276a7cf9c..dc9aef3e92d4 100644 --- a/drivers/gpu/drm/i915/gvt/execlist.c +++ b/drivers/gpu/drm/i915/gvt/execlist.c | |||
| @@ -56,8 +56,8 @@ static int context_switch_events[] = { | |||
| 56 | 56 | ||
| 57 | static int ring_id_to_context_switch_event(int ring_id) | 57 | static int ring_id_to_context_switch_event(int ring_id) |
| 58 | { | 58 | { |
| 59 | if (WARN_ON(ring_id < RCS && ring_id > | 59 | if (WARN_ON(ring_id < RCS || |
| 60 | ARRAY_SIZE(context_switch_events))) | 60 | ring_id >= ARRAY_SIZE(context_switch_events))) |
| 61 | return -EINVAL; | 61 | return -EINVAL; |
| 62 | 62 | ||
| 63 | return context_switch_events[ring_id]; | 63 | return context_switch_events[ring_id]; |
| @@ -687,9 +687,7 @@ static int submit_context(struct intel_vgpu *vgpu, int ring_id, | |||
| 687 | } | 687 | } |
| 688 | 688 | ||
| 689 | if (emulate_schedule_in) | 689 | if (emulate_schedule_in) |
| 690 | memcpy(&workload->elsp_dwords, | 690 | workload->elsp_dwords = vgpu->execlist[ring_id].elsp_dwords; |
| 691 | &vgpu->execlist[ring_id].elsp_dwords, | ||
| 692 | sizeof(workload->elsp_dwords)); | ||
| 693 | 691 | ||
| 694 | gvt_dbg_el("workload %p ring id %d head %x tail %x start %x ctl %x\n", | 692 | gvt_dbg_el("workload %p ring id %d head %x tail %x start %x ctl %x\n", |
| 695 | workload, ring_id, head, tail, start, ctl); | 693 | workload, ring_id, head, tail, start, ctl); |
diff --git a/drivers/gpu/drm/i915/gvt/gtt.c b/drivers/gpu/drm/i915/gvt/gtt.c index 6da4e444e572..c6f0077f590d 100644 --- a/drivers/gpu/drm/i915/gvt/gtt.c +++ b/drivers/gpu/drm/i915/gvt/gtt.c | |||
| @@ -2294,12 +2294,15 @@ void intel_gvt_clean_gtt(struct intel_gvt *gvt) | |||
| 2294 | void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu) | 2294 | void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu) |
| 2295 | { | 2295 | { |
| 2296 | struct intel_gvt *gvt = vgpu->gvt; | 2296 | struct intel_gvt *gvt = vgpu->gvt; |
| 2297 | struct drm_i915_private *dev_priv = gvt->dev_priv; | ||
| 2297 | struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops; | 2298 | struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops; |
| 2298 | u32 index; | 2299 | u32 index; |
| 2299 | u32 offset; | 2300 | u32 offset; |
| 2300 | u32 num_entries; | 2301 | u32 num_entries; |
| 2301 | struct intel_gvt_gtt_entry e; | 2302 | struct intel_gvt_gtt_entry e; |
| 2302 | 2303 | ||
| 2304 | intel_runtime_pm_get(dev_priv); | ||
| 2305 | |||
| 2303 | memset(&e, 0, sizeof(struct intel_gvt_gtt_entry)); | 2306 | memset(&e, 0, sizeof(struct intel_gvt_gtt_entry)); |
| 2304 | e.type = GTT_TYPE_GGTT_PTE; | 2307 | e.type = GTT_TYPE_GGTT_PTE; |
| 2305 | ops->set_pfn(&e, gvt->gtt.scratch_ggtt_mfn); | 2308 | ops->set_pfn(&e, gvt->gtt.scratch_ggtt_mfn); |
| @@ -2314,6 +2317,8 @@ void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu) | |||
| 2314 | num_entries = vgpu_hidden_sz(vgpu) >> PAGE_SHIFT; | 2317 | num_entries = vgpu_hidden_sz(vgpu) >> PAGE_SHIFT; |
| 2315 | for (offset = 0; offset < num_entries; offset++) | 2318 | for (offset = 0; offset < num_entries; offset++) |
| 2316 | ops->set_entry(NULL, &e, index + offset, false, 0, vgpu); | 2319 | ops->set_entry(NULL, &e, index + offset, false, 0, vgpu); |
| 2320 | |||
| 2321 | intel_runtime_pm_put(dev_priv); | ||
| 2317 | } | 2322 | } |
| 2318 | 2323 | ||
| 2319 | /** | 2324 | /** |
diff --git a/drivers/gpu/drm/i915/gvt/render.c b/drivers/gpu/drm/i915/gvt/render.c index a7b665e9bbad..c6e7972ac21d 100644 --- a/drivers/gpu/drm/i915/gvt/render.c +++ b/drivers/gpu/drm/i915/gvt/render.c | |||
| @@ -44,7 +44,7 @@ struct render_mmio { | |||
| 44 | u32 value; | 44 | u32 value; |
| 45 | }; | 45 | }; |
| 46 | 46 | ||
| 47 | static struct render_mmio gen8_render_mmio_list[] = { | 47 | static struct render_mmio gen8_render_mmio_list[] __cacheline_aligned = { |
| 48 | {RCS, _MMIO(0x229c), 0xffff, false}, | 48 | {RCS, _MMIO(0x229c), 0xffff, false}, |
| 49 | {RCS, _MMIO(0x2248), 0x0, false}, | 49 | {RCS, _MMIO(0x2248), 0x0, false}, |
| 50 | {RCS, _MMIO(0x2098), 0x0, false}, | 50 | {RCS, _MMIO(0x2098), 0x0, false}, |
| @@ -75,7 +75,7 @@ static struct render_mmio gen8_render_mmio_list[] = { | |||
| 75 | {BCS, _MMIO(0x22028), 0x0, false}, | 75 | {BCS, _MMIO(0x22028), 0x0, false}, |
| 76 | }; | 76 | }; |
| 77 | 77 | ||
| 78 | static struct render_mmio gen9_render_mmio_list[] = { | 78 | static struct render_mmio gen9_render_mmio_list[] __cacheline_aligned = { |
| 79 | {RCS, _MMIO(0x229c), 0xffff, false}, | 79 | {RCS, _MMIO(0x229c), 0xffff, false}, |
| 80 | {RCS, _MMIO(0x2248), 0x0, false}, | 80 | {RCS, _MMIO(0x2248), 0x0, false}, |
| 81 | {RCS, _MMIO(0x2098), 0x0, false}, | 81 | {RCS, _MMIO(0x2098), 0x0, false}, |
| @@ -204,9 +204,6 @@ static void load_mocs(struct intel_vgpu *vgpu, int ring_id) | |||
| 204 | if (WARN_ON(ring_id >= ARRAY_SIZE(regs))) | 204 | if (WARN_ON(ring_id >= ARRAY_SIZE(regs))) |
| 205 | return; | 205 | return; |
| 206 | 206 | ||
| 207 | if (!(IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))) | ||
| 208 | return; | ||
| 209 | |||
| 210 | offset.reg = regs[ring_id]; | 207 | offset.reg = regs[ring_id]; |
| 211 | for (i = 0; i < 64; i++) { | 208 | for (i = 0; i < 64; i++) { |
| 212 | gen9_render_mocs[ring_id][i] = I915_READ(offset); | 209 | gen9_render_mocs[ring_id][i] = I915_READ(offset); |
| @@ -242,9 +239,6 @@ static void restore_mocs(struct intel_vgpu *vgpu, int ring_id) | |||
| 242 | if (WARN_ON(ring_id >= ARRAY_SIZE(regs))) | 239 | if (WARN_ON(ring_id >= ARRAY_SIZE(regs))) |
| 243 | return; | 240 | return; |
| 244 | 241 | ||
| 245 | if (!(IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))) | ||
| 246 | return; | ||
| 247 | |||
| 248 | offset.reg = regs[ring_id]; | 242 | offset.reg = regs[ring_id]; |
| 249 | for (i = 0; i < 64; i++) { | 243 | for (i = 0; i < 64; i++) { |
| 250 | vgpu_vreg(vgpu, offset) = I915_READ(offset); | 244 | vgpu_vreg(vgpu, offset) = I915_READ(offset); |
diff --git a/drivers/gpu/drm/i915/gvt/sched_policy.c b/drivers/gpu/drm/i915/gvt/sched_policy.c index f84959170674..79ba4b3440aa 100644 --- a/drivers/gpu/drm/i915/gvt/sched_policy.c +++ b/drivers/gpu/drm/i915/gvt/sched_policy.c | |||
| @@ -133,9 +133,6 @@ static void try_to_schedule_next_vgpu(struct intel_gvt *gvt) | |||
| 133 | if (!scheduler->next_vgpu) | 133 | if (!scheduler->next_vgpu) |
| 134 | return; | 134 | return; |
| 135 | 135 | ||
| 136 | gvt_dbg_sched("try to schedule next vgpu %d\n", | ||
| 137 | scheduler->next_vgpu->id); | ||
| 138 | |||
| 139 | /* | 136 | /* |
| 140 | * after the flag is set, workload dispatch thread will | 137 | * after the flag is set, workload dispatch thread will |
| 141 | * stop dispatching workload for current vgpu | 138 | * stop dispatching workload for current vgpu |
| @@ -144,15 +141,10 @@ static void try_to_schedule_next_vgpu(struct intel_gvt *gvt) | |||
| 144 | 141 | ||
| 145 | /* still have uncompleted workload? */ | 142 | /* still have uncompleted workload? */ |
| 146 | for_each_engine(engine, gvt->dev_priv, i) { | 143 | for_each_engine(engine, gvt->dev_priv, i) { |
| 147 | if (scheduler->current_workload[i]) { | 144 | if (scheduler->current_workload[i]) |
| 148 | gvt_dbg_sched("still have running workload\n"); | ||
| 149 | return; | 145 | return; |
| 150 | } | ||
| 151 | } | 146 | } |
| 152 | 147 | ||
| 153 | gvt_dbg_sched("switch to next vgpu %d\n", | ||
| 154 | scheduler->next_vgpu->id); | ||
| 155 | |||
| 156 | cur_time = ktime_get(); | 148 | cur_time = ktime_get(); |
| 157 | if (scheduler->current_vgpu) { | 149 | if (scheduler->current_vgpu) { |
| 158 | vgpu_data = scheduler->current_vgpu->sched_data; | 150 | vgpu_data = scheduler->current_vgpu->sched_data; |
| @@ -224,17 +216,12 @@ static void tbs_sched_func(struct gvt_sched_data *sched_data) | |||
| 224 | list_del_init(&vgpu_data->lru_list); | 216 | list_del_init(&vgpu_data->lru_list); |
| 225 | list_add_tail(&vgpu_data->lru_list, | 217 | list_add_tail(&vgpu_data->lru_list, |
| 226 | &sched_data->lru_runq_head); | 218 | &sched_data->lru_runq_head); |
| 227 | |||
| 228 | gvt_dbg_sched("pick next vgpu %d\n", vgpu->id); | ||
| 229 | } else { | 219 | } else { |
| 230 | scheduler->next_vgpu = gvt->idle_vgpu; | 220 | scheduler->next_vgpu = gvt->idle_vgpu; |
| 231 | } | 221 | } |
| 232 | out: | 222 | out: |
| 233 | if (scheduler->next_vgpu) { | 223 | if (scheduler->next_vgpu) |
| 234 | gvt_dbg_sched("try to schedule next vgpu %d\n", | ||
| 235 | scheduler->next_vgpu->id); | ||
| 236 | try_to_schedule_next_vgpu(gvt); | 224 | try_to_schedule_next_vgpu(gvt); |
| 237 | } | ||
| 238 | } | 225 | } |
| 239 | 226 | ||
| 240 | void intel_gvt_schedule(struct intel_gvt *gvt) | 227 | void intel_gvt_schedule(struct intel_gvt *gvt) |
diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c b/drivers/gpu/drm/i915/gvt/scheduler.c index a77db2332e68..bada32b33237 100644 --- a/drivers/gpu/drm/i915/gvt/scheduler.c +++ b/drivers/gpu/drm/i915/gvt/scheduler.c | |||
| @@ -279,11 +279,8 @@ static struct intel_vgpu_workload *pick_next_workload( | |||
| 279 | goto out; | 279 | goto out; |
| 280 | } | 280 | } |
| 281 | 281 | ||
| 282 | if (list_empty(workload_q_head(scheduler->current_vgpu, ring_id))) { | 282 | if (list_empty(workload_q_head(scheduler->current_vgpu, ring_id))) |
| 283 | gvt_dbg_sched("ring id %d stop - no available workload\n", | ||
| 284 | ring_id); | ||
| 285 | goto out; | 283 | goto out; |
| 286 | } | ||
| 287 | 284 | ||
| 288 | /* | 285 | /* |
| 289 | * still have current workload, maybe the workload disptacher | 286 | * still have current workload, maybe the workload disptacher |
