Quoting Chris Wilson (2018-01-16 10:11:43) > One important use of partial vma is to provide mappable access to the > object while it is being used elsewhere (pinned entirely into the > unmappable portion of the Global GTT, i.e. for use as a display scanout). > > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > Cc: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx> Hi Joonas, you made a request for this selftest once upon a time. -Chris > --- > drivers/gpu/drm/i915/selftests/i915_vma.c | 59 +++++++++++++++++++++++++++---- > 1 file changed, 52 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/i915/selftests/i915_vma.c b/drivers/gpu/drm/i915/selftests/i915_vma.c > index eb89e301b602..ea48bac16927 100644 > --- a/drivers/gpu/drm/i915/selftests/i915_vma.c > +++ b/drivers/gpu/drm/i915/selftests/i915_vma.c > @@ -606,11 +606,17 @@ static int igt_vma_partial(void *arg) > struct drm_i915_private *i915 = arg; > struct i915_address_space *vm = &i915->ggtt.base; > const unsigned int npages = 1021; /* prime! */ > - struct drm_i915_gem_object *obj; > + struct drm_i915_gem_object *obj = NULL; > const struct phase { > const char *name; > + unsigned int flags; > +#define CREATE BIT(0) > +#define WHOLE BIT(1) > } phases[] = { > - { "create" }, > + { "create", CREATE }, > + { "lookup" }, > + { "whole", WHOLE }, > + { "recreate", CREATE | WHOLE }, > { "lookup" }, > { }, > }, *p; > @@ -618,17 +624,44 @@ static int igt_vma_partial(void *arg) > struct i915_vma *vma; > int err = -ENOMEM; > > - /* Create lots of different VMA for the object and check that > + /* > + * Create lots of different VMA for the object and check that > * we are returned the same VMA when we later request the same range. > */ > > - obj = i915_gem_object_create_internal(i915, npages*PAGE_SIZE); > - if (IS_ERR(obj)) > - goto out; > - > for (p = phases; p->name; p++) { /* exercise both create/lookup */ > unsigned int count, nvma; > > + if (p->flags & CREATE) { > + if (obj) > + i915_gem_object_put(obj); > + > + obj = i915_gem_object_create_internal(i915, > + npages*PAGE_SIZE); > + if (IS_ERR(obj)) > + goto out; > + } > + > + if (p->flags & WHOLE) { > + /* > + * Make sure we can create mappable partial vma > + * while the whole object is in use elsewhere. > + */ > + vma = i915_vma_instance(obj, vm, NULL); > + if (IS_ERR(vma)) { > + err = PTR_ERR(vma); > + goto out_object; > + } > + > + err = i915_vma_unbind(vma); > + if (err) > + goto out_object; > + > + err = i915_vma_pin(vma, 0, 0, PIN_GLOBAL | PIN_HIGH); > + if (err) > + goto out_object; > + } > + > nvma = 0; > for_each_prime_number_from(sz, 1, npages) { > for_each_prime_number_from(offset, 0, npages - sz) { > @@ -707,12 +740,24 @@ static int igt_vma_partial(void *arg) > err = -EINVAL; > goto out_object; > } > + > + if (p->flags & WHOLE) { > + vma = i915_vma_instance(obj, vm, NULL); > + if (IS_ERR(vma)) { > + err = PTR_ERR(vma); > + goto out_object; > + } > + > + i915_vma_unpin(vma); > + } > } > > out_object: > i915_gem_object_put(obj); > out: > return err; > +#undef CREATE > +#undef WHOLE > } > > int i915_vma_mock_selftests(void) > -- > 2.15.1 > _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx