mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-18 19:26:54 +07:00
drm/i915: L3 cache remapping is part of context switching
Move the i915_gem_l3_remap function such that it next to the context switching, which is where we perform the L3 remap. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1461833819-3991-8-git-send-email-chris@chris-wilson.co.uk
This commit is contained in:
parent
b2e862d08e
commit
b0ebde395d
@ -4738,37 +4738,6 @@ i915_gem_suspend(struct drm_device *dev)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int i915_gem_l3_remap(struct drm_i915_gem_request *req, int slice)
|
|
||||||
{
|
|
||||||
struct intel_engine_cs *engine = req->engine;
|
|
||||||
struct drm_device *dev = engine->dev;
|
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
||||||
u32 *remap_info = dev_priv->l3_parity.remap_info[slice];
|
|
||||||
int i, ret;
|
|
||||||
|
|
||||||
if (!HAS_L3_DPF(dev) || !remap_info)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
ret = intel_ring_begin(req, GEN7_L3LOG_SIZE / 4 * 3);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Note: We do not worry about the concurrent register cacheline hang
|
|
||||||
* here because no other code should access these registers other than
|
|
||||||
* at initialization time.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < GEN7_L3LOG_SIZE / 4; i++) {
|
|
||||||
intel_ring_emit(engine, MI_LOAD_REGISTER_IMM(1));
|
|
||||||
intel_ring_emit_reg(engine, GEN7_L3LOG(slice, i));
|
|
||||||
intel_ring_emit(engine, remap_info[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
intel_ring_advance(engine);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void i915_gem_init_swizzling(struct drm_device *dev)
|
void i915_gem_init_swizzling(struct drm_device *dev)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
|
@ -601,6 +601,37 @@ mi_set_context(struct drm_i915_gem_request *req, u32 hw_flags)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int i915_gem_l3_remap(struct drm_i915_gem_request *req, int slice)
|
||||||
|
{
|
||||||
|
struct intel_engine_cs *engine = req->engine;
|
||||||
|
struct drm_device *dev = engine->dev;
|
||||||
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
|
u32 *remap_info = dev_priv->l3_parity.remap_info[slice];
|
||||||
|
int i, ret;
|
||||||
|
|
||||||
|
if (!HAS_L3_DPF(dev) || !remap_info)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ret = intel_ring_begin(req, GEN7_L3LOG_SIZE / 4 * 3);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note: We do not worry about the concurrent register cacheline hang
|
||||||
|
* here because no other code should access these registers other than
|
||||||
|
* at initialization time.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < GEN7_L3LOG_SIZE / 4; i++) {
|
||||||
|
intel_ring_emit(engine, MI_LOAD_REGISTER_IMM(1));
|
||||||
|
intel_ring_emit_reg(engine, GEN7_L3LOG(slice, i));
|
||||||
|
intel_ring_emit(engine, remap_info[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
intel_ring_advance(engine);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool skip_rcs_switch(struct intel_engine_cs *engine,
|
static inline bool skip_rcs_switch(struct intel_engine_cs *engine,
|
||||||
struct intel_context *to)
|
struct intel_context *to)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user