[Intel-gfx] [PATCH 3/4] drm/i915/uc: Place uC firmware in upper range of GGTT

Chris Wilson chris at chris-wilson.co.uk
Tue Apr 9 21:53:44 UTC 2019


Quoting Fernando Pacheco (2019-04-09 22:31:01)
> Currently we pin the GuC or HuC firmware image just
> before uploading. Perma-pin during uC initialization
> instead and use the range reserved at the top of the
> address space.
> 
> Moving the firmware resulted in needing to:
> - restore the ggtt mapping during the suspend/resume path.
> - use an additional pinning for the rsa signature which will
>   be used during HuC auth as addresses above GUC_GGTT_TOP
>   do not map through GTT.
> 
> Signed-off-by: Fernando Pacheco <fernando.pacheco at intel.com>
> ---
> @@ -315,3 +287,67 @@ void intel_uc_fw_dump(const struct intel_uc_fw *uc_fw, struct drm_printer *p)
>         drm_printf(p, "\tRSA: offset %u, size %u\n",
>                    uc_fw->rsa_offset, uc_fw->rsa_size);
>  }
> +
> +void intel_uc_fw_ggtt_bind(struct intel_uc_fw *uc_fw,
> +                          struct i915_ggtt *ggtt, u64 start)
> +{
> +       struct drm_i915_gem_object *obj = uc_fw->obj;
> +       struct i915_vma dummy = {
> +               .node = { .start = start, .size = obj->base.size },
> +               .size = obj->base.size,
> +               .pages = obj->mm.pages,
> +               .obj = obj,

Shouldn't need .size or .obj, but usually needs .vm.

> +       };
> +
> +       GEM_BUG_ON(!i915_gem_object_has_pinned_pages(obj));
> +       ggtt->vm.insert_entries(&ggtt->vm, &dummy, obj->cache_level, 0);
> +}
> +
> +int intel_uc_fw_ggtt_pin(struct intel_uc_fw *uc_fw,
> +                        struct i915_ggtt *ggtt, u64 start)
> +{
> +       struct drm_i915_gem_object *obj = uc_fw->obj;
> +       int err;
> +
> +       err = i915_gem_object_set_to_gtt_domain(obj, false);

Currently requires struct_mutex, and is not required as we can ensure
the pages are flushed on creation.

> +       if (err) {
> +               DRM_DEBUG_DRIVER("%s fw set-domain err=%d\n",
> +                                intel_uc_fw_type_repr(uc_fw->type), err);
> +               return err;
> +       }
> +
> +       err = i915_gem_object_pin_pages(obj);

I'm pretty sure we don't need to pin the pages here, as the caller
should be holding the pages already for the duration of the bind.

So I think this should just reduce to the ggtt bind.

> +       if (err) {
> +               DRM_DEBUG_DRIVER("%s fw pin-pages err=%d\n",
> +                                intel_uc_fw_type_repr(uc_fw->type), err);
> +               return err;
> +       }
> +
> +       intel_uc_fw_ggtt_bind(uc_fw, ggtt, start);
> +
> +       return 0;
> +}
> +
> +void intel_uc_fw_ggtt_unpin(struct intel_uc_fw *uc_fw,
> +                           struct i915_ggtt *ggtt, u64 start)
> +{
> +       struct drm_i915_gem_object *obj = uc_fw->obj;
> +       u64 length = obj->base.size;
> +
> +       ggtt->vm.clear_range(&ggtt->vm, start, length);
> +
> +       if (i915_gem_object_has_pinned_pages(obj))
> +               i915_gem_object_unpin_pages(obj);

No. You either own the pages, or you do not. Don't guess.
-Chris


More information about the Intel-gfx mailing list