+ Abdiel Quoting Chris Wilson (2018-02-22 11:48:40) > 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