[igt-dev] [PATCH i-g-t 1/2] lib/i915/gem_mman: Add coherent mmap api support with set domain
Chris Wilson
chris at chris-wilson.co.uk
Mon Feb 17 16:29:25 UTC 2020
Quoting Sreedhar Telukuntla (2020-02-18 00:17:09)
> gem_mmap__device_coherent_domain api maps buffer object and returns
> the memory domain to be used by the caller for subsequent set_domain
> call for cpu access.
>
> gem_mmap__device_coherent_sync api maps buffer object and also does
> set_domain to make the memory ready for cpu access.
>
> Signed-off-by: Sreedhar Telukuntla <sreedhar.telukuntla at intel.com>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---
> lib/i915/gem_mman.c | 76 ++++++++++++++++++++++++++++++++++++++++++---
> lib/i915/gem_mman.h | 6 +++-
> 2 files changed, 77 insertions(+), 5 deletions(-)
>
> diff --git a/lib/i915/gem_mman.c b/lib/i915/gem_mman.c
> index 08ae6769..b8d20c07 100644
> --- a/lib/i915/gem_mman.c
> +++ b/lib/i915/gem_mman.c
> @@ -345,21 +345,25 @@ void *gem_mmap_offset__wc(int fd, uint32_t handle, uint64_t offset,
> * @offset: offset in the gem buffer of the mmap arena
> * @size: size of the mmap arena
> * @prot: memory protection bits as used by mmap()
> + * @domain: cache domain used for mmap
> *
> * Returns: A pointer to a block of linear device memory mapped into the
> * process with WC semantics. When no WC is available try to mmap using GGTT.
> */
> void *__gem_mmap__device_coherent(int fd, uint32_t handle, uint64_t offset,
> - uint64_t size, unsigned prot)
> + uint64_t size, unsigned prot, uint32_t *domain)
> {
> void *ptr = __gem_mmap_offset(fd, handle, offset, size, prot,
> I915_MMAP_OFFSET_WC);
> if (!ptr)
> ptr = __gem_mmap__wc(fd, handle, offset, size, prot);
>
> - if (!ptr)
> - ptr = __gem_mmap__gtt(fd, handle, size, prot);
> + *domain = I915_GEM_DOMAIN_WC;
>
> + if (!ptr) {
> + ptr = __gem_mmap__gtt(fd, handle, size, prot);
> + *domain = I915_GEM_DOMAIN_GTT;
> + }
> return ptr;
> }
>
> @@ -382,15 +386,79 @@ void *gem_mmap__device_coherent(int fd, uint32_t handle, uint64_t offset,
> uint64_t size, unsigned prot)
> {
> void *ptr;
> + uint32_t domain;
>
> igt_assert(offset == 0);
>
> - ptr = __gem_mmap__device_coherent(fd, handle, offset, size, prot);
> + ptr = __gem_mmap__device_coherent(fd, handle, offset, size, prot, &domain);
> igt_assert(ptr);
>
> return ptr;
> }
>
> +/**
> + * gem_mmap__device_coherent_domain:
> + * @fd: open i915 drm file descriptor
> + * @handle: gem buffer object handle
> + * @offset: offset in the gem buffer of the mmap arena
> + * @size: size of the mmap arena
> + * @prot: memory protection bits as used by mmap()
> + * @domain: memory domain to be used by the caller for set_domain after mmap
> + *
> + * Call __gem_mmap__device__coherent_domain(), asserts on fail.
> + * Offset argument passed in function call must be 0. In the future
> + * when driver will allow slice mapping of buffer object this restriction
> + * will be removed.
> + *
> + * Returns: A pointer to the created memory mapping.
> + */
> +void *gem_mmap__device_coherent_domain(int fd, uint32_t handle, uint64_t offset,
> + uint64_t size, unsigned prot, uint32_t *domain)
> +{
> + void *ptr;
> +
> + igt_assert(offset == 0);
> +
> + ptr = __gem_mmap__device_coherent(fd, handle, offset, size, prot, domain);
> + igt_assert(ptr);
> +
> + return ptr;
> +}
> +
> +/**
> + * gem_mmap__device_coherent_sync:
> + * @fd: open i915 drm file descriptor
> + * @handle: gem buffer object handle
> + * @offset: offset in the gem buffer of the mmap arena
> + * @size: size of the mmap arena
> + * @prot: memory protection bits as used by mmap()
> + *
> + * Call __gem_mmap__device__coherent_sync(), asserts on fail.
> + * Offset argument passed in function call must be 0. In the future
> + * when driver will allow slice mapping of buffer object this restriction
> + * will be removed.
> + *
> + * This function sets appropriate memory domain as well once the mapping is
> + * complete and makes the memory ready for cpu access
> + *
> + * Returns: A pointer to the created memory mapping.
> + */
> +void *gem_mmap__device_coherent_sync(int fd, uint32_t handle, uint64_t offset,
> + uint64_t size, unsigned prot)
> +{
> + void *ptr;
> + uint32_t domain;
> +
> + igt_assert(offset == 0);
> +
> + ptr = gem_mmap__device_coherent_domain(fd, handle, offset, size, prot, &domain);
> + igt_assert(ptr);
> +
> + gem_set_domain(fd, handle, domain, domain);
No. Read/write is important, especially when there are comments
indicating that the api is being subverted and abused.
-Chris
More information about the igt-dev
mailing list