aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWeinan Li <weinan.z.li@intel.com>2017-12-12 21:47:02 -0500
committerZhenyu Wang <zhenyuw@linux.intel.com>2017-12-18 03:30:24 -0500
commitb05b33970e333ecf8f7985d5acad759972919470 (patch)
treef55c035008f6589d70958d99d286aa2c0764705a
parentf402f2d6c3c5a5192869ffbdc079b782ef32dd01 (diff)
drm/i915/gvt: load host render mocs once in mocs switch
Load host render mocs registers once for delta update of mocs switch, it reduces mmio read times obviously, then brings performance improvement during multi-vms switch. Signed-off-by: Weinan Li <weinan.z.li@intel.com> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
-rw-r--r--drivers/gpu/drm/i915/gvt/mmio_context.c51
1 files changed, 42 insertions, 9 deletions
diff --git a/drivers/gpu/drm/i915/gvt/mmio_context.c b/drivers/gpu/drm/i915/gvt/mmio_context.c
index 06ea3d24e8d0..94ac93996969 100644
--- a/drivers/gpu/drm/i915/gvt/mmio_context.c
+++ b/drivers/gpu/drm/i915/gvt/mmio_context.c
@@ -149,8 +149,41 @@ static struct engine_mmio gen9_engine_mmio_list[] __cacheline_aligned = {
149 { /* Terminated */ } 149 { /* Terminated */ }
150}; 150};
151 151
152static u32 gen9_render_mocs[I915_NUM_ENGINES][64]; 152static struct {
153static u32 gen9_render_mocs_L3[32]; 153 bool initialized;
154 u32 control_table[I915_NUM_ENGINES][64];
155 u32 l3cc_table[32];
156} gen9_render_mocs;
157
158static void load_render_mocs(struct drm_i915_private *dev_priv)
159{
160 i915_reg_t offset;
161 u32 regs[] = {
162 [RCS] = 0xc800,
163 [VCS] = 0xc900,
164 [VCS2] = 0xca00,
165 [BCS] = 0xcc00,
166 [VECS] = 0xcb00,
167 };
168 int ring_id, i;
169
170 for (ring_id = 0; ring_id < I915_NUM_ENGINES; ring_id++) {
171 offset.reg = regs[ring_id];
172 for (i = 0; i < 64; i++) {
173 gen9_render_mocs.control_table[ring_id][i] =
174 I915_READ_FW(offset);
175 offset.reg += 4;
176 }
177 }
178
179 offset.reg = 0xb020;
180 for (i = 0; i < 32; i++) {
181 gen9_render_mocs.l3cc_table[i] =
182 I915_READ_FW(offset);
183 offset.reg += 4;
184 }
185 gen9_render_mocs.initialized = true;
186}
154 187
155static void handle_tlb_pending_event(struct intel_vgpu *vgpu, int ring_id) 188static void handle_tlb_pending_event(struct intel_vgpu *vgpu, int ring_id)
156{ 189{
@@ -218,18 +251,19 @@ static void switch_mocs(struct intel_vgpu *pre, struct intel_vgpu *next,
218 if (WARN_ON(ring_id >= ARRAY_SIZE(regs))) 251 if (WARN_ON(ring_id >= ARRAY_SIZE(regs)))
219 return; 252 return;
220 253
221 offset.reg = regs[ring_id]; 254 if (!pre && !gen9_render_mocs.initialized)
255 load_render_mocs(dev_priv);
222 256
257 offset.reg = regs[ring_id];
223 for (i = 0; i < 64; i++) { 258 for (i = 0; i < 64; i++) {
224 if (pre) 259 if (pre)
225 old_v = vgpu_vreg(pre, offset); 260 old_v = vgpu_vreg(pre, offset);
226 else 261 else
227 old_v = gen9_render_mocs[ring_id][i] 262 old_v = gen9_render_mocs.control_table[ring_id][i];
228 = I915_READ_FW(offset);
229 if (next) 263 if (next)
230 new_v = vgpu_vreg(next, offset); 264 new_v = vgpu_vreg(next, offset);
231 else 265 else
232 new_v = gen9_render_mocs[ring_id][i]; 266 new_v = gen9_render_mocs.control_table[ring_id][i];
233 267
234 if (old_v != new_v) 268 if (old_v != new_v)
235 I915_WRITE_FW(offset, new_v); 269 I915_WRITE_FW(offset, new_v);
@@ -243,12 +277,11 @@ static void switch_mocs(struct intel_vgpu *pre, struct intel_vgpu *next,
243 if (pre) 277 if (pre)
244 old_v = vgpu_vreg(pre, l3_offset); 278 old_v = vgpu_vreg(pre, l3_offset);
245 else 279 else
246 old_v = gen9_render_mocs_L3[i] 280 old_v = gen9_render_mocs.l3cc_table[i];
247 = I915_READ_FW(offset);
248 if (next) 281 if (next)
249 new_v = vgpu_vreg(next, l3_offset); 282 new_v = vgpu_vreg(next, l3_offset);
250 else 283 else
251 new_v = gen9_render_mocs_L3[i]; 284 new_v = gen9_render_mocs.l3cc_table[i];
252 285
253 if (old_v != new_v) 286 if (old_v != new_v)
254 I915_WRITE_FW(l3_offset, new_v); 287 I915_WRITE_FW(l3_offset, new_v);