aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJani Nikula <jani.nikula@intel.com>2017-04-26 05:19:55 -0400
committerJani Nikula <jani.nikula@intel.com>2017-04-26 05:20:02 -0400
commitf8a77153b0cb6eef34f16670df678dae49ce3776 (patch)
treef5aaeab876a2077bc7999003e3de05a775b8e8c5
parentab6eb211b07a42a6346e284056422fd9a8576a99 (diff)
parentc821ee6d2bb4cfc9991bf285f53103cde9d3593a (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.c8
-rw-r--r--drivers/gpu/drm/i915/gvt/display.c29
-rw-r--r--drivers/gpu/drm/i915/gvt/execlist.c8
-rw-r--r--drivers/gpu/drm/i915/gvt/gtt.c5
-rw-r--r--drivers/gpu/drm/i915/gvt/render.c10
-rw-r--r--drivers/gpu/drm/i915/gvt/sched_policy.c17
-rw-r--r--drivers/gpu/drm/i915/gvt/scheduler.c5
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
57static int ring_id_to_context_switch_event(int ring_id) 57static 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)
2294void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu) 2294void 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
47static struct render_mmio gen8_render_mmio_list[] = { 47static 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
78static struct render_mmio gen9_render_mmio_list[] = { 78static 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 }
232out: 222out:
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
240void intel_gvt_schedule(struct intel_gvt *gvt) 227void 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