[PATCH 5/8] drm/client: Return I/O memory flag from drm_client_buffer_vmap()

Thomas Zimmermann tzimmermann at suse.de
Wed Nov 6 09:31:18 UTC 2019


With this patch, drm_client_buffer_vmap() forwards the io_mem parameter
from the vmap implementation to its caller. By default, is_iomem is
assumed to be false. This matches the return type and the old behaviour.

Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
---
 drivers/gpu/drm/drm_client.c    | 15 ++++++++++++---
 drivers/gpu/drm/drm_fb_helper.c |  4 ++--
 include/drm/drm_client.h        |  7 ++++++-
 3 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
index 0ecb588778c5..44af56fc4b4d 100644
--- a/drivers/gpu/drm/drm_client.c
+++ b/drivers/gpu/drm/drm_client.c
@@ -290,6 +290,8 @@ drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height, u
 /**
  * drm_client_buffer_vmap - Map DRM client buffer into address space
  * @buffer: DRM client buffer
+ * @is_iomem: Returns true if the mapped memory is I/O memory, or false
+ *            otherwise; can be NULL
  *
  * This function maps a client buffer into kernel address space. If the
  * buffer is already mapped, it returns the mapping's address.
@@ -302,12 +304,16 @@ drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height, u
  * Returns:
  *	The mapped memory's address
  */
-void *drm_client_buffer_vmap(struct drm_client_buffer *buffer)
+void *drm_client_buffer_vmap(struct drm_client_buffer *buffer, bool *is_iomem)
 {
 	void *vaddr;
+	bool vaddr_is_iomem;
 
-	if (buffer->vaddr)
+	if (buffer->vaddr) {
+		if (is_iomem)
+			*is_iomem = buffer->vaddr_is_iomem;
 		return buffer->vaddr;
+	}
 
 	/*
 	 * FIXME: The dependency on GEM here isn't required, we could
@@ -317,12 +323,15 @@ void *drm_client_buffer_vmap(struct drm_client_buffer *buffer)
 	 * fd_install step out of the driver backend hooks, to make that
 	 * final step optional for internal users.
 	 */
-	vaddr = drm_gem_vmap(buffer->gem, NULL);
+	vaddr = drm_gem_vmap(buffer->gem, &vaddr_is_iomem);
 	if (IS_ERR(vaddr))
 		return vaddr;
 
 	buffer->vaddr = vaddr;
+	buffer->vaddr_is_iomem = vaddr_is_iomem;
 
+	if (is_iomem)
+		*is_iomem = vaddr_is_iomem;
 	return vaddr;
 }
 EXPORT_SYMBOL(drm_client_buffer_vmap);
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 8ebeccdeed23..eff75fad7cab 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -422,7 +422,7 @@ static void drm_fb_helper_dirty_work(struct work_struct *work)
 
 		/* Generic fbdev uses a shadow buffer */
 		if (helper->buffer) {
-			vaddr = drm_client_buffer_vmap(helper->buffer);
+			vaddr = drm_client_buffer_vmap(helper->buffer, NULL);
 			if (IS_ERR(vaddr))
 				return;
 			drm_fb_helper_dirty_blit_real(helper, &clip_copy);
@@ -2212,7 +2212,7 @@ int drm_fb_helper_generic_probe(struct drm_fb_helper *fb_helper,
 		fb_deferred_io_init(fbi);
 	} else {
 		/* buffer is mapped for HW framebuffer */
-		vaddr = drm_client_buffer_vmap(fb_helper->buffer);
+		vaddr = drm_client_buffer_vmap(fb_helper->buffer, NULL);
 		if (IS_ERR(vaddr))
 			return PTR_ERR(vaddr);
 
diff --git a/include/drm/drm_client.h b/include/drm/drm_client.h
index 5cf2c5dd8b1e..053d58215be7 100644
--- a/include/drm/drm_client.h
+++ b/include/drm/drm_client.h
@@ -140,6 +140,11 @@ struct drm_client_buffer {
 	 */
 	void *vaddr;
 
+	/**
+	 * @vaddr_is_iomem: True if vaddr points to I/O memory, false otherwise
+	 */
+	bool vaddr_is_iomem;
+
 	/**
 	 * @fb: DRM framebuffer
 	 */
@@ -149,7 +154,7 @@ struct drm_client_buffer {
 struct drm_client_buffer *
 drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 height, u32 format);
 void drm_client_framebuffer_delete(struct drm_client_buffer *buffer);
-void *drm_client_buffer_vmap(struct drm_client_buffer *buffer);
+void *drm_client_buffer_vmap(struct drm_client_buffer *buffer, bool *is_iomem);
 void drm_client_buffer_vunmap(struct drm_client_buffer *buffer);
 
 int drm_client_modeset_create(struct drm_client_dev *client);
-- 
2.23.0



More information about the dri-devel mailing list