Commit c082afac authored by Chris Wilson's avatar Chris Wilson

drm/i915: Move aliasing_ppgtt underneath its i915_ggtt

The aliasing_ppgtt provides a PIN_USER alias for the global gtt, so move
it under the i915_ggtt to simplify later transformations to enable
intel_context.vm.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190730143209.4549-1-chris@chris-wilson.co.uk
parent a5627721
...@@ -459,8 +459,7 @@ __create_context(struct drm_i915_private *i915) ...@@ -459,8 +459,7 @@ __create_context(struct drm_i915_private *i915)
i915_gem_context_set_recoverable(ctx); i915_gem_context_set_recoverable(ctx);
ctx->ring_size = 4 * PAGE_SIZE; ctx->ring_size = 4 * PAGE_SIZE;
ctx->desc_template = ctx->desc_template = default_desc_template(i915, NULL);
default_desc_template(i915, &i915->mm.aliasing_ppgtt->vm);
for (i = 0; i < ARRAY_SIZE(ctx->hang_timestamp); i++) for (i = 0; i < ARRAY_SIZE(ctx->hang_timestamp); i++)
ctx->hang_timestamp[i] = jiffies - CONTEXT_FAST_HANG_JIFFIES; ctx->hang_timestamp[i] = jiffies - CONTEXT_FAST_HANG_JIFFIES;
...@@ -2258,8 +2257,8 @@ int i915_gem_context_getparam_ioctl(struct drm_device *dev, void *data, ...@@ -2258,8 +2257,8 @@ int i915_gem_context_getparam_ioctl(struct drm_device *dev, void *data,
args->size = 0; args->size = 0;
if (ctx->vm) if (ctx->vm)
args->value = ctx->vm->total; args->value = ctx->vm->total;
else if (to_i915(dev)->mm.aliasing_ppgtt) else if (to_i915(dev)->ggtt.alias)
args->value = to_i915(dev)->mm.aliasing_ppgtt->vm.total; args->value = to_i915(dev)->ggtt.alias->vm.total;
else else
args->value = to_i915(dev)->ggtt.vm.total; args->value = to_i915(dev)->ggtt.vm.total;
break; break;
......
...@@ -1190,7 +1190,7 @@ static int igt_ctx_readonly(void *arg) ...@@ -1190,7 +1190,7 @@ static int igt_ctx_readonly(void *arg)
goto out_unlock; goto out_unlock;
} }
vm = ctx->vm ?: &i915->mm.aliasing_ppgtt->vm; vm = ctx->vm ?: &i915->ggtt.alias->vm;
if (!vm || !vm->has_read_only) { if (!vm || !vm->has_read_only) {
err = 0; err = 0;
goto out_unlock; goto out_unlock;
......
...@@ -1376,30 +1376,41 @@ static void ring_context_destroy(struct kref *ref) ...@@ -1376,30 +1376,41 @@ static void ring_context_destroy(struct kref *ref)
intel_context_free(ce); intel_context_free(ce);
} }
static int __context_pin_ppgtt(struct i915_gem_context *ctx) static struct i915_address_space *vm_alias(struct intel_context *ce)
{
struct i915_address_space *vm;
vm = ce->gem_context->vm;
if (!vm)
vm = &ce->engine->gt->ggtt->alias->vm;
return vm;
}
static int __context_pin_ppgtt(struct intel_context *ce)
{ {
struct i915_address_space *vm; struct i915_address_space *vm;
int err = 0; int err = 0;
vm = ctx->vm ?: &ctx->i915->mm.aliasing_ppgtt->vm; vm = vm_alias(ce);
if (vm) if (vm)
err = gen6_ppgtt_pin(i915_vm_to_ppgtt((vm))); err = gen6_ppgtt_pin(i915_vm_to_ppgtt((vm)));
return err; return err;
} }
static void __context_unpin_ppgtt(struct i915_gem_context *ctx) static void __context_unpin_ppgtt(struct intel_context *ce)
{ {
struct i915_address_space *vm; struct i915_address_space *vm;
vm = ctx->vm ?: &ctx->i915->mm.aliasing_ppgtt->vm; vm = vm_alias(ce);
if (vm) if (vm)
gen6_ppgtt_unpin(i915_vm_to_ppgtt(vm)); gen6_ppgtt_unpin(i915_vm_to_ppgtt(vm));
} }
static void ring_context_unpin(struct intel_context *ce) static void ring_context_unpin(struct intel_context *ce)
{ {
__context_unpin_ppgtt(ce->gem_context); __context_unpin_ppgtt(ce);
} }
static struct i915_vma * static struct i915_vma *
...@@ -1493,7 +1504,7 @@ static int ring_context_pin(struct intel_context *ce) ...@@ -1493,7 +1504,7 @@ static int ring_context_pin(struct intel_context *ce)
if (err) if (err)
return err; return err;
err = __context_pin_ppgtt(ce->gem_context); err = __context_pin_ppgtt(ce);
if (err) if (err)
goto err_active; goto err_active;
...@@ -1685,7 +1696,7 @@ static inline int mi_set_context(struct i915_request *rq, u32 flags) ...@@ -1685,7 +1696,7 @@ static inline int mi_set_context(struct i915_request *rq, u32 flags)
return 0; return 0;
} }
static int remap_l3(struct i915_request *rq, int slice) static int remap_l3_slice(struct i915_request *rq, int slice)
{ {
u32 *cs, *remap_info = rq->i915->l3_parity.remap_info[slice]; u32 *cs, *remap_info = rq->i915->l3_parity.remap_info[slice];
int i; int i;
...@@ -1713,15 +1724,34 @@ static int remap_l3(struct i915_request *rq, int slice) ...@@ -1713,15 +1724,34 @@ static int remap_l3(struct i915_request *rq, int slice)
return 0; return 0;
} }
static int remap_l3(struct i915_request *rq)
{
struct i915_gem_context *ctx = rq->gem_context;
int i, err;
if (!ctx->remap_slice)
return 0;
for (i = 0; i < MAX_L3_SLICES; i++) {
if (!(ctx->remap_slice & BIT(i)))
continue;
err = remap_l3_slice(rq, i);
if (err)
return err;
}
ctx->remap_slice = 0;
return 0;
}
static int switch_context(struct i915_request *rq) static int switch_context(struct i915_request *rq)
{ {
struct intel_engine_cs *engine = rq->engine; struct intel_engine_cs *engine = rq->engine;
struct i915_gem_context *ctx = rq->gem_context; struct i915_address_space *vm = vm_alias(rq->hw_context);
struct i915_address_space *vm =
ctx->vm ?: &rq->i915->mm.aliasing_ppgtt->vm;
unsigned int unwind_mm = 0; unsigned int unwind_mm = 0;
u32 hw_flags = 0; u32 hw_flags = 0;
int ret, i; int ret;
GEM_BUG_ON(HAS_EXECLISTS(rq->i915)); GEM_BUG_ON(HAS_EXECLISTS(rq->i915));
...@@ -1765,7 +1795,7 @@ static int switch_context(struct i915_request *rq) ...@@ -1765,7 +1795,7 @@ static int switch_context(struct i915_request *rq)
* as nothing actually executes using the kernel context; it * as nothing actually executes using the kernel context; it
* is purely used for flushing user contexts. * is purely used for flushing user contexts.
*/ */
if (i915_gem_context_is_kernel(ctx)) if (i915_gem_context_is_kernel(rq->gem_context))
hw_flags = MI_RESTORE_INHIBIT; hw_flags = MI_RESTORE_INHIBIT;
ret = mi_set_context(rq, hw_flags); ret = mi_set_context(rq, hw_flags);
...@@ -1799,18 +1829,9 @@ static int switch_context(struct i915_request *rq) ...@@ -1799,18 +1829,9 @@ static int switch_context(struct i915_request *rq)
goto err_mm; goto err_mm;
} }
if (ctx->remap_slice) { ret = remap_l3(rq);
for (i = 0; i < MAX_L3_SLICES; i++) { if (ret)
if (!(ctx->remap_slice & BIT(i))) goto err_mm;
continue;
ret = remap_l3(rq, i);
if (ret)
goto err_mm;
}
ctx->remap_slice = 0;
}
return 0; return 0;
......
...@@ -784,9 +784,6 @@ struct i915_gem_mm { ...@@ -784,9 +784,6 @@ struct i915_gem_mm {
*/ */
struct vfsmount *gemfs; struct vfsmount *gemfs;
/** PPGTT used for aliasing the PPGTT with the GTT */
struct i915_ppgtt *aliasing_ppgtt;
struct notifier_block oom_notifier; struct notifier_block oom_notifier;
struct notifier_block vmap_notifier; struct notifier_block vmap_notifier;
struct shrinker shrinker; struct shrinker shrinker;
......
...@@ -2446,18 +2446,18 @@ static int aliasing_gtt_bind_vma(struct i915_vma *vma, ...@@ -2446,18 +2446,18 @@ static int aliasing_gtt_bind_vma(struct i915_vma *vma,
pte_flags |= PTE_READ_ONLY; pte_flags |= PTE_READ_ONLY;
if (flags & I915_VMA_LOCAL_BIND) { if (flags & I915_VMA_LOCAL_BIND) {
struct i915_ppgtt *appgtt = i915->mm.aliasing_ppgtt; struct i915_ppgtt *alias = i915_vm_to_ggtt(vma->vm)->alias;
if (!(vma->flags & I915_VMA_LOCAL_BIND)) { if (!(vma->flags & I915_VMA_LOCAL_BIND)) {
ret = appgtt->vm.allocate_va_range(&appgtt->vm, ret = alias->vm.allocate_va_range(&alias->vm,
vma->node.start, vma->node.start,
vma->size); vma->size);
if (ret) if (ret)
return ret; return ret;
} }
appgtt->vm.insert_entries(&appgtt->vm, vma, cache_level, alias->vm.insert_entries(&alias->vm, vma,
pte_flags); cache_level, pte_flags);
} }
if (flags & I915_VMA_GLOBAL_BIND) { if (flags & I915_VMA_GLOBAL_BIND) {
...@@ -2485,7 +2485,8 @@ static void aliasing_gtt_unbind_vma(struct i915_vma *vma) ...@@ -2485,7 +2485,8 @@ static void aliasing_gtt_unbind_vma(struct i915_vma *vma)
} }
if (vma->flags & I915_VMA_LOCAL_BIND) { if (vma->flags & I915_VMA_LOCAL_BIND) {
struct i915_address_space *vm = &i915->mm.aliasing_ppgtt->vm; struct i915_address_space *vm =
&i915_vm_to_ggtt(vma->vm)->alias->vm;
vm->clear_range(vm, vma->node.start, vma->size); vm->clear_range(vm, vma->node.start, vma->size);
} }
...@@ -2542,13 +2543,12 @@ static void i915_gtt_color_adjust(const struct drm_mm_node *node, ...@@ -2542,13 +2543,12 @@ static void i915_gtt_color_adjust(const struct drm_mm_node *node,
*end -= I915_GTT_PAGE_SIZE; *end -= I915_GTT_PAGE_SIZE;
} }
static int init_aliasing_ppgtt(struct drm_i915_private *i915) static int init_aliasing_ppgtt(struct i915_ggtt *ggtt)
{ {
struct i915_ggtt *ggtt = &i915->ggtt;
struct i915_ppgtt *ppgtt; struct i915_ppgtt *ppgtt;
int err; int err;
ppgtt = i915_ppgtt_create(i915); ppgtt = i915_ppgtt_create(ggtt->vm.i915);
if (IS_ERR(ppgtt)) if (IS_ERR(ppgtt))
return PTR_ERR(ppgtt); return PTR_ERR(ppgtt);
...@@ -2567,7 +2567,7 @@ static int init_aliasing_ppgtt(struct drm_i915_private *i915) ...@@ -2567,7 +2567,7 @@ static int init_aliasing_ppgtt(struct drm_i915_private *i915)
if (err) if (err)
goto err_ppgtt; goto err_ppgtt;
i915->mm.aliasing_ppgtt = ppgtt; ggtt->alias = ppgtt;
GEM_BUG_ON(ggtt->vm.vma_ops.bind_vma != ggtt_bind_vma); GEM_BUG_ON(ggtt->vm.vma_ops.bind_vma != ggtt_bind_vma);
ggtt->vm.vma_ops.bind_vma = aliasing_gtt_bind_vma; ggtt->vm.vma_ops.bind_vma = aliasing_gtt_bind_vma;
...@@ -2582,14 +2582,14 @@ static int init_aliasing_ppgtt(struct drm_i915_private *i915) ...@@ -2582,14 +2582,14 @@ static int init_aliasing_ppgtt(struct drm_i915_private *i915)
return err; return err;
} }
static void fini_aliasing_ppgtt(struct drm_i915_private *i915) static void fini_aliasing_ppgtt(struct i915_ggtt *ggtt)
{ {
struct i915_ggtt *ggtt = &i915->ggtt; struct drm_i915_private *i915 = ggtt->vm.i915;
struct i915_ppgtt *ppgtt; struct i915_ppgtt *ppgtt;
mutex_lock(&i915->drm.struct_mutex); mutex_lock(&i915->drm.struct_mutex);
ppgtt = fetch_and_zero(&i915->mm.aliasing_ppgtt); ppgtt = fetch_and_zero(&ggtt->alias);
if (!ppgtt) if (!ppgtt)
goto out; goto out;
...@@ -2706,7 +2706,7 @@ int i915_init_ggtt(struct drm_i915_private *i915) ...@@ -2706,7 +2706,7 @@ int i915_init_ggtt(struct drm_i915_private *i915)
return ret; return ret;
if (INTEL_PPGTT(i915) == INTEL_PPGTT_ALIASING) { if (INTEL_PPGTT(i915) == INTEL_PPGTT_ALIASING) {
ret = init_aliasing_ppgtt(i915); ret = init_aliasing_ppgtt(&i915->ggtt);
if (ret) if (ret)
cleanup_init_ggtt(&i915->ggtt); cleanup_init_ggtt(&i915->ggtt);
} }
...@@ -2755,7 +2755,7 @@ void i915_ggtt_driver_release(struct drm_i915_private *i915) ...@@ -2755,7 +2755,7 @@ void i915_ggtt_driver_release(struct drm_i915_private *i915)
{ {
struct pagevec *pvec; struct pagevec *pvec;
fini_aliasing_ppgtt(i915); fini_aliasing_ppgtt(&i915->ggtt);
ggtt_cleanup_hw(&i915->ggtt); ggtt_cleanup_hw(&i915->ggtt);
...@@ -3588,7 +3588,7 @@ int i915_gem_gtt_reserve(struct i915_address_space *vm, ...@@ -3588,7 +3588,7 @@ int i915_gem_gtt_reserve(struct i915_address_space *vm,
GEM_BUG_ON(!IS_ALIGNED(size, I915_GTT_PAGE_SIZE)); GEM_BUG_ON(!IS_ALIGNED(size, I915_GTT_PAGE_SIZE));
GEM_BUG_ON(!IS_ALIGNED(offset, I915_GTT_MIN_ALIGNMENT)); GEM_BUG_ON(!IS_ALIGNED(offset, I915_GTT_MIN_ALIGNMENT));
GEM_BUG_ON(range_overflows(offset, size, vm->total)); GEM_BUG_ON(range_overflows(offset, size, vm->total));
GEM_BUG_ON(vm == &vm->i915->mm.aliasing_ppgtt->vm); GEM_BUG_ON(vm == &vm->i915->ggtt.alias->vm);
GEM_BUG_ON(drm_mm_node_allocated(node)); GEM_BUG_ON(drm_mm_node_allocated(node));
node->size = size; node->size = size;
...@@ -3685,7 +3685,7 @@ int i915_gem_gtt_insert(struct i915_address_space *vm, ...@@ -3685,7 +3685,7 @@ int i915_gem_gtt_insert(struct i915_address_space *vm,
GEM_BUG_ON(start >= end); GEM_BUG_ON(start >= end);
GEM_BUG_ON(start > 0 && !IS_ALIGNED(start, I915_GTT_PAGE_SIZE)); GEM_BUG_ON(start > 0 && !IS_ALIGNED(start, I915_GTT_PAGE_SIZE));
GEM_BUG_ON(end < U64_MAX && !IS_ALIGNED(end, I915_GTT_PAGE_SIZE)); GEM_BUG_ON(end < U64_MAX && !IS_ALIGNED(end, I915_GTT_PAGE_SIZE));
GEM_BUG_ON(vm == &vm->i915->mm.aliasing_ppgtt->vm); GEM_BUG_ON(vm == &vm->i915->ggtt.alias->vm);
GEM_BUG_ON(drm_mm_node_allocated(node)); GEM_BUG_ON(drm_mm_node_allocated(node));
if (unlikely(range_overflows(start, size, end))) if (unlikely(range_overflows(start, size, end)))
......
...@@ -394,6 +394,9 @@ struct i915_ggtt { ...@@ -394,6 +394,9 @@ struct i915_ggtt {
void __iomem *gsm; void __iomem *gsm;
void (*invalidate)(struct i915_ggtt *ggtt); void (*invalidate)(struct i915_ggtt *ggtt);
/** PPGTT used for aliasing the PPGTT with the GTT */
struct i915_ppgtt *alias;
bool do_idle_maps; bool do_idle_maps;
int mtrr; int mtrr;
......
...@@ -104,7 +104,7 @@ vma_create(struct drm_i915_gem_object *obj, ...@@ -104,7 +104,7 @@ vma_create(struct drm_i915_gem_object *obj,
struct rb_node *rb, **p; struct rb_node *rb, **p;
/* The aliasing_ppgtt should never be used directly! */ /* The aliasing_ppgtt should never be used directly! */
GEM_BUG_ON(vm == &vm->i915->mm.aliasing_ppgtt->vm); GEM_BUG_ON(vm == &vm->i915->ggtt.alias->vm);
vma = i915_vma_alloc(); vma = i915_vma_alloc();
if (vma == NULL) if (vma == NULL)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment