All of lore.kernel.org
 help / color / mirror / Atom feed
From: Antonio Argenziano <antonio.argenziano@intel.com>
To: igt-dev@lists.freedesktop.org
Cc: Janulgue Abdiel <abdiel.janulgue@intel.com>,
	Matthew Auld <matthew.auld@intel.com>
Subject: [igt-dev] [PATCH i-g-t v5 4/9] lib/i915: Add mmap_offset support
Date: Wed, 12 Jun 2019 15:57:29 -0700	[thread overview]
Message-ID: <20190612225734.14514-5-antonio.argenziano@intel.com> (raw)
In-Reply-To: <20190612225734.14514-1-antonio.argenziano@intel.com>

From: "Kalamarz, Lukasz" <lukasz.kalamarz@intel.com>

With recently proposed changes, IGT need to start supporting new
way of mmaping object, which will be used from now by default.
This patch modify gem_mmap_wc and gem_mmap functions to be
in sync with those changes.

v2:
	- Fix IOCTL number. (Daniele)
	- Move wrappers to new file. (Chris)

v3:
	- Use mmap IOCTL for lower level wrappers. (Chris)

v4:
	- Don't use static variables. (Chris)
	- Remember gem_ prefix. (Chris)

Signed-off-by: Lukasz Kalamarz <lukasz.kalamarz@intel.com>
Cc: Janulgue Abdiel <abdiel.janulgue@intel.com>
Cc: Matthew Auld <matthew.auld@intel.com>
Cc: Michal Winiarski <michal.winiarski@intel.com>
Cc: Antonio Argenziano <antonio.argenziano@intel.com>
Cc: Daniele Spurio Ceraolo <daniele.ceraolospurio@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Antonio Argenziano <antonio.argenziano@intel.com>
---
 lib/i915/gem_mman.c | 118 ++++++++++++++++++++++++++++++++++++--------
 lib/i915/gem_mman.h |  33 +++++++++++++
 2 files changed, 130 insertions(+), 21 deletions(-)

diff --git a/lib/i915/gem_mman.c b/lib/i915/gem_mman.c
index b43ccd95..429de912 100644
--- a/lib/i915/gem_mman.c
+++ b/lib/i915/gem_mman.c
@@ -103,34 +103,49 @@ int gem_munmap(void *ptr, uint64_t size)
 
 bool gem_mmap__has_wc(int fd)
 {
-	struct drm_i915_getparam gp;
-	int mmap_version = -1;
-	int gtt_version = -1;
 	int has_wc = 0;
 
-	memset(&gp, 0, sizeof(gp));
-	gp.param = I915_PARAM_MMAP_GTT_VERSION;
-	gp.value = &gtt_version;
-	ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
-
-	memset(&gp, 0, sizeof(gp));
-	gp.param = I915_PARAM_MMAP_VERSION;
-	gp.value = &mmap_version;
-	ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
-
-	/* Do we have the new mmap_ioctl with DOMAIN_WC? */
-	if (mmap_version >= 1 && gtt_version >= 2) {
-		struct drm_i915_gem_mmap arg;
+	/* Do we have the new mmap_offset ioctl? */
+	if (gem_has_mmap_offset(fd)) {
+		struct local_drm_i915_gem_mmap_offset arg;
 
 		/* Does this device support wc-mmaps ? */
 		memset(&arg, 0, sizeof(arg));
 		arg.handle = gem_create(fd, 4096);
 		arg.offset = 0;
-		arg.size = 4096;
-		arg.flags = I915_MMAP_WC;
-		has_wc = igt_ioctl(fd, DRM_IOCTL_I915_GEM_MMAP, &arg) == 0;
+		arg.flags = LOCAL_I915_MMAP_OFFSET_WC;
+		has_wc = igt_ioctl(fd, LOCAL_DRM_IOCTL_I915_GEM_MMAP_OFFSET, &arg) == 0;
 		gem_close(fd, arg.handle);
+	} else {
+		struct drm_i915_getparam gp;
+		int mmap_version = -1;
+		int gtt_version = -1;
+
+		memset(&gp, 0, sizeof(gp));
+		gp.param = I915_PARAM_MMAP_GTT_VERSION;
+		gp.value = &gtt_version;
+		ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
+
+		memset(&gp, 0, sizeof(gp));
+		gp.param = I915_PARAM_MMAP_VERSION;
+		gp.value = &mmap_version;
+		ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
+
+		/* Do we have the mmap_ioctl with DOMAIN_WC? */
+		if (mmap_version >= 1 && gtt_version >= 2) {
+			struct drm_i915_gem_mmap arg;
+
+			/* Does this device support wc-mmaps ? */
+			memset(&arg, 0, sizeof(arg));
+			arg.handle = gem_create(fd, 4096);
+			arg.offset = 0;
+			arg.size = 4096;
+			arg.flags = I915_MMAP_WC;
+			has_wc = igt_ioctl(fd, DRM_IOCTL_I915_GEM_MMAP, &arg) == 0;
+			gem_close(fd, arg.handle);
+		}
 	}
+
 	errno = 0;
 
 	return has_wc > 0;
@@ -206,7 +221,12 @@ void *__gem_mmap__wc(int fd, uint32_t handle, uint64_t offset, uint64_t size, un
  */
 void *gem_mmap__wc(int fd, uint32_t handle, uint64_t offset, uint64_t size, unsigned prot)
 {
-	void *ptr = __gem_mmap__wc(fd, handle, offset, size, prot);
+	void *ptr;
+
+	ptr = __gem_mmap_offset(fd, handle, offset, size, prot, LOCAL_I915_MMAP_OFFSET_WC);
+	if (!ptr)
+		ptr = __gem_mmap__wc(fd, handle, offset, size, prot);
+
 	igt_assert(ptr);
 	return ptr;
 }
@@ -243,7 +263,63 @@ void *__gem_mmap__cpu(int fd, uint32_t handle, uint64_t offset, uint64_t size, u
  */
 void *gem_mmap__cpu(int fd, uint32_t handle, uint64_t offset, uint64_t size, unsigned prot)
 {
-	void *ptr = __gem_mmap__cpu(fd, handle, offset, size, prot);
+	void *ptr;
+
+	ptr = __gem_mmap_offset(fd, handle, offset, size, prot, LOCAL_I915_MMAP_OFFSET_WB);
+	if (!ptr)
+		ptr = __gem_mmap(fd, handle, offset, size, prot, 0);
+
 	igt_assert(ptr);
 	return ptr;
 }
+
+bool gem_has_mmap_offset(int fd)
+{
+	struct drm_i915_getparam gp;
+	int has_mmap_offset = 0;
+
+	memset(&gp, 0, sizeof(gp));
+	gp.param = 0x55; /* I915_PARAM_MMAP_OFFSET_VERSION */
+	gp.value = &has_mmap_offset;
+	ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
+
+	return has_mmap_offset > 0;
+}
+
+/**
+ * __gem_mmap_offset:
+ * @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()
+ * @flags: flags used to determine caching
+ *
+ * Similar to __gem_mmap but use MMAP_OFFSET IOCTL.
+ *
+ * Returns: A pointer to the created memory mapping, NULL on failure.
+ */
+void
+*__gem_mmap_offset(int fd, uint32_t handle, uint64_t offset, uint64_t size, unsigned int prot, uint64_t flags)
+{
+	struct local_drm_i915_gem_mmap_offset arg;
+	void *ptr;
+
+	memset(&arg, 0, sizeof(arg));
+	arg.handle = handle;
+	arg.offset = offset;
+	arg.flags = flags;
+
+	if (igt_ioctl(fd, LOCAL_DRM_IOCTL_I915_GEM_MMAP_OFFSET, &arg))
+		return NULL;
+
+	ptr = mmap64(0, size, prot, MAP_SHARED, fd, arg.offset);
+
+	if (ptr == MAP_FAILED)
+		ptr = NULL;
+	else
+		errno = 0;
+
+	return ptr;
+}
+
diff --git a/lib/i915/gem_mman.h b/lib/i915/gem_mman.h
index f7242ed7..fff2ecab 100644
--- a/lib/i915/gem_mman.h
+++ b/lib/i915/gem_mman.h
@@ -51,5 +51,38 @@ int gem_munmap(void *ptr, uint64_t size);
  */
 #define gem_require_mmap_wc(fd) igt_require(gem_mmap__has_wc(fd))
 
+struct local_drm_i915_gem_mmap_offset {
+	/** Handle for the object being mapped. */
+	__u32 handle;
+	__u32 pad;
+	/**
+	 * Fake offset to use for subsequent mmap call
+	 *
+	 * This is a fixed-size type for 32/64 compatibility.
+	 */
+	__u64 offset;
+
+	/**
+	 * Flags for extended behaviour.
+	 *
+	 * It is mandatory that either one of the _WC/_WB flags
+	 * should be passed here.
+	 */
+	__u64 flags;
+};
+
+#define LOCAL_DRM_I915_GEM_MMAP_OFFSET 0x24
+#define LOCAL_I915_MMAP_OFFSET_WC (1 << 0)
+#define LOCAL_I915_MMAP_OFFSET_WB (1 << 1)
+#define LOCAL_I915_MMAP_OFFSET_UC (1 << 2)
+
+#define LOCAL_DRM_IOCTL_I915_GEM_MMAP_OFFSET \
+		DRM_IOWR(DRM_COMMAND_BASE + LOCAL_DRM_I915_GEM_MMAP_OFFSET, struct local_drm_i915_gem_mmap_offset)
+
+bool gem_has_mmap_offset(int fd);
+
+void *__gem_mmap_offset(int fd, uint32_t handle, uint64_t offset, uint64_t size, unsigned int prot, uint64_t flags);
+
+
 #endif /* GEM_MMAN_H */
 
-- 
2.21.0

_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

  parent reply	other threads:[~2019-06-12 22:58 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-12 22:57 [igt-dev] [PATCH i-g-t v5 0/9] Aperture removal IGT changes Antonio Argenziano
2019-06-12 22:57 ` [igt-dev] [PATCH i-g-t v5 1/9] tests/i915/gem_render_copy.c: Do detiling on the CPU side Antonio Argenziano
2019-06-12 22:57 ` [igt-dev] [PATCH i-g-t v5 2/9] tests/i915/gem_madvise.c: Add more mappings Antonio Argenziano
2019-06-12 22:57 ` [igt-dev] [PATCH i-g-t v5 3/9] lib/i915/gem_mman: Remove static variables Antonio Argenziano
2019-06-12 22:57 ` Antonio Argenziano [this message]
2019-06-12 22:57 ` [igt-dev] [PATCH i-g-t v5 5/9] tests/i915/gem_mmap_offset_exhaustion.c: Extend test to different mappings Antonio Argenziano
2019-06-12 22:57 ` [igt-dev] [PATCH i-g-t v5 6/9] igt/lib: Add wrapper to check if gtt mapping is available Antonio Argenziano
2019-06-12 22:57 ` [igt-dev] [PATCH i-g-t v5 7/9] igt/i915: Require GTT mapping to be available when needed Antonio Argenziano
2019-06-12 22:57 ` [igt-dev] [PATCH i-g-t v5 8/9] Remove static variables from mapping version function Antonio Argenziano
2019-06-12 22:57 ` [igt-dev] [PATCH i-g-t v5 9/9] igt/lib: If mappable aperture is missing return 0 size Antonio Argenziano
2019-06-13  1:37 ` [igt-dev] ✗ Fi.CI.BAT: failure for Aperture removal IGT changes Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190612225734.14514-5-antonio.argenziano@intel.com \
    --to=antonio.argenziano@intel.com \
    --cc=abdiel.janulgue@intel.com \
    --cc=igt-dev@lists.freedesktop.org \
    --cc=matthew.auld@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.